주목이라는 연산 — 트랜스포머로

2026-05-12

시리즈의 마지막 편입니다. 6편에서 신경망은 휘어진 세상을 담는 보편적 도구가 됐지만, 한 가지를 잘 못했습니다 — 문맥입니다. "나는 배를 탔다"와 "나는 배가 아프다"에서 '배'의 의미는 주변 단어에 따라 완전히 달라지죠. 각 단어를 제대로 표현하려면, 그 단어가 다른 단어들 중 무엇에 주목해야 하는지를 정할 수 있어야 합니다.

그 '주목'을 수학으로 만든 연산이 어텐션이고, 이를 쌓은 것이 트랜스포머입니다. 그리고 놀랍게도, 그 심장은 이 시리즈가 1편에서 가장 먼저 세운 도구예요.

규칙 — 좋은 표현은 '무엇에 주목하느냐'에서 나온다. 어텐션은 내적으로 관련도를 매기고, 소프트맥스로 주목 분포를 만들어, 값들을 가중합하는 연산이다.

이 편에서 그 연산을 세우고, 시리즈가 벼려 온 모든 도구가 여기서 어떻게 절정에 모이는지 보며 막을 내립니다.

왜 어텐션인가 — 순서를 넘어 관계로

문맥을 다루려면 각 위치가 다른 위치들을 참고해야 합니다. 예전 방식(순환신경망, RNN)은 단어를 순서대로 하나씩 읽으며 기억을 이어 갔는데, 두 약점이 있었어요 — 순차 처리라 병렬화가 안 되고, 멀리 떨어진 단어 사이의 의존이 긴 경로를 지나며 희미해집니다(6편의 그래디언트 소실이 시간축으로 나타나는 것이죠).

어텐션의 발상은 근본적으로 다릅니다 — 순서를 따라가지 말고, 모든 위치 쌍의 관계를 한 번에 직접 재자는 것. 각 단어가 문장의 어느 단어든 거리에 상관없이 곧장 참고할 수 있게요. 그러면 장거리 의존도 한 걸음이고, 계산도 병렬화됩니다. 문제는 "얼마나 참고할지"를 어떻게 숫자로 정하느냐인데 — 여기서 내적이 등장합니다.

쿼리·키·밸류 — 세 개의 역할

각 토큰은 1편에서 봤듯 벡터 x\mathbf{x}입니다. 어텐션은 이 벡터에서 6편의 선형변환으로 세 개의 벡터를 만들어요.

q=WQx,k=WKx,v=WVx\mathbf{q} = W_Q\mathbf{x}, \qquad \mathbf{k} = W_K\mathbf{x}, \qquad \mathbf{v} = W_V\mathbf{x}

역할을 검색에 빗대면 선명합니다.

  • 쿼리(query) q\mathbf{q}: "내가 지금 찾고 있는 것".
  • 키(key) k\mathbf{k}: "내가 가진 꼬리표" — 남들이 나를 찾을 때 맞춰 보는 것.
  • 밸류(value) v\mathbf{v}: "내가 실제로 건넬 내용".

한 토큰이 다른 토큰을 얼마나 참고할지는, 내 쿼리와 상대의 키가 얼마나 맞는지로 정합니다. 그리고 "얼마나 맞는지"는 1편에서 세운 바로 그것 — 내적입니다.

어텐션 스코어 — 내적이 돌아오다

토큰 ii가 토큰 jj를 얼마나 참고할지의 점수는, ii의 쿼리와 jj의 키의 내적입니다.

score(i,j)=qikj\text{score}(i, j) = \mathbf{q}_i \cdot \mathbf{k}_j

1편에서 "내적은 두 벡터가 같은 방향을 얼마나 가리키는지를 재는 유사도"라 했고, 2편에서 코시-슈바르츠로 그 값을 다졌죠. 시리즈가 가장 먼저 세운 그 내적이, 마지막 편에서 **'주목의 정도'**로 돌아온 겁니다. 쿼리와 키가 같은 방향을 가리킬수록 점수가 크고, 그만큼 더 주목합니다.

여기에 한 가지 손질을 더합니다. 키의 차원 dkd_k가 크면 내적이 많은 항의 합이라 값의 분산이 dkd_k에 비례해 커져요. 그러면 다음 단계의 소프트맥스가 한쪽으로 쏠려 포화되고, 4편에서 본 것처럼 그래디언트가 0에 가까워져 학습이 멈춥니다. 그래서 dk\sqrt{d_k}로 나눠 분산을 다시 1 근처로 맞춥니다.

score(i,j)=qikjdk\text{score}(i, j) = \frac{\mathbf{q}_i \cdot \mathbf{k}_j}{\sqrt{d_k}}

이 작은 나눗셈 하나에도 4편의 그래디언트 감각이 배어 있습니다.

규칙 회수 — 주목의 정도는 쿼리와 키의 내적이다. 1편의 내적이 '유사도'에서 '주목'으로 돌아왔고, dk\sqrt{d_k}로 나눠 소프트맥스 포화(그래디언트 소실)를 막는다.

소프트맥스와 가중합 — 분포로 주목하고, 기댓값으로 모으다

점수는 아직 크기가 제각각인 실수입니다. 이를 합이 1인 주목 분포로 바꾸려면 3편의 소프트맥스를 씁니다.

αij=softmaxj(score(i,j))=escore(i,j)jescore(i,j)\alpha_{ij} = \operatorname{softmax}_j\bigl(\text{score}(i, j)\bigr) = \frac{e^{\text{score}(i,j)}}{\sum_{j'} e^{\text{score}(i,j')}}

이제 αij\alpha_{ij}는 "토큰 ii가 토큰 jj에 쏟는 주목의 비율"이고, 모두 더하면 1인 어엿한 확률분포입니다(3편의 분포가 여기 있습니다). 마지막으로 이 주목 비율로 밸류 벡터들을 가중합해 토큰 ii의 새 표현을 만듭니다.

oi=jαijvj\mathbf{o}_i = \sum_j \alpha_{ij}\,\mathbf{v}_j

이 가중합은 3편의 눈으로 보면 주목 분포에 대한 밸류의 기댓값이고, 2편의 눈으로 보면 밸류들을 관련도로 섞은 것 — 예고했던 어텐션의 정체죠. 이 모든 걸 행렬로 한 번에 쓰면, 트랜스포머의 심장이라 불리는 한 줄이 됩니다.

Attention(Q,K,V)=softmax ⁣(QKdk)V\operatorname{Attention}(Q, K, V) = \operatorname{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V

Q,K,VQ, K, V는 모든 토큰의 쿼리·키·밸류를 행으로 쌓은 행렬입니다(1편의 데이터 행렬처럼요). QKQK^\top이 모든 쌍의 내적 점수를 한 번에 만들고, 소프트맥스가 각 행을 분포로 바꾸고, VV를 곱해 가중합을 냅니다. 이 한 식에 1·2·3편이 전부 들어 있어요.

규칙 회수 — 소프트맥스가 내적 점수를 합이 1인 주목 분포로 바꾸고, 그 분포로 밸류를 가중합한다. softmax(QK/dk)V\operatorname{softmax}(QK^\top/\sqrt{d_k})V 한 식에 벡터·내적·분포가 모두 담긴다.

멀티헤드 — 여러 관점으로 동시에 주목

한 번의 어텐션은 한 종류의 관계만 봅니다. 하지만 언어에는 여러 관계가 겹쳐 있어요 — 문법적 관계, 의미적 관계, 지시 관계. 그래서 어텐션을 여러 벌 병렬로 돌립니다. 각 '헤드'가 자기만의 WQ,WK,WVW_Q, W_K, W_V로 다른 관점의 주목을 배우죠.

headh=Attention(XWQh, XWKh, XWVh)\text{head}_h = \operatorname{Attention}(XW_Q^h,\ XW_K^h,\ XW_V^h)

여러 헤드의 결과를 이어 붙이고 한 번 더 선형변환하면 멀티헤드 어텐션이 됩니다.

MultiHead(X)=Concat(head1,,headH)WO\operatorname{MultiHead}(X) = \operatorname{Concat}(\text{head}_1, \dots, \text{head}_H)\,W_O

여러 사람이 같은 문장을 각자 다른 눈으로 읽고 의견을 종합하는 것과 비슷합니다. 하나의 주목이 놓치는 관계를, 다른 헤드가 잡아 줍니다.

트랜스포머 블록 — 마지막 조립

이제 조각을 맞춥니다. 트랜스포머 블록 하나는 멀티헤드 어텐션과 6편의 피드포워드 신경망(FFN)을, 잔차 연결층 정규화로 감싼 것입니다.

h=x+MultiHead(LayerNorm(x))y=h+FFN(LayerNorm(h))\begin{aligned} \mathbf{h} &= \mathbf{x} + \operatorname{MultiHead}(\operatorname{LayerNorm}(\mathbf{x})) \\ \mathbf{y} &= \mathbf{h} + \operatorname{FFN}(\operatorname{LayerNorm}(\mathbf{h})) \end{aligned}

여기 두 장치는 6편에서 예고한 그대로예요 — 잔차 연결(x+\mathbf{x} +)은 그래디언트가 층을 건너뛰어 곧장 흐르게 해 소실을 막고, 층 정규화는 값의 분포를 안정시켜 깊은 층을 학습 가능하게 합니다. 6편에서 "그래디언트 소실을 달래는 잔차·정규화"라 했던 것이 여기서 실제로 일합니다.

한 가지 빠진 것 — 어텐션은 모든 쌍을 대칭으로 보기에 순서를 모릅니다("나는 너를 본다"와 "너는 나를 본다"를 구별 못 해요). 그래서 각 위치에 **위치 인코딩(positional encoding)**을 더해 순서 정보를 주입합니다. 이 블록을 수십~수백 층 쌓으면, 그것이 GPT 계열을 포함한 트랜스포머입니다.

학습 — 여전히 그 학습 루프

이 거대한 모델은 어떻게 배울까요. 답은 시리즈 내내 세운 그대로입니다 — 새로운 학습법은 없어요. 언어 모델은 다음 토큰의 확률분포를 내놓고(3편의 소프트맥스 출력), 정답 토큰에 확률을 몰아주도록 크로스 엔트로피(3편)로 손실을 재고, 역전파(6편)로 모든 가중치의 그래디언트를 구해, 경사하강(4편)으로 한 걸음씩 내려갑니다. 에이전트 직접 짜기 시리즈에서 우리가 API로 불렀던 그 LLM이, 바로 이 블록을 이 루프로 학습한 것이에요. 실전에서 만졌던 것의 밑바닥이 여기까지 이어집니다.

왜 이것이 정점인가 — 일곱 편이 한 식에 모이다

트랜스포머가 이 시리즈의 종착점인 이유는, 우리가 벼려 온 모든 도구가 여기서 동시에 일하기 때문입니다.

  • [1편] 벡터·행렬: 토큰은 벡터, Q/K/VQ/K/V는 행렬. 모든 것이 벡터 공간의 연산.
  • [2편] 내적·유사도: 어텐션 점수가 곧 쿼리·키의 내적.
  • [3편] 확률·소프트맥스·크로스 엔트로피: 주목은 분포, 출력도 분포, 손실도 확률에서.
  • [4편] 경사하강·연쇄법칙: 학습의 엔진이자 dk\sqrt{d_k} 스케일링의 이유.
  • [5편] 학습의 삼박자: 모델·손실·최소화의 골격 그대로.
  • [6편] 신경망·잔차·역전파: FFN, 잔차 연결, 그래디언트 계산.

말하자면 트랜스포머는 이 시리즈의 문법과 어휘로 쓰인 한 편의 완성된 글입니다. 밑바닥 벡터에서 시작해 여기까지 오르는 동안, 버린 도구가 하나도 없어요.

정직하게 — 정점에도 그늘은 있다

가장 강력한 구조지만, 트랜스포머도 한계 위에 섭니다.

  • 어텐션은 이차로 비싸다. 모든 쌍의 점수를 재니 토큰 수 nn에 대해 계산과 메모리가 O(n2)O(n^2)입니다. 긴 문맥일수록 급격히 비싸지고, 이걸 줄이려는 효율적 어텐션 연구가 지금도 활발합니다.
  • 순서는 덧붙인 것이다. 위치 인코딩은 순서를 사후에 주입하는 것이라, 아주 긴 시퀀스나 학습 때 못 본 길이에서 일반화가 흔들릴 수 있습니다.
  • 규모에 굶주린다. 이 표현력을 채우려면 방대한 데이터와 계산이 듭니다. 성능의 상당 부분이 구조의 우아함만이 아니라 규모에서 오죠.
  • 어텐션은 '이해'가 아니다. 주목 가중치가 크다고 모델이 그 관계를 인간처럼 '이해'하는 건 아닙니다. 트랜스포머가 하는 일은 여전히 방대한 데이터에서 학습한 통계적 패턴을 재현하는 것 — 놀랍도록 잘 하지만, 그 본질을 잊으면 능력도 한계도 잘못 읽게 됩니다.

이 넷을 알고 보면, 트랜스포머는 신비가 아니라 잘 설계된 수학으로 보입니다 — 이 시리즈가 처음부터 노린 시선이 그것이었습니다.

시리즈를 닫으며

1편에서 "AI는 세상을 벡터로 놓는 데서 시작한다"고 했습니다. 일곱 편을 지나 도착한 트랜스포머는, 그 벡터들 사이의 내적으로 주목을 정하고 확률로 분포를 빚는 구조였어요. 밑바닥 수학에서 시작해 트랜스포머까지, 새로운 마법은 한 번도 없었습니다 — 벡터·거리·확률·미분이라는 오래된 수학이, 층층이 쌓여 지금의 AI가 된 것이죠.

'에이전트 직접 짜기'가 AI를 어떻게 만드는지의 실전이었다면, 이 시리즈는 그것이 왜 도는지의 이론이었습니다. 이제 그 둘이 만납니다 — 에이전트가 API로 부르던 LLM의 안쪽이, 오늘의 이 블록과 학습 루프입니다. 표면에서 밑바닥까지 한 줄기로 이어진 셈이에요.

정리 — 주목으로 완성하다

  • 어텐션의 동기: 문맥을 다루려면 각 위치가 다른 위치에 얼마나 주목할지 정해야 한다. 순서를 넘어 모든 쌍의 관계를 한 번에.
  • QKV: 각 토큰에서 쿼리·키·밸류를 선형변환으로 만든다(찾는 것·꼬리표·건넬 내용).
  • 스코어 = 내적: 주목은 쿼리·키의 내적(1·2편). dk\sqrt{d_k}로 나눠 소프트맥스 포화를 막는다(4편).
  • 분포와 가중합: 소프트맥스로 주목 분포(3편), 밸류의 가중합(기댓값·투영). softmax(QK/dk)V\operatorname{softmax}(QK^\top/\sqrt{d_k})V.
  • 멀티헤드·블록: 여러 관점을 병렬로, 잔차·층정규화·위치 인코딩으로 감싸 쌓는다(6편).
  • 학습: 다음 토큰 예측을 크로스 엔트로피로, 역전파와 경사하강으로. 새 학습법은 없다.
  • 정직하게: O(n2)O(n^2) 비용, 순서는 덧붙인 것, 규모 의존, 어텐션은 이해가 아니라 통계적 패턴.

일곱 편으로 밑바닥 벡터에서 트랜스포머까지 한 줄기를 그었습니다. 여기서 시리즈를 닫습니다. 읽어 주셔서 고맙습니다.

핵심 한 줄 — 트랜스포머의 심장은 시리즈가 가장 먼저 세운 내적이다. 쿼리와 키의 내적으로 주목을 재고, 소프트맥스로 분포를 만들어, 밸류를 가중합한다. 밑바닥 벡터에서 여기까지, 새로운 마법은 없었다 — 오래된 수학이 층층이 쌓여 AI가 되었다.