Wykładnicza Średnia Ruchoma
Wygładzona Niedawna Średnia
Wykładnicza średnia ruchoma (EMA) śledzi wartość, ważąc niedawne próbki bardziej niż stare, z wagami zanikającymi wykładniczo. Wzór:
EMA(t) = (1 - alpha) EMA(t-1) + alpha value(t)
Gdzie alpha (czynnik wygładzania) znajduje się w (0, 1). ANDREA używa alpha = 0.1 do śledzenia straty dla każdego źródła.
Krok po kroku
- value(t): najnowsza obserwacja. Dla ANDREA jest to strata zgłoszona przez CUDA po przejściu forward na dokumencie z źródła k.
- EMA(t-1): poprzednia wartość EMA dla źródła k. Przechowywana w stanie proxy.
- alpha = 0.1: każda nowa strata wnosi 10%; historia rolująca wnosi 90%.
- (1 - alpha) = 0.9: waga na historii.
Dlaczego EMA zamiast zwykłej średniej
Zwykła krocząca średnia traktuje każdy krok z równą wagą. Krok 1 ma taką samą wagę jak krok 100 000. To działa, jeśli dane są stacjonarne. Straty ANDREA NIE są stacjonarne: pojemność modelu rośnie podczas treningu, więc strata źródła w kroku 5 000 różni się od jego straty w kroku 50 000.
EMA rozwiązuje ten problem. Stare wartości strat zanikają wykładniczo. EMA odzwierciedla niedawną rzeczywistość, a nie uśrednianie warunków początkowych.
Per-Źródło
ANDREA utrzymuje jedną EMA na ramię (na źródło). Szesnaście ramion = szesnaście EMA. Każdy krok aktualizuje tylko EMA źródła, które zostało wylosowane. Pozostałe 15 EMA pozostaje zamrożonych do ich następnego losowania.
Oblicz EMA Krok po Kroku
Wzór na Nagrodę
Nagroda = Poprawa, Skalowana
ANDREA definiuje nagrodę na krok dla ramienia k jako:
reward_k = max(0, EMA_k(t-1) - loss_k(t)) * 1000
Trzy elementy:
1. EMA_k(t-1) - loss_k(t): poprawa. Jeśli nowa strata jest poniżej średniej kroczącej, różnica jest dodatnia: źródło k poradziło sobie lepiej niż oczekiwano.
2. max(0, ...): obcinanie negatywnych popraw do zera. Jeśli nowa strata jest gorsza niż EMA, brak nagrody (ale też brak kary).
3. \* 1000: skaluj w górę, aby sygnał był porównywalny z bonusem eksploracji UCB.
Dlaczego max(0, ...)
Negatywne nagrody obniżałyby mean_reward(k), stronniczo działając przeciwko ramionom, których straty fluktuowały w górę. Ale fluktuacja jest normalna: pojedynczy trudny dokument podnosi stratę bez oznaczania, że źródło jest złe. Ograniczenie do zera traktuje fluktuację jako „brak informacji” zamiast „kary”.
Źródła mogą wielokrotnie zdobywać zerową nagrodę bez tonięcia. Ich ranking UCB pozostaje napędzany przez bonus eksploracji (wysoki, gdy n_k jest małe) plus wcześniejsze wygrane.
Co raportuje CUDA
Każdy przebieg forward+backward, jądro CUDA emituje jeden rekord:
{source: 'hermes3-general', doc_index: 4231, loss: 4.520}
Proxy odbiera rekord, wyszukuje EMA dla tego źródła, oblicza nagrodę, aktualizuje EMA, przekazuje nagrodę do akumulatora mean_reward(k) bandyta.
Oblicz nagrodę
Dopasowanie Reward do Bonusu Eksploracyjnego
Problem Magnitudy
Poprawy loss na krok są małe. Loss spada z 4.521 do 4.520: różnica 0.001. Z 4.520 do 4.518: różnica 0.002. W całym przebiegu treningu surowe różnice mieszczą się w przybliżeniu [0, 0.01].
Teraz spójrz na premię eksploracji UCB przy C=0.5, z N=1000 i n_k=20:
0.5 sqrt(ln(1000) / 20) = 0.5 sqrt(6.91 / 20) = 0.5 * 0.588 = 0.294
Premia wynosi 0.294. Surowa nagroda wynosi 0.001. Premia jest 300x większa niż nagroda. Argmax UCB sortuje prawie wyłącznie według premii; mean_reward dostarcza zasadniczo zerowy sygnał.
Rezultat bez skalowania: bandit ANDREA wybiera ramię z najmniejszym n_k na każdym kroku. Mean_reward jest ignorowane. Bandit staje się czystą polityką eksploracji.
Naprawa: 1000x
Pomnóż surową nagrodę przez 1000. Teraz nagroda wynosi 1.0 (w porównaniu do surowej 0.001). Porównaj z tym samym bonusem eksploracji 0.294:
przeskalowana nagroda 1.0 vs bonus 0.294 = nagroda prowadzi 3.4x
Teraz średnia nagroda dominuje w rankingu UCB. Eksploracja dodaje niuansów do ogona (rzadkie ramiona dostają 0.3 boost), ale główna część rankingu pochodzi z obserwowanej nagrody.
Dlaczego 1000 (i nie 10, i nie 100 000)
Dopasowanie rzędów wielkości. Surowe nagrody wynoszą ~10^-3. Bonus eksploracyjny wynosi ~10^0. Różnica wynosi 10^3. Pomnóż surową nagrodę przez 10^3, aby trafić w ten sam zakres co bonus.
Skalowanie przez 100x pozostawia nagrodę na poziomie 0.1 (nadal mniej niż bonus 0.294 -> eksploracja nadal dominuje). Skalowanie przez 100 000x podnosi nagrodę do 100 (teraz eksploracja nie może niczego wpłynąć; UCB upraszcza się do chciwej średniej_nagrody). 1000x znajduje się w działającej strefie, gdzie oba składniki mają wpływ.
Kalibracja, nie teoria
Czynnik 1000x to kalibracja inżynierska, nie stała teoretyczna. Zależy od trzech rzeczy: skali straty treningowej (entropia krzyżowa na słowniku 8K tokenów wynosi blisko 4.5), szybkości zaniku straty na krok (powolna) oraz stałej UCB C=0.5. Zmień którąkolwiek z nich, a 1000 może już nie być właściwym mnożnikiem.
Rozumowanie o czynniku skalowania
Co Następne
Co Masz
Przydzielanie nagród przekształca raporty strat CUDA w sygnał gotowy dla UCB w trzech operacjach: EMA na źródło śledzi historię strat (alpha=0.1, wolno), nagroda = max(0, EMA - strata) obcina negatywy, & skalowanie 1000x dopasowuje wielkość nagrody do wielkości bonusu eksploracji UCB.
Co Pozostało
Podłogi & kary epok (aktywność 79) działają na szczycie wyjścia UCB. Podłogi źródłowe gwarantują minimalne próbkowanie dla źródeł priorytetowych niezależnie od rankingu UCB. Kary epok obniżają wagę źródeł, które były ciągnięte więcej razy niż mają dokumentów, zapobiegając zapamiętywaniu małych zbiorów danych, podczas gdy duże zbiory danych pozostają świeże.
Źródła
Whitepaper ANDREA, sekcja 3.3.