🤖 AI/ML

RNN

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)

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"실시간 센서 데이터 분석은 LSTM이 적합해요. Transformer보다 메모리 효율이 좋아서 에지 디바이스에서도 돌릴 수 있습니다."
💬 면접에서
"RNN의 기울기 소실 문제를 LSTM은 Cell State와 Gate 메커니즘으로 해결합니다. Forget Gate가 장기 의존성 학습의 핵심이에요."
💬 기술 토론에서
"GRU는 LSTM보다 파라미터가 적어 학습이 빠르고, 대부분의 태스크에서 비슷한 성능을 냅니다. 리소스 제약이 있다면 GRU를 먼저 시도해보세요."

⚠️ 흔한 실수 & 주의사항

Vanilla RNN 사용: 기본 RNN은 기울기 소실로 긴 시퀀스 학습이 불가능합니다. 항상 LSTM 또는 GRU를 사용하세요.
패딩 처리 미흡: 가변 길이 시퀀스에서 패딩을 무시하지 않으면 성능이 저하됩니다. pack_padded_sequence를 활용하세요.
Gradient Clipping 적용: RNN 계열은 기울기 폭발에 취약합니다. torch.nn.utils.clip_grad_norm_으로 기울기를 제한하세요.

🔗 관련 용어

📚 더 배우기