为什么存在地板
糟糕的奖励连胜可能饿死优先源
ANDREA 的匪徒通过 UCB1 排名挑选焦点臂。UCB 排名取决于 mean_reward(k),而 mean_reward(k) 取决于观察到的损失改进。从优先源(例如 dictionary)的一连串高损失文档可能会拉低 mean_reward(k)。现在 dictionary 排名低,获得很少的焦点拉取,& 其 mean_reward(k) 无法恢复(无拉取 = 无新鲜观察)。
同样的风险适用于 ANDREA 的训练设计师无论短期奖励信号如何都希望纳入混合的任何源。
地板作为最小权重
ANDREA 的训练配置为每个源指定了一个 floor(地板):无论 UCB 输出说什么,该源都会获得的最小采样权重。地板范围从 0.0 到 1.0。示例:
hermes3-general floor = 0.8 (优先对话源)
chat floor = 0.8
dictionary floor = 0.7 (事实回忆支架)
gutenberg floor = 0.7 (散文连贯性)
synthetic-chat floor = 0.0 (无下限;bandit 自由决定)
下限如何应用
在 UCB1 对臂进行排序且 dice control 组装焦点集之后,每个源获得一个暂定权重。然后运行下限强制执行:
final_weight_k = max(tentative_weight_k, floor_k)
如果 bandit 为 hermes3-general 分配了 0.3 的权重,但其下限为 0.8,则下限获胜:最终权重 = 0.8。bandit 的声音仅会被向上覆盖;它永远不会被向下覆盖。
不同的配置,不同的 Floor
ANDREA 提供了几种训练配置:chatbot、tool-caller、bash-commander。每种配置为其优先级来源设置不同的 floor。Chatbot 将 hermes3-general 和 chat 的 floor 设置得较高。Tool-caller 将 repo-docstrings 的 floor 设置得更高。Bash-commander 将 repo-commits 的 floor 设置得更高。相同的算法,不同的优先级。
应用 Floor
记忆风险
微小来源会被记忆
ANDREA的数据来源大小差异巨大。synthetic-chat 大约有 1,400 个文档。gutenberg 有 500,000+ 个。如果bandit均匀拉取,synthetic-chat 会很快耗尽其文档池:1,400 次拉取后,每个文档至少被见过一次。拉取 2,800 次后,每个文档平均被见过至少两次。
对一小组文档的重复暴露会导致记忆:模型停止学习可泛化模式,开始背诵训练数据中的特定token序列。记忆有害有两个原因:(1) 它浪费容量用于死记硬背而不是泛化,& (2) 它可能通过生成泄露训练数据。
轮次作为记忆代理
定义源 k 的一个轮次为遍历 k 的所有文档的一次完整通过:
epochs_k = floor(lifetime_pulls_k / n_docs_k)
如果 synthetic-chat (n_docs=1400) 已被拉取 2,800 次,则 epochs = floor(2800/1400) = 2:该源已被完整查看两次。如果 gutenberg (n_docs=500,000) 已被拉取 100,000 次,则 epochs = floor(100000/500000) = 0:尚未完成一次完整通过。
1/(1+epochs) 惩罚
当 lifetime_pulls / n_docs > 1.0 时,ANDREA 会应用一个乘法惩罚:
penalty = 1 / (1 + epochs)
final_weight = bandit_weight * penalty
曲线:
| 轮次 | 惩罚 | 权重减少 |
|---|---|---|
| 0 | 1.000 | 无 |
| 1 | 0.500 | 一半 |
| 2 | 0.333 | 三分之一 |
| 3 | 0.250 | 四分之一 |
| 5 | 0.167 | 六分之一 |
| 10 | 0.091 | one eleventh |
惩罚随着每次完成的遍历而增长。经过许多 epoch 后,源的权重趋近于零,bandit 自然地让它休息。
为什么 Lifetime Pulls 在重启时持续存在
ANDREA 的训练运行跨越数天。崩溃会发生。服务器重启。配置被调整,训练从检查点恢复。Lifetime pulls 在所有这些事件中持续存在:代理持续地将拉取计数写入磁盘。
如果每次重启时拉取计数重置,一个小源就能有效地每次训练重启时重置为 epoch 0。惩罚将永远不会累积,记忆化将不受影响地进行。持久化的 lifetime pulls 使惩罚成为一个真实、单调增长的约束。
计算 Epoch 惩罚
关闭 Bandit 课程栈
你已掌握的内容
Floors 保证优先来源的最小采样:final_weight = max(bandit_weight, floor_k)。Epoch 惩罚限制小来源的记忆:当 lifetime_pulls/n_docs > 1 时,权重乘以 1/(1+epochs)。终身拉取在重启间持久存在,因此惩罚成为单调约束,而不是可重置计数器。
完整管道
将所有四个 ANDREA 匪徒活动(76-79)组合在一起:
1. 活动 76 (UCB1)。 每一步计算 UCB(k) = mean_reward(k) + 0.5 * sqrt(ln(N)/n_k)。Argmax 选择一个臂。
2. 活动 77 (骰子阶段)。 阶段边界(每 7 到 42 步)掷骰子决定焦点臂数量。先随机臂,UCB 填充其余。25-33% 的阶段完全随机运行。
3. 活动 78 (奖励归因)。 CUDA 报告损失;按来源 EMA 跟踪历史;奖励 = max(0, EMA - 损失) * 1000。缩放奖励输入 mean_reward(k)。
4. 活动 79 (底线 & 纪元,本课)。 UCB 输出后,底线提升优先来源;纪元惩罚降低记忆来源权重。终身拉取持续存在。
总而言之:一个能够适应的强盗(UCB1),可靠地探索(骰子阶段),获得诚实的奖励信号(1000x 缩放),尊重训练设计优先级(下限),并避免记忆化(周期惩罚)。
参考文献
ANDREA 白皮书,第 3.5 节和 3.6 节。