AlexNet 이후 순환 신경망(RNN)이 부활한 2년. Karpathy의 블로그가 문을 열었고, Olah가 LSTM을 그림으로 풀었으며, 선택적 드롭아웃이 벽을 부쉈고, Deep Speech 2가 실전에서 증명했다. 이 페이지의 모든 데모는 브라우저에서 직접 실행된다 — 직접 만져보며 읽어보자.
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을 받아 상태를 갱신한다. 같은 계산 유닛이 재귀적으로 적용되므로 길이 제한이 없다.
RNN의 순환 루프는 시간축으로 "펼치면(unroll)" 가중치를 공유하는 체인이 된다. 버튼으로 두 관점을 오가 보자.
페이지를 열 때 아주 작은 RNN(은닉 16개)이 "hello" 반복 텍스트로 브라우저에서 실제로 학습됐다. 아래는 그 모델의 실제 확률이다. ◀ ▶로 한 글자씩 진행해 보자.
Karpathy의 112줄짜리 min-char-rnn.py를 JavaScript로 옮긴 것이다 (은닉 80, 시퀀스 25, Adagrad — 원본과 같은 구성). ▶를 누르면 아래 텍스트로 문자 단위 언어 모델이 학습되고, 주기적으로 샘플이 생성된다. 처음엔 잡음이지만 수천 이터레이션이면 단어 꼴이 나타난다 — 2015년 개발자들이 열광했던 바로 그 경험이다.
아직 샘플이 없습니다. ▶ 학습 시작을 누르세요.
# 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)
생성 시 로짓을 T로 나누고 softmax를 취한다. 컨텍스트가 "the startup wa"일 때의 고정 로짓으로 실험해 보자. T가 낮으면 확신에 찬(반복적인) 출력, 높으면 다양하지만 불안정한 출력이 된다.
블로그의 또 다른 유산은 해석이었다. Karpathy는 학습된 RNN의 뉴런 활성을 시각화해, 따옴표 안에서만 켜지는 뉴런, URL을 추적하는 뉴런, 들여쓰기를 세는 뉴런을 찾아냈다 — 약 5%의 셀이 해석 가능한 역할을 스스로 학습한 것이다. 물론 회의론도 있었다. Yoav Goldberg는 평활화하지 않은 n-gram도 비슷한 텍스트를 만든다며 "독자들이 잘못된 이유로 감동했다"고 지적했다. 하지만 Mikolov의 정량적 비교는 RNN이 언어 모델링 퍼플렉시티를 50% 낮추고 음성 인식 오류율(WER)을 18% 줄인다는 것을 보여줬다 — 데이터를 더 줘도 n-gram은 이 격차를 좁히지 못했다. 결과의 유사함이 구조의 동등함은 아니다.
Karpathy가 RNN이 무엇을 할 수 있는지 보여줬다면, Chris Olah의 Understanding LSTM Networks는 어떻게 하는지를 그림으로 풀었다. 문제의 출발점은 장기 의존성이다. "I grew up in France … I speak fluent ___"에서 빈칸을 맞추려면 멀리 떨어진 "France"를 기억해야 하는데, 보통의 RNN은 간격이 벌어질수록 이 연결을 학습하지 못한다.
이유는 학습 방식에 있다. BPTT(시간 역전파)는 순환 구조를 펼쳐 100 단어 예측을 사실상 100층 네트워크 학습으로 만든다. 기울기는 매 스텝 곱해지며 지수적으로 소멸하거나 폭발한다.
기울기 크기는 대략 스텝당 계수의 거듭제곱으로 감쇠한다: 바닐라 RNN ≈ γt, LSTM의 셀 상태 경로 ≈ ft (망각 게이트 f가 1에 가까우면 보존). 슬라이더를 움직여 50 스텝 뒤에 학습 신호가 얼마나 남는지 보자. y축은 로그 스케일이다.
Hochreiter와 Schmidhuber의 LSTM(1997)은 이 문제를 게이트가 달린 덧셈형 경로로 푼다. Olah의 은유로는 공장을 지나는 컨베이어 벨트: 셀 상태 Ct는 거의 변형 없이 여러 스텝을 통과하는 장기 기억이고, 은닉 상태 ht는 매 스텝 갱신되는 단기 기억이다. 세 개의 게이트가 이 흐름을 조절한다.
게이트 값을 직접 조절하며 Ct = f·Ct−1 + i·C̃ 와 ht = o·tanh(Ct)를 계산해 보자. 선의 굵기가 정보의 흐름 크기다. "스텝 실행"을 누르면 현재 게이트 설정으로 시간이 한 칸 흐른다.
σ(시그모이드)는 0~1로 얼마나 흐를지를, tanh는 −1~+1로 무슨 내용인지를 맡는다 — 두 활성 함수의 역할 분담이 이 설계의 묘미다. Olah의 글이 특별했던 이유는 새 알고리즘이 아니라 설명 그 자체를 연구 목표로 삼은 점이다. 1997년 원 논문의 회로도("constant-error carousel")가 연구자용 배선도였다면, Olah의 그림은 정보 흐름을 한눈에 보여주는 지도였다. Sutskever's List에 오른 이유도 novelty가 아닌 전달력이다.
2015년의 열광을 이해하려면 1년 전으로 돌아가야 한다. RNN은 스케일을 키우면 어김없이 과적합했다. 표준 벤치마크 Penn Treebank(PTB)에서 퍼플렉시티 100의 벽은 난공불락처럼 보였다. 퍼플렉시티는 모델이 다음 단어에 얼마나 "놀라는지"의 지표다 — 100이면 매 스텝 약 100지선다 문제를 푸는 셈이고(무작위 추측이면 어휘 크기인 5만), 낮을수록 좋다.
AlexNet의 드롭아웃을 그대로 가져오면 될 것 같지만, 순환 연결에 드롭아웃을 걸면 기억 자체가 파괴된다. 2014년 Zaremba, Sutskever, Vinyals(ZSV)의 통찰은 단순했다: 드롭아웃을 층과 층 사이(비순환 연결)에만 걸고, 시간 방향의 순환 연결은 건드리지 않는다.
2층 LSTM을 5 스텝 펼친 그림이다. 모드를 바꾸고 "새 마스크"를 눌러 어떤 연결이 끊기는지 보자. 가로 화살표(순환 연결)가 기억의 통로다.
막대에 마우스를 올리면 설명이 보인다. 점선이 오랫동안 깨지지 않던 100의 벽.
단일 LSTM(1,500 유닛 × 2층) + 드롭아웃 = 78.4. 10개 RNN을 합친 무거운 앙상블(80)을 모델 하나가 이겼다. 단어 수 3천이 안 되는 6쪽짜리 논문이 만든 결과다.
Baidu의 Deep Speech 2(DS2, 2015)는 발음 사전도, 프레임 단위 정렬도 없이 오디오에서 바로 글자로 가는 엔드투엔드 음성 인식을 대규모로 증명했다. 손으로 만들던 음성학 규칙을 모델이 데이터에서 스스로 내재화한다 — AlexNet이 컴퓨터 비전에서 했던 일 그대로다. 영어 11,940시간 + 중국어 9,400시간의 오디오, 8~16개의 Titan X GPU가 투입됐다.
각 단계를 클릭하면 설명이 나온다.
모델이 4글자 단어를 한 글자씩 디코딩하는 장난감 예제다. 확률은 앞 글자에 조건부라서, 매 스텝 최선만 고르는 그리디는 전체 최선을 놓칠 수 있다. 빔 폭을 바꿔 보자. (DS2는 영어 빔 폭 500, 중국어 200 + 외부 언어 모델을 썼다.)
깨끗한 낭독 음성에선 인간(Mechanical Turk 작업자)을 이겼지만, 소음(CHiME)과 억양(VoxForge) 앞에선 아직이었다. 낮을수록 좋다.
| 테스트셋 | DS2 | 인간 |
|---|
※ "인간 수준" 주장은 논쟁적이었다 — 비교 대상이 전문 전사가가 아닌 크라우드 작업자였기 때문. 그럼에도 하나의 아키텍처가 영어와 중국어를 최소한의 수정으로 모두 처리했다.
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