RNN 인터랙티브 노트
Sutskever's List · Chapter 4 · 2014–2016

딥러닝, 가속하다

AlexNet 이후 순환 신경망(RNN)이 부활한 2년. Karpathy의 블로그가 문을 열었고, Olah가 LSTM을 그림으로 풀었으며, 선택적 드롭아웃이 벽을 부쉈고, Deep Speech 2가 실전에서 증명했다. 이 페이지의 모든 데모는 브라우저에서 직접 실행된다 — 직접 만져보며 읽어보자.

2014.09ZSV, 선택적 드롭아웃
(RNN Regularization)
2014.12Baidu Deep Speech 1
2015.05Karpathy,
"Unreasonable Effectiveness"
2015.08Olah,
"Understanding LSTMs"
2015.12Deep Speech 2 공개
2016MIT TR 10대 혁신 선정
· "인간 수준" 논쟁

4.1RNN의 터무니없는 효과

n-gram은 고정된 창(window) 안의 직전 토큰만 본다. RNN은 여기서 한 걸음 나아가 시퀀스 전체의 압축된 표현(은닉 상태)을 앞으로 실어 나른다. 2015년 5월, Andrej Karpathy는 블로그 The Unreasonable Effectiveness of Recurrent Neural Networks에서 이 아이디어를 수식 대신 생생한 예제와 짧은 코드로 보여줬다. Paul Graham 에세이 1MB로 학습한 문자 단위 모델("char-rnn")이 그럴듯한 스타트업 조언을 흉내 내고, 셰익스피어 희곡의 형식을 모방하고, LaTeX 수식을 거의 문법에 맞게 뱉어냈다. 글은 Hacker News 1위에 올랐고, 공개 코드는 GitHub 별 1만 2천 개를 모았다.

핵심 구조는 단순하다. CNN이 고정 크기 입력 → 고정 크기 출력이라면, RNN은 매 스텝 현재 입력 xt와 이전 은닉 상태 ht−1을 받아 상태를 갱신한다. 같은 계산 유닛이 재귀적으로 적용되므로 길이 제한이 없다.

DEMO 1

루프 펼치기 — 그림 4.1

RNN의 순환 루프는 시간축으로 "펼치면(unroll)" 가중치를 공유하는 체인이 된다. 버튼으로 두 관점을 오가 보자.

루프 형태: 출력이 다시 입력으로 돌아온다.
DEMO 2

은닉 상태가 하는 일 — "hello" 한 글자씩

페이지를 열 때 아주 작은 RNN(은닉 16개)이 "hello" 반복 텍스트로 브라우저에서 실제로 학습됐다. 아래는 그 모델의 실제 확률이다. ◀ ▶로 한 글자씩 진행해 보자.

입력 → 은닉 상태 갱신 → 다음 글자 확률
입력 시퀀스
은닉 상태 ht (16차원, − ↔ +)
다음 글자 예측 P(문자) — ■ 정답 글자
DEMO 3

min-char-rnn 실습 — 브라우저에서 직접 학습

Karpathy의 112줄짜리 min-char-rnn.py를 JavaScript로 옮긴 것이다 (은닉 80, 시퀀스 25, Adagrad — 원본과 같은 구성). ▶를 누르면 아래 텍스트로 문자 단위 언어 모델이 학습되고, 주기적으로 샘플이 생성된다. 처음엔 잡음이지만 수천 이터레이션이면 단어 꼴이 나타난다 — 2015년 개발자들이 열광했던 바로 그 경험이다.

iter 0 smooth loss –
손실 곡선 (낮을수록 좋음)
아직 샘플이 없습니다. ▶ 학습 시작을 누르세요.
원본 파이썬 코드의 핵심 (Karpathy, min-char-rnn.py 발췌)
# forward pass (시퀀스의 각 글자에 대해)
hs[t] = np.tanh(np.dot(Wxh, xs[t]) + np.dot(Whh, hs[t-1]) + bh)  # 은닉 상태
ys[t] = np.dot(Why, hs[t]) + by                    # 다음 글자 로짓
ps[t] = np.exp(ys[t]) / np.sum(np.exp(ys[t]))      # softmax 확률
loss += -np.log(ps[t][targets[t],0])               # cross-entropy

# 샘플링 시 온도 적용: ps = softmax(ys / T)
DEMO 4

온도(Temperature)의 기하학

생성 시 로짓을 T로 나누고 softmax를 취한다. 컨텍스트가 "the startup wa"일 때의 고정 로짓으로 실험해 보자. T가 낮으면 확신에 찬(반복적인) 출력, 높으면 다양하지만 불안정한 출력이 된다.

블로그의 또 다른 유산은 해석이었다. Karpathy는 학습된 RNN의 뉴런 활성을 시각화해, 따옴표 안에서만 켜지는 뉴런, URL을 추적하는 뉴런, 들여쓰기를 세는 뉴런을 찾아냈다 — 약 5%의 셀이 해석 가능한 역할을 스스로 학습한 것이다. 물론 회의론도 있었다. Yoav Goldberg는 평활화하지 않은 n-gram도 비슷한 텍스트를 만든다며 "독자들이 잘못된 이유로 감동했다"고 지적했다. 하지만 Mikolov의 정량적 비교는 RNN이 언어 모델링 퍼플렉시티를 50% 낮추고 음성 인식 오류율(WER)을 18% 줄인다는 것을 보여줬다 — 데이터를 더 줘도 n-gram은 이 격차를 좁히지 못했다. 결과의 유사함이 구조의 동등함은 아니다.

4.2LSTM 이해하기

Karpathy가 RNN이 무엇을 할 수 있는지 보여줬다면, Chris Olah의 Understanding LSTM Networks는 어떻게 하는지를 그림으로 풀었다. 문제의 출발점은 장기 의존성이다. "I grew up in France … I speak fluent ___"에서 빈칸을 맞추려면 멀리 떨어진 "France"를 기억해야 하는데, 보통의 RNN은 간격이 벌어질수록 이 연결을 학습하지 못한다.

이유는 학습 방식에 있다. BPTT(시간 역전파)는 순환 구조를 펼쳐 100 단어 예측을 사실상 100층 네트워크 학습으로 만든다. 기울기는 매 스텝 곱해지며 지수적으로 소멸하거나 폭발한다.

DEMO 5

기울기 소실 탐색기

기울기 크기는 대략 스텝당 계수의 거듭제곱으로 감쇠한다: 바닐라 RNN ≈ γt, LSTM의 셀 상태 경로 ≈ ft (망각 게이트 f가 1에 가까우면 보존). 슬라이더를 움직여 50 스텝 뒤에 학습 신호가 얼마나 남는지 보자. y축은 로그 스케일이다.

바닐라 RNN (γt) LSTM 셀 상태 경로 (ft)

Hochreiter와 Schmidhuber의 LSTM(1997)은 이 문제를 게이트가 달린 덧셈형 경로로 푼다. Olah의 은유로는 공장을 지나는 컨베이어 벨트: 셀 상태 Ct는 거의 변형 없이 여러 스텝을 통과하는 장기 기억이고, 은닉 상태 ht는 매 스텝 갱신되는 단기 기억이다. 세 개의 게이트가 이 흐름을 조절한다.

DEMO 6

LSTM 셀 조작기 — 그림 4.2

게이트 값을 직접 조절하며 Ct = f·Ct−1 + i·C̃ 와 ht = o·tanh(Ct)를 계산해 보자. 선의 굵기가 정보의 흐름 크기다. "스텝 실행"을 누르면 현재 게이트 설정으로 시간이 한 칸 흐른다.

프리셋:
셀 상태 C의 히스토리 (스텝 실행마다 기록):
게이트가 1에 가까우면 정보 그리고 기울기가 여러 스텝을 살아서 통과한다. 곱셈형 게이트 + 덧셈형 갱신 — 이것이 LSTM이 기울기 소실을 이기는 방법이다. "Alice"를 소설 몇 문단 동안 Ct에 담아두고(f≈1), 대명사 "she"를 예측할 때 o로 꺼내 쓰고, 화제가 바뀌면 f로 지우는 식이다.

σ(시그모이드)는 0~1로 얼마나 흐를지를, tanh는 −1~+1로 무슨 내용인지를 맡는다 — 두 활성 함수의 역할 분담이 이 설계의 묘미다. Olah의 글이 특별했던 이유는 새 알고리즘이 아니라 설명 그 자체를 연구 목표로 삼은 점이다. 1997년 원 논문의 회로도("constant-error carousel")가 연구자용 배선도였다면, Olah의 그림은 정보 흐름을 한눈에 보여주는 지도였다. Sutskever's List에 오른 이유도 novelty가 아닌 전달력이다.

4.3순환 신경망 정규화 — 벽을 부순 6쪽짜리 논문

2015년의 열광을 이해하려면 1년 전으로 돌아가야 한다. RNN은 스케일을 키우면 어김없이 과적합했다. 표준 벤치마크 Penn Treebank(PTB)에서 퍼플렉시티 100의 벽은 난공불락처럼 보였다. 퍼플렉시티는 모델이 다음 단어에 얼마나 "놀라는지"의 지표다 — 100이면 매 스텝 약 100지선다 문제를 푸는 셈이고(무작위 추측이면 어휘 크기인 5만), 낮을수록 좋다.

AlexNet의 드롭아웃을 그대로 가져오면 될 것 같지만, 순환 연결에 드롭아웃을 걸면 기억 자체가 파괴된다. 2014년 Zaremba, Sutskever, Vinyals(ZSV)의 통찰은 단순했다: 드롭아웃을 층과 층 사이(비순환 연결)에만 걸고, 시간 방향의 순환 연결은 건드리지 않는다.

DEMO 7

선택적 드롭아웃 시각화

2층 LSTM을 5 스텝 펼친 그림이다. 모드를 바꾸고 "새 마스크"를 눌러 어떤 연결이 끊기는지 보자. 가로 화살표(순환 연결)가 기억의 통로다.

순환 연결(기억, 보존됨) 층간 연결(유지) 드롭된 연결
데이터

PTB 테스트 퍼플렉시티 — 100의 벽이 무너지다

막대에 마우스를 올리면 설명이 보인다. 점선이 오랫동안 깨지지 않던 100의 벽.

드롭아웃 이전 (2012–2014) ZSV 선택적 드롭아웃 (2014) · 낮을수록 좋음 · ⊕ = 앙상블/조합 모델

단일 LSTM(1,500 유닛 × 2층) + 드롭아웃 = 78.4. 10개 RNN을 합친 무거운 앙상블(80)을 모델 하나가 이겼다. 단어 수 3천이 안 되는 6쪽짜리 논문이 만든 결과다.

같은 기법, 네 개의 도메인

언어 모델링 · PTB 퍼플렉시티
114.5 → 78.4 ▼31%
10모델 앙상블 시 69.5
음성 인식 · 아이슬란드어 정확도
68.9 → 70.5%
작은 데이터의 과적합 완화
기계 번역 · WMT En→Fr BLEU
25.9 → 29.03
신경망 번역의 초석
이미지 캡션 · MSCOCO BLEU
24.3
비정규화 앙상블(24.4)과 대등 — 모델 하나로

4.4Deep Speech 2 — RNN의 AlexNet 순간

Baidu의 Deep Speech 2(DS2, 2015)는 발음 사전도, 프레임 단위 정렬도 없이 오디오에서 바로 글자로 가는 엔드투엔드 음성 인식을 대규모로 증명했다. 손으로 만들던 음성학 규칙을 모델이 데이터에서 스스로 내재화한다 — AlexNet이 컴퓨터 비전에서 했던 일 그대로다. 영어 11,940시간 + 중국어 9,400시간의 오디오, 8~16개의 Titan X GPU가 투입됐다.

DEMO 8

DS2 아키텍처 파이프라인 — 그림 4.5

각 단계를 클릭하면 설명이 나온다.

입력: 스펙트로그램 — 시간축(→)에 따른 주파수별 에너지
단계를 클릭해 보세요.
DEMO 9

그리디 vs 빔서치 디코딩

모델이 4글자 단어를 한 글자씩 디코딩하는 장난감 예제다. 확률은 앞 글자에 조건부라서, 매 스텝 최선만 고르는 그리디는 전체 최선을 놓칠 수 있다. 빔 폭을 바꿔 보자. (DS2는 영어 빔 폭 500, 중국어 200 + 외부 언어 모델을 썼다.)

데이터

단어 오류율(WER): DS2 vs 크라우드소싱 인간 — 표 4.1

깨끗한 낭독 음성에선 인간(Mechanical Turk 작업자)을 이겼지만, 소음(CHiME)과 억양(VoxForge) 앞에선 아직이었다. 낮을수록 좋다.

테스트셋DS2인간

※ "인간 수준" 주장은 논쟁적이었다 — 비교 대상이 전문 전사가가 아닌 크라우드 작업자였기 때문. 그럼에도 하나의 아키텍처가 영어와 중국어를 최소한의 수정으로 모두 처리했다.

모델만큼 중요했던 엔지니어링

SortaGrad 커리큘럼
짧은 것부터
첫 에폭은 길이순 정렬 — 초기 학습 안정화
시퀀스 단위 BatchNorm
시간축 정규화
깊은 순환층(최대 7층) 학습 가능하게
커스텀 all-reduce
2.5× 빠른 에폭
GPU 간 직접 통신, 8~16 GPU 동기 학습
FP16 추론
2× 처리량
메모리 절반 — 오늘날 양자화의 선구
배치 디스패치
50–70ms 지연
동시 요청을 묶어 실시간 서비스
데이터 스케일링
10× 데이터 → WER ~40%↓
스케일링 법칙(6장)의 전조

4.5엔지니어링으로의 전환

ICML 2016 리뷰어들은 DS2를 이렇게 평가했다: "대부분의 기법은 이미 시도된 것들이고, 이 논문의 새로움은 방법론적 진보가 아니라 스케일 업과 구현에 있다." 맞는 말이다 — 그리고 바로 그것이 요점이었다. AlexNet도, DS2도, AlphaGo(저자 20명)도 하나의 이론적 돌파가 아니라 알려진 기법들의 집요한 통합으로 판을 바꿨다. LSTM 원 논문의 저자는 2명, DS2는 34명. 분야는 소수 아이디어 중심에서 대규모 협업 엔지니어링으로 옮겨가고 있었다.

Ilya Sutskever에게 AlphaGo는 확신을 굳혀준 사건이었다. 개념적 돌파는 진보의 일부일 뿐, 진짜 진보는 기존 아이디어를 깊이 이해하고, 반복 개선하고, 배포하며, 실험 결과를 치밀하게 분석하는 데서 온다는 것. "배포는 그 자체로 연구 도구다." 이 철학이 OpenAI의 설계 원리가 됐고, Google이 만든 Transformer를 GPT 시리즈로 스케일한 것도 같은 맥락이다.

정리하면 — 선택적 드롭아웃과 DS2가 순환 구조를 승리하게 했고, Karpathy와 Olah가 그것을 읽을 수 있게 만들었다. 하지만 안정화되고 정규화되고 스케일된 뒤에도 RNN은 여전히 과거를 하나의 상태라는 좁은 통로로 실어 날랐다. 다음 장은 그 압력 지점에서 시작한다: 모든 것을 한 상태에 압축하기를 포기하고 시퀀스 전체를 바라보는 것 — 어텐션, 그리고 "순환이 애초에 필요했는가"라는 더 급진적인 질문.

✓이해도 점검 퀴즈

챕터 핵심을 8문제로 확인하자. 답을 고르면 즉시 해설이 보인다. — 0 / 8