Exponentieel Bewegend Gemiddelde
Een Gesmeerd Recent Gemiddelde
Een exponentieel bewegend gemiddelde (EMA) volgt een waarde door recente samples zwaarder te wegen dan oude, met gewichten die exponentieel afnemen. Formule:
EMA(t) = (1 - alpha) EMA(t-1) + alpha value(t)
Waarbij alpha (de gladmakingsfactor) in (0, 1) ligt. ANDREA gebruikt alpha = 0.1 voor het bijhouden van de per-bron verlies.
Term voor Term
- value(t): nieuwste observatie. Voor ANDREA is dit het verlies gerapporteerd door CUDA na een forward pass op een document van bron k.
- EMA(t-1): vorige EMA-waarde voor bron k. Opgeslagen in proxy state.
- alpha = 0.1: elk nieuw verlies draagt 10% bij; de rollende geschiedenis draagt 90% bij.
- (1 - alpha) = 0.9: gewicht op de geschiedenis.
Waarom EMA in plaats van Gewone Gemiddelde
Een gewone lopende gemiddelde geeft elke stap hetzelfde gewicht. Stap 1 heeft hetzelfde gewicht als stap 100.000. Dat werkt als de data stationair zijn. De verliezen van ANDREA zijn NIET stationair: de modelcapaciteit groeit tijdens de training, dus het verlies van een bron op stap 5.000 verschilt van het verlies op stap 50.000.
EMA lost dit op. Oude verlieswaarden vervagen exponentieel. De EMA weerspiegelt de recente realiteit, niet een gemiddelde van initiële condities.
Per Bron
ANDREA onderhoudt één EMA per arm (per bron). Zestien armen = zestien EMA's. Elke stap update alleen de EMA van de bron die getrokken is. De andere 15 EMA's blijven bevroren tot hun volgende trek.
Bereken een EMA-stap
De Reward Formule
Reward = Verbetering, Geschaald
ANDREA definieert de per-stap beloning voor arm k als:
reward_k = max(0, EMA_k(t-1) - loss_k(t)) * 1000
Drie stukken:
1. EMA_k(t-1) - loss_k(t): verbetering. Als de nieuwe loss onder het lopende gemiddelde ligt, is het verschil positief: bron k presteerde beter dan verwacht.
2. max(0, ...): knip negatieve verbeteringen naar nul. Als de nieuwe loss slechter is dan de EMA, geen beloning (maar ook geen straf).
3. \* 1000: schaalt op om het signaal vergelijkbaar te maken met de UCB-exploratiebonus.
Waarom max(0, ...)
Negatieve beloningen zouden mean_reward(k) omlaag duwen, waardoor UCB bevooroordeeld raakt tegen armen waarvan de verliezen omhoog fluctueren. Maar fluctuatie is normaal: een enkel moeilijk document verhoogt het verlies zonder dat dit betekent dat de bron slecht is. Clipping naar nul behandelt fluctuatie als 'geen informatie' in plaats van 'straf'.
Bronnen kunnen herhaaldelijk nul beloning verdienen zonder te zinken. Hun UCB-rang blijft bepaald door de exploratiebonus (hoog wanneer n_k klein is) plus eerdere successen.
Wat CUDA Rapporteert
Bij elke forward+backward pass emitteert de CUDA kernel één record:
{source: 'hermes3-general', doc_index: 4231, loss: 4.520}
De proxy ontvangt het record, zoekt de EMA op voor die bron, berekent de reward, update de EMA, voedt de reward in de mean_reward(k) accumulator van de bandit.
Bereken een Reward
Beloning afstemmen op Exploratiebonus
Het Grootteprobleem
Per-stap verliesverbeteringen zijn klein. Verlies daalt van 4.521 naar 4.520: verschil 0.001. Van 4.520 naar 4.518: verschil 0.002. Over een gehele trainingrun liggen ruwe verschillen ruwweg in [0, 0.01].
Bekijk nu de exploratiebonus van UCB bij C=0.5, met N=1000 & n_k=20:
0.5 sqrt(ln(1000) / 20) = 0.5 sqrt(6.91 / 20) = 0.5 * 0.588 = 0.294
De bonus loopt op 0.294. De ruwe beloning loopt op 0.001. De bonus is 300x groter dan de beloning. De argmax van UCB sorteert bijna volledig op basis van de bonus; mean_reward levert vrijwel geen signaal.
Resultaat zonder schaling: De bandit van ANDREA kiest elke stap de arm met de kleinste n_k. Mean_reward wordt genegeerd. De bandit wordt een pure exploratiepolicy.
De Oplossing: 1000x
Vermenigvuldig de ruwe beloning met 1000. Nu zit de beloning op 1.0 (vs ruw 0.001). Vergelijk met dezelfde exploratiebonus 0.294:
geschaalde beloning 1.0 vs bonus 0.294 = beloning leidt met 3.4x
Nu domineert mean_reward de UCB-ranking. Exploratie voegt nuance toe aan de staart (zeldzame armen krijgen een boost van 0.3), maar het lichaam van de ranking komt van de waargenomen beloning.
Waarom 1000 (en niet 10, en niet 100.000)
Order of magnitude matching. Raw rewards run ~10^-3. Exploration bonus runs ~10^0. The gap is 10^3. Multiply raw reward by 10^3 to land in the same range as the bonus.
Scaling by 100x leaves reward at 0.1 (still less than 0.294 bonus -> exploration still dominates). Scaling by 100,000x lifts reward to 100 (now exploration cannot influence anything; UCB collapses to greedy mean_reward). 1000x sits in the working zone where both terms contribute.
Kalibratie, geen theorie
De 1000x factor is engineering kalibratie, geen theoretische constante. Het hangt af van drie dingen: training loss scale (cross-entropy op een vocabulaire van 8K tokens loopt rond 4.5), per-step loss decay rate (slow), & UCB constant C=0.5. Verander een van die, & 1000 is misschien niet langer de juiste multiplier.
Redeneren over de schalingsfactor
Wat volgt
Wat Je Hebt
Beloningsattributie zet CUDA's verliesrapporten om in UCB-klaar signaal in drie operaties: per-bron EMA volgt verliesgeschiedenis (alpha=0.1, langzaam), beloning = max(0, EMA - verlies) knipt negatieven weg, & 1000x schaling matcht beloningsgrootte aan UCB-exploratiebonusgrootte.
Wat Rest Over
Vloeren & epochstraffen (activiteit 79) werken bovenop de UCB-uitvoer. Bronvloeren garanderen minimale sampling voor prioriteitsbronnen ongeacht de UCB-ranglijst. Epochstraffen verlagen het gewicht van bronnen die meer keer zijn getrokken dan dat ze documenten hebben, waardoor memorisatie van kleine datasets wordt voorkomen terwijl grote datasets vers blijven.
Referentie
ANDREA whitepaper, sectie 3.3.