Attention adalah mekanisme yang memungkinkan setiap posisi dalam sekuens melihat dan menggabungkan informasi dari posisi lain dengan bobot yang dihitung dari kecocokannya, dan tiga perannya bernama query, key, dan value. Topik ini membangun intuisi ketiganya lewat analogi pencarian, menuliskan alur ganda kecocokan lalu penggabungan, dan menyeragamkan kosakata yang dipakai sepanjang modul. Setelah selesai, rumus attention pada topik berikutnya punya makna yang melekat pada setiap simbolnya.
Analogi pencarian yang menetapkan tiga peran#
Cara paling ringkas memahami attention adalah perbandingan dengan pencarian di katalog. Saat mencari buku tertentu, sebuah pertanyaan disusun, yaitu query, dan setiap katalog menyimpan label kemiripan yang dapat dibandingkan dengan pertanyaan, yaitu key, bersama isinya yang diambil ketika kecocokan tinggi, yaitu value. Attention menjalankan prosedur yang sama dalam bentuk vektor, dan kecocokannya tidak biner melainkan skor kontinu yang diubah menjadi bobot penjumlahan.
Dua sifat membedakan attention dari pencarian sungguhan. Pertama, ketiga perannya bukan objek yang berbeda melainkan proyeksi dari token yang sama, sehingga satu kata memainkan ketiganya sekaligus melalui matriks proyeksi yang dipelajari. Kedua, penggabungannya halus, yaitu value tidak diambil utuh dari satu sumber melainkan dicampur dari semua posisi dengan bobot kecocokan, sehingga keluaran setiap posisi adalah campuran terbobot dari seluruh sekuens.
Bentuk umumnya ditulis dengan skor kecocokan antara query posisi dan key posisi , yang diubah menjadi bobot melalui softmax per baris:
Dua baris itu adalah attention. Baris pertama menyatakan alokasi perhatian yang jumlahnya satu, dan baris kedua menyatakan penggabungan value dengan alokasi itu. Seluruh variasi arsitektur attention, termasuk cross-attention pada penerjemah dan masked attention pada model bahasa, hanya mengubah sumber query dan key serta batas posisinya, bukan bentuk perhitungannya.
Skor kecocokan dan kebebasan dari jarak#
Pertanyaan yang paling wajar menyusul definisi itu adalah dari mana skor kecocokan berasal, dan jawaban sederhananya adalah perkalian titik. Dua vektor yang searah menghasilkan skor besar, dua vektor yang tegak lurus menghasilkan nol, dan dua vektor yang berlawanan menghasilkan negatif, sehingga perkalian titik memberi ukuran kemiripan yang murah dihitung secara massal. Bentuk pilihan lain seperti tambah-umpan-maju pernah dipakai, tetapi perkalian titik menang karena cocok dengan perangkat keras matriks.
Konsekuensi strukturalnya lebih besar daripada pilihannya. Skor dihitung berpasangan untuk setiap pasangan posisi, tanpa melihat jarak di antara keduanya, sehingga token pada posisi pertama dapat mengaitkan diri dengan posisi keseratus dalam satu langkah. Bandingkan dengan RNN yang menempuh seratus tahap untuk jalur yang sama, dan itulah jawaban arsitektural atas memori jarak jauh yang terukur pada topik RNN. Harganya juga jelas, yaitu matriks skor berukuran kuadrat panjang sekuens, dan pertukaran ini yang membentuk batas konteks model bahasa.
Peragaannya dapat dijalankan pada empat token dengan vektor yang ditetapkan manual, sehingga skor, bobot, dan campuran hasilnya terlihat pada angka yang kecil.
import torch
q = torch.tensor([1.0, 0.0])
kunci = torch.tensor([[1.0, 0.0], [0.7, 0.7], [0.0, 1.0], [-1.0, 0.0]])
value = torch.tensor([[10.0, 0.0], [0.0, 10.0], [5.0, 5.0], [-10.0, 0.0]])
skor = kunci @ q
bobot = torch.softmax(skor, dim=0)
campuran = bobot @ value
print("skor :", [round(v, 3) for v in skor.tolist()])
print("bobot :", [round(v, 3) for v in bobot.tolist()])
print("campuran:", [round(v, 3) for v in campuran.tolist()])skor : [1.0, 0.7, 0.0, -1.0]
bobot : [0.446, 0.33, 0.164, 0.06]
campuran: [4.673, 4.121]Query yang searah dengan key pertama memberinya bobot terbesar, key ketiga yang tegak lurus tetap menerima bagian dari softmax, dan campuran value dikuasai sumber yang cocok. Angka campuran yang bukan milik satu sumber apa pun adalah wujud pernyataan penggabungan halus di atas, dan inilah perilaku yang akan dihitung massal pada topik Mekanika self-attention.
Kosakata yang diseragamkan sejak sekarang#
Tiga istilah dipakai dengan makna tetap pada seluruh modul. Self-attention adalah attention yang query, key, dan value-nya berasal dari sekuens yang sama, dan inilah mekanika utama transformer encoder. Cross-attention memisahkan sumbernya, yaitu query dari satu sekuens dan key serta value dari sekuens lain, dan inilah jembatan antara encoder dan decoder pada model terjemahan. Topeng kausalitas membatasi key yang boleh dilihat agar posisi tidak melihat masa depan, dan wajib pada decoder generatif yang dipakai model bahasa.
Satu kekeliruan kosakata yang perlu dicegah adalah memperlakukan attention sebagai penyimpanan atau memori. Attention tidak menyimpan apa pun, melainkan menghitung ulang penggabungan setiap kali dipanggil, dan semua pengetahuannya hidup di dalam matriks proyeksi yang dipelajari. Pemahaman ini mencegah kesalahan pemodelan yang umum terjadi, dan menutup persiapan menuju perhitungan scaled dot-product yang lengkap.
Ringkasan#
- Attention menggabungkan informasi dari seluruh posisi dengan bobot kecocokan, dan query, key, value adalah tiga proyeksi dari token yang sama.
- Skor kecocokan dihitung perkalian titik, diubah softmax menjadi bobot yang berjumlah satu, lalu dipakai mencampur value.
- Kecocokan berpasangan tanpa melihat jarak menjawab ketergantungan jauh RNN, dengan harga matriks skor berukuran kuadrat panjang sekuens.
- Self-attention, cross-attention, dan topeng kausalitas adalah variasi sumber dan batas posisi, bukan variasi bentuk perhitungan.
Referensi#
- Attention Is All You Need — arXiv — Makalah Vaswani dkk. yang memperkenalkan scaled dot-product attention dan transformer.
- Attention? Attention! — Lilian Weng — Tinjauan yang memetakan keluarga attention beserta variasinya.
- Attention and Augmented Recurrent Neural Networks — Distill — Tulisan yang membangun intuisi attention sebagai penghubung sekuens.