|
| 1 | +--- |
| 2 | +title: "Theory of MoE" |
| 3 | +description: "" |
| 4 | +date: "2025-10-05" |
| 5 | +tags: |
| 6 | + - tag-one |
| 7 | +--- |
| 8 | + |
| 9 | +# Theory of MoE |
| 10 | + |
| 11 | +## 基础公式定义 |
| 12 | + |
| 13 | +对于一个向量 $w$,记 $\|w\|_2$ 和 $\|w\|_\infty$ 分别为它的 $\ell_2$ 范数和 $\ell_\infty$ 范数。 |
| 14 | + |
| 15 | +给定正的常数 $c_1, c_2$,我们定义: |
| 16 | + |
| 17 | +- $x = \Omega(y)$,如果 $x > c_2 |y|$; |
| 18 | +- $x = \Theta(y)$,如果 $c_1 |y| \lt x \lt c_2 |y|$; |
| 19 | +- $x = O(y)$,如果 $x \lt c_1 |y|$; |
| 20 | +- $x = o(y)$,如果 $\dfrac{x}{y} \to 0$。 |
| 21 | + |
| 22 | +其中: |
| 23 | + |
| 24 | +- $O(y)$:上界,表示“不会比 $y$ 增长得更快”。 |
| 25 | +- $\Omega(y)$:下界,表示“至少和 $y$ 一样快”。 |
| 26 | +- $\Theta(y)$:上下界都在 $y$ 的数量级内,表示“和 $y$ 同阶”。 |
| 27 | +- $o(y)$:严格比 $y$ 小得多,最终会趋近于 $0$。 |
| 28 | + |
| 29 | +## **重要假设**: |
| 30 | + |
| 31 | +1. 这个文章只想给出闭式遗忘公式,所以直接简化成线性模型。$f(X)=X^{\top}w,\; w\in \mathbb{R}^d$ |
| 32 | +2. 这个文章只讨论task-wised的路由方法,数据生成的时候每份数据只加入了一个信号数据,其余都是正态分布噪声。目的也是为了简化模型,然后在实际工程应用中,token会被隐式的送到各个experts,而不采用人为设定的方式。 |
| 33 | + |
| 34 | +> ### 数据集生成规则 |
| 35 | +> |
| 36 | +> 在每一轮训练 $t \in [T]$,新的任务 $n_t$ 到来时,数据集 $\mathcal{D}_t = (X_t, y_t)$ 的生成步骤如下: |
| 37 | +> |
| 38 | +> 1. **抽取任务真值向量** |
| 39 | +> - 从任务池 $\mathcal{W} = \{w_1, \dots, w_N\}$ 中均匀采样一个真值向量 $w_{n_t}$,并设定 $w_{n_t}$ 为当前任务的 ground truth。 |
| 40 | +> 2. **生成缩放系数** |
| 41 | +> - 独立采样一个随机变量 $\beta_t \in (0, C)$,其中 $C = \mathcal{O}(1)$。 |
| 42 | +> 3. **构造输入特征矩阵 $X_t$** |
| 43 | +> - 从 $s_t$ 个样本中生成: |
| 44 | +> - 其中 **一个样本**定义为 $\beta_t v_{n_t}$,其中 $v_{n_t}$ 是任务 $n_t$ 的特征信号。 |
| 45 | +> - 其余 $s_t - 1$ 个样本来自正态分布:$\mathcal{N}(0, \sigma_t^2 I_d)$,其中 $\sigma_t \ge 0$ 是噪声水平。 |
| 46 | +> 4. **生成输出标签 $y_t$** |
| 47 | +> - 使用线性回归生成: |
| 48 | +> $$ |
| 49 | +> y_t = X_t^\top w_{n_t} |
| 50 | +> $$ |
| 51 | +> |
| 52 | +> **最终得到**: |
| 53 | +> 数据集 $\mathcal{D}_t = (X_t, y_t)$,对应一个线性回归任务。 |
| 54 | +
|
| 55 | +1. 这个文章只采用Top-1的experts指定方式 |
| 56 | + |
| 57 | +## 公式理论讲解: |
| 58 | + |
| 59 | +专家参数更新: |
| 60 | +当router命中某个experts时,其他experts保持不变,只更新命中的experts,其更新公式为: |
| 61 | + |
| 62 | +$$ |
| 63 | +w_t^{(m_t)} = w_{t-1}^{(m_t)} + X_t (X_t^\top X_t)^{-1}(y_t - X_t^\top w_{t-1}^{(m_t)}) |
| 64 | +$$ |
| 65 | + |
| 66 | +> ### 专家参数更新公式的由来 |
| 67 | +> |
| 68 | +> **目标**:在第 $t$ 轮,专家 $m_t$ 要拟合任务数据集 $(X_t, y_t)$ |
| 69 | +> $$ \min\_{w}\ \|X_t^\top w - y_t\|\_2^2 $$ |
| 70 | +> |
| 71 | +> **问题**:过参数化 ($s_t < d$) 时解不唯一,直接算最小二乘解会丢掉历史信息。 |
| 72 | +> 所以论文改成 **约束优化**: |
| 73 | +> |
| 74 | +> $$ |
| 75 | +> \min_w \ \|w - w_{t-1}^{(m_t)}\|_2^2 \quad |
| 76 | +> s.t.\ \ X_t^\top w = y_t |
| 77 | +> $$ |
| 78 | +> |
| 79 | +> **解法**:用拉格朗日乘子或残差投影,可得更新: |
| 80 | +> |
| 81 | +> $$ |
| 82 | +> w_t^{(m_t)} = w_{t-1}^{(m_t)} + X_t (X_t^\top X_t)^{-1}\,(y_t - X_t^\top w_{t-1}^{(m_t)}) |
| 83 | +> $$ |
| 84 | +> |
| 85 | +> **解释**: |
| 86 | +> |
| 87 | +> - $(y_t - X_t^\top w_{t-1})$ = **残差** = 真实输出 - 旧预测 |
| 88 | +> - $X_t (X_t^\top X_t)^{-1}$ = 把残差投影回参数空间的修正项 |
| 89 | +> - 整个式子 = 在旧参数附近做一次最小二乘修正 |
| 90 | +> |
| 91 | +> **性质**: |
| 92 | +> |
| 93 | +> - 保证 $X_t^\top w_t = y_t$ → 新参数能完美拟合当前任务 |
| 94 | +> - 同时尽量靠近 $w_{t-1}$ → 避免遗忘过大 |
| 95 | +
|
| 96 | +辅助损失:(这里经常也被称作load balance) |
| 97 | + |
| 98 | +$$ |
| 99 | +L_t^{\text{aux}}(\Theta_t, \mathcal{D}_t) = \alpha \cdot M \cdot \sum_{m \in [M]} f_t^{(m)} \cdot P_t^{(m)} |
| 100 | +$$ |
| 101 | + |
| 102 | +> ### 辅助损失 (Auxiliary Loss) |
| 103 | +> |
| 104 | +> **参数解释** |
| 105 | +> |
| 106 | +> - $\alpha$:权重系数,控制辅助损失在总 loss 中的比重 |
| 107 | +> - $M$:专家数量 |
| 108 | +> - $f_t^{(m)}$:专家 $m$ 在前 $t$ 轮中被选择的频率(历史使用情况) |
| 109 | +> - $P_t^{(m)}$:router 在第 $t$ 轮给专家 $m$ 的平均分配概率 |
| 110 | +> |
| 111 | +> **作用** |
| 112 | +> |
| 113 | +> - 惩罚历史上频繁被使用且当前仍高概率被选的专家 |
| 114 | +> - 鼓励 router 多利用未充分使用的专家 |
| 115 | +> - 实现 **负载均衡**,避免专家“过度/稀少”使用 |
| 116 | +> - 这里尾部项理解起来非常简单,当某个专家m历史使用的次数越多,并且当前轮数依然分配到了较大的logits的时候这个损失项就会变得极大,从而抑制router只会对几个专家的偏好性。进而避免路由坍塌。 |
| 117 | +
|
| 118 | +局部性损失 |
| 119 | + |
| 120 | +$$ |
| 121 | +L_t^{\text{loc}}(\Theta_t, \mathcal{D}_t) = \sum_{m \in [M]} \pi_m(X_t,\Theta_t)\, \|w_t^{(m)} - w_{t-1}^{(m)}\|_2 |
| 122 | +$$ |
| 123 | + |
| 124 | +> ### 局部性损失 (Locality Loss) |
| 125 | +> |
| 126 | +> **参数解释** |
| 127 | +> |
| 128 | +> - $\pi_m(X_t,\Theta_t)$:router 给专家 $m$ 的概率 (softmax 输出) |
| 129 | +> - $w_t^{(m)}$:专家 $m$ 在当前任务下的参数 |
| 130 | +> - $w_{t-1}^{(m)}$:专家 $m$ 在上一轮的参数 |
| 131 | +> |
| 132 | +> **作用** |
| 133 | +> |
| 134 | +> - 约束专家参数更新不能偏离历史太远 |
| 135 | +> - 让相似任务被路由到同一专家,从而减小 loss |
| 136 | +> - 减少遗忘(新任务更新不会把旧知识完全覆盖) |
| 137 | +> - 提高专家的 **专精性**:每个专家逐渐固定在某类任务上 |
| 138 | +
|
| 139 | +训练误差(损失): |
| 140 | + |
| 141 | +$$ |
| 142 | +L_t^{\text{tr}}(w_t^{(m_t)}, \mathcal{D}_t) = \frac{1}{s_t}\,\|X_t^\top w_t^{(m_t)} - y_t\|_2^2 |
| 143 | +$$ |
| 144 | + |
| 145 | +> ### 训练损失 (Training Loss) |
| 146 | +> |
| 147 | +> **参数解释** |
| 148 | +> |
| 149 | +> - $s_t$:当前任务的数据样本数 |
| 150 | +> - $X_t$:特征矩阵 |
| 151 | +> - $y_t$:输出标签向量 |
| 152 | +> - $w_t^{(m_t)}$:在第 $t$ 轮被选中的专家的参数 |
| 153 | +> |
| 154 | +> **作用** |
| 155 | +> |
| 156 | +> - 本质是最小二乘回归的均方误差 (MSE) |
| 157 | +> - 让选中的专家拟合当前任务数据 |
| 158 | +> - 保证专家能捕捉任务的真实信号 (ground truth) |
| 159 | +
|
| 160 | +总损失: |
| 161 | + |
| 162 | +$$ |
| 163 | +L_t^{\text{task}} = L_t^{\text{tr}} + L_t^{\text{loc}} + L_t^{\text{aux}} |
| 164 | +$$ |
| 165 | + |
| 166 | +有了上述的总损失函数后,就可以在训练中,进行路由的参数更新了 |
| 167 | + |
| 168 | +路由更新公式: |
| 169 | + |
| 170 | +$$ |
| 171 | +\theta_{t+1}^{(m)} = \theta_t^{(m)} - \eta \cdot \nabla_{\theta^{(m)}} L_t^{\text{task}}(\Theta_t, w_t^{(m_t)}, \mathcal{D}_t), \quad \forall m \in [M] |
| 172 | +$$ |
| 173 | + |
| 174 | +### Tricks: |
| 175 | + |
| 176 | +#### Early Termination |
| 177 | + |
| 178 | +在持续学习 (CL) 的场景下,如果 gating network 一直持续更新,随着任务到达轮数的增加,不同专家的分配概率可能逐渐趋于一致,最终导致 **专家分化消失** 和 **错误路由**。为了解决这一问题,需要引入 **早停机制 (Early Termination)** |
| 179 | + |
| 180 | +- **基本思想** |
| 181 | + 在经过足够轮数的任务探索 ($T_1$ 轮) 后,MoE 的专家分配应当逐渐收敛。此时继续训练 gating network 不再带来收益,反而会导致过拟合和任务边界模糊。因此,需要在合适时机 **终止路由器参数 $\Theta_t$ 的更新**,保持专家划分的稳定性。 |
| 182 | + |
| 183 | +- **收敛判据** |
| 184 | + 定义一个收敛标志 $I^{(m)}$ 来衡量专家 $m$ 是否收敛: |
| 185 | + |
| 186 | + $I^{(m)} = \big| h_m(X_t, \theta_t) - h_{m_t}(X_t, \theta_t) \big|$ |
| 187 | + |
| 188 | + 其中,$h_m(X_t,\theta_t)$ 表示专家 $m$ 在当前输入上的 gating 输出,$h_{m_t}(X_t,\theta_t)$ 表示被 router 实际选择的专家的输出。 |
| 189 | + - 若该差距 **大于阈值 $\Gamma$**,说明专家 $m$ 尚未收敛,需要继续更新 $\Theta_t$。 |
| 190 | + - 若该差距 **小于阈值 $\Gamma$**,则认为 gating network 已经收敛,停止对 $\Theta_t$ 的更新。 |
| 191 | + - 如此,则可以避免 router 在已收敛后仍然更新,导致专家划分被破坏。也能确保不同专家能够稳定服务于各自的任务簇。结合 $L^{loc}$ 和 $L^{aux}$ 的约束,早停机制使得系统能在 CL 环境下长期保持平衡和低遗忘。 |
| 192 | + |
| 193 | +#### 局部性损失的多种可能性 |
| 194 | + |
| 195 | +- **参数连续性 (Parameter Locality)** |
| 196 | + |
| 197 | +$$ |
| 198 | + L^{loc}_{param} = \sum_{m \in [M]} \pi_m(X_t,\Theta_t)\,\|w_t^{(m)} - w_{t-1}^{(m)}\|_2 |
| 199 | +$$ |
| 200 | + |
| 201 | + - 在前章节使用的方法 |
| 202 | + - 保证同一专家在相邻任务上的参数差异不要太大。 |
| 203 | + |
| 204 | + |
| 205 | +- **表示相似性 (Representation Locality)** |
| 206 | + - 可以直接对专家输出的表示(hidden states)施加约束。 |
| 207 | + |
| 208 | + - 比如: |
| 209 | + $$ |
| 210 | + L^{loc}_{repr} = \sum_{m \in [M]} \pi_m(X_t,\Theta_t)\,\|f_m(X_t) - f_m(X_{t-1})\|_2 |
| 211 | + $$ |
| 212 | + - 让相似输入在同一专家上输出保持稳定。 |
| 213 | + |
| 214 | +- **路由概率连续性 (Routing Locality)** |
| 215 | + - 约束 router 的分配概率不要随任务跳跃太大。 |
| 216 | + |
| 217 | + - 形式类似: |
| 218 | + $$ |
| 219 | + L^{loc}_{route} = \sum_{m \in [M]} \|\pi_m(X_t,\Theta_t) - \pi_m(X_{t-1},\Theta_{t-1})\|_2 |
| 220 | + $$ |
| 221 | +- **语义/任务嵌入的相似性 (Task Embedding Locality)** |
| 222 | + - 如果能为任务构建一个 task embedding(比如通过元学习或对比学习),可以定义: |
| 223 | + - 相似任务 → 路由到同一专家 |
| 224 | + - 不相似任务 → 尽量区分 |
0 commit comments