Rata-Rata Bergerak Eksponensial
Rata-Rata Terbaru yang Diperhalus
Rata-rata bergerak eksponensial (EMA) melacak nilai dengan memberi bobot lebih pada sampel terbaru daripada yang lama, dengan bobot yang membusuk secara eksponensial. Rumus:
EMA(t) = (1 - alpha) EMA(t-1) + alpha value(t)
Di mana alpha (faktor penghalusan) berada di (0, 1). ANDREA menggunakan alpha = 0.1 untuk pelacakan loss per sumber.
Istilah demi Istilah
- value(t): pengamatan terbaru. Untuk ANDREA, ini adalah loss yang dilaporkan oleh CUDA setelah forward pass pada dokumen dari sumber k.
- EMA(t-1): nilai EMA sebelumnya untuk sumber k. Disimpan di proxy state.
- alpha = 0.1: setiap loss baru berkontribusi 10%; riwayat bergulir berkontribusi 90%.
- (1 - alpha) = 0.9: bobot pada riwayat.
Mengapa EMA Daripada Rata-rata Sederhana
Rata-rata berjalan sederhana memberi bobot yang sama pada setiap langkah. Langkah 1 memiliki bobot yang sama dengan langkah 100.000. Itu bekerja jika data stasioner. Kerugian ANDREA TIDAK stasioner: kapasitas model tumbuh selama pelatihan, sehingga kerugian sumber pada langkah 5.000 berbeda dari kerugiannya pada langkah 50.000.
EMA menyelesaikan ini. Nilai kerugian lama memudar secara eksponensial. EMA mencerminkan realitas terkini, bukan rata-rata kondisi awal.
Per-Sumber
ANDREA mempertahankan satu EMA per lengan (per sumber). Enam belas lengan = enam belas EMA. Setiap langkah hanya memperbarui EMA sumber yang ditarik. EMA lainnya yang 15 tetap beku hingga tarikan berikutnya mereka.
Hitung EMA Satu Langkah
Rumus Reward
Reward = Perbaikan, Diskalakan
ANDREA mendefinisikan reward per langkah untuk lengan k sebagai:
reward_k = max(0, EMA_k(t-1) - loss_k(t)) * 1000
Tiga bagian:
1. EMA_k(t-1) - loss_k(t): perbaikan. Jika loss baru masuk di bawah rata-rata berjalan, perbedaannya positif: sumber k berkinerja lebih baik dari yang diharapkan.
2. max(0, ...): potong perbaikan negatif menjadi nol. Jika loss baru masuk lebih buruk dari EMA, tidak ada reward (tapi juga tidak ada penalti).
3. \* 1000: skala naikkan untuk membuat sinyal sebanding dengan bonus eksplorasi UCB.
Mengapa max(0, ...)
Reward negatif akan menurunkan mean_reward(k), membiaskan UCB terhadap lengan yang kerugiannya berfluktuasi naik. Tapi fluktuasi itu normal: satu dokumen sulit menaikkan kerugian tanpa berarti sumbernya buruk. Clipping ke nol memperlakukan fluktuasi sebagai 'tidak ada informasi' daripada 'hukuman'.
Sumber dapat memperoleh reward nol berulang kali tanpa tenggelam. Peringkat UCB mereka tetap didorong oleh bonus eksplorasi (tinggi ketika n_k kecil) plus kemenangan masa lalu.
Apa yang Dilaporkan CUDA
Setiap forward+backward pass, kernel CUDA mengeluarkan satu catatan:
{source: 'hermes3-general', doc_index: 4231, loss: 4.520}
Proxy menerima catatan tersebut, mencari EMA untuk sumber tersebut, menghitung reward, memperbarui EMA, memasukkan reward ke dalam akumulator mean_reward(k) bandit.
Hitung sebuah Reward
Mencocokkan Reward dengan Bonus Eksplorasi
Masalah Magnitudo
Perbaikan loss per langkah berjalan kecil. Loss turun dari 4.521 ke 4.520: selisih 0.001. Dari 4.520 ke 4.518: selisih 0.002. Sepanjang seluruh jalannya pelatihan, selisih mentah hidup di kisaran kira-kira [0, 0.01].
Sekarang lihat bonus eksplorasi UCB pada C=0.5, dengan N=1000 & n_k=20:
0.5 sqrt(ln(1000) / 20) = 0.5 sqrt(6.91 / 20) = 0.5 * 0.588 = 0.294
Bonus berjalan pada 0.294. Reward mentah berjalan pada 0.001. Bonus 300x lebih besar daripada reward. Argmax UCB mengurutkan hampir sepenuhnya berdasarkan bonus; mean_reward memberikan sinyal yang pada dasarnya nol.
Hasil tanpa scaling: Bandit ANDREA memilih lengan dengan n_k terkecil setiap langkah. Mean_reward diabaikan. Bandit menjadi kebijakan eksplorasi murni.
Perbaikan: 1000x
Kali reward mentah dengan 1000. Sekarang reward berada di 1.0 (vs mentah 0.001). Bandingkan dengan bonus eksplorasi yang sama 0.294:
reward terukur 1.0 vs bonus 0.294 = reward unggul 3.4x
Sekarang mean_reward mendominasi peringkat UCB. Eksplorasi menambahkan nuansa pada ekor (lengan langka mendapat dorongan 0.3), tetapi badan peringkat berasal dari reward yang diamati.
Mengapa 1000 (Bukan 10, Bukan 100.000)
Pencocokan orde besar. Hadiah mentah berjalan ~10^-3. Bonus eksplorasi berjalan ~10^0. Celahnya adalah 10^3. Kalikan hadiah mentah dengan 10^3 untuk mendarat di kisaran yang sama dengan bonus.
Skala dengan 100x meninggalkan hadiah di 0.1 (masih kurang dari bonus 0.294 -> eksplorasi masih mendominasi). Skala dengan 100.000x mengangkat hadiah ke 100 (sekarang eksplorasi tidak bisa memengaruhi apa pun; UCB runtuh menjadi rata-rata hadiah greedy). 1000x berada di zona kerja di mana kedua istilah berkontribusi.
Kalibrasi, Bukan Teori
Faktor 1000x adalah kalibrasi teknik, bukan konstanta teoretis. Ini tergantung pada tiga hal: skala kehilangan pelatihan (cross-entropy pada kosa kata 8K token berjalan mendekati 4.5), laju peluruhan kehilangan per langkah (lambat), & konstanta UCB C=0.5. Ubah salah satunya, & 1000 mungkin tidak lagi menjadi pengganda yang tepat.
Pemikiran Tentang Faktor Skala
Selanjutnya yang Akan Datang
Apa yang Anda Miliki
Atribusi hadiah mengonversi laporan kerugian CUDA menjadi sinyal siap UCB dalam tiga operasi: pelacakan EMA per-sumber melacak riwayat kerugian (alpha=0.1, lambat), reward = max(0, EMA - loss) memotong negatif, & penskalaan 1000x mencocokkan magnitudo hadiah dengan magnitudo bonus eksplorasi UCB.
Apa yang Tersisa
Lantai & penalti epoch (aktivitas 79) beroperasi di atas output UCB. Lantai sumber menjamin sampling minimum untuk sumber prioritas terlepas dari peringkat UCB. Penalti epoch menurunkan bobot sumber yang telah ditarik lebih banyak kali daripada jumlah dokumennya, mencegah hafalan dataset kecil sementara dataset besar tetap segar.
Referensi
ANDREA whitepaper, bagian 3.3.