본문 바로가기

데이터 다루기/신경망

[신경망] 20. Long Short Term Memory (LSTM)

728x90
반응형

안녕하세요, 이번 포스팅에서는 저번 RNN의 업그레이드 버전인 LSTM을 배워보도록 하겠습니다.

LSTM에 대한 포스팅은 아래의 포스팅에서 많은 도움을 받았음을 미리 알려드립니다.

확실한 이해를 원하시는 분은, 영어지만 유명한 블로그임으로, 들어가서 공부해보시는 것을 추천합니다.

 

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

이전 포스팅에서 말씀 드렸다시피 RNN에는 깊이가 깊어질수록, 처음 시간대에 대한 반영이 0에 수렴한다는 Long-term dependency 단점이 있었습니다.

따라서 LSTM은 과거의 기억을 보존하되, 필요가 없어진 기억을 지워버리는 기능을 추가합니다.

예를 들어서, 옴니버스 형태로 구성된 소설책 데이터를 불러왔을 때, 쳅터마다 새로운 이야기가 시작됩니다. 따라서, 다음 쳅터로 넘아갈 때, 앞 쳅터에 대한 기억은 필요가 없게되지요. 기존의 RNN에서는 모든 내용을 기억으로 가지고가지만, LSTM에서는 이전 쳅터의 내용을 기억에서 지워버릴 수 있습니다.

위의 그림은 LSTM의 구조를 가장 잘 나타냅니다.

LSTM은 RNN과 마찬가지로 같은 모듈을 반복시키는 체인과 같은 구조를 가지고 있습니다.

하지만 RNN과 다르게, 모듈 내부를 들여다보면 큰 차이가 있습니다.

한 눈에 보기에는 복잡한 구조를 가지고 있지만, 하나하나 분리해서 살펴보면, 크게 어려운 내용은 없으니 걱정하지 않으셔도 됩니다.

우선, 노란색 박스는 하나의 Layer를 나타내며, 그리고 분홍색 원은 연산자를 나타냅니다. 예를 들어서 X가 들어있으면, 분홍색 원에 들어오는 값들이 곱해져서 출력값으로 나옵니다. 각 선은 한 노드의 output을 다른 노드의 input으로 vector 전체를 보내는 흐름을 나타냅니다.

LSTM의 cell state

LSTM의 핵심은 바로 cell state에 있습니다. cell state는 LSTM의 구조의 위에 일직선으로 나타납니다.

cell state의 존재 덕분에, LSTM은 RNN의 문제점인 Gradient vanishing/explosion 문제를 해결할 수 있습니다.

cell state에는 2개의 gate가 들어오는데 우선 앞에 있는 forgetting gate에 대해서 알아봅시다.

forgetting gate는 input으로 ht-1과 xt를 받습니다. 그리고 시그모이드 함수를 통과하면서 ft: 0~1 사이의 값으로 변환됩니다.

그리고 이전의 cell state에서 넘어온 Ct-1 (과거의 기억)과 곱해지는 것을 확인할 수 있습니다.

얼핏 예측이 되시죠??

forgetting gate를 통과한 값이 0이 된다면 이전 과거의 기억은 0이 되서 사라지게 됩니다.

반대로, 1이 된다면 이전 과거의 기억은 온전히 보전이 됩니다.

forgetting gate는 이처럼 아주 단순한 원리로 동작됩니다.

다음은 input gate 입니다.

input gate는 forgetting gate와 마찬가지로 input으로 ht-1과 xt를 받습니다. 그리고 같은 방법으로 시그모이드 함수에 의해서 it: 0~1 사이의 값으로 출력됩니다. forgetting gate와 같은 기능으로, it는 현재의 정보를 반영할 것인지 아닌지를 결정합니다.

만약 1의 출력값이 나오면, RNN과 마찬가지로 ht-1와 xt는 tanh 함수에 들어가서 출력값으로 반환되서 cell state에 더해집니다.

예를 들어서, 언어 모델의 예제에서, 주어가 바뀔 때, 앞선 기억에서 주어에 대한 기억을 삭제하고, 새로운 주어를 받아들인다고 생각하시면 됩니다.

다시 말해, 과거의 정보는 삭제 될것인지, 유지 될것인지를 forgetting gate를 통해서 결정하고, 현재의 Input값이 반영 되는지와 안되는 지는 Input gate에서 결정되고, 최종적으로 더해져서, 다음 cell state의 입력값으로 들어갑니다.

마지막으로, RNN에서도 각 state 마다 출력값이 나오던 것을 기억하시죠?

LSTM에도 출력값을 반환하는 output gate가 존재합니다.

이 때 output은 cell state를 바탕으로 필터된 값이 됩니다. 가장 먼저, 시그모이드 함수에 input들이 들어가고, 0~1 사이의 값을 출력합니다.

이 값은, cell state의 어느 부분을 output으로 내보낼 지를 결정합니다. 그리고나서 cell state가 tanh에 들어가서 나온 출력값과 output gate에서 나온 값이 곱해져서 ht가 출력됩니다. 이 ht는 출력값으로 나가기도하며, 다음 state의 input 값으로 들어갑니다.

LSTM을 예제를 통해 이해해보도록 하겠습니다.

이전 cell state에는 3개의 문장이, input으로는 2개의 문장이 들어옵니다.

그리고 cell state의 첫번째와 2번째문장이 유지되고, 3번째 문장이 삭제됩니다.

input에서는 첫번째 문장이 추가되고, 두번째 문장은 반영이 안됩니다.

따라서 Ct에는 업데이트된 문장들이 들어가게 됩니다.

output gate를 통과하면서, Ct를 참조하여, ht가 출력됩니다.

마지막으로 LSTM의 변형 모델에 대해서 알아보고 마치도록 하겠습니다.

첫번째 모델은 Gers & Schmidhuber가 2000년에 제시하였습니다.

"엿보기 구멍(peephole connetction)" 을 추가한 것이 이 모델의 특징입니다. 기존의 LSTM과는 다르게 Input들이 gate를 통과할 때, cell state도 같이 들어오는데, 이를 gate들이 cell state를 엿본다는 표현으로 이 모델이 탄생했습니다.

다음으로, Cho et al. (2014)에서 제안한 Gated Recurrent Unit (GRU) 입니다.

GRU는 forgetting gate 와 input gate를 하나의 "update gate"로 합치고, cell state와 hidden state 또한 합쳤습니다.

결과적으로, GRU는 기존 LSTM 보다 단순한 구조를 가지게 됩니다.

현재는 GRU의 인기가 계속해서 증가하는 추세입니다.

반응형