본문 바로가기
  • 기술을 이야기하지만 사람을 생각합니다.
20. Deep Learning

[논문리뷰] RNN :: LSTM(Long Short Term Memory) 톺아보기

by WE DONE IT 2019. 1. 5.

 블로그 글은 딥러닝 공부를 목적으로, 최성준 박사님 강의와 여러 자료들을 참고하여 LSTM의 개념에 대해 정리하였습니다.

 

기존의 인공 신경망의 은닉층에는 맥락이 고려되지 않은 단순한 뉴런만 배치되어 있는 구조이다. 과거의 은닉층(hidden layer)을 도입하여 시계열 데이터를 예측할 수 있지만 vanishing gradient 문제가 발생한다.

 

반면, 순환신경망(RNN)은 과거의 이벤트가 미래의 결과에 영향을 줄 수 있는 순환 구조(directed cycle)를 가지고 있다. 데이터 중에서도 연속적인 속성(sequence)을 띄고 있는 번역, 문자, 음성 인식 등 다양한 분야에서 RNN이 활용되고 있다. LSTM은 RNN의 주요 알고리즘으로 각광받고 있는 모델이다.

 

LSTM(Long Short Term Memory) 배경

  • Recurrent Nenural Network(RNN) 컨셉
  • RNN 구조RNN 모델 구조
    • Recurrent란, 이전에서 어떤 정보가 추가적으로 오는 것  (a.k.a 메모리)
    • RNN은 시간적으로 상관관계가 있는 데이터에서 주로 사용됨
      (예: The clouds are in the sky 문장에서 'sky'를 예측하는 경우)
    • 직전 데이터(t-1)과 현재 데이터(t) 간의 상관관계(correlation)을 고려하여 다음의 데이터(t+1)를 예측하고자,
      과거의 데이터도 반영한 신경망 모델을 만듦
    • 시간을 많이 거슬러 올라갈수록(long term) 경사를 소실하는 문제가 있음
      > 선형 함수가 아닌 비선형 함수를 활성함수로 쓰는 것과 비슷한 이유로, 초기값에 따라서 과거 데이터를 계속 곱할수록 작아지는 문제가 발생하게 됨.
      > LSTM은 구조를 개선하여 이 문제를 해결함
      > Le, Q. V., Jaitly, N., & Hinton, G. E. (2015) 연구에 따르면, 활성함수를 ReLU로 사용하고 가중치를 단위행렬로 초기화하면 long-term을 학습시킬 수 있음.
    • Vanilla RNN: RNN의 대표적인 모델로, 이전의 정보(xt-1)와 현재 정보(xt)를 취합(tanh, 하이퍼볼릭탄젠트)한 정보를 신경망에 들어가서 아웃풋(ht)을 만듦
  • 장기 의존성 (Long-Term Dependency) 문제
    • RNN 처럼 직전 정보만 참고하는 것이 아니라,  그 전 정보를 고려해야 하는 경우(longer-term) 가 있음
      (예: 책을 읽을 때, 몇 페이지/챕터 전에 있는 정보를 머리 속에 기억하고 있어야 하는 경우
      I grew up in France... I speak fluent French. 문장에서 'french'를 예측하는 경우)
    • 시퀀스가 있는 문장에서 문장 간의 간격(gap, 입력 위치의 차이)이 커질 수록, RNN은 두 두 정보의 맥락을 파악하기 어려워짐
    • 따라서, 한참 전의 데이터도 함께 고려하여 출력을 만들어보자! -> LSTM의 목적
 

LSTM이란?

  • LSTM
LSTM이 필요한 이유
장기 기억을 보존하는 LSTM

 

LSTM 컨셉은 Hochreiter, S., & Schmidhuber, J. (1997)이 제안했으며, 많은 개선을 통해 언어, 음성인식 등 다양한 분야에서 사용되고 있다.

    • RNN의 주요 모델 중 하나로, 장기 의존성 문제를 해결할 수 있음
    • 직전 데이터뿐만 아니라, 좀 더 거시적으로 과거 데이터를 고려하여 미래의 데이터를 예측하기 위함

 

  • LSTM 구조를 살펴보는 목적
  1. 바닐라 RNN보다 복잡한 구조가 왜 long-term dependency 한지 이해해보자
  2. 어떻게 이 구조가 long term과 short term, 둘 다 잡을 수 있는지 살펴보자

LSTM 구조
LSTM 구조

 

 

 

LSTM 구조

 

 

  •  Neural Network Layer
    > 웨이트(weight)와 바이어스(bias) 둘 다 있음 
  •  Pointwise Operation
    > Pointwise Operation으로 연산이 되면, 각각의 차원(dimension)에 맞게 곱하거나 더하게 됨
  • input과 output의 차원이 같다고 가정한다면,
    > 100 dimension과 100dimension이 concatenate 하게 되면 200 dimension이 되지만, 
    Neural Network Layer는 200 dimension을 100dimension으로 가는 네트워크가 되는 걸 유추해볼 수 있음.
    (실제로도 input과 output의 차원이 같음)

 

 

LSTM 네트워크 구조

 

 

[이미지 출처: [강의자료] Week9a Basics of RNN]

** Input Gate 와 Forget Gate 텍스트 위치 바꿔 적음 ** 

총 여섯 개의 파라미터가 있으며, 네 개의 게이트(gate)로 이루어져 있다.

 

1. Input (Xt)

2. (Cell) State 

  • 회전목마 같은 구조로 인해 오차가 사라지지 않고, 전체 체인을 관통함
  • (x) 게이트 메커니즘: 정보를 여닫는 역할

 

3. Hidden State

 

: 이전 출력(previous output)
 

4. Gates (Forget Gate, Input Gate, Output Gate)

세 개의 게이트는 정보들이 어느 시점에서 정보를 버리거나 유지하여 선택적으로 흘러갈 수 있게(=long term과 short term을 잘 고려하는) 하기 위함이다. 

LSTM에서 cell state와 함께 input gate와 output gate이 도입된 이유는 <스고모리 유우스케의 '정석으로 배우는 딥러닝'> 책의 설명을 인용한다. 

입력 웨이트 충돌(input weight conflict)과 출력 웨이트 충돌(output weight conflict) 

자신이 발화해야 할 신호가 전파돼 왔을 때는 웨이트를 크게 해서 활성화해야 하지만, 관계가 없는 신호가 전파됐을 때는 웨이트를 작게 해서 비활성인 채로 있어야 한다. 
시계열 데이터를 입력에서 받을 경우와 비교해보면, 이것은 시간 의존성이 있는 신호를 받았을 때는 웨이트를 크게 하고,
의존성이 없는 신호를 받았을 때는 웨이트를 작게 하는 것입니다. 그러나 뉴런이 동일한 웨이트로 연결돼 있다면 두 가지 경우에 서로 상쇄하는 형태의 웨이트 변경이 이뤄지므로 특히 장기의존성 학습이 잘 실행되지 않게 됩니다.

 

Step 1. Forget Gate: 과거 정보를 버릴지 말지 결정하는 과정

 

Forget gate
Forget Gate(망각 게이트) 구조

 

과거의 정보를 통해 맥락을 고려하는 것도 중요하지만, 그 정보가 필요하지 않을 경우에는 과감히 버리는 것도 중요하다!
  • Decide what information we’re going to throw away from the cell state.
  • 이전 output과 현재 input을 넣어, cell state로 가는 과거 정보값이 나옴
  • 활성함수로 시그모이드(sigmoid)를 사용하므로, 0 또는 1 값이 나옴
    > '0'일 경우, 이전의 cell state값은 모두 '0'이 되어 미래의 결과에 아무런 영향을 주지 않음 
    > '1'일 경우, 미래의 예측 결과에 영향을 주도록 이전의 cell state 값(Ct-1)을 그대로 보내 완전히 유지함
  • 즉, Forget Gate는 현재 입력과 이전 출력을 고려해서,
    cell state의 어떤 값을 버릴지/지워버릴지('0'이 출력되면 날려버림) 결정하는 역할

Step 2. Input Gate: 현재 정보를 저장할지 결정하는 과정

Input Gate
Input Gate 구조

 

  • Decide what new information we’re going to store in the cell state.
  • 현재의 cell state값에 얼마나 더할지 말지를 정하는 역할 (tanh는 -1 에서 1 사이의 값이 나옴)

* Forget Gate와 Input Gate의 주요 역할

: 이전 cell state 값을 얼마나 버릴지, 지금 입력과 이전 출력으로 얻어진 값을 얼마나 cell state에 반영할지 정하는 역할

Step 3. Update (cell state): 과거 cell state(Ct-1)를 새로운 state(Ct)로 업데이트 하는 과정

Update Gate
Update Gate 구조

 

  • Update, scaled by now much we decide to update. 
  • Forget Gate를 통해서 얼마나 버릴지, Input Gate에서 얼마나 더할지를 정했으므로,
    > input gate * current state + forget * previous state

Step 4. Output Gate (hidden state): 어떤 출력값을 출력할지 결정하는 과정

Output Gate
Output Gate 구조

 

  • Output based on the updated state.
  • 최종적으로 얻어진 cell state 값을 얼마나 빼낼지 결정하는 역할
    > output gate * updated state

5. Output (ht)

  • output state 는 다음 hidden state와 항상 동일함

6. Next (Cell) State

7. Next Hidden State

 

LSTM이 문제점, 핍홀 연결(peephole connections)

Output 게이트가 C(t)를 전달하기 때문에, LSTM 블록별 cell state는 output 게이트에 따라 달라진다. (input, forget 게이트는 C(t-1)를 전달함) 
Output 게이트가 계속 닫혀있는 경우(시그모이드에서 0을 보내는 경우를 의미하는 것 같음) cell state에 접근할 수 없다는 문제가 발생한다. 이 문제를 해결하기 위해 도입된 것이 '핍홀 연결' 이다. (<정석으로 배우는 딥러닝> 책에서는 핍홀 결합으로 번역되었지만, 핍홀 연결이 잘 표현된 번역같다!)
 
  • cell state에 각 게이트를 연결하여, cell state를 각 게이트에 전달함
  • Gers & Schmidhuber (2000)이 제안한 모델은 핍홀 결함을 가지고 있음.
  • 핍홀 연결에 대한 자세한 설명은 이 블로그를 참고하세요!
 

LSTM 구조에 대한 설명을 마치며

  • 바닐라 RNN에 비해 LSTM 하나의 구조에도 네 개의 뉴럴 네트워크가 들어가 있지만, 실제로 TensorFlow 를 이용하서 사용할 땐 간단함
  • 입력과 출력을 정해주고, 초기화만 잘 시켜주면, 텐서플로우에서 LSTM 모듈을 사용할 수 있음
  • CEC(constant error carousal, 상수 오류 회전기)를 통해서 vanishing gradient 문제를 해결한다는 점에 대해서는 더 공부가 필요하다...
    Why can Constant Error Carousels (CECs) prevent LSTM from the problems of vanishing/exploding gradients?
    > https://bi.snu.ac.kr/Courses/ML2016/LectureNote/LectureNote_ch7.pdf

 

참고 자료

 

 

댓글11

  • oot 2019.07.29 14:14

    LSTM 네트워크 구조 그림의 forget gate와 input gate가 잘못적혀있는게 아닌가요?.(그림의 빨간글씨)
    답글

  • 재형이 2020.01.14 14:56

    oot 님 말씀대로 LSTM 네트워크 구조 그림의 Input Gate와 Forget Gate가 반대로 적혀있습니다. 헷갈릴 뻔 했네요..
    답글

  • 슈가맨 2020.03.02 11:36

    정정한 내용에서 Output Gate가 아니라 Forget Gate를 적으려고 하셨던거 아닐까요?
    ** Input Gate 와 Output Gate 텍스트 위치 바꿔 적음 **
    --> ** Input Gate 와 Forget Gate 텍스트 위치 바꿔 적음 **
    답글

  • chloe 2020.06.23 13:41

    forget gate에서 sigmoid함수를 사용하므로 0 또는 1의 값이 나와서 이전 과거 데이터의 기억을 가지고 갈지, 말지를 결정한다고 하셨는데요.
    단순한 질문일 수 있는데, sigmoid 함수의 결과값은 0에서 1사이값을 가지는데, 단정적으로 forget gate에서 0 또는 1의 값으로만 얘기하는 이유가 무엇일까요?
    답글

    • WE DONE IT 2020.06.27 12:47 신고

      질문 주셔서 감사합니다!
      논문 리뷰한지 오래돼서 저도 다시 살펴봐야겠네요. 공부하고 다시 답변 드리겠습니다.

  • 익명 2021.11.15 08:17

    비밀댓글입니다
    답글

  • 브라더 훈 2021.11.15 08:21 신고

    안녕하세요, 포스팅에 사용하신 이미지를 혹시 제가 작성하는 위키독스 문서에 사용 가능할까요?(수익성 없고, 출처를 기재해 놓겠습니다!)
    답글