기존의 인공 신경망의 은닉층에는 맥락이 고려되지 않은 단순한 뉴런만 배치되어 있는 구조이다. 과거의 은닉층(hidden layer)을 도입하여 시계열 데이터를 예측할 수 있지만 vanishing gradient 문제가 발생한다.
반면, 순환신경망(RNN)은 과거의 이벤트가 미래의 결과에 영향을 줄 수 있는 순환 구조(directed cycle)를 가지고 있다. 데이터 중에서도 연속적인 속성(sequence)을 띄고 있는 번역, 문자, 음성 인식 등 다양한 분야에서 RNN이 활용되고 있다. LSTM은 RNN의 주요 알고리즘으로 각광받고 있는 모델이다.
LSTM(Long Short Term Memory) 배경
Recurrent Nenural Network(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 구조를 살펴보는 목적
바닐라 RNN보다 복잡한 구조가 왜 long-term dependency 한지 이해해보자
어떻게 이 구조가 long term과 short term, 둘 다 잡을 수 있는지 살펴보자
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의 차원이 같음)
입력 웨이트 충돌(input weight conflict)과 출력 웨이트 충돌(output weight conflict)
자신이 발화해야 할 신호가 전파돼 왔을 때는 웨이트를 크게 해서 활성화해야 하지만, 관계가 없는 신호가 전파됐을 때는 웨이트를 작게 해서 비활성인 채로 있어야 한다. 시계열 데이터를 입력에서 받을 경우와 비교해보면, 이것은 시간 의존성이 있는 신호를 받았을 때는 웨이트를 크게 하고, 의존성이 없는 신호를 받았을 때는 웨이트를 작게 하는 것입니다. 그러나 뉴런이 동일한 웨이트로 연결돼 있다면 두 가지 경우에 서로 상쇄하는 형태의 웨이트 변경이 이뤄지므로 특히 장기의존성 학습이 잘 실행되지 않게 됩니다.
Step 1. 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 구조
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, 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 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에 접근할 수 없다는 문제가 발생한다. 이 문제를 해결하기 위해 도입된 것이 '핍홀 연결' 이다. (<정석으로 배우는 딥러닝> 책에서는 핍홀 결합으로 번역되었지만, 핍홀 연결이 잘 표현된 번역같다!)