1. LSTM 등장 배경
■ LSTM 모델은 기존의 바닐라 RNN 모델에서 정보를 저장하는 과정을 발전시켜 바닐라 RNN의 큰 단점이었던 단기 기억만 가능하다는 부분(장기 의존성 문제)을 개선했다.
■ 이 과정에는 새로운 '기억 셀(memory cell)'인 'cell state' 구조를 제안하고 '게이트(gate)'라는 개념을 사용하여 단기 기억과 장기 기억뿐만 아니라 '망각' 개념까지 담겨 있어 인간의 기억 관리와 비슷한 부분이 있다.
1.1 RNN 문제점
■ 가장 단순한 형태의 RNN을 바닐라 RNN(Vanilla RNN) 또는 Simple RNN이라고 부른다. 바닐라 RNN은 다음과 같은 순환 경로를 통해 과거 시점의 정보를 계승할 수 있어 시퀀스 데이터를 다루기에 적합하다.
- 바닐라 RNN은 위와 같이 현재 시점의 출력값인 현재 시점의 은닉 상태를 다음 시점의 RNN 계층으로 전달하며, 마지막 시점의 은닉 상태 \( h_t \)에 정보를 압축하는 방식으로 동작한다.
- 이는 현재 시점에서 과거의 정보를 이어받는 방식이라 볼 수 있다.
■ 그러나 시계열 데이터의 길이가 길어질 경우(즉, time step이 증가할 경우), 과거 시점의 정보가 현재 시점에 충분히 전달되지 않는 문제가 발생한다.
■ 이는 BPTT 방법으로 학습을 수행할 때, 시퀀스가 길어질수록 그래디언트(기울기) 소실(혹은 폭발)이 발생하기 때문이다.
■ 이로 인해 시간적으로 멀리 떨어진 정보에 대한 그래디언트 값이 0에 가까워지거나(혹은 지나치게 커지면서) 손실(Loss)을 최소화하기 위한 가중치 매개변수 업데이트가 제대로 이루어지지 않는다.
- 만약, 기울기가 중간에 소실되어 기울기 값이 0이 된다면, 가중치 매개변수의 업데이트는 0이다. 업데이트가 이루어지지 않는다.
■ 역전파 과정에서 손실을 최소화하기 위한 가중치 매개변수 업데이트가 제대로 이루어지지 않는다면, 결과적으로 다음 순전파 과정에서 시퀀스(ex) 단어(토큰)) 간 관계를 올바르게 학습하지 못해 최종 손실 감소에 실패할 수 있다.
- 예를 들어 문장 생성이라면, 가중치 매개변수가 올바른 방향으로 업데이트되어야 다음 순전파 과정에서 더욱 올바른 단어의 출현 확률 분포를 계산되어 최종 손실이 감소할 것이다.
- 그러나 가중치 매개변수가 올바르게 업데이트되지 않는다면, 더 이상 각 시점의 시퀀스(ex) 단어(토큰)) 간 관계가 올바르게 학습되지 않는다.
■ 특히, 서로 가까운 위치에 있는 단어(토큰). 예를 들어 \( x_1, x_3 \) 간의 관계는 비교적 크게 훼손되지는 않겠지만, 시간적으로 멀리 떨어진 단어 간 관계는 그래디언트 소실 또는 폭발로 인해 관계가 크게 틀어진다.
■ 예를 들어, 다음과 같이 단어를 예측하는 문제가 있을 때, 마지막 시점에서 해당 시점의 단어를 예측하기 위해, 첫 번째 시점의 단어에 대한 정보가 필요하다고 하자.
■ 마지막 RNN 계층은 순전파 과정에서 첫 번째 RNN 계층의 은닉 상태(단어 'you'에 대한 정보가 들어 있음)부터 과거 정보가 순차적으로 전파되어, 이전 시점의 RNN 계층의 은닉 상태와 해당 시점의 입력 데이터를 이용해 단어 'to'가 들어간 시점의 Loss를 계산한다.
■ 그러므로 역전파 과정에서도 은닉 상태의 기울기가 이전 시점들의 RNN 계층으로 계속 전파된다.
■ RNN 계층을 사용한 신경망 구조는 이렇게 역전파 과정에서 각 시점의 은닉 상태 기울기가 순차적으로 전파되어 원래대로라면,
- Loss가 최소화되는 방향으로 가중치 매개변수를 업데이트해서 다음 순전파 과정에서는 더욱 올바른 단어의 출현 확률 분포가 출력되고 최종 Loss가 감소해야 하지만, (단어 간의 관계가 올바르게 학습된 상태)
- 기울기가 중간에서 소실되거나 폭발하면 가중치 매개변수가 올바르게 갱신되지 않으므로, 더 이상 각 시점의 단어 간 관계가 올바르게 학습되지 않는다.
- 서로 가까운 위치의 단어(예를 들어 'to'와 'to'이전의 단어)이면 단어 간 관계가 크게 훼손되지는 않겠지만,
- 시간적으로 멀리 떨어진 단어(예를 들어 'you'와 'to')이면, 기울기 소실 또는 폭발로 인해 관계가 크게 틀어질 것이다.
- 'you'의 은닉 상태가 \( h_0 \)라면, \( h_0 \)에 있는 정보에 대해서는 의미 없는 기울기가 전달되어 가중치 매개변수 업데이트가 제대로 일어나지 않으니, 다음 순전파 과정에서 의미 없는 \( h_0 \)가 다음 RNN 계층으로 전달되므로 성능이 떨어질 수밖에 없다.
■ 기울기 소실/폭발 문제로 가중치 매개변수가 제대로 업데이트되지 않았다면, 마지막 시점에서는 첫 번째 시점의 단어를 올바르게 기억하지 못할 것이다. 이를 장기 의존성 문제라고 한다.
■ 즉, 바닐라 RNN은 단기 기억은 가능하지만, 장기 기억이 어렵다는 단점이 있다.
참고) 게이트(gate)가 추가된 RNN - LSTM, GRU
게이트(gate)가 추가된 RNN - LSTM, GRU
1. RNN의 문제점■ RNN은 순환 경로를 통해 과거 정보를 계승할 수 있어 시퀀스 데이터(순서가 있는 데이터)인 시계열 데이터를 다루기에 적합하다. ■ 하지만, 길이가 긴 시계열 데이터를 사용할
hyeon-jae.tistory.com
■ 시간 방향(time step) 축이 깊을수록 RNN에서 기울기 소실/폭발 문제가 발생하는 이유는 다음과 같다.
1.2 RNN의 기울기 소실/폭발
■ RNN 계층을 사용할 경우 기울기 소실 또는 폭발이 발생하는 이유는 은닉 상태를 계산하는 식 \( h_t = \text{tanh}(h_{t-1} W_h + \mathbf{x}_t W_x + b) \)에 있다. 더 정확히는 식에 있는 'tanh'와 '행렬 곱' 연산이 역전파 과정에서 문제가 된다.
■ \( h_t = \text{tanh}(h_{t-1} W_h + \mathbf{x}_t W_x + b) \) 식을 이용해 각 시점의 RNN 계층에서 은닉 상태의 학습 과정을 계산 그래프 형태로 나타내면 다음과 같다.
■ 위의 그림에서 볼 수 있듯이 역전파로 전해지는 기울기 \( dh_{T-1} \)는 tanh과 행렬 곱 연산으로 통과하고 \( T-1 \) 시점에서 행렬 곱 연산을 거친 기울기가 순차적으로 이전 시점들에 전파되는 것을 볼 수 있다.
■ 이때 tanh가 기울기 소실 문제를, 행렬 곱 연산이 기울기 폭발 문제를 야기시킨다.
■ 먼저 tanh의 식은 \( y = \tanh(x) = \dfrac{e^x - e^{-x}}{e^x + e^{-x}} \)으로, 미분 값은 \( y' = 1 - \tanh^2(x) = 1 - y^2 \)이다.
■ 즉, tanh 함수는 역전파 과정에서 다음 계산 그래프와 같이 \( 1 - y^2 \) 하류에 값이 곱해진다.
■ 이 과정을 그래프로 나타내면 다음과 같다.
tanh(x)의 미분 그래프를 보면, \( x \) 값이 0으로부터 멀어질수록 작아져 0에 수렴하는 것을 볼 수 있다.
■ 즉, 역전파 과정에서 기울기가 tanh를 지날 때마다, 기울기 값은 계속 작아지는데, 모든 RNN 계층에서 tanh 함수를 한 번씩 사용하니, 시계열 데이터의 길이가 길어질수록 기울기 소실 문제가 발생할 가능성이 높을 수밖에 없다.
cf) 그러므로 tanh 대신, ReLU 계열의 함수를 사용한다면, 기울기 소실을 줄일 수 있을 것이다.
■ 행렬 곱 연산이 기울기 폭발 문제를 발생시키는 것도 모든 RNN 계층에서 한 번씩 행렬 곱 연산을 수행하기 때문이다.
■ 위의 은닉 상태의 학습 과정 그림에서 RNN 계층의 행렬 곱 연산 과정만 보았을 때, 순전파 과정에서 동일한 가중치 \( W_h \)가 매번 사용되므로, 역전파 과정에서 \( dh W_h^T W_h^T \cdots W_h^T \)가 전달된다.
■ 만약, 입력 데이터가 길이가 \( T \)인 시계열 데이터라면, \( W_h^T \) 값이 \( dh \)에 \( T \)번 곱해진다.
■ 그러므로 역전파 과정에서 \( W_h > 1 \)이라면 기울기 폭발, \( Wh < 1 \)이면 기울기 소실이 발생할 가능성이 높아진다.
참고) RNN (1)
RNN (1)
1. 순환 신경망(Recurrent Neural Network, RNN)■ 시계열 데이터에 더 나은 예측을 하기 위해 과거 시점의 정보를 현재 시점에 반영하는 순환 신경망(Recurrent Neural Network, RNN)은 피드포워드 신경망과 달
hyeon-jae.tistory.com
■ 이렇게 시간 축(time step) 방향의 깊이로 인해 발생하는 기울기 폭발 문제는 기울기 클리핑(gradients clipping)이라는 개념을 통해 해결할 수 있다.
1.3 기울기 클리핑
■ 기울기 클리핑은 기울기의 L2 노름(\( \| \widehat{g} \| \))이 특정 임곗값을 넘어가면, 다음 식과 같이 기울기에 기울기의 L2 노름으로 나눠주고 임곗값을 곱해주는 방식으로 기울기를 수정한다.
- \( \hat{g} \)는 신경망에서 사용되는 모든 매개변수의 기울기를 모은 것
- 예를 들어 신경망에서 가중치 매개변수 \( W_1, W_2 \)만 사용한다면, \( W_1, W_2 \)의 기울기 \( dW_1, dW_2 \)를 하나로 결합한 \( [dW_1, dW_2] \)가 \( \hat{g} \)
■ 기울기 클리핑을 적용하면, 다음 그림과 같이 기울기 벡터가 방향은 유지하면서 작은 값(\( \dfrac{\text{threshold}}{\| \widehat{g} \|} \widehat{g} \))만큼 이동하여(기울기 벡터의 크기를 작게 만들어) 안정적으로 내려간다.
■ 기울기 소실 문제는 '게이트(gate)'라는 구조를 더해 해결하는데, 이 게이트 구조가 더해진 대표적인 계층이 바로 LSTM(Long Short Term Memory), GRU(Gated Recurrent Units)이다.
참고) [PyTorch] Gradient clipping (그래디언트 클리핑)
[PyTorch] Gradient clipping (그래디언트 클리핑)
Gradient clipping을 하는 이유 주로 RNN계열에서 gradient vanishing이나 gradient exploding이 많이 발생하는데, gradient exploding을 방지하여 학습의 안정화를 도모하기 위해 사용하는 방법이다. Gradient clipping과 L
sanghyu.tistory.com
2. LSTM(Long Short-Term Memory)
■ LSTM은 Long 'Short Term Memory'로 단기 기억을 장시간 유지할 수 있음을 의미한다.
■ LSTM에는 셀 상태(cell state)라는 기억 셀이 추가되었으며, 셀 상태 또한 은닉 상태(hidden state)처럼 이전 시점의 셀 상태가 다음 시점의 셀 상태를 구하기 위한 입력으로 사용된다.
■ 즉, LSTM에는 은닉 상태(hidden state)와 셀 상태(cell state)를 통해 '기억'을 유지하며, 은닉 상태 값과 셀 상태 값을 구하기 위해서 게이트(gate)를 사용한다.
2.1 게이트(Gate)란?
■ LSTM, GRU에서는 '게이트(gate)'라는 개념을 사용해서 정보(데이터)를 얼마나 유지하고, 얼마나 흘려보낼지를 조절한다. 이는 마치 수문이라는 게이트를 이용해 물의 흐름을 차단거나 배출하는 방식과 유사하다.
■ LSTM/GRU에서 사용하는 게이트는 단순히 '열기/닫기' 기능뿐만 아니라, 어느 정도 열지를 조절할 수도 있다.
■ 예를 들어 열림/닫힘 상태를 0.0 ~ 1.0 사이의 실수로 표현한다고 하면, 0.0은 완전히 닫힌 상태. 1.0은 완전히 열린 상태라고 할 수 있다.
- 예컨대 값이 0.7이라면, '정보를 70% 정도만 흘려보내고 나머지 30%는 차단한다.'라는 의미가 된다.
■ LSTM에는 총 3개의 게이트가 존재한다. 바로 입력 게이트(input gate), 망각 게이트(forget gate), 출력 게이트(output gate)이다. 각 게이트에서는 각각 입력, 망각, 출력할 정보의 양을 조절한다.
■ 이때, 각 게이트에서 정보를 얼마나 보낼지는 학습 과정에서 자동으로 결정된다.
■ 각 게이트는 열림 상태를 제어하기 위해 각각 전용 가중치 매개변수를 가지고 있으며, 이 가중치들은 학습 과정에서 학습 데이터를 바탕으로 갱신되기 때문이다.
■ 그리고 게이트의 열림 상태(또는 열림 정도)를 계산하기 위해 시그모이드 함수가 사용된다. 시그모이드 함수는 0.0에서 1.0 사이의 실수 값을 출력하기 때문에 게이트의 열림 정도를 정하는 데 적합하다. 이 값들을 가지고 게이트를 조절한다.
■ LSTM/GUR의 게이트는 긴 시계열 데이터에서도 중요한 정보를 유지하고, 불필요한 정보는 걸러냄으로써 RNN의 한계(장기 의존성 문제)를 극복하는 핵심 장치이다.
2.1 LSTM의 구조
■ 다음 그림들은 LSTM의 구조와 LSTM의 내부에서 이루어지는 전체적인 과정을 시각적으로 나타낸 것으로, 각 구성 요소들이 어떻게 상호작용하며 정보를 처리하는지를 볼 수 있다.
■ LSTM 내부 구조를 보면, 3개의 게이트가 있으며 왼쪽부터 순서대로 망각(forget), 입력(input), 출력(output) 게이트이다.
■ 그리고 LSTM에 \( c \)라는 경로가 있다. 이 \( c \)를 기억 셀(memory cell)' 혹은 '셀(Cell)'이라 하며 과거부터 시점 \( t \)까지의 모든 정보가 담겨 있다.
■ 이 기억 셀은 일종의 추가 기억 장소이다. 예를 들어 위의 그림에서 \( c_t \)는 \( t \) 시점 LSTM 계층 내의 추가 기억 장소이다. 장기 기억은 이 셀 상태(cell state)에 인코딩되며, 셀 상태를 통해 기울기 소실을 방지할 수 있다.
■ 위의 과정을 보면, 현재 시점의 셀 상태인 \( c_t \)는 이전 시점의 셀 상태 \( c_{t-1} \)와 은닉 상태 \( h_{t-1} \) 그리고 현재 시점의 입력 \( \mathbf{x}_t \)으로부터 계산된 결과임을 볼 수 있다.
■ \( c_t \)는 과거부터 \( t_1 \) 시점까지의 정보를 담고 있는 셀 상태 \( c_{t-1} \)에 얼마나 정보를 잊을 것인지를 나타내는 망각 게이트를 통과한 값과 현재 입력(토큰) \( \mathbf{x}_t \)에 대한 정보를 얼마나 반영할지를 결정하는 입력 게이트를 통과한 값을 합산하여 계산되는 것을 볼 수 있다.
■ 즉, \( c_t \)는 정보의 필터링을 담당하는 망각 게이트와 입력 게이트에 의해 '과거의 모든 정보 중 불필요하다고 판단되는 정보와 현재 입력에 대한 필요한 정보를 적절히 결합해 생성된 결과라고 할 수 있다.
■ 이 과정에서 망각 게이트와 입력 게이트는 이전 시점의 정보 \( h_{t-1} \)과 현재 시점의 입력 \( \mathbf{x}_t \)의 값을 조합해서 구하는 것을 볼 수 있다.
■ 이렇게 망각, 입력 게이트와의 계산을 거쳐 셀 상태에 인코딩된 정보 \( c_t \)는 출력 게이트를 통과한 값과 어떤 계산을 통해 한 번의 정보 수정을 진행해서 전송될 정보를 제어하며, 최종적으로 다음 시점(time step)에 전송할 \( h_t \)를 출력한다.
2.1.1 출력 게이트(output gate)
■ LSTM에는 RNN과 다르게 다음과 같이 은닉 상태 \( h_t \)의 출력을 제어하는 출력 게이트(output gate)가 있다.
■ output gate의 열림 상태는 입력 \( \mathbf{x}_t \)와 이전 시점의 은닉 상태 \( h_{t-1} \)을 이용해 다음과 같이 계산한다.
\( \mathbf{o} = \sigma(\mathbf{x_t} \mathbf{W}_x^{(o)} + \mathbf{h}_{t-1} \mathbf{W}_h^{(o)} + \mathbf{b}^{(o)}) \)
- 여기서 \( \mathbf{o} \)는 output, \( \sigma \)는 Sigmoid 함수
- \( \mathbf{W}_x^{(o)}, \mathbf{W}_h^{(o)}, \mathbf{b}^{(o)} \)는 output 게이트의 전용 매개변수
■ 망각 게이트와 입력 게이트를 거쳐 불필요한 과거 정보가 제거되고, 필요한 현재 정보가 반영된 셀 상태 \( c_t \)에 하이퍼볼릭 탄젠트(tanh) 함수를 적용하여 생성된 \( \text{tanh}(c_t) \)와 출력 게이트의 출력값인 \( \mathbf{o} \)의 원소별(component-wise) 곱을 통해 은닉 상태 \( h_t \)를 계산한다. 수식으로는 다음과 같이 표현된다.
\( h_t = \mathbf{o} \odot \tanh(\mathbf{c}_t) \)
■ tanh함수와 sigmoid 함수의 그래프는 다음과 같이 입력을 받으면 tanh 함수는 -1.0 ~ 1.0 사이의 값을, sigmoid 함수는 0.0 ~ 1.0 사이의 값을 반환한다. \( h_t \)는 이러한 sigmoid 함수가 적용된 벡터와 tanh 함수가 적용된 벡터의 원소별 곱(아다마르 곱)으로 볼 수 있다.
■ 그러므로, \( \text{tanh}(c_t) \)는 셀 상태 \( c_t \)에 포함된 과거부터 현재 \( t \) 시점까지의 정보를 -1.0에서 1.0 사이의 값으로 정보의 강약 정도를 나타냈다고 볼 수 있으며,
■ \( \mathbf{o} \)는 sigmoid 함수를 통해 각 원소별로 0.0에서 1.0 사이의 실수 값을 원소별로 곱함으로써, 벡터 각각의 원소를 얼마나 쓸 것인지. 즉, 어떤 정보를 꺼내고 어떤 정보를 차단할지 정보의 흐름을 제어하는 역할을 한다고 볼 수 있다.
■ 만약, \( \mathbf{o} \)의 \( i \)번째 값이 1에 가까운 경우, \( \text{tanh}(c_t) \)의 \( i \) 번째 원소. 즉, \( i \) 번째 정보를 거의 그대로 은닉 상태 벡터 \( h_t \)의 \( i \) 번째 원소에 전달하며,
■ 반대로 \( \mathbf{o} \)의 \( j \)번째 값이 0에 가까운 경우 \( \text{tanh}(c_t) \)의 \( j\) 번째 정보를 거의 차단하여 전달하지 않는다.
■ 예를 들어 \( \text{tanh}(c_t) = [0.5, -0.3, 0.8] \)이고 \( \mathbf{o} = [0.9, 0.2, 0.7] \)이라면, 두 벡터의 원소별 곱셈 결과인 \( h_t \)는 \( h_t = [0.45, -0.06, 0.56] \)이 된다. 첫 번째 원소(정보)는 거의 그대로 전달되며, 두 번째 정보는 거의 차단되는 것을 볼 수 있다.
■ 결론적으로, 출력 게이트는 \( \text{tanh}(c_t) \)와 결합하여 어떤 요소에서 정보를 얼마나 활성화하거나 억제할지를 조정함으로써 LSTM 모델이 시점(time step)별로 필요한 정보만 활용할 수 있도록 도와준다고 할 수 있다.
2.1.2 망각 게이트(forget gate)
■ LSTM에는 RNN과 다르게 다음과 같이 과거 정보 \( c_{t-1} \) 중 불필요한 정보를 버리는 역할의 망각 게이트(forget gate)가 존재한다.
■ 위의 그림을 보면, 망각 게이트도 현재 시점의 입력과 이전 시점의 정보 \( h_{t-1} \)를 이용해 계산되는 것을 볼 수 있다. 이를 수식으로 나타내면 다음과 같다.
\( \mathbf{f} = \sigma(\mathbf{x_t} \mathbf{W}_x^{(f)} + \mathbf{h}_{t-1} \mathbf{W}_h^{(f)} + \mathbf{b}^{(f)}) \)
- \( \mathbf{W}_x^{(f)}, \mathbf{W}_h^{(f)}, \mathbf{b}^{(f)} \)는 forget 게이트의 전용 매개변수
■ forget gate도 output gate처럼 원소별 곱을 계산하지만, 그 대상은 과거부터 이전 시점까지의 정보를 담고 있는 벡터 \( c_{t-1} \)과 시그모이드 함수가 적용된 벡터 \( \mathbf{f} \)이다.
■ 그러므로 이 단계가 셀 상태의 중요한 정보는 그대로, 불필요한 정보는 차단되는 첫 번째 필터링 과정. 즉, 불필요한 정보를 잊어버리는 단계라고 할 수 있는 것이다. 이러한 잊어버리는 과정을 수식으로 나타내면 다음과 같다.
\( \mathbf{f} \odot c_{t-1} \)
- \( f_t \)의 원소는 시그모이드 함수에 의해 0.0 ~ 1.0 사이의 실수 값을 가지게 된다.
- \( f_t \)와 \( c_{t-1} \)의 연산은 원소별 곱으로 계산되므로, 만약 \( f_t \)의 모든 원소가 1이라면, 과거 정보 \( c_{t-1} \)을 모두 가져오겠다(기억하겠다)는 뜻과 비슷하다고도 해석할 수 있다.
- 반대로 \( f_t \)의 모든 원소가 0이 된다면, 이는 과거 데이터를 모두 버리겠다.(잊겠다)는 뜻으로 해석할 수 있다.
■ 이렇게 망각 게이트는 셀 상태의 각 원소에서 시그모이드 함수의 출력값에 따라 특정 정보를 유지하거나 제거함으로써 셀 상태를 업데이트하는 역할을 수행한다. 이때, 대상이 과거 시점의 정보이기 때문에 불필요한 과거 정보를 잊는다고 할 수 있는 것이다.
2.1.3 입력 게이트(input gate)
■ LSTM에는 RNN과 다르게 다음과 같이 forget gate를 통해 불필요한 정보를 지운 뒤, 그 빈자리에 현재 시점에서 새롭게 발생한 정보를 보충해 넣기 위해, 해당 정보(새로운 정보)를 얼마나 반영할지 조절하는 역할의 입력 게이트(input gate)가 존재한다.
■ 망각 게이트(forget gate)를 통해 과거 정보를 담고 있는 \( c_{t-1} \)에서 불필요한 정보를 제거한 이후에는, 그 빈자리에 현재 시점에서 새롭게 발생한 정보를 채워 넣어야 한다.
■ 그렇지 않으면 과거 정보 중 제거해야 할 부분만 반영되고, 현재 시점에서 필요한 새로운 정보가 셀 상태에 반영되지 않아 모델이 시점별로 중요한 정보를 학습하는 데 어려움을 겪게 된다.
■ 그러므로 먼저 위의 왼쪽 그림과 같이 '새로운 기억을(=현재 정보를 기억하기) 위한 과정'이 필요하다. 이 과정은 RNN에서 \( h_t \)를 계산하는 것과 동일하기 때문에 식은 다음과 같다.
\( \mathbf{g} = \tanh(\mathbf{x_t} \mathbf{W}_x^{(g)} + \mathbf{h}_{t-1} \mathbf{W}_h^{(g)} + \mathbf{b}^{(g)}) \)
- \( \mathbf{W}_x^{(g)}, \mathbf{W}_h^{(g)}, \mathbf{b}^{(g)} \)는 g의 전용 매개변수
■ 그다음, 새로운 기억 셀 \( \mathbf{g} \)의 정보(=새로운 정보)에 대해서도 현재 시점의 셀 상태 \( c_t \)에 어떤 새로운 정보를 인코딩할지 제어하기 위해 입력 게이트의 출력값과 원소별 곱을 계산한다.
■ 이때, input gate에서의 계산은 다음과 같다.
\( \mathbf{i} = \sigma(\mathbf{x_t} \mathbf{W}_x^{(i)} + \mathbf{h}_{t-1} \mathbf{W}_h^{(i)} + \mathbf{b}^{(i)}) \)
- \( \mathbf{W}_x^{(i)}, \mathbf{W}_h^{(i)}, \mathbf{b}^{(i)} \)는 input 게이트의 전용 매개변수
■ input gate에서의 원소별 곱셈 결과를 \( g \odot \mathbf{i} \)라고 하자. \( g \odot \mathbf{i} \)는 현재 시점의 셀 상태 \( c_t \)에 반영할 새로운 정보를 얼마나 반영할지를 결정한 상태의 값을 나타낸 벡터이다.
■ 그리고 이전 시점의 기억 셀 \( c_{t-1} \) (과거부터 시점 \( t-1 \) 까지의 모든 (인코딩된) 정보)에 forget 게이트의 출력 \( \mathbf{f} \)와 원소별 곱을 통해 \( c_{t-1} \)의 불필요한 정보가 지워진 상태를 나타내는 벡터를 \( \mathbf{f} \odot c_{t-1} \)이라고 하자.
■ 이러한 \( g \odot \mathbf{i} \)와 \( \mathbf{f} \odot c_{t-1} \)가 합산되어(덧셈 노드를 통해) 과거 정보 중 불필요한 정보를 망각하였으며, 현재 시점의 새로운 정보 중 필요한 정보를 담은 \( t \) 시점의 셀 상태 \( c_ t \)가 생성된다.
- 만약, 망각 게이트의 출력값인 \( \mathbf{f} \)가 0이 된다면, 이전 시점의 셀 상태인 \( c_{t-1} \)은 현재 시점의 셀 상태 \( c_t \)를 결정하기 위한 영향력이 0이 된다. 즉, 입력 게이트의 결과만이 현재 시점의 셀 상태 \( c_t \)를 결정하게 된다.
- 이는 현재 시점의 새로운 정보만 \( c_t \)에 담기므로, 망각 게이트는 완전히 닫히고 입력 게이트를 연 상태라고 볼 수 있다.
- 반대로, 입력 게이트의 출력값인 \( \mathbf{i} \)의 값이 0이 된다면, 현재 시점의 셀 상태 \( c_t \)는 오직 과거 정보. 즉, 이전 시점의 셀 상태인 \( c_{t-1} \)의 값에만 의존한다.
- 그러므로 망각 게이트는 이전 시점의 정보를 얼마나 반영할지를 담당하고, 입력 게이트는 현재 시점의 정보를 얼마나 반영할지 결정한다고 할 수 있다.
■ 이 셀 상태 \( c_t \)는 두 가지 경로로 나뉘어 전달된다.
■ 하나는 다음 시점인 \( t+1 \) 시점의 LSTM 계층으로 전달되어, \( t + 1 \) 시점의 셀 상태 \( c_{t+1} \)과 은닉 상태 \( h_{t+1} \)을 계산하는 데 사용된다.
- 이는 LSTM의 순환 구조에서 시간적 정보를 지속적으로 전달하여, 과거부터 현재까지의 정보를 다음 시점으로 이어주는 역할을 한다.
■ 다른 하나는 output gate와의 원소별 곱을 통해 현재 시점의 은닉 상태 \( h_t \)를 계산하여 출력하기 위해 사용된다. 이때 계산되는 \( h_t \)의 식을 나타내면 다음과 같다.
\( h_t = \mathbf{o} \odot \text{tanh} (c_t) \)
■ 최종적으로 계산된 \( h_t \)에는 이전 시점들로부터 축적해 온 정보(장단기 정보를 포함)를 압축하여 담고 있으며, 현재 시점에 주어진 입력 정보를 반영하여 새로운 정보도 적절히 포함하고 있는 상태라고 할 수 있다.
■ 여기까지가 LSTM 계층 내부에서 이뤄지는 계산 과정이다.
2.2 RNN과 비교
2.2.1 게이트
■ RNN과 LSTM의 가장 큰 차이점은 게이트이다.
■ 게이트를 사용하지 않는 RNN과 게이트를 사용하는 LSTM의 전체적인 내부 모습을 비교하면 다음과 같다.
■ 위의 그림에서 LSTM 구조를 살펴보면, LSTM의 핵심은 크게 두 가지로 나뉜다. 바로 맨 위의 cell state와 그 아래에 위치한 다수의 게이트를 통한 정보 필터링이다.
■ RNN과 LSTM의 공통적인 목표는 \( h_t \)를 계산하는 것이다.
- RNN의 경우 \( t \) 시점의 입력 데이터와 이전 시점의 정보 \( h_{t-1} \)을 통해 \( h_t \)를 계산한다.
- LSTM도 동일한 입력 데이터와 이전 은닉 상태를 사용하되, 여러 게이트를 통해 현재 시점의 cell state를 생성하고, 이를 한 번 더 처리하여 \( h_t \)를 계산한다.
■ 이렇게 RNN은 LSTM처럼 타임 스텝마다 정보를 선택적으로 유지하거나 버릴 수 있는 게이트가 없기 때문에 정보의 중요도와 무관하게 은닉 상태가 오직 입력 데이터에만 의존해 업데이트된다.
2.2.2 LSTM의 BPTT(Backpropagation through time) (LSTM 계층의 역전파 과정)
■ LSTM 계층의 순전파 과정에서 기억 셀 \( c_t \)는 다음과 같이 계산되었다.
\( c_t = c_{t-1} \otimes f_t \oplus g_t \otimes i_t \)
■ 그러므로 이 기억 셀에 대한 역전파 과정을 순서대로 나타낸다면, 다음과 같이 나타낼 수 있다.
■ 위의 LSTM 계층 역전파 과정에서 기억 셀 \( c \)의 역전파 과정만 보면, 덧셈 연산과 아다마르 곱 연산만 거쳐가는 것을 볼 수 있다. 덧셈 연산은 역전파 과정에서 상류에서 전해진 기울기를 그대로 하류에 전달하기 때문에 기울기 변화는 발생하지 않는다.
■ 그다음 \( \dfrac{\partial c_t}{\partial c_{t-1}} \)은
\( \begin{array}{rl} \dfrac{\partial c_t}{\partial c_{t-1}} &= \dfrac{\partial}{\partial c_{t-1}} \left[ c_{t-1} \otimes f_t \oplus g_t \otimes i_t \right] \\ &= \dfrac{\partial}{\partial c_{t-1}} \left[ c_{t-1} \otimes f_t \right] + \dfrac{\partial}{\partial c_{t-1}} \left[ g_t \otimes i_t \right] \\ &= c_{t-1} \otimes \dfrac{\partial f_t}{\partial c_{t-1}} + f_t \otimes \dfrac{\partial c_{t-1}}{\partial c_{t-1}} + g_t \otimes \dfrac{\partial i_t}{\partial c_{t-1}} + i_t \otimes \dfrac{\partial g_t}{\partial c_{t-1}} \\ &= c_{t-1} \otimes \dfrac{\partial f_t}{\partial c_{t-1}} + f_t + g_t \otimes \dfrac{\partial i_t}{\partial c_{t-1}} + i_t \otimes \dfrac{\partial g_t}{\partial c_{t-1}} \end{array} \)
로 아다마르 곱의 덧셈 구조로나타낼 수 있다.
■ 이렇게 아다마르 곱의 덧셈 구조로 계산되므로 RNN처럼 역전파 과정에서 동일한 가중치 행렬의 행렬 곱이 누적되지 않는다.
■ 또한, 두 번째 항은 forget gate의 출력값인 \( f_t \) 하나만 있다. 이렇게 역전파 과정에서 망각 게이트의 벡터가 존재하기 때문에 LSTM은 각 시점에서 특정 정보를 잊지 말아야 한다고 결정하고 그에 따라 모델의 매개변수를 업데이트할 수 있다.
- 역전파 과정에서 두 번째 항인 \( f_t \)를 통해 불필요한 정보에는 기울기 전파를 억제할 수 있다.
- 왜냐하면, 역전파 과정에서도 순전파 과정의 \( f_t \)가 그대로 흐르기 때문에, 순전파 과정에서 \( f_t \)의 원소 중 0에 가까운 원소는 잊기로 결정한 정보이므로 역전파 과정에서 해당 부분의 기울기도 거의 흐르지 않을 것이다. (0에 가까운 값이므로)
- 반면, \( f_t \)의 원소 중 1에 가까운 원소는 잊지 말아야 한다고 결정한, 즉 기억이 유지되는 정보이므로 잊기로 결정한 부분에 비해서 기울기가 과거 방향으로 비교적 많이 전파된다. (1에 가까운 값이기 때문에)
■ 이러한 이유는 위의 수식에서도 확인할 수 있다. 위의 수식처럼 셀 상태는 덧셈 구조로 업데이트된다. 이때 두 번째 항인 \( f_t \)를 제외한 나머지 항에는 모두 시그모이드 함수의 미분이나 tanh 함수의 미분 연산이 포함되어 있다.
- RNN의 은닉 상태 \( h_t \)를 계산하는 식에도 덧셈 속성이 있으나 RNN의 덧셈 속성은 단일 요소로 포함되어 있으며, 이마저도 tanh 함수 내부에 포함되어 있다. LSTM의 덧셈 속성은 이러한 RNN 경우와는 다르다.
■ tanh 함수의 미분 결과는 [0, 1] 사이의 값이며, 시그모이드 함수의 미분은 시그모이드 함수를 \( h(x) \)라고 했을 때, \( h(x) = h(x)(1 - h(x)) \)이므로 여기서도 기울기 소실일 발생할 수 있다. 하지만, 덧셈 구조로 연결되어 있기 때문에 나머지 항이 모두 0이 되어도 두 번째 항인 \( f_t \)에는 영향을 미치지 않는다. 즉, 기울기가 소실되지 않는다.
■ 이러한 덧셈 구조 덕분에 RNN처럼 곱셈 누적으로 기울기가 소실되지 않으므로 LSTM은 어떤 시점에서든 매개변수 업데이트를 수행할 수 있는 것이다. 그리고 중요한 정보(오래 기억해야 할 정보)는 1에 가깝게 학습시켜서 해당 정보가 계속 유지되도록 만들기 때문에 셀 상태 \( c_t \)가 LSTM에서 '장기 기억' 역할을 담당한다고 볼 수 있다.
■ RNN에서 기울기 소실(혹은 폭발)이 발생하는 주된 이유는 입력 데이터 사이의 시점(time step)이 멀어질수록 은닉 상태 \( h_t \)간의 체인 룰 연산에서 문제가 나타났기 때문이다.
■ RNN 체인 룰 연산에서 나타나는 문제는 가중치 매개변수를 업데이트하기 위한 역전파 과정에서 입력 데이터(토큰)만큼의 \( W_h \)를 곱하는 것과 tanh 함수의 미분 값인 [0, 1] 사이의 값들이 여러 번 곱해지는 것이었다. 이는 RNN의 구조적 문제로 인해 발생한 것으로 기울기 흐름이 끊기게 되어 장기 의존성을 학습하는 데 어려움을 겪었다.
■ 반면, LSTM은 기억 셀(cell state) \( c_t \)의 아다마르 곱(원소별 곱)과 덧셈 구조를 통해 곱해지는 값의 차이를 완화하였다. 특히, 망각 게이트의 출력값 \( f_t \)가 셀 상태를 조절하여 오래 기억해야 할 정보를 유지할 수 있었다.
■ 결론적으로, LSTM의 \( h_t \)는 기본적인 RNN처럼 \( h_t \)를 계산하기 위해 tanh 함수의 영향을 직접적으로 받아 장기 기억을 유지하기 어려울 수 있다.
- 또한, 매 시점마다 \( h_t \)를 구하는 이유는 해당 시점의 예측값인 \( \hat{y}_t \)를 계산하기 위해 구하는 것이다.
- 즉, 역전파 과정에서 추가 메모리 역할인 \( c_t \)와 달리 예측값을 계산하기 위해 사용된 \( h_t \)에는 상류에서 역으로 전파되는 그래디언트 값이 더 많이 있을 수밖에 없다.
■ 그러나 게이트와 기억 셀 cell state라는 구조적 특성을 통해 기울기 문제를 완화하여 장기 의존성을 처리하는 데 있어 기본적인 RNN보다 훨씬 뛰어난 성능을 발휘할 수 있다.
■ 즉, LSTM의 은닉 상태인 \( h_t \)는 단기 기억, 셀 상태인 \( c_t \)는 장기적으로 정보들을 유지하는 장기 기억을 담당한다고 할 수 있다.
2.3 LSTM 계산 과정
■ LSTM도 RNN처럼 순환되는 구조. 즉, 다음과 같은 재귀 형태로 볼 수 있다.
■ LSTM의 계산 과정을 정리하면, 순전파 과정에서는 각 게이트(망각, 입력, 출력 게이트)와 현재 시점의 입력을 통해 현재 시점의 셀 상태(cell state)가 계산되며, 현재 시점의 셀 상태를 기반으로 현재 시점의 은닉 상태(hidden state)가 계산된다.
■ 역전파 과정에서는 최종 손실에 대한 그래디언트가 \( h_t \)와 \( c_t \)를 출력했던 방향으로 들어오면서, 각 게이트로 전파된다. 이 과정에서 각 게이트의 전용 가중치 매개변수들이 업데이트되며, 이를 통해 다음 순전파 과정에서 각 게이트가 흘려보낼 정보의 양이 조절된다.
참고) https://www.youtube.com/watch?v=006BjyZicCo&list=PLpIPLT0Pf7IoTxTCi2MEQ94MZnHaxrP0j&index=12
3. GRU(Gated Recurrent Unit)
■ LSTM에서는 \( h_t \)를 계산하기 위한 과정에서 망각(또는 삭제), 입력, 출력 게이트라는 3개의 게이트가 존재했다. 반면, GRU는 업데이트 게이트와 리셋 게이트라는 두 가지 게이트만이 존재한다.
■ 또한 GRU는 LSTM과 달리 셀 상태를 사용하지 않고 RNN처럼 은닉 상태만 사용한다.
■ GRU는 LSTM의 output 부분을 제거한 간소화된 버전의 순환 신경망으로서 LSTM보다 학습 속도가 빠르다고 알려져 있으며, 여러 평가에서 LSTM과 비슷한 성능을 보인다고 알려져 있다.
- LSTM보다 구조가 더 간단하다. 즉, 파라미터의 개수가 줄었기 때문에 학습 속도가 더 빠르다.
■ 이러한 GRU의 구조와 은닉 상태 \( h_t \)를 구하기 위한 계산 과정은 다음과 같다.
3.1 GRU의 구조
\begin{align*}
\mathbf{z} &= \sigma(\mathbf{x}_t \mathbf{W}_x^{(z)} + \mathbf{h}_{t-1} \mathbf{W}_h^{(z)} + \mathbf{b}^{(z)}) \\
\mathbf{r} &= \sigma(\mathbf{x}_t \mathbf{W}_x^{(r)} + \mathbf{h}_{t-1} \mathbf{W}_h^{(r)} + \mathbf{b}^{(r)}) \\
\tilde{\mathbf{h}} &= \tanh(\mathbf{x}_t \mathbf{W}_x + (\mathbf{r} \odot \mathbf{h}_{t-1}) \mathbf{W}_h + \mathbf{b}) \\
\mathbf{h}_t &= (1 - \mathbf{z}) \odot \mathbf{h}_{t-1} + \mathbf{z} \odot \tilde{\mathbf{h}}
\end{align*}
- LSTM처럼 \( \mathbf{r}, \mathbf{z} \) 게이트와 새로운 은닉 상태 \( \tilde{\mathbf{h}} \)는 전용 매개변수가 있다.
- '1-'노드는 \( x \)를 입력하면 \( 1-x \)를 출력한다.
■ 임시 은닉 상태 \( \tilde{h} \)는 reset 게이트의 \( \mathbf{r} \)과 이전 시점의 은닉 상태 \( h_{t-1} \)의 원소별 곱(아다마르 곱)과 현재 시점의 입력 \( x_t \)로 계산된다.
■ reset gate의 출력값인 \( \mathbf{r} \)은 시그모이드 함수의 결과이므로, 0.0 ~ 1.0 사이의 실수이다. 그러므로 \( \mathbf{r} \)도 정보의 흐름을 제어하는 일종의 가중치라고 볼 수 있다.
■ 만약, \( \mathbf{r} = 0 \)이면, 임시 은닉 상태 \( \tilde{h} \)는 이전 시점의 정보 \( h_{t-1} \)이 완전히 무시된 상태에서 현재 시점의 입력 \( x_t \)만으로 결정된다.
■ 즉, reste gate는 이전 시점의 정보인 \( h_{t-1} \)의 영향력을 제어하는 게이트이다.
■ update gate는 LSTM의 forget gate와 input gate의 역할을 통합한 게이트로 과거와 현재 정보의 최신화 비율을 결정한다.
■ 최종 은닉 상태 \( h_t \)의 식을 보면 \( h_t = (1 - z) \odot h_{t-1} + z \odot \tilde{h_t} \)로 계산되는 것을 볼 수 있는데,
■ 여기서 udate gate의 결과인 \( \mathbf{z} \)도 시그모이드 함수의 결과로서 0.0 ~ 1.0 사이의 실수의 원소를 가지는 벡터라고 보자. 이러한 \( z \)가 과거 시점들의 정보가 압축된 \( h_{t-1} \)과 현재 시점의 정보가 담겨 있는 임시 은닉 상태 \( \tilde{h} \)에 모두 곱해진다.
■ 구체적으로, \( (1 - z) \)는 이전 은닉 상태 \( h_{t-1} \)에 곱해지며, 이는 LSTM의 forget gate와 유사한 역할을 한다. 반면, \( \tlide{h} \)에 곱해진 \( \mathbf{z} \)는 마치 LSTM의 input gate와 유사한 역할을 수행한다.
- \( \mathbf{z} \)와 \( \tilde{\mathbf{h}} \)의 아다마르 곱 \( \mathbf{z} \odot \tilde{\mathbf{h}} \)은 새로 추가된 (현재 시점의) 정보의 양을 결정하고
- \( 1 - \mathbf{z} \)는 과거 은닉 상태 \( h_{t-1} \)과 아다마르 곱 \( (1 - \mathbf{z}) \odot \tilde{\mathbf{h}} \)은 과거 은닉 상태에서 삭제할 정보를 결정한다.
- 여기서 \( \mathbf{z} \odot \tilde{\mathbf{h}} \)가 input 게이트의 역할을, \( (1 - \mathbf{z}) \odot \tilde{\mathbf{h}} \)가 forget 게이트의 역할을 수행하는 것이다.
- 최종적으로, 두 계산 결과의 덧셈 연산이 다음 계층으로 전달할 \( h_t \)가 된다.
■ 이렇게 계산된 은닉 상태 \( h_t \)는 \( t \) 시점의 예측값인 \( \hat{y}_t \)를 계산하기 위해 사용된다.
3.2 LSTM vs. GRU
■ GRU와 LSTM 성능 차는 주어진 문제와 하이퍼파라미터 설정에 따라 달라진다. 그래서 GRU와 LSTM 중 어떤 것이 모델 성능 면에서 더 뛰어나다고 단정지을 수 없으며, LSTM에서 최적의 하이퍼파라미터를 찾았다면, 굳이 GRU로 바꿔서 사용할 필요는 없다.
■ 데이터의 양이 적을 때는 학습할 매개변수의 양이 적은 GRU가 조금 더 낫고, 데이터의 양이 많으면 LSTM이 더 낫다고 한다.
■ 하지만 GRU의 확실한 이점은 LSTM보다 학습할 매개변수가 적고 그만큼 계산량도 적다는 점이다.
'자연어처리' 카테고리의 다른 글
시퀀스투시퀀스(Sequence‑to‑Sequence, seq2seq) (2) (0) | 2025.03.30 |
---|---|
LSTM, GRU (2) (0) | 2025.03.29 |
RNN (2) (0) | 2025.03.26 |
RNN (1) (1) | 2025.03.23 |
시퀀스투시퀀스(Sequence‑to‑Sequence, seq2seq) (1) (0) | 2025.03.19 |