RNN은 내부적으로 메모리 기능을 갖추고 있어 과거 데이터를 저장하고 필요에 따라 활용할 수 있다. 또한 이를 통해 시퀀스 내에 패턴을 인식하고 미래를 예측할 수 있다.
예시
- 음성 인식
- 음악 생성기
- 번역기
- 감정 분석
문장:
"나는 오늘 기분이 정말" → 다음에 올 단어를 예측하려면?일반 신경망: "정말"만 보고 예측 → 정보 부족
RNN: "나는 오늘 기분이 정말"까지 순서대로 읽고, 앞 내용을 기억하면서 예측 → "좋다"를 잘 뱉을 수 있음
cnn이 이미지 구역별로 같은 가중치를 공유한다면, RNN은 시간별로 같은 가중치를 공유한다. 즉, 과거와 현재는 같은 가중치를 공유한다.
| CNN | RNN |
|---|---|
| 이미지 처리 특화 | 시퀀스 처리 특화 |
| 공간 정보 (좌우, 위아래) | 시간 정보 (과거 → 현재) |
| 커널을 공간 축에 따라 움직임 | 가중치를 시간 축에 따라 공유함 |
| 이미지 특징 추출 | 문맥, 시계열 패턴 기억 |
RNN의 핵심은 '순환' 구조
-> 이 구조 덕분에 네트워크의 출력이 입력으로 일부 반환되어 과거의 정보를 기억하고 현재의 결정에 활용함

| 구성 요소 | 설명 |
|---|---|
xₜ (주황색 원) | 현재 시점의 입력값 (예: 지금 들어온 단어) |
hₜ₋₁ (왼쪽 초록색 박스) | 이전 시점의 은닉 상태 (= 과거 기억) |
hₜ (가운데 초록색 박스) | 현재 시점의 은닉 상태 = 과거 + 현재 정보를 합친 "업데이트된 기억" |
yₜ (파란색 원) | 현재 시점의 출력값 (예: 예측 결과, 번역된 단어 등) |
Wₓ, Wₕ | 각각 입력 → 은닉 / 이전 은닉 → 현재 은닉으로 가는 가중치 행렬 |
✅ 은닉 상태란?
RNN이 과거의 정보를 기억하기 위해 내부적으로 유지하는 상태
과거 입력들의 “요약된 기억”이다.
📌 정보의 흐름
1.🟠 xₜ (현재 입력)와 🟩 hₜ₋₁ (이전 기억)가 들어옴
2.이 두 값이 각각 Wₓ, Wₕ라는 가중치와 곱해짐
3.계산된 값들이 합쳐져서 → 새로운 은닉 상태 hₜ 생성
4.이 hₜ를 바탕으로 출력값 yₜ이 나감

문장 예시: "The cat sat on"
| 시간 | 입력 xₜ | 은닉 상태 hₜ | 출력 yₜ |
|---|---|---|---|
t-1 | The | hₜ₋₁ | yₜ₋₁ |
t | cat | hₜ | yₜ |
t+1 | sat | hₜ₊₁ | yₜ₊₁ |
t+2 | on | hₜ₊₂ | yₜ₊₂ |
- RNN은 "The" → "cat" → "sat" → "on" 순서로 단어를 입력받음.
- 각 단어가 입력될 때마다 은닉 상태가 업데이트됨.
- 예를 들어 "The" 다음에는 "cat"이 온다는 걸 학습하고,
"on" 다음엔 어떤 단어가 올지 예측하는 모델을 구성하게 됨.
: 여러 시퀀스에서 단일 결과를 출력하는 생성

✅ 언제 쓰일까
텍스트나 시계열 데이터처럼 순서가 중요한 경우
시퀀스 전체를 보고 하나의 결과를 내야 하는 작업에 적합
ex) 입력 문서가 긍정적인지 부정적인지를 판별하는 감성 분류(sentiment classification), 또는 메일이 정상 메일인지 스팸 메일인지 판별하는 스팸 메일 분류(spam detection) 등에 사용
: 입력 시퀀스와 출력 시퀀스 모두를 처리하는 구조

✅ 주요 특징
입력 시퀀스를 순서대로 처리하면서,
출력 시퀀스도 순차적으로 생성
입력-출력 간 복잡한 패턴과 관계 학습 가능
ex) 사용자가 문장을 입력하면 대답 문장을 출력하는 챗봇과 입력 문장으로부터 번역된 문장을 출력하는 번역기, 또는 개체명 인식이나 품사 태깅과 같은 작업이 속한다.
: 하나의 벡터 입력에서 시작해 연속된 출력 시퀀스를 생성하는 구조

✅ 주요 특징
입력 벡터는 상태, 감정, 주제, 스타일 등을 담을 수 있음
출력 시퀀스는 시간 흐름에 따라 한 단계씩 생성
각 출력은 이전 출력에 의존하며 이어짐 (ex. 언어 생성)
ex)
문장 생성: 하나의 감정 벡터 → 감정에 맞는 문장 생성
이미지 캡셔닝: 이미지 특징 벡터 → 설명 문장 시퀀스 출력
음악 생성: 특정 분위기 벡터 → 멜로디 시퀀스 생성
[😄 감정 벡터 X₀]
→ [Y₀: "Today"]
→ [Y₁: "is"]
→ [Y₂: "a"]
→ [Y₃: "beautiful"]
→ [Y₄: "day."]
다음 게시물에서는 RNN을 직접 코드로 구현해보려한다.