검색
← 모듈 로드맵

순환 신경망(RNN)과 LSTM 직관

강의 · 입문자 · KAITABASE 정리

원제 · Recurrent Neural Networks (D2L 9장 · 10장 참고)

RNN 갱신식 · 기울기 소실 · LSTM 게이트를 손계산으로 익히는 기초 수업

먼저 알아야 할 것

언어 모델과 다음 토큰 예측역전파와 연쇄 법칙tanh · 시그모이드행렬 곱

다루는 내용

글을 한 토큰씩 읽으며 은닉 상태에 요약하는 순환 신경망을 다룹니다. 갱신식과 파라미터 공유를 작은 숫자로 두 걸음 계산하고, 시간 역전파에서 기울기가 사라지거나 폭발하는 이유를 확인합니다. LSTM의 세 게이트와 메모리 셀을 한 걸음 손계산하고, RNN의 한계가 어텐션 · 트랜스포머로 이어지는 흐름을 정리합니다.

해설

순환 신경망(RNN)과 LSTM 직관

순환 신경망(Recurrent Neural Network, RNN) 은 글을 한 토큰씩 읽으며 지금까지 읽은 내용을 은닉 상태(hidden state) 라는 벡터 하나에 계속 덮어써 요약하는 모델입니다. 이 수업에서는 RNN의 갱신식을 손으로 두 걸음 계산하고, 왜 긴 문장에서 기울기가 사라지는지, LSTM의 '게이트'가 그 문제를 어떻게 줄이는지 숫자로 확인합니다. 트랜스포머가 무엇을 해결했는지 이해하려면 꼭 거쳐야 하는 단계입니다.

항목내용
참고 출처Dive into Deep Learning 9.4절 「Recurrent Neural Networks」 · 10.1절 「Long Short-Term Memory (LSTM)」 (rnn, lstm)
트랙 · 수준NLP·트랜스포머 · 기초
이 수업이 다루는 범위은닉 상태 갱신식, 시간 축 펼치기와 파라미터 공유, 문자 단위 언어 모델 예, 시간 역전파(BPTT)와 기울기 소실 · 폭발, LSTM 게이트, GRU 개요

들어가기 전에

한눈에 보기

  • RNN의 갱신식 Ht=ϕ(XtWxh+Ht−1Whh+bh)H_t = \phi(X_t W_{xh} + H_{t-1} W_{hh} + b_h) 의 각 기호를 설명할 수 있습니다.
  • 같은 가중치를 모든 시점에 다시 쓰기 때문에 길이가 늘어도 파라미터 수가 같다는 것을 압니다.
  • 작은 숫자로 은닉 상태를 두 걸음 계산해 봅니다.
  • 긴 문장에서 기울기가 0.5를 수십 번 곱한 것처럼 작아지는(또는 커지는) 이유를 압니다.
  • LSTM의 세 게이트와 메모리 셀이 무엇을 하는지, 한 걸음을 손으로 계산합니다.

1. RNN의 갱신식

직관(해설용 비유). 책을 읽으며 공책 한 쪽에 "지금까지의 줄거리"를 계속 고쳐 쓰는 사람입니다. 새 문장(입력)과 지난 메모(이전 은닉 상태)를 보고 메모를 새로 씁니다. 공책 크기는 정해져 있어서 오래된 내용은 점점 흐려집니다.

단계.

  1. 처음 은닉 상태 H0H_0 를 0으로 둡니다.
  2. 시점 tt 마다 입력 XtX_t(토큰 임베딩)와 이전 상태 Ht−1H_{t-1} 을 각각 가중치와 곱해 더합니다.
  3. 활성화 함수(보통 tanh)를 씌워 새 상태 HtH_t 를 만듭니다.
  4. HtH_t 로 그 시점의 출력(다음 토큰 로짓)을 계산합니다.

D2L의 식(미니배치 표기)은 다음과 같습니다.

Ht=ϕ(XtWxh+Ht−1Whh+bh),Ot=HtWhq+bqH_t = \phi\left(X_t W_{xh} + H_{t-1} W_{hh} + b_h\right), \qquad O_t = H_t W_{hq} + b_q
기호크기뜻
XtX_tn×dn\times d시점 tt 의 입력(nn: 배치 크기, dd: 입력 차원)
HtH_tn×hn\times h시점 tt 의 은닉 상태(hh: 은닉 차원)
WxhW_{xh}d×hd\times h입력 → 은닉 가중치
WhhW_{hh}h×hh\times h은닉 → 은닉 가중치(순환 연결)
bh, bqb_h,\ b_q1×h, 1×q1\times h,\ 1\times q편향
WhqW_{hq}h×qh\times q은닉 → 출력 가중치
OtO_tn×qn\times q출력(분류라면 소프트맥스를 씌워 확률로)
ϕ\phi—활성화 함수(흔히 tanh)

파라미터 공유. D2L이 강조하듯 Wxh,Whh,bh,Whq,bqW_{xh}, W_{hh}, b_h, W_{hq}, b_q 는 모든 시점에서 같은 것 을 다시 씁니다. 그래서 문장이 10토큰이든 1,000토큰이든 파라미터 수가 같습니다.

숫자로 해 보기(해설용, 모든 값을 스칼라로). Wxh=0.5W_{xh}=0.5, Whh=0.8W_{hh}=0.8, bh=0b_h=0, ϕ=tanh⁡\phi=\tanh, 입력 x1=1x_1=1, x2=0.5x_2=0.5, h0=0h_0=0 이라 합시다.

  • t=1t=1: 0.5×1+0.8×0=0.50.5\times1 + 0.8\times0 = 0.5 → h1=tanh⁡(0.5)≈0.462h_1=\tanh(0.5)\approx0.462
  • t=2t=2: 0.5×0.5+0.8×0.462≈0.25+0.370=0.6200.5\times0.5 + 0.8\times0.462 \approx 0.25+0.370 = 0.620 → h2=tanh⁡(0.620)≈0.551h_2=\tanh(0.620)\approx0.551

h2h_2 에는 x2x_2 뿐 아니라 h1h_1 을 통해 x1x_1 의 정보도 섞여 있습니다. 이것이 '기억'입니다.

문자 단위 언어 모델 예(D2L). 입력 "machin", 목표 "achine" 으로 학습하면, 시점 3의 은닉 상태는 'm · a · c' 를 본 상태이고 그 출력은 다음 글자 'h' 를 맞히도록 교차 엔트로피로 학습됩니다. 모든 시점의 손실을 더해 한꺼번에 학습합니다.

mermaid
flowchart LR
  H0[h0 = 0] --> C1((RNN 셀))
  X1[x1 토큰] --> C1
  C1 --> H1[h1]
  H1 --> C2((같은 RNN 셀))
  X2[x2 토큰] --> C2
  C2 --> H2[h2]
  H2 --> C3((같은 RNN 셀))
  X3[x3 토큰] --> C3
  C3 --> H3[h3]
  H1 --> O1[다음 토큰 예측 1]
  H2 --> O2[다음 토큰 예측 2]
  H3 --> O3[다음 토큰 예측 3]

2. 시간 역전파와 기울기 소실 · 폭발

직관. RNN을 시간 축으로 펼치면 "같은 층을 문장 길이만큼 깊게 쌓은 신경망"과 같습니다. 학습은 이 펼친 그래프에 역전파를 하는 것이고, 이를 시간 역전파(Backpropagation Through Time, BPTT) 라고 합니다.

단계. 시점 TT 의 손실이 시점 1의 입력에 대해 갖는 기울기를 구하려면, 연쇄 법칙으로 ∂ht/∂ht−1\partial h_t / \partial h_{t-1} 을 T−1T-1 번 곱해야 합니다.

∂hT∂h1=∏t=2T∂ht∂ht−1,∂ht∂ht−1=tanh⁡′(at) Whh(스칼라일 때)\frac{\partial h_T}{\partial h_1} = \prod_{t=2}^{T}\frac{\partial h_t}{\partial h_{t-1}}, \qquad \frac{\partial h_t}{\partial h_{t-1}} = \tanh'(a_t)\,W_{hh} \quad(\text{스칼라일 때})
기호뜻
ata_ttanh에 들어가기 전 값
tanh⁡′(a)\tanh'(a)1−tanh⁡2(a)1-\tanh^2(a), 항상 0~1

숫자로 해 보기(해설용). 곱해지는 한 항이 늘 0.5 정도라면

  • 10걸음 뒤: 0.510≈0.000980.5^{10}\approx 0.00098
  • 20걸음 뒤: 0.520≈0.000000950.5^{20}\approx 0.00000095

로 사실상 0이 됩니다(기울기 소실, vanishing gradient). 반대로 한 항이 1.1이면 1.120≈6.71.1^{20}\approx6.7 로 커지고, 더 길면 폭발합니다(기울기 폭발, exploding gradient).

결과. 기울기가 사라지면 멀리 떨어진 토큰 사이의 관계(예: 문장 앞의 주어와 끝의 동사 일치)를 배우지 못합니다. 폭발은 보통 기울기의 크기를 일정 값 이하로 자르는 기울기 클리핑(gradient clipping) 으로 막지만, 소실은 구조를 바꿔야 합니다. 그 해답이 LSTM입니다.

3. LSTM: 게이트로 기억을 지키기

직관(해설용 비유). 공책 옆에 따로 보관하는 장부(메모리 셀) 를 두고, 세 명의 문지기가 지킵니다. '잊기 문지기'는 장부에서 무엇을 지울지, '입력 문지기'는 새로 무엇을 적을지, '출력 문지기'는 장부 중 무엇을 지금 꺼내 보여 줄지 정합니다. 장부는 곱하기 대신 더하기 로 고쳐지기 때문에 정보와 기울기가 먼 시점까지 잘 살아남습니다.

D2L 10.1절의 식(σ\sigma: 시그모이드, ⊙\odot: 원소별 곱)입니다. LSTM은 Hochreiter와 Schmidhuber가 1997년에 발표했습니다.

It=σ(XtWxi+Ht−1Whi+bi)입력 게이트Ft=σ(XtWxf+Ht−1Whf+bf)망각 게이트Ot=σ(XtWxo+Ht−1Who+bo)출력 게이트C~t=tanh⁡(XtWxc+Ht−1Whc+bc)새 후보 내용Ct=Ft⊙Ct−1+It⊙C~t메모리 셀 갱신Ht=Ot⊙tanh⁡(Ct)은닉 상태\begin{aligned} I_t &= \sigma(X_t W_{xi} + H_{t-1}W_{hi} + b_i) &&\text{입력 게이트}\\ F_t &= \sigma(X_t W_{xf} + H_{t-1}W_{hf} + b_f) &&\text{망각 게이트}\\ O_t &= \sigma(X_t W_{xo} + H_{t-1}W_{ho} + b_o) &&\text{출력 게이트}\\ \tilde C_t &= \tanh(X_t W_{xc} + H_{t-1}W_{hc} + b_c) &&\text{새 후보 내용}\\ C_t &= F_t \odot C_{t-1} + I_t \odot \tilde C_t &&\text{메모리 셀 갱신}\\ H_t &= O_t \odot \tanh(C_t) &&\text{은닉 상태} \end{aligned}
기호범위뜻
It,Ft,OtI_t, F_t, O_t0~1얼마나 쓰고 · 남기고 · 내보낼지의 비율
C~t\tilde C_t−1~1이번에 새로 적을 후보 내용
CtC_t—메모리 셀(장부)
HtH_t−1~1바깥으로 내보내는 은닉 상태

숫자로 해 보기(해설용, 스칼라 한 걸음). 이전 셀 Ct−1=0.6C_{t-1}=0.6 이고, 게이트에 들어가는 값이 망각 2.0, 입력 0.0, 출력 1.0, 후보 0.5 였다고 합시다.

  • Ft=σ(2.0)≈0.881F_t=\sigma(2.0)\approx0.881, It=σ(0)=0.5I_t=\sigma(0)=0.5, Ot=σ(1.0)≈0.731O_t=\sigma(1.0)\approx0.731, C~t=tanh⁡(0.5)≈0.462\tilde C_t=\tanh(0.5)\approx0.462
  • Ct=0.881×0.6+0.5×0.462≈0.529+0.231=0.760C_t = 0.881\times0.6 + 0.5\times0.462 \approx 0.529 + 0.231 = 0.760
  • Ht=0.731×tanh⁡(0.760)≈0.731×0.641≈0.469H_t = 0.731\times\tanh(0.760)\approx 0.731\times0.641 \approx 0.469

망각 게이트가 0.881이라 예전 내용의 대부분이 남았고, 새 내용이 절반 비율로 더해졌습니다.

왜 기울기가 덜 사라지나. 셀 경로에서 ∂Ct/∂Ct−1=Ft\partial C_t/\partial C_{t-1} = F_t 입니다. 망각 게이트가 1에 가까우면 이 경로의 곱이 거의 1로 유지되어, tanh 미분과 가중치를 매번 곱하던 RNN보다 기울기가 훨씬 멀리 갑니다. 모델이 "이 정보는 오래 기억해야 한다"를 스스로 배워 FtF_t 를 1 가까이 둘 수 있습니다.

대가. 게이트 네 묶음의 가중치가 필요해 파라미터와 계산이 RNN의 약 4배입니다. D2L도 LSTM 같은 순환 모델의 학습 비용이 크다고 정리합니다.

GRU 한 줄. 게이트 순환 유닛(Gated Recurrent Unit, GRU)은 LSTM을 단순화해 메모리 셀을 따로 두지 않고 '리셋 · 업데이트' 두 게이트만 쓰는 구조입니다. 파라미터가 적고 성능은 비슷한 경우가 많습니다(D2L 10.2절).

4. RNN의 한계와 그다음

  • 순차 계산: hth_t 를 구하려면 ht−1h_{t-1} 이 먼저 있어야 해서 시점끼리 병렬 처리가 안 됩니다. GPU를 충분히 쓰기 어렵습니다.
  • 병목: 긴 문장 전체를 고정 크기 벡터 하나에 담아야 합니다. 번역처럼 입력이 길면 앞부분이 흐려집니다.

이 두 문제가 seq2seq → 어텐션의 시작 → 트랜스포머 로 이어지는 흐름의 출발점입니다. D2L의 비교표에 따르면 길이 nn 에서 RNN은 순차 연산이 O(n)O(n), 셀프 어텐션은 O(1)O(1) 입니다.

연습 문제

  1. 입력 차원 d=3d=3, 은닉 h=4h=4, 출력 q=5q=5 인 RNN의 파라미터 수는?
    • 풀이: WxhW_{xh} 12 + WhhW_{hh} 16 + bhb_h 4 + WhqW_{hq} 20 + bqb_q 5 = 57 개입니다.
  2. 같은 d=3,h=4d=3, h=4 에서 LSTM의 게이트 · 후보 부분 파라미터 수는?
    • 풀이: 한 묶음이 12+16+4=3212+16+4=32, 네 묶음이므로 128 개입니다(출력층 제외).
  3. 본문 RNN 예에서 x3=0x_3 = 0 이면 h3h_3 은?
    • 풀이: 0.8×0.551≈0.4410.8\times0.551\approx0.441 → tanh⁡(0.441)≈0.414\tanh(0.441)\approx0.414 입니다. 입력이 없어도 기억이 조금씩 줄며 남습니다.
  4. LSTM에서 Ft=1F_t = 1, It=0I_t = 0 이면 셀은 어떻게 되나요?
    • 풀이: Ct=Ct−1C_t = C_{t-1} — 내용을 그대로 보존합니다.

스스로 점검

  1. RNN이 문장 길이와 상관없이 파라미터 수가 같은 이유는?
    • 답: 모든 시점에서 같은 가중치를 다시 쓰기(파라미터 공유) 때문입니다.
  2. 기울기 소실은 왜 생기나요?
    • 답: 시간 역전파에서 1보다 작은 값(tanh 미분 × 가중치)을 시점 수만큼 곱하기 때문입니다.
  3. LSTM 셀 갱신이 '더하기'인 것이 왜 중요한가요?
    • 답: 셀 경로의 기울기가 망각 게이트 값으로만 곱해져, 게이트가 1에 가까우면 먼 시점까지 기울기와 정보가 유지됩니다.

용어 정리

용어쉬운 뜻
순환 신경망(RNN)이전 상태를 다음 계산에 다시 넣는 신경망
은닉 상태(hidden state)지금까지 읽은 내용을 요약한 벡터
파라미터 공유모든 시점에서 같은 가중치를 쓰는 것
시간 역전파(BPTT)시간 축으로 펼친 RNN에 하는 역전파
기울기 소실 / 폭발기울기가 곱해지며 0에 가까워지거나 너무 커지는 현상
기울기 클리핑기울기 크기를 상한으로 잘라 폭발을 막는 방법
LSTM메모리 셀과 세 게이트를 둔 순환 구조
게이트(gate)0~1 값을 곱해 정보 흐름을 조절하는 장치
메모리 셀(memory cell)LSTM이 정보를 오래 보관하는 내부 상태
GRU게이트 두 개로 단순화한 순환 구조

더 깊이 보려면

다음에 볼 것

라이선스

본문은 KAITABASE 자체 해설입니다. 참고 자료 Dive into Deep Learning은 CC BY-SA 4.0으로 공개되어 있습니다. 가중치 · 입력 숫자는 이 수업을 위해 만든 해설용 예입니다.

출처

AI 원리부터 이해하기 · NLP·트랜스포머 모듈

NLP·트랜스포머 모듈 학습

이 글은 NLP·트랜스포머 모듈의 학습 자료입니다. 전체 23개 자료 중 5번째입니다.

AI 기초 과정은 현재 진도 저장을 지원하지 않습니다.

출처·원문

원문 보기

요약만

본문 자체 작성 · 참고 자료 D2L(CC BY-SA 4.0)