指数移動平均
最近の平滑化された平均
指数移動平均(EMA)は、最近のサンプルに古いものよりも大きな重みを付け、重みが指数関数的に減衰するように値の追跡を行います。式:
EMA(t) = (1 - alpha) EMA(t-1) + alpha value(t)
アルファ(平滑化係数)が (0, 1) の範囲にある場所。ANDREA はソースごとの損失追跡に alpha = 0.1 を使用します。
項ごと
- value(t): 最新の観測値。ANDREA では、これはソース k からのドキュメントのフォワードパス後に CUDA が報告する損失です。
- EMA(t-1): ソース k の前の EMA 値。プロキシ状態に保存されます。
- alpha = 0.1: 各新しい損失が 10% を寄与;ローリング履歴が 90% を寄与。
- (1 - alpha) = 0.9: 履歴にかかる重み。
単純平均ではなくEMAを使う理由
単純な移動平均はすべてのステップを等しく重み付けします。ステップ1とステップ100,000が同じ重みを持ちます。これはデータが定常的な場合に機能します。ANDREAの損失は定常的ではありません:トレーニング中にモデル容量が増加するため、ソースのステップ5,000での損失はステップ50,000での損失と異なります。
EMAはこれを解決します。古い損失値は指数関数的に薄れます。EMAは最近の現実を反映し、初期条件の平均化ではありません。
ソースごと
ANDREAはアーム(ソース)ごとに1つのEMAを維持します。16のアーム = 16のEMA。各ステップでは、引かれたソースのEMAのみが更新されます。他の15のEMAは次の引きまで凍結されたままです。
EMAを計算するステップ
報酬の公式
報酬 = 改善度、スケーリング済み
ANDREA は、アーム k のステップごとの報酬を次のように定義します:
reward_k = max(0, EMA_k(t-1) - loss_k(t)) * 1000
3つの要素:
1. EMA_k(t-1) - loss_k(t): 改善度。新たな損失が移動平均を下回った場合、差分は正になります:ソース k が予想より良好でした。
2. max(0, ...): 負の改善をゼロにクリップ。新たな損失が EMA を上回った場合、報酬なし(ただしペナルティもなし)。
3. \* 1000: UCB 探索ボーナスと比較可能なスケールに拡大するため。
max(0, ...) の理由
負の報酬は mean_reward(k) を低下させ、損失が上方変動したアームに対して UCB を偏向させるでしょう。しかし変動は正常です:1つの難しいドキュメントが損失を上げても、ソースが悪いわけではありません。ゼロにクリップすることで、変動を「ペナルティ」ではなく「情報なし」として扱います。
ソースは繰り返しゼロ報酬を得ても沈みません。その UCB ランクは探索ボーナス(n_k が小さいときに高い)プラス過去の成功によって維持されます。
CUDA が報告するもの
各 forward+backward パスで、CUDA カーネルは1つのレコードを出力します:
{source: 'hermes3-general', doc_index: 4231, loss: 4.520}
プロキシがレコードを受け取り、そのソースの EMA を検索し、リワードを計算し、EMA を更新し、リワードを bandit's mean_reward(k) アキュムレータに投入します。
リワードを計算する
報酬を探索ボーナスに合わせる
規模の問題
ステップごとの loss 改善は小さい。Loss が 4.521 から 4.520 に低下:差分 0.001。4.520 から 4.518:差分 0.002。全体のトレーニング実行では、生の差分はおよそ [0, 0.01] の範囲に収まります。
今、C=0.5でのUCBの探索ボーナスを、N=1000 & n_k=20で見てみましょう:
0.5 sqrt(ln(1000) / 20) = 0.5 sqrt(6.91 / 20) = 0.5 * 0.588 = 0.294
ボーナスは0.294で動作します。生の報酬は0.001で動作します。ボーナスは報酬の300倍大きいです。UCBのargmaxはほぼ完全にボーナスでソートされます;mean_rewardは本質的にゼロのシグナルを提供します。
スケーリングなしの結果:ANDREAのbanditは毎ステップで最小のn_kを持つ腕を選びます。Mean_rewardは無視されます。Banditは純粋な探索ポリシーになります。
修正: 1000倍
生の報酬を1000倍します。これで報酬が1.0になります(生の0.001に対して)。同じ探索ボーナス0.294と比較:
スケーリング済み報酬 1.0 vs ボーナス 0.294 = 報酬が3.4倍リード
これでmean_rewardがUCBランキングを支配します。探索はテールにニュアンスを加えます(稀なアームが0.3のブーストを得る)が、ランキングの本体は観測された報酬から来ます。
なぜ1000(10でもなく、100,000でもないのか)
桁数の一致。生の報酬は~10^-3で推移。探索ボーナスは~10^0で推移。差は10^3。生の報酬を10^3倍して、ボーナスと同じ範囲に合わせる。
100倍スケーリングすると報酬は0.1(まだ0.294のボーナスより小さい → 探索が支配)。100,000倍スケーリングすると報酬は100(今や探索は影響を与えられず、UCBは貪欲なmean_rewardに崩壊)。1000倍は両方の項が寄与する動作ゾーンに位置。
キャリブレーション、理論ではない
1000倍の係数は理論的な定数ではなく、エンジニアリングによるキャリブレーションです。3つのものに依存:トレーニング損失のスケール(8Kトークンの語彙でのクロスエントロピーは約4.5)、ステップごとの損失減衰率(遅い)、およびUCB定数C=0.5。これらのいずれかを変えると、1000が適切な乗数でなくなる可能性があります。
スケーリング係数についての推論
次にくる内容
あなたが学んだこと
報酬帰属は、CUDA の損失レポートを UCB 対応のシグナルに変換する 3 つの操作で行います:ソースごとの EMA が損失履歴を追跡 (alpha=0.1, 低速)、reward = max(0, EMA - loss) で負値をクリップ、& 1000x スケーリングで報酬の大きさを UCB 探索ボーナスの大きさに合わせます。
残るもの
フロアとエポックペナルティ(アクティビティ 79)は、UCB出力の上に動作します。ソースフロアは、UCBランクに関係なく、優先ソースに対して最小サンプリングを保証します。エポックペナルティは、ドキュメント数よりも多くプルされたソースの重みを下げることで、小さなデータセットの暗記を防ぎつつ、大きなデータセットを新鮮に保ちます。
参考文献
ANDREA whitepaper, section 3.3.