
강의 영상 보기 (새 탭에서 재생)YouTube
📓Google Colab에서 실습하기
이 레슨은 PyTorch/GPU가 필요합니다. 노트북을 다운로드 후 Google Colab에서 열어주세요.
학습 내용
Multi-Head Attention - 여러 전문가의 협업
학습 목표
이 레슨을 완료하면:
- •Multi-Head Attention이 왜 필요한지 설명할 수 있다
- •여러 Head가 각기 다른 관계를 학습하는 원리를 이해한다
- •차원 분할과 병합 과정을 이해한다
- •numpy로 Multi-Head Attention을 직접 구현할 수 있다
핵심 메시지
"Multi-Head Attention은 여러 전문가가 동시에 문장을 분석하는 것이다." 한 전문가는 문법을, 다른 전문가는 의미를, 또 다른 전문가는 위치 관계를 분석합니다.
왜 Multi-Head가 필요한가?
비유: 영화 분석팀
비유: 영화를 분석할 때 한 사람보다 여러 전문가가 각자의 관점에서 보는 것이 더 좋습니다.
영화 "기생충" 분석:
| 전문가 | 초점 |
|---|---|
| 전문가 1 (연출) | 카메라 각도, 조명에 주목 |
| 전문가 2 (각본) | 대사, 스토리 구조에 주목 |
| 전문가 3 (사회학자) | 계급 갈등에 주목 |
종합하면 → 훨씬 깊고 다양한 분석이 완성!
단일 Head의 한계
문장: "선생님이 학생에게 어려운 수학 문제를 설명했다"
다양한 관계가 존재:
| 관계 유형 | 연결 | 설명 |
|---|---|---|
| 문법적 | "선생님이" ↔ "설명했다" | 주어-동사 |
| 의미적 | "수학" ↔ "문제" | 수식 관계 |
| 행위적 | "학생에게" ↔ "설명했다" | 간접목적어-동사 |
단일 Head는 이 모든 것을 하나의 패턴으로 표현해야 합니다. Multi-Head라면 각 Head가 하나의 관계에 집중할 수 있습니다!
Multi-Head Attention의 구조
핵심 수식
여기서:
- •
- • = Head 개수 (보통 8 또는 16)
차원 분할 - 계산량을 늘리지 않는 비결
| 파라미터 | 값 | 설명 |
|---|---|---|
| 512 | 전체 모델 차원 | |
| 8 | Head 개수 | |
| 64 | 각 Head의 차원 (512 / 8) |
파라미터 수가 동일합니다! 계산량은 비슷하지만, 8가지 다른 관점을 학습할 수 있습니다.
차원 변환 과정
| 단계 | 동작 | 차원 |
|---|---|---|
| 1 | 입력 | [batch, seq_len, 512] |
| 2 | Q, K, V 생성 | 각각 [batch, seq_len, 512] |
| 3 | Head로 분할 | [batch, 8, seq_len, 64] |
| 4 | 각 Head에서 독립적으로 Attention 수행 | [batch, 8, seq_len, 64] |
| 5 | Head 합치기 (Concatenate) | [batch, seq_len, 512] |
| 6 | W_O 적용 | [batch, seq_len, 512] |
입력과 출력의 크기가 같습니다!
각 Head가 학습하는 것
실제 학습된 Transformer를 분석하면, 각 Head가 자동으로 다른 패턴을 학습합니다.
| Head | 학습된 패턴 | 예시 |
|---|---|---|
| Head 1 | 인접 단어 관계 | "빨간" → "사과" |
| Head 2 | 주어-동사 관계 | "고양이가" → "먹었다" |
| Head 3 | 대명사 해석 | "it" → "cat" |
| Head 4 | 구분자 주목 | 문장 끝 토큰에 집중 |
| Head 5 | 수식어-명사 | "아름다운" → "꽃" |
중요: 이 역할 분담은 사람이 지정하지 않습니다! 학습 과정에서 각 Head가 자동으로 유용한 패턴을 찾아냅니다.
실행해보기: numpy로 Multi-Head Attention 구현
pythonimport numpy as np np.random.seed(42) seq_len, d_model, num_heads = 4, 8, 2 d_k = d_model // num_heads # = 4 words = ["나는", "맛있는", "사과를", "먹었다"] print(f"===== Multi-Head Attention 데모 =====") print(f"단어 수: {seq_len}, 모델 차원: {d_model}, Head 수: {num_heads}, 각 Head 차원: {d_k}") print() X = np.random.randn(seq_len, d_model) # 각 Head의 가중치 행렬 W_Qs = [np.random.randn(d_model, d_k) * 0.5 for _ in range(num_heads)] W_Ks = [np.random.randn(d_model, d_k) * 0.5 for _ in range(num_heads)] W_Vs = [np.random.randn(d_model, d_k) * 0.5 for _ in range(num_heads)] def softmax(x): exp_x = np.exp(x - np.max(x, axis=-1, keepdims=True)) return exp_x / np.sum(exp_x, axis=-1, keepdims=True) head_outputs = [] for h in range(num_heads): print(f"===== Head {h+1} =====") Q, K, V = X @ W_Qs[h], X @ W_Ks[h], X @ W_Vs[h] weights = softmax(Q @ K.T / np.sqrt(d_k)) header = " " + " ".join(f"{w:>6}" for w in words) print(f" {header}") for i, word in enumerate(words): row = " ".join(f"{weights[i,j]:>6.3f}" for j in range(seq_len)) print(f" {word:>8} {row}") for i, word in enumerate(words): max_idx = np.argmax(weights[i]) print(f" {word} → {words[max_idx]}에 주목 ({weights[i, max_idx]:.1%})") head_outputs.append(weights @ V) print() # Head 합치기 concatenated = np.concatenate(head_outputs, axis=-1) W_O = np.random.randn(d_model, d_model) * 0.5 final_output = concatenated @ W_O print(f"===== 결과 =====") print(f" Head 1 출력: {head_outputs[0].shape}, Head 2 출력: {head_outputs[1].shape}") print(f" 합친 크기: {concatenated.shape} → W_O 적용 → {final_output.shape}") print(f" 입력과 출력 크기 동일: {X.shape} == {final_output.shape}")
실제 모델들의 Head 설정
| 모델 | d_model | Head 수 | d_k | 파라미터 수 |
|---|---|---|---|---|
| Transformer 원본 | 512 | 8 | 64 | 65M |
| BERT-Base | 768 | 12 | 64 | 110M |
| GPT-2 | 768 | 12 | 64 | 117M |
| GPT-3 | 12288 | 96 | 128 | 175B |
PyTorch로 보는 Multi-Head Attention (참고용)
import torch.nn as nn
# PyTorch 내장 클래스 사용
mha = nn.MultiheadAttention(embed_dim=512, num_heads=8)
# Self-Attention: query = key = value = x
x = torch.randn(10, 32, 512) # (seq_len, batch, d_model)
output, attn_weights = mha(x, x, x)
핵심 요약
| 개념 | 설명 | 비유 |
|---|---|---|
| Multi-Head | 여러 Attention을 병렬 실행 | 여러 전문가가 동시 분석 |
| 차원 분할 | d_model을 h개의 d_k로 나눔 | 업무를 분담 |
| 역할 분담 | 각 Head가 다른 패턴 학습 | 각 전문가의 전문 분야 |
| Concatenate | 모든 Head 출력을 이어붙임 | 전문가 의견 종합 |
| W_O | 종합된 정보의 최종 변환 | 종합 보고서 작성 |
학습 체크리스트
- • 단일 Head의 한계를 설명할 수 있다
- • Multi-Head가 차원을 분할하는 방식을 이해했다
- • 각 Head가 서로 다른 패턴을 자동으로 학습함을 안다
- • 파라미터 수가 증가하지 않는 이유를 이해했다
- • numpy 데모에서 Head별 Attention 패턴 차이를 확인했다
다음 레슨: Positional Encoding - Transformer가 단어 순서를 어떻게 이해하는지 배웁니다!
레슨 정보
- 레벨
- Level 7: Transformer & LLM 원리
- 예상 소요 시간
- 45분
- 참고 영상
- YouTube 링크
💡실습 환경 안내
이 레벨은 PyTorch/GPU가 필요하여 Google Colab 사용을 권장합니다.
Colab은 무료 GPU를 제공하여 PyTorch, CNN, Transformer 등을 실행할 수 있습니다.