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

트랜스포머(Transformer)

어텐션(토큰⁠(token)⁠ 사이를 섞기)과 MLP(토큰마다 변환하기)를 잔차 연결⁠(residual connection)⁠과 층 정규화⁠(layer normalization)⁠로 감싸 여러 층 쌓은 신경망⁠(neural network)⁠. 오늘날 대부분의 큰 언어 모델⁠(language model)⁠이 이 구조다.

x←x+Attn⁡(LN⁡(x)),x←x+MLP⁡(LN⁡(x)),N≈12 L d2x \leftarrow x + \operatorname{Attn}(\operatorname{LN}(x)), \qquad x \leftarrow x + \operatorname{MLP}(\operatorname{LN}(x)), \qquad N \approx 12\,L\,d^2
먼저 보면 좋은 개념어텐션신경망역전파

트랜스포머는 토큰 열을 받아 토큰마다 벡터⁠(vector)⁠ 하나를 내놓는 신경망입니다. GPT 같은 언어 모델은 각 위치의 벡터로 그 바로 다음 토큰의 확률⁠(probability)⁠을 계산합니다. 학습할 때는 모든 위치에서 한꺼번에 맞히고, 글을 이어 쓸 때는 마지막 위치의 예측만 씁니다. 전체 흐름은 세 부분입니다.

  1. 임베딩⁠(embedding)⁠. 토큰 번호 t에 대해 V×d 행렬⁠(matrix)⁠의 t번째 행을 꺼냅니다(V는 어휘 크기, d는 모델의 폭). 원래 설계와 GPT-2에서는 여기에 위치를 나타내는 벡터를 더합니다(아래 '위치' 참고).
  2. 블록 L개. 블록마다 두 단계가 있습니다. 어텐션⁠(attention)⁠은 토큰들 사이에 정보를 섞고, MLP(작은 2층 신경망)는 토큰마다 따로 벡터를 변환합니다. 두 단계 모두 입력을 층 정규화한 다음 계산하고, 그 결과를 원래 입력에 더합니다(잔차 연결).
  3. 출력. 마지막 벡터에 d×V 행렬을 곱해 어휘 크기만큼의 점수(로짓⁠, logit⁠)를 얻고, 소프트맥스⁠(softmax)⁠로 다음 토큰의 확률로 바꿉니다.
x←x+Attn⁡(LN⁡(x)),x←x+MLP⁡(LN⁡(x))x \leftarrow x + \operatorname{Attn}(\operatorname{LN}(x)), \qquad x \leftarrow x + \operatorname{MLP}(\operatorname{LN}(x))

위 식은 GPT-2(2019) 이후 흔해진 배치로, 정규화를 각 단계의 앞에 둡니다. 2017년 원래 논문은 더한 뒤에 정규화했습니다. 부품을 하나씩 봅시다.

잔차 연결. 블록은 x를 새 값으로 갈아 끼우지 않고 x+F(x)x + F(x)로 고칩니다. 미분⁠(differentiation)⁠하면 ∂(x+F(x))/∂x=I+∂F/∂x\partial(x + F(x))/\partial x = I + \partial F/\partial x이므로(야코비 행렬⁠, Jacobian matrix⁠), 역전파⁠(backpropagation)⁠에서 기울기⁠(slope)⁠가 블록을 지날 때 단위행렬⁠(identity matrix)⁠ I를 통해 줄지 않고 그대로 흐르는 길이 늘 하나 남습니다. 층을 수십 개 쌓아도 앞쪽 층까지 학습 신호가 닿는 까닭입니다. 이 구조는 2015년 허카이밍 등의 이미지 인식 신경망 ResNet으로 널리 퍼졌습니다. 이렇게 보면 각 블록은 모두가 함께 쓰는 벡터 x(잔차 흐름⁠, residual stream⁠)를 읽고 거기에 조금씩 더해 쓰는 부품입니다.

층 정규화. 토큰 하나의 벡터에서 d개 성분의 평균⁠(mean)⁠을 빼고 표준편차⁠(standard deviation)⁠로 나눈 뒤, 성분마다 학습되는 배율 γ와 이동 β를 적용합니다.

LN⁡(x)i=γi xi−μσ2+ε+βi,μ=1d∑jxj,σ2=1d∑j(xj−μ)2\operatorname{LN}(x)_i = \gamma_i\,\frac{x_i - \mu}{\sqrt{\sigma^2 + \varepsilon}} + \beta_i, \qquad \mu = \frac1d\sum_{j} x_j,\quad \sigma^2 = \frac1d\sum_j (x_j - \mu)^2

통계⁠(statistics)⁠에서 자료를 표준화⁠(standardization)⁠하는 것(평균 0, 분산⁠(variance)⁠ 1로 맞추기)을 층마다 토큰마다 하는 셈입니다. ε은 0으로 나누지 않으려고 더하는 아주 작은 수입니다. 어텐션과 MLP에 들어가는 벡터의 크기가 층마다 들쭉날쭉하지 않도록 맞춰 주어 학습을 안정시킵니다(2016년 지미 바, 제이미 키로스, 제프리 힌턴). 평균은 빼지 않고 제곱평균의 제곱근으로만 나누는 RMSNorm도 많이 씁니다.

MLP. 폭 d의 벡터를 4d로 넓혔다가(d×4d 행렬) 비선형 함수(ReLU나 그것을 매끄럽게 한 GELU)를 거쳐 다시 d로 줄입니다(4d×d 행렬). 모든 위치에 같은 가중치⁠(weight)⁠를 따로따로 적용하므로 토큰 사이를 섞지 않습니다. 토큰 사이를 섞는 일은 어텐션만 합니다. 요즘 모델은 게이트를 단 변형(SwiGLU)을 많이 쓰는데, 그때는 행렬이 셋이 되어 아래의 매개변수⁠(parameter)⁠ 셈이 조금 달라집니다.

위치. 마스크가 없으면 어텐션은 토큰의 순서를 모릅니다. 2017년 원래 트랜스포머는 위치 p에 다음 벡터를 더했습니다. 성분을 둘씩 짝지어, 짝마다 진동수⁠(frequency)⁠ ωi=10000−2i/d\omega_i = 10000^{-2i/d}가 다른 사인파⁠(sinusoid)⁠를 씁니다.

PE(p)2i=sin⁡(ωi p),PE(p)2i+1=cos⁡(ωi p)PE(p)_{2i} = \sin(\omega_i\, p), \qquad PE(p)_{2i+1} = \cos(\omega_i\, p)

시계의 초침, 분침, 시침처럼 빠른 바늘과 느린 바늘을 함께 보면 시각을 읽을 수 있다는 생각입니다. 다만 시계 바늘은 60배, 12배씩 느려지지만, 여기서는 한 짝 건널 때마다 진동수가 같은 비율(d = 16이면 약 3.16배)로 줄어듭니다. 이 선택에는 정확한 이점이 있습니다. 덧셈정리⁠(addition formula)⁠에 따라

[sin⁡ω(p+k)cos⁡ω(p+k)]=[cos⁡ωksin⁡ωk−sin⁡ωkcos⁡ωk][sin⁡ωpcos⁡ωp]\begin{bmatrix}\sin\omega(p+k)\\ \cos\omega(p+k)\end{bmatrix} = \begin{bmatrix}\cos\omega k & \sin\omega k\\ -\sin\omega k & \cos\omega k\end{bmatrix}\begin{bmatrix}\sin\omega p\\ \cos\omega p\end{bmatrix}

이므로, k칸 뒤의 위치 벡터는 p와 상관없는 회전 행렬⁠(rotation matrix)⁠을 곱해 얻어집니다. 그래서 두 위치 벡터의 내적⁠(dot product)⁠은 PE(p)⋅PE(q)=∑icos⁡ωi(p−q)PE(p)\cdot PE(q) = \sum_i \cos\omega_i(p - q)로, 두 위치의 거리 p − q에만 달려 있습니다. 아래는 d = 16일 때의 위치 벡터입니다. 보기:

'값'에서는 한 행이 한 위치의 벡터입니다(주황 = +1, 파랑 = −1). 왼쪽 열일수록 위치를 따라 빠르게, 오른쪽 열일수록 느리게 바뀝니다. '위치끼리 내적'에서는 칸 (p, q)가 PE(p)·PE(q)이고, 대각선과 나란한 줄마다 값이 같습니다. 칸에 올리면 정확한 값이 나옵니다.

다만 모델이 보는 것은 위치 벡터끼리의 내적이 아닙니다. 토큰 벡터에 위치 벡터를 더한 뒤 쿼리⁠(query)⁠·키 행렬을 곱한 것의 내적입니다. 그래서 점수에서 위치가 하는 몫이 두 위치의 거리에만 달려 있다는 보장은 사라집니다. 2021년의 회전 위치 임베딩(RoPE)은 쿼리와 키의 성분 짝을 위치에 비례하는 각도만큼 직접 회전시켜 이 보장을 되찾았습니다. 그러면 점수는 두 토큰의 내용과 거리 p − q에만 달리고, 절대 위치 p에는 달리지 않습니다. 오늘날 공개된 큰 언어 모델 다수가 이 방식을 씁니다. 학습되는 위치 벡터, 상대 위치⁠(relative position)⁠ 편향, RoPE와 ALiBi, 학습 때보다 긴 문맥으로 늘리는 보간⁠(interpolation)⁠까지의 흐름은 위치 인코딩⁠(positional encoding)⁠의 변천에서 다룹니다.

매개변수 세기. 이제 모델의 크기를 셀 수 있습니다. 블록 하나에서 어텐션은 d×d 행렬 넷(WQ,WK,WVW_Q, W_K, W_V와 헤드들의 결과를 합치는 WOW_O), 곧 4d24d^2개입니다. MLP는 d×4d와 4d×d로 8d28d^2개입니다. 블록마다 12d212d^2개이고, 여기에 편향과 정규화의 작은 몫(블록당 13d개)이 붙습니다. 모델 전체로는 토큰 임베딩 Vd개(출력 행렬은 임베딩 행렬을 다시 쓰는 경우가 많아 따로 세지 않습니다), 위치 벡터 nctx dn_{\text{ctx}}\,d개(nctxn_{\text{ctx}}는 문맥 길이), 마지막 정규화 2d개를 더합니다.

N=Vd+nctx d+L (12d2+13d)+2d  ≈  12 L d2(d가 클 때)N = V d + n_{\text{ctx}}\, d + L\,(12 d^2 + 13 d) + 2d \;\approx\; 12\,L\,d^2 \quad(d\text{가 클 때})

모델: . 폭 d = , 블록 수 L = , 어휘 V = .

매개변수가 어디에 있는지를 100% 막대로 나눴습니다. 칸에 올리면 계산식과 개수가 나옵니다.

GPT-2 작은 모델(d = 768, L = 12, V = 50,257, 문맥 1,024)을 넣으면 합계가 124,439,808개로, 공개된 가중치 파일의 매개변수 수와 정확히 같습니다. 이때는 토큰 임베딩과 위치 벡터가 전체의 약 32%입니다. GPT-3(d = 12,288, L = 96)에서는 12Ld212Ld^2만 약 1,739억 개로 압도하고, 임베딩은 0.4%도 안 됩니다. d를 두 배로 하면 블록의 매개변수는 거의 네 배가 됩니다. 토큰 하나를 앞으로 계산할 때는 가중치 하나마다 곱셈 한 번과 덧셈 한 번을 하므로 약 2N번의 연산(FLOP)이 듭니다(문맥 길이에 따라 느는 어텐션 점수 계산은 뺀 어림입니다). 학습에서는 역전파가 그 두 배쯤 더 들어 토큰당 약 6N번이 되고, 이것이 규모의 법칙⁠(scaling laws)⁠에서 쓰는 학습 계산량 C≈6NDC \approx 6ND(D는 학습 토큰 수)입니다.

트랜스포머가 순환 신경망⁠(recurrent neural network)⁠을 대신하게 된 까닭은 주로 계산 방식에 있습니다. 순환 신경망은 앞 토큰의 상태가 나와야 다음 토큰을 계산할 수 있어서 학습할 때도 길이 방향으로 차례차례 계산해야 합니다. 트랜스포머는 학습할 때 모든 위치를 한꺼번에 행렬 곱으로 계산하므로 GPU의 병렬 계산을 잘 씁니다. 또 어느 두 위치 사이든 어텐션 한 번이면 정보가 오갑니다. 대가는 어텐션의 비용이 길이의 제곱으로 는다는 것입니다. 쓰임에 따라 모양도 셋입니다. 원래의 인코더–디코더(번역), 인과 마스크⁠(causal mask)⁠ 없이 문장 전체를 읽는 인코더만의 모델(BERT), 인과 마스크를 쓰고 다음 토큰만 예측하는 디코더만의 모델(GPT 계열)입니다.

이론으로 알려진 것도 있습니다. 2020년 윤철희 등은 위치 인코딩을 넣은 트랜스포머가, 길이가 정해진 입력에서 연속인 수열→수열 함수를 원하는 만큼 가깝게 근사할 수 있음을 증명했습니다. 입력은 유계 닫힌 영역 안에 있어야 하고, 가까움은 점마다의 최대 오차가 아니라 영역 전체에서 적분⁠(integral)⁠한 오차(LpL^p 거리)로 잽니다. 층 수에 제한을 두지 않은 존재 정리라서, 그런 가중치를 학습이 실제로 찾는지, 얼마나 큰 모델이 필요한지는 말해 주지 않습니다. 신경망의 보편 근사 정리⁠(universal approximation theorem)⁠와 같은 성격입니다.

이어지는 곳. 블록의 핵심인 어텐션은 쿼리와 키의 내적과 소프트맥스로 이루어지고, 입력 토큰은 토큰화가 정합니다. 맨 끝의 소프트맥스 출력으로 학습하는 목표는 언어 모델의 교차 엔트로피⁠(cross-entropy)⁠이고, 기울기는 역전파와 자동 미분⁠(automatic differentiation)⁠으로 구해 확률적 경사 하강법⁠(stochastic gradient descent)⁠과 Adam으로 가중치를 고칩니다. 사인파 위치 인코딩은 여러 진동수의 사인⁠(sine)⁠·코사인⁠(cosine)⁠을 쓴다는 점에서 푸리에 급수⁠(Fourier series)⁠와 닮았습니다. 다만 푸리에 급수는 함수 하나를 사인파들의 합으로 나타내고, 위치 인코딩은 위치 하나를 여러 사인파의 값들로 적습니다. 그 핵심 성질은 회전 행렬 하나로 설명됩니다. 매개변수 수 N과 학습 토큰 수 D로 손실을 가늠하는 경험식은 규모의 법칙에서, 학습된 모델로 글을 쓰는 규칙은 디코딩에서 다룹니다. 블록 안의 MLP를 여러 개 두고 토큰마다 몇 개만 골라 쓰는 방법은 전문가 혼합⁠(mixture of experts)⁠에, 어텐션 대신 고정된 크기의 상태를 선형으로 갱신하는 대안은 상태 공간 모형⁠(state space model)⁠에 있습니다.

관련 인물요슈아 벤지오

이 개념이 나오는 긴 글

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

이 개념 위에 세워진 것

이 개념을 언급하는 페이지

이 페이지가 가리키는 개념