메모리 증강 신경망 · Graves, Wayne & Danihelka (2014)

Neural Turing Machine — 미분 가능한 컴퓨터

LSTM은 기억을 은닉 상태 안에 섞어 둡니다. 더 많이 기억하게 하려면 망 전체를 키워야 하고, 파라미터는 그 제곱으로 늘어납니다. NTM은 기억을 망 밖의 행렬로 꺼냈습니다. 신경망은 CPU처럼 “어디를 읽고 어디에 쓸지”만 정하고, 그 주소 지정을 전부 부드러운 가중치로 만들어 경사 하강으로 학습할 수 있게 했습니다. 이 페이지는 논문 3절의 수식 (1)~(9)를 하나씩 브라우저에서 돌려 보고, 마지막에 그 수식만으로 배선한 NTM이 수열을 복사하게 만듭니다.

1. 기억을 망 밖으로 꺼낸 이유

논문은 컴퓨터 프로그램이 쓰는 세 가지 장치로 시작합니다. 기본 연산, 분기, 그리고 읽고 쓸 수 있는 외부 메모리입니다. RNN은 이론상 튜링 완전하지만1(Siegelmann & Sontag, 1995) 저자들의 표현대로 “원리상 가능한 것이 실제로 쉬운 것은 아닙니다.” LSTM은 기억과 계산이 같은 은닉 벡터에 들어 있어서, 기억할 칸을 늘리려면 계산 장치까지 같이 키워야 합니다.

NTM은 이 둘을 분리합니다. 컨트롤러(보통의 신경망)는 입력을 받아 출력을 내고, 동시에 헤드라고 부르는 몇 개의 출력으로 N × M 크기의 메모리 행렬을 읽고 씁니다. 논문 4.6절은 이 분리의 효과를 한 문장으로 적습니다. LSTM의 파라미터는 은닉 유닛 수의 제곱으로 늘지만, NTM의 파라미터는 메모리 칸 수가 늘어도 그대로입니다.

입력 xt→컨트롤러→출력 yt·읽기 헤드 ⇄ 메모리 Mt ⇄ 쓰기 헤드

데모 1 · 기억할 숫자를 늘리면 파라미터는?

LSTM은 3층(논문 표 3과 같은 구성)이고 셀 상태 3h개를 “기억 칸”으로 셉니다. 파라미터는 peephole·skip 연결을 뺀 표준 LSTM 식으로 계산했습니다(입력 9, 출력 8 — 복사 과제 기준). NTM은 메모리 폭 M = 20을 두고 칸 수 N만 늘리며, 컨트롤러는 논문 표 1의 복사 과제 설정(17,162개)을 그대로 씁니다.

슬라이더를 768에 두면 LSTM은 h = 256, 즉 논문의 복사 과제용 LSTM(3 × 256)과 같은 크기가 됩니다. 이 식으로 계산하면 약 132만 개이고 논문 표 3의 값은 1,352,969개입니다(차이 2%는 peephole과 층 사이 skip 연결 몫). 같은 과제에서 NTM은 128 × 20 = 2,560칸짜리 메모리를 쓰면서도 파라미터가 17,162개, 79분의 1입니다.

2. 흐릿한 읽기

보통 컴퓨터의 메모리 읽기는 주소 하나를 고릅니다. 그런데 신경망이 내놓는 값은 3.0, 3.01 같은 실수라서, 칸 하나를 고르려면 반올림을 해야 합니다. 학습은 “출력을 조금 바꾸면 결과가 얼마나 바뀌나”(미분)를 보고 움직이는데, 반올림은 3에서 3.01로 바꿔도 여전히 3번 칸이라 그 답이 0입니다. 3.5를 넘는 순간에는 4번 칸으로 뚝 끊깁니다. 이렇게 되면 기울기가 “어느 쪽 칸으로 가야 나아지는지”를 알려 주지 못합니다. NTM은 칸 하나를 고르는 대신 모든 칸에 가중치를 나눠 주고 가중 평균을 읽습니다.

$$\sum_i w_t(i) = 1,\quad 0 \le w_t(i) \le 1 \qquad\qquad r_t \leftarrow \sum_i w_t(i)\,M_t(i)$$ 식 (1), (2). Mt(i)는 메모리의 i번째 행(길이 M), wt는 N칸에 대한 가중치, rt는 읽기 벡터. 논문 표현으로 rt는 메모리 행들의 볼록 결합이고, 메모리와 가중치 양쪽에 대해 미분 가능합니다.

데모 2 · 초점을 연속으로 움직여 읽기

6 × 5 메모리입니다. 초점 위치를 정수 사이로 움직여 보세요. 가중치는 초점 주위의 종 모양(폭 σ)이고, 아래 그래프는 읽기 벡터의 첫 성분 r[0]이 초점 위치에 따라 어떻게 변하는지 보여 줍니다. 회색 계단은 “가장 가까운 정수 칸 하나만 읽는” 보통의 주소입니다.

흐릿한 읽기 r[0]정수 주소 하나

파란 곡선은 끊김 없이 이어지고, 회색 계단은 평평하다가 갑자기 뜁니다. 경사 하강은 “주소를 조금 바꾸면 결과가 얼마나 바뀌는가”를 물어서 움직이는데, 계단 위에서는 그 답이 거의 어디서나 0입니다. 흐릿한 읽기는 그 질문에 답을 줍니다. 가중치 w(i)를 조금 바꿨을 때 r이 변하는 양은 정확히 M(i)이고(\(\partial r / \partial w(i) = M(i)\)), 모든 칸이 기울기를 받습니다. σ를 0.05까지 줄이면 파란 곡선도 계단에 가까워지는 것도 확인해 보세요. 흐림은 미분 가능성의 대가이자 조건입니다.

3. 쓰기 = 지우기 + 더하기

쓰기는 LSTM의 망각 게이트와 입력 게이트를 본떠 두 단계로 나뉩니다. 쓰기 헤드는 가중치 wt와 함께 지우기 벡터 et(성분이 모두 0~1)와 더하기 벡터 at를 냅니다.

$$\tilde M_t(i) \leftarrow M_{t-1}(i)\,\big[\mathbf{1} - w_t(i)\,e_t\big] \qquad\qquad M_t(i) \leftarrow \tilde M_t(i) + w_t(i)\,a_t$$ 식 (3), (4). 곱은 성분별. 어떤 칸의 값이 완전히 0으로 지워지려면 그 칸의 가중치와 그 성분의 지우기 값이 둘 다 1이어야 합니다. 쓰기 헤드가 여럿이면 지우기끼리, 더하기끼리는 순서가 상관없습니다(곱셈과 덧셈은 교환 가능).

데모 3 · 한 번 쓰고, 또 쓰기

더하기 벡터는 a = [0.9, 0.1, 0.9, 0.1, 0.9]로 고정입니다. 왼쪽은 현재 메모리, 오른쪽은 “쓰기 실행”을 누르면 될 결과입니다. 바뀐 칸은 오른쪽에 테두리가 생깁니다.

지금
쓰기 후

세 가지 경우를 눌러 보면 쓰기의 성격이 드러납니다.

4. 주소 지정 파이프라인 (그림 2)

읽기와 쓰기는 가중치 wt만 있으면 됩니다. 그러면 wt는 어디서 오나요? 각 헤드는 컨트롤러로부터 다섯 가지 값을 받아 네 단계를 거쳐 가중치를 만듭니다. 논문 그림 2의 순서 그대로입니다.

kt, βt→ ① 내용 →wc→ ② 보간 gt →wg→ ③ 이동 st →w̃→ ④ 샤프닝 γt →wt

① 내용으로 찾기

$$w^c_t(i) \leftarrow \frac{\exp\!\big(\beta_t\,K[k_t, M_t(i)]\big)}{\sum_j \exp\!\big(\beta_t\,K[k_t, M_t(j)]\big)},\qquad K[u,v] = \frac{u\cdot v}{\lVert u\rVert\,\lVert v\rVert}$$ 식 (5), (6). 키 kt와 각 칸의 코사인 유사도를 βt배 해서 softmax. β는 초점의 선명도입니다. 컨트롤러는 찾는 값을 대충만 내면 되고, 정확한 값은 메모리가 돌려줍니다.

② 보간: 새로 찾을까, 하던 곳에서 이어 갈까

$$w^g_t \leftarrow g_t\,w^c_t + (1-g_t)\,w_{t-1}$$ 식 (7). g = 1이면 내용 주소만, g = 0이면 직전 스텝의 가중치를 그대로 가져옵니다.

③ 순환 이동

$$\tilde w_t(i) \leftarrow \sum_{j=0}^{N-1} w^g_t(j)\,s_t(i-j) \pmod N$$ 식 (8). st는 허용된 정수 이동(여기서는 −1, 0, +1)에 대한 분포. 이동 분포로 가중치를 원형 합성곱합니다.

④ 샤프닝

$$w_t(i) \leftarrow \frac{\tilde w_t(i)^{\gamma_t}}{\sum_j \tilde w_t(j)^{\gamma_t}},\qquad \gamma_t \ge 1$$ 식 (9). 큰 값은 더 크게, 작은 값은 더 작게. 왜 필요한지는 5절에서 봅니다.

데모 4 · 네 단계를 한 번에 조작하기

8칸 × 6차원 메모리(성분 −1~1). 키는 “찾을 칸”의 내용에 잡음을 섞어 만듭니다. 직전 가중치 wt−1은 한 칸에 몰려 있다고 둡니다. 아래 버튼은 논문이 말하는 세 가지 사용 모드입니다.

몇 가지를 해 보면 각 단계의 역할이 분명해집니다.

논문은 위치 주소가 엄밀히 말해 꼭 필요하지는 않다고 인정합니다. 메모리 내용에 위치 정보를 넣어 두면 내용 주소만으로도 흉내 낼 수 있으니까요. 그런데도 둘 다 둔 이유는 실험에서 위치 주소를 기본 연산으로 제공하는 것이 일반화에 결정적이었기 때문입니다.

5. 번짐과 샤프닝

이동 분포가 완벽하게 한 점에 몰려 있지 않으면 문제가 생깁니다. 논문의 예를 그대로 쓰면, s = (0.1, 0.8, 0.1)로 한 번 합성곱하면 한 칸에 몰렸던 초점이 세 칸으로 퍼집니다. 이것을 매 스텝 반복하면 퍼짐이 쌓입니다. 합성곱을 T번 하면 분산이 T배가 되기 때문에, 봉우리 높이는 대략 \(1/\sqrt{T}\)로 줄어듭니다.

데모 5 · 같은 이동을 40번 반복하기

24칸, 시작은 2번 칸에 가중치 1. 매 스텝 이동 분포로 합성곱합니다. 왼쪽은 샤프닝 없이(γ = 1), 오른쪽은 매 스텝 γ로 샤프닝합니다. 세로축이 시간(위→아래), 가로축이 메모리 칸입니다.

γ = 1 봉우리샤프닝한 봉우리

논문 예에서 샤프닝이 없으면 40스텝 뒤 봉우리가 0.14로 내려앉고, γ = 2만 줘도 0.96에서 버팁니다. 논문은 복사 과제 해석에서 “샤프닝(식 9)이 없었다면 가중치가 시간이 지나며 정밀도를 잃었을 것”이라고 적습니다.

그런데 세 번째 버튼(분수 이동 0.7)은 샤프닝의 부작용을 보여 줍니다. 4.3.2절에는 컨트롤러가 이동량을 실수 하나로 내는 변형도 소개되는데, 6.7이면 s(6) = 0.3, s(7) = 0.7입니다. γ = 1이면 초점의 무게중심이 정확히 스텝당 0.7칸씩 가지만, 샤프닝을 걸면 매 스텝 더 큰 쪽(+1)으로 끌려가서 γ = 3이면 40스텝에 36칸(스텝당 0.9칸), γ를 더 올리면 스텝당 1칸에 다가갑니다. 샤프닝은 흐림을 막는 대신 연속적인 값을 정수 쪽으로 끌어당깁니다.

6. 수식만으로 배선한 NTM이 복사하기

논문 4.1절 복사 과제는 8비트 무작위 벡터 수열을 보여 주고, 구분 기호가 나온 뒤 아무 입력 없이 같은 수열을 그대로 출력하게 합니다. 학습된 NTM의 메모리 사용을 들여다본 저자들은 망이 다음 의사 코드를 배웠다고 추정합니다.

initialise: move head to start location while input delimiter not seen do receive input vector write input to head location increment head location by 1 end while return head to start location while true do read output vector from head location emit output increment head location by 1 end while

아래 데모는 학습을 하지 않습니다. 대신 컨트롤러 자리에 이 의사 코드를 그대로 넣어, 매 스텝 헤드 파라미터(k, β, g, s, γ, e, a)를 직접 정해 주고 메모리 연산은 식 (2)~(9) 그대로 돌립니다. 시작 위치로 돌아가는 것은 논문 해석대로 내용 주소로 처리합니다. 첫 칸에 쓸 때 9번째 채널에 “시작 표지” 1을 함께 써 두고, 출력 단계 첫 스텝에 읽기 헤드가 키 [0,…,0,1], β = 50, g = 1로 그 칸을 찾아갑니다. 그 뒤로는 g = 0, s = +1의 위치 주소로 한 칸씩 나아갑니다.

데모 6 · 손으로 배선한 NTM의 복사

이동 확신도 p는 s(+1) = p, s(0) = s(−1) = (1 − p)/2로 쓰입니다. p = 1, γ = 1이면 이상적인 컨트롤러입니다. p를 낮추면 “덜 학습된” 컨트롤러처럼 초점이 흐려지고, γ로 그것을 붙잡을 수 있는지 봅니다. 시간 슬라이더로 아무 스텝의 메모리를 볼 수 있습니다.

값/가중치 (진할수록 1)틀린 비트시작 표지 채널

해 볼 것들입니다.

7. 미분 가능한 주소가 주는 것: 기울기

6절에서는 헤드 파라미터를 사람이 정했습니다. 실제 NTM은 그 값을 컨트롤러가 내고, 출력 오차에서 거꾸로 흘러온 기울기로 컨트롤러를 학습합니다. 그러려면 “헤드 파라미터를 조금 바꾸면 출력이 얼마나 나아지는가”에 0이 아닌 답이 있어야 합니다.

가장 작은 예로 확인해 봅니다. 10칸 메모리(각 칸은 4차원 무작위 벡터)에서 7번 칸의 내용을 읽어 내는 것이 목표이고, 손실은 \(\lVert r - M(7)\rVert^2\)입니다. 헤드는 0번 칸에서 출발해 실수 하나 x만큼 이동합니다. 흐릿한 쪽은 4.3.2절의 실수 이동 방식(x = 6.7이면 6번 칸에 0.3, 7번 칸에 0.7)이고, 딱딱한 쪽은 x를 반올림한 칸 하나입니다.

데모 7 · 경사 하강으로 주소 찾기

그래프를 클릭하면 출발점 x가 바뀝니다. “경사 하강” 버튼은 두 방식 모두에 같은 학습률(0.02)로 800스텝을 돌립니다. 딱딱한 쪽의 기울기는 수치 미분(±0.001)으로 구합니다.

흐릿한 주소의 손실정수 주소의 손실공의 위치

정수 주소의 손실은 계단이라 기울기가 어디서나 0이고, 공은 출발점에서 한 걸음도 움직이지 않습니다. 흐릿한 주소는 칸과 칸 사이가 이어져 있어 기울기를 따라 내려갑니다. 다만 출발점을 여러 곳에 찍어 보면, 5보다 오른쪽에서 출발할 때만 7에 닿고, 그보다 왼쪽에서 출발하면 4.3이나 1.9 근처의 골짜기에 멈춥니다. 미분 가능하다는 것은 기울기가 있다는 뜻이지 최적점에 닿는다는 보장이 아닙니다. NTM이 실제로 학습될 때도 내용 주소(“7번 칸에 있는 것과 비슷한 것을 찾아라”)와 위치 주소를 함께 쓰는 덕분에 이런 골짜기를 피할 길이 생깁니다.

8. 논문의 실험 결과

모든 실험은 같은 세 모델을 비교합니다. 피드포워드 컨트롤러 NTM, LSTM 컨트롤러 NTM, 그리고 3층 LSTM입니다. 메모리는 모두 128 × 20이고, 목표는 이진값, 비용은 수열당 비트 수의 교차 엔트로피, 학습은 모멘텀 0.9의 RMSProp입니다. 기울기는 성분별로 (−10, 10)에 잘랐습니다.

과제무엇을 보나결과
복사 (4.1)8비트 벡터 수열 1~20개를 기억했다가 그대로 출력NTM이 훨씬 빨리 수렴. 길이 20까지만 학습했는데 30, 50, 120도 복사(120에서는 벡터 하나가 중복되어 이후가 한 칸씩 밀린 전역 오류 하나). LSTM은 20을 넘으면 급격히 무너짐
반복 복사 (4.2)수열을 지정된 횟수만큼 반복 출력 후 끝 표지 — “for 루프”둘 다 학습 범위 안에서는 해결. NTM은 더 긴 수열과 더 많은 반복으로 일반화했지만 횟수를 세지는 못해 11번째 반복부터 매번 끝 표지를 냄. LSTM은 둘 다 실패
연상 기억 (4.3)항목(6비트 × 3) 2~6개를 본 뒤, 하나를 질의하면 그 다음 항목을 출력NTM은 약 3만 에피소드에 비용 0 근처, LSTM은 100만 에피소드에도 0에 못 미침. 피드포워드 NTM은 12개(학습 최대의 2배)까지 거의 완벽, 15개에서도 평균 1비트 미만. 각 항목의 압축 표현을 한 칸에 써 두고 내용으로 찾은 뒤 +1 이동(데모 4의 모드 2)
동적 N-gram (4.4)무작위 6-gram 분포에서 뽑은 200비트를 보며 다음 비트 예측LSTM보다 작지만 유의미하게 나음. 최적 베이즈 추정기 \((N_1+\tfrac12)/(N_1+N_0+1)\)에는 못 미침. 메모리를 맥락별 계수기처럼 사용
우선순위 정렬 (4.5)우선순위가 붙은 벡터 20개 → 상위 16개를 순서대로NTM 두 종류 모두 LSTM을 크게 앞섬. 우선순위의 선형 함수로 쓰기 위치를 정하고 순서대로 읽는 것으로 보임. 피드포워드는 헤드 8개가 필요했음

파라미터 수 (표 1~3)

과제NTM · 피드포워드NTM · LSTMLSTMLSTM ÷ NTM-FF

복사와 반복 복사에서는 NTM이 수십~수백 분의 1의 파라미터로 더 잘합니다. 하지만 마지막 줄이 보여 주듯 항상 작은 것은 아닙니다. 우선순위 정렬에서 피드포워드 NTM은 헤드 8개 · 컨트롤러 512로 LSTM보다 파라미터가 많습니다. 논문 3.4절의 말대로 피드포워드 컨트롤러는 한 스텝에 읽기 헤드 수만큼의 벡터만 다룰 수 있어서(헤드 하나면 단항 연산), 정렬처럼 여러 값을 비교해야 하는 일에는 헤드를 늘려야 했습니다.

9. 그다음: 어텐션과 DNC

내용 주소는 어텐션입니다. 식 (5)의 \(\mathrm{softmax}(\beta\cdot\cos(k, M(i)))\)를 Transformer의 \(\mathrm{softmax}(q\cdot k_i/\sqrt d)\)와 나란히 놓으면, 키 k가 쿼리 q, 메모리 행이 키이자 값, β가 온도의 역수 자리입니다. NTM(2014년 10월)은 Bahdanau 어텐션(2014년 9월)과 거의 같은 시기에 나왔고, 논문도 미분 가능한 어텐션 모델들을 선행 연구로 꼽습니다. 다른 점은 NTM의 메모리는 쓰기가 가능하다는 것입니다. 디코더 Transformer의 KV 캐시도 스텝마다 행이 하나씩 늘어나는 메모리지만, 이미 쓴 행을 지우거나 고치지는 않습니다.

DNC(Differentiable Neural Computer, Graves 외, Nature 2016)는 NTM의 약점을 직접 겨냥한 후속작입니다. NTM은 쓸 자리를 순환 이동으로만 찾아가서 빈 칸을 관리하지 못하고(6절의 덮어쓰기), 연속된 블록에 쓰지 않으면 순서를 따라가기 어렵습니다. DNC는 순환 이동을 빼고, 사용량을 추적해 비어 있는 칸을 할당하는 동적 할당과 어떤 칸 다음에 어떤 칸에 썼는지를 기록하는 시간 연결 행렬을 넣었습니다.

같은 시리즈의 How Attention Works는 Q·K·V softmax를, How LSTM Works는 NTM의 쓰기가 본뜬 게이트를, How Universal Transformer Works는 고정 깊이 모델의 한계와 튜링 완전성 논증을 다룹니다.

10. 확인 퀴즈

각주

  1. 튜링 완전(Turing complete)은 “시간과 메모리만 충분히 주면 컴퓨터로 할 수 있는 어떤 계산이든 할 수 있다”는 뜻입니다.

    기준은 튜링(1936)이 생각한 가장 단순한 컴퓨터인 튜링 머신입니다. 칸마다 기호가 적힌 끝없는 테이프가 있고, 헤드가 한 칸을 읽고 쓴 뒤 왼쪽이나 오른쪽으로 한 칸 움직입니다. 무엇을 할지는 “지금 상태가 A이고 읽은 기호가 1이면 0을 쓰고 오른쪽으로 가서 상태 B로” 같은 규칙표가 정합니다. 장치는 이게 전부인데도, 지금까지 알려진 어떤 계산 장치도 이 기계가 못 푸는 문제를 풀지 못합니다. 더 빠를 수는 있어도 풀 수 있는 문제의 범위는 같습니다. 그래서 어떤 시스템이 튜링 머신을 흉내 낼 수 있으면 “튜링 완전하다”고 부릅니다. 대략 기억을 필요한 만큼 늘릴 수 있고, 필요한 만큼 반복할 수 있으면 됩니다.

    튜링 완전튜링 완전 아님
    파이썬, C 같은 보통의 프로그래밍 언어정규표현식(괄호 짝 맞추기를 못 함)
    콘웨이의 생명 게임, 마인크래프트 레드스톤층 수가 고정된 피드포워드 신경망

    함정은 이것이 “할 수 있다”는 말일 뿐 효율적이거나 배우기 쉽다는 뜻은 아니라는 점입니다. Siegelmann & Sontag의 증명은 가중치를 사람이 정밀하게 설계하고 은닉 상태의 숫자 하나에 무한한 정밀도로 정보를 담는 방식이라, 데이터로 학습해서 그런 해를 찾기는 현실적으로 불가능합니다. 그래서 NTM은 튜링 머신의 부품을 신경망에 직접 달아 줬습니다. 테이프는 메모리 행렬 M, 헤드의 읽기·쓰기는 모든 칸에 가중치를 나눠 주는 흐릿한 읽기·쓰기(2·3절), 한 칸 이동은 순환 이동 s(4절), 규칙표는 사람이 짜지 않고 학습하는 컨트롤러입니다.

    엄밀히 말하면 실제 NTM은 메모리가 128칸으로 유한해서 튜링 완전하지 않습니다. RAM이 유한한 우리 컴퓨터도 마찬가지라, 보통은 “메모리만 계속 늘려 주면 튜링 완전”이라는 뜻으로 씁니다. 데모 6에서 L > N이면 덮어써서 망가지는 것이 이 한계입니다. 층 수가 고정된 Transformer가 튜링 완전하지 않은 이유와 같은 층을 반복해 그 한계를 넘는 논증은 How Universal Transformer Works에서 다룹니다. ↩