指數移動平均
平滑的近期平均
指數移動平均 (EMA) 透過對近期樣本賦予較高權重(權重隨時間指數衰減)來追蹤一個值。公式:
EMA(t) = (1 - alpha) EMA(t-1) + alpha value(t)
其中 alpha(平滑因子)位於 (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 為每個臂(每個來源)維護一個 EMA。十六個臂 = 十六個 EMA。每個步驟僅更新被拉動的來源的 EMA。其他 15 個 EMA 保持凍結,直到下次被拉動。
計算 EMA 步驟
獎勵公式
獎勵 = 改進,經縮放
ANDREA 定義手臂 k 的每步獎勵為:
reward_k = max(0, EMA_k(t-1) - loss_k(t)) * 1000
三個部分:
1. EMA_k(t-1) - loss_k(t):改善。如果新的損失低於運行平均值,差異為正:來源 k 的表現優於預期。
2. max(0, ...):將負改善截斷為零。如果新的損失比 EMA 更差,則無獎勵(但也無懲罰)。
3. \* 1000:放大以使信號與 UCB 探索獎勵相當。
為什麼使用 max(0, ...)
負獎勵會將 mean_reward(k) 推低,導致 UCB 對損失波動向上的臂產生偏差。但波動是正常的:單一困難文件會提高損失,並不意味來源不好。裁剪至零將波動視為「無資訊」而非「懲罰」。
來源可以多次獲得零獎勵而不會沉沒。它們的 UCB 排名仍由探索獎勵(當 n_k 較小時較高)加上過去的勝利所驅動。
CUDA 報告的內容
每次前向+反向傳播,CUDA 核心會發出一筆記錄:
{source: 'hermes3-general', doc_index: 4231, loss: 4.520}
Proxy 接收記錄,查詢該 source 的 EMA,計算獎勵,更新 EMA,將獎勵輸入到 bandit 的 mean_reward(k) 累加器中。
計算獎勵
匹配獎勵與探索獎金
幅度問題
每步 loss 改善很小。Loss 從 4.521 降到 4.520:差異 0.001。從 4.520 到 4.518:差異 0.002。在整個訓練過程中,原始差異大致在 [0, 0.01] 範圍內。
現在來看 UCB 在 C=0.5 的探索獎勵,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 最小的 arm。Mean_reward 被忽略。Bandit 變成純探索策略。
解決方案:乘以 1000
將原始獎勵乘以 1000。現在獎勵為 1.0(相對於原始的 0.001)。與相同的探索獎勵 0.294 比較:
縮放後獎勵 1.0 相對於獎勵 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 崩潰為貪婪平均獎勵)。1000 倍位於兩者皆有貢獻的工作區間。
校準,而非理論
1000 倍因子是工程校準,而非理論常數。它取決於三件事:訓練損失尺度(8K 詞彙的交叉熵約為 4.5)、每步損失衰減率(緩慢),以及 UCB 常數 C=0.5。改變其中任何一項,1000 可能不再是正確的乘數。
關於縮放因子的推理
接下來
你已學會的
獎勵歸因將 CUDA 的損失報告轉換為 UCB 就緒訊號,透過三個操作:per-source EMA 追蹤損失歷史 (alpha=0.1, 緩慢),reward = max(0, EMA - loss) 裁剪負值,& 1000x 縮放匹配獎勵量級與 UCB 探索獎勵量級。
剩餘內容
樓層與紀元懲罰(活動 79)在 UCB 輸出之上運作。來源樓層保證優先來源無論 UCB 排名如何,都能獲得最小抽樣。紀元懲罰會降低已被拉取次數超過其文件數量的來源權重,防止小資料集被記憶化,同時大型資料集保持新鮮。
參考資料
ANDREA 白皮書,第 3.3 節。