본문 바로가기
Deep Learning/Hands On Machine Learning

15.1 순환 뉴런과 순환 층

by 대소기 2021. 11. 21.

 

순환 뉴런

* 위 그림의 왼쪽 뉴런 한 개로 구성된 모형은 가장 간단한 RNN 모형이다. 이를 시간 축으로 표현하면 오른쪽 그림과 같이 표현할 수 있다.

* 각 time step t 마다 이 순환 뉴런은 이번 step에 입력으로 들어오는 $x_t$와 이전 step의 출력인 $y_{t-1}$을 입력으로 받습니다.

* 첫 번째 time step에서는 이전 step의 출력이 없으므로 $y_{t-1}$을 일반적으로 0으로 설정합니다.

 

순환 뉴런으로 된 층

* 각 순환 뉴런은 입력 $x_t$를 위한 가중치 하나, 출력 $y_{t-1}$를 위한 가중치 하나 총 2개의 가중치 벡터 $w_x, w_y$를 가진다. 이를 순환 층 전체로 확장하면 가중치 행렬 $W_x, W_y$라고 볼 수 있다.

* 하나의 sample에 대한 순환 층 전체의 출력 벡터는 아래와 같이 구할 수 있다.

$y_t= \phi$({W_x}^T x_t + {W_y}^T y_(t-1) + b)

* 여기서 $\phi$는 activation function을, b는 편향을 의미한다.

 

* 타임 스텝 t에서의 모든 입력을 행렬 X_t로 만들어 미니배치 전체에 대해 순환 층의 출력을 한 번에 계산하는 것이 가능하다.

$$Y_t = \phi(X_t W_x + Y_{t-1} W_y + b) = \phi(\begin{bmatrix} X_t  & Y_{t-1} \end{bmatrix}W + b), W= \begin{bmatrix} W_x \\  W_y \\ \end{bmatrix} $$

* 위 식에대해 더 자세히 살펴보면 이러하다.

* $Y_t$는 time step t에서 미니배치에 있는 각 sample에 대한 층의 출력을 담은 $m \times n_{neurons}$ 행렬이다(m은 minibatch에 있는 sample 개수이고, $n_{neurons}$는 뉴런 수이다)

* $X_t$는 미니배치에 있는 모든 sample값을 담은 $m \times n_{inputs}$ 행렬이다($n_{neurons}$는 입력 특성 수이다).

* $W_x$는 현재 time step의 입력에 대한 연결 가중치를 담은 $n_{inputs} \times n_{neurons}$ 행렬이다.

* $W_y$는 이전 time step의 출력에 대한 연결 가중치를 담은 $n_{neurons} \times n_{neurons}$ 행렬이다.

* b는 각 뉴런의 편향을 담은 n_neurons 크기의 벡터이다.

* 가중치 행렬 $W_x와 W_y$는 종종 $(n_{inputs} + n_{neurons}) \times n_{neurons}$ 크기의 가중치 행렬 W 하나로 연결한다.

* $[ X_t    Y_{t-1}]$ 표기는 $X_t Y_{t-1}$을 수평적으로 연결한 것과 같다.

* 정리하자면 time step t에서의 출력 $y_t$는 t-1, t-2, ... 0까지의 모든 입력에 대한 함수가 된다고 볼 수 있다.

 

15.1.1 메모리 셀

* 순환 뉴런의 출력은 이전 step들의 모든 입력에 대한 함수이므로 메모리와 같다. 때문에 time step에 걸쳐서 어떤 상태를 보존하는 신경망의 구조를 메모리 셀이라고 한다.

* 메모리셀은 하나의 순환 뉴런 또는 순환 뉴런 층의 짧은 패턴만 학습할 수 있는 기본적인 셀이다.

* 일반적으로 time step t의 셀의 상태를 나타내는 함수 $h_t$는 $h_t=f(h_{t-1}, x_t)$로 표현한다. 하지만, 위 그림과 같이 더 복잡한 셀에서는 출력과 셀의 상태가 동일하지 않다.

 

15.1.2 입력과 출력 시퀀스

1) Sequence to Sequence Network 

* 입력 sequence를 받아 출력 sequence를 만든다.

* 예를 들어 최근 3일치의 주식 가격을 입력하면 네트워크는 각 입력보다 하루 앞선 가격(2일 전부터 내일까지)을 출력하게 된다.

 

2) Sequence to vector Network

* 입력 sequence를 주입하고 마지막을 제외한 모든 출력을 무시하는 Network이다.

* 예를 들어 영화 리뷰에 있는 연속된 단어를 주입하면 네트워크는 감성 점수를 출력한다.

 

3) Vector to Sequence Network

* 각 time step에서 하나의 입력 벡터를 반복해서 주입하고 하나의 sequence를 출력할 수 있다.

* 예를 들어 이미지를 입력하여 이미지에 대한 캡션을 출력하는 경우 사용할 수 있다.

 

4) Encoder-Decoder Network

* Sequence to Vector Network (Encoder에 해당) 뒤에 Vector to Sequence Network(Decoder)를 연결한 Network

* 한 언어의 문장을 다른 언어의 문장으로 번역하는데 사용 가능하다.

* 한 언어의 문장을 네트워크에 주입하면 Encoder는 이 문장을 하나의 Vector 표현으로 변환하고, Decoder가 이 Vector를 다른 언어의 문장으로 Decoding한다.

* Sequence to Sequence Network만 사용해서 문장을 번역하는 것 보다 이 Network를 사용하는 것이 성능이 더 좋다. 마지막 단어가 번역의 첫 번째 단어에 영향을 줄 수 있기 때문이다. 

'Deep Learning > Hands On Machine Learning' 카테고리의 다른 글

15.4 긴 시퀀스 다루기  (0) 2021.11.21
15.2 RNN 훈련하기  (0) 2021.11.21
13.3 입력 특성 전처리  (0) 2021.11.12
13.2 TFRecord 포맷  (0) 2021.11.12
13.1 데이터 API  (0) 2021.11.12