수학 개념 지도
딥러닝과 언어 모델

순환 신경망과 LSTM(Recurrent neural network and LSTM)

같은 규칙 h_t = tanh(W h_{t−1} + U x_t + b)를 매 걸음 되풀이하며 지난 입력을 상태 벡터⁠(vector)⁠에 접어 넣는 신경망⁠(neural network)⁠. 학습 신호는 시간을 거슬러 가며 행렬⁠(matrix)⁠ W를 거듭 곱하므로 고유값⁠(eigenvalue)⁠의 크기에 따라 지수적으로 사라지거나 폭발하고, LSTM은 곱해지는 수를 1 가까이 둘 수 있는 게이트로 이를 누그러뜨린다.

ht=tanh⁡(Wht−1+Uxt+b)h_t = \tanh(W h_{t-1} + U x_t + b)

문장을 한 낱말씩 읽는다고 합시다. '나는 어제 서울에서 친구를 …' 다음 낱말을 맞히려면 앞에 나온 낱말들을 어딘가에 기억해 두어야 합니다. 순환 신경망(RNN)은 지금까지 읽은 것을 벡터 하나(은닉 상태⁠(hidden state)⁠ h)에 접어 두고, 새 입력 xtx_t가 올 때마다 같은 규칙으로 상태를 고칩니다.

ht=tanh⁡(Wht−1+Uxt+b)h_t = \tanh(W h_{t-1} + U x_t + b)

W는 지난 상태를 새 상태로 옮기는 행렬, U는 입력을 섞어 넣는 행렬이고, tanh는 값을 −1과 1 사이로 누르는 S자 함수입니다. 다음 항을 앞 항으로 정하는 점화식⁠(recurrence relation)⁠인데, 그 규칙을 사람이 아니라 학습이 정합니다. 입력을 떼어 놓고 보면 h↦tanh⁡(Wh+b)h \mapsto \tanh(Wh + b)를 되풀이하는 동역학계⁠(dynamical system)⁠이기도 합니다. 시간 축을 따라 펼쳐 놓으면 RNN은 층마다 같은 가중치⁠(weight)⁠를 쓰는 아주 깊은 신경망이어서, 펼친 망에 역전파⁠(backpropagation)⁠를 그대로 적용해 학습합니다(시간 역전파⁠(backpropagation through time)⁠, BPTT). 합성곱 신경망⁠(convolutional neural network)⁠이 같은 필터⁠(filter)⁠를 공간의 모든 위치에 다시 쓰듯, RNN은 같은 W를 시간의 모든 걸음에 다시 씁니다.

거슬러 올라가는 학습 신호. 마지막 걸음의 손실이 k걸음 전의 상태에 얼마나 민감한지를 연쇄법칙⁠(chain rule)⁠으로 풀면, 걸음마다 하나씩 곱해진 k개의 야코비 행렬(기울기 벡터⁠(gradient vector)⁠와 야코비 행렬⁠(Jacobian matrix)⁠)이 나옵니다.

∂ht∂ht−k=(DtW)(Dt−1W)⋯(Dt−k+1W),Ds=diag⁡(1−hs2)\frac{\partial h_t}{\partial h_{t-k}} = (D_t W)(D_{t-1} W)\cdots(D_{t-k+1} W), \qquad D_s = \operatorname{diag}\bigl(1 - h_s^2\bigr)

DsD_s는 tanh의 기울기(0과 1 사이의 수)를 대각선에 늘어놓은 행렬입니다. 우선 D를 빼면 거듭제곱 WkW^k만 남습니다(학습 신호에는 실제로 W의 전치가 곱해지지만 고유값은 같습니다). 아래 그림의 W는 서로 수직인 두 고유벡터⁠(eigenvector)⁠ 방향으로 각각 λ₁ = 배, λ₂ = 배 늘이는 대칭 행렬입니다. tanh 때문에 걸음마다 d = 배씩 더 줄어든다고 간단히 가정했습니다(실제의 D는 칸과 걸음마다 다릅니다).

세로축은 로그 눈금입니다. 노랑은 k걸음 거슬러 간 학습 신호의 크기, 청록과 분홍 점선은 두 고유벡터 방향 성분의 크기입니다. 출발 신호의 크기는 1입니다.

출발 신호를 두 고유벡터로 나누어 g=c1v1+c2v2g = c_1 v_1 + c_2 v_2로 쓰면, k걸음 뒤에는 각 성분에 제 배율의 k제곱이 곱해집니다(고유벡터, 대각화⁠(diagonalization)⁠).

(dW)kg=c1(dλ1)k v1+c2(dλ2)k v2(dW)^k g = c_1 (d\lambda_1)^k\, v_1 + c_2 (d\lambda_2)^k\, v_2

그래서 오래 지나면 가장 큰 ∣dλ∣|d\lambda|가 모든 것을 정합니다. 이 값이 1보다 작으면 신호는 등비수열⁠(geometric progression)⁠처럼 지수적으로 사라지고(0.9⁵⁰ ≈ 0.005), 1보다 크면 폭발합니다(1.1⁵⁰ ≈ 117). 지금 50걸음 전으로 전해지는 신호의 크기는 입니다. 1 근처의 좁은 띠를 벗어나면 먼 과거로는 학습 신호가 거의 가지 않거나, 반대로 한 번의 갱신이 가중치를 크게 망가뜨립니다. 1991년 제프 호흐라이터의 디플롬 논문(독일 대학의 졸업 논문)과 1994년 요슈아 벤지오와 동료들의 논문이 이 문제를 분석했습니다. 대칭이 아닌 W는 고유값이 복소수⁠(complex number)⁠일 수 있는데, 이때도 WkW^k가 긴 시간에 걸음당 몇 배로 커지는지는 고유값 절댓값⁠(absolute value)⁠의 최댓값(스펙트럼 반지름⁠, spectral radius⁠)이 정합니다. 다만 고유벡터들이 서로 수직이 아니면, 스펙트럼 반지름이 1보다 작아도 처음 몇 걸음 동안은 잠깐 커졌다가 줄 수 있습니다. 폭발은 신호의 길이가 문턱⁠(threshold)⁠을 넘으면 잘라 내는 방법(기울기 자르기⁠, gradient clipping⁠)으로 비교적 쉽게 막지만, 소실은 그렇게 고칠 수 없습니다.

LSTM. 1997년 호흐라이터와 위르겐 슈미트후버의 장단기 메모리(LSTM)는 상태를 매번 고쳐 쓰는 대신, 더해 가는 통로(셀 상태⁠(cell state)⁠ c)를 따로 둡니다.

ct=ft⊙ct−1+it⊙c~t,ht=ot⊙tanh⁡(ct)c_t = f_t \odot c_{t-1} + i_t \odot \tilde c_t, \qquad h_t = o_t \odot \tanh(c_t)

f, i, o는 0과 1 사이 값을 내는 게이트로, 지금 입력과 지난 상태를 보고 칸마다 따로 정해집니다. ⊙는 칸끼리의 곱이고, c~t\tilde c_t는 새로 적어 넣을 후보입니다. 셀 상태를 따라 곧장 거슬러 가는 길에서는 한 걸음마다 ∂ct/∂ct−1\partial c_t / \partial c_{t-1}의 주된 항으로 망각 게이트⁠(forget gate)⁠ 값 f만 곱해집니다. 행렬 W는 이 길에 끼지 않습니다(게이트가 지난 상태를 거쳐 만드는 곁가지 기울기⁠(slope)⁠는 따로 있습니다). 그래서 f가 1에 가까우면 기억과 그 기울기가 거의 그대로 먼 과거까지 전해집니다. 그림에서 d = 1, λ₁ = 1로 두면 이 상황을 흉내 낼 수 있습니다. 처음 LSTM에는 망각 게이트가 없었는데, 이것은 f = 1로 고정한 것과 같습니다. 망각 게이트는 2000년 펠릭스 게르스 등이 덧붙였습니다. 요점은 1이 정해져 있지 않고 학습된다는 데 있습니다. 게이트는 기억해야 할 때 1 가까이, 잊어야 할 때 0 가까이 가도록 배웁니다. 그렇다고 LSTM이 아주 먼 의존 관계를 늘 배우는 것은 아닙니다. f가 1보다 조금만 작아도 fkf^k는 결국 0으로 갑니다. 2014년 조경현과 동료들의 GRU는 게이트를 둘로 줄인 더 단순한 변형입니다.

확률⁠(probability)⁠ 모형과 견주면. 마르코프 연쇄⁠(Markov chain)⁠의 분포도 전이 행렬⁠(transition matrix)⁠을 거듭 곱하며 나아갑니다. 고유값 1이 하나뿐이고 나머지 고유값의 절댓값이 모두 1보다 작으면, 분포는 처음을 잊고 정상 분포⁠(stationary distribution)⁠로 갑니다. 처음을 잊는 빠르기를 둘째로 큰 고유값의 절댓값이 정한다는 점에서, RNN의 기울기 소실⁠(vanishing gradient)⁠과 같은 종류의 수학입니다. 모양이 가장 닮은 것은 은닉 마르코프 모델⁠(hidden Markov model)⁠입니다. 둘 다 보이지 않는 상태가 관측을 따라 걸음마다 바뀝니다. 다만 HMM의 상태는 몇 개 가운데 하나인 무작위 변수입니다. 그 확률은 전향 알고리즘⁠(forward algorithm)⁠ αt=diag⁡(b(ot)) A⊤αt−1\alpha_t = \operatorname{diag}\bigl(b(o_t)\bigr)\,A^{\top}\alpha_{t-1}이라는 선형 점화식으로 갱신합니다. 여기서 A는 상태 전이 확률⁠(transition probability)⁠의 행렬이고, b(ot)b(o_t)는 상태마다 지금의 관측 oto_t가 나올 확률을 모은 벡터입니다. RNN의 상태는 실수⁠(real number)⁠ 벡터이고 갱신은 비선형입니다. 바로 앞의 n − 1개만 보는 n-그램⁠(n-gram)⁠과 달리 RNN의 기억에는 정해진 끝이 없지만, 실제로 쓸 수 있는 기억의 길이는 위의 고유값 이야기가 제한합니다.

역사와 지금. 1986년 마이클 조던, 1990년 제프리 엘먼이 오늘날의 꼴에 가까운 단순 순환망을 내놓았습니다. 2014년 일리야 수츠케버 등은 LSTM으로 문장을 읽어 고정된 길이의 벡터 하나에 담고, 또 다른 LSTM으로 다른 언어의 문장을 풀어내는 번역 모델(seq2seq)을 보였습니다. 긴 문장을 벡터 하나에 욱여넣는 것이 약점이었는데, 같은 해 드미트리 바다나우, 조경현, 벤지오는 풀어낼 때마다 입력 문장의 어느 낱말을 볼지 고르는 어텐션⁠(attention)⁠을 덧붙였습니다. 2016년에는 구글 번역도 LSTM 기반 신경망으로 바뀌었습니다. 2017년의 트랜스포머⁠(transformer)⁠는 순환을 아예 없애고 어텐션만 남겼습니다. 걸음을 차례로 하나씩 계산해야 하는 RNN과 달리 모든 위치를 한꺼번에 계산할 수 있어 GPU에서 훨씬 빨리 학습되기 때문입니다. 최근에는 선형 점화식 ht=Aht−1+Bxth_t = A h_{t-1} + B x_t의 고유값을 1 안쪽에 조심스럽게 두어 긴 기억과 병렬 학습을 함께 얻으려는 상태 공간 모형(S4, Mamba 등)이 다시 연구되고 있습니다. 위 그림의 고유값 문제가 그 설계의 한가운데에 있습니다.

이어지는 곳. 규칙 하나를 되풀이해 수열을 만든다는 뼈대는 점화식에서, 되풀이가 수렴⁠(convergence)⁠하는지 발산⁠(divergence)⁠하는지 요동치는지는 동역학계와 고정점⁠(fixed point)⁠에서 볼 수 있습니다. 기울기가 폭발한다는 것은 k걸음 전 상태의 작은 차이가 지금 상태에서 지수적으로 커진다는 뜻이어서, 혼돈⁠(chaos)⁠의 초기값 민감성⁠(sensitive dependence on initial conditions)⁠과 같은 현상입니다. 행렬의 거듭제곱이 고유값의 거듭제곱이 되는 까닭은 대각화에 있습니다. 시간을 거슬러 기울기를 모으는 계산은 역방향 자동 미분⁠(automatic differentiation)⁠을 펼친 망에 쓴 것입니다. 입력 xtx_t로 들어가는 낱말 벡터는 단어 임베딩⁠(word embedding)⁠이고, 다음 낱말의 확률을 내는 모델 전체는 언어 모델⁠(language model)⁠입니다. 확률로 상태를 따라가는 형제는 마르코프 연쇄와 은닉 마르코프 모델이고, 순환을 걷어 내고 병렬로 계산하는 방법은 어텐션과 트랜스포머입니다. 기울기 소실을 분석하고 신경망 언어 모델을 연 사람 가운데 하나가 벤지오입니다.

관련 인물요슈아 벤지오

이 개념이 나오는 긴 글

언어 모델 다음 단어를 맞히는 기계 다음 낱말을 짐작하는 일만으로 어디까지 갈 수 있을까? 마르코프의 글자 세기에서 섀넌의 추측 게임, 트랜스포머와 규모의 법칙, 사람의 선호까지. 밑바닥에는 확률의 곱셈 규칙과 로그 하나가 있고, 그 수학은 모델이 왜 그럴듯하게 틀리는지도 말해 준다.

이 개념 위에 세워진 것

이 개념을 언급하는 페이지

이 페이지가 가리키는 개념