본문 바로가기

모델/기타

Recurrent Neural Network

안녕하세요. 이번 시간엔 딥러닝 모델 중 Recurrent Neural Network에 대해 알아보겠습니다.

참고자료는 다음과 같습니다.

 

Coursera : 전반적인 글 구조는 여기 사이트의 'Recurrent Neural Networks' 파트를 참조했습니다.

www.coursera.org/learn/nlp-sequence-models

 

Sequence Models

Offered by deeplearning.ai. This course will teach you how to build models for natural language, audio, and other sequence data. Thanks to deep learning, sequence algorithms are working far better than just two years ago, and this is enabling numerous exci

www.coursera.org

Recurrent Neural Network의 기초와 backpropagation

medium.com/towards-artificial-intelligence/whirlwind-tour-of-rnns-a11effb7808f

 

The Basics of Recurrent Neural Networks (RNNs)

A beginner’s guide to RNNs

medium.com

Recurrent Neural Network 정의

ko.wikipedia.org/wiki/%EC%88%9C%ED%99%98_%EC%8B%A0%EA%B2%BD%EB%A7%9D

 

순환 신경망 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 순환 신경망(Recurrent neural network, RNN)은 인공 신경망의 한 종류로, 유닛간의 연결이 순환적 구조를 갖는 특징을 갖고 있다. 이러한 구조는 시변적 동적 특징을 모

ko.wikipedia.org

 

Recurrent Neural Network(RNN)란 '인공 신경망의 한 종류로, 유닛간의 연결이 순환적 구조를 갖는 특징을 가진 네트워크'라고 정의합니다. 여기서 순환적 구조란 t시점의 output을 만들 때 과거 hidden layer를 참조하기 때문입니다. 아래 그림에서 보면 다음과 같습니다.

그림 1. RNN 구조 (Coursera)

그림 1에서 layer는 다음과 같이 구성됩니다.

- $\textbf{x}^{<1>}, \textbf{x}^{<2>}$ 부분 : input vector

- $\textbf{a}^{<0>}, \textbf{a}^{<1>}$ 부분 : hidden layer,

- $\hat{y}^{<1>}, \hat{y}^{<2>}$ 부분 : output vector

 

가중치는 크게 3개 파트로 구성됩니다.

- $W_{aa}$ : $i-1$번째 hidden layer가 $i$번째 hidden layer에 연결될 때 쓰는 가중치

- $W_{ax}$ : input값이 hidden layer에 연결될 때 사용하는 가중치

- $W_{ya}$ : hidden layer가 output값에 연결될 때 사용하는 가중치

 

그림 1을 보면 $\hat{y}^{<3>}$을 만들기 위해 $\textbf{a}^{<0>}, \textbf{a}^{<1>}, \textbf{a}^{<2>}$와 해당 hidden layer의 input vector가 이용되는 것을 볼 수 있습니다. 즉, $i$번째 hidden layer를 만들기 위해서는 $0, ..., i-1$번째 hidden layer와 input vector들의 영향을 받습니다. 이러한 구조 때문에 Recurrent(순환) 구조라고 합니다. 

 

그렇다면 구조를 알았으니 이제 어떻게 학습을 하는지 보도록 하겠습니다.

 

그림 2. RNN Forward Propagation (Coursera)

그림 2의 식에 대한 설명은 다음과 같습니다.

$a^{<t>} = g(W_{aa}a^{<t-1>} + W_{ax}X^{<t>} + b_{a})$ : t번째 hidden layer 계산

$\hat{y}^{<t>} = g(W_{ya}a^{<t>} + b_{y})$ : t번재 output vector 계산

* hidden layer 중 $a^{<0>}$은 zero vector나 다른 형태로 초기화시켜 사용합니다. 

 

위에서 tanh / ReLU, sigmoid는 g라는 함수에 사용할 활성함수를 의미합니다.

 

즉, 위와 같은 식으로 Forward Propagation을 통해 output layer와 Loss를 산출합니다.

아래 그림에서 Loss가 어떻게 만들어지는지 보겠습니다.

그림 3. Forward propagation and Backpropagation (Coursera)

그림 3에서 Loss 식은 Cross entropy 기준으로, 주어진 문제에 따라 달라질 수 있습니다. 여기서 중요한 점은 $y^<1>, ..., y^<T_{y}>$에 대한 Loss를 모두 합한다는 점입니다.

그리고 Backpropagation은 Forward의 반대로만 하면 된다고 설명에 있었는데 조금 깊숙히 들어가 $W_{ax}$, $W_{aa}$, $W_{ya}$에 대한 backpropagation 식을 구해보면 다음과 같습니다.

* 여기서 $W_{ax}$, $W_{aa}$, $W_{ya}$ 가중치는 모든 각 layer에서 공유하는 가중치입니다. $W_{ax1}$과 같이 layer에 따라 값이 달라지지 않습니다.

 

우선 식을 가정하겠습니다.

Loss 식 : $L^{<t>}(\hat{y}^{<t>}, y^{<t>}) = -y^{<t>}log \hat{y}^{<t>} -(1-y^{t})log(1- \hat{y}^{<t>})$

예측값 : $\hat{y}^{<t>} = softmax(z^{<t>})$

$z^{<t>} = W_{ya}a^{<t>} + \textbf{b}_{y}$

 

다음과 같을 때 가중치는 아래의 방식으로 구합니다.

- $W_{ax}$ : hidden layer와 output 간의 가중치입니다. 

$\frac{\partial L^{<t>}}{\partial W_{ya} } = \frac{\partial L^{<t>}}{\partial \hat{y}^{<t>}} \frac{\partial \hat{y}^{<t>}}{\partial z^{<t>}} \frac{\partial z^{<t>}}{\partial W_{ya} }$

$\frac{\partial L_{total}}{\partial W_{ya} } = \sum_{t=1}^{T_{y}} \frac{\partial L^{<t>}}{\partial W_{ya} } $

 

- $W_{aa}$ : $i-1$번째 hidden layer와 $i$번째 간의 가중치 입니다.

  - 이 부분은 조금 복잡합니다. 아래 예시를 보며 이해하도록 하겠습니다.

  $a^{<1>} = g(W_{aa}a^{<0>} + W_{ax}X^{<1>} + b_{a})$

  $a^{<2>} = g(W_{aa}a^{<1>} + W_{ax}X^{<2>} + b_{a})$

  $a^{<3>} = g(W_{aa}a^{<2>} + W_{ax}X^{<3>} + b_{a})$

  - 위의 식을 보면 $a^{<3>}$의 경우 $a^{<2>}$ ,$a^{<1>}$, $a^{<0>}$을 포함하고 있습니다. 따라서 현재 3이라는  hidden layer보다 앞에 있는 hidden layer에 대한 가중치까지 전부 계산해야 합니다. 따라서 다음과 같은 계산식이 완성됩니다.

$\frac{\partial L^{<t>}}{\partial W_{aa} } = \frac{\partial L^{<t>}}{\partial \hat{y}^{<t>}} \frac{\partial \hat{y}^{<t>}}{\partial z^{<t>}} \frac{\partial z^{<t>}}{\partial a^{<t>}} \frac{\partial a^{<t>}}{\partial W_{aa}} + \frac{\partial L^{<t>}}{\partial \hat{y}^{<t>}} \frac{\partial \hat{y}^{<t>}}{\partial z^{<t>}} \frac{\partial z^{<t>}}{\partial a^{<t>}} \frac{\partial a^{<t>}}{\partial a^{<t-1>}} \frac{\partial a^{<t-1>}}{\partial W_{aa}} + ... = \sum_{k=0}^{t} \frac{\partial L^{<t>}}{\partial \hat{y}^{<t>}} \frac{\partial \hat{y}^{<t>}}{\partial z^{<t>}} \frac{\partial z^{<t>}}{\partial a^{<t>}} \frac{\partial a^{<t>}}{\partial a^{<k>}} \frac{\partial a^{<k>}}{\partial W_{aa}}$

 

$\frac{\partial L_{total}}{\partial W_{aa} } = \sum_{t=1}^{T_{y}} \sum_{k=0}^{t} \frac{\partial L^{<t>}}{\partial \hat{y}^{<t>}} \frac{\partial \hat{y}^{<t>}}{\partial z^{<t>}} \frac{\partial z^{<t>}}{\partial a^{<t>}} \frac{\partial a^{<t>}}{\partial a^{<k>}} \frac{\partial a^{<k>}}{\partial W_{aa}}$

 

- $W_{ax}$ : input과 hidden layer 사이의 가중치로 위의 hidden layer와 유사하게 구할 수 있습니다.

$\sum_{k=0}^{t} \frac{\partial L^{<t>}}{\partial \hat{y}^{<t>}} \frac{\partial \hat{y}^{<t>}}{\partial z^{<t>}} \frac{\partial z^{<t>}}{\partial a^{<t>}} \frac{\partial a^{<t>}}{\partial a^{<k>}} \frac{\partial a^{<k>}}{\partial W_{aa}}$

 

위와 같이 순환구조라 backpropagation을 구하는 부분이 조금 복잡하긴 하지만 Chian rule을 활용하여 표현할 수 있습니다.

 

여기까지가 RNN에 대한 설명이었습니다.

궁금하신점이나 수정할 점 있으면 댓글 등으로 부탁드립니다!

감사합니다.

 

 

'모델 > 기타' 카테고리의 다른 글

LMNN(Large Margin Nearest Neighbors)  (0) 2021.04.08
LSTM  (0) 2020.12.28
Variational AutoEncoder(VAE)  (0) 2020.12.18
DTW(Dynamic Time Warping)  (0) 2020.08.02