指数移动平均
平滑的近期平均值
指数移动平均 (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,计算 reward,更新 EMA,将 reward 送入 bandit 的 mean_reward(k) 累加器。
计算 Reward
匹配奖励与探索奖励
幅度问题
每步 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 最小的臂。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 退化为贪婪均值奖励)。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 节。