LSTM
Long Short-Term Memory
RNN 변형. 장기 의존성 학습. 게이트 메커니즘으로 정보 흐름 제어.
Long Short-Term Memory
RNN 변형. 장기 의존성 학습. 게이트 메커니즘으로 정보 흐름 제어.
LSTM(Long Short-Term Memory)은 RNN의 변형으로, 장기 의존성(Long-term dependency) 문제를 해결하기 위해 1997년 Hochreiter & Schmidhuber가 제안한 아키텍처입니다. 기존 RNN은 시퀀스가 길어지면 gradient가 소실되어 먼 과거 정보를 학습하지 못했습니다.
핵심 구조: Cell State(장기 기억)와 3개의 Gate(Forget/Input/Output)로 구성됩니다. Forget Gate는 버릴 정보, Input Gate는 새로 저장할 정보, Output Gate는 출력할 정보를 결정합니다. Cell State는 컨베이어 벨트처럼 정보를 거의 손실 없이 전달합니다.
수식: f_t = sigmoid(W_f[h_{t-1}, x_t]), i_t = sigmoid(W_i[h_{t-1}, x_t]), C_t = f_t*C_{t-1} + i_t*tanh(W_c[h_{t-1}, x_t]). 이 게이팅 메커니즘으로 수백 스텝의 장기 의존성도 학습 가능합니다.
현재 상황: Transformer가 대부분의 NLP 태스크에서 LSTM을 대체했지만, 시계열 예측, 센서 데이터, 음성 처리 등 실시간/저지연이 중요한 분야에서는 여전히 활발히 사용됩니다. 파라미터 효율성도 장점입니다.
import torch
import torch.nn as nn
# 1. 기본 LSTM 사용
lstm = nn.LSTM(
input_size=128, # 입력 특성 차원
hidden_size=256, # 은닉 상태 차원
num_layers=2, # LSTM 레이어 수
batch_first=True, # 입력: (batch, seq, feature)
dropout=0.2, # 레이어 간 드롭아웃
bidirectional=True # 양방향 LSTM
)
# 입력: (batch_size, seq_length, input_size)
x = torch.randn(32, 100, 128) # 32개 샘플, 100 스텝, 128 특성
output, (h_n, c_n) = lstm(x)
# output: (32, 100, 512) - 양방향이라 hidden*2
# h_n: (4, 32, 256) - num_layers*2, batch, hidden
# 2. 시계열 예측 모델 (주가 예측 예시)
class StockPredictor(nn.Module):
def __init__(self, input_dim=5, hidden_dim=128, num_layers=2):
super().__init__()
self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers,
batch_first=True, dropout=0.2)
self.fc = nn.Linear(hidden_dim, 1) # 다음 가격 예측
def forward(self, x):
# x: (batch, seq_len, features) - OHLCV 데이터
lstm_out, _ = self.lstm(x)
# 마지막 타임스텝만 사용
last_hidden = lstm_out[:, -1, :]
return self.fc(last_hidden)
model = StockPredictor()
prices = torch.randn(16, 60, 5) # 60일 OHLCV
pred = model(prices) # (16, 1) - 다음날 종가 예측
# 3. GRU와 비교 (더 간단한 구조)
gru = nn.GRU(input_size=128, hidden_size=256, num_layers=2)
# LSTM: 3 gates, GRU: 2 gates - 더 빠르지만 표현력은 LSTM이 높음
"실시간 센서 이상 탐지에 Transformer는 오버스펙입니다. LSTM 2레이어면 100ms 이내 추론 가능하고, 엣지 디바이스에서도 돌아갑니다. 정확도도 97%로 충분해요."
"주가 예측에서 Bidirectional LSTM을 썼는데, 미래 정보가 학습에 새는 data leakage 문제가 있었어요. 시계열은 단방향 LSTM이 맞고, 양방향은 문장 분류 같은 완결된 시퀀스에 적합합니다."
"LSTM vs GRU 비교하면, LSTM이 표현력은 높지만 파라미터가 1.5배 많아요. 실험 결과 우리 데이터셋에서 성능 차이가 1% 미만이라 GRU로 갔습니다. 학습 속도 30% 빨라졌어요."
미래 정보가 학습에 반영되어 과적합됩니다. 예측 태스크에서는 단방향만 사용하세요.
LSTM은 파라미터가 4*hidden^2로 증가. hidden=512면 100만+ 파라미터. 과적합 위험.
시퀀스 길이에 맞게 hidden_size 조절(보통 64~256). Gradient Clipping(max_norm=1.0) 필수. 긴 시퀀스는 Transformer 고려.