지금까지 배운 CNN은 이미지처럼 공간적 구조가 있는 데이터를 잘 처리합니다.
하지만 순서가 중요한 데이터, 예를 들어 문장이나 음성은 CNN으로 처리하기 어렵습니다.
이런 데이터를 처리하기 위해 등장한 것이 RNN(Recurrent Neural Network, 순환 신경망) 입니다.
RNN이 필요한 이유
아래 문장을 보면:
"나는 한국에서 태어났고, ... 나는 ( )어를 유창하게 한다"
빈칸에 들어갈 말은 앞에서 나온 "한국" 이라는 정보가 있어야 "한국" 이라고 예측할 수 있습니다.
이처럼 이전 데이터가 현재 데이터의 이해에 영향을 주는 데이터를 시퀀스 데이터(Sequence Data) 라고 합니다.
시퀀스 데이터의 예:
- 음성 인식 : 앞 단어를 알아야 뒷 단어를 이해할 수 있음
- 자연어 처리 : 문장의 앞부분이 뒷부분의 의미에 영향을 줌
- 주가 예측 : 이전 날의 주가가 다음 날 주가에 영향을 줌
기존 Neural Network는 각 입력을 독립적으로 처리하기 때문에 이런 순서 정보를 기억하지 못합니다.
RNN은 과거의 정보를 기억하는 구조로 이 문제를 해결합니다.
RNN의 구조와 동작 원리
RNN의 핵심은 이전 단계의 정보(State)를 다음 단계로 전달하는 것입니다.
┌─────┐ ┌─────┐ ┌─────┐
h(t-1) → │ RNN │ → h(t) → │ RNN │ → h(t+1)→│ RNN │ → h(t+2)
│ cell│ │ cell│ │ cell│
└──┬──┘ └──┬──┘ └──┬──┘
↑ ↑ ↑
x(t) x(t+1) x(t+2)
- x(t) : 현재 시점의 입력값
- h(t) : 현재 시점의 상태(State), 과거 정보를 담고 있음
- 현재의 입력값 x(t) 와 이전 상태 h(t-1) 를 함께 사용해 현재 상태 h(t) 를 계산합니다
수식으로 표현하면:
h(t) = tanh(W * x(t) + U * h(t-1) + b)
- W : 입력값에 대한 가중치
- U : 이전 상태에 대한 가중치
- tanh : RNN에서 사용하는 활성화 함수 (출력 범위 -1 ~ 1)
가중치 공유
모든 RNN 셀은 동일한 가중치(W, U, b)를 공유합니다.
시퀀스가 아무리 길어도 학습할 파라미터 수가 늘어나지 않는 이유입니다.
예제 : Character-level Language Model
"hello" 라는 단어를 학습해 다음 글자를 예측하는 모델로 RNN을 이해해보겠습니다.
Step 1 : One-Hot Encoding
먼저 각 글자를 벡터로 변환합니다.
사용 글자 : h, e, l, o
h → [1, 0, 0, 0]
e → [0, 1, 0, 0]
l → [0, 0, 1, 0]
o → [0, 0, 0, 1]
Step 2 : 순차적으로 입력 및 예측
입력 : h → e → l → l
예측 : e → l → l → o
x(0)=h → [RNN] → h(0) → 예측: e ✅
x(1)=e → [RNN] → h(1) → 예측: l ✅
x(2)=l → [RNN] → h(2) → 예측: l ✅
x(3)=l → [RNN] → h(3) → 예측: o ✅
각 시점에서 현재 글자를 입력받고 다음 글자를 예측합니다.
예측값은 Softmax 를 통해 각 글자의 확률로 변환됩니다.
다양한 활용 구조
RNN은 입력과 출력의 수에 따라 다양한 형태로 활용됩니다.
One-to-Many : 하나의 입력 → 여러 출력
이미지 → [RNN] → "고양이가 소파에 앉아 있다"
- 이미지 캡셔닝 : 이미지 하나를 입력받아 설명 문장을 생성
Many-to-One : 여러 입력 → 하나의 출력
"이 영화 정말 재밌었어요" → [RNN] → 긍정 😊
"별로였어요" → [RNN] → 부정 😞
- 감성 분석 : 텍스트를 입력받아 감정(긍정/부정) 결과 출력
Many-to-Many : 여러 입력 → 여러 출력
"How are you?" → [RNN] → "잘 지내시나요?"
- 기계 번역 : 입력 문장을 다른 언어로 번역
- 챗봇 : 대화 입력을 받아 응답 생성
기본 RNN의 한계
기본적인 RNN(Vanilla RNN)에는 한 가지 큰 문제가 있습니다.
시퀀스가 길어질수록 앞부분의 정보가 점점 희미해져 장기 의존성(Long-term Dependency) 을 잘 처리하지 못합니다.
이것은 CNN에서 배운 Vanishing Gradient 문제와 유사합니다.
역전파 시 Gradient가 시간을 거슬러 전파되면서 점점 작아지기 때문입니다.
"나는 한국에서 태어났고, 어렸을 때부터 ... 나는 ( )어를 유창하게 한다"
↑ ↑
멀리 떨어진 정보 여기서 필요한데
(Gradient가 거의 0이 되어 전달 안됨)
이 문제를 해결하기 위해 더 발전된 모델들이 등장했습니다.
모델 특징
| Vanilla RNN | 기본 RNN, 장기 의존성 문제 있음 |
| LSTM | 장기 기억과 단기 기억을 분리해 장기 의존성 문제 해결 |
| GRU | LSTM을 간소화한 버전, 적은 파라미터로 비슷한 성능 |
전체 흐름 정리
시퀀스 데이터 입력 (텍스트, 음성 등)
↓
One-Hot Encoding
↓
h(t) = tanh(W * x(t) + U * h(t-1) + b)
(현재 입력 + 이전 상태 → 현재 상태)
↓
Softmax → 다음 값 예측
↓
Cross-Entropy Loss
↓
Backpropagation Through Time (BPTT)
↓
W, U, b 업데이트
정리
개념 설명
| 시퀀스 데이터 | 순서가 중요한 데이터 (텍스트, 음성, 주가 등) |
| State h(t) | 현재 시점의 상태, 과거 정보를 담고 있음 |
| 가중치 공유 | 모든 시점에서 동일한 W, U, b 사용 |
| tanh | RNN에서 사용하는 활성화 함수 |
| One-to-Many | 이미지 캡셔닝 |
| Many-to-One | 감성 분석 |
| Many-to-Many | 기계 번역, 챗봇 |
| LSTM / GRU | Vanilla RNN의 장기 의존성 문제를 해결한 발전된 모델 |
RNN은 텍스트, 음성, 시계열 데이터를 처리하는 핵심 구조이며, 이후 등장하는 Transformer와 LLM의 기반이 되는 중요한 개념입니다. 🚀
'AI > ML' 카테고리의 다른 글
| CNN으로 MNIST 손글씨 분류하기 (TensorFlow) (0) | 2026.03.29 |
|---|---|
| CNN : Convolutional Neural Network (0) | 2026.03.29 |
| Dropout : 과적합을 막는 정규화 기법 (0) | 2026.03.25 |
| Weight Initialization : 웨이트 초기화의 중요성 (0) | 2026.03.25 |
| ReLU로 MNIST 손글씨 분류하기 (TensorFlow) (0) | 2026.03.23 |