RNN, LSTM, GRU

beechwood·2023년 10월 6일
0

NLP 기초

목록 보기
2/4

1. RNN

  • 어떤 sequence data가 입력 또는 출력으로 들어오는 상황에서 각 타임스텝에서 들어오는 입력 XtX_t와 이전 타임스텝의 RNN 모듈에서 계산한 hidden state vector ht1h_{t-1}을 받아서 현재 타임스텝의 hidden state vector를 출력하는 형태를 가지고 있다. 매 타임스텝마다 동일한 파라미터를 가진 모듈을 사용하므로, '재귀적인 호출'의 특성을 보여주어 'Recurrent Neural Network'라는 이름을 가지게 되었다.
  • 왼쪽 그림 : rolled version diagram
  • 오른쪽 그림 : unrolled version diagram

1) RNN 계산 과정

  • tt : 현재 타임스텝(time step)
  • WW : RNN 모듈에서 필요한 linear transformation을 정의하는 파라미터. weight.
  • ht1h_t-1 : old hidden state vector
  • xtx_t : input vector at some time step
  • hth_t : new hidden state vector
  • fWf_W : RNN function with parameters W
  • yty_t : output vector at time step t (hth_t를 바탕으로 예측)
  • yty_t는 매 타임스텝마다 예측해야 할 수도 있고(ex. 각 단어의 품사 예측) 마지막 타임스텝에만 예측(문장의 긍정/부정 여부)해야 할 수도 있다.
  • hidden state vector의 차원 수는 사용자가 설정하는 하이퍼파라미터이다.

ex) 아래와 같이 xtx_t는 3차원, hth_t는 2차원이고, FC layer로 구성된 RNN(fWf_W)을 생각해보자.

이 RNN 모듈의 행렬 연산을 살펴보면 다음과 같다.

  • hth_t의 첫 번째 원소 : W의 1행의 앞의 세 원소는 xtx_t와 곱해지고 뒤의 두 원소는 ht1h_{t-1}과 곱해진다. W는 2x5 행렬이다.

  • W의 앞쪽을 WxhW_{xh}라 하고 뒤쪽을 WhhW_{hh}라고 하면 위와 같이 곱해지는 것으로 생각할 수 있다.
    • WxhW_{xh} : xtx_thth_t로 바꿔주는 역할.
    • WhhW_{hh} : ht1h_{t-1}hth_t로 바꿔주는 역할.

  • 현재 타임스텝 t에서 예측값이 필요한 경우에는 추가적인 output layer를 만들고 그 output layer에서는 linear transformation matrix인 WhyW_{hy}hth_t를 곱함으로써 output인 yty_t를 구할 수 있다.
  • binary classification : yty_t의 차원은 1차원인 scalar 값. 여기에 추가로 sigmoid를 적용해서 확률 값을 예측한다.
  • multiclass 인 경우 : yty_t는 class 개수만큼의 dimension을 가지는 벡터이다. 추가로 softmax를 통과해서 확률분포를 얻을 수 있게 된다.

2) Types of RNN

(1) One-to-one

  • 입력과 출력의 타임스텝이 단 하나. 즉 sequence data가 아닌 일반적인 경우의 구조.
  • ex) [키, 몸무게, 나이]의 3-d 벡터 -> 2-d hidden state vector -> 혈압이 저/정상/고혈압 중 어떤 상태인지를 나타내는 3-d 벡터

(2) One-to-many

  • 입력은 하나의 타임스텝, 출력은 여러 타임스텝
  • 대표적 예시 : Image Captioning
    • 입력으로는 이미지 하나. (단일 입력. 타임스텝이 하나)
    • 각 타임스텝별로 순차적으로 단어를 생성.
  • RNN 구조에서는 매 타임스텝마다 입력이 주어진다. One-to-many와 같이 추가적으로 넣어줄 입력이 따로 없는 경우에는 동일한 RNN 모듈의 입력으로는 사이즈는 같고 값은 모두 0인 벡터/행렬/텐서를 준다.

(3) Many-to-one

  • 시퀀스를 입력으로 받은 후에, 최종 값을 마지막 타임스텝에서 비로소 출력으로 내놓는 형태이다.
  • ex) sentiment classification

(4) Many-to-many
ex1) machine translation

  • 위 예시의 경우 타임스텝이 총 5개이다. 세 번째 타임스텝까지는 주어진 입력 문장을 끝까지 읽고, 다 읽은 다음부터 비로소 번역 단어를 생성한다.

ex2) 입력이 주어질 때마다 예측을 수행하는, delay가 전혀 없는 형태

  • PoS tagging, video classification on frame level 등

2. Character-level Language Model

  • language model : 주어진 문자열이나 단어의 순서를 바탕으로 다음 단어를 예측하는 태스크. word 레벨, 캐릭터 레벨 모두 수행 가능.
  • hello가 주어지면 가장 먼저 할 일 : character-level의 사전 구축.
  • 각각의 character는 사전 크기만큼의 one-hot vector로 나타나게 된다.

  • output vector를 계산하기 위해 WhyW_{hy}와 곱하고 bias를 더해주어 logit을 구한다.
  • 예측을 해야하므로 output vector의 차원은 사전의 차원과 같다.
  • logit 값으로서의 벡터를 softmax에 통과시켜주어 얻은 확률값이 제일 큰 character를 답으로 예측한다.
  • softmax 벡터와 ground truth 벡터가 최대한 가깝게끔 학습을 진행한다.

  • 학습이 끝난 뒤 test-time에서는 예측값을 다음 타임스텝의 입력값으로 넣어줌으로써 무한한 길이의 character sequence를 생성할 수 있다.

RNN에서 필요로 하는 정보를 저장하는 공간은 매 타임스텝마다 업데이트를 수행하는 hth_t이다. hth_t가 타임스텝에 따라 진행되면서 어떻게 변화하는지 분석함으로써 RNN의 특성을 분석할 수 있다.

3. Backpropagation Through Time and Vanishing/Exploding Gradient Problem in RNN

  • gradient를 두 타임스텝 이전까지 혹은 그보다 더 이전까지 전달해주는 경우에는 gradient 값이 타임스텝을 거슬러 갈수록 기하급수적으로 커지거나 소실(영향력 감소)된다.
  • 이 계산과정을 통해 Gradient Vanishing/Exploding 문제가 발생하고 이것이 Long-Term-Dependency 문제를 일으키게 된다.

4. Long Short-Term Memory (LSTM)

  • RNN의 Long-Term-Dependency 문제를 해결하기 위해 등장한 모델.
  • RNN의 hth_t는 단기 기억을 저장하는 소자라고 볼 수 있는데 LSTM은 시퀀스가 타임스텝에 의해 진행됨에 따라서 이 단기 기억을 보다 길게 기억할 수 있도록 개선했다는 의미를 이름에 담고 있다.

  • ctc_t : cell state vector
  • hth_t : ctc_t를 한번 더 가공하여 그 타임스텝에서 노출할 필요가 있는 정보만 남긴 필터링된 정보. 현재 타임스텝에서의 예측값을 계산해주는 다음 output layer의 입력으로 사용한다.
  • ctc_thth_t 중 더 핵심 정보는? : ctc_t가 좀더 완성된, 그래서 우리가 필요로 하는 정보를 여러 가지 담고 있는 보다 완전한 정보이다.

  • LSTM은 xtx_t, ct1c_{t-1}, ht1h_{t-1}을 입력으로 받아 ctc_thth_t를 출력한다.

  • input gate(i), forget gate(f), output gate(o), gate gate(g) : ctc_t, hth_t를 계산하기까지 필요한 중간 결과물.
  • x와 h 모두 차원이 h라고 한다면 w는 4h x 2h 행렬이다.
  • sigmoid 의 특성상 i, f, o는 0 ~ 1 사이의 값을 갖는다. g는 tanh를 통과시켰으므로 –1 ~ 1 사이의 값을 갖게 된다. g를 현재 타임스텝에서 LSTM에서 계산되는 유의미한 정보라고 생각할 수 있다.

1) LSTM 계산 과정

  • sigmoid를 통과시켜 구한 ftf_tct1c_{t-1}을 element-wise로 곱해 벡터를 얻는다. 예를 들어 ftf_t = [0.7 0.4 0.8] 이라 한다면 ct1c_{t-1}의 첫 번째 요소에 대해서는 70%만 기억하겠다는 의미가 된다. 즉 ftf_tct1c_{t-1}의 각 dimension에 대해 얼만큼씩 기억할지를 결정한다.

  • 위 그림에서의 ct~\tilde{c_t}gtg_t를 의미한다.
  • 현재 타입스텝의 cell state CtC_t : Ct1C_{t-1}에서 일부 정보를 지운 ftf_t Ct1C_{t-1}iti_t Ct~\tilde{C_t}를 더하여 구한다.
  • Ct~\tilde{C_t}를 바로 더해주지 않고 iti_t를 곱하는가? : 한번의 선형변환으로 Ct1C_{t-1}에 더해줄 정보를 만들기 어려운 경우에는 정해주고자 하는 값보다 좀 더 큰 값들로 구성된 정보를 gate gate 의 형태로 만들어준 후, 각 dimension별로 또 특정 비율을 덜어내서 두 단계에 걸쳐 Ct1C_{t-1}에 더해줄 정보를 만드는 것이다.

  • 이제 hth_t를 위와 같이 output gate와 tanh(CtC_t)를 곱하여 구한다.
  • hth_t는 다음 RNN에 input으로 전해짐과 동시에 위로 올라가는 path를 가지고 있는데 이 경로가 바로 예측을 위해 output layer의 입력으로 주어지는 의미한다.

2) LSTM에서의 backpropagation

  • 계속 동일한 WhhW_{hh}를 곱해주는 것이 아니라 매 타임스텝에서 CtC_t를 구할 때 그때그때 다른 forget gate를 곱하고, 필요로 하는 정보를 곱셈이 아닌 덧셈으로 만들어준다는 점에서 gradient vanishing을 해결한다. 덧셈은 backpropagation을 수행할 때 gradient를 복사해주는 연산이어서 멀리 있는 타임스텝까지 gradient를 큰 변형 없이 전달해줄 수 있다. 그래서 긴 타임스텝 간에 존재하는 long-term-dependency 문제를 해결할 수 있다.

5. Gated Recurrent Unit (GRU)

  • LSTM의 모듈 구조를 정량화해서 보다 적은 메모리 사용량과 빠른 계산이 가능하게끔 만든 모델.
  • 특징 1) LSTM에 존재하던 cell state vector와 hidden state vector를 일원화하여 hidden state vecotr만이 존재한다.
    GRU에서 hth_t는 LSTM의 cell state vector CtC_t와 조금 더 비슷한 역할을 한다고 볼 수 있다.
  • 특징 2) GRU에서는 input gate 만 사용한다. 위 식의 ztz_t가 input gate에 해당한다. forget gate 자리에는 (1-ztz_t)를 사용한다. 즉 두 개의 게이트를 사용하는 LSTM과 달리 한 개의 게이트만 사용한다. 그래서 hth_tht1h_{t-1}과 현재 만들어진 정보인 ht~\tilde{h_t}의 가중평균인 것으로 생각할 수 있다.

0개의 댓글

관련 채용 정보