먼 시점의 정보를 사용하려면 중간 입력을 처리하는 동안 필요한 정보를 남겨 두어야 한다. 기본 순환 신경망은 은닉 상태를 이어 가지만, 오래전 정보를 유지하도록 학습하기는 어렵다. LSTM과 GRU는 게이트(Gate)로 이전 정보와 새 정보가 상태에 들어가는 비율을 조절한다.
기본 형태인 바닐라 RNN(Vanilla RNN)은 매 시점에 현재 입력과 이전 상태를 합쳐 비선형 변환을 적용한다. 앞선 정보가 여러 계산을 거쳐 전달되므로, 먼 과거의 영향이 뒤까지 충분히 남는다고 보장할 수 없다. 멀리 떨어진 입력 사이의 관계를 학습하기 어려운 것을 장기 의존성 문제(Long-term dependency problem)라고 한다.
학습에서도 긴 경로를 거슬러 올라간다. 뒤쪽 손실이 앞쪽 계산에 얼마나 영향을 받는지 구할 때는 연쇄 법칙에 따라 시점별 미분을 반복해서 곱한다. 이 곱이 매우 작아지는 기울기 소실(Vanishing gradient)이 생기면, 먼 과거와 관련된 가중치를 바꾸는 신호가 약해진다. 반대로 곱이 지나치게 커지는 기울기 폭주(Exploding gradient)도 가능하다.
따라서 상태를 다음 시점에 넘기는 구조만으로는 충분하지 않다. 필요한 정보를 유지하는 경로와, 그 경로를 학습할 수 있는 조건이 함께 필요하다.
장단기 메모리(Long Short-Term Memory, LSTM)는 셀 상태(Cell state)와 은닉 상태(Hidden state)를 함께 넘긴다. 셀 상태 는 이전 정보를 남기고 새 정보를 더하는 벡터다. 은닉 상태 는 셀 상태에서 만들어 다음 시점의 계산이나 출력층에 사용하는 표현이다. 두 상태를 장기 기억과 단기 기억이라고 부르기도 하지만, 보관 기간이 정해져 있다는 뜻은 아니다.
게이트는 상태의 성분마다 통과 비율을 정한다. 입력과 이전 은닉 상태를 선형 변환한 뒤 시그모이드 함수 를 적용하므로 각 값은 0과 1 사이이다. 사람이 여닫는 스위치가 아니라, 학습된 가중치로 계산하는 벡터다.
이하에서는 투영과 피프홀 연결이 없는 기본 LSTM을 다룬다. 벡터는 열벡터이고, 입력 는 차원, 두 상태는 차원이다. 각 입력 가중치 는 , 상태 가중치 는 , 편향은 차원이다. 아래첨자가 다르면 별도의 파라미터이며, 같은 파라미터는 시점 사이에서 공유한다.
망각 게이트(Forget gate) 는 이전 셀 상태를 얼마나 남길지, 입력 게이트(Input gate) 는 새 후보를 얼마나 넣을지 정한다. 후보 는 새로 기록할 내용이다. 게이트와 달리 를 거치므로 음수도 가질 수 있다.
이 값들을 이용해 셀 상태를 갱신한다. 는 같은 위치의 성분끼리 곱하는 원소별 곱이다.
첫 항은 이전 상태에서 남기는 부분이고, 둘째 항은 새로 더하는 부분이다. 망각 게이트가 1에 가까운 성분은 이전 값을 많이 남긴다. 입력 게이트가 작은 성분은 후보를 적게 반영한다. 두 게이트는 따로 계산하므로 합이 1일 필요가 없다.
출력 게이트(Output gate) 는 셀 상태가 은닉 상태에 얼마나 드러날지 정한다.
출력 게이트가 작으면 셀 상태에 남아 있는 정보도 은닉 상태에는 적게 드러날 수 있다. 이렇게 저장할 정보와 외부 계산에 사용할 표현을 구분한다. 은닉 상태 자체가 분류 확률은 아니며, 예측에는 별도의 출력층이 필요하다.
한 성분의 이전 셀 값이 , 망각 게이트가 , 입력 게이트가 , 후보가 라고 가정하면 새 셀 값은 다음과 같다.
이전 값에서 을 남기고 을 더한 것이다. 출력 게이트가 이면 은닉 값은 이다. 같은 시점에도 두 상태의 값과 역할은 다르다. 이는 설명을 위한 손계산이며 학습 결과가 아니다.
셀 상태 갱신식은 이전 셀 상태에 매번 행렬곱과 를 적용하지 않고, 게이트를 곱해 다음 상태에 더한다. 어느 성분의 망각 게이트가 1에 가깝고 새로 더하는 값이 작으면 그 성분을 거의 그대로 전달할 수 있다.
이 직접 경로만 보면 역전파 때 곱하는 비율도 망각 게이트의 값이다. 필요한 구간에서 그 값이 1에 가깝게 학습되면 먼 시점의 신호를 유지하는 데 도움이 된다. 다만 전체 미분에는 은닉 상태와 게이트를 거치는 경로도 포함된다. 망각 게이트가 작은 값으로 반복되면 직접 경로의 신호도 줄어들므로, LSTM이 기울기 소실을 완전히 없애는 것은 아니다.
게이트 순환 유닛(Gated Recurrent Unit, GRU)은 별도의 셀 상태 없이 은닉 상태 하나를 전달한다. 리셋 게이트(Reset gate) 는 새 후보를 만들 때 이전 상태를 얼마나 사용할지 정한다. 업데이트 게이트(Update gate) 는 최종 상태에서 이전 값과 후보를 섞는 비율을 정한다.
교재의 GRU 식은 다음과 같다. 기호의 차원은 앞과 같지만 LSTM과는 별도의 파라미터이며, 도 GRU의 새 후보를 뜻한다.
은 모든 성분이 1인 벡터다. 이 표기에서 업데이트 게이트가 1에 가까우면 이전 상태를 많이 남기고, 0에 가까우면 후보로 많이 바꾼다. 이전 상태와 후보에 주는 비율의 합은 성분마다 1이다. 리셋 게이트가 작다는 것은 후보 계산에 이전 상태가 덜 들어간다는 뜻이며, 이전 상태 자체를 즉시 지운다는 뜻은 아니다.
PyTorch의 nn.GRU는 후보를 계산하는 순서가 교재와 다르다. 교재는 이전 상태에 리셋 게이트를 곱한 뒤 행렬곱을 한다. PyTorch는 이전 상태를 선형 변환한 결과에 리셋 게이트를 곱한다. 일반적으로 두 계산은 같지 않으므로 교재 식의 직접 구현과 nn.GRU가 같은 수치를 낸다고 가정하면 안 된다.
LSTM은 세 게이트와 후보를, GRU는 두 게이트와 후보를 계산한다. 같은 입력 크기·은닉 크기·층 수·방향 수의 기본 구조에서는 GRU의 파라미터가 더 적다. 다만 파라미터 수만으로 학습 시간이나 예측 성능의 우열을 정할 수는 없다.
| 모듈 | 호출 결과 | 다음 시점으로 이어지는 상태 |
|---|---|---|
nn.LSTM | outputs, (h_n, c_n) | 은닉 상태와 셀 상태 |
nn.GRU | outputs, h_n | 은닉 상태 |
두 모듈의 outputs에는 마지막 층의 모든 시점에 대한 은닉 상태가 들어간다. LSTM의 셀 상태까지 이어 붙인 결과가 아니다. h_n과 c_n은 각 층·방향의 최종 상태를 담는다.
단방향 1층, 은닉 크기 8, batch_first=True이고 LSTM에 투영을 사용하지 않는다면, (2, 3, 4) 입력의 outputs는 (2, 3, 8)이다. 최종 상태는 각각 (1, 2, 8)이며, batch_first가 이들의 축 순서를 바꾸지는 않는다. 이 크기는 API에서 도출한 값이며 실행 결과가 아니다.