일기장에 메모장을 하나 더 두면
RNN은 “매일 쓰는 일기”였다. LSTM(Long Short-Term Memory)은 여기에 중요한 내용만 따로 기록하는 메모장을 하나 더 둔 구조라고 볼 수 있다. 매일 일기를 쓸 때 오래된 메모 중 불필요한 것은 지우고(Forget Gate), 오늘 있었던 일 중 중요한 것은 메모장에 추가하고(Input Gate), 메모장 속 중요한 내용을 참고해 오늘 일기를 쓴다(Output Gate) — 이 세 가지 문을 통해 무엇을 오래 기억하고 무엇을 잊을지를 데이터가 스스로 정하게 만든 것이 LSTM이다.
Cell State: 장기 기억을 담는 별도의 통로
LSTM은 RNN의 Hidden State 외에 Cell State라는 통로를 하나 더 둔다. Cell State는 세 게이트를 거치며 값이 조절되지만, 그 자체로는 활성 함수를 거치지 않고 비교적 그대로 다음 시점으로 전달돼 정보가 오래 유지되도록 돕는다.
게이트 | 역할 | 수식 |
|---|---|---|
Forget Gate (f_t) | 이전 Cell State 중 버릴 정보의 비율을 정한다 (0=완전히 잊음, 1=완전히 유지) | f_t = σ(W_f · [h_(t-1), x_t] + b_f) |
Input Gate (i_t) | 새 입력 중 얼마나 Cell State에 반영할지 정한다 | i_t = σ(W_i · [h_(t-1), x_t] + b_i) |
후보 값 (C̃_t) | 새로 추가될 후보 정보를 만든다 | C̃_t = tanh(W_c · [h_(t-1), x_t] + b_c) |
Cell State 갱신 (C_t) | 과거 기억 중 일부(f_t)와 새 정보(i_t)를 합친다 | C_t = f_t ⊙ C_(t-1) + i_t ⊙ C̃_t |
Output Gate (o_t) | 갱신된 Cell State 중 얼마나 출력(Hidden State)으로 내보낼지 정한다 | o_t = σ(W_o · [h_(t-1), x_t] + b_o) |
Hidden State (h_t) | Cell State를 tanh로 다시 -1~1로 눌러 Output Gate만큼 내보낸다 | h_t = o_t ⊙ tanh(C_t) |
세 게이트 모두 출력 범위가 (0, 1)인 Sigmoid(σ)를 쓴다 — “얼마나 통과시킬지”를 비율로 표현하기 위해서다.
숫자로 한 단계 계산해보기
이전 Hidden State(h_(t-1)=0.5)와 이전 Cell State(C_(t-1)=0.8)가 있는 상태에서 새 입력 x=1.0이 들어왔을 때, 한 시점의 LSTM 계산을 직접 해본다(가중치는 설명을 위해 임의로 정한 값).
import math
def sigmoid(x):
return 1 / (1 + math.exp(-x))
h_prev, C_prev = 0.5, 0.8
x = 1.0
# 게이트별 가중치 (h와 x에 대한 가중치, 편향)
Wf_h, Wf_x, bf = 0.8, 0.2, 0.0
Wi_h, Wi_x, bi = -0.5, 1.0, 0.0
Wc_h, Wc_x, bc = 0.3, 0.9, 0.0
Wo_h, Wo_x, bo = 0.6, 0.4, 0.0
f = sigmoid(Wf_h * h_prev + Wf_x * x + bf) # forget gate
i = sigmoid(Wi_h * h_prev + Wi_x * x + bi) # input gate
c_tilde = math.tanh(Wc_h * h_prev + Wc_x * x + bc) # 후보 값
C = f * C_prev + i * c_tilde # cell state 갱신
o = sigmoid(Wo_h * h_prev + Wo_x * x + bo) # output gate
h = o * math.tanh(C) # hidden state
print(f"forget={f:.4f}, input={i:.4f}, candidate={c_tilde:.4f}")
print(f"new cell state={C:.4f}")
print(f"output gate={o:.4f}, new hidden state={h:.4f}")
forget=0.6457, input=0.6792, candidate=0.7818
new cell state=1.0475
output gate=0.6682, new hidden state=0.5217
forget gate가 0.6457이라는 것은 “이전 기억의 약 65%를 유지한다”는 뜻이다. 여기에 input gate(0.6792)만큼 새 후보 정보(0.7818)를 더해 새 Cell State(1.0475)가 만들어졌다. 이 Cell State를 tanh로 다시 -1~1로 누른 뒤, output gate(0.6682)만큼만 내보낸 값이 새 Hidden State(0.5217)다.
RNN과 LSTM 비교
구분 | RNN | LSTM |
|---|---|---|
기억 능력 | 과거 정보를 짧게 기억 | 게이트와 Cell State로 과거 정보를 상대적으로 길게 기억 |
구조 | Hidden State 하나 | Hidden State + Cell State(장기 기억 저장소) |
계산량 | 적음 — tanh로 단순 계산 | 많음 — 게이트 3개를 추가로 계산해 학습 시간이 길어짐 |
한계 | 긴 시퀀스에서 기울기 소실 발생 | RNN보다 낫지만 매우 긴 시퀀스에서는 여전히 한계 — Attention 등장의 배경이 됨 |
정리
LSTM은 RNN의 골격은 그대로 두고, Forget·Input·Output 세 게이트와 별도의 Cell State를 더해 “무엇을 얼마나 오래 기억하고 무엇을 잊을지”를 데이터 스스로 정하게 만든 아키텍처다. 덕분에 RNN보다 긴 시퀀스를 다룰 수 있지만, 계산량이 늘고 여전히 아주 긴 시퀀스에서는 한계가 있다 — 이 한계를 넘어서려는 시도가 이후 Attention과 Transformer로 이어진다.
참고 자료
Understanding LSTM Networks — Christopher Olah — LSTM 게이트 구조에 대해 가장 널리 인용되는 해설 (2026-08-07 확인)
댓글 0
댓글을 불러오는 중…