LSTM(Long Short Term Memory)

June·2022년 1월 16일
0
post-thumbnail

LSTM이란?

바닐라 RNN 이후 바닐라 RNN의 한계(지점 사이 거리가 멀 경우 Backprop시 그래디언트가 점차 줄어 학습능력이 크게 저하되는 것)를 극복하기 위한 다양한 RNN의 변형이 나오게 되었다.
그 중에서도 LSTM은 바닐라 RNN의 Long-Term Dependency 문제를 해결하기 위해 제안되었으며 RNN의 hidden state에 cell-state를 추가한 구조이다.

모듈요소

  • 노란색 박스는 학습된 neural network layer를 나타낸다.
  • 분홍색 동그라미는 vector 합과 같은 pointwise operation을 나타낸다.
  • 각 선은 한 노드의 output을 다른 노드의 input으로, vector 전체를 보내는 흐름을 나타낸다.
  • 합쳐지는 선은 concatenation을 의미하고,
  • 갈라지는 선은 정보를 복사해서 다른 쪽으로 보내는 fork를 의미한다.

LSTM 구조

Cell state

  • LSTM의 핵심은 Cell State인데, 모듈 그림에서 수평으로 그어진 윗 선에 해당한다.
  • 메모리와 같은 존재이며, 컨베이어 벨트와 같아서 State가 꽤 오래 경과하더라도 Gradient가 잘 전파된다.
  • 또한, Cell State는 Gate라고 불리는 구조에 의해 정보가 추가되거나 제거된다.
  • Gate는 training을 통해 어떤 정보를 유지하고 어떤 정보를 버릴지 학습한다

Gates

  • LSTM은 3개의 Gate를 가지고 있고, 이 gate들은 cell state를 보호하고 제어한다.

    forget gate (f) : 과거 정보를 잊기 위한 게이트
    input gate (i) : 현재 정보를 기억하기 위한 게이트
    output gate (o) : 최종 결과를 내보내기 위한 게이트

  • 이 3개의 Gate에는 공통적으로 시그모이드 함수가 존재하는데 시그모이드 함수를 지나면 0과 1사이의 값이 나오게 되는데 이 값들을 가지고 게이트를 조절한다.

Forget Gate

  • '과거 정보를 잊기’를 위한 단계이다.
  • 이 단계에서는, ht1h_{t−1}xtx_t를 받아서, sigmoid layer를 통해 0과 1 사이의 값을 Ct1C_{t−1}에 보내준다.
  • 그 값이 1이면 "이전 상태의 모든 정보를 보존해라"가 되고, 0이면 "이전 상태의 모든 정보를 버려라"가 된다.

Input Gate

  • 현재 정보를 얼마나 기억할 것인지에 대한 단계이다.
  • 이 단계에서는, ht1h_{t−1}xtx_t를 받아서, sigmoid layer를 통해 iti_t를 구한 뒤
  • tanh layer를 통해 새로운 후보 값들인 ~CtC_t라는 vector를 만들고, iti_t와 ~CtC_t의 정보를 합쳐, cell state를 업데이트할 재료를 만들게 된다.

State Update

  • 이전 cell state인 Ct1C_{t−1}를 업데이트해서 새로운 cell state인 CtC_t를 만드는 단계이다.
  • 이전 cell state를 얼마나 잊을건지(forget gate) 곱셈
  • 현재 cell state를 얼마나 반영할건지(inpute gate) 덧셈
  • 최종 결과를 다음 상태의 cell state로 내보낸다.

Output Gate

  • 다음 State로 내보낼 output(hidden state)을 구하는 단계.
  • cell state에 tanh를 취한 뒤
  • ht1h_{t−1}xtx_t를 받아 sigmoid layer를 통해 oto_t를 계산한 후
  • oto_t와 tanh 결과를 곱해 output(hidden state)을 내보낸다.

참고자료

  1. https://wooono.tistory.com/242
  2. https://wikidocs.net/22888
  3. https://ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/
profile
회사와 “함께” 성장하는 개발자

0개의 댓글