3부 · 어텐션과 트랜스포머
← 2부 언어를 숫자로 · 목차 · 다음: 4부 학습 →
여기가 안내서의 심장입니다. 2부에서 토큰들이 "의미를 가진 좌표"가 되어 모델 안으로 들어왔습니다. 그런데 단어 하나의 좌표만으로는 부족합니다. 같은 단어도 문맥에 따라 뜻이 완전히 달라지기 때문입니다.
이 부의 한 줄 요약입니다.
어텐션(attention)은 각 토큰이 "지금 내 의미를 정하려면 문장의 어떤 다른 토큰을 봐야 하나"를 정하는 장치다. 트랜스포머(transformer)는 이 장치를 여러 층 쌓아 의미를 점점 정교하게 다듬는 구조다.
3.1 왜 맥락이 중요한가
다음 두 문장을 봅시다.
- "강가에 배를 묶어 두었다."
- "아침부터 배가 아프다."
같은 토큰 "배"인데 뜻이 완전히 다릅니다. 무엇이 뜻을 갈랐나요? 주변 단어입니다. "강가", "묶어"가 있으면 탈것이고, "아프다"가 있으면 신체입니다.
영어에도 유명한 예가 있습니다. "The computer executes the program because it is told to."에서 "it"은 컴퓨터일까요 프로그램일까요? 사람은 자연스럽게 컴퓨터라고 알지만, 기계가 이걸 알아내려면 "it"이 문장의 어떤 단어와 연결되는지를 따져야 합니다.
이 "어떤 단어와 연결되는지 따지기"가 바로 어텐션이 하는 일입니다.
흔한 오해 깨기
흔히들 "AI가 단어 하나하나의 뜻을 사전처럼 안다"고 생각하지만, 실제로는 한 토큰의 의미는 고정되어 있지 않고 문장 안에서 다른 토큰들과의 관계로 매번 다시 계산됩니다. 2부의 임베딩은 출발 좌표일 뿐이고, 어텐션이 그 좌표를 맥락에 맞게 조정합니다.
3.2 셀프 어텐션의 직관 — 도서관 비유
어텐션을 이해하는 가장 쉬운 길은 도서관에서 자료를 찾는 과정에 빗대는 것입니다. 각 토큰은 세 가지 역할을 동시에 맡습니다.
| 역할 | 영어 | 도서관 비유 | 하는 일 |
|---|---|---|---|
| 질의 | Query | 내 검색어 | "나는 지금 어떤 정보가 필요한가?" |
| 열쇠 | Key | 책 표지의 색인표 | "나는 이런 정보를 갖고 있다" |
| 값 | Value | 책 속 실제 내용 | "필요하다면 가져갈 정보 본문" |
작동 방식은 이렇습니다. 한 토큰(예: "it")이 자기 질의를 들고, 다른 모든 토큰의 열쇠와 맞춰 봅니다. 잘 맞는 토큰("computer")일수록 높은 점수를 받습니다. 그 점수에 비례해서 각 토큰의 값을 섞어 가져옵니다. 그렇게 "it"은 "computer"의 정보를 많이 흡수해, 자기 의미를 "그 컴퓨터를 가리키는 it"으로 다듬습니다.
flowchart TB
IT["토큰 'it'<br/>질의(Query): '나는 무엇을 가리키지?'"]
subgraph KEYS["다른 토큰들의 열쇠(Key)와 비교"]
C["computer<br/>열쇠 일치도 ★★★★"]
P["program<br/>열쇠 일치도 ★★"]
T["the<br/>열쇠 일치도 ☆"]
end
IT --> C
IT --> P
IT --> T
C --> OUT["'it'의 새 의미<br/>= computer의 값을 많이,<br/>나머지는 조금 섞은 결과"]
P --> OUT
T --> OUT
classDef query fill:#fff3b0,stroke:#e0a800,color:#000
classDef key fill:#a8e6e2,stroke:#2ba89e,color:#000
classDef out fill:#b9f6ca,stroke:#2e9e5b,color:#000
class IT query
class C,P,T key
class OUT out
비유 — 도서관 사서
당신이 "고양이 키우는 법"이라는 검색어(질의)를 들고 도서관에 갑니다. 사서는 모든 책의 색인표(열쇠)와 검색어를 대조해, 관련 높은 책일수록 더 많이 참고하라고 안내합니다. 당신은 그 안내 비율대로 여러 책의 내용(값)을 종합해 답을 얻습니다.
이 비유가 깨지는 곳: 도서관에서는 "내가" 검색어를 들고 가지만, 어텐션에서는 모든 토큰이 동시에 각자의 검색어를 들고 서로를 참조합니다. 한 번에 모두가 모두를 봅니다. 또 질의·열쇠·값은 사람이 정한 게 아니라 학습으로 만들어진 변환입니다.
🔬 더 깊이 — 왜 질의·열쇠·값을 따로 두나
한 토큰의 임베딩 하나만으로 서로 비교하면 "나와 비슷한 토큰"만 찾게 됩니다. 그런데 "it"은 "computer"와 의미가 비슷하지 않은데도 관련은 깊습니다. 그래서 모델은 학습된 세 개의 변환(가중치 행렬 $W_Q, W_K, W_V$)으로 같은 임베딩을 질의·열쇠·값이라는 세 가지 다른 표현으로 바꿉니다. "비슷함"이 아니라 "기능적 관련성"(주어-서술어, 대명사-선행사 등)으로 매칭되게 하려는 장치입니다. 점수는 질의와 열쇠의 내적으로 구하고, softmax로 비율(합이 1인 가중치)로 바꾼 뒤 값들을 가중합합니다.
멀티헤드 — 여러 관점으로 동시에 보기
실제 트랜스포머는 어텐션을 하나만 쓰지 않고 여러 개를 동시에 돌립니다. 이를 멀티헤드 어텐션(multi-head attention) 이라 합니다. 한 헤드는 문법적 관계(주어-동사)에, 다른 헤드는 대명사 연결에, 또 다른 헤드는 멀리 떨어진 단어 관계에 주목하는 식으로, 서로 다른 종류의 관계를 병렬로 살핍니다.
비유 — 같은 문장을 읽는 여러 전문가
문법 선생님, 논리 검토자, 주제 분석가가 같은 문장을 동시에 읽고 각자 다른 관계를 짚어낸 뒤, 그 의견을 합칩니다.
이 비유가 깨지는 곳: 각 헤드가 정확히 "문법", "논리"처럼 깔끔한 역할을 맡는 건 아닙니다. 사람이 사후에 해석해 붙인 이름일 뿐, 실제 헤드의 역할은 대체로 불투명합니다.
3.3 트랜스포머 — 같은 층을 쌓는다
트랜스포머의 놀라운 점은, 어텐션을 한 번 하고 끝내는 게 아니라 거의 똑같은 구조의 층을 수십~수백 개 쌓는다는 것입니다. 현대 LLM은 대부분 "디코더(decoder)만 쌓은" 구조를 씁니다.
각 층은 같은 일을 반복합니다.
flowchart TB
IN["입력: 토큰 좌표들"] --> L1
subgraph L1["층 1"]
A1["멀티헤드 어텐션<br/>(토큰끼리 정보 교환)"] --> F1["피드포워드<br/>(각 토큰 개별 가공)"]
end
L1 --> L2
subgraph L2["층 2"]
A2["멀티헤드 어텐션"] --> F2["피드포워드"]
end
L2 --> DOTS["⋮ (수십~수백 층)"]
DOTS --> LN
subgraph LN["마지막 층"]
AN["멀티헤드 어텐션"] --> FN["피드포워드"]
end
LN --> OUT["다음 토큰 확률 분포로"]
classDef inside fill:#a8e6e2,stroke:#2ba89e,color:#000
classDef ff fill:#d8b4f8,stroke:#8b5cf6,color:#000
classDef io fill:#fff3b0,stroke:#e0a800,color:#000
class A1,A2,AN inside
class F1,F2,FN ff
class IN,OUT,DOTS io
각 층 안에는 두 부분이 있습니다. 어텐션은 토큰끼리 정보를 주고받게 하고(맥락 섞기), 피드포워드(feed-forward) 망은 각 토큰을 개별적으로 한 번 더 가공합니다.
층이 쌓이며 무엇이 일어나는가
핵심 직관은 점진적 정교화입니다. 각 층은 받은 표현을 조금씩 다듬어, 원시 토큰을 점점 더 추상적인 의미로 바꿔 갑니다. 한 층 한 층이 라디칼하게 다른 게 아니라, 같은 작업을 반복하며 의미를 한 겹씩 깊게 만드는 것입니다.
대략적인 직관으로는, 낮은 층은 단어 모양·국소 문법 같은 표면적 패턴에, 높은 층은 더 추상적인 의미·문맥에 관여하는 경향이 관찰됩니다. 다만 이건 부드러운 경향이지 칸칸이 나뉜 역할 분담은 아닙니다.
비유 — 초벌 스케치에서 완성화로
화가가 같은 캔버스를 여러 번 덧칠합니다. 처음엔 윤곽, 다음엔 명암, 그다음엔 디테일. 매 단계가 같은 "덧칠"이지만 그림은 점점 또렷해집니다.
이 비유가 깨지는 곳: 화가는 의도를 갖고 단계를 나누지만, 트랜스포머 층이 정확히 무슨 역할을 하는지는 사람이 들여다봐도 깔끔히 해석되지 않는 경우가 많습니다(이 불투명성이 6부 "왜 틀리는지"와 연결됩니다).
🔬 더 깊이 — 잔차 연결과 마스킹
실제 각 층에는 입력을 출력에 그대로 더해주는 잔차 연결(residual connection) 과 값을 안정시키는 정규화가 있어, 깊이 쌓아도 정보가 사라지지 않게 합니다. 또 다음 토큰 예측 모델은 인과적 마스킹(causal masking) 을 써서, 각 위치가 자기보다 앞에 있는 토큰만 참조하게 합니다. 미래를 미리 보지 못하게 가리는 것이며, 이것이 "왼쪽에서 오른쪽으로 한 토큰씩 생성"을 가능하게 합니다(5부).
3.4 파라미터·가중치란 무엇인가
지금까지 "학습된 변환", "학습된 가중치"라는 말을 계속 썼습니다. 이게 정확히 무엇일까요?
파라미터(parameter) 또는 가중치(weight) 는, 모델이 계산할 때 쓰는 수많은 조절 가능한 숫자입니다. 어텐션의 질의·열쇠·값 변환, 피드포워드 망의 연산이 모두 이 숫자들로 이루어집니다. "GPT-2는 약 15억 개, 더 큰 모델은 수천억~조 단위의 파라미터를 가진다"고 할 때의 그 숫자들입니다.
비유 — 거대한 믹싱 콘솔의 다이얼
음향 엔지니어 앞에 수십억 개의 다이얼이 달린 콘솔이 있다고 상상해 보세요. 다이얼을 어떻게 맞추느냐에 따라 같은 입력이 전혀 다른 출력으로 나옵니다. 학습이란 "다음 토큰을 잘 맞히도록" 이 다이얼들을 조금씩 돌려 맞추는 과정입니다(4부의 주제).
이 비유가 깨지는 곳: 다이얼 하나하나가 "음량", "고음"처럼 뜻이 분명하지 않습니다. 의미는 수십억 개에 분산되어 있어, 다이얼 하나가 무엇을 하는지 콕 집어 말하기 어렵습니다.
두 가지를 기억하세요.
첫째, 파라미터는 처음엔 무작위 숫자였다가 학습으로 정해집니다. 둘째, 학습이 끝나면 이 숫자들은 고정됩니다. 당신이 챗봇과 나누는 대화는 모델의 파라미터를 바꾸지 않습니다. 추론할 때 모델은 고정된 가중치로 돌아갑니다. 새 정보를 "기억"시키려면 원칙적으로 다시 학습시켜야 합니다.
흔한 오해 깨기
흔히들 "내가 알려준 사실을 AI가 학습해서 기억한다"고 생각하지만, 실제로는 대화 중 알려준 내용은 그 대화의 맥락(컨텍스트) 안에서만 쓰이고, 대화가 끝나면 모델 가중치에 남지 않습니다. 모델의 "지식"은 학습 시점에 굳어진 파라미터에 있습니다(4부, 6부에서 자세히).
3부 요약
- 한 토큰의 의미는 고정이 아니라 문장 속 다른 토큰들과의 관계로 매번 계산됩니다.
- 어텐션은 각 토큰이 질의(Query)·열쇠(Key)·값(Value)을 통해 "어떤 토큰을 얼마나 참조할지" 정하고 정보를 섞는 장치입니다.
- 멀티헤드는 여러 관점의 관계를 동시에 살핍니다.
- 트랜스포머는 어텐션+피드포워드 층을 수십~수백 개 쌓아 의미를 점진적으로 정교화합니다.
- 파라미터(가중치) 는 학습으로 맞춰지는 수십억 개의 조절 숫자이며, 학습이 끝나면 고정됩니다. 대화는 가중치를 바꾸지 않습니다.
- 층과 헤드의 역할, 다이얼의 의미는 대체로 불투명합니다 — 이 점이 6부의 한계와 이어집니다.
이제 모델의 구조를 봤습니다. 다음 부에서는 이 수십억 개의 다이얼이 어떻게 맞춰지는지, 즉 학습을 다룹니다.
← 2부 언어를 숫자로 · 목차 · 다음: 4부 학습 →