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

un

访客
1 / ?
返回课程列表

指数移动平均

平滑的近期平均值

指数移动平均 (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,计算 reward,更新 EMA,将 reward 送入 bandit 的 mean_reward(k) 累加器。

计算 Reward

来源 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 最小的臂。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 可能就不再是正确的乘数。

关于缩放因子的推理

假设 ANDREA 将原始奖励缩放 100 倍而不是 1000 倍。给定原始奖励 0.001 和 UCB 探索奖金 0.294 (C=0.5, N=1000, n_k=20):(a) 计算 100 倍缩放后的奖励,(b) 计算 1000 倍缩放后的奖励,(c) 对于每种缩放,识别哪个项(mean_reward 或 exploration bonus)主导该臂的 UCB 分数,其中 mean_reward 等于缩放后的奖励。(d) 用一句话解释为什么 1000 倍能平衡两者。

接下来

你已学到什么

奖励归因将 CUDA 的损失报告转换为 UCB 就绪信号,通过三个操作:per-source EMA 跟踪损失历史 (alpha=0.1, 慢速),reward = max(0, EMA - loss) 裁剪负值,& 1000x 缩放匹配奖励量级与 UCB 探索奖金量级。


剩余内容

楼层 & 纪元惩罚(活动 79)在 UCB 输出之上运行。来源楼层保证优先来源无论 UCB 排名如何都获得最小采样。纪元惩罚降低已被拉取次数超过其文档数的来源权重,防止小数据集记忆化,同时大型数据集保持新鲜。


参考文献

ANDREA 白皮书,第 3.3 节。