RNN(Recurrent Neural Networks)

June·2022년 1월 16일
0
post-thumbnail

RNN의 기본구조


RNN은 히든 노드가 방향을 가진 엣지로 연결돼 순환구조를 이루는(directed cycle) 인공신경망의 한 종류이다. 음성, 문자 등 순차적으로 등장하는 데이터 처리에 적합한 모델로 많이 알려져 있다.

RNN의 기본구조를 설명하면, 녹색으로 된 박스는 hidden state를 의미를 하며, 빨간색은 input xx, 파란색은 output yy를 의미한다. RNN은 현재 상태의 hidden state hth_t는 직전시점의 hidden state ht1h_{t-1}를 받아 갱신된다.

현재 상태의 output yty_thth_t를 전달받아 갱신되는 구조이다. 수식에서도 알 수 있듯 hidden state의 활성함수(activation function)은 Nonlinear 함수인 (tanh)함수이다.


예시를 들면, RNN모델에 "hell"을 넣어서 "o"를 반환하게해 결과적으로 "hello"를 출력하게 만들겠다고 해보자.
먼저 우리가 가진 학습데이터는 "h","e","l","l"인데 이를 one-hot vector로 바꾸게 되면[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1][1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]이 되게 된다.

x1x1[1,0,0,0][1,0,0,0]이고 이를 기반으로 h1h_1[0.3,0.1,0.9][0.3,−0.1,0.9]를 만들게 된다.(h0h_0는 없기 때문에 random으로 값을 넣어준다. 또 이 h1h_1을 기반으로 y1y_1 [1.0,2.2,3.0,4.1][1.0,2.2,−3.0,4.1]로 생성을하고 그 다음 단계들도 모두 값을 갱신하게 한다. 이 과정을 순전파(Foward Propagation)이라고 한다.

다른 인공신경망과 마찬가지로 RNN도 정답을 필요로 하는데, 모델에 정답을 알려줘야 모델이 "parameter"를 적절히 갱신해 나가기 때문에 이 경우엔 바로 다음 글자가 정답이 되게 된다. ‘h’의 다음 정답은 ‘e’, ‘e’ 다음은 ‘l’, ‘l’ 다음은 ‘l’, ‘l’ 다음은 ‘o’가 정답이 되게 된다.

위의 그림을 기준으로 설명을 하면 첫번째 정답인 ‘e’는 두번째 요소만 1이고 나머지가 0인 one-hot-vector이다. 그림을 보면 output에 진한 녹색으로 표시된 숫자들이 있는데 정답에 해당하는 index를 의미한다. 이 정보를 바탕으로 역전파(backpropagation)를 수행해 parameter값들을 갱신해 나가게 된다.


RNN의 hidden layer 연산을 그림으로 표현하면 위와 같은데, input xx를 hidden layer hh로 보내는 WxhW_{xh}, 이전 hidden layer hh에서 다음 hidden layer hh로 보내는 WhhW_{hh}, hidden layer hh에서 output yy로 보내는 WhyW_{hy}가 바로 "parameter"가 되게 된다. 모든 시점의 state에서 이 parameter는 동일하게 적용된다.

RNN의 Forwardpropagation


위에서 설명한 수식을 그래프로 옮겨놓은 것 뿐이다.

RNN의 Backpropagation

Backpropagation을 하는 이유

  • Forwardpropagation시에 Parameter가 매우 많고 layer가 여러개 있을때 가중치wwbb를 학습시키기 어려웠다는 문제이다. 이를 해결하기 위해 Backpropagation을 하는 것인데 각 layer에서 기울기 값을 구하고 그 기울기 값을 이용하여 Gradient descent 방법으로 가중치wwbb를 update시키면서 해결된 것이다.
  • 즉, layer에서 기울기 값을 구하는 이유는 Gradient descent를 이용하여 가중치를 update하기 위함!!!


우선 forward pass를 따라 최종 출력되는 결과는 ytyt이다. 최종 Loss에 대한 yty_t의 그래디언트(dL/dytdL/d_{yt})가 RNN의 역전파 연산에서 가장 먼저 등장한다. 이를 편의상 dytdy_t라고 표기했고, 순전파 결과 yty_t와 대비해 붉은색으로 표시했다.

dytdy_t는 덧셈 그래프를 타고 양방향에 모두 그대로 분배가 되고 dWhydW_{hy}는 흘러들어온 그래디언트 dytdy_t에 로컬 그래디언트 hth_t를 곱해 구한다. dhtdh_t는 흘러들어온 그래디언트 dytdy_tWhyW_{hy}를 곱한 값이다. dhrawdh_{raw}는 흘러들어온 그래디언트인 dhtdh_t에 로컬 그래디언트인 1tanh2(hraw)1−tanh^2(h_{raw})을 곱해 구하게되고, 나머지도 동일한 방식으로 구하게된다.

다만 위 그림에 주의할 필요가 있는데, RNN은 Hidden node가 순환 구조를 띄는 신경망이다. 즉 hth_t를 만들 때 ht1h_{t−1}가 반영된다. 바꿔 말하면 아래 그림의 dht1dh_{t−1}t1t-1 시점의 Loss에서 흘러들어온 그래디언트인 Whydyt1W_{hy}∗d_{y_{t−1}}뿐 아니라 ★에 해당하는 그래디언트 또한 더해져 동시에 반영된다는 뜻이다.

참고자료

  1. https://ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/
    (ratsgo`s bolog, RNN과 LSTM을 이해해보자!)
  2. https://ganghee-lee.tistory.com/31
  3. https://wikidocs.net/22886
profile
회사와 “함께” 성장하는 개발자

0개의 댓글