2 poin oleh GN⁺ 2023-09-24 | 1 komentar | Bagikan ke WhatsApp
  • 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 tokenisasi a=0, b=1 serta 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 mlp pada 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 a maka prediksi b, jika tidak maka a, sehingga embedding posisi tidak perlu digunakan
  • Tugas akhirnya ditetapkan menjadi prediksi sekuens "aabaabaabaab...", yaitu (aab)*
    • jika dua token sebelumnya adalah ab atau ba, token berikutnya adalah a
    • jika dua token sebelumnya adalah aa, token berikutnya adalah b
    • bb diperlakukan sebagai kasus di luar cakupan tugas
  • Tokenisasinya sangat sederhana dan hanya menangani dua simbol
    • a adalah 0
    • b adalah 1

Dimensi model dan alur perhitungan

  • Ada tiga parameter model yang dipilih
    • N_CTX = 5: panjang konteks maksimum yang dilihat model dalam sekali proses
    • N_VOCAB = 2: dua token, a dan b
    • N_EMBED = 8: ukuran embedding yang memuat ruang untuk token, posisi, dan perhitungan
  • Meski tugas sebenarnya hanya membutuhkan dua token sebelumnya, N_CTX=5 dipilih agar mencakup situasi ketika token yang tidak relevan harus diabaikan
  • Fungsi gpt bekerja 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

Embedding yang memuat posisi dan token sebagai one-hot

  • wpe adalah 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]
  • wte adalah embedding token, dan 2 dimensi berikutnya dipakai sebagai one-hot token
    • token a adalah [1, 0] pada dimensi token terkait
    • token b adalah [0, 1]
  • Posisi embedding ke-8 awalnya tidak digunakan, lalu dipakai sebagai scratch space di dalam transformer block
  • Sebagai contoh, "aabaa" direpresentasikan sebagai matriks embedding 5 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_proj yang memproyeksikan kembali hasil attention ke ruang embedding
  • c_attn adalah layer linear berukuran embed_size x (embed_size * 3) yang mengubah embedding masukan menjadi matriks qkv, lalu membaginya menjadi q, k, dan v
  • k memisahkan embedding posisi untuk merepresentasikan informasi posisi yang dimiliki tiap token
  • q merepresentasikan rentang posisi yang ingin dicari oleh tiap posisi, lalu membentuk matriks skor attention melalui q @ 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.5 ke 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

  • v mengubah one-hot token menjadi encoding a=1, b=-1
  • Karena hasil attention merata-ratakan dua token terbaru dengan bobot 0,5, encoding ini menghitung aturan berikut
    • a, b0.5 * 1 + 0.5 * (-1) = 0
    • b, a0.5 * (-1) + 0.5 * 1 = 0
    • a, a0.5 * 1 + 0.5 * 1 = 1
  • Hasilnya, posisi ke-7 pada baris akan memiliki nilai berikut
    • 0 berarti harus memprediksi a
    • 1 berarti harus memprediksi b
  • Pada masukan "aabaa", baris pertama bisa menghasilkan prediksi b karena informasinya belum cukup, tetapi prediksi setelahnya sesuai dengan aturan (aab)*

Mengirim nilai prediksi kembali ke ruang kosakata

  • c_proj mengubah 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 dengan 1024
    • embedding[row, 5] = 1024 + (-1024) * prediction
    • embedding[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 1024 dipakai untuk mendominasinya
  • Terakhir, logits dibuat dengan menghitung x @ wte.T lalu menerapkan softmax
    • dalam konteks "aabaa", baris prediksi terakhir menunjuk ke b
    • saat pelatihan, prediksi di semua baris berguna, tetapi saat inferensi hanya baris terakhir yang diperlukan

Hasil generasi dan akurasi

  • Fungsi complete memasukkan hingga 5 token terakhir ke model, lalu memilih token berikutnya dengan argmax dari baris terakhir hasil softmax
  • Contoh hasil generasi adalah sebagai berikut
    • complete("a")a :: baabaabaab
    • complete("ba")ba :: abaabaabaa
    • complete("abaab")abaab :: aabaabaaba
  • Bahkan pada input di luar cakupan, model kadang dapat pulih ke pola berulang
    • complete("ababa")ababa :: abaabaabaa
    • complete("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

 
GN⁺ 2023-09-24
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

    • Saya sangat menyukai keluarga RASP
      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...
    • Untuk pekerjaan seperti ini, bahasa fungsional seperti Haskell tampaknya cocok
      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

    • Saya penasaran apakah ada referensi yang bisa membantu untuk mulai mengerjakan hal ini
  • 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

    • "Pakar domain menyesuaikan bobot model secara manual" terdengar mirip dengan cara pengenalan gambar sebelum deep learning
      [1] https://www.youtube.com/watch?v=8SF_h3xF3cE&t=1358s
    • Alasan yang Anda cari disebut The Bitter Lesson
      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
    • Jumlah layer dan bobotnya bukan skala yang bisa diperbarui manual oleh manusia, dan sekalipun bisa, efek hilir dari perubahan bobot terlalu sulit dikelola
      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
    • Alasan teknis mengapa ini mustahil atau sangat sulit adalah karena bobot biasanya sangat sulit diinterpretasikan
      Bukan berarti klaster neuron tertentu berkaitan dengan konsep tertentu; secara umum, semuanya melakukan sedikit dari hampir semua hal
    • Mekanisme atensi Transformer tampaknya tidak mudah dipetakan ke semantik yang bisa dipahami manusia
      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?

    • Kalau sedikit disederhanakan, ini adalah “mesin” yang memetakan himpunan input ke himpunan probabilitas output berikutnya
      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 hasil
      Semua “logika” berasal dari hasil operasi matriks
    • Cukup sulit menafsirkan hal-hal seperti ini sebagai automata dalam arti yang biasanya kita bayangkan
      Dalam jaringan saraf, semuanya umumnya agak kabur, dan hal seperti if/else hampir 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 tinggi
      Mekanisme 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
    • Bukankah ini seperti AllSpark menyentuh tumpukan aljabar linear?
    • Benar
      Ada baiknya membaca makalah ini yang menjelaskan bahwa Linear Transformers sebenarnya adalah Fast Weight Programmers: https://arxiv.org/abs/2102.11174
    • Jaringan saraf adalah mesin Turing
      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

    • Di nanoGPT, jika model diprapelatih dengan Shakespeare, dalam 3 menit ia mencapai tingkat kesetiaan terhadap materi asli setara Jabberwocky karya Lewis Carroll
      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
    • Tujuannya tertulis di paragraf pertama artikel
      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 q dan k, apalagi v
    • Ini latihan belajar yang sangat bagus
      Lebih dari sekadar memuaskan rasa ingin tahu, ini membantu membangun dan memperdalam pemahaman
    • Bisa saja orang memang benar-benar menikmati mengutak-atik proyek seperti ini, kan? Memang agak aneh sih
  • 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