본문 바로가기

논문

[논문 공부] LSTM(Long Short-Term Memory)(feat. RNN)

LSTM - Long Short-Term Memory

원문http://www.bioinf.jku.at/publications/older/2604.pdf


개요 

이번 포스팅에서는 Long Short-Term Memory(LSTM) 논문을 공부합니다.

원문보다는 Chrisopher Olah님이 쓰신 글을 토대로 공부했습니다.

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

 

Understanding LSTM Networks -- colah's blog

Posted on August 27, 2015 <!-- by colah --> Humans don’t start their thinking from scratch every second. As you read this essay, you understand each word based on your understanding of previous words. You don’t throw everything away and start thinking

colah.github.io


Reference

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

https://dgkim5360.tistory.com/entry/understanding-long-short-term-memory-lstm-kr

https://wikidocs.net/22888

https://blog.naver.com/winddori2002/221992543837


LSTM - Long Short-Term Memory


LSTM 탄생 배경

RNN의 가장 단순한 형태를 바닐라  RNN(Vanilla RNN)이라고 하는데, 바닐라 RNN의 한계를 극복하기 위해 RNN에서 변형된 LSTM이 등장하게 됨


RNN의 한계?

RNN의 시점(time step)이 길어질수록 앞의 정보가 뒤로 충분히 전달되지 못하였음. 이것을 장기 의존성 문제라고 함


RNN 구조를 알면 한계가 보인다.

  1. RNN은 스스로 반복하면서 이전 단계에서 얻은 정보가 지속되도록 한다.  (이는 아래 그림의 왼쪽 구조와 같다) 
  2. 1번 구조를 풀어서 그리면 오른쪽 그림과 같이 표시할 수 있다.

  • x_1, x_2는 입력층의 입력 벡터
  • h_0, h_1.. h_t는 출력층의 출력 벡터
  • A는 이전의 값을 기억하려고 하는 메모리 같은 역할을 수행하므로 메모리 셀 또는 RNN 셀이라고 표현

A → A?  t-1번째 A가 t번쨰 A한테 무언가를 전달하는데 그게 뭔가?

  • x_0를 입력받은 첫 번째 A가 출력층 방향 또는 다음번째 A에게 보내는 값을 은닉 상태(hidden state)라고 합니다.
  • 즉, t번째 메모리 셀 A의 입력값으로 t-1번째 메모리셀 A가 전송한 은닉 상태 값을 사용함

은닉 상태 값? 그건 어떻게 계산되는 건가?

계산에 필요한 값은 아래와 같음

변하는 값
  • X(입력값),
  • Y(출력 값),
  • h_t(은닉 상태 값)
변하지 않는 값
  • W_x(입력층을 위한 가중치값)
  • W_y(출력층을 위한 가중치값)
  • W_h(은닉 상태 값을 위한 가중치값)
  • function (활성화 함수, 비선형 함수)

계산식


RNN 구조도 알겠는데, 그래서 RNN의 한계라는 장기 의존성 문제는 왜 발생함?

  • 위 그림에서 확인할 수 있는 것처럼, 이전 단계의 결과가 다음 단계의 입력이 되는 순환구조를 지니기 떄문에 연속적인 데이터, 즉 자연어 처리 용도로 사용됨(ex) 다음 단어를 예측하는 모델)
  • 따라서 장기 의존성 문제가 발생하는 이유는 위 그림에서 확인 할 수 있듯이, 은닉 상태 값은 이전 상태의 은닉 상태 값을 계속 활용해서 업데이트 하기 때문에 거리가 먼(이전전전전전전전전 과 같은) 입력값에 대한 정보는 점점 지니지 않게 되기 때문에 장기 의존성 문제가 발생함
장기의존성 문제에 대한 예시, 이전 단어를 기반으로 해 다음 단어를 예측하는 언어 모델 가정

문장이 짧은 경우 - "나는 국밥을 먹었다"

  • 핵심 단어인 "국밥", "먹었다"는 거리가 가깝기 때문에, "국밥"에 대해 업데이트된 hidden state값을 보고 "먹었다"를 예측할 수 있음

문장이 긴 경우 - "나는 국밥을 어제 친구들과 함께 모일까 말까 하며 옆집에서 먹었다"

  • 핵심 단어인 "국밥", "먹었다"는 위에 짧은 경우보다 상대적으로 멀리 떨어져 있다. RNN의 hidden state값이 계속 업데이트되면 될수록 "국밥"에 대한 정보는 아마 뒤에서는 찾아보기 힘들 것임 

그래서 이를 해결하기 위해 나온 것이 LSTM이다

LSTM

RNN의 한 종류이며, RNN의 장기 의존성 문제를 해결하도록 설계되어 있음

 

LSTM Network(구조)

  • LSTM의 메모리셀4개의 Layer로 구성되어 있음
메모리 셀의 구성

4개의 Layer?

나머지 궁금한 것
  • +, x는 pointwist 연산 기호

다음 메모리 셀로 넘어가는 output이 2개인데? 위 에랑 아래랑 차이가 뭐냐

  • 위에 것이란 아래 그림에서 보이는 C_t
  • 앞서 살펴본, RNN에서 사용된 은닉 값(hidden state)에서 LSTM은 한 가지 핵심 수단을 추가했다.
  • 이 핵심 수단을  Cell State라고 부르며, 각각의 Gate(=layer)와 함께 작용해서 중요하거나 중요하지 않는 정보를 계속해서 가져갈 수 있다. 정보를 계속해서 가져가니 RNN의 장기 의존성 문제를 해결한 것이다.

Gate랑 함께 작용한다고?

  • LSTM에는 4개의 Layer가 존재하고, 그중 ‘σ’ 모양이 3개가 있었는데 해당 모양은  Sigmoid(활성화 함수)를 뜻하며, Sigmoid 계층을 Gate라고 부른다.
  • 따라서 LSTM에는 3개의 Gate가 존재한다.
Sigmoid 함수 특성
0~1 사이 값으로 변환

3개의 Gate?

1. 망각 게이트(Forget Gate)
  • 과거에 대한 정보를 기억/망각하는 단계(제일 먼저 나오는 Sigmoid layer)
  • 과거의 은닉 값(h_t-1)과 현재 입력값 x_t를 Sigmoid 함수를 통해 0~1 사이 값을 만들고, 과거의 Cell_State값 (C_t-1)로 보내서, 해당 값이 1에 가까우면, 정보를 다기억하고 해당 값이 0에 가까우면 정보를 다 망각한다.

기억/망각 양을 계산하는 식


2. 입력 게이트(Input Gate)
  • 망각 게이트의 과거 정보를 기억/망각하는 것 과는 다르게 현재 정보(새로운 정보)를 기억/망각하기 위한 Gate

2가지 주요 연산이 발생함

  • 현재 정보를 얼마나 기억/망각하는지에 대한 연산

  • 현재 정보를 Cell State에 얼마나 반영할지 결정하는 연산

Cell State가 업데이트되는 과정 요약

1. 망각 게이트에서 만든 'f_t'값과 과거 Cell State 값을 계산 -> 과거 시점의 Cell State값을 얼마나 가져갈지 정함
 2. 입력 게이트에서 ~C_t와 i_t값을 곱하고, 그것을 더해서 현재 시점의 Cell State값으로 업데이트함

3. 출력 게이트(Output Gate)

RNN에서 사용한 은닉 값(hidden State) 개념과 동일하며, 최종 출력을 구하는 단계

현시점의 Cell state값과 계산되며 2가지 주요 연산이 발생함

  • 과거의 은닉 값과 현재의 입력값을 이용한 Sigmoid 연산

  • 현재의 Cell State 정보 값을 tanh 연산