Transformer 模型
Transformer Models
从序列任务出发,逐步建立自注意力、编码器与解码器,再理解语言与视觉模型,以及专家路由与负载均衡。
从 Seq2Seq 到自注意力
机器翻译需要把一个输入序列转成另一个输出序列,例如将“深度学习”翻译成 “Deep Learning”。编码器读取源序列,产生表示;解码器根据这些表示和已有的目标前缀,逐步生成目标序列。两侧的长度可以不同。上一讲用 RNN 完成这个任务,这一讲保持任务与角色,改用 Transformer 组织内部计算。
2017 年的《Attention Is All You Need》提出以注意力为核心的编码器—解码器。先理解位置之间怎样交换信息,再理解完整块怎样堆叠,最后讨论语言、视觉和稀疏专家层。
先看自注意力层的输入输出。输入为一组向量 a_1,\ldots,a_N,输出为同样多的向量 b_1,\ldots,b_N。输入可以是词嵌入,也可以是上一隐藏层的输出。逐位置全连接层变换各位置的特征,自注意力让不同位置交换信息,两者可以交替堆叠。
只观察第一个输出 b_1:它需要根据当前输入,决定哪些 a_i 与自己相关,再汇总这些位置的信息。这就是接下来“打分—权重—汇总”的任务。
相关性可以通过点积打分,也可以通过加性打分。两者先将输入映射到用于比较的空间;点积直接相乘求和,加性方式经过可学习的非线性网络。本讲随后采用点积。
第一个位置经过查询投影得到 q_1,各位置经过键投影得到 k_i。q_1 与每个 k_i 的点积表示兼容程度。分数可以为负,也不要求和为 1,此时还不是概率。
归一化权重与 Value 汇总
被查询位置包含 a_1 自己。固定一个查询,把它与四个键得到的分数做 Softmax,便得到一组非负且和为 1 的权重。每个输入还经过值投影得到 v_i,用于提供实际被汇总的内容。权重与对应的值逐项相乘,再求和得到 b_1。
\alpha_{1i}=\frac{\exp(q_1^\top k_i)}{\sum_j\exp(q_1^\top k_j)},\qquad b_1=\sum_i\alpha_{1i}v_i图中的标量值只是帮助核对加权和的数值例子;实际 v_i 和 b_1 都是向量。同一权重作用于对应值向量的全部分量。
换到第二个位置,使用 q_2 对同一组键重新打分,再汇总同一组值。键和值可以复用,关注分布由新的查询决定。
这些输出可以同时计算。某个位置不需要等待前一位置的输出,因而能将整段序列的计算写成并行矩阵运算。
匹配分数与加权结果
示例 Value:[2、−1、1、0];输出为归一化权重与对应值的加权和。
矩阵计算与缩放点积注意力
将 N 个输入按行放入 X\in\mathbb R^{N\times D}。三个投影在所有位置共享参数,得到查询、键和值矩阵。
Q=XW_Q\in\mathbb R^{N\times d_k},\quad K=XW_K\in\mathbb R^{N\times d_k},\quad V=XW_V\in\mathbb R^{N\times d_v}QK^\top 的第 i 行包含查询 q_i 对全部键的分数,第 j 列对应被查询位置 j。逐行 Softmax 后,每行权重和为 1;再乘 V,每行就成为对应输出位置的加权和。
维度 d_k 较大时,点积的典型幅值会增大,Softmax 更容易产生过于集中的分布。因此标准缩放点积注意力在归一化之前除以 \sqrt{d_k}。
\operatorname{Attention}(Q,K,V)=\operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V\in\mathbb R^{N\times d_v}回到语言例子:“The animal didn't cross the street because it was too tired”。处理 “it” 时,可以关注 “animal”,让代词的表示纳入它所指代对象的上下文。沿图中的连线观察,这个例子把抽象权重对应到了具体的词间关系。
多头注意力:多个相关性子空间
一个位置可能需要同时利用不同关系。多头注意力为各头提供不同的投影,使各头独立打分、归一化和汇总。两头示例先计算第一头的输出,再加入第二头的输出。
把各头结果拼接,再做输出投影 W_O,映射回模型维度。以 h 个头为例:
\operatorname{head}_r=\operatorname{Attention}(XW_Q^{(r)},XW_K^{(r)},XW_V^{(r)}),\qquad \operatorname{MHA}(X)=\operatorname{Concat}(\operatorname{head}_1,\ldots,\operatorname{head}_h)W_O“it” 的表示可同时纳入 “animal” 和 “tired” 的信息。两头与七头的原图展示不同关注连线;不同头可以学到不同关系,不必事先为每头规定一种固定语法职责。
位置编码补回顺序
仅有内容打分时,同时重排输入位置,会相应重排输出;模型缺少区分绝对次序的额外信号。因此在内容向量中加入位置向量 e_i,让同一个词出现在不同位置时具有不同输入表示。
位置向量可以手工设计,也可以从数据中学习。原图每列代表一个位置向量,各行是它的不同分量。常用正弦余弦方案为不同频率的组合;后面的 ViT 则采用可学习位置嵌入。
自注意力与 CNN、RNN
先比较连接范围。卷积采用局部感受野与共享核;全局自注意力允许所有位置直接交互,并由输入内容决定各连接的权重。它们都能聚合多个位置,但具有不同的参数形式与结构先验。
局部性和平移等变等先验,常能帮助 CNN 在较少数据时学习。实验图随预训练样本数变化,显示注意力模型在更大数据条件下的表现变化。横轴数据规模、模型配置与训练方式需要一起读取。
再比较时间路径。RNN 逐步更新状态,远处信息需穿过多个递推步;自注意力直接连接远处位置,而且整段输入已知时可并行计算。自回归生成仍要等待前一个输出,训练中的序列并行与推理中的逐步生成应分开理解。
编码器块的完整路径
编码器把 x_1,\ldots,x_N 转成 h_1,\ldots,h_N。任务是为每个位置生成结合上下文的表示,输入输出位置一一对应。这个角色可以由 RNN、CNN 或 Transformer 实现,本讲使用 Transformer 编码器。
一个基本块先用自注意力交换位置之间的信息,再用共享的逐位置 FFN 变换每个向量。多个块逐层堆叠,表示不断更新;不同层通常拥有各自的参数。
残差、前馈网络与层归一化
完整块还需要残差与归一化。以原始 Post-LN 布局为例,注意力输出与输入相加后做 LayerNorm;FFN 输出再次与其输入相加,再归一化。残差建立直接的信息与梯度路径。
U=\operatorname{LN}(X+\operatorname{MHA}(X)),\qquad H=\operatorname{LN}(U+\operatorname{FFN}(U))FFN 对每个位置应用相同的两层变换:先扩大中间维度并经过非线性,再映射回 D 维。它沿特征维计算,位置间的信息交换由注意力负责。
LayerNorm 对一个向量的特征求均值和方差,并包含可学习的缩放与偏移:
\operatorname{LN}(z)_j=\gamma_j\frac{z_j-\mu}{\sqrt{\sigma^2+\epsilon}}+\beta_j把这些组件放回编码器,可为全部位置产生上下文化表示。BERT 属于使用这种编码器结构的模型家族,稍后再比较完整任务形式。
Pre-LN、Post-LN 与归一化轴
Post-LN 在残差相加之后归一化,Pre-LN 先归一化模块输入,再将模块输出加入残差主路。沿箭头观察,Pre-LN 的主残差路径可以直接保留 x。
\text{Post-LN: }\operatorname{LN}(x+F(x)),\qquad \text{Pre-LN: }x+F(\operatorname{LN}(x))归一化位置会影响梯度与训练配置,不能单凭名字断定某一种布局在所有阶段都更稳定。深度、初始化、学习率和 warmup 等共同影响表现。
接着比较统计轴。图像张量记为 (N,C,H,W):BatchNorm 每通道聚合 N,H,W;图示 LayerNorm 对单样本聚合 C,H,W;InstanceNorm 对单样本、单通道聚合 H,W;GroupNorm 对单样本的一组通道聚合组内通道及 H,W。
语言 Transformer 常用的 LayerNorm 对单个 token 的 D 个特征统计,具体归一化维度由张量形状与配置决定。理解统计集合比记方法名称更重要。
自回归解码与停止条件
解码器根据输入条件和已经生成的前缀,预测下一个 token。这里先理解生成过程,随后才拆开它内部的遮罩与交叉注意力。
从特殊符号 START(也记为 BOS)开始,模型输出整个词表上的分布。示例中“深”的概率为 0.8,“习”为 0.1,其余候选占据剩余概率;选择最大项便得到第一个字“深”。
将“深”接回输入,再预测“度”;把“度”加入前缀,再预测“学”。输出不断成为下一次计算的条件。如果第二步错误生成“渡”,后面读取的也会是“渡”,从而影响后续预测。
目标长度事先未知。生成完“深度学习”后,模型仍可能继续生成“惯”等字符,因此需要明确的停止预测。
将 END(EOS)加入词表。当下一次预测选中 EOS,当前序列结束。PAD 用于批次长度对齐;工程上还可以设置最大生成长度。
因果遮罩怎样阻止未来泄漏
暂时略去编码器输入,观察解码器自己的路径。它与编码器都包含自注意力、FFN、残差和归一化,但生成时只能读取已有的目标前缀。
第 i 个目标位置只能读取 j\le i 的输入位置。训练时整段真实目标已知,因果遮罩也要阻止模型访问未来答案,使训练中的可见范围与生成过程一致。
M_{ij}=\begin{cases}0,&j\le i\\-\infty,&j>i\end{cases},\qquad A=\operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}+M\right)遮挡发生在 Softmax 之前,负无穷对应归一化后的零权重。输入目标右移一位后,第 i 个输入位置用于预测下一词,读取自身输入不会读到该位置的预测标签。
原图还比较滑动窗口与分块遮罩。它们限制历史信息的访问范围,具有不同连接结构;padding mask 则另行排除用于补齐长度的位置。
目标位置的可见前缀
自回归与非自回归
自回归(AR)生成依次读取已有输出。非自回归(NAR)尝试同时预测多个目标位置,但必须先决定输出槽位:可以另设长度预测器,也可以生成足够长的序列,在 END 之后忽略剩余位置。
并行生成可降低时间链上的等待,在 TTS 等任务中有实际用途。困难是同一个输入可能对应多种合理输出,若各位置独立选择不同答案模式,整句可能不一致。质量与速度的取舍要结合任务和模型设计。
交叉注意力连接输入与输出
现在把编码器接回解码器。完整模型包含三类注意力:编码器的双向自注意力、解码器的因果自注意力,以及读取源表示的交叉注意力。交叉注意力中的查询来自目标侧状态,键和值来自编码器输出。
固定当前目标查询,与各个源位置的键打分,再按权重汇总源值。得到的源信息与目标状态共同用于预测。示例先从 START 预测“机”,加入“机”后,更新后的查询重新读取源序列。图中的小型权重分布用于示意两次查询的变化。
Q=H_{\mathrm{dec}}W_Q,\quad K=H_{\mathrm{enc}}W_K,\quad V=H_{\mathrm{enc}}W_V若目标长度为 T、源长度为 S,权重矩阵为 T\times S,每行是某个目标位置对全部源位置的关注分布。交叉注意力本身不需要按源位置使用因果遮罩,源输入通常已完整可用。
语音识别的原图显示频谱时间片段与输出字符 h、o、w 等的软对齐。这个例子来自 Listen, Attend and Spell,说明跨序列读取机制也能用于其他网络。
标准架构以编码器表示作为解码器各层的键和值。后续研究还比较同层、并行、细粒度、全连接和自适应的跨层连接;图中连线的层级不同,读取信息的来源也不同。
训练、推理与 Teacher Forcing
训练样本同时提供源输入与真实目标。第一个预测位置的真实标签为“深”,用它监督模型输出的词表分布,最小化交叉熵。
整段训练将目标右移一位作为解码器输入:输入为 BOS 深 度 学 习,标签为 深 度 学 习 EOS。每个输入位置预测紧随其后的真实 token。因果遮罩保证只读取对应前缀,各位置损失仍可并行计算。
L=-\sum_{t=1}^{T}\log P(y_t\mid y_{<t},x)这就是 Teacher Forcing:训练时使用真实前缀。推理时只能使用模型生成的前缀,稍后再讨论这个分布差异。
束搜索:扩展、剪枝与回溯
逐步选择最大概率 token,是贪心解码。它不保证整条路径概率最大:原两分支例子中,贪心路径概率为 0.6\times0.6\times0.4=0.144,另一条路径为 0.4\times0.9\times0.9=0.324。较弱的第一步,可能通向更强的后续路径。
穷举长度 T 的序列约有 |V|^T 条路径。束搜索保留 k 个高分前缀,每轮扩展后,再全局保留 k 个候选。比较的是累计对数概率,越大越好,即负值越接近零越好。
\operatorname{score}(y_{1:t})=\sum_{i=1}^{t}\log P(y_i\mid y_{<i},x)示例束宽为 2,先保留 he 与 I,再扩展成 he hit、he struck、I was、I got。全局剪枝保留 I was(−1.6)与 he hit(−1.7),随后继续扩展与剪枝,最终回溯得到 he hit me with a pie,示例分数为 −4.3。
束搜索是近似搜索;已经剪掉的前缀不会自动恢复。实际生成还需要维护完成假设、EOS 停止条件,并考虑不同长度之间的分数比较。
采样、BLEU 算例与评价优化
开放生成可能存在许多合理答案。比较束搜索和随机采样的文本输出,可以看到只追求高概率路径可能产生机械重复,采样有助于保留生成多样性。
BLEU 比较候选与参考译文的 n-gram。精确率使用裁剪计数:一个候选短语的匹配数量,不能超过参考中的出现次数。再乘短句惩罚 BP,防止仅输出少量高频匹配词。
\mathrm{BLEU}=\mathrm{BP}\exp\left(\sum_{n=1}^{m}w_n\log p_n\right),\qquad \mathrm{BP}=\begin{cases}1,&c>r\\\exp(1-r/c),&c\le r\end{cases}具体看候选 “the cat sat on the mat”,参考 “the cat is on the mat”。一元匹配为 5/6;二元匹配为 the cat、on the、the mat,共 3/5。两句长度均为 6,所以 BP=1。只取一元和二元、各占一半权重时:
\mathrm{BLEU}_2=\exp\left(\frac12\log\frac56+\frac12\log\frac35\right)=\sqrt{\frac12}\approx0.7071常见 BLEU 计算综合一至四元,这个二元例子用于演示步骤。BLEU 衡量词串重合,不能单独代表全部语义质量。
若希望直接优化序列级评价指标,离散选词让普通反向传播难以直接穿过解码结果。可以把评价分数作为序列奖励,采用强化学习式优化等方法;奖励设计和估计方式会影响训练。
前缀分布差异与完整结构回顾
原错误例子中,推理生成“渡”后,后续读取“深渡”;Teacher Forcing 训练却读取“深度”。训练前缀来自数据,推理前缀来自模型,这个差异称为 exposure bias。
Scheduled Sampling 尝试在训练中混合真实输出与模型输出。相关设计包括原始方案、适用于 Transformer 的方案,以及并行方案;它们改变训练输入与计算路径,需要结合训练设置选择。
把机制重新组装:位置表示进入两侧网络,编码器保存源序列信息,解码器读取已有前缀,再通过交叉注意力读取源表示,最终输出下一词分布。
Encoder-only、Encoder–Decoder、Decoder-only
用输入输出角色与可见范围比较三类架构:Encoder-only 为输入各位置生成双向表示;Encoder–Decoder 用源序列条件生成目标序列;Decoder-only 将提示和输出放在同一个因果序列中续写。
BERT 是编码器类型,可利用上下文化表示完成情感、主题分类等理解任务,也可以接入不同任务头。
T5 属于编码器—解码器类型,适合需要理解输入并产生相关输出的任务,例如翻译与问答。源输入先编码,目标侧随后读取源表示。
GPT 属于解码器类型,沿前缀预测下一 token。提示位于已有上下文内,开放生成与其他任务都可以按序列续写表达。
解码器类型的优势包括统一序列目标、复用主干和使用 KV cache。推理缓存各层已经计算的历史键和值,减少下一步的重复计算;缓存也随序列长度和批大小占用空间。架构选择还应结合任务、训练预算与生成需求。
ViT:图像如何成为序列
图像模型需要处理二维空间。CNN 具有局部性和平移等变先验;Transformer 可以建立长距离交互,但全局连接计算较大。ViT 先把图像转换成可送入标准编码器的序列。
先看整体:图像切成 patch,每块线性投影为 token,再加入位置嵌入与 class token,经过编码器,最后分类。
对于 H\times W\times C 图像,每块大小为 P\times P,假设边长可整除,patch 数为 N=HW/P^2。每块展平为 P^2C 维,再用同一投影矩阵映射到 D 维。例如 224\times224 图像、16\times16 patch,得到 196 个 patch。
图像切块 → 顺序展开 → 共享线性投影;每块对应一个 token。
位置方案包括无位置、一维、二维与相对位置。原始 ViT 采用可学习的一维位置嵌入;学到的位置向量能反映部分二维邻近关系。实验还比较不同位置设计。
序列前加入可学习的 class token,长度成为 N+1。编码器之后读取它的输出状态,作为整幅图像表示进入分类头。
编码器重复 Pre-LN 布局的 MSA 与 MLP 子层,均有残差路径。块间保持 D 维,MLP 中间常扩大到 4D,最后读 class 状态。
Base、Large、Huge 分别使用不同块数、隐藏维和头数。Base 为 12 层、768 维、12 头,Large 为 24 层、1024 维、16 头,Huge 为 32 层、1280 维、16 头。patch 大小同时改变表示粒度与计算量。
ViT 的实验结果与结构局限
结果表与曲线比较不同预训练数据和计算预算。JFT-300M 条件下的 ViT 在所列任务表现良好;数据规模曲线也说明性能与预训练规模有关。比较时连同分辨率、模型尺寸和预训练条件读取。
将 patch 投影矩阵的前 40 个主成分可视化,可以观察局部纹理与颜色模式。图中小块表示学到的投影方向,帮助理解 patch 像素如何变为表示向量。
固定尺度 token 不便直接提供密集预测所需的多尺度特征;全局注意力矩阵又随 token 数平方增长。patch 边长减半时,token 数约增加到 4 倍,分数矩阵元素约增加到 16 倍,这引出 Swin 的层级与窗口设计。
Swin:层级结构与 Patch Merging
Swin 同时引入层级表示与局部窗口。不同分辨率的特征可以连接 FPN 或 U-Net 等结构,用于检测与分割;窗口内计算控制高分辨率下的注意力成本。
整体按阶段组织:每阶段包含多个 Swin 块,阶段间使用 Patch Merging 降低分辨率并增加通道。
Patch Merging 取相邻 2\times2 token,在特征维拼接为 4C,经过归一化和线性投影到 2C。空间尺寸减半,token 数成为四分之一。
窗口、移位与相对位置偏置
固定窗口内做 W-MSA,会让窗口之间暂时隔离。相邻块使用 SW-MSA,将窗口边界移位,让前一层属于不同窗口的相邻 token 进入同一新窗口。
设输入包含 h\times w 个 patch、通道为 C,窗口边长为 M。全局与窗口注意力的计算量分别为:
\Omega(\mathrm{MSA})=4hwC^2+2(hw)^2C,\qquad \Omega(\mathrm{W\!\! -\!MSA})=4hwC^2+2M^2hwC固定 M 时,窗口分数项随 hw 线性增长;两者仍包含相同的投影计算项。
实现移位时,可以循环移动特征再按固定大小分组。示例有 4\times4 个 token,标注的 0 至 8 是区域编号,同一区域可以包含多个 token。循环向左、向上各移一格后,四个 2\times2 计算窗口的区域编号分别为 [4,4,4,4]、[5,3,5,3]、[7,7,1,1]、[8,6,2,0]。
同一区域编号的 token 可以相互读取,不同绕回区域需要屏蔽。第一个窗口的四个 token 都属于区域 4,均可互读;最后一个窗口虽然把 8、6、2、0 打包在一起,查询区域 8 时仍要把对 6、2、0 的分数设为负无穷。计算后再逆移位,恢复原空间索引。
窗口内的二维相对位移可通过偏置 B 加入注意力分数。每对 query/key 根据相对行列位移查表,再归一化与汇总。
\operatorname{Attention}(Q,K,V)=\operatorname{softmax}\left(\frac{QK^\top}{\sqrt d}+B\right)V结构表给出 Swin-T、S、B、L 各阶段的通道、头数、深度与输出尺度。
分类表区分 ImageNet-1k 与 22k 预训练,同时列出分辨率、参数、FLOPs、吞吐与准确率。
检测与分割结果分别使用 AP 与 mIoU 等指标。层级输出支持这些密集预测任务,结果仍需连同 backbone、任务框架和计算量比较。
MoE:专家与路由器
混合专家(MoE)包含两部分:多个专家子网络,以及选择路径的路由器(gate)。在 Transformer 中,专家通常是 FFN,每个 token 可以只激活少数几个专家。
专家可能在 token 与上下文层面形成分工,例如标点、词形、语法或视觉描述。这个分工由训练学习,不应把专家名直接等同于某个人类知识领域。
路由在多层发生,每层重新选择。一个专家是模型某层的子网络;一段输入经过多个专家路径之后,才到达最终输出。
稀疏参数为什么有吸引力
稀疏激活将总容量与单次计算分开。实验在相近激活 FLOPs 下增加总参数,并观察训练损失的改善。
随后比较 Switch 与 OLMoE 的训练曲线,横轴既有训练步数,也有时间或已处理 token。模型效果、激活计算和实际训练速度分别观察。
性能与 activated parameters 的原对照图显示,一些稀疏模型在相近激活参数量下有竞争力。所有专家仍需要存储,通信、硬件利用率和训练设置会影响实际成本。
从 Dense FFN 到专家路径
先定位原 FFN:注意力将上下文信息汇入当前向量,FFN 随后进一步变换特征。
dense 路径为每个 token 计算全部前馈参数,sparse 路径根据输入选择部分专家。原问题例子展示不同输入触发不同子网络的直觉。
接着观察证据:原分工表展示细粒度 token 类别,Mixtral 的代码例子按第一专家选择给 token 着色。它们说明路由存在差异,不同模型的专门化形式也可能不同。
每个专家可以是一整个 FFN。多层模型中,同一个 token 逐层经过不同专家;下一 token 的路径又可能变化。
常见方案是在块内用 MoE 替换 MLP/FFN,保留注意力子层。也有对注意力头做路由的较少见方案;讨论专家数时,要先明确被替换的模块。
路由器:选择与加权组合
专家之前的路由器根据当前 token 产生门控概率,选择专家,再将选中专家的输出乘以相应门控权重并求和。路由器与专家一起组成 MoE 层,训练与推理都用到路径选择。
Dense MoE 计算所有专家,再加权;Sparse MoE 只计算所选专家。本讲随后讨论稀疏形式。
最简单的路由先做线性映射 H(x)=xW_r,再归一化得到 G(x),输出为专家结果的加权和。
G(x)=\operatorname{softmax}(xW_r),\qquad y=\sum_{i\in S(x)}g_i(x)E_i(x)S(x) 是所选专家集合。是否在所选集合内重新归一化,由具体路由方案决定。先看完整输入、门控、专家、输出的路径,再引出选择过度集中会造成的问题。
路由坍缩、Noisy Top-k 与分配方向
某些专家若早期学习得更快,路由器可能更常选它们;它们得到更多 token 和梯度,又进一步强化偏好。热点专家过载,其他专家训练不足,形成路由坍缩。
Noisy Top-k 先在路由分数上加入可学习噪声以促进探索,再将最高 k 项之外的分数置为负无穷。Softmax 后,未选专家权重为零。图中固定一次示例噪声,以便逐步核对数值。
H(x)=xW_r+\varepsilon\odot\operatorname{softplus}(xW_{\mathrm{noise}}),\qquad G(x)=\operatorname{softmax}(\operatorname{KeepTopK}(H(x),k))Top-k 控制稀疏度,噪声提供探索;仅保留少数专家并不自动保证负载均衡。
Token Choice 让每个 token 选择专家。Top-1 计算一个专家,Top-2 计算两个并组合;激活计算与路径冗余随 k 改变。
还有 Expert Choice,让专家按容量选择 token;全局路由则通过优化共同决定分配。图中矩阵按选择方向组织,容量约束也随方案改变。
比较实验给出训练与验证损失、HellaSwag、MMLU 等指标。Token Choice 是常见选择,其他路由也有自己的实验结果与适用约束。
Top-2 的选择与权重
所选集合内重新归一化,未选专家权重为 0。
重要性、CV 与辅助损失
先为每个专家统计重要性:将一个批次内全部 token 分配给它的门控概率相加。这个量反映权重分布,不等于实际接收 token 数。
I_i=\sum_{x\in\mathcal B}G_i(x),\qquad \operatorname{CV}(I)=\frac{\operatorname{std}(I)}{\operatorname{mean}(I)}比较两组数值:重要性为 [0.8,0.2,0.1,0.05,0.2] 时,均值 0.27,总体标准差约 0.271,CV 约 1.005;[0.3,0.3,0.2,0.2,0.3] 的均值 0.26,标准差约 0.049,CV 约 0.188。后者在专家间更均匀。
以 CV 的平方构成重要性辅助损失,与主任务损失一起优化。平方将差异转成非负惩罚,权重控制均衡目标的影响。
L=L_{\mathrm{task}}+w_{\mathrm{importance}}\operatorname{CV}(I)^2专家容量与 token 溢出
重要性之外,还要统计实际分配。若大量 token 选择同一专家,即使模型总容量很大,该专家也可能成为拥塞点,其他专家却没有得到足够训练。
原容量例子为每个专家设置 3 个槽位。E1 满员后,后续 token 可尝试备选 E4;两边都满时,token 跳过当前专家分支,通过残差继续下一层,这称为 overflow。回退策略取决于实现。
Switch 使用 Top-1 路由,每个 token 计算一个专家,减少激活计算与分配复杂度。
单专家容量可写为 C=\lceil cT/E\rceil,其中 T 是批内 token 数,E 是专家数,c 是容量因子。示例有 6 个 token、3 个专家、因子 1.0,容量为 2;因子 1.5 时容量为 3。较小容量增加溢出,较大容量预留更多闲置槽位。
Switch 的辅助损失同时使用实际 token 比例 f_i 和平均路由概率 p_i。示例专家接收数为 3、1、2,因此 f=[3/6,1/6,2/6]。
f_i=\frac1T\sum_x\mathbf1[\arg\max_jG_j(x)=i],\quad p_i=\frac1T\sum_xG_i(x),\quad L_{\mathrm{aux}}=\alpha E\sum_{i=1}^{E}f_ip_i这是不同于 CV² 的辅助目标;实际分配是离散的,路由概率提供可微的训练信号。
均衡变体与批次效应
DeepSeek 的设计同时考虑专家级与设备级均衡。专家级看各专家的分配,设备级将放在同一设备上的专家统计量聚合,针对设备负载。
DeepSeek-V3 给每个专家增加用于选择的偏置,按负载在线调整,使低负载专家更容易被选中。选择偏置与输出混合权重需要区分;该设计仍保留序列级辅助项。
消融图比较有无均衡损失时的训练、验证曲线及专家负载。效果与系统负载一起观察,才知道稀疏容量是否被有效使用。
采用批次容量与 token 丢弃策略时,同一个输入可能因同批其他 token 占用槽位而走不同路径。这个机制说明路由可能具有批次依赖;不能据此确认未公开模型的结构或行为原因。
路由变体、细粒度与共享专家
路由方法还包括哈希、强化学习与全局匹配。Top-k 依赖当前分数;哈希采用固定映射;强化学习学习分配策略;匹配方法共同优化批次分配。
将专家分成更多、更细的子网络,可在相近激活计算下增加组合方式。共享专家始终开启,路由专家按 token 选择,两条分支共同提供输出。
DeepSeek 的消融实验中,细粒度专家与共享专家在所示配置下都有收益。
OLMoE 的另一组消融中,细粒度专家有收益,共享专家未显示同样收益。保留这个差别:同一种设计的效果会随模型、预算与训练设置变化。
视觉 MoE 与批优先路由
视觉模型中的 patch 已经是 token,可以同样送入路由器。先回顾切块、投影、位置嵌入和编码器路径。
V-MoE 将 ViT 编码器的 dense FFN 替换成稀疏专家层,注意力子层保持。大量图像 patch 会产生更多路由请求。
较小专家容量可以控制资源,但会丢弃部分 patch 的专家计算。原图用剩余图块显示:容量分配顺序可能让主要对象区域也丢失。
Batch Priority Routing 根据路由分数为 patch 排序,先处理重要 patch。容量不足时,让高分 patch 优先得到专家计算。
比较保留 80%、50%、10% 的原图,观察所保留位置是否仍覆盖关键对象。稀疏计算控制的是专家分支处理量,并非把全部编码器计算都按同一比例删掉。
总参数、激活参数与计算账本
模型总参数包含所有专家,单个 token 的激活参数只包含共享部分和选中专家。总量影响存储,激活量影响计算,两者要分开记录。
原 Mixtral 8×7B 案例中,每个专家约 5.6B,而非整个 7B 模型;加上共享嵌入、注意力、路由与 LM head,总参数约 46.7B。Top-2 下,每 token 激活约 12.8B。原账本使用不同专家数量计算这两项。
MoE 用稀疏性增加容量,Top-k 控制激活路径,均衡与容量约束控制专家利用率。实际效率还依赖通信、设备放置和批次;质量、存储、激活计算与测得的延迟共同决定方案是否合适。