[NLP] LSTM

zekim·2021년 4월 30일
0

[NLP]

목록 보기
4/8
post-thumbnail

RNN은 time-step이 커지게 되면 gradient vanishing 문제가 발생한다. 이러한 단점을 보완하여 제시된 모델이 LSTM이다.

LSTM(Long short-term memory)

먼저, LSTM의 구조는 아래와 같다.

LSTM은 기존 RNN의 hidden state외에도 별도의 cell state와 foreget gate등이 존재해 잊어버리거나 출력하고자 하는 데이터의 양을 상황에 따라 제어하게 된다. 이에 따라 LSTM의 수식도 기존의 RNN보다 상당히 복잡해진것을 볼 수 있다.

다음은 LSTM의 time-step이 tt일 때 수식이다.

it=σ(Wiixi+bii+Whih(t1)+bhi)ft=σ(Wifxt+bif+Whfh(t1)+bhf)gt=tanh(Wigxt+big+Whgh(t1)+bhg)ot=σ(Wioxio+Whoh(t1)+bho)ct=ftc(ts)+itgtht=ottanh(ct)i_t=\sigma(W_{ii}x_i+b_{ii}+W_{hi}h_{(t-1)} +b_{hi})\\ f_t=\sigma(W_{if}x_t+b_{if}+W_{hf}h_{(t-1)}+b_{hf})\\ g_t=tanh(W_{ig}x_t+b_{ig}+W_{hg}h_{(t-1)}+b_{hg})\\ o_t=\sigma(W_{io}x_{io}+W_{ho}h_{(t-1)}+b_{ho})\\ c_t=f_tc_{(t-s)}+i_tg_t\\ h_t=o_{t}tanh(c_t)

식을 하나씩 분석해보면,

ctc_t는 cell state로써 LSTM 모듈에서 수평으로 그어진 선에 해당한다. 이는 컨베이어 벨트처럼 정보가 바뀌지 않고 흐르도록 해준다.


여기서 ftf_t는 forget gate로 이름처럼 '과거 정보를 잊을지 말지'를 결정하는 게이트이다. hth_txtx_t를 받아 sigmoid 값을 적용하면 forget gate의 output이 된다. sigmoid는 0에서 1사이 값을 출력하기 때문에, 0을 출력한다면 이전의 정보는 잊고 1을 출력한다면 이전의 정보를 기억하게 되는 것이다.
이후 앞으로 들어오는 정보들 중 어떤 것을 cell state에 저장하게 될 것인지를 정하게 된다. 먼저, input gate인 iti_t에 sigmoid가 적용된 것을 볼 수 있고, 이는 어떤 값을 업데이트 할 것인지를 정하게 된다. 이에 h(t1)h_(t-1), xtx_t를 input으로 받아 tanh를 적용해 C~t\tilde{C}_{t} vector를 생성하게 되고

이 둘을 합쳐서 새로운 cell state 값인 CtC_t가 구해진다.

마지막으로 어떤 값이 output으로 나갈지를 보면,

h(t1)h_(t-1), xtx_t를 input으로 받아 sigmoid함수를 거친 oto_t를 계산하여 어느 부분을 output으로 내보낼지 결정한다. 그리고 나서 tanh에 계산된 CtC_t를 input으로 받아 oto_t를 곱해주면 우리가 원하는 부분만 output으로 내보낼 수 있게 된다.

LSTM은 RNN과 마찬가지로 여러층으로 쌓거나, 양방향으로 구현할 수 있다.

0개의 댓글