Part 5 · Context and Sequential Models - The Limits of RNN
RNN은 왜 긴 문장을 이해하기 어려울까
RNN은 문장을 순서대로 읽으며 앞에서 얻은 정보를 다음 단계로 전달하는 방식으로 문맥을 이해했습니다. 이전 모델보다 훨씬 뛰어난 성능을 보여 주었지만, 문장이 길어질수록 처음에 읽었던 중요한 정보가 점차 희미해지는 문제가 나타났습니다.
또한 모든 단어를 순서대로 처리해야 했기 때문에 긴 문장을 학습하는 데 많은 시간이 필요했고, 병렬 계산도 어려웠습니다. 언어를 더욱 정확하고 효율적으로 이해하기 위해서는 기존과는 다른 접근 방식이 필요하게 되었습니다.
The Original Goal
RNN은 무엇을 해결하려고 등장했을까?
Word2Vec은 단어를 의미 있는 벡터로 표현했지만,
각 단어를 문장 속에서 독립적으로 가져오는 것만으로는
단어의 순서와 앞에서 나온 문맥을 충분히 반영하기 어려웠습니다.
단어 벡터
각 단어의 의미 표현
문장을 순서대로 읽기
첫 토큰부터 마지막 토큰까지
이전 정보 전달
Hidden State
현재 문맥 계산
지금까지 읽은 흐름
예측 수행
분류·생성·번역
RNN의 핵심 목적은
순서가 있는 데이터를 앞에서부터 읽으면서 이전 정보를 다음 계산에 전달하는 것입니다.
Real-World Uses
RNN은 실제로 어디에 사용되었을까?
RNN은 텍스트뿐 아니라 시간 순서가 중요한 음성, 센서 데이터, 시계열 데이터에도 활용되었습니다.
특히 Transformer가 널리 사용되기 전에는 자연어 처리의 대표적인 순차 모델이었습니다.
감성 분석과 문서 분류
문장을 순서대로 읽고 마지막 Hidden State나 출력들을 이용해
문서의 감정이나 범주를 분류했습니다.
The movie was not good
↓
토큰별 Hidden State 계산
↓
부정 감성 예측
언어 모델과 다음 단어 예측
앞에서 읽은 단어를 Hidden State에 반영하고
다음에 등장할 단어나 문자를 예측했습니다.
오늘 날씨가 매우
↓
현재까지의 문맥 계산
↓
좋다 · 춥다 · 맑다 예측
기계번역
Encoder RNN이 입력 문장을 순서대로 읽고,
Decoder RNN이 다른 언어의 문장을 순서대로 생성했습니다.
I love this book
↓
Encoder의 문맥 표현
↓
나는 이 책을 좋아한다
음성 인식
시간 순서대로 들어오는 음성 특징을 처리해
소리의 흐름을 문자나 단어로 변환했습니다.
시간별 음성 신호
↓
순차적 발음 정보 누적
↓
텍스트 출력
챗봇과 대화 모델
사용자 문장을 RNN으로 읽고,
의도를 분류하거나 Decoder RNN으로 응답을 생성했습니다.
사용자 질문
↓
문맥·의도 표현
↓
답변 선택 또는 생성
시계열과 센서 데이터
시간에 따라 변하는 주가, 수요, 기온, 장비 센서 값을
이전 상태와 함께 처리해 다음 값을 예측했습니다.
과거 시간대 데이터
↓
시간 변화 패턴 누적
↓
다음 시점 예측
RNN은 순차 데이터 처리의 중요한 전환점이었습니다.
이전 정보를 다음 계산으로 전달하는 구조 덕분에,
단어를 따로 보는 수준을 넘어 문장의 흐름과 시간 변화를 모델링할 수 있었습니다.
Typical RNN Pipelines
RNN은 작업에 따라 서로 다른 방식으로 사용되었다
Many-to-One
여러 입력을 순서대로 읽고 하나의 결과를 출력합니다.
문장 → 감성 분류
Many-to-Many
입력 시퀀스를 읽고 출력 시퀀스를 만듭니다.
영어 문장 → 한국어 문장
Step-by-Step Prediction
매 시간 단계에서 다음 값이나 다음 토큰을 예측합니다.
이전 단어들 → 다음 단어
RNN은 하나의 특정 작업만 위한 모델이 아니라,
순서가 중요한 입력과 출력을 연결하는 기본 구조로 사용되었습니다.
From Success to Limitation
실제 활용이 늘어나면서 한계도 분명해졌다
RNN이 해결한 문제
단어와 데이터의 순서를 반영
이전 정보를 다음 계산으로 전달
길이가 다른 시퀀스를 처리
분류와 생성 작업에 모두 활용
→
실제 사용에서 드러난 문제
오래된 정보를 유지하기 어려움
기울기 소실과 폭주
긴 문장을 하나의 상태에 압축
순차 계산 때문에 병렬화가 어려움
이제부터 살펴볼 한계는 RNN이 쓸모없었다는 뜻이 아니라,
다양한 실제 작업에 적용하면서 다음 모델이 해결해야 할 문제가 드러났다는 뜻입니다.
Where RNN Works Well
짧은 문장에서는 비교적 잘 작동한다
단순 RNN은 현재 입력과 바로 앞의 문맥이 중요한 짧은 문장에서
충분히 유용한 표현을 만들 수 있습니다.
짧은 의존 관계
The movie was not good처럼
중요한 단어들이 서로 가까이 있으면
not의 영향을 비교적 쉽게 유지할 수 있습니다.
긴 의존 관계
문장 앞부분의 정보가 아주 뒤에서 다시 필요하면,
여러 시간 단계를 거치는 동안 그 정보가 약해질 수 있습니다.
RNN의 핵심 문제는 기억 기능이 없다는 것이 아니라,
중요한 정보를 오랫동안 안정적으로 유지하고 학습하기 어렵다는 점입니다.
Long-Term Dependency
장기 의존성(Long-Term Dependency)이란?
문장 앞부분의 정보가 한참 뒤의 단어나 문장을 이해하는 데 필요한 관계를
장기 의존성이라고 합니다.
철수는 아침에 우산을 들고 집을 나섰다.
그는 버스를 타고 회사에 도착했다.
오전 회의를 마치고 동료들과 점심을 먹었다.
오후에는 보고서를 작성하고 고객에게 전화를 걸었다.
퇴근할 무렵 갑자기 비가 내리기 시작했다.
철수는 비를 맞지 않고 집으로 돌아갈 수 있었을까?
마지막 질문에 답하려면 문장 맨 앞의
‘우산을 들고 나섰다’는 정보를 기억해야 합니다.
중간 문장들은 우산과 직접 관계가 없지만,
RNN은 이 정보를 여러 시간 단계 동안 유지해야 합니다.
필요한 정보가 멀리 떨어져 있을수록,
RNN은 그 관계를 학습하고 유지하기 어려워집니다.
Information Fades
앞쪽 정보는 여러 단계를 지나며 약해질 수 있다
우산
핵심 정보
버스
새 정보 추가
회의
새 정보 추가
점심
초기 정보 약화
보고서
더 약해짐
비
우산 정보 필요
실제 Hidden State에서 특정 단어가 하나씩 지워지는 것은 아닙니다.
새 입력이 계속 반영되면서 초기 정보의 영향이 상대적으로 약해지는 현상을
이해하기 쉽게 표현한 그림입니다.
Vanishing Gradient
기울기 소실: 학습 신호가 너무 작아지는 문제
BPTT에서는 마지막 손실에서 계산한 기울기를 앞쪽 시간 단계로 전달합니다.
이 과정에서 작은 값이 반복해서 곱해지면,
앞쪽에 도달하는 기울기가 매우 작아질 수 있습니다.
설명용 기울기 변화 예시
마지막 단계
1.00
한 단계 이전
0.62
두 단계 이전
0.31
세 단계 이전
0.09
문장 앞부분
0.01
기울기가 너무 작아지면 앞쪽 시간 단계의 Weight는 거의 수정되지 않습니다.
결국 모델은 오래된 정보가 최종 예측에 중요했다는 사실을 배우기 어렵습니다.
위 숫자는 원리를 설명하기 위한 예시입니다.
실제 기울기 변화는 데이터, Weight, 활성화 함수에 따라 달라집니다.
Exploding Gradient
기울기 폭주: 학습 신호가 너무 커지는 문제
반대로 큰 값이 반복해서 곱해지면 기울기가 급격히 커질 수 있습니다.
이를 기울기 폭주(Exploding Gradient)라고 합니다.
설명용 기울기 폭주 예시
마지막 단계
1.0
한 단계 이전
2.4
두 단계 이전
5.7
세 단계 이전
13.9
문장 앞부분
31.6
기울기가 지나치게 커지면 Weight가 한 번에 크게 변하고,
손실이 불안정하게 증가하거나 계산값이 비정상적으로 커질 수 있습니다.
기울기 폭주는 어떻게 완화할까?
대표적으로 Gradient Clipping을 사용합니다.
기울기의 크기가 일정 기준을 넘으면 제한해
한 번의 Weight 갱신이 지나치게 커지지 않도록 합니다.
Fixed-Size State
고정된 크기의 Hidden State에 모든 정보를 압축해야 한다
문장이 길어져도 Hidden State의 차원은 늘어나지 않습니다.
예를 들어 hidden size가 128이면
짧은 문장과 긴 문장 모두 128개의 숫자로 표현해야 합니다.
고정 크기 Hidden State
중요한 정보와 새 정보를 같은 공간에 계속 압축
우산
아침
버스
회사
회의
점심
보고서
비
새로운 정보가 계속 들어오면
앞쪽 정보의 표현이 약해지거나 다른 정보와 섞일 수 있습니다.
이것이 단순 RNN이 긴 문맥을 다루기 어려운 또 하나의 이유입니다.
Sequential Processing
토큰을 하나씩 처리해야 하므로 병렬화가 어렵다
RNN은 현재 Hidden State를 계산하려면
이전 Hidden State가 먼저 계산되어 있어야 합니다.
따라서 시간 단계를 동시에 처리하기 어렵습니다.
x₁ 처리
h₁ 생성
x₂ 처리
h₁ 필요
x₃ 처리
h₂ 필요
x₄ 처리
h₃ 필요
x₅ 처리
h₄ 필요
문장이 길어질수록 처리 단계도 길어지며,
GPU의 병렬 계산 능력을 충분히 활용하기 어렵습니다.
Interactive Memory
문장이 길어질수록 초기 정보가 약해지는 과정
현재 입력
아직 읽지 않음
Hidden State에 남아 있는 설명용 정보
초기 상태
다음 단계를 눌러 새 입력이 들어올수록 초기 정보의 영향이 어떻게 약해지는지 확인하세요.
인터랙티브 예제는 RNN의 내부 벡터를 자연어로 단순화해 표현한 것입니다.
실제 Hidden State는 여러 숫자로 이루어진 벡터입니다.
Why LSTM and GRU?
RNN의 한계를 해결하려는 시도
단순 RNN의 문제를 줄이기 위해
중요한 정보를 선택적으로 유지하고 불필요한 정보를 버리는 구조가 제안되었습니다.
LSTM
입력·망각·출력 게이트와 별도의 Cell State를 사용해
중요한 정보를 더 오래 유지하도록 설계되었습니다.
GRU
LSTM보다 단순한 게이트 구조로
장기 의존성 문제를 완화합니다.
Gradient Clipping
기울기 폭주를 줄이기 위해
기울기의 크기를 제한합니다.
Attention
모든 정보를 하나의 상태에만 압축하지 않고,
필요한 위치의 정보를 직접 참고합니다.
LSTM과 GRU는 RNN을 완전히 다른 방식으로 버린 것이 아니라,
RNN의 순차 처리 구조에 정보 선택 기능을 추가한 모델입니다.
Balanced View
RNN은 쓸모없는 모델이 되었을까?
여전히 유용한 경우
짧은 시퀀스, 작은 모델, 스트리밍 데이터,
순차적으로 입력이 도착하는 환경에서는 RNN 계열이 유용할 수 있습니다.
불리한 경우
매우 긴 문맥, 대규모 병렬 학습,
먼 위치의 정보를 직접 연결해야 하는 작업에서는 한계가 큽니다.
RNN의 한계를 이해하는 목적은 모델을 단순히 낮게 평가하려는 것이 아니라,
실제 감성 분석, 번역, 음성 인식, 챗봇, 시계열 예측에 사용하면서
어떤 문제가 드러났고 이후 Attention과 Transformer가 왜 필요해졌는지 이해하기 위해서입니다.
RNN은 지금도 사용되는가?
그렇습니다. 대규모 자연어 처리에서는 Transformer가 중심이 되었지만,
입력이 실시간으로 한 단계씩 도착하는 스트리밍 환경,
작은 모델이 필요한 임베디드 시스템,
짧은 시계열이나 센서 데이터 처리에서는 RNN 계열이 여전히 사용될 수 있습니다.
Summary
학습 내용 정리
RNN은 순서가 있는 데이터를 읽으면서 이전 정보를 다음 계산에 전달하기 위해 등장했습니다.
RNN은 감성 분석, 문서 분류, 언어 모델, 기계번역, 음성 인식, 챗봇, 시계열 예측 등에 활용되었습니다.
단순 RNN은 짧은 의존 관계는 비교적 잘 처리하지만 긴 의존 관계에는 어려움이 있습니다.
장기 의존성은 문장 앞부분의 정보가 한참 뒤의 예측에 필요한 관계를 뜻합니다.
BPTT에서 기울기가 지나치게 작아지면 앞쪽 Weight가 거의 학습되지 않습니다.
기울기가 지나치게 커지면 Weight 갱신이 불안정해질 수 있습니다.
Hidden State의 크기는 고정되어 있어 긴 문장의 정보를 한 벡터에 계속 압축해야 합니다.
RNN은 이전 상태가 계산되어야 다음 상태를 계산할 수 있어 병렬화가 어렵습니다.
LSTM과 GRU는 중요한 정보를 선택적으로 유지해 장기 의존성 문제를 완화합니다.
Attention은 필요한 위치의 정보를 직접 참고해 하나의 상태에 모든 정보를 압축하는 부담을 줄입니다.