Adventure Time - Finn 3
본문 바로가기
AI/ML

RNN : 순서가 있는 데이터를 처리하는 신경망

by hyun9_9 2026. 4. 2.

지금까지 배운 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의 기반이 되는 중요한 개념입니다. 🚀