앞에서 읽은 정보는 어디에 저장될까?
RNN은 문장을 한 토큰씩 읽으면서, 지금까지 처리한 내용을 다음 단계에서도 사용할 수 있도록 내부 상태에 담아 둡니다.
‘오늘의 날씨에 관한 문장이고, 비의 양이 많다’와 같은 흐름이 다음 단어를 해석하는 데 사용됩니다.
이러한 정보는 문장 그대로 저장되지 않고, 여러 숫자로 이루어진 벡터에 압축되어 전달됩니다.
Hidden State에서 Hidden은 무슨 뜻일까?
Hidden은 정보를 감추거나 암호화한다는 의미가 아닙니다.
입력 데이터처럼 외부에서 직접 주어지는 값이 아니라, 신경망 내부 계산을 통해 만들어지고 전달되기 때문에 Hidden State라고 부릅니다.
RNN Cell은 무엇을 하는가?
RNN Cell에는 두 종류의 정보가 들어갑니다.
하나는 현재 토큰의 임베딩 벡터 xₜ이고,
다른 하나는 앞 단계까지의 정보를 담은 Hidden State hₜ₋₁입니다.
RNN Cell은 두 벡터를 함께 계산해 현재 토큰까지 반영한 새 Hidden State hₜ를 만듭니다.
이전 Hidden State
hₜ₋₁
현재 입력
xₜ
RNN Cell 내부 계산
WₓₕxₜWₕₕhₜ₋₁Wₓₕxₜ + Wₕₕhₜ₋₁ + bₕtanh(...)새 Hidden State
hₜ
xₜ현재 시간 단계에서 읽는 토큰의 임베딩 벡터입니다. 토큰 문자열이나 Token ID가 직접 들어가는 것이 아닙니다.hₜ₋₁현재 토큰보다 앞에서 처리한 정보를 압축한 벡터입니다. 이전 문장이 그대로 저장된 값은 아닙니다.hₜ현재 입력까지 반영한 내부 상태입니다. 다음 시간 단계로 전달되며 필요하면 출력 계산에도 사용됩니다.xₜ와 이전 상태 hₜ₋₁를 모두 받아 새 상태 hₜ를 계산하는 것입니다.RNN Cell은 어떻게 동작할까?
문장 오늘은 비가 온다에서 두 번째 토큰인 비가를 처리하는 순간을 살펴보겠습니다.
이 단계에서 RNN Cell은 이전 상태 h₁과 현재 입력 x₂를 함께 사용해 새로운 상태 h₂를 계산합니다.
이전 Hidden State를 가져옵니다.
첫 번째 토큰 오늘은까지 처리한 상태 h₁을 가져옵니다.
이 벡터에는 ‘오늘에 관한 문장이 시작되었다’는 흐름이 반영되어 있습니다.
현재 입력 벡터를 준비합니다.
비가의 Token ID로 Embedding Lookup을 수행해
현재 입력 벡터 x₂를 얻습니다.
현재 입력과 이전 상태에 각각 가중치를 적용합니다.
x₂에는 입력 가중치 Wₓₕ를, h₁에는 순환 가중치 Wₕₕ를 적용합니다. 두 벡터에서 새 상태 계산에 필요한 특징을 변환하는 과정입니다.
새로운 Hidden State를 생성합니다.
계산 결과를 활성화 함수에 통과시켜
h₂를 만듭니다.
이 상태에는 ‘오늘의 날씨이며 비가 중심 대상’이라는 흐름이 반영될 수 있습니다.
RNN을 시간 방향으로 펼쳐 보기
하나의 RNN Cell이 문장 속 각 토큰에 반복해서 적용되는 과정을 시간 방향으로 펼치면 다음과 같이 표현할 수 있습니다.
오늘에 관한 문장
오늘의 날씨
비의 양이 많음
문장 의미 완성
Wₓₕ, Wₕₕ, 편향 bₕ는 같습니다. 이 가중치 공유 덕분에 하나의 RNN이 길이가 다른 문장에도 적용될 수 있습니다.시간 단계(Time Step)란?
자연어 처리에서 시간 단계는 실제 시계의 초나 분을 뜻하지 않습니다. 문장 속 토큰을 처리하는 순서상의 위치를 의미합니다.
| 시간 단계 | 현재 토큰 | 현재 입력 | 생성되는 상태 |
|---|---|---|---|
t = 1 |
오늘은 | x₁ |
h₁ |
t = 2 |
비가 | x₂ |
h₂ |
t = 3 |
많이 | x₃ |
h₃ |
t = 4 |
온다 | x₄ |
h₄ |
t는 벡터의 차원이 아니라 처리 순서를 나타냅니다.
xₜ, hₜ₋₁, hₜ 기호 이해하기
| 기호 | 의미 | 예시 |
|---|---|---|
xₜ |
현재 시간 단계의 입력 벡터 | x₂ = ‘비가’의 임베딩 벡터 |
hₜ₋₁ |
이전 시간 단계의 Hidden State | h₁ = ‘오늘은’까지 처리한 상태 |
hₜ |
현재 입력까지 반영한 새 Hidden State | h₂ = ‘오늘은 비가’까지 처리한 상태 |
hₜ는
현재 입력 xₜ와 이전 상태 hₜ₋₁를 함께 사용해 계산됩니다.
입력 벡터와 Hidden State의 크기는 같아야 할까?
현재 입력 xₜ와 Hidden State hₜ₋₁는 서로 다른 종류의 벡터이므로 크기가 같을 필요는 없습니다. 가중치 행렬이 각 벡터를 새 Hidden State의 크기에 맞게 변환합니다.
xₜ임베딩 차원에 따라 크기가 결정됩니다. 임베딩 차원이 300이면 xₜ는 300개의 숫자로 구성됩니다.
hₜRNN의 hidden size에 따라 크기가 결정됩니다. hidden size가 128이면 모든 hₜ는 128개의 숫자로 구성됩니다.
Wₓₕ는 입력 벡터를 Hidden State 공간으로 변환하고, Wₕₕ는 이전 Hidden State를 같은 공간에서 변환합니다. 그래서 두 결과를 더할 수 있습니다.RNN의 기본 계산식
단순 RNN의 Hidden State는 대표적으로 다음과 같은 형태로 계산할 수 있습니다.
Wₓₕxₜ현재 입력 벡터에 입력 가중치를 적용한 결과입니다. 현재 토큰에서 어떤 특징을 반영할지 학습합니다.Wₕₕhₜ₋₁이전 Hidden State에 순환 가중치를 적용한 결과입니다. 과거 정보 중 무엇을 현재 계산에 반영할지 학습합니다.bₕ와 tanh(...)편향을 더한 뒤 비선형 활성화 함수를 통과시켜 새로운 Hidden State hₜ를 만듭니다.왜 tanh를 사용할까?
첫 번째 Hidden State는 어디에서 시작할까?
첫 번째 토큰을 읽기 전에는 이전 시간 단계가 없습니다. 따라서 일반적인 입문 예제에서는 초기 Hidden State를 0으로 채운 벡터로 시작합니다.
h₀ = [0, 0, 0, ...]
x₁
tanh(Wₓₕx₁ + Wₕₕh₀ + bₕ)
h₁
h₁ + x₂
Hidden State와 Output은 같은가?
지금까지 읽은 정보를 내부적으로 압축한 상태입니다. 다음 시간 단계로 전달됩니다.
감성 분류, 다음 단어 예측, 번역 결과처럼 모델이 외부로 내보내는 값을 뜻합니다.
| 구분 | 역할 | 예시 |
|---|---|---|
| Hidden State | 문맥 정보를 유지하고 다음 단계로 전달 | hₜ |
| Output | 작업 목적에 맞는 최종 결과 계산 | 긍정·부정 확률, 다음 토큰 확률 |
시간 단계별 Hidden State 갱신 과정
이전 Hidden State
현재 입력
RNN Cell
새 Hidden State
Hidden State를 이해할 때 자주 생기는 오해
아닙니다. 제한된 길이의 벡터에 필요한 정보가 압축되어 저장됩니다.
아닙니다. 하나의 셀과 동일한 가중치를 모든 시간 단계에서 반복해서 사용합니다.
아닙니다. 문장 길이와 관계없이 Hidden State의 차원은 고정되어 있습니다.
아닙니다. 제한된 크기의 상태에 정보를 압축하므로 오래된 정보가 약해지거나 사라질 수 있습니다.
Hidden State의 크기는 무엇을 의미할까?
hₜ는 128개의 숫자로 구성됩니다.
문장이 길어져도 상태 벡터의 길이는 128로 유지됩니다.
같은 단어는 항상 같은 Hidden State를 만드는가?
RNN은 어떤 상태를 만들어야 하는지 어떻게 배울까?
RNN은 같은 셀과 가중치를 반복해서 사용하며 각 시간 단계의 Hidden State를 계산합니다. 하지만 처음부터 어떤 정보를 유지하고 버려야 하는지 알고 있는 것은 아닙니다.
모델은 예측 결과를 정답과 비교해 손실을 계산하고, 그 오류를 문장의 뒤쪽에서 앞쪽 시간 단계로 전달하면서 가중치를 조정합니다.
학습 내용 정리
- 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를 통해 학습됩니다.