Topik trending
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
Saya menghabiskan beberapa jam melalui repo /Karpathy/Autoresearch baris demi baris.
Sudut "agen AI melakukan penelitian" adalah apa yang mendapatkan semua perhatian, tetapi saya pikir hal yang lebih menarik adalah apa yang sebenarnya ada di dalam skrip pelatihan dan keputusan teknik yang membuat lingkaran pencarian ketat. Ini adalah salah satu pengaturan pelatihan single-file paling padat yang pernah saya baca.
Izinkan saya mulai dengan hal yang memungkinkan seluruh proyek: anggaran waktu ditetapkan pada jam dinding 300 detik. bukan langkah tetap, bukan token tetap, bukan kegagalan tetap. detik jam dinding. Ini terdengar seperti detail kecil tetapi itulah alasan Autonomous Loop bekerja. Agen dapat membuat model 3x lebih besar, memotong ukuran batch menjadi dua, menukar arsitektur yang sama sekali berbeda, dan hasilnya masih secara langsung sebanding dengan setiap eksperimen lainnya karena mereka semua mendapat pelatihan tepat 5 menit pada GPU yang sama. Jika Anda memperbaiki langkah-langkah sebagai gantinya, model yang lebih besar akan mendapatkan lebih sedikit pembaruan gradien per detik dan Anda akan menghukumnya secara tidak adil. Jika Anda memperbaiki token, Anda akan mengalami masalah yang sama. Memperbaiki Wall Time berarti Anda mengajukan pertanyaan yang tepat: Mengingat perangkat keras ini dan waktu sebanyak ini, model apa yang terbaik yang dapat Anda produksi? Yang lainnya adalah variabel bebas. Agen dapat menjelajahi permukaan Pareto penuh dari ukuran model vs kecepatan throughput vs konvergensi tanpa salah satu dari pengorbanan tersebut yang dikacaukan oleh protokol evaluasi.
Metrik juga dipilih dengan cermat. itu bit per byte, bukan kehilangan entropi silang. Entropi silang tergantung pada ukuran kosakata Anda. Model dengan token 32k dan model dengan token 8k akan memiliki nilai kerugian yang sangat berbeda meskipun mereka mengompresi data dengan baik. BPB menormalkan ini dengan menjumlahkan entropi silang per token dalam nat, menjumlahkan panjang UTF-8 byte dari token target, dan mengonversi nats-per-byte menjadi bit-per-byte. Jadi bahkan jika agen mengubah sesuatu yang memengaruhi distribusi token yang efektif, perbandingannya tetap adil. Kedua pilihan ini, waktu dinding tetap dan metrik invarian vocab, mengubah apa yang akan menjadi pencarian yang tidak tertandingi menjadi masalah pengoptimalan yang bersih.
sekarang model itu sendiri. ini adalah GPT tetapi dengan banyak trik modern yang layak dipahami. pertama, RMSnorm di mana-mana. pada input blok (pra-norma), dan juga pada kueri dan kunci tepat sebelum produk titik perhatian. Hal QK-norma ini penting karena tanpanya norma q dan k dapat tumbuh tanpa batas selama pelatihan, menyebabkan log perhatian menjadi tajam dan softmax jenuh. Menormalkan Q dan K menjaga produk DOT dalam kisaran yang stabil terlepas dari seberapa dalam jaringan atau bagaimana dinamika pelatihan berkembang. perhatian itu sendiri adalah FA 3, dimuat melalui perpustakaan kernel. Ini menggunakan implementasi Varunneal pada Hopper (sm_90) dan kembali ke komunitas yang dibangun pada GPU yang lebih lama. pola perhatiannya adalah "SSSL" yang berarti tiga lapisan perhatian jendela geser (jendela = setengah panjang urutan) diikuti oleh satu lapisan perhatian kausal penuh, berulang. Ini adalah pola jarang-ke-padat yang Anda lihat di mistral dan gemma2.
Lapisan perhatian lokal secara komputasi murah karena matriks perhatian diband, dan lapisan global periodik memungkinkan informasi mengalir melintasi konteks penuh. Dengan 8 lapisan dan pola 4 karakter, Anda mendapatkan lapisan 0,1,2 lokal, lapisan 3 global, lapisan 4,5,6 lokal, lapisan 7 global. Lapisan terakhir dipaksa global terlepas dari polanya.
Hal penyematan nilai itu halus dan saya pikir kurang dihargai. Setiap lapisan lain mendapatkan tabel penyematannya sendiri, sepenuhnya terpisah dari penyematan token utama, yang memetakan ID token langsung ke vektor dimensi nilai. Ini dicampur ke dalam nilai perhatian melalui gerbang yang dipelajari: v = v + 2 * sigmoid(W_gate @ x:32) * ve. Berat gerbang diinisialisasi nol, jadi sigmoid(0) = 0,5, kali 2 memberikan 1,0, yang merupakan titik awal netral. Pelatihan berlebih, model dapat belajar memperkuat atau menekan penyematan nilai per kepala berdasarkan 32 dimensi pertama dari status tersembunyi. ini dari garis pekerjaan ResFormer dan intuisinya adalah bahwa itu memberi perhatian jalan pintas langsung ke identitas token. Vektor nilai dapat membawa informasi tentang "token apa yang berada pada posisi ini" tanpa informasi tersebut harus bertahan dari transformasi aliran sisa dari lapisan sebelumnya. Ini pada dasarnya adalah koneksi lewati dari input langsung ke nilai perhatian, dijaga agar model dapat memutuskan kapan itu berguna.
Ada juga skalar yang dapat dipelajari per lapisan pada aliran sisa: x = lambda_residi * x + lambda_x0i * x0, di mana x0 adalah penyematan yang dinormalisasi dari lapisan 0. Setiap lapisan dapat secara independen mengontrol seberapa banyak ia mendengarkan residu yang berjalan vs input aslinya. lambda sisa mulai dari 1.0, lambda x0 mulai dari 0.1. Ini adalah versi lunak dari ide "residu terurai". Dalam transformator standar, aliran sisa adalah jumlah dari semua output lapisan sebelumnya dan semakin tercemar saat Anda masuk lebih dalam. Memberi setiap lapisan akses ke penyematan asli yang bersih berarti tidak perlu belajar untuk "membatalkan" lapisan sebelumnya untuk memulihkan informasi tingkat rendah. Logit di-softcapped pada 15 melalui Tanh(Logits/15)*15 yang mencegah model menjadi terlalu percaya diri di awal pelatihan saat representasi masih berisik.
Tapi sejujurnya bagian yang paling menarik dari seluruh file adalah pengoptimal. MuonAdamW adalah pengoptimal gabungan yang mengirimkan aturan pembaruan yang berbeda berdasarkan grup parameter. penyematan (penyematan token, penyematan nilai, kepala unembedding) dan skalar per lapisan mendapatkan AdamW standar dengan tingkat pembelajaran yang berbeda untuk setiap kelompok. Penyebarannya liar. Penyematan LR adalah 0.6, LR unembedding adalah 0.004, itu perbedaan 150x, dan itu disengaja. Matriks penyematan melihat setiap token dan perlu diperbarui secara agresif. Matriks yang tidak disematkan adalah probe linier pada representasi akhir dan mendapat manfaat dari stabilitas. tingkat pembelajaran penyematan, penyematan nilai, dan unembedding semuanya diskalakan oleh (d_model / 768)^(-0.5) yang merupakan koreksi yang terinspirasi dari muP. Saat lebar model berubah, tingkat pembelajaran tersebut disesuaikan untuk menjaga fitur Learning Dynamics skala invarian. Tingkat pembelajaran skalar untuk lambda per lapisan ditangani secara terpisah dan tidak mendapatkan penskalaan ini.
matriks bobot 2D di transformator, proyeksi perhatian dan bobot mlp, mendapatkan Muon, dan di sinilah menjadi benar-benar menarik. Muon mengambil gradien, menerapkan momentum Nesterov, kemudian menjalankan iterasi Newton-Schulz untuk memperkirakan dekomposisi polar matriks gradien. faktor dekomposisi polar matriks G menjadi G = U * S di mana U adalah ortogonal dan S adalah simetris positif semi-pasti. muon menghitung U, matriks ortogonal terdekat dengan gradien, dan menggunakannya sebagai arah pembaruan. Iterasi Newton-Schulz adalah 5 langkah. untuk matriks tinggi (lebih banyak baris daripada kolom), A = X^T @ X lalu X -> aX + X @ (bA + cA^2). untuk matriks lebar, A = X @ X^T lalu X -> aX + (bA + cA^2) @ X. koefisien dikodekan keras dari prakomputasi. Mereka menyebutnya "Polar Express." Semuanya dikompilasi ke satu kernel yang menyatu melalui torch.compile.
Mengapa ini penting? Karena untuk matriks berat gradien norma Frobenius (apa yang digunakan Adam dan SGD) secara geometris salah. Arah penurunan tercuram yang "benar" untuk matriks berat adalah yang meminimalkan kerugian tunduk pada kendala bahwa pembaruan memiliki norma spektral satuan, bukan norma Frobenius satuan. Faktor kutub ortogonal memberi Anda persis ini. Dalam praktiknya, itu berarti Muon membuat pembaruan efektif yang jauh lebih besar karena tidak membuang-buang ukuran langkah untuk menskalakan nilai tunggal. itu hanya memutarnya. Inilah sebabnya mengapa muon menyatu secara signifikan lebih cepat daripada Adam pada matriks berat transformator. Muon memang mempertahankan buffer momentum per elemen (bentuk yang sama dengan parameter, ditumpuk di setiap grup bentuk), tetapi tidak seperti Adam, ia tidak melacak momen detik per elemen. Perkiraan momen kedua adalah per baris atau per kolom setelah ortogonalisasi, bukan per elemen. di situlah NorMuon masuk.
di atas muon dasar ada NorMuon, skema pengurangan varians. Setelah ortogonalisasi, ini menghitung perkiraan momen kedua per baris (atau per kolom tergantung pada rasio aspek), mempertahankan rata-rata pergerakan eksponensial dari mereka, dan menskalakan ulang pembaruan sehingga setiap dimensi output mendapatkan ukuran langkah adaptifnya sendiri. Ini pada dasarnya adalah ide adaptivitas Adam tetapi diterapkan dalam sistem koordinat ortogonalisasi daripada ruang parameter mentah. Peluruhan berat badan juga tidak standar. Ini "berhati-hati", artinya hanya meluruh parameter di mana arah pembaruan muon sesuai dengan tanda parameter: topeng = (g * param) >= 0. Ini menghindari mode kegagalan yang diketahui di mana peluruhan berat mendorong parameter ke nol yang bertentangan dengan keinginan pembaruan, yang dapat mengacaukan pelatihan.
Satu detail kecil yang saya hargai: Setelah langkah pelatihan pertama, kode memanggil gc.collect(), gc.freeze(), gc.disable() untuk mematikan pengumpul sampah python sepenuhnya. GC python berjalan secara berkala dan menyebabkan ~500ms stall. ketika total anggaran Anda adalah 300 detik dan setiap langkah mungkin 300 ms, jeda GC acak menghabiskan hampir 2 langkah pelatihan. Mereka memicu gc.collect() secara manual setiap 5000 langkah sebagai kompromi. Ini adalah jenis hal yang hanya Anda pelajari dengan membuat profil latihan nyata dan memperhatikan penurunan throughput misterius.
11 langkah pertama (0 hingga 10) juga tidak dihitung dalam anggaran waktu. itulah pemanasan di mana torch.compile melakukan tugasnya dan kernel CUDA mendapatkan JIT'd. Tanpa pengecualian ini, eksperimen yang berbeda akan mendapatkan jumlah pelatihan "nyata" yang berbeda tergantung pada berapa lama kompilasi yang dibutuhkan untuk konfigurasi model tertentu. Sekali lagi, pilihan desain yang tampaknya kecil tetapi sangat penting untuk membuat eksperimen sebanding.
sekarang perkecil. Perulangan AutoResearch yang sebenarnya adalah: Agen membaca program.md (file penurunan harga yang menjelaskan pekerjaannya), memodifikasi .py latihan, melakukan komitmen, berjalan selama 5 menit, memeriksa apakah val_bpb ditingkatkan, menyimpan atau mengembalikan, mengulangi. program.md secara eksplisit mengatakan "JANGAN PERNAH BERHENTI." Agen itu berlari tanpa batas waktu sampai manusia membunuhnya. ~12 eksperimen per jam, ~100 semalam saat Anda tidur.
...
Teratas
Peringkat
Favorit
