对于一个向量 w,记 ∥w∥2 和 ∥w∥∞ 分别为它的 ℓ2 范数和 ℓ∞ 范数。
给定正的常数 c1,c2,我们定义:
- x=Ω(y),如果 x>c2∣y∣;
- x=Θ(y),如果 c_1 |y| < x < c_2 |y|;
- x=O(y),如果 x < c_1 |y|;
- x=o(y),如果 yx→0。
- O(y):上界,表示“不会比 y 增长得更快”。
- Ω(y):下界,表示“至少和 y 一样快”。
- Θ(y):上下界都在 y 的数量级内,表示“和 y 同阶”。
- o(y):严格比 y 小得多,最终会趋近于 0。
- 这个文章只想给出闭式遗忘公式,所以直接简化成线性模型。f(X)=X⊤w,w∈Rd
- 这个文章只讨论task-wised的路由方法,数据生成的时候每份数据只加入了一个信号数据,其余都是正态分布噪声。目的也是为了简化模型,然后在实际工程应用中,token会被隐式的送到各个experts,而不采用人为设定的方式。
> ### 数据集生成规则
在每一轮训练 t∈[T],新的任务 nt 到来时,数据集 Dt=(Xt,yt) 的生成步骤如下:
- 抽取任务真值向量
- 从任务池 W={w1,…,wN} 中均匀采样一个真值向量 wnt,并设定 wnt 为当前任务的 ground truth。
- 生成缩放系数
- 独立采样一个随机变量 βt∈(0,C),其中 C=O(1)。
- 构造输入特征矩阵 Xt
- 从 st 个样本中生成:
- 其中 一个样本定义为 βtvnt,其中 vnt 是任务 nt 的特征信号。
- 其余 st−1 个样本来自正态分布:N(0,σt2Id),其中 σt≥0 是噪声水平。
- 生成输出标签 yt
- 使用线性回归生成:
yt=Xt⊤wnt
最终得到:
数据集 Dt=(Xt,yt),对应一个线性回归任务。
- 这个文章只采用Top-1的experts指定方式
专家参数更新:
当router命中某个experts时,其他experts保持不变,只更新命中的experts,其更新公式为:
wt(mt)=wt−1(mt)+Xt(Xt⊤Xt)−1(yt−Xt⊤wt−1(mt))
目标:在第 t 轮,专家 mt 要拟合任务数据集 (Xt,yt)
minw ∥Xt⊤w−yt∥22
问题:过参数化 (s_t < d) 时解不唯一,直接算最小二乘解会丢掉历史信息。
> 所以论文改成 约束优化:
wmin ∥w−wt−1(mt)∥22s.t. Xt⊤w=yt
解法:用拉格朗日乘子或残差投影,可得更新:
wt(mt)=wt−1(mt)+Xt(Xt⊤Xt)−1(yt−Xt⊤wt−1(mt))
解释:
- (yt−Xt⊤wt−1) = 残差 = 真实输出 - 旧预测
- Xt(Xt⊤Xt)−1 = 把残差投影回参数空间的修正项
- 整个式子 = 在旧参数附近做一次最小二乘修正
性质:
- 保证 Xt⊤wt=yt → 新参数能完美拟合当前任务
- 同时尽量靠近 wt−1 → 避免遗忘过大
辅助损失:(这里经常也被称作load balance)
Ltaux(Θt,Dt)=α⋅M⋅m∈[M]∑ft(m)⋅Pt(m)
参数解释
- α:权重系数,控制辅助损失在总 loss 中的比重
- M:专家数量
- ft(m):专家 m 在前 t 轮中被选择的频率(历史使用情况)
- Pt(m):router 在第 t 轮给专家 m 的平均分配概率
作用
- 惩罚历史上频繁被使用且当前仍高概率被选的专家
- 鼓励 router 多利用未充分使用的专家
- 实现 负载均衡,避免专家“过度/稀少”使用
- 这里尾部项理解起来非常简单,当某个专家m历史使用的次数越多,并且当前轮数依然分配到了较大的logits的时候这个损失项就会变得极大,从而抑制router只会对几个专家的偏好性。进而避免路由坍塌。
局部性损失
Ltloc(Θt,Dt)=m∈[M]∑πm(Xt,Θt)∥wt(m)−wt−1(m)∥2
参数解释
- πm(Xt,Θt):router 给专家 m 的概率 (softmax 输出)
- wt(m):专家 m 在当前任务下的参数
- wt−1(m):专家 m 在上一轮的参数
作用
- 约束专家参数更新不能偏离历史太远
- 让相似任务被路由到同一专家,从而减小 loss
- 减少遗忘(新任务更新不会把旧知识完全覆盖)
- 提高专家的 专精性:每个专家逐渐固定在某类任务上
训练误差(损失):
Lttr(wt(mt),Dt)=st1∥Xt⊤wt(mt)−yt∥22
参数解释
- st:当前任务的数据样本数
- Xt:特征矩阵
- yt:输出标签向量
- wt(mt):在第 t 轮被选中的专家的参数
作用
- 本质是最小二乘回归的均方误差 (MSE)
- 让选中的专家拟合当前任务数据
- 保证专家能捕捉任务的真实信号 (ground truth)
总损失:
Lttask=Lttr+Ltloc+Ltaux
有了上述的总损失函数后,就可以在训练中,进行路由的参数更新了
路由更新公式:
θt+1(m)=θt(m)−η⋅∇θ(m)Lttask(Θt,wt(mt),Dt),∀m∈[M]
在持续学习 (CL) 的场景下,如果 gating network 一直持续更新,随着任务到达轮数的增加,不同专家的分配概率可能逐渐趋于一致,最终导致 专家分化消失 和 错误路由。为了解决这一问题,需要引入 早停机制 (Early Termination)
-
基本思想
在经过足够轮数的任务探索 (T1 轮) 后,MoE 的专家分配应当逐渐收敛。此时继续训练 gating network 不再带来收益,反而会导致过拟合和任务边界模糊。因此,需要在合适时机 终止路由器参数 Θt 的更新,保持专家划分的稳定性。
-
收敛判据
定义一个收敛标志 I(m) 来衡量专家 m 是否收敛:
I(m)=hm(Xt,θt)−hmt(Xt,θt)
其中,hm(Xt,θt) 表示专家 m 在当前输入上的 gating 输出,hmt(Xt,θt) 表示被 router 实际选择的专家的输出。
- 若该差距 大于阈值 Γ,说明专家 m 尚未收敛,需要继续更新 Θt。
- 若该差距 小于阈值 Γ,则认为 gating network 已经收敛,停止对 Θt 的更新。
- 如此,则可以避免 router 在已收敛后仍然更新,导致专家划分被破坏。也能确保不同专家能够稳定服务于各自的任务簇。结合 Lloc 和 Laux 的约束,早停机制使得系统能在 CL 环境下长期保持平衡和低遗忘。
- 参数连续性 (Parameter Locality)
Lparamloc=m∈[M]∑πm(Xt,Θt)∥wt(m)−wt−1(m)∥2
- 在前章节使用的方法
- 保证同一专家在相邻任务上的参数差异不要太大。
Lreprloc=m∈[M]∑πm(Xt,Θt)∥fm(Xt)−fm(Xt−1)∥2
Lrouteloc=m∈[M]∑∥πm(Xt,Θt)−πm(Xt−1,Θt−1)∥2