순서를 기억하는 신경망 — 기억이 어떻게 유지되고, 잊히고, 폭주하는지 수식을 직접 굴려 봐요.
🖱️ 아래 사각형 14개가 입력 시퀀스예요. 클릭하면 0↔1이 바뀌어요 (1 = 신호 들어옴).
📖 읽는 법: 가로축은 시간 순서 t(1~14), 세로축은 기억의 세기(−1~1, 가운데 실선이 0)예요. 파란 선은 RNN의 기억 h_t, 보라 선은 단순화한 LSTM 셀 상태 c_t, 연한 파란 세로 띠는 신호(1)가 들어온 순간이에요. 신호가 들어온 뒤 선이 얼마나 오래 0 위에 머무는지— 즉 기억이 얼마나 오래가는지를 보면 돼요.
기억 반감기는 마지막 신호의 기억이 절반으로 줄어드는 데 걸리는 스텝 수예요. w_h를 12번 곱한 값이 0에 가까우면 기울기 소실, 계속 커지면 기울기 폭발과 이어져요.
LSTM의 셀 상태는 (단순화하면) c_t = f·c_{t-1} + (1−f)·x_t — 잊음 게이트 f가 옛 기억과 새 입력의 비율을 조절하는 기억의 수도꼭지예요.
import torch
import torch.nn as nn
# 14 타임스텝짜리 시퀀스 하나 (t=2에만 신호 1)
x = torch.zeros(1, 14, 1) # (배치, 시간, 특성)
x[0, 1, 0] = 1.0
# 기본 RNN: h_t = tanh(W_x x_t + W_h h_{t-1})
rnn = nn.RNN(input_size=1, hidden_size=8, batch_first=True)
out, h_n = rnn(x) # out: 매 스텝의 기억 h_t
print(out.shape) # torch.Size([1, 14, 8])
# LSTM: 게이트로 셀 상태 c(장기 기억)를 따로 관리
lstm = nn.LSTM(input_size=1, hidden_size=8, batch_first=True)
out, (h_n, c_n) = lstm(x) # c_n이 오래가는 기억
# 마지막 기억에 선형층을 붙이면 분류/예측 모델 완성
head = nn.Linear(8, 1)
y_pred = head(h_n[-1]) # 시퀀스 전체를 요약한 예측