Attention은 Q와 K로 참고 비율을 정하고, 그 비율로 V를 섞어 새로운 표현을 만드는 계산이다.
- 이전: 1편 · Encoder와 Decoder.
- 2편 · 현재 글: Q·K·V의 역할 → 가중합 → 수식 → Multi-Head → 연결 위치.
- 다음: 3편 · FFN·위치 인코딩·연산량·KV 캐시.
- 해설의 범위: 원 논문의 Scaled Dot-Product Attention. 아래 문장·숫자·head 역할은 이해를 위한 작성자의 예시이며 실제 모델의 관측값이 아님.
1. 한 토큰의 표현에 문맥을 넣기
- 예시 문장: “동물이 길을 건너지 않았다. 그것은 너무 피곤했다.”
- 설명할 위치:
그것. 이 위치의 표현을 만들 때동물의 정보를 많이 참고하면 유용할 수 있음. - 계산 방식: 관련 토큰 하나만 선택하는 대신, 각 위치의 정보를 서로 다른 비율로 합산.
- Self-Attention: Q·K·V의 출처가 같은 시퀀스. 자기 토큰만 본다는 뜻이 아니라, 같은 시퀀스의 허용된 위치들을 참고한다는 뜻.
2. Q·K·V를 나누는 이유
| 벡터 | 해설용 비유 | 계산에서의 역할 |
|---|---|---|
| Q · Query | 무엇을 찾는가 | 참고하려는 위치의 비교 벡터 |
| K · Key | 어떤 조건과 맞는가 | 각 후보 위치의 비교 벡터 |
| V · Value | 무엇을 전달하는가 | 실제 가중합에 들어가는 정보 |
- 모두 숫자 벡터: Q에 자연어 질문이 저장되는 것은 아님.
- 학습 가능한 변환:
Q = XW_Q,K = XW_K,V = XW_V. 같은 X에서도 가중치가 다르므로 서로 다른 표현 생성. - 역할 분리: Q·K는 비율 결정, V는 내용 전달. 같은 벡터를 비교와 전달에 모두 쓰도록 강제하지 않는 구조.
- 내적의 의미: 학습된 공간에서의 적합도 점수. 정규화된 코사인 유사도나 사람이 정의한 의미 유사도와 반드시 같지는 않음.
3. 참고 비율로 V를 섞기
- 그림의 현재 Q:
그것위치의 query. - 예시 단순화를 위해
동물,길,그것세 위치만 사용. - 아래 비율은 이미 softmax를 거쳤다고 가정한 값. Q·K에서 실제로 측정한 값은 아님.
| 참고 위치 | 가중치 | V | 가중치를 곱한 V |
|---|---|---|---|
| 동물 | 0.7 | [10, 0] |
[7, 0] |
| 길 | 0.1 | [0, 10] |
[0, 1] |
| 그것 | 0.2 | [5, 5] |
[1, 1] |
| 합계 | 1.0 | — | [8, 2] |
- 출력:
0.7 × [10, 0] + 0.1 × [0, 10] + 0.2 × [5, 5] = [8, 2]. - 이 출력은
그것위치에서 모은 정보. 각 위치의 Q로 같은 계산을 수행하면 위치별 출력 벡터 생성. - V의 수치는 설명용 좌표이며, 첫 성분을 특정 의미로 고정해 해석하지 않음.
4. Scaled Dot-Product Attention 수식 읽기
| 순서 | 연산 | 의미 |
|---|---|---|
| 1 | QKᵀ |
각 Q와 모든 K의 내적 점수 |
| 2 | ÷ √d_k |
head의 key 차원에 따른 점수 크기 조절 |
| 3 | 필요하면 마스크 | 미래·패딩 위치를 softmax 전에 제외 |
| 4 | 행별 softmax | 각 Q마다 허용된 K에 대한 합이 1인 비율 생성 |
| 5 | × V |
해당 비율로 V들을 가중합 |
- 스케일링의 이유: 차원이 커질 때 내적 크기가 커져 softmax가 지나치게 뾰족해지는 현상을 완화.
- 원 논문의 설명 전제: Q·K 성분이 독립이고 평균 0·분산 1이면 내적의 분산은
d_k. 따라서√d_k로 나누면 분산 크기를 조절 가능. - 행렬 표기: 여러 토큰의 query를 행으로 모은 것이 Q. 모든 위치의 계산을 행렬 곱으로 묶어 병렬 처리.
기존 그림: Scaled Dot-Product Attention

기존 그림 1 — 점수 계산·스케일링·마스크·softmax·V 가중합. 위 단계 표와 함께 읽는 기존 도식. 수식과 구조의 기준: 원 논문 §3.2.1, Figure 2.
5. Multi-Head: 왜 여러 벌로 계산할까
서로 다른 참고 비율과 정보 변환으로 만든 결과를, 결합 단계까지 따로 유지하기 위해서다.
- 예시 문장: “민수가 영희에게 책을 주었다.”
주었다위치에서 필요한 관계의 예: 누가 주었는지, 누구에게 주었는지, 무엇을 주었는지.- 단일 head: 여러 토큰을 참고할 수 있지만, query마다 참고 비율 한 벌로 V를 합산.
- 여러 head: 각각 다른 Q·K·V 가중치를 사용해 서로 다른 비율과 전달 정보를 학습할 수 있음.
- 결합: head별 결과를 특성 차원으로 이어 붙인 뒤
W_O로 선형 변환. - 해석의 한계: “1번 head는 주어 담당”처럼 역할을 지정하지 않음. 비슷하거나 중복된 head가 생길 수 있으며, 문법 역할별 분업이 보장되는 것도 아님.
X_Q,X_K,X_V: 투영 전의 입력 표현. Self-Attention에서는 같은 시퀀스, Cross-Attention에서는 디코더와 인코더에서 각각 가져옴.
| 비교 기준 | 단일 head | 여러 head |
|---|---|---|
| query별 참고 비율 | 한 벌 | head마다 한 벌 |
| 정보 투영 | 한 종류의 Q·K·V 변환 | head마다 서로 다른 변환 |
| 가중합 결과 | 하나의 혼합 결과 | 서로 다른 혼합 결과를 이어 붙임 |
| 관계 학습 | 여러 관계를 표현할 수 있음 | 다양한 관계를 병렬로 학습할 여지 |
| 보장되지 않는 것 | 한 토큰만 본다는 해석 | head마다 고정된 의미 역할이라는 해석 |
Head 수만큼 계산량이 늘어날까
- 원 논문 기본 모델:
d_model = 512,h = 8, head당d_k = d_v = 64. - 폭 고정: 전체 차원 512를 유지하면서 각 head를 작게 구성.
- Attention 행렬 곱:
h × n² × (d/h) = n²d. 전체 차원d를 고정하면 head 수에 단순 비례하지 않음. - 비용 해석: 원 논문은 전체 차원을 쓰는 단일 head와 비슷한 계산 비용으로 여러 투영을 사용. “멀티 헤드 자체가 연산량을 줄인다”는 설명은 부정확.
- 남는 차이: softmax의 head별 비용, 메모리 배치와 하드웨어 효율은 달라질 수 있음. 자세한 비교는 3편 참고.
기존 그림: Multi-Head Attention

기존 그림 2 — Linear → 병렬 Attention → Concat → Linear. 추가 도표는 이 구조를 역할별로 풀어 쓴 해설. 구조의 기준: 원 논문 §3.2.2, Figure 2.
6. 같은 계산을 어디에 연결하는가
| 적용 위치 | Q의 출처 | K·V의 출처 | 참고 가능한 위치 |
|---|---|---|---|
| 인코더 Self-Attention | 해당 층의 인코더 입력 | 같은 입력 | 패딩을 제외한 원문 전체 |
| 디코더 Masked Self-Attention | 해당 층의 디코더 입력 | 같은 입력 | 현재 위치와 이전 위치 |
| 디코더 Cross-Attention | 첫 Add & Norm 뒤의 디코더 표현 | 인코더의 최종 출력 | 패딩을 제외한 원문 전체 |
- 계산 원리는 동일: Q·K로 비율을 정하고 V를 합산.
- 달라지는 점: 표현의 출처와 마스크. Cross-Attention은 출력 문장의 각 위치가 입력 문장을 참고하는 연결.
- 마스킹의 기준: 현재 입력 위치는 볼 수 있음. 한 칸 밀린 정답을 예측하므로 다음 정답을 미리 보지 않는 구조.
다음 편과 참고자료
- 다음: 3편 — FFN·위치 인코딩·연산량·KV 캐시.
- 원 논문: Attention Is All You Need, §3.2.
- 기존 참고자료: PyTorch 공식 코드.
- 기존 참고자료: Transformer 분석: Transformer의 Encoder 이해하기.