Multi-head attention
Implementasikan causal multi-head self-attention:
- Q=XWq, K=XWk, V=XWv, semuanya
(T, D). - Pecah dimensi
Dmenjadin_headshead berukuranhd = D / n_heads. - Untuk setiap head, hitung causal attention dengan skala 1/hd.
- Gabungkan kembali semua head menjadi
(T, D), lalu kalikan dengan Wo.
Head ke-h memakai kolom h*hd : (h+1)*hd dari Q, K, dan V.
Kenapa banyak head
Satu head attention hanya menghasilkan satu pola bobot per token, padahal satu token sering butuh beberapa jenis informasi sekaligus: subjek kalimatnya, kata sebelumnya, tanda kurung yang belum ditutup. Dengan H head, model bisa memperhatikan H hal berbeda secara paralel. Biayanya hampir sama dengan satu head besar, karena setiap head hanya berdimensi D/H.
Trik reshape
Tidak perlu loop per head. Cukup:
(T, D) --reshape--> (T, H, hd) --transpose--> (H, T, hd)Sekarang H berperan sebagai dimensi batch, dan matmul berbatch dari soal P0 mengerjakan semua head sekaligus. Kebalikannya: transpose(1, 0, 2).reshape(T, D).
Kalau ada dimensi batch B juga, bentuknya menjadi (B, H, T, hd). Itulah bentuk yang akan kamu lihat di kode GPT mana pun.
W_o
Setelah digabung, setiap head hanya “menulis” ke potongan dimensinya sendiri. Proyeksi output Wo mencampur hasil semua head sebelum dimasukkan ke residual stream.
Penjelasan
Yang diminta. Causal self-attention dengan n_heads kepala, masing-masing berdimensi hd = D / n_heads, lalu proyeksi output Wo.
Langkah di kode:
- Proyeksi.
X @ Wq,X @ Wk,X @ Wv, masing-masing(T, D). - Pecah per head.
split = lambda M: M.reshape(T, H, hd).transpose(1, 0, 2).reshape(T, H, hd)memotong setiap barisDmenjadiHpotongan berukuranhd: headhmemakai kolomh*hd .. (h+1)*hd.transpose(1, 0, 2)memindahkanHke depan menjadi(H, T, hd), sehinggaHberperan sebagai dimensi batch. - Attention per head sekaligus.
Q @ K.transpose(0, 2, 1) / np.sqrt(hd)berbentuk(H, T, T): satu matriks skor per head. Skalanya hd, bukan D, karena dot product-nya hanya sepanjanghd. - Mask kausal + softmax, sama seperti soal sebelumnya. Mask
(T, T)di-broadcast ke semua head. - Gabungkan.
(w @ V)berbentuk(H, T, hd)→transpose(1, 0, 2)→(T, H, hd)→reshape(T, D). Ini kebalikan persis dari langkah 2. @ Womencampur hasil semua head.
Cek case 1 vs 2. Input dan bobot sama, hanya n_heads berbeda. Dengan 2 head, setiap head hanya melihat 1 dimensi, sehingga pola attention-nya berbeda dan hasilnya berbeda ([0.5, 0.731] vs [0.330, 0.670]). Banyaknya head mengubah apa yang bisa diperhatikan model.
Yang dikembalikan: array (T, D).
Topik
Petunjuk 1
Proyeksikan dulu: Q = X @ Wq, K = X @ Wk, V = X @ Wv, semuanya (T, D).
Petunjuk 2
Pecah menjadi head: reshape(T, H, hd) lalu transpose(1, 0, 2) → (H, T, hd). Attention berbatch per head memakai √hd, bukan √D.
Petunjuk 3
Setelah attention, kembalikan ke (T, H, hd), reshape ke (T, D), lalu kalikan dengan Wo.
Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.