English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

ゲスト
1 / ?

指数移動平均

最近の平滑化された平均

指数移動平均(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を計算するステップ

ソース k の EMA_k(t-1) = 4.521。CUDA がソース k の新しい損失を報告: loss_k(t) = 4.520。alpha = 0.1 の場合、EMA_k(t) を計算せよ。(a) (1-alpha) 項、(b) (1-alpha) * EMA_k(t-1)、(c) alpha * loss_k(t)、(d) 合計を示せ。必要に応じて4桁の小数で四捨五入。

報酬の公式

報酬 = 改善度、スケーリング済み

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 探索ボーナスと比較可能なスケールに拡大するため。


Reward Attribution Flow


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) アキュムレータに投入します。

リワードを計算する

ソース k の EMA_k(t-1) = 4.521。CUDA が loss_k(t) = 4.520 を報告。reward_k をステップバイステップで計算:(a) EMA_k(t-1) - loss_k(t) の差分、(b) クリップされた値 max(0, difference)、(c) スケールされた報酬(1000倍)。次に loss_k(t) = 4.530(EMAより悪い場合)の第二のケースで、(d) クリップされていない差分、& (e) max(0, ...) クリップ&スケーリング後の最終報酬を計算。

報酬を探索ボーナスに合わせる

規模の問題

ステップごとの 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が適切な乗数でなくなる可能性があります。

スケーリング係数についての推論

ANDREA が生の報酬を 1000x ではなく 100x でスケーリングしたと仮定します。生の報酬 0.001 & UCB 探索ボーナス 0.294 (C=0.5, N=1000, n_k=20) の場合:(a) 100x でのスケーリング報酬を計算せよ、(b) 1000x でのスケーリング報酬を計算せよ、(c) 各スケーリングについて、mean_reward がスケーリング報酬と等しい腕の UCB スコアにおいて、どの項 (mean_reward または exploration bonus) が支配的かを特定せよ。(d) 1文で、1000x が両者をバランスさせる理由を説明せよ。

次にくる内容

あなたが学んだこと

報酬帰属は、CUDA の損失レポートを UCB 対応のシグナルに変換する 3 つの操作で行います:ソースごとの EMA が損失履歴を追跡 (alpha=0.1, 低速)、reward = max(0, EMA - loss) で負値をクリップ、& 1000x スケーリングで報酬の大きさを UCB 探索ボーナスの大きさに合わせます。


残るもの

フロアとエポックペナルティ(アクティビティ 79)は、UCB出力の上に動作します。ソースフロアは、UCBランクに関係なく、優先ソースに対して最小サンプリングを保証します。エポックペナルティは、ドキュメント数よりも多くプルされたソースの重みを下げることで、小さなデータセットの暗記を防ぎつつ、大きなデータセットを新鮮に保ちます。


参考文献

ANDREA whitepaper, section 3.3.