Part 5 · Context and Sequential Models - How RNN Remembers

RNN은 이전 정보를 어떻게 기억할까

RNN은 문장을 읽을 때마다 현재 단어뿐 아니라 이전 단계에서 만들어진 Hidden State도 함께 사용합니다. 새로운 정보와 이전 정보를 결합해 다음 Hidden State를 만들고, 이 과정을 문장의 끝까지 반복합니다. Hidden State는 문장을 읽으면서 계속 업데이트되는 메모장과 같습니다. 덕분에 앞에서 읽은 정보가 뒤에 나오는 단어를 이해하는 데 활용될 수 있습니다.

Hidden State

앞에서 읽은 정보는 어디에 저장될까?

RNN은 문장을 한 토큰씩 읽으면서, 지금까지 처리한 내용을 다음 단계에서도 사용할 수 있도록 내부 상태에 담아 둡니다.

오늘은 문장 주제 형성
비가 날씨 정보 추가
많이 정도 정보 추가
온다 관계 완성
문장 표현 누적된 상태
사람이 이해하기 위한 설명

‘오늘의 날씨에 관한 문장이고, 비의 양이 많다’와 같은 흐름이 다음 단어를 해석하는 데 사용됩니다.

RNN 내부의 실제 표현

이러한 정보는 문장 그대로 저장되지 않고, 여러 숫자로 이루어진 벡터에 압축되어 전달됩니다.

0.21 -0.44 0.73 0.18 ...
RNN이 지금까지 읽은 정보를 압축해 저장하고 다음 단계로 전달하는 벡터를 Hidden State(은닉 상태)라고 합니다.
Why “Hidden”?

Hidden State에서 Hidden은 무슨 뜻일까?

비밀 정보라는 뜻은 아니다

Hidden은 정보를 감추거나 암호화한다는 의미가 아닙니다.

신경망 내부에서 계산되는 상태

입력 데이터처럼 외부에서 직접 주어지는 값이 아니라, 신경망 내부 계산을 통해 만들어지고 전달되기 때문에 Hidden State라고 부릅니다.

Hidden State는 앞에서 읽은 내용을 압축한 RNN 내부의 작업 상태입니다.
RNN Cell

RNN Cell은 무엇을 하는가?

RNN Cell에는 두 종류의 정보가 들어갑니다. 하나는 현재 토큰의 임베딩 벡터 xₜ이고, 다른 하나는 앞 단계까지의 정보를 담은 Hidden State hₜ₋₁입니다. RNN Cell은 두 벡터를 함께 계산해 현재 토큰까지 반영한 새 Hidden State hₜ를 만듭니다.

현재 입력

xₜ
예: ‘비가’의 임베딩 벡터

RNN Cell 내부 계산

① 현재 입력에 가중치 적용
Wₓₕxₜ
② 이전 상태에 가중치 적용
Wₕₕhₜ₋₁
③ 두 결과와 편향을 더함
Wₓₕxₜ + Wₕₕhₜ₋₁ + bₕ
④ 활성화 함수로 새 상태 생성
tanh(...)
현재 입력과 이전 문맥을 결합한다
현재 입력 xₜ현재 시간 단계에서 읽는 토큰의 임베딩 벡터입니다. 토큰 문자열이나 Token ID가 직접 들어가는 것이 아닙니다.
이전 상태 hₜ₋₁현재 토큰보다 앞에서 처리한 정보를 압축한 벡터입니다. 이전 문장이 그대로 저장된 값은 아닙니다.
가중치 행렬현재 입력과 이전 상태에서 어떤 특징을 얼마나 반영할지 학습합니다. 같은 가중치가 모든 시간 단계에서 반복 사용됩니다.
새 상태 hₜ현재 입력까지 반영한 내부 상태입니다. 다음 시간 단계로 전달되며 필요하면 출력 계산에도 사용됩니다.
RNN Cell의 핵심은 현재 입력 xₜ와 이전 상태 hₜ₋₁를 모두 받아 새 상태 hₜ를 계산하는 것입니다.
One Step at a Time

RNN Cell은 어떻게 동작할까?

문장 오늘은 비가 온다에서 두 번째 토큰인 비가를 처리하는 순간을 살펴보겠습니다. 이 단계에서 RNN Cell은 이전 상태 h₁과 현재 입력 x₂를 함께 사용해 새로운 상태 h₂를 계산합니다.

1

이전 Hidden State를 가져옵니다.

첫 번째 토큰 오늘은까지 처리한 상태 h₁을 가져옵니다. 이 벡터에는 ‘오늘에 관한 문장이 시작되었다’는 흐름이 반영되어 있습니다.

2

현재 입력 벡터를 준비합니다.

비가의 Token ID로 Embedding Lookup을 수행해 현재 입력 벡터 x₂를 얻습니다.

3

현재 입력과 이전 상태에 각각 가중치를 적용합니다.

x₂에는 입력 가중치 Wₓₕ를, h₁에는 순환 가중치 Wₕₕ를 적용합니다. 두 벡터에서 새 상태 계산에 필요한 특징을 변환하는 과정입니다.

4

새로운 Hidden State를 생성합니다.

계산 결과를 활성화 함수에 통과시켜 h₂를 만듭니다. 이 상태에는 ‘오늘의 날씨이며 비가 중심 대상’이라는 흐름이 반영될 수 있습니다.

자연어 설명은 이해를 돕기 위한 해석입니다. 실제 Hidden State에는 문장이 그대로 저장되는 것이 아니라 학습된 숫자 패턴이 저장됩니다.
Unrolled RNN

RNN을 시간 방향으로 펼쳐 보기

하나의 RNN Cell이 문장 속 각 토큰에 반복해서 적용되는 과정을 시간 방향으로 펼치면 다음과 같이 표현할 수 있습니다.

t = 1
오늘은
RNN Cell
h₁
오늘에 관한 문장
t = 2
비가
같은 RNN Cell
h₂
오늘의 날씨
t = 3
많이
같은 RNN Cell
h₃
비의 양이 많음
t = 4
온다
같은 RNN Cell
h₄
문장 의미 완성
그림에는 RNN Cell이 여러 개 있는 것처럼 보이지만, 실제로는 같은 RNN Cell과 같은 가중치를 모든 시간 단계에서 공유합니다.
각 시간 단계에서는 입력 토큰과 Hidden State의 값이 달라지지만, 사용되는 가중치 Wₓₕ, Wₕₕ, 편향 bₕ는 같습니다. 이 가중치 공유 덕분에 하나의 RNN이 길이가 다른 문장에도 적용될 수 있습니다.
Time Step

시간 단계(Time Step)란?

자연어 처리에서 시간 단계는 실제 시계의 초나 분을 뜻하지 않습니다. 문장 속 토큰을 처리하는 순서상의 위치를 의미합니다.

시간 단계 현재 토큰 현재 입력 생성되는 상태
t = 1 오늘은 x₁ h₁
t = 2 비가 x₂ h₂
t = 3 많이 x₃ h₃
t = 4 온다 x₄ h₄
한 토큰을 처리할 때마다 시간 단계가 하나씩 증가하며, 첨자 t는 벡터의 차원이 아니라 처리 순서를 나타냅니다.
Symbols

xₜ, hₜ₋₁, hₜ 기호 이해하기

기호 의미 예시
xₜ 현재 시간 단계의 입력 벡터 x₂ = ‘비가’의 임베딩 벡터
hₜ₋₁ 이전 시간 단계의 Hidden State h₁ = ‘오늘은’까지 처리한 상태
hₜ 현재 입력까지 반영한 새 Hidden State h₂ = ‘오늘은 비가’까지 처리한 상태
현재 상태 hₜ는 현재 입력 xₜ와 이전 상태 hₜ₋₁를 함께 사용해 계산됩니다.
Vector Shapes

입력 벡터와 Hidden State의 크기는 같아야 할까?

현재 입력 xₜ와 Hidden State hₜ₋₁는 서로 다른 종류의 벡터이므로 크기가 같을 필요는 없습니다. 가중치 행렬이 각 벡터를 새 Hidden State의 크기에 맞게 변환합니다.

입력 벡터 xₜ

임베딩 차원에 따라 크기가 결정됩니다. 임베딩 차원이 300이면 xₜ는 300개의 숫자로 구성됩니다.

Hidden State hₜ

RNN의 hidden size에 따라 크기가 결정됩니다. hidden size가 128이면 모든 hₜ는 128개의 숫자로 구성됩니다.

Wₓₕ는 입력 벡터를 Hidden State 공간으로 변환하고, Wₕₕ는 이전 Hidden State를 같은 공간에서 변환합니다. 그래서 두 결과를 더할 수 있습니다.
RNN Equation

RNN의 기본 계산식

단순 RNN의 Hidden State는 대표적으로 다음과 같은 형태로 계산할 수 있습니다.

hₜ = tanh(Wₓₕxₜ + Wₕₕhₜ₋₁ + bₕ)
Wₓₕxₜ현재 입력 벡터에 입력 가중치를 적용한 결과입니다. 현재 토큰에서 어떤 특징을 반영할지 학습합니다.
Wₕₕhₜ₋₁이전 Hidden State에 순환 가중치를 적용한 결과입니다. 과거 정보 중 무엇을 현재 계산에 반영할지 학습합니다.
bₕ와 tanh(...)편향을 더한 뒤 비선형 활성화 함수를 통과시켜 새로운 Hidden State hₜ를 만듭니다.
수식의 핵심은 현재 입력과 이전 상태에 각각 가중치를 적용하고 합친 뒤, 활성화 함수를 통해 새 상태를 만든다는 것입니다.
왜 tanh를 사용할까?
tanh는 출력값을 대체로 -1과 1 사이로 제한하고, 입력과 이전 상태 사이의 비선형 관계를 표현할 수 있게 합니다. 여기서는 기본적인 단순 RNN의 대표 예를 사용한 것입니다.
Initial State

첫 번째 Hidden State는 어디에서 시작할까?

첫 번째 토큰을 읽기 전에는 이전 시간 단계가 없습니다. 따라서 일반적인 입문 예제에서는 초기 Hidden State를 0으로 채운 벡터로 시작합니다.

초기 상태 h₀ = [0, 0, 0, ...]
첫 입력 x₁
RNN Cell 계산 tanh(Wₓₕx₁ + Wₕₕh₀ + bₕ)
첫 상태 h₁
다음 단계 h₁ + x₂
실제 구현에서는 초기 상태를 학습 가능한 값으로 두거나, 다른 신경망에서 전달받은 상태를 사용할 수도 있습니다. 기본 원리를 설명할 때는 0벡터로 시작한다고 이해하면 충분합니다.
Hidden State and Output

Hidden State와 Output은 같은가?

Hidden State

지금까지 읽은 정보를 내부적으로 압축한 상태입니다. 다음 시간 단계로 전달됩니다.

Output

감성 분류, 다음 단어 예측, 번역 결과처럼 모델이 외부로 내보내는 값을 뜻합니다.

구분 역할 예시
Hidden State 문맥 정보를 유지하고 다음 단계로 전달 hₜ
Output 작업 목적에 맞는 최종 결과 계산 긍정·부정 확률, 다음 토큰 확률
단순한 구조에서는 Hidden State를 출력 계산에 바로 사용할 수 있지만, 개념적으로 내부 상태와 외부 출력은 역할이 다릅니다.
Interactive RNN Cell

시간 단계별 Hidden State 갱신 과정

이전 Hidden State

h₀ = 초기 상태
+

현재 입력

아직 입력 없음
xₜ
토큰의 임베딩 벡터
→

RNN Cell

Wₓₕxₜ
Wₕₕhₜ₋₁
합산 + 편향 + tanh
→

새 Hidden State

아직 계산하지 않음
다음 시간 단계를 눌러 Hidden State가 어떻게 갱신되는지 확인하세요.
화면의 상태 설명은 이해를 돕기 위한 자연어 해석입니다. 실제 Hidden State는 정해진 차원의 숫자 벡터입니다.
Common Misunderstandings

Hidden State를 이해할 때 자주 생기는 오해

문장 전체가 그대로 저장되는가?

아닙니다. 제한된 길이의 벡터에 필요한 정보가 압축되어 저장됩니다.

토큰마다 다른 RNN Cell을 사용하는가?

아닙니다. 하나의 셀과 동일한 가중치를 모든 시간 단계에서 반복해서 사용합니다.

문장이 길어지면 상태 벡터도 계속 커지는가?

아닙니다. 문장 길이와 관계없이 Hidden State의 차원은 고정되어 있습니다.

과거 정보를 완벽히 보존하는가?

아닙니다. 제한된 크기의 상태에 정보를 압축하므로 오래된 정보가 약해지거나 사라질 수 있습니다.

Hidden State의 크기는 무엇을 의미할까?
Hidden State의 크기는 한 상태 벡터에 포함된 숫자의 개수입니다. 예를 들어 크기가 128이면 모든 시간 단계의 hₜ는 128개의 숫자로 구성됩니다. 문장이 길어져도 상태 벡터의 길이는 128로 유지됩니다.
같은 단어는 항상 같은 Hidden State를 만드는가?
아닙니다. 현재 입력이 같더라도 이전 Hidden State가 다르면 새 Hidden State도 달라질 수 있습니다. 따라서 같은 단어도 앞에서 어떤 문맥이 이어졌는지에 따라 서로 다른 상태를 만듭니다.
From Forward Pass to Learning

RNN은 어떤 상태를 만들어야 하는지 어떻게 배울까?

RNN은 같은 셀과 가중치를 반복해서 사용하며 각 시간 단계의 Hidden State를 계산합니다. 하지만 처음부터 어떤 정보를 유지하고 버려야 하는지 알고 있는 것은 아닙니다.

모델은 예측 결과를 정답과 비교해 손실을 계산하고, 그 오류를 문장의 뒤쪽에서 앞쪽 시간 단계로 전달하면서 가중치를 조정합니다.

순전파 Hidden State 계산
예측 출력 생성
손실 정답과 비교
역전파 시간 방향으로 전달
가중치 갱신 오류 감소
문장의 마지막에서 계산된 오류가 앞쪽 시간 단계의 계산까지 어떻게 전달되는지가 BPTT(Backpropagation Through Time)의 핵심입니다.
Summary

학습 내용 정리

  • Hidden State는 RNN이 지금까지 읽은 정보를 압축해 저장하는 내부 벡터입니다.
  • RNN Cell은 현재 토큰의 임베딩 벡터 xₜ와 이전 상태 hₜ₋₁를 모두 입력으로 받아 새 상태 hₜ를 계산합니다.
  • 입력 가중치 Wₓₕ와 순환 가중치 Wₕₕ는 두 벡터를 같은 Hidden State 공간으로 변환합니다.
  • 새 Hidden State는 다음 시간 단계로 전달되어 이후 입력을 해석하는 데 사용됩니다.
  • 같은 RNN Cell과 같은 가중치가 모든 시간 단계에서 공유됩니다.
  • 시간 단계는 실제 시간이 아니라 토큰을 처리하는 순서를 뜻합니다.
  • 첫 번째 토큰 앞에서는 보통 0벡터인 h₀에서 시작합니다.
  • Hidden State는 내부 문맥 정보이고, Output은 작업 목적에 맞는 외부 결과입니다.
  • Hidden State는 고정된 차원의 벡터이므로 모든 과거 정보를 완벽히 보존하지는 못합니다.
  • RNN의 가중치는 손실과 BPTT를 통해 학습됩니다.