*그림은 밑바닥부터 시작하는 딥러닝2를 참고했습니다*

http://www.yes24.com/Product/Goods/72173703

 

밑바닥부터 시작하는 딥러닝 2 - YES24

직접 구현하면서 배우는 본격 딥러닝 입문서 이번에는 순환 신경망과 자연어 처리다! 이 책은 『밑바닥부터 시작하는 딥러닝』에서 다루지 못했던 순환 신경망(RNN)을 자연어 처리와 시계열 데

www.yes24.com

[목차]

1. 정의

2. 알고리즘

   2.1 순전파

   2.2 역전파

3. 기울기 소실 문제

 

1. 정의

 

RNN(Recurrent Neural Network)로, 은닉층에서 나온 결과값이 다시 은닉층으로 돌아가 새로운 입력값과 연산을 수행하는 순환구조입니다. 완전연결층(Fully Connected Layer), CNN(Convolutional Neural Network)은 은닉층에서 나온 결과값이 출력층 방향으로 이동하지만, RNN은 은닉층으로 되돌아가 순환한다는 점에서 큰 차이가 있습니다. 

 

RNN은 [그림 1]과 같은 순환구조를 형성합니다.

 

[그림 1] RNN의 순환구조

 

[그림 1]은 RNN 순환구조를 펼친 형태로 입력값{x0, x1,..., xt}를 순차적으로 입력했을 때 각 입력에 대응해 {h0,...,ht}가 출력됩니다. 이때 RNN계층은 모두 같은 계층이고 출력{h0,..,hk,.,ht}를 각각 k 시점에서의 은닉 상태라고 합니다. 

 

이러한 RNN의 구조는 시계열 데이터, 텍스트 데이터에 적합합니다.

 

가령 'You say goodbye and I say hello'에서 각 단어의 다음에 나올 단어를 예측하고자 할때, 문장에서 임베딩 된 단어를 순차적으로 RNN 에 입력합니다.

 

이후 각 입력에 대응하는 은닉상태로 다음에 나올 단어를 예측합니다. 여기서 은닉상태는 해당 시점까지의 단어 정보를 나타냅니다.

 

순전파와 역전파를 반복하며 모형을 학습시켜 최종적으로 각 단어 다음에 나올 단어를 완벽하게 예측하는 은닉상태를 갖는 것이 RNN의 목적 중 하나입니다. 

 

[그림 2]는 'You say goodbye and I say hello'에서 각 단어 다음에 나올 단어를 예측하며 학습시킨 RNN 언어모델입니다. 

 

[그림 2] RNN의 언어 모델

 

[그림 2]에서 You 라는 단어가 Embedding 계층을 거친 후 RNN에 입력되면, you의 은닉상태 h_you를 출력하고 다음에 올 단어

 

say를 예측합니다. 은닉상태 h_you다음 RNN 계층으로 들어가 say라는 단어가 임베딩된 형태와 연산합니다. 여기서 h_you는 과거의 정보 'you'를 응집한 은닉 상태입니다.

 

다음 RNN 계층에서 나온 say의 은닉상태 h_say는 과거의 정보 'You say'를 응집한 은닉 상태입니다. 이후 h_say를 이용해 다음에 올 단어 goodbye를 예측합니다.

 

이 과정이 RNN 학습, 순전파 과정입니다. 이후 역전파 과정을 거치며 예측 단어와 실제 단어를 비교하면서 가중치와 은닉상태를 업그레이드합니다.

 

2. 알고리즘

   2.1 순전파

 

[그림 3] RNN 순전파 과정

 

[그림3]은 RNN의 순전파 과정입니다. ('You say goodbye and I say hello'에서 다음에 나올 단어를 예측하며 RNN 계층을 학습하는 과정입니다.) 

 

1) say의 은닉상태인 h_sayhello가 임베딩된 벡터(x_hello)RNN계층에 들어간 후 일련의 과정을 통해 hello의 은닉상태인 h_helllo y_hello를 출력합니다.

2) 출력된 은닉상태는 다음 RNN 계층의 입력으로 이동합니다.

3) h_hellohello를 비롯해 say, I 와 같이 그동안 이동해온 단어들의 정보를 갖고있습니다.

4) y_helloh_hello가 변형된 형태로, hello의 다음 단어를 예측한 결과입니다.

 

여기서 일련의 과정은 [그림4]의 식으로, 모형으로 나타내면 [그림3]의 오른쪽 직사각형입니다.

 

[그림 4] RNN 순전파 수식

1) 가중치와 편향인 Wh, Wx, bRNN계층별로 동일합니다.

2) [그림 4]를 보면 h_hello를 구하기 위해 h_sayWh를 곱하고 hello를 임베딩한 단어벡터(x_hello)Wx를 곱한 후 편향(b)을 더했습니다.

3) 이후 하이퍼볼릭탄젠트 함수(tanh)를 씌웠습니다. 

 

   2.2 역전파

 

[그림 5] RNN의 역전파

1) RNN에서 오차역전파는 RNN 계층에서 출력된 결과와 Y값의 차이를 반영해 가중치와 은닉상태를 업그레이드하는 과정입니다.

2) 예를 들면, [그림5]에서 Softmax 이후 나오는 단어들의 예측 확률과 실제값의 오차를 Cross Entropy로 구합니다.

3) 이후 오차를 미분해 기울기{dh_hello, dh_row, dh_say, dw_x, dx_hello, dw_h}를 구하고 각 가중치에 반영해 업그레이드하는 식으로 오차역전파가 진행됩니다.

4) 오차를 미분하는 과정에서 y에 대해 미분하는 과정이 필요합니다.

5) y에 대해 미분하는 식을 나타내면 [그림6]과 같습니다.

 

[그림 6] RNN 역전파 수식

 

3. 기울기 소실 문제

 

1) RNN에서 역전파가 진행되면서 기울기가 소실되는 문제가 발생합니다.

2) 우선 오차역전파를 통해 은닉상태, 가중치, 편향{h, W, b}은 기울기/미분값이 반영되며 업그레이드 됩니다.

3) RNN은 기울기/미분값을 구하는 과정이 [그림 7], [그림 8]과 같이 복잡합니다.

4) 만약 RNN 계층이 많다면, 오차역전파가 진행될수록 기울기가 소실되는 문제가 발생합니다.

 

수식으로 증명하면서 기울기가 어떻게 소실되는지 보여드리겠습니다.

 

[그림 7] 기울기 전개식 (1)

 

1) [그림 7]은 h_roww_h로 미분하는 과정입니다.

2) Say의 은닉상태인 h_say는 이전 단계의 RNN계층인 you, say, goodbye, and, I 의 영향을 받습니다.

3) 따라서 h_roww_h로 미분하려면 h_you, h_say, h_goodbye, h_and, h_I를 모두 반영해야 됩니다.

4) [그림 7]을 정리하면 [그림 8]과 같습니다.

 

[그림 8] 기울기 전개식 (2)

 

1) [그림 8]에서 h_roww_h로 미분하면 가중치, 은닉상태를 계속 곱하고 더하는 패턴이 보이는 것을 알 수 있습니다.

2) 만약 RNN 계층이 여러 개라면, 오차역전파 과정이 진행되며 기울기가 곱하고 더하는 과정이 반복될 것입니다.

3) 여기에서 기울기가 감소하는 문제가 발생합니다.

4) 그렇게 되면 오차역전파 과정이 꽤 진행되었을 때 업데이트할 기울기가 아주 작은 문제가 발생할 수 있습니다.

 

이것을 기울기 소실이라고 하며, 이를 해결하기 위해 LSTM을 이용합니다.

 

LSTM은 다음 시간에....

 

참고자료: https://ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/

 

RNN과 LSTM을 이해해보자! · ratsgo's blog

이번 포스팅에서는 Recurrent Neural Networks(RNN)과 RNN의 일종인 Long Short-Term Memory models(LSTM)에 대해 알아보도록 하겠습니다. 우선 두 알고리즘의 개요를 간략히 언급한 뒤 foward, backward compute pass를 천천

ratsgo.github.io

 

+ Recent posts