LSTM은 어떻게 기억하는가 — CEC에서 GRU까지
Vanishing gradient의 근본 원인부터 Constant Error Carousel의 수학적 증명, forget bias 초기화의 결정적 효과, GRU의 단순화까지 — LSTM 설계 철학의 전체 흐름을 추적한다.
- 01 RNN은 왜 sequence를 이해할 수 있는가
- 02 RNN 학습은 왜 이렇게 설계되었는가
- 03 RNN의 Vanishing Gradient는 왜 피할 수 없는가
- 04 LSTM은 어떻게 기억하는가 — CEC에서 GRU까지
- 05 RNN의 네 가지 진화 — BiRNN, Stacked, NTM, ESN
- 06 Seq2Seq에서 Attention까지, 무엇이 달라졌나
- 07 RNN에서 Mamba까지: 시퀀스 모델 진화의 단일 원리
Plain RNN의 gradient는 시간을 거슬러 올라갈수록 지수적으로 사라진다. Hochreiter & Schmidhuber 1997은 이 문제의 근본 원인이 곱셈적 Jacobian 누적이라는 것을 진단했고, 그 해법으로 LSTM을 설계했다. 왜 additive update가 vanishing을 막는가? 그리고 이 원리가 GRU와 현대 아키텍처로 어떻게 이어지는가?
Plain RNN의 문제 — 곱이 쌓인다
BPTT에서 step을 거슬러 올라가는 gradient는 다음 형태를 띤다.
각 step마다 의 spectral radius 가 곱해진다. 이면 gradient는 로 지수 감쇠하고, 이면 폭발한다. 은 이론적으로 균형점이지만 학습으로 유지하기 불가능에 가깝다.
핵심 통찰은 단순하다. 곱셈적 누적이 문제라면, 덧셈적 누적으로 바꾸면 된다.
Constant Error Carousel — 덧셈으로 gradient를 보존하다
LSTM의 cell state update는 다음과 같다.
이 수식의 핵심은 이 직접 더해진다는 점이다. , , 는 모두 과 의 함수이지 을 직접 참조하지 않는다.
LSTM cell update 에서 에 대한 direct partial derivative는 다음과 같다.
(element-wise scalar)
, , 는 모두 과 만을 직접 참조한다. 에 직접 의존하는 항은 뿐이다. 따라서 이고, 나머지 항의 direct partial은 0이다.
Chain rule을 step에 적용하면 cell path의 gradient는 matrix product가 아닌 element-wise scalar product로 단순화된다.
이면 이 곱도 이다. Hochreiter는 이것을 **Constant Error Carousel(CEC)**이라 불렀다 — 정보가 carousel처럼 cell 안을 순환하며 보존된다.
Plain RNN과의 차이는 극단적이다. , 인 plain RNN은 100 step 후 gradient가 로 사라진다. 인 LSTM cell은 같은 시점에 을 유지한다.
4개의 Gate — 왜 이 형태인가
순수한 additive update 는 CEC를 만족하지만 세 가지 문제를 갖는다. 모든 입력이 무조건 누적되고, 오래된 정보를 지울 수 없으며, cell이 unbounded하게 성장한다.
LSTM은 sigmoid gate 3개로 이를 해결한다.
sigmoid는 으로 “양(degree)“을 제어하고, tanh는 로 “값(value)“을 표현한다. 정보의 선택과 내용이 분리된다.
Greff et al. 2017의 대규모 ablation 실험은 이 구조가 놀랍도록 robust함을 보인다. NIG(no input gate)와 NOG(no output gate)만이 큰 성능 손실을 유발했고, 나머지 변형(peephole, coupled gates 등)은 모두 marginal했다.
Vanilla LSTM은 RNN 대비 4배의 파라미터 ()를 요구한다. 이 비용은 long-range dependency 학습 능력으로 돌아온다. 단, cell state path만 vanishing이 해결되고 hidden path는 여전히 취약하다는 점, 그리고 sequential 처리로 GPU 병렬화가 제한된다는 점은 명확한 한계다.
Forget Bias = 1 — 학습의 cold start를 막다
CEC의 수학이 옳더라도 학습이 시작되는 시점이 critical하다. PyTorch의 기본값은 으로, 이때 다. 100 step 후 initial gradient는 — float32 정밀도의 한계()를 훨씬 밑돌아 학습이 사실상 멈춘다.
로 설정하면 초기 이 되고, 같은 100 step에서 gradient는 으로 측정 가능한 수준을 유지한다. 비율은 배다.
Jozefowicz et al. 2015는 이 단순한 변경이 Adding Problem에서 학습 가능 여부를 binary하게 결정함을 보였다. PyTorch에서 적용하는 방법은 다음과 같다.
def set_forget_bias(lstm, value=1.0):
for layer in range(lstm.num_layers):
bias_ih = getattr(lstm, f'bias_ih_l{layer}')
bias_hh = getattr(lstm, f'bias_hh_l{layer}')
H = bias_ih.size(0) // 4
with torch.no_grad():
bias_ih[H:2*H].fill_(value)
bias_hh[H:2*H].fill_(0.0)
PyTorch의 LSTM bias 순서는 [i, f, g, o]이므로 forget gate는 인덱스 H:2H에 해당한다.
GRU — 같은 정신, 더 단순한 형태
Cho et al. 2014의 GRU는 LSTM의 핵심 정신을 2개의 gate로 압축한다.
update gate 는 LSTM의 forget gate와 input gate를 coupled한 형태다 — , 에 해당한다. cell state와 hidden state의 분리도 없앴다.
cell path의 direct gradient는 로, LSTM의 와 정확히 대응한다. CEC의 원리가 동일하게 적용된다.
파라미터는 LSTM의 75%()이고, Chung et al. 2014의 체계적 비교에서 폴리포닉 음악 모델링 등 여러 task에서 동등한 성능을 보였다. universal 우열은 없고 task에 따라 선택이 달라진다.
정리
- Plain RNN의 vanishing은 Jacobian의 matrix product 누적이 근본 원인이다.
- LSTM의 cell update는 이를 element-wise scalar product로 바꾼다. — CEC의 핵심.
- 이 되도록 forget bias = 1로 초기화하면 cold start를 막고 long-range gradient를 학습 초기부터 살린다.
- GRU는 같은 additive update 철학을 2개의 gate로 구현하며, 파라미터를 25% 절약한다.
LSTM의 모든 설계 결정은 하나의 원칙으로 수렴한다 — 곱셈을 덧셈으로 바꿔 gradient를 시간 축에서 보존하라. ResNet의 residual connection, Transformer의 layer-wise additive update, Mamba의 selective SSM까지, 이 원칙의 변주가 현대 아키텍처 전반에 흐른다.