一、前置知识
稠密模型 vs 稀疏模型
稠密模型(dense):每个输入进来,所有参数都参与计算。一个 1B 的稠密模型,每个数据点都要流过完整的 1B 参数。
稀疏模型(sparse / MoE):网络里有一群并行的"专家"子网络 + 一个路由器(router)。每个输入进来,路由器看一眼,只把它分给 top-K 个最相关的专家(K 远小于专家总数),其余专家这次完全不动。
两个追问先记下:
1. 凭什么相信路由器分得准、专家会真的"专科化"?——论文用一张专家激活热力图做证据:不同领域的数据集确实激活了不同的专家组合(模块 7 会批判性地看这张图的说服力)。
2. 稀疏不是没有代价的:如果路由器偷懒、永远只选同一两个专家怎么办?(这叫路由崩溃,模块 3 的负载均衡损失就是治它的。)
encoder(编码器):把输入序列转成一组结合了上下文的表示。
decoder(解码器):结合已经生成的内容,以及 encoder 提供的表示,预测后面的输出。
decoder-only:只保留一套负责预测后续内容的主干
decoder-only 没有额外的 encoder,也没有读取 encoder 输出的那套交叉注意力。它直接接收前面的序列,利用因果自注意力来构造表示、预测后续内容。
二、处理数据流程
历史数值 → 输入嵌入 → 多层「因果注意力+MoE」→ 预测头 → 未来数值。
MoE对每个位置已经汇集的信息,选择部分专家加工。
1.注意力和MoE分别负责什么?
注意力负责在允许看到的时间位置之间汇集信息,而MoE负责对每个位置已经汇集的信息选择部分专家进行加工。
| 对比维度 | 稠密模型 | MoE(稀疏模型) |
|---|---|---|
| 每步激活参数量 | 全部参数都参与计算,激活量等于总参数量 | 只有 top-K 个专家和共享专家被激活,激活量远小于总参数量 |
| 计算量 | 与总参数量成正比,规模越大计算越重 | 与激活参数量成正比,可在总参数扩张时保持较低计算量 |
| 显存占用 | 参数全部常驻,显存需求与总参数量一致 | 全部专家参数仍需常驻显存,显存占用接近同等总参数量的稠密模型 |
| 路由开销 | 无路由环节,无额外开销 | 每层每个位置都要计算路由分数并做 top-K 选择,带来额外计算与调度开销 |
| 训练稳定性 | 结构简单,训练过程相对稳定 | 存在路由崩溃风险,需要负载均衡辅助损失等额外约束来稳定训练 |
一句话总结:MoE 用少量激活参数换来了更大的模型容量和更低的计算量,代价是显存仍需承载全部专家、路由带来额外开销,并且训练更依赖负载均衡等手段来保持稳定。
2.一个专家究竟是什么?
这里的专家指的是可训练的前馈网路,也就是FFN(输入一个向量,经过若干次可学习变换与非线性运算,输出一个加工后的向量)。
假设有 4 个可路由专家,路由权重为:
[0.50, 0.30, 0.15, 0.05]
若设置 top-k=2,就只选择权重最大的专家 1、2,其他两个这次不执行。两份专家输出再按权重相加:
路由专家的结果 = 0.50E1(u)+0.30E2(u)
这里 u是当前位置的输入向量,E1(u) 是专家 1 对它的加工结果。
3.路由器怎样选专家?
路由器也是可学习的模块,它根据输入的内容为各个专家计算分数,再转换为权重。
假设有 4 个可路由专家,路由权重为:
[0.50, 0.30, 0.15, 0.05]
若设置 top-k=2,就只选择权重最大的专家 1、2,其他两个这次不执行。两份专家输出再按权重相加:
路由专家的结果 = 0.50E1(u)+0.30E2(u)
这里 u是当前位置的输入向量,E1(u) 是专家 1 对它的加工结果。
4.为什么还设置共享专家?
Time-MoE 除了这些按Top-k选择的专家,还设置了一个共享专家。它不参与同一套top-k竞争,为每个位置提供一条共同的加工路径;它的输出再由一个随输入变化的门控系数调节,论文希望它承载不同输入之间的共同知识。
于是MoE输出可以理解为:
MoE输出=共享专家的加权输出+选中专家的加权输出
5.这些专家会自动得到充分训练吗?
不一定。假设路由器总选专家 1、2,那么它们不断获得训练机会,专家 3、4却很少被使用,整个模型可能越来越依赖前两个专家。
这叫路由崩溃。Time-MoE 在预测损失之外加入负载均衡辅助损失,鼓励更均衡地使用可路由专家。它是训练时的额外约束,不是要求每个时间点都使用所有专家,也不是要求每个输入的权重完全相同。
现在,一条输入在主干里的路径就完整了:
点级嵌入 → 注意力结合历史 → 路由器按当前表示选专家 → 专家加工并合并 → 进入下一层 → 最后交给预测头。
flowchart TD A[输入嵌入] --> B[因果注意力] B --> C[路由器 top-K 选择] C --> D[可路由专家] B --> E[共享专家] D --> F[加权合并] E --> F F --> G[下一层] G --> H[预测头]图中共享专家与可路由专家是两条并行的分支:因果注意力的输出一方面送入路由器做 top-K 选择,只激活少数可路由专家;另一方面直接送入共享专家,不参与竞争。两条分支的输出最终在「加权合并」节点汇合,可路由专家按路由权重加权,共享专家按门控系数加权,两者相加后才进入下一层。因此合并环节是共享知识与专科化加工的唯一交汇点,也是 MoE 输出公式在结构上的直接体现。
三、预测头如何输出
主干最后一个位置输出一个D维向量。它包含模型从历史中提取的特征,但还不是温度、用电量等预测值。
预测头负责将这个向量转换成数值。论文公式 12 是:
这里:
:表示第t个位置经过最后一层后的向量,含D个数
:表示这个预测头一次能输出多少个未来时间点
:表示这个头的可学习矩阵,大小为
:表示对后续p个时间点的预测
矩阵的每一行,都将同一个历史表示转换成一个未来位置的预测值。所以,一个向量可以直接输出多个未来值,不必先预测第一个,再用第一个预测第二个。
Time-MoE 设置了多个这样的预测头,分别负责不同输出长度;训练时共同优化它们。
四、论文做了哪些实验?
1、零样本预测
假设模型已经在大量公开序列上预训练。现在拿来一个未用于预训练的数据集,直接输入它的历史,预测未来;不再用这个数据集调整模型参数。这就是这里的zero-shot forecasting,零样本预测。
论文 §4.1 报告在六个未纳入其预训练语料的基准数据集上评价,比较对象包括其他预训练时间序列模型。这里检验的是:预训练学到的能力,能否直接迁移到这些目标数据。
2、域内预测
- 预训练:先从大规模数据中学习通用能力。
- 微调 fine-tuning:在预训练参数基础上,用目标任务的数据继续更新参数。
Time-MoE 的域内实验用六个基准的训练集微调一个 epoch。epoch 表示按训练流程遍历一轮训练数据。然后在测试部分评价,并与任务专用模型比较。
3、MoE消融
把 Time-MoE 与另一个预训练模型比较,双方可能同时存在以下差异:数据、模型规模、输入处理、损失、训练预算、预测头。因此,即使 Time-MoE 获胜,首先支持的也是整套方案在该设置下更好。
要更直接检验 MoE,就要尽量保持其他条件一致,只改变这一结构。
论文 §4.4 另外训练了稠密对照:使用相同训练设置与数据,把 MoE 换成与其激活参数规模相当的稠密层。这比跨论文模型比较更直接地检验稀疏结构的作用。
五、小结
- 稠密与稀疏的区别:稠密模型每个输入都流过全部参数;MoE 只把输入分给 top-K 个最相关的专家,其余专家这次不参与计算。
- MoE 的计算与显存代价:计算量随激活参数量增长,因此能在总参数扩张时保持较低计算量;但全部专家参数仍需常驻显存,显存占用接近同等总参数量的稠密模型,另外每层每个位置还要付出路由开销。
- 专家与路由器的工作方式:专家是可训练的前馈网络(FFN),路由器根据当前位置的表示给各专家打分并转成权重,只取权重最大的 top-K 个专家,输出按权重加权相加。
- 共享专家的作用:共享专家不参与 top-K 竞争,为每个位置提供一条共同的加工路径,其输出再由随输入变化的门控系数调节,用来承载不同输入之间的共同知识;它与可路由专家在加权合并环节汇合。
- 路由崩溃与负载均衡:若路由器长期只选少数专家,其余专家得不到训练,模型会越来越依赖它们;Time-MoE 在预测损失之外加入负载均衡辅助损失,作为训练时的额外约束来缓解这一问题。
- 预测头一次输出多步:预测头用一个可学习矩阵把最后一个位置的 D 维表示直接映射成 p 个未来时间点的预测值,不必先预测第一个再递推;模型还设置了多个负责不同输出长度的预测头。
- 三类实验各自能证明什么:零样本预测检验预训练能力能否直接迁移到未参与预训练的数据集;域内预测检验微调后在目标任务上与专用模型相比的表现;MoE 消融用相同训练设置和数据、把 MoE 换成激活参数规模相当的稠密层,更直接地检验稀疏结构本身的作用。
总体来看,MoE 更适合在需要大模型容量、又希望控制单步计算量的场景中使用,前提是显存足以承载全部专家,并且愿意为路由开销和训练稳定性付出额外代价。