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

un

guest
1 / ?
back to lessons

指數移動平均

平滑的近期平均

指數移動平均 (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 步驟

來源 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


三個部分:


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 對損失波動向上的臂產生偏差。但波動是正常的:單一困難文件會提高損失,並不意味來源不好。裁剪至零將波動視為「無資訊」而非「懲罰」。


來源可以多次獲得零獎勵而不會沉沒。它們的 UCB 排名仍由探索獎勵(當 n_k 較小時較高)加上過去的勝利所驅動。


CUDA 報告的內容

每次前向+反向傳播,CUDA 核心會發出一筆記錄:


{source: 'hermes3-general', doc_index: 4231, loss: 4.520}


Proxy 接收記錄,查詢該 source 的 EMA,計算獎勵,更新 EMA,將獎勵輸入到 bandit 的 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] 範圍內。


現在來看 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 可能不再是正確的乘數。

關於縮放因子的推理

假設 ANDREA 使用 100x 而非 1000x 來縮放原始獎勵。原始獎勵 0.001 & UCB 探索獎勵 0.294 (C=0.5, N=1000, n_k=20):(a) 計算 100x 縮放後的獎勵,(b) 計算 1000x 縮放後的獎勵,(c) 對於每個縮放,識別哪個項(mean_reward 或 exploration bonus)主導該手臂的 UCB 分數,其中 mean_reward 等於縮放後的獎勵。(d) 用一句話解釋為什麼 1000x 能平衡兩者。

接下來

你已學會的

獎勵歸因將 CUDA 的損失報告轉換為 UCB 就緒訊號,透過三個操作:per-source EMA 追蹤損失歷史 (alpha=0.1, 緩慢),reward = max(0, EMA - loss) 裁剪負值,& 1000x 縮放匹配獎勵量級與 UCB 探索獎勵量級。


剩餘內容

樓層與紀元懲罰(活動 79)在 UCB 輸出之上運作。來源樓層保證優先來源無論 UCB 排名如何,都能獲得最小抽樣。紀元懲罰會降低已被拉取次數超過其文件數量的來源權重,防止小資料集被記憶化,同時大型資料集保持新鮮。


參考資料

ANDREA 白皮書,第 3.3 節。