b belajar.myudak

Scaled dot-product attention

Implementasikan inti transformer:

Attention(Q,K,V)=softmax ⁣(QK⊤d)V\text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^\top}{\sqrt{d}}\right)V

Input bisa punya dimensi batch di depan. Softmax dilakukan di sepanjang axis key (axis terakhir dari skor), dan harus stabil walau skornya besar.

Q = [[1, 0]], K = [[1, 0], [0, 1]], V = [[10, 0], [0, 10]]
skor = [0.707, 0], bobot = [0.67, 0.33]  →  [[6.70, 3.30]]
Scaled dot-product attention
query ↓ / key →kucingitutidurdiataskasur
kucing0.200.160.170.150.150.16
itu0.120.120.120.160.210.27
tidur0.350.140.170.110.110.12
di0.110.110.110.160.220.29
atas0.120.130.130.170.200.25
kasur0.170.150.150.160.170.19

Baris “tidur”: paling memperhatikan kucing (35%). Outputnya adalah rata-rata berbobot dari vektor V semua token dengan bobot di baris ini.

Attention(Q, K, V) = softmax(QKᵀ / √d) V. Setiap baris dijumlahkan menjadi 1. Matikan "bagi √d" dan lihat baris menjadi lebih "tajam". Nyalakan causal mask: token hanya boleh melihat dirinya dan token sebelumnya (dipakai GPT).

Query, key, value

Bayangkan setiap token bertanya (query): “informasi apa yang saya butuhkan?”. Setiap token juga punya label (key): “saya berisi informasi tentang apa”. Skor qi⋅kjq_i\cdot k_j mengukur seberapa cocok pertanyaan token ii dengan label token jj. Softmax mengubah skor menjadi bobot, lalu output token ii adalah rata-rata berbobot dari isi (value) semua token.

Kenapa dibagi √d

Jika komponen qq dan kk independen dengan varians 1, maka q⋅kq\cdot k punya varians dd. Untuk d=64d = 64, skornya berkisar ±8\pm 8 atau lebih. Softmax dari skor sebesar itu hampir one-hot, dan gradiennya nyaris nol. Membagi dengan d\sqrt{d} mengembalikan varians skor ke 1. Matikan opsi “bagi √d” di widget untuk melihat efeknya.

Bentuk

(T, d) @ (d, T) → (T, T): setiap pasangan token punya satu skor. Karena itu biaya attention kuadratik terhadap panjang konteks, dan itulah alasan konteks panjang mahal.

Penjelasan

Yang diminta. softmax(QK⊤/d) V\text{softmax}(QK^\top/\sqrt d)\,V, untuk input yang boleh punya dimensi batch di depan.

Tiga langkah, masing-masing dengan maknanya:

  1. Skor kecocokan. scores = Q @ np.swapaxes(K, -1, -2) / np.sqrt(d). Baris i kolom j adalah qi⋅kj/dq_i\cdot k_j / \sqrt d: seberapa cocok “pertanyaan” token i dengan “label” token j. Bentuknya (..., Tq, d) @ (..., d, Tk) → (..., Tq, Tk). np.swapaxes(K, -1, -2) menukar dua axis terakhir dan bekerja untuk berapa pun dimensi batch; K.T hanya benar untuk 2D.
  2. Bobot. softmax(scores) di axis terakhir (axis key), sehingga setiap baris berjumlah 1 dan menjawab “token i membagi perhatiannya ke token mana saja”.
  3. Campuran. @ V: output token i adalah rata-rata berbobot dari semua baris V, dengan bobot dari baris i.

Kenapa dibagi √d. Dot product dari vektor berdimensi d dengan komponen acak bervarians 1 punya varians d. Tanpa pembagi, skornya besar dan softmax menjadi hampir one-hot, sehingga gradiennya hampir hilang.

Cek case 1. Skor =[1/2, 0]=[0.707,0]= [1/\sqrt2,\ 0] = [0.707, 0], softmax =[0.670,0.330]= [0.670, 0.330], output =0.670⋅[10,0]+0.330⋅[0,10]=[6.70,3.30]= 0.670\cdot[10,0] + 0.330\cdot[0,10] = [6.70, 3.30].

Case 2 (Q = 0). Semua skor 0, jadi bobotnya rata dan output adalah rata-rata biasa dari V: (1+3)/2=2(1 + 3)/2 = 2.

Yang dikembalikan: array (..., Tq, dv).

Topik
attentionsoftmaxtransformer
Petunjuk 1

Skor: Q @ K.T / √d. Untuk input berbatch, transpose dua axis terakhir dengan np.swapaxes(K, -1, -2).

Petunjuk 2

Softmax di axis terakhir (axis key), dengan trik pengurangan max supaya stabil. Lalu kalikan dengan V.

Python 3.14 · NumPy

Pengaturan editor

Ukuran font
Ukuran huruf di editor.
Ukuran tab
Lebar indentasi. Otomatis: 2 spasi untuk TypeScript, 4 untuk Python.
Key bindings
Ganti ke mode Vim.
Nomor baris relatif
Nomor baris dihitung dari posisi kursor (berguna untuk gerakan Vim).
Word wrap
Baris panjang dilipat agar muat di lebar editor.
IntelliSense
Saran kode otomatis saat mengetik (Ctrl+Spasi tetap bisa dipakai saat mati).

Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.