- Ini adalah eksperimen yang membuat transformer decoder-only mirip GPT-2 memprediksi pola
(aab)*hanya dengan merancang bobot secara manual tanpa pelatihan - Prediksi
"aabaabaabaab..."perlu melihat dua token sebelumnya, sehingga lebih cocok untuk memperlihatkan cara kerja attention dibanding pola pergantian sederhana - Model dibuat kecil dengan
N_CTX=5,N_VOCAB=2,N_EMBED=8, dan menggunakan tokenisasia=0,b=1serta embedding one-hot - Satu attention head membagi perhatian masing-masing 0,5 ke dua token terbaru, lalu menghitung token berikutnya dengan memanfaatkan pembatalan pada encoding
a=1,b=-1 - Pada konteks yang tidak ambigu, model mencapai akurasi 100.0% (27/27), tetapi membutuhkan sekitar 4.000 FLOPs untuk satu prediksi dengan konteks 5 token, sehingga jauh lebih tidak efisien dibanding aturan yang diimplementasikan langsung
Mini GPT-2 dengan bobot yang ditentukan langsung tanpa pelatihan
- Tujuannya adalah memahami secara intuitif apa yang sebenarnya dilakukan tiap komponen transformer dan attention
- Model ini tidak dilatih dan juga tidak memakai bobot pralatih, melainkan dibuat dengan cara menetapkan setiap bobot secara manual dalam satu malam
- Strukturnya berupa transformer decoder-only mirip GPT-2, dan implementasinya disederhanakan dari implementasi picoGPT oleh jaymody
- menghapus layer norm
- memakai satu head alih-alih multi-head attention
- menghapus layer feed-forward
mlppada transformer block
Mengapa memilih sekuens (aab)*
- Awalnya, targetnya adalah memprediksi sekuens seperti
"ababababab", tetapi itu menjadi tugas yang terlalu mudah karena transformer memprediksi shifted sequence- jika
amaka prediksib, jika tidak makaa, sehingga embedding posisi tidak perlu digunakan
- jika
- Tugas akhirnya ditetapkan menjadi prediksi sekuens
"aabaabaabaab...", yaitu(aab)*- jika dua token sebelumnya adalah
abatauba, token berikutnya adalaha - jika dua token sebelumnya adalah
aa, token berikutnya adalahb bbdiperlakukan sebagai kasus di luar cakupan tugas
- jika dua token sebelumnya adalah
- Tokenisasinya sangat sederhana dan hanya menangani dua simbol
aadalah0badalah1
Dimensi model dan alur perhitungan
- Ada tiga parameter model yang dipilih
N_CTX = 5: panjang konteks maksimum yang dilihat model dalam sekali prosesN_VOCAB = 2: dua token,adanbN_EMBED = 8: ukuran embedding yang memuat ruang untuk token, posisi, dan perhitungan
- Meski tugas sebenarnya hanya membutuhkan dua token sebelumnya,
N_CTX=5dipilih agar mencakup situasi ketika token yang tidak relevan harus diabaikan - Fungsi
gptbekerja dalam urutan berikut- menambahkan embedding token dan embedding posisi dengan
wte[inputs] + wpe[range(len(inputs))] - melewatkannya melalui satu transformer block
- di akhir membuat logits ke ruang kosakata dengan
x @ wte.T
- menambahkan embedding token dan embedding posisi dengan
Embedding yang memuat posisi dan token sebagai one-hot
wpeadalah embedding posisi, dan 5 dimensi embedding pertama dipakai sebagai one-hot posisi- posisi 0 adalah
[1, 0, 0, 0, 0] - posisi 4 adalah
[0, 0, 0, 0, 1]
- posisi 0 adalah
wteadalah embedding token, dan 2 dimensi berikutnya dipakai sebagai one-hot token- token
aadalah[1, 0]pada dimensi token terkait - token
badalah[0, 1]
- token
- Posisi embedding ke-8 awalnya tidak digunakan, lalu dipakai sebagai scratch space di dalam transformer block
- Sebagai contoh,
"aabaa"direpresentasikan sebagai matriks embedding5 x 8, dan tiap baris memuat one-hot posisi serta one-hot token sekaligus
Cara attention head memilih dua token terbaru
- Transformer block terdiri dari satu attention head dan layer linear
c_projyang memproyeksikan kembali hasil attention ke ruang embedding c_attnadalah layer linear berukuranembed_size x (embed_size * 3)yang mengubah embedding masukan menjadi matriksqkv, lalu membaginya menjadiq,k, danvkmemisahkan embedding posisi untuk merepresentasikan informasi posisi yang dimiliki tiap tokenqmerepresentasikan rentang posisi yang ingin dicari oleh tiap posisi, lalu membentuk matriks skor attention melaluiq @ k.T- Setelah softmax dan causal mask, matriks attention memiliki sifat berikut
- baris pertama memberi 100% attention hanya ke token pertama
- baris-baris berikutnya masing-masing memberi attention
0.5ke dua token terbaru yang dapat diakses
- Causal mask menambahkan nilai yang sangat kecil ke posisi token masa depan, dalam kode nyata berupa nilai seperti
-1e10, agar token masa depan tidak bisa dilihat- model buatan tangan ini memang tidak dirancang untuk mengintip masa depan, tetapi mask tetap dipertahankan agar strukturnya tetap dekat dengan GPT-2
- Scaling dengan
np.sqrt(q.shape[-1])membantu memperbaiki gradien saat pelatihan nyata, tetapi tidak berpengaruh pada model buatan tangan ini
Prediksi yang dibangun dari encoding v dan pembatalan penjumlahan
vmengubah one-hot token menjadi encodinga=1,b=-1- Karena hasil attention merata-ratakan dua token terbaru dengan bobot 0,5, encoding ini menghitung aturan berikut
a, b→0.5 * 1 + 0.5 * (-1) = 0b, a→0.5 * (-1) + 0.5 * 1 = 0a, a→0.5 * 1 + 0.5 * 1 = 1
- Hasilnya, posisi ke-7 pada baris akan memiliki nilai berikut
0berarti harus memprediksia1berarti harus memprediksib
- Pada masukan
"aabaa", baris pertama bisa menghasilkan prediksibkarena informasinya belum cukup, tetapi prediksi setelahnya sesuai dengan aturan(aab)*
Mengirim nilai prediksi kembali ke ruang kosakata
c_projmengubah nilai pada posisi ke-7 dari hasil attention kembali ke format one-hot token- Bukan sekadar membuat
[..., 1, 0, ...]atau[..., 0, 1, ...], tetapi membuat one-hot yang diskalakan dengan1024embedding[row, 5] = 1024 + (-1024) * predictionembedding[row, 6] = 0 + 1024 * prediction
- Transformer block memiliki residual connection, yaitu
x = x + causal_self_attention(...), sehingga embedding asli ikut ditambahkan - Karena sinyal residual ini tersisa dan tidak diperlukan, skala
1024dipakai untuk mendominasinya - Terakhir, logits dibuat dengan menghitung
x @ wte.Tlalu menerapkan softmax- dalam konteks
"aabaa", baris prediksi terakhir menunjuk keb - saat pelatihan, prediksi di semua baris berguna, tetapi saat inferensi hanya baris terakhir yang diperlukan
- dalam konteks
Hasil generasi dan akurasi
- Fungsi
completememasukkan hingga 5 token terakhir ke model, lalu memilih token berikutnya denganargmaxdari baris terakhir hasil softmax - Contoh hasil generasi adalah sebagai berikut
complete("a")→a :: baabaabaabcomplete("ba")→ba :: abaabaabaacomplete("abaab")→abaab :: aabaabaaba
- Bahkan pada input di luar cakupan, model kadang dapat pulih ke pola berulang
complete("ababa")→ababa :: abaabaabaacomplete("bbbbb")→bbbbb :: aabaabaaba
- Pada pengujian
"aab" * 10, jika hanya konteks yang tidak ambigu yang dievaluasi, akurasinya 100.0% (27/27)
Perbedaan antara 4.000 FLOPs dan 8 instruksi
- Saat memakai seluruh konteks 5 token, model ini membutuhkan sekitar 4.000 floating point operations untuk memprediksi satu token
- sebagian besar dipakai untuk perhitungan attention
- jumlah ini bisa dikurangi dengan memperkecil context window, fused multiply-add, kv caching, dan sebagainya
- meski begitu, prediksi satu token tetap membutuhkan ratusan instruksi mesin
- Aturan
(aab)*yang sama jika ditulis langsung dalam assembly x64 hanya membutuhkan 8 instruksi untuk menghitung token berikutnya - Ini menyisakan pertanyaan apakah mungkin melatih model bahasa yang 1000 kali lebih efisien daripada model saat ini untuk generasi bahasa alami
1 komentar
Komentar Hacker News
Ada karya terkait berjudul "Thinking Like Transformers"
Karya itu memperkenalkan bahasa pemrograman primitif bernama RASP, yang tersusun dari operasi-operasi yang dapat dimodelkan dengan komponen Transformer, dan menunjukkan bahwa program seperti histogram atau pengurutan bisa ditulis dengannya
Ada juga tulisan blog yang sangat bagus dari Sasha Rush dan Gail Weiss, dan penelitian lanjutan menunjukkan bahwa program sejenis RASP dapat dikompilasi menjadi bobot model nyata tanpa pelatihan
[1] https://arxiv.org/abs/2106.06981
[2] https://srush.github.io/raspy/
[3] https://arxiv.org/abs/2301.05062
Jika bidang ini terasa menarik, pekerjaan saya, HandCrafted Transformers, juga layak dilihat; di sana saya memilih sendiri bobot model Transformer agar melakukan penjumlahan panjang dengan cara yang mirip seperti yang dipelajari manusia di sekolah dasar
[1] https://colab.research.google.com/github/newhouseb/handcraft...
Arah dari jaringan saraf ke kode juga tampaknya sangat menarik dari sisi explainability
Saya merasa cukup memahami Transformer, tetapi belum pernah mengimplementasikannya sendiri
Suatu hari saya mencoba mengimplementasikannya sendiri, dan ternyata tidak berjalan atau terlatih sebaik PyTorch Transformer standar; akhirnya saya sadar penyebabnya adalah saya mengabaikan dropout
Saya melatihnya untuk penjumlahan angka, dan karena tidak pernah menunjukkan pasangan yang sama dua kali, saya pikir overfitting mustahil terjadi, tetapi peran dropout ternyata jauh lebih besar dari yang saya kira
Singkatnya, sebaiknya coba implementasikan Transformer sendiri, dan semakin dari dasar semakin baik
Semua orang yang pernah melakukannya mempelajari hal yang tak terduga; bagian yang mereka sadari berbeda-beda, mulai dari paralelisasi pelatihan per token hingga bagaimana backpropagation sebenarnya bekerja
Materi dari Karpathy juga bagus, tetapi video inilah yang akhirnya membuat saya memahami Transformer: https://youtu.be/kWLed8o5M2Y?si=SJT5_lCJ0hSR7Z_k
Saya sudah cukup lama memikirkan hal serupa
Mungkinkah membuat antarmuka intuitif untuk bobot model, yang bisa disetel manual oleh pakar domain untuk mempercepat pelatihan?
Misalnya, pada model visual saat mendeteksi kerucut lalu lintas, menaikkan kelompok bobot yang berhubungan dengan "tingkat keoranyean"
Dengan begitu, alih-alih meminta ribuan atau jutaan contoh tambahan untuk mengoreksi "tingkat keoranyean" dengan benar, manusia bisa mempercepatnya
Tentu saja kesulitannya adalah antarmuka ini harus dipetakan ke kelompok bobot yang memiliki makna berbeda-beda, dan saya penasaran apakah ada alasan teknis mengapa hal itu mustahil
[1] https://www.youtube.com/watch?v=8SF_h3xF3cE&t=1358s
Singkatnya, cara membantu AI dengan campur tangan manusia hampir selalu kurang hemat biaya dibanding menjalankannya dengan daya komputasi yang lebih besar
Sementara manusia mengoreksi lapisan bobot agar mendeteksi kerucut lalu lintas oranye, klaster GPU sudah melatih AI untuk mendeteksi kerucut lalu lintas, lampu lalu lintas, pohon, mobil lain, bahkan kerucut lalu lintas dengan warna oranye yang sedikit berbeda
Walaupun Anda menyesuaikan gambar agar lebih peka terhadap warna oranye, jika Anda tidak bisa sekaligus memantau akurasi semua warna lain, besar kemungkinan Anda tanpa sadar membuat masalah pada warna lain
Bukan berarti klaster neuron tertentu berkaitan dengan konsep tertentu; secara umum, semuanya melakukan sedikit dari hampir semua hal
Terlalu banyak parameter yang terlibat
Paper Transformer terlalu teknis, jadi saya selalu ingin memahaminya walau secara dangkal, tetapi itu sulit
Tulisan ini benar-benar membantu memahami cara kerjanya, dan setidaknya contohnya sangat jelas
Berkat itu saya juga bisa mengingat kembali matriks yang saya pelajari saat kuliah
Bukankah ini semacam mesin abstrak, seperti mesin Turing atau mesin yang mem-parse regex?
Pertama definisikan daftar token; misalnya, agar mudah, anggap saja ada 24 huruf
Mesin ini menerima urutan input token, menjalankan operasi matriks deterministik, lalu mengeluarkan daftar probabilitas untuk semua token
“Pembelajaran” hanyalah proses menetapkan sebagian angka di dalam matriks yang dipakai dalam operasi itu
Patut dicatat bahwa pada kode akhir hanya ada satu pernyataan
if, dan itu pun untuk mengevaluasi akurasi hasilSemua “logika” berasal dari hasil operasi matriks
Dalam jaringan saraf, semuanya umumnya agak kabur, dan hal seperti
if/elsehampir tidak ada, meski ada kasus seperti contoh Transformer yang “memasking” nilai menjadi 0 atau -∞Output juga hampir selalu berupa kumpulan skor atau probabilitas, jadi jika model yang membedakan foto kucing dan anjing menghasilkan sesuatu seperti
dog:0.95 cat:0.05, kita mengatakan ia memprediksi anjing karena skor anjing lebih tinggiMekanisme attention, inti dari Transformer, didasarkan pada semacam operasi lookup lunak
Dalam sistem yang tidak kabur, kita akan menelusuri tiap token dalam sekuens, memeriksa apakah relevan dengan token saat ini, lalu melakukan suatu tindakan jika relevan; tetapi di Transformer, relevansi bukan keputusan biner
Sebagai gantinya, ia menghitung skor relevansi kontinu di antara semua pasangan token dalam sekuens, lalu menggunakan skor itu untuk melakukan langkah berikutnya
Namun, beberapa hal tidak mudah digeneralisasi langsung dari sistem berbasis keputusan biner
Misalnya, skor relevansi seperti itu dipakai sebagai bobot untuk menghitung rata-rata berbobot atas token-token kosakata, sehingga diperoleh “token rata-rata” untuk posisi saat ini
Sepertinya tidak ada cara mudah untuk menafsirkan ini sebagai perluasan dari proses berbasis logika percabangan
Ada baiknya membaca makalah ini yang menjelaskan bahwa Linear Transformers sebenarnya adalah Fast Weight Programmers: https://arxiv.org/abs/2102.11174
Jika bobotnya diatur dengan cermat, ia bisa dibuat menjalankan komputasi apa pun
Hanya saja akan bagus kalau ada compiler yang tidak berbasis aproksimasi
Saya penasaran, ungkapan “Anda mungkin jadi ingin membuat model sendiri” itu mau dipakai untuk apa selain sebagai latihan belajar demi memuaskan rasa ingin tahu
Model machine learning yang kompleks mulai terasa tidak realistis untuk ditangani orang yang membaca blog di rumah
Ia menghasilkan banyak kata Inggris kuno yang tampak meyakinkan, dan mempelajari dasar-dasar tata bahasa Inggris serta format drama, dan sebagainya
Cukup mengejutkan bahwa ia bisa sampai sejauh itu dalam waktu sesingkat itu
Jika melatih beberapa model secara lokal hingga tingkat kesetiaan Shakespeare-from-Wish.com, itu sepertinya bisa membantu menilai apakah kita sudah menemukan arsitektur yang bagus dan apakah sudah waktunya mencoba menskalakannya
Isinya bahwa penulis ingin memahami Transformer dan attention dengan lebih baik, dan meski sudah membaca The Illustrated Transformer, ia belum mendapat intuisi tentang apa sebenarnya yang dilakukan berbagai bagian attention
Semacam belum jelas perbedaan antara
qdank, apalagivLebih dari sekadar memuaskan rasa ingin tahu, ini membantu membangun dan memperdalam pemahaman
Akan bagus kalau judulnya bisa memuat ungkapan seperti neural network
Ini terkait arsitektur “Transformer” dalam machine learning, bukan kumpulan kumparan yang menghubungkan dua rangkaian secara elektromagnetik