본문 바로가기

boostcamp AI tech/boostcamp AI

Long-Short Term Memory, GRU

728x90

https://colah.github.io/posts/2015-08-Understanding-LSTMs/

 

Cell state는 기억해야할 필요가 있는 모든 정보를 담고 있는 벡터라면

hidden state는 현재 time step에서 예측값 layer의 입력으로 사용 될 벡터라고 할 수 있다. cell state의 많은 정보 중에서 지금 당장 필요한 정보만을 filtering한 벡터라고 볼 수 있다. 

{c_t, h_t} = LSTM(x_t, c_t-1, h_t-1)

hidden state 계산 과정을 살펴보자. Wxh, Whh를 붙여서 W라고 하고 [xh]와 계산하는 것과 같다.

x(h,1), h(h,1), Wxh(h,h), Whh(h,h) 이라고 하자.

xh의 concat은 (2h,1)이다. Wxh, Whh의 concat은 (h,2h)

input gate, forget gate, output gate, gate gate를 위해 4번 f(Wxh*x + Whh*h + b)를 수행해야 하므로 서로 다른 4개의 W'를 이어 붙여서 결국 W(4h,h)이다.

자 그럼 W *[xh]를 한 결과를 가지고 각 게이트 별로 다른 activation이 수행된다.

i : whether to write to cell
f : whether to erase cell
o : how much to reveal cell
g : how much to write to cell

sigmoid를 통과한 확률값은 기존 벡터가 갖던 값을 앞으로 얼마나 반영할지 혹은 그 확률로 반영할지 말지를 결정한다.

 

1. Forget gate

https://colah.github.io/posts/2015-08-Understanding-LSTMs/

이전 가정을 그대로 따라오면서 cell state (h,1) 의 h가 3이라고 가정하고 [3,5,-2]로 예를 들어보자. 

sigmoid를 거친 결과 f_t도 (h,1)이고 [0.3, 0.7, 0.1] 이라고 해보자.

그럼 두 벡터를 elementwise multiply해서 각 값에서 몇 퍼센트씩 잊어버릴 것인지 결정한다. [0.9, 3.5, -0.2]가 된다.

 

2. Input gate, Gate gate

https://colah.github.io/posts/2015-08-Understanding-LSTMs/

input gate를 거쳐서 나온 확률 벡터 i_t, 그리고 tanh를 거친, 의미를 지니고 있는 벡터 C_t 틸다 두개를 elementwise muliplication한다. 즉 새로 들어온 정보 중에 얼마만큼만 update에 반영할지를 결정한다.

https://colah.github.io/posts/2015-08-Understanding-LSTMs/

그럼 새롭게 구한 cell state C_t는 기존 정보를 잊은 결과(f_t * C_t-1) + 새로운 정보를 추가(i_t * C_t 틸다) 로 구해진다.

 

3. Output gate : generate Hidden State

https://colah.github.io/posts/2015-08-Understanding-LSTMs/

output gate를 통과하고 나온 벡터와 현재 시점에서 구한 tanh(cell state C_t)를 elementwise 곱한다. 이 역시 얼마나 output으로 쓸지를 곱하는 것이다.

Cell state는 기억해야할 필요가 있는 모든 정보를 담고 있는 벡터라면

hidden state는 현재 time step에서 예측값 layer의 입력으로 사용 될 벡터라고 할 수 있다. cell state의 많은 정보 중에서 지금 당장 필요한 정보만을 filtering한 벡터라고 볼 수 있다. 

예를들면 인용문을 생성하는 lstm이라고 하면 "가 열려 있음을 기억할 필요가 있지만(cell state) 아직 인용문이 끝나지 않아서 단어를 내뱉어야 한다면(hidden state) cell state에서 filtering해서 단어를 뱉어낸다고 볼 수 있다.

4. Gate Recurrent Unit, GRU

https://colah.github.io/posts/2015-08-Understanding-LSTMs/

lstm을 경량화 하였다. 메모리도 적게 쓰고 빠르다. 오직 hidden state만 있다.

GRU는 update gate(input gate)를 통과한 z_t, reset gate(forget gate)를 통과한 r_t 를 구한다. 

의미를 담고 있는 h_t 틸다는 previous hidden state에 reset할 확률을 곱한 r_t*h_t-1 과 x_t를 가지고 구한다. (이때 W는 [Wxh, Whh]) lstm에서 gate gate를 통과해서 C_t 틸다를 구한 것과 대조적이다.

lstm에서는 forget gate, input gate의 확률을 반영해서 새 cell state를 구하는 반면

GRU에서는 update 확률 z_t와 (1-z_t)를 각각 곱해서 새 hidden state를 구한다. 즉 새 정보를 60퍼센트 보존한다면 이전 정보는 40퍼센트 잊는 셈이다.

 

5. LSTM Backpropagation

RNN에서 BPTT시에 계속 Whh가 곱해졌던 반면, LSTM에서는 앞에 cell에서 전파되는 gradient가 x(약간 변형)와 +로 거의 복사되어 전달 되기 때문에 vanishing/exploding gradient을 얼추 해소한다.

728x90
반응형

'boostcamp AI tech > boostcamp AI' 카테고리의 다른 글

Beam search  (1) 2023.11.30
Seq2Seq with attention  (1) 2023.11.30
Word Embedding - Word2Vec, GloVe  (1) 2023.11.27
Naive-Bayse Classifier  (1) 2023.11.27
Short history of Generative model  (0) 2023.11.24