RNN ~ Transformer - (1) RNN

윤준영·2025년 6월 15일

NLP

목록 보기
1/3

이번 글은 Recurrent Neural Network (RNN)부터 Sequence 2 Sequence (Seq2Seq), Attention, Transformer까지의 전반적인 이론과 각 모델의 등장배경을 다뤄볼 예정이다.
최근에 멀티모달 관련 task를 맡아서 수행하게 되서 자연어처리 분야에 대한 다양한 논문도 공부할 예정이다.

오늘 다룰 글은 RNN이다.

1. RNN의 등장배경

시계열, 동영상, 텍스트, 등 다양한 시퀀스 데이터가 존재한다.

그리고 이러한 입력 시퀀스가 있을 때, 이전 시점을 통해 다음 시점을 예측할 수 있다. 이론 상 이를 무한히 반복해서 원하는 시점까지의 데이터를 예측할 수 있을 것이다.

하지만 이렇게 단순히 한 시점에만 의존하여 출력을 계산하면, 이전 시점들과는 독립적이므로 부정확한 결과가 나올 확률이 크다.
그래서 등장한 것이 RNN이다. RNN은 시퀀스를 처리할 때마다 바뀌는 hidden state가 있는데, 이를 통해 이전 시점을 반영하여 다음 시점을 예측한다.

2. RNN의 연산과정

연산과정을 좀 더 자세히 나타내면 다음 그림과 같다.

Ot=htWhoht=tanh(ht1Whh+xtWxh)O_t = h_tW_{ho} \\ h_t = \tanh(h_{t-1}W_{hh} + x_tW_{xh})

여기서 xtx_t, oto_t는 입력과 출력이고, WxhW_{xh}, WhhW_{hh}, WhoW_{ho} 는 0~1 사이의 랜덤 값으로 초기화된 weight matrix이다.
Weight matrix 각각의 shape은 (input 길이 ×\times hidden 길이), (hidden 길이 ×\times hidden 길이), (hidden 길이 ×\times output 길이) 이다.

예시로 'h', 'e', 'l', 'l'이 입력으로 들어올 때 'o'를 예측하는 방법을 수식으로 풀어보자.

  1. One-hot encoding
    각 단어인 'h', 'e', 'l', 'o'를 벡터로 encoding한다.


    이 벡터들이 입력값인 xtx_t가 된다.

  2. Hidden state 계산
    입력값 xtx_t와 이전 시점의 hidden state ht1h_{t-1}, 그리고 다음 hidden state로 보내는데 사용되는 두 개의 weight matrix WxhW_{xh}, WhhW_{hh} 를 이용해서 다음 hidden state를 계산할 수 있다.

    ht=tanh(ht1Whh+xtWxh)h_t = \tanh{(h_{t-1}W_{hh} + x_tW_{xh})}

    이 식을 따르면 h1=tanh(h0Whh+x1Wxh)h_1 = \tanh{(h_{0}W_{hh} + x_1W_{xh})} 가 된다.
    x1x_1(1,0,0,0)(1,0,0,0)이고, 초기 은닉 상태값은 영행렬로 설정한다. hh의 shape은 하이퍼파라미터이고, h0h_0(0,0,0)(0,0,0)이라 하겠다. 그럼 WhhW_{hh}, WxhW_{xh}는 각각 (4×3)(4\times3), (3×3)(3\times3)이 될 것이다.

    Whh=[0.31520.50830.94540.30080.60580.29990.97410.34190.9133]W_{hh}=\begin{bmatrix}0.3152 & 0.5083 & 0.9454 \\ 0.3008 & 0.6058 & 0.2999 \\ 0.9741 & 0.3419 & 0.9133\end{bmatrix}
    Wxh=[0.29730.27660.79740.38690.91700.41250.55380.56460.50260.22060.68010.3880]W_{xh}=\begin{bmatrix}0.2973 & 0.2766 & 0.7974 \\ 0.3869 & 0.9170 & 0.4125 \\ 0.5538 & 0.5646 & 0.5026 \\ 0.2206 & 0.6801 & 0.3880\end{bmatrix}

    이 값들을 가지고 계산해보면,

    h0Whh=[000][0.31520.50830.94540.30080.60580.29990.97410.34190.9133]=[000]h_0W_{hh}=\begin{bmatrix}0 & 0 & 0\end{bmatrix} \begin{bmatrix}0.3152 & 0.5083 & 0.9454 \\ 0.3008 & 0.6058 & 0.2999 \\ 0.9741 & 0.3419 & 0.9133\end{bmatrix} = \begin{bmatrix}0 & 0 & 0\end{bmatrix}
    x1Wxh=[1000][0.29730.27660.79740.38690.91700.41250.55380.56460.50260.22060.68010.3880]=[0.29730.27660.7924]x_1W_{xh}=\begin{bmatrix}1 & 0 & 0 & 0\end{bmatrix} \begin{bmatrix}0.2973 & 0.2766 & 0.7974 \\ 0.3869 & 0.9170 & 0.4125 \\ 0.5538 & 0.5646 & 0.5026 \\ 0.2206 & 0.6801 & 0.3880\end{bmatrix} = \begin{bmatrix}0.2973 & 0.2766 & 0.7924\end{bmatrix}
    tanh(h0Whh+x1Wxh)=tanh([0.29730.27660.7924])=[0.28990.26890.6626]\tanh{(h_0W_{hh}+x_1W_{xh})}=\tanh{(\begin{bmatrix}0.2973 & 0.2766 & 0.7924\end{bmatrix})}=\begin{bmatrix}0.2899 & 0.2689 & 0.6626\end{bmatrix} \\
  3. 출력값 계산
    출력값 o1o_1은 다음과 같이 계산된다.

    o1=h1Whoo_1 = h_1W_{ho}

    WhoW_{ho}의 shape은 (3 ×\times 4)가 될 것이다.

    Who=[0.31890.62160.51640.75010.02600.62300.01790.61230.13200.90090.38730.8142]W_{ho}= \begin{bmatrix}0.3189 & 0.6216 & 0.5164 & 0.7501 \\ 0.0260 & 0.6230 & 0.0179 & 0.6123 \\ 0.1320 & 0.9009 & 0.3873 & 0.8142\end{bmatrix}
    h1Who=[0.28990.26980.6626][0.31890.62160.51640.75010.02600.62300.01790.61230.13200.90090.38730.8142]=[0.18660.94460.41060.9213]h_1W_{ho}=\begin{bmatrix}0.2899 & 0.2698 & 0.6626\end{bmatrix}\begin{bmatrix}0.3189 & 0.6216 & 0.5164 & 0.7501 \\ 0.0260 & 0.6230 & 0.0179 & 0.6123 \\ 0.1320 & 0.9009 & 0.3873 & 0.8142\end{bmatrix}=\begin{bmatrix}0.1866 & 0.9446 & 0.4106 & 0.9213\end{bmatrix}
  4. Softmax & Argmax
    출력값 o1o_1에 대해 softmax를 취해 각 인덱스에 대한 확률값을 구한다.

    softmax(o1)=[0.15460.32980.19340.3222]softmax(o_1)=\begin{bmatrix}0.1546 & 0.3298 & 0.1934 & 0.3222\end{bmatrix}

    여기에 argmax를 적용하면 1번 인덱스 값인 'e'가 최종 output이 된다.
    이후 다음 output을 계산할 때의 weight matrix는 동일한 weight matrix를 사용해서 다음 시점의 output을 구해나간다.

이 모든 과정을 시각화하면 다음과 같다.

이 과정을 모든 시점에 적용하여 마지막 시점까지의 출력값을 계산한 후, 각 시점에서의 출력값과 실제값의 차이를 모두 합하여 cross-entropy에 적용하여 얻은 loss값을 토대로 backpropagation을 진행해서 weight matrix를 업데이트 한다.

3. RNN의 한계

  • Short-term memory

    RNN은 입력 시퀀스가 길어지면 앞 쪽 시점에 대한 정보를 잘 반영하지 못한다는 단점이 있다.

  • Gradient vanishing
    RNN은 activation function으로 tanh를 사용하지만, 값이 거의 항상 1보다 작아서 기울기 소실 문제가 발생한다.

이 문제를 해결하기 위해 gate를 추가하여 선택적으로 정보를 기억할 수 있도록 개선하는 논문들도 등장하였다.

하지만 위에서 든 단어 예측 예시는 입력 시퀀스와 출력 시퀀스가 1:1 매핑이 되서 사용이 가능한거였고, 번역과 같은 task의 경우에는 입력 시퀀스와 출력 시퀀스의 길이가 다를 수 있어서 한계가 있다.

이 한계점들을 극복하기 위해 다음 글에서 소개할 Sequence 2 Sequence가 등장한다. 이에 대한 내용은 다음 게시글에 작성하도록 하겠다.

profile
AMC AI research engineer

0개의 댓글