MoE (Mixture of Experts)
记录moe的重要内容
todo
参考
博客:A Visual Guide to Mixture of Experts (MoE)
混合专家模型 (MoE)
显著优势:能够在远少于稠密模型所需的计算资源下进行有效的预训练。这意味着在相同的计算预算条件下,可以显著扩大模型或数据集的规模。特别是在预训练阶段,与稠密模型相比,混合专家模型通常能够更快地达到相同的质量水平。
MoE 的两个核心组成部分
专家(Experts)和 路由器(Router)
- 专家 :每个“专家”本质上也是一个前馈神经网络(FFNN)。
- 路由器或门控网络(Gate Network) :负责决定每个 token(词元)应该被送到哪些专家那里去处理。
专家(Experts)
- 稠密层
也就是传统Transformer中的 前馈神经网络(FFNN, Feedforward Neural Network)
作用:利用注意力机制生成的上下文信息,并进一步转换这些信息,从而捕捉数据中更复杂的关联关系。 - 稀疏层
稀疏模型(sparse models) 只激活部分参数 - 专家们学到了什么?
专家们更倾向于关注语法结构,而不是具体的领域知识。它们好像会用于处理某些特定类型的token。
路由(Routers)
作用
根据每个 token 的输入内容,输出一组概率值,并据此选择最匹配的专家。
MoE层
路由器 + 一组专家(FFNN被选中的一小部分)= 构成了一个 MoE 层(MoE Layer)
两种类型:稀疏MoE、稠密MoE
有什么不同?
对一组 token,Dense MoE 会将每个 token 分发给所有专家,而 Sparse MoE 只会分发给其中少数几个。
稀疏MoE的优势:有效降低推理成本,非常适合llm
专家选择的过程
| 步骤 | 内容 |
|---|---|
| 1️⃣ | Router 线性层输出 gating logits |
| 2️⃣ | Softmax 得到专家概率 |
| 3️⃣ | 选择 top-k 专家 |
| 4️⃣ | 将 token 分发给这些专家计算 |
| 5️⃣ | 聚合结果(加权求和) |
| 6️⃣ | 使用负载均衡 loss 维持专家使用均匀 |
具体计算示例:
假设:
- 有 3 个专家 ( E_1, E_2, E_3 )
- 每个输入维度是 4
- Router 是一个线性层 Wr∈R4×3W_r \in \mathbb{R}^{4 \times 3}Wr∈R4×3
- 使用 Top-2 gating。
Step 1. Router 输出 gating logits
输入 token:x = [0.5, -1.0, 0.3, 0.8]
Router 参数(简化):
Wr=[0.10.3−0.2−0.40.20.10.5−0.30.40.20.00.1]W_r = \begin{bmatrix} 0.1 & 0.3 & -0.2 \ -0.4 & 0.2 & 0.1 \ 0.5 & -0.3 & 0.4 \ 0.2 & 0.0 & 0.1 \end{bmatrix}Wr=[0.10.3−0.2 −0.40.20.1 0.5−0.30.4 0.20.00.1]
计算 logits:
l=xWr=[0.5∗0.1+(−1)∗(−0.4)+0.3∗0.5+0.8∗0.2,...]=[0.63,−0.01,0.28]l = x W_r = [0.5*0.1 + (-1)*(-0.4) + 0.3*0.5 + 0.8*0.2, \ ...] = [0.63, -0.01, 0.28]l=xWr=[0.5∗0.1+(−1)∗(−0.4)+0.3∗0.5+0.8∗0.2, ...]=[0.63,−0.01,0.28]
经过 softmax:
g=softmax([0.63,−0.01,0.28])=[0.44,0.21,0.35]g = \text{softmax}([0.63, -0.01, 0.28]) = [0.44, 0.21, 0.35]g=softmax([0.63,−0.01,0.28])=[0.44,0.21,0.35]
Step 2. Top-k 选择
Top-2 gating → 选择 expert 1 和 3。
对应权重归一化为:
gtop2=[0.56,0.44](重新归一化)g_{top2} = [0.56, 0.44] \quad (\text{重新归一化})gtop2=[0.56,0.44](重新归一化)
Step 3. 前向计算
y=0.56⋅E1(x)+0.44⋅E3(x)y = 0.56 \cdot E_1(x) + 0.44 \cdot E_3(x)y=0.56⋅E1(x)+0.44⋅E3(x)
只调用这两个专家的前馈网络。
其他专家(如 E₂)不会被激活,节省计算。
路由的挑战
引入可训练的高斯噪声,以防止模型总是选中同一批专家
output = input * router weights + gaussian noise
路由的挑战:某些专家学得更快,导致路由器总是选它们。会导致选择的专家不均匀,一些专家几乎不会被训练到。
解决方案:负载均衡,目的是让每个专家在训练和推理中都能被公平地使用,避免某在某几个专家上过拟合。
KeepTopK 策略
第一步:计算每个专家的 重要性分数
第二步:计算 变异系数
第三步:优化目标 = 降低 CV
指标变异系数(Coefficient of Variation, CV)分析:
- 如果 CV 很高,说明某些专家总被选中,而其他专家几乎没被用;
- 如果 CV 很低,说明所有专家被使用得差不多,这正是想要的“负载均衡”状态。
专家容量
模型中的不平衡,不仅体现在被选中的专家不平均,也体现在发送给专家的 token 分布不均。
