
Multi-Head Attention 🎯 (100/100!)
v1 SDPA 는 하나의 attention head. Transformer 의 실제 레이어는 Multi-Head:
MHA(x)=Concat(head1,…,headH)Wo
headh=SDPA(Qh,Kh,Vh)
where Qh,Kh,Vh 는 x 를 각각 Wq,Wk,Wv 로 projection 후 H 개 head 로 분할한 slice.
왜 여러 head 가 필요한가
- 하나의 attention 은 한 가지 관계 에만 집중 (예: 문법적 연결).
- 여러 head = 여러 부분 공간 에서 서로 다른 관계 학습 (구문·의미·위치 등).
- 같은 dmodel 을 H 등분하므로 파라미터 수는 동일 (projection 크기만 분할).
구현 순서
- Q=xWq, K=xWk, V=xWv — 모두
(L, d_model).
- 각각
(L, H, d_head) 로 reshape → (H, L, d_head) 로 transpose.
- 각 head 별로: score=QhKhT/dhead.
- mask 적용 (
(L, L) bool 을 head 축으로 broadcast), softmax, × Vh.
- head 결과 concat
(L, d_model) → Wo.
d_model % num_heads == 0 가정.
과제
함수 multi_head_attention(x, W_q, W_k, W_v, W_o, num_heads, mask=None) 를 완성하세요.
x (L, d_model), W_q/W_k/W_v/W_o (d_model, d_model).
num_heads 로 분할.
- 반환
(L, d_model).
테스트 케이스
| # | 이름 | 검증 |
|---|
| 1 | shape (L, d_model) | |
| 2 | num_heads=1, W_*=I → SDPA | single-head identity |
| 3 | num_heads>1 ≠ single head | |
| 4 | W_o=0 → 출력 = 0 | |
| 5 | W_v=0 → 출력 = 0 | |
| 6 | mask 적용 확인 | 차단 토큰 무시 |
| 7 | 각 head 의 softmax weight 합 = 1 (간접 검증) | |