CUDA 報告文件索引
CUDA 訓練器知道它採樣了哪個文件
每個訓練步驟從 .btok 二進位檔案中拉取一個序列,該檔案將許多文件端到端打包。CUDA 連同損失記錄文件索引:step 47213, source=gutenberg, doc=128407, loss=2.81。代理收集這些報告,並維護每個來源看到的唯一文件索引集合。
從計數到覆蓋率
來源的覆蓋率 = unique_docs_seen / n_docs。幾個例子:
| 來源 | n_docs | unique seen | 覆蓋率 |
|---|---|---|---|
| gutenberg | 512,000 | 154,000 | 30.1% |
| hermes3-general | 67,395 | 47,176 | 70.0% |
| dictionary | 88,000 | 88,000 | 100.0% |
| synthetic-chat | 1,400 | 1,400 | 100.0% |
小型來源很快就會飽和。大型來源會在數週內降至 50% 以下。覆蓋獎勵鼓勵 bandit 訪問來源中尚未採樣的文件。
獎勵公式
覆蓋獎勵從 0% 覆蓋時的 1.3x 線性縮放到 50% 覆蓋時的 1.0x,然後在 50% 以上保持平坦的 1.0x:
if coverage < 0.5:
bonus = 1.0 + 0.3 * (1.0 - coverage / 0.5)
else:
bonus = 1.0
覆蓋率為 0% 的來源獲得 1.3 倍加成;覆蓋率為 25% 的來源獲得 1.15 倍加成;覆蓋率為 50% 的來源降至 1.0 倍。超過 50% 時,不適用加成。
計算獎勵加成
兩個不同的新鮮度信號
相同目標,不同粒度
ANDREA 有兩個機制來防止過度訓練單一來源。它們聽起來相似;它們測量不同的東西。
Epoch 懲罰。 追蹤總體過度拉取。當 lifetime_pulls / n_docs > 1.0 時,一個來源理論上已經至少環繞每個文件一次。懲罰 = 1 / (1 + epochs)。一個擁有 1.4K 文件的 synthetic-chat 來源,在 5,600 次終身拉取(epochs = 4)時,獲得懲罰 1/5 = 0.2x。Epoch 計數會在重啟時持續存在;它們永不衰減。
覆蓋率獎勵。 追蹤來源內每個文件的最新度。CUDA 報告文件索引;代理為每個來源維護一個集合。獨特文件覆蓋率低於 50% 的來源可獲得高達 1.3x 的獎勵。覆蓋率獎勵探索來源的尾部;epoch 懲罰則懲罰耗盡它。
為什麼兩個都重要
| 訊號 | 追蹤 | 方向 | 上限 | 跨重啟持續 |
|---|---|---|---|---|
| Epoch 懲罰 | 彙總過度拉取 | 降低 | 1/(1+e) | 是 |
| 覆蓋加成 | 每文件新鮮度 | 提升 | 1.3x | 是 |
一個 500K 文件的 Gutenberg 來源可以在整個 200K 訓練過程中保持低於 50% 覆蓋率,同時永遠不會接近 epoch=1。Epoch 懲罰忽略它;覆蓋加成積極拉動 bandit 朝 Gutenberg 未探索的 70% 尾部前進。
相反地,一個 1.4K 合成聊天來源在幾千次拉取內就達到飽和覆蓋(100%);覆蓋加成維持在 1.0x,而 epoch 懲罰則持續增長。
區分這兩個
Coverage 獎勵為 ANDREA 帶來什麼
它防止的失敗模式
沒有文件級別追蹤的情況下,基於每步獎勵選擇的 bandit 會貪婪地挑選 .btok 序列。一個 500K 文件的 gutenberg 語料庫中包含幾千個低交叉熵的序列(一致的散文,常見詞彙)。僅基於獎勵的 bandit 會反复返回那些序列,因為它們持續產生強烈的獎勵信號。
結果:一個 500K 文件的語料庫在 200K 訓練步驟中僅被採樣約 2K-5K 個不同的序列。模型記住了那些序列,從未見過其餘部分。容量浪費;覆蓋率停留在 1% 以下。
覆蓋率獎勵帶來什麼
在 0% 覆蓋率時為 1.3x,在 50% 時縮減至 1.0x。這種輕推透過 UCB1 選擇傳播:覆蓋率低的臂即使單次拉動獎勵下降,仍保持競爭力。bandit 透過設計而非偶然探索尾部。
在 500K 文件 gutenberg 的 200K 步驟運行中,覆蓋率獎勵通常將觀測到的覆蓋率從 ~3%(無獎勵)提高到 ~25-30%(有獎勵)。相同計算量,觸及的文件數量增加八到十倍。
追蹤所在的位置
| 組件 | 責任 |
|---|---|
microgpt_cuda.cu | 每個訓練步驟報告文件索引 |
training_proxy.py | 每個來源維護 seen_docs 集合 |
training_proxy.py | 計算覆蓋率,應用獎勵到 bandit 獎勵 |
training_proxy.py | 在重啟時將 seen_docs 持久化到 .state.json |