본문 바로가기

딥러닝

13. RNN (순환 신경망)

1. RNN(Recurrent Neural Network)

 

 RNN은 언어, 음성 등 signal 데이터, 순서가 있는 데이터를 모델링 하고 싶으시다면 한번씩 들어보셨을 겁니다. RNN은 순서, 시간 등을 모델링 할때 강점을 보이고, input과 output 길이를 다양하게 적용할 수 있다는 장점이 있습니다. 순서와 시간을 잘 모델링 하고, input과 output 길이를 다양하게 적용시킬 수 있는 이유는 RNN의 작동방식을 보면 알 수 있습니다.

 

2. RNN의 작동 방식

 

 Dense(FC), CNN 등의 작동 방식을 보면, layer의 값들이 다음 layer를 지나면서 연산을 합니다. 5번째 layer에 input이 된 정보가 있다면, 5번째 layer의 output 계산에만 관여하지, input들 사이의 연산은 따로 하지 않습니다.

 반면에 RNN은 5번째 layer에 input된 값들이 output 계산에 영향을 주면서, input들 간의 계산에도 영향을 줍니다. input 값이 10개가 있다면, 첫번째 input 값이 10번째 intput 값이 output 값을 출력할때 영향을 준다는 의미 입니다. 그래서 'Recurrent(순환)' 이라는 명칭이 붙은 것 입니다.

 

출처 : cs231n

 위의 사진을 보시면 빨간색은 input, 파란색은 output, 초록색이 hidden layer의 값입니다. RNN의 내부 연산을 의미하는데, 보통 DNN, CNN은 이 내부 연산끼리 서로 영향을 주고 받지 않습니다만, RNN은 더 앞선 순서의 hidden layer가 그 다음 hidden layer의 연산에도 영향을 줍니다. Input 값들의 순서가, 연산의 순서에도 영향을 미치는 것을 짐작할 수 있습니다.

 초록색 hidden layer의 연산은 어떻게 진행이 되는지 좀더 살펴보겠습니다.

출처 : ratsgo'sblog

 

 

 첫번째 사진을 좀더 확대해서 본 사진 입니다. 보통 위 초록색 부분을 state라고 부릅니다. t번째 input x의 hidden state h를 계산할때, 그 이전에 계산된 t-1 번째 hidden state의 값이 영향을 미칩니다. 그리고 t번째 hidden state의 값을 통해 t번째 output을 출력하는 것이죠. (Hidden state에 별다른 연산을 하지 않고, Hidden state 자체를 output으로 사용하는 경우도 있습니다.)

 

 Input sequence의 갯수, Output Sequence의 갯수도 조절할 수가 있습니다. Output의 길이를 조절하려면, 사용하는 output 갯수를 조절하면 됩니다. Sequence 분류 task를 진행할때는 output이 딱 하나만 있어도 되는데, 이럴 경우에는 가장 마지막의 output값만 사용하면 되는 것이죠. 이러한 이유로 Input, output sequence의 길이를 자유자재로 조절할 수가 있는 것이죠.

 

 Hidden state의 값을 계산하는 식을 보시면, tanh 함수를 활성화 함수로 사용하였습니다. 이전에 활성화 함수를 소개한 글에서 시그모이드 함수를 설명했는데, 비슷한 모양을 가지는 하어퍼볼릭탄젠트 라는 함수 입니다. Tanh라는 비선형 함수를 활성화 함수로 사용하는 이유는, 이러한 비선형성이 존재하지 않는다면, hidden layer가 제대로 작동하지 않는다고 합니다. (자세한 사항은 ratsgo's blog, 밑바닥부터 시작하는 딥러닝 등의 자료를 찾아보시면...)

 

3. RNN의 단점

 

 RNN은 위에서 설명한 장점들이 강력하지만, 큰 단점들도 가지고 있습니다. T 시점의 hidden state를 계산하기 위해서는 T-1 시점의 hidden state의 값을 계산해야 합니다. 이런식으로 RNN은 하나의 layer를 계산하기 위해서 hidden state가 t타임만큼 순차적으로 계산이 되어야 합니다. CNN이 아무리 큰 filter size를 가지고 있더라도 병렬로 처리할 수 있는 것과는 아주 대조적입니다. 그래서 RNN은 기본적으로 연산 속도가 매우 느려집니다.

 

 또 하나의 아주 큰 단점은 vanishing gradient 문제 입니다. 단순하게 생각해서 layer가 깊어질수록 vanishing gradient 문제가 일어날 확률이 높아집니다. 예를 들어 128번째의 hidden state를 계산한다고 했을때, 1번째 hidden state 값을 계산하는 것 까지 거슬러 올라가게 됩니다. 128개의 layer를 거슬러 가게 되니까, gradient가 점차 줄어들고 학습이 불가능할 정도로 작아지는 문제가 생깁니다.

 

 그리고 Vanilia RNN의 경우 hidden state 간의 연산이 time step이 길어질 수록 그 이전 hidden state의 정보를 잘 전달하지 못합니다. 이런 문제를 장기 의존성 문제라고 합니다.

 

 위의 큰 단점들을 해결하기 위해 LSTM, GRU, 기타 RNN 계열에 대한 연구가 많이 진행이 되었습니다. 시간, 순서를 고려할 수 있는 모델링 이라는 장점을 살리기 위해서 입니다.

 

4. LSTM

 

 앞에서 얘기한 Vanila RNN은 사용하는 경우가 거의 없고, RNN 계열 중 가장 많이 사용하는 모델이 LSTM 입니다. LSTM은 Long Short Term Memory의 약자로 구조는 다음과 같습니다.

 상당히 복잡한 것을 볼 수 있죠. 하나의 hidden state를 계산할 때 저 연산을 다 진행하는 건데, 연산을 정리하면 이렇습니다.

 보시면 연산 함수가 f, i, o, C 등이 있는걸 알 수 있습니다. 이 때 f 함수쪽은 forgat gate, i 함수쪽은 input gate, C 함수쪽은 cell state update, o함수쪽은 output gate 라는 이름이 붙어있습니다. 

 

 Forget gate는 이전 hidden state와 t번째 input을 고려해서 어떤것을 잊어버릴지.

 

 Input gate는 다시 이전 hidden state와 t번째 input을 고려해서 어떤것을 기억할지,

 

 Cell state update는 forget gate의 값과, input gate의 값으로 최종적으로 어떤걸 잊어버리고, 기억해서 cell state를 업데이트 합니다. LSTM의 위쪽에 있는 (C)가 Cell state를 의미합니다.

 

 Output gate는 이전 hidden state와 t번째 input을 고려해서 다음 hidden state를 계산합니다. 그리고 LSTM에서는 이 hidden state가 그 시점에서의 output이 됩니다.

 

 위의 4부분이 계속 Cell state와 hidden state를 업데이트 하면서 LSTM이 학습이 되는 것 입니다.

 

'딥러닝' 카테고리의 다른 글

15. AutoEncoder 예제코드  (0) 2019.11.26
14. AutoEncoder  (0) 2019.11.23
12. Learning Curve (학습 곡선)  (2) 2019.11.19
11. Activation Function (활성화 함수)  (0) 2019.11.18
10. Transfer Learning  (0) 2019.11.16