순환 신경망 (Recurrent Neural Network)
- RNN은 시퀀스(Sequence) 데이터를 처리하기 위한 인공 신경망이다.
- 입력과 출력 모두 시퀀스 구조인 자연어 처리, 번역, 챗봇 등에 적합하다.
- 일반적인 신경망과 달리, 이전 시점의 출력을 현재 시점의 입력으로 사용한다.
- 대표적인 시퀀스 모델에는 RNN 외에도 LSTM, GRU 등이 있다.
RNN 계열 모델 정리 (Vanilla RNN / LSTM / BiLSTM / RNN Language Model)
📌 Vanilla RNN (Simple RNN)
✅ 개요
- 시퀀스 데이터를 시간 흐름에 따라 처리하는 가장 기본적인 순환 신경망.
- 과거 정보를 은닉 상태로 저장하여 다음 시점에 전달.
✅ 수식
- 은닉 상태 계산
ht=tanh(Wxxt+Whht−1+b)
- 출력 계산
yt=f(Wyht+b)
✅ 특징
- 모든 시점에서 같은 가중치 사용
- 단순하고 빠르지만 기울기 소실 문제 발생 → 긴 문장 기억 어려움
✅ code
rnn = SimpleRNN(3, return_sequences=True) # 은닉 상태 크기가 3인 RNN을 정의함
hidden_states = rnn(train_X) # 입력 데이터를 모델에 통과시켜 시점별 은닉 상태 출력
print('hidden states : {}, shape: {}'.format(hidden_states, hidden_states.shape))
SimpleRNN(3) → 은닉 상태 차원이 3
return_sequences=True → 시점마다 은닉 상태 전부 출력
hidden_states.shape → (배치 크기, 시점 수, 은닉 상태 크기)
- 예: (1, 4, 3) → 1개의 시퀀스, 4개의 시점, 각 시점마다 3차원 은닉 상태
📌 LSTM (Long Short-Term Memory)
✅ 개요
- Vanilla RNN의 단점을 해결하기 위한 구조
- 셀 상태와 3가지 게이트 (입력, 삭제, 출력)를 이용하여 중요한 정보만 기억하거나 잊음
✅ 구성 요소와 수식
- 입력 게이트
it=σ(Wxixt+Whiht−1+bi) gt=tanh(Wxgxt+Whght−1+bg)
- 삭제 게이트
ft=σ(Wxfxt+Whfht−1+bf)
- 셀 상태 업데이트
Ct=ft∘Ct−1+it∘gt
- 출력 게이트 및 은닉 상태
ot=σ(Wxoxt+Whoht−1+bo) ht=ot∘tanh(Ct)
✅ 특징
- 긴 시퀀스에서의 기억 유지 능력 우수
- 계산 복잡도는 증가하지만 성능 향상
✅ code
lstm = LSTM(3, return_sequences=True, return_state=True)
hidden_states, last_hidden_state, last_cell_state = lstm(train_X)
print('hidden states : {}, shape: {}'.format(hidden_states, hidden_states.shape))
print('last hidden state : {}, shape: {}'.format(last_hidden_state, last_hidden_state.shape))
print('last cell state : {}, shape: {}'.format(last_cell_state, last_cell_state.shape))
LSTM(3) → 은닉 상태(hidden state)와 셀 상태(cell state) 차원 = 3
return_state=True → 마지막 은닉 상태와 셀 상태도 함께 출력
hidden_states.shape → (배치, 시점, 은닉 상태 크기) → 예: (1, 4, 3)
last_hidden_state.shape → 마지막 시점의 은닉 상태 → 예: (1, 3)
last_cell_state.shape → 마지막 시점의 셀 상태 → 예: (1, 3)
📌 BiLSTM (Bidirectional LSTM)
✅ 개요
- 양방향 RNN 구조로, 입력 시퀀스를 정방향과 역방향 모두 학습
- 현재 시점의 출력을 예측할 때 과거와 미래 정보 모두 사용
✅ 구조 설명
- 정방향 LSTM: 앞에서 뒤로
- 역방향 LSTM: 뒤에서 앞으로
- 두 출력 벡터를 concat 또는 sum하여 최종 출력 생성
✅ 특징
- 자연어의 문맥 정보 이해에 탁월
- 예: 품사 태깅, 개체명 인식 등에서 효과적
📌 RNN Language Model (RNNLM)
✅ 개요
- RNN을 기반으로 한 언어 모델
- 단어 시퀀스를 입력으로 받고 다음 단어를 예측
✅ 특징
- 입력 길이 제한 없음 → n-gram 모델의 단점 보완
- 문장의 의미 흐름을 시점 기반으로 처리 가능
✅ 예시
- 입력: "The fat cat"
- 출력: "sat"
📊 요약 비교
| 모델 | 기억 능력 | 게이트 구조 | 방향성 | 특징 |
|---|
| Vanilla RNN | 짧은 기억 | 없음 | 단방향 | 단순, 빠름, 기울기 소실 |
| LSTM | 장기 기억 | 입력/삭제/출력 | 단방향 | 긴 문맥 처리 우수 |
| BiLSTM | 장기 기억 | 동일 (LSTM) | 양방향 | 문맥 이해 극대화 |
| RNNLM | - | RNN 기반 | 단방향 | 언어 모델에 사용 |
점검 퀴즈
RNN을 제대로 이해했는지 퀴즈를 통해서 확인해보세요! 모델에 대한 설명이 다음과 같을 때, 총 파라미터 개수를 구해보세요.
- Embedding을 사용하며, 단어 집합(Vocabulary)의 크기가 5,000이고 임베딩 벡터의 차원은 100입니다.
- 은닉층에서는 Simple RNN을 사용하며, 은닉 상태의 크기는 128입니다.
- 훈련에 사용하는 모든 샘플의 길이는 30으로 가정합니다.
- 이진 분류를 수행하는 모델로, 출력층의 뉴런은 1개로 시그모이드 함수를 사용합니다.
- 은닉층은 1개입니다.

자세한 코드는 깃허브