(04강) LSTM and GRU

210907

4. Long Short-Term Memory (LSTM) | Gated Recurrent Unit (GRU)

Long Short-Term Memory (LSTM)

Vanila Model의 Gradient Exploding/Vanishing 문제를 해결하고 Long Term Dependency 문제를 개선한 문제이다.

기존의 RNN 식은 다음과 같다.

ht=fw(xt, ht1) h_t = f_w(x_t,\ h_{t-1})

LSTM에는 Cell state라는 값이 추가되며 식은 다음과 같다.

{Ct, ht}=LSTM(xt, Ct1, ht1) \{C_t,\ h_t\} = LSTM(x_t,\ C_{t-1},\ h_{t-1})

Cell state가 hidden state보다 좀 더 완성된, 필요로 하는 정보를 가지고 있는 벡터이며 이 cell state 벡터를 한번 더 가공해서 해당 time step에서 노출할 필요가 있는 정보를 필터링 할 수 있는 벡터로도 생각할 수 있다.

cell state를 한번 더 가공한 hidden state 벡터는 현재 timestep 에서 예측값을 계산하는 output layer의 입력벡터로 사용한다.

  • 여기서 x는 x_t 이고 h는 h_(t-1) 이다.

Forget gate

이전 타임스텝에서 얻은 정보 중 일부만을 반영하겠다.

= 이전 타임스텝에서 얻은 정보 일부를 까먹겠다 = forget

Input gate

이번 셀에서 얻은 C tilda 값을 input gate와 곱해주는 이유는 다음과 같다.

  • 한번의 선형변환만으로 Ct1 C_{t-1} 에 더해주는 정보를 만들기가 어렵다. 따라서 이 더해주는 정보를 일단 크게 만든 후에 각 차원별로 특정 비율만큼 덜어내서 더해주는 정보를 만들겠다 라는 목적이다.

  • 이 때, 더해주는 정보보다 크게 만든 정보가 C tilda 이며 특정 비율만큼 덜어내는 작업이 input gate와 곱해주는 작업이다.

Output gate

  • "He said, 'I love you.' " 라는 문장이 있다고 하자. 현재 sequence가 love y 까지 들어왔고 y다음에 o를 출력으로 줘야 할 차례이다. 이 때 y의 입장에서는 당장의 작은 따옴표가 열린 사실은 중요하지 않지만, 계속 전달해줘야하는 정보이다. 그래서 Ct의 activate function을 거친값을 o_t에 곱해주는 것으로 해석할 수 있다.

Gated Recurrent Unit (GRU)

LSTM의 모델 구조를 경량화해서 적은 메모리 요구량과 빠른 계산이 가능하도록 만든 모델이다. 가장 큰 특징은 LSTM은 Cell과 Hidden이 있는 반면에 GRU에서는 Hidden만 존재한다는 것이다. 그러나 GRU의 동작원리는 LSTM과 굉장히 동일하다.

  • LSTM의 Cell의 역할을 GRU에서는 Hidden이 해주고 있다고 보면된다.

  • GRU 에서는 Input Gate만을 사용하며 Forget Gate 자리에는 1 - Input Gate 값을 사용한다.

실습

필요 패키지 import

데이터 전처리

LSTM 사용

LSTM은 Cell state가 추가된다. shape는 hidden state와 동일하다.

  • hidden state와 cell state는 0으로 초기화한다.

  • hidden state와 cell state의 크기가 같은것을 볼 수 있다.

  • packed_outputs 의 사이즈가 123인 이유를 아는가? 사실은 200이어야 한다. 여기서 0의 개수를 빼면 123이된다!

GPU 사용

GPU는 Cell state가 없다. 그 외에는 동일하다.

Teacher forcing 없이 이전에 얻은 결과를 다음 input으로 이용한다.

  • Teacher forcing이란, Seq2seq(Encoder-Decoder)를 기반으로 한 모델들에서 많이 사용되는 기법이다. 아래 설명과 이미지는 여기arrow-up-right를 참고했다.

  • t-1번째의 디코더 셀이 예측한 값을 t번째 디코더의 입력으로 넣어준다. t-1번째에서 정확한 예측이 이루어진다면 엄청난 장점을 가지는 구조지만, 잘못된 예측 앞에서는 엄청난 단점이 되어버린다.

  • 다음은 단점이 되어버린 RNN의 잘못된 예측이 선행된 경우

  • 이러한 단점은 학습 초기에 학습 속도 저하의 요인이 되며 이를 해결하기 위해 나온 기법이 티쳐포싱이다.

  • 위와 같이 입력을 Ground Truth로 넣어주게 되면, 학습시 더 정확한 예측이 가능하게 되어 초기 학습 속도를 빠르게 올릴 수 있다.

  • 그러나 단점으로는 노출 편향 문제가 있다. 추론 과정에서는 Ground Truth를 제공할 수 없기 때문에 학습과 추론 단계에서의 차이가 존재하게 되고 이는 모델의 성능과 안정성을 떨어뜨릴 수 있다.

  • 다만 노출 편향 문제가 생각만큼 큰 영향을 미치지 않는다는 연구결과가 있다.

(T. He, J. Zhang, Z. Zhou, and J. Glass. Quantifying Exposure Bias for Neural Language Generation (2019), arXiv.)

양방향 및 여러 layer 사용

  • 여기서는 2개의 레이어 및 양방향을 사용한다. 그래서 hidden state의 크기도 (4, Batchsize, hidden dimension) 이 된다.

  • 실제로 히든 스테이트의 크기가 4로 시작하는 것을 알 수 있다. 또한, packed_outputs 역시 256개가 아니라 1024개의 차원으로 이루어진 것을 알 수 있다.

Last updated