
GPT는 단어의 의미를 전혀 모른다. 그것이 바로 핵심이다.
요약
GPT와 같은 언어 모델이 어텐션 메커니즘을 통해 단어 간의 관계를 어떻게 수치적으로 파악하는지 설명합니다. 무작위 임베딩에서 시작하여 행렬 곱셈과 인과적 마스킹을 거쳐 문맥을 형성하는 과정을 구체적인 수치 예시로 분석합니다.
핵심 포인트
- 어텐션은 단어 간의 관계를 숫자로 파악하는 핵심 방법임
- 임베딩은 초기에는 무작위 좌표 벡터로 시작함
- 인과적 마스킹을 통해 미래 토큰을 차단하고 이전 문맥만 활용함
- Q·K 내적과 소프트맥스를 통해 토큰 간 주의(attention) 점수를 할당함
그리고 어텐션 메커니즘 (attention mechanism)은 결국 숫자만으로 어떻게 사물을 파악하는지에 대한 정확한 방법이다.
어텐션에 대한 대부분의 설명은 만화 같은 수준에서 멈춘다. 단어들 사이의 화살표, 빛나는 연결선, 그리고 토큰(tokens)들이 서로를 "바라본다"는 모호한 개념 말이다.
나는 모든 숫자를 직접 하나하나 추적했다. 의사코드(pseudocode)가 아니다. 실제 행렬 곱셈(matrix multiplications)을 단계별로 수행했다.
실제로 어떤 일이 일어나는지 여기 있다.
설정 (The Setup)
이 walkthrough(단계별 설명)는 6개의 문장을 사용한다. 그게 전부다. 인터넷도, 위키피디아(Wikipedia)도 아니다. 단지 다음과 같다:
"I love pizza. You love burgers. She loves pizza. The cat chased the mouse. The dog chased the cat because it was fast. He hated broccoli but loved cake."
이로부터 모델은 22개의 고유 토큰(unique tokens)과 23개의 학습 쌍(training pairs)을 얻으며, 각 쌍은 (입력 시퀀스 → 다음 토큰) 작업이다. 첫 번째 학습 예시는 다음과 같다: [I]가 주어졌을 때, love를 예측하는 것.
학습 전, 모델은 각 단어에 임베딩 (embedding)이라고 불리는 무작위 2D 좌표 벡터를 할당한다. "love"는 [0.10, 0.30]에서 시작한다. 지금은 완전히 무의미하다. 그저 무작위로 초기화된 두 개의 숫자일 뿐이다.
그다음 어텐션 (attention)이 등장한다.
수학 전: 이해를 돕는 간단한 예시
코퍼스(corpus)의 5번째 문장을 예로 들어보자: "The dog chased the cat because it was fast."
모델이 "it"이라는 단어에 도달했을 때, 모델은 다음 질문에 답해야 한다: "it"은 개(dog)를 가리키는가, 아니면 고양이(cat)를 가리키는가?
모델이 찾아볼 수 있는 규칙은 없다. 모델은 이전 단어들을 되돌아보고 "it"과 가장 잘 어울리는 단어가 무엇인지 파악함으로써 결정해야 한다. 이것이 문자 그대로 어텐션이 하는 일이다. 모든 단어에 대해, 모델은 이전의 모든 단어를 되돌아보며 점수를 할당한다: 지금 내가 _너_에게 얼마나 많은 주의를 기울여야 하는가?
이제 우리의 더 단순한 시퀀스 [I, love, pizza]에 대해 구체적인 숫자로 나타내면 다음과 같다.
모든 Q·K 내적 (dot products)과 소프트맥스 (softmax) 수학 연산이 실행된 후, 다음과 같은 표를 얻게 된다. 각 행은 질문을 던지는 토큰이며, 각 열은 관찰 대상이 되는 토큰이다:
| 질문하는 토큰 | → I | → love | → pizza |
|---|---|---|---|
| I | 100% | (masked) | (masked) |
| ... | |||
| 이것을 다음과 같이 읽으십시오: "love"는 주의(attention)를 분산합니다. 51%는 "I"로 향하고, 49%는 자기 자신에게 머뭅니다. "pizza"는 모든 토큰을 볼 수 있으며 세 토큰 모두에 걸쳐 주의를 분산합니다. |
"masked" 항목은 0이 아닙니다. 그것은 $-\infty$이며, softmax를 거친 후 0이 됩니다. 이것을 인과적 마스킹 (causal masking)이라고 합니다. 모델이 "I" 다음에 올 내용을 예측할 때, "love"가 이미 그곳에 있다는 사실을 보는 것이 문자 그대로 차단됩니다. 모델은 오직 이전에 나온 것들만 사용할 수 있습니다.
수식을 보기 전에 주목해야 할 세 가지 사항이 있습니다:
- "I"는 이전에 아무것도 오지 않았기 때문에 자기 자신만을 봅니다. 아직 빌려올 문맥 (context)이 없습니다.
- "love"는 이미 의지할 수 있는 문맥을 가지고 있습니다. 이전에 나온 주어 "I"에 51%의 주의를 기울입니다.
- "pizza"는 전체 그림을 볼 수 있습니다. "I"와 "love"가 이전에 나왔다는 것을 알고 세 토큰 모두에 주의를 분산합니다.
이 표는 전체 Q/K/V 메커니즘의 출력물입니다. 이것이 어떻게 구축되는지 추적해 봅시다.
Q, K, V의 실제 정체
모든 글은 Q, K, V를 개념적으로 설명합니다: Query는 당신이 찾고 있는 것이고, Key는 당신이 광고하고 있는 것이며, Value는 당신이 실제로 보내는 것입니다. 좋습니다.
하지만 숫자로 보면 그것이 어떻게 보일까요?
[I, love, pizza] 시퀀스의 경우, 각 토큰은 세 개의 별도 학습된 가중치 행렬 ($W_q, W_k, W_v$)을 통과하여 각각의 Q, K, V 벡터를 생성합니다. "love"의 경우:
Q_love = [0.10, 0.25] ← "love"가 요청하는 것
K_love = [0.24, 0.08] ← "love"가 광고하는 것
V_love = [0.14, 0.27] ← "love"가 주의를 받았을 때 보낼 것
그 다음 어텐션 점수 (attention scores)가 계산됩니다: 모든 토큰의 Q 벡터는 다른 모든 토큰의 K 벡터와 내적 (dot-product)됩니다. 결과값은 $\sqrt{2}$로 스케일링(scaled)되고, 미래의 토큰을 볼 수 없도록 마스킹(masked)된 후, 합계가 1이 되는 가중치로 softmax 처리됩니다.
이 시퀀스에서 "love"에 대한 가중치는 다음과 같이 나옵니다:
- "I"에 주의: 51%
- 자기 자신에 주의: 49%
- "pizza"에 주의: masked (아직 예측되지 않음)
그다음 "love"에 대한 출력은 V 벡터들의 가중합 (weighted sum)으로 계산됩니다:
out(love) = 0.51 × V_I + 0.49 × V_love
= 0.51 × [0.32, 0.60] + 0.49 × [0.14, 0.27]
= [0.163, 0.306] + [0.069, 0.132]
...
여기서 멈춰보세요. 방금 무슨 일이 일어났는지 살펴보십시오.
"love"는 [0.10, 0.30]으로 시작했습니다. 어텐션 (attention)을 거친 후, 그것은 [0.232, 0.438]이 되었습니다. 이것은 동일한 벡터가 아닙니다. 공간상의 다른 지점입니다. 이제 그것은 "I"가 말하고자 했던 내용의 51%를 담고 있습니다.
이것은 비유가 아닙니다. "I"라는 문맥 속의 "love" 토큰은 단독으로 존재하는 "love" 토큰과는 말 그대로 다른 벡터입니다. 이것이 Transformer가 다의성 (polysemy)을 처리하는 방식입니다. 단어의 의미를 위한 조회 테이블 (lookup table)을 구축하는 것이 아니라, 학습된 어텐션 가중치 (attention weights)에 비례하여 벡터들을 혼합함으로써 처리합니다. 문맥이 수학을 통해 흐르는 것입니다.
아무도 시각화하지 않는 학습 부분
순전파 (forward pass) 이후, 모델은 첫 번째 예측을 수행합니다. 단지 [I]만 주어졌을 때, 모델은 love를 예측해야 합니다. 초기 결과:
- pizza: 22%
- broccoli: 21%
- love ✓: 17%
손실 (Loss) = 1.772. pizza가 우연히 승리했습니다. pizza의 Wo 열이 우연히 더 큰 무작위 가중치 (random weights)로 시작했기 때문입니다. 모델은 자신 있게 틀렸습니다.
그다음 역전파 (backpropagation)가 실행됩니다. 모든 가중치 행렬 (weight matrix)은 그래디언트 (gradient)를 받고 아주 미세하게 조정됩니다:
Wq[0][0]이0.400에서0.397로 감소Wo_love[0]이1.300에서1.305로 상승- love 임베딩 (embedding)이
[0.100, 0.300]에서[0.099, 0.289]로 이동
이러한 변화는 아주 미미합니다. 가장 큰 단일 업데이트는 0.020입니다. 그게 전부입니다.
하지만 중요한 점은 이것들이 복리로 쌓인다는 것입니다. 동일한 예시에 대해 4번의 반복 (iteration)을 거친 후:
| 반복 (Iteration) | P(love) | 손실 (Loss) |
|---|---|---|
| 1 | 17% | 1.772 |
| ... |
Wq[0][0]은 결국 0.391에 도달했습니다. 총 변화량은 0.009입니다. 4단계에 걸쳐 축적된 0.009라는 아주 작은 수치가, pizza가 22%로 이기던 예측을 love가 56%로 이기는 결과로 뒤집어 놓았습니다.
GPT-3는 이러한 단계를 약 3,000억 번 수행했습니다.
일반화의 순간
그 4번의 반복(iterations) 이후, 모델은 오직 [I] → love만을 보았습니다. [You] → love는 결코 본 적이 없습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기