새소식

부스트캠프 AI Tech 4기

[NLP] 4. LSTM / GRU

  • -

Long Short-Term Memory (LSTM)

RNN의 Vanishing/Exploding gradient 문제를 해결하고 timestep이 먼 경우에도 필요로하는 정보를 보다 효과적으로 처리하고 학습할 수 있도록 RNN을 개선한 모델이다.

 

RNN의 매 timestep마다 변화하는 hidden state vector를 단기기억을 담당하는 기억소자로서 볼 수 있다.

LSTM은 이 단기기억을 보다 길게 기억할 수 있는 구조이다.

 

 

LSTM은 전 timestep에서 서로 다른 역할을 하는 $C_{t}$벡터와 $H_{t}$벡터가 입력으로 들어온다.

 

$$\{C_{t}, h_{t}\} = LSTM(x_{t}, C_{t-1}, h_{t-1})$$

$C_{t-1}$과 $h_{t-1}$을 입력으로 받고 추가 $x_{t}$를 입력으로 받아 현재 timestep의 $C_{t}$와 $h_{t}$ 벡터를 출력한다.

 

cell state vector가 좀 더 완성된 여러가지 필요로 하는 정보를 담고 있는 vector이다.

hidden state vectorcell state vector를 한번 더 가공해서 그 timestep 에서 노출할 필요가 있는 정보만을 남긴 filtering 된 정보를 담는 vector이다.

→ hidden state vector는 현재 해당하는 timestep에서 예측값을 계산하는 output layer에 입력 벡터로 사용하게된다.

 

 

 

$x_{t}$와 $h_{t-1}$을 먼저 입력으로 받아 vector들을 선형 변환한 후에

 

output으로 나타나는 vector를 4개의 vector로 분할하고 이 각각의 vector에 원소별로 sigmoid나 tanh를 거치는 방식으로 output 값들을 생성한다.

 

각각의 output 벡터들은 아래와 같이 부르고, 이 벡터들은 LSTM에서 Cell state및 Hidden State을 계산하기 까지 필요로하는 중간 결과물의 역할을 한다.

  • i : Input gate 
  • f : Forget gate
  • o : Output gate
  • g : Gate gate 

 

위 그림에서는 $x_{t}$와 $h_{t-1}$의 각각의 dimension을 모두 h라고 가정하면 이 2개를 concat 한 vector는 2h 만큼의 dimension을 갖는다.

그러면 선형변환(W)의 columns은 2h가 되고 h dimension 만큼의 vector를 4세트 만들어줘야 하기 때문에 이 선형결합(W)의 4h에 해당하는 row의 개수를 갖게 된다.

 

이 4개의 vector 중 sigmoid 를 통해 나오는 처음 3개의 vector들은 sigmoid 의 특성 상 각 vector 의 원소들이 모두 0~1 사이의 값을 가지게 된다.

→ 즉, vector가 가지던 값에 각각 0~1 사이의 값과 곱해줌으로써 원래 값이 가지던 정보의 일부 % 만을 가지게 하는 역할을 한다.

 

tanh를 거쳐서 나온 값은 tanh의 특성상 -1 ~ 1 사이의 값을 가지게 되고

이는 original RNN에서 선형결합 후 tanh를 통해 최종 hidden state vector를 -1 ~ 1 사이의 값으로서 유의미한 정보를 담는 역할을 하는 것과 마찬가지로 LSTM의 tanh도 현재 timestep에서 계산되는 유의미한 정보를 담는 역할이라고 볼 수 있다.

 

 

위의 gate들은 이전 timestep에서 넘어온 $C_{t-1}$ vector를 적절하게 변환하는데 사용된다.

 

▮ Forget gate

이 3차원 vector인 [3 5 -2]라고 한다면 해당 벡터는 forget gate와 곱해지게 된다.

forgate gate는 $h_{t-1}$과 $x_{t}$ 입력을 받아 선형결합을 해서 만들어지는 output vector가 sigmoid 를 통과해 나오는 vector값으로 [0.7 0.4 0.8]라고 가정한다.

 

두 값을 element-wise로 곱해주게 되면 이전 timestep 에서 넘어온 cell state vector의 3이라는 값에서 70%인 2.1을 가지고, 5라는 값에서 40%의 값인 2.0, -2에서 80%의 값인 -1.6을 가지는 vector를 만들어 주게 된다. [2.1 2.0 -1.6]

즉, 이전 timestep 에서 넘어온 정보 중 70% 만 보존한다라는 말은 30%는 잊어버리겠다는 말과 같기 때문에 $f$ 벡터를 forget gate라고 부른다.

 

 

 

▮ Input Gate / Gate gate

$\tilde{C}_{t} $는 Gate gate로, 전 timestep의 hidden state과 현재 timestep의 입력 vector의 선형결합($W_{C}$)값이 tanh 를 거친, -1 ~ 1 사이의 값을 가지는 vector이다.

 

$i_{t}$는 input gate로, 전 timestep의 hidden state과 현재 timestep의 입력 vector가 선형결합($W_{i}$)를 한 뒤 sigmoid를 거친 0~ 1 사이의 값을 가지는 vector이다.

 

 

$\tilde{C}_{t} $에 $i_{t}$가 곱해짐으로써 $\tilde{C}_{t} $를 변환해주게된다.

이 값을 이전 timestep에서 넘어온 cell state vector에서 필요없는 정보는 버려주고 그 일부만을 남겨둔 $f_{t}*C_{t-1}$ 값에 더해주어 최종적인 현재 timestep에서의 cell state vector $C_{t}$를 만든다. 

 

현재 timestep 에서 만들어진 정보인 Gate gate를 바로 더해주지 않고 input gate와 곱한 후 더해주는 것은

한번의 선형변환만으로 $C_{t-1}$에 더해줄 정보를 만들기가 어렵기 때문에

일단은 더해주고자 하는 값보다 좀 더 큰 값들로 구성된 정보를 Gate gate($\tilde{C}_{t} $)의 형태로 만들어 준 후 그 값에서 또 각 dimension 별로 특정 비율만큼의 어떤 정보를 덜어내는 이러한 두 단계에 걸쳐 정보를 만든다고 이해할 수 있다.

 

 

 

▮ Output Gate / Hidden State

 

$o_{t}$도 forget gate나 input gate처럼 $h_{t-1}$과 $x_{t}$ 입력을 받아 선형결합($W_{o}$)을 해서 만들어지는 output vector가 sigmoid 를 통과해 나오는 0~1사이의 vector값이다.

 

$h_{t}$는 Cell state vector $C_{t}$에 tanh를 적용한 -1 ~ 1사이의 값에 $o_{t}$를 곱해줘서 Cell State가 가지는 정보에 특정 dimension 별로 각각 적절한 비율만큼 해당 값들을 작게 만든 값이다.

 

즉, $C_{t}$는 기억해야 할 필요가 있는 모든 정보를 담고있는 vector 라고 볼 수 있지만 

$h_{t}$는 현재 timestep에서 예측값을 내는 output layer에 입력으로 사용되는 vector로서

$C_{t}$가 가지는 많은 정보에서 해당 timestep의 예측값에 직접적으로 필요한 정보만을 담은 정보만을 filtering 한 벡터라고 볼 수 있다.

 

 

Gated Recurrent Unit (GRU)

LSTM 과 비교할 때 GRU 는 LSTM 의 모델구조를 보다 경량화해서 적은 memory 요구량과 빠른 계산시간이 가능하도록 만든 모델이다.

 

LSTM 에서 2가지 종류의 vector로 존재하는 cell state vector 와 hidden state vector를 일원화해서 여기서는 오직 hidden state vector만 존재하는 것이 특징이다.

GRU의 일원화된 $h_{t}$는 LSTM의 $C_{t}$와 비슷한 역할을 한다.

 

GRU에서는 input gate($z_{t}$)만을 사용하고 LSTM의 forget gate 자리에는 ($1-z_{t}$)을 사용한다.

input gate $z_{t}$가 [0.6 0.3 0.8] 로 구해진 경우에 ($1-z_{t}$)는 [0.4 0.7 0.2] 가 된다.

즉, input gate 가 커지면 커질수록 forget gate에 해당하는 값은 점점 작은 값이 되어서

결국 hidden state vector $h_{t}$는 이전 timestep의 hidden state vector $h_{t-1}$과 현재 만들어진 정보인 $\tilde{h}_{t}$, 이 두 개의 정보 간에 각각 독립적인 gating 을 한 후 더한 것이 아니라 두 정보간의 가중 평균을 내는 형태로 계산된다.

다시말해, $\tilde{h}_{t}$에서 60%의 정보를 보존한다면 $h_{t-1}$에서는 40% 만큼만의 정보만을 보존해서 2개를 더하는 것이라고 볼 수 있다.

 

경량화 되었지만 LSTM 에 비해서 뒤지지 않는 좋은 성능을 보여준다.

 

 

Backpropagation in LSTM/GRU

 

정보를 담는 주된 vector인 cell state vector가 업데이트 되는 과정이

RNN에서 동일한 $W_{hh}$라는 행렬을 계속적으로 곱해주는 형태의 연산이 아니라

그 전 timestep의 cell state vector 에서 그때그때 서로 다른 값으로 이루어지는 forget gate를 곱하고 그 다음에 필요로 하는 정보를 곱셈이 아닌 덧셈을 통해서 원하는 정보를 만들어 준다는 이 사실로 인해 gradient vanishing/explosion 문제가 사라졌다고 볼 수 있다.

 

덧셈 연산은 backprogation 을 수행할 때 gradient 를 복사해주는 연산이 되므로

항상 동일한 $W_{hh}$가 곱해지는 RNN 에 비해 멀리 있는 timestep 까지 gradient 를 큰 변형없이 전달해줄 수 있고

이를 통해 long term dependencies 문제들을 해결할 수 있다.

 

 

Summary

  • RNN은 다양한 길이를 가질 수 있는 sequence 데이터에 특화된 유연한 형태의 딥러닝 모델구조
  • Original RNN 혹은 Vanilla RNN 은 구조가 간단하지만 학습시에 gradient vanishing / explosion 문제가 있어서 실제로 많이 사용되지 않음
  • RNN 모델을 개선한 LSTM 이나 GRU는 cell state vector / hidden state vector를 각 timestep에서 업데이트 하는 과정이 기본적으로 덧셈에 기반한 연산이기 때문에 이러한 gradient vanishing / explosion 문제를 피하고 long term dependencies 문제를 해결할 수 있음

 

 


부스트캠프 AI Tech 교육 자료를 참고하였습니다.

 

 

728x90
Contents