RNN
Recurrent Neural Network
순환 신경망. 시퀀스 데이터 처리에 특화. LSTM, GRU가 대표적. Transformer 이전 NLP의 주류.
Recurrent Neural Network
순환 신경망. 시퀀스 데이터 처리에 특화. LSTM, GRU가 대표적. Transformer 이전 NLP의 주류.
RNN(Recurrent Neural Network, 순환 신경망)은 시퀀스 데이터를 처리하기 위해 설계된 신경망 아키텍처입니다. 이전 시점의 정보를 "기억"하여 현재 시점의 출력에 활용하는 순환 구조가 특징이며, 자연어 처리, 음성 인식, 시계열 예측 등에 널리 사용됩니다.
RNN은 1986년 David Rumelhart에 의해 제안되었으며, 1990년대 LSTM의 등장으로 실용화되었습니다. 기존 피드포워드 네트워크는 고정 길이 입력만 처리할 수 있었지만, RNN은 가변 길이 시퀀스를 처리할 수 있어 자연어와 시계열 분야에서 혁신을 가져왔습니다.
RNN의 핵심 원리는 "은닉 상태(Hidden State)"의 순환입니다. 각 시점에서 입력과 이전 은닉 상태를 결합하여 새로운 은닉 상태를 계산합니다. 그러나 긴 시퀀스에서 기울기 소실/폭발 문제가 발생하여, 이를 해결한 LSTM(Long Short-Term Memory)과 GRU(Gated Recurrent Unit)가 표준으로 자리잡았습니다.
2017년 Transformer의 등장 이후 NLP 분야에서 RNN의 사용은 줄었지만, 실시간 스트리밍 데이터, 에지 디바이스 등 메모리 효율이 중요한 환경에서는 여전히 활용됩니다. RNN의 순환 개념은 현대 State Space Model(Mamba 등)에도 영향을 주고 있습니다.
PyTorch를 활용한 LSTM 기반 시퀀스 분류 예제입니다.
import torch
import torch.nn as nn
class LSTMClassifier(nn.Module):
"""LSTM 기반 텍스트 분류 모델"""
def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.lstm = nn.LSTM(
embed_dim,
hidden_dim,
num_layers=2,
batch_first=True,
dropout=0.3,
bidirectional=True # 양방향 LSTM
)
self.fc = nn.Linear(hidden_dim * 2, num_classes) # 양방향이므로 *2
def forward(self, x):
# x: (batch, seq_len)
embedded = self.embedding(x) # (batch, seq_len, embed_dim)
lstm_out, (hidden, cell) = self.lstm(embedded)
# 마지막 시점의 은닉 상태 사용 (양방향 결합)
hidden = torch.cat((hidden[-2], hidden[-1]), dim=1)
output = self.fc(hidden)
return output
# 모델 초기화
model = LSTMClassifier(vocab_size=10000, embed_dim=128, hidden_dim=256, num_classes=3)
# 예시 입력
x = torch.randint(0, 10000, (32, 50)) # (batch=32, seq_len=50)
output = model(x)
print(f"출력 shape: {output.shape}") # (32, 3)