<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sparse MoE | Yadong's Blog</title><link>https://dingyadong.top/tags/sparse-moe/</link><atom:link href="https://dingyadong.top/tags/sparse-moe/index.xml" rel="self" type="application/rss+xml"/><description>Sparse MoE</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 20:00:00 +0800</lastBuildDate><image><url>https://dingyadong.top/media/icon.svg</url><title>Sparse MoE</title><link>https://dingyadong.top/tags/sparse-moe/</link></image><item><title>Sparse MoE 在推荐序列建模中的工程实践：四个关键设计的背后逻辑</title><link>https://dingyadong.top/posts/017_sparse_moe_sequence_modeling/</link><pubDate>Thu, 23 Apr 2026 20:00:00 +0800</pubDate><guid>https://dingyadong.top/posts/017_sparse_moe_sequence_modeling/</guid><description>
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;本文整理自字节跳动内部技术文档《Sparse-MoE for 序列建模设计文档》，记录了在搜广推序列建模组件中引入 Sparse MoE 的完整工程历程。核心方案 &lt;strong&gt;「Share Expert + Renorm + Learnable_coef + Double Router」&lt;/strong&gt; 已在 TikTok Live 等多个业务场景落地，取得 Serving AUC +0.54%～+0.62%、看播时长 +5% 级别的线上收益。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="0-从一个资源瓶颈说起"&gt;0. 从一个资源瓶颈说起&lt;/h2&gt;
&lt;p&gt;近两年，搜广推业务一直在做一件事：&lt;strong&gt;把序列建模组件做大&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;更长的序列（从 200 到 10k+）、更多的层数（从 1L 到 4L+）、更宽的隐层（dim 从 64 到 256）——大量实验证明，Perceiver/Transformer 类序列建模组件的性能遵循清晰的 Scaling Laws：参数量越大、序列越长，AUC 就越高，业务指标就越好。这条路线已经在多个业务场景被反复验证，成为了搜广推模型迭代的核心方向之一。&lt;/p&gt;
&lt;p&gt;但问题随之而来：&lt;strong&gt;显存墙&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;单层 Transformer Block 在 float16/bfloat16 下的显存占用有精确的计算公式：&lt;/p&gt;
$$\text{Memory}_\text{Attention} = 12 \times Len^2 \times Head + 20 \times Len \times Dim$$$$\text{Memory}_\text{FFN} = 28 \times Len \times Dim$$&lt;p&gt;FFN 的显存随参数量线性增长，还算可以接受。但 Attention 对序列长度是&lt;strong&gt;平方级&lt;/strong&gt;依赖——把序列从 1k 做到 10k，Attention 部分的显存就膨胀了 100 倍。即使算法侧做了各种 Perceiver 结构的压缩（把序列 token 压缩到少量 latent token），随着层数和宽度的增加，整体显存压力依然非常大。&lt;/p&gt;
&lt;p&gt;训推机器不可能无限升配，这意味着&amp;quot;简单扩大扩宽&amp;quot;的路线迟早会碰壁。我们需要一种既能扩大模型表达能力、又不线性增加计算量的方法。&lt;/p&gt;
&lt;h3 id="01-序列建模在推荐系统中的演进路线"&gt;0.1 序列建模在推荐系统中的演进路线&lt;/h3&gt;
&lt;p&gt;要理解为什么这个瓶颈这么关键，先回顾一下推荐系统的序列建模是怎么走到今天这一步的。&lt;/p&gt;
&lt;p&gt;早期的推荐模型（DIN、DIEN 等）把用户历史行为序列作为辅助特征，通过 Attention 机制提取用户对当前候选物料的偏好。这套方案有效，但序列长度一般在几十到几百的量级，主要是当时的序列建模组件还很简单——用的是基于加法 Attention 的权重加权，没有全序列的自注意力。&lt;/p&gt;
&lt;p&gt;后来以 SASRec、BST 为代表的 Self-Attention 序列建模方案兴起，把整条行为序列都送入 Transformer，让序列内部每对 token 之间都能做 Attention。这一步大大提升了序列建模的表达能力，但 Self-Attention 的 $O(n^2)$ 复杂度让序列长度被牢牢限制在几百。&lt;/p&gt;
&lt;p&gt;为了突破这个限制，Perceiver 架构被引入推荐系统。Perceiver 的思路是：用一组数量远少于输入序列的 latent token，通过 Cross-Attention 把整条输入序列&amp;quot;压缩&amp;quot;进来，然后在更小的 latent 空间内做 Self-Attention。这使得序列长度可以扩展到数千甚至上万，同时控制了计算量。&lt;/p&gt;
&lt;p&gt;再往后是以 HSTU（Hierarchical Sequential Transduction Unit）为代表的工业规模实践，在腾讯、字节等广告系统上证明了超长序列（1k-10k）端到端建模的价值，这也是目前序列建模的主流方向。&lt;/p&gt;
&lt;p&gt;回到我们的问题：现在主流的序列建模基础设施是 Decoder/Perceiver/Transformer，这些组件本身已经是&amp;quot;能做多大就做多大&amp;quot;的路线。但随着序列越来越长、层数越来越深、参数量越来越大，显存墙越来越近，不得不找新的突破口。&lt;/p&gt;
&lt;h3 id="02-为什么是-sparse-moe"&gt;0.2 为什么是 Sparse MoE&lt;/h3&gt;
&lt;p&gt;同期，LLM 领域的 Sparse MoE 给了一个新思路。DeepSeek-V3、Doubao-1.5-pro、Qwen-3 等顶级 LLM 都采用了 Sparse MoE 架构——通过**只激活部分专家（Expert）**来实现&amp;quot;参数规模大但计算量不变&amp;quot;的效果。一个有 8 个专家、每次只激活 1 个的 MoE 层，参数量是 Dense FFN 的 8 倍，但每次的 FLOPS 与 Dense 相当。&lt;/p&gt;
&lt;p&gt;一个自然的问题就出现了：&lt;strong&gt;Sparse MoE 能直接迁移到推荐系统的序列建模组件上吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;答案是：可以，但不是直接搬过来就行——搜广推场景有自己独特的挑战，需要针对性的设计。本文就是这段工程探索的完整记录。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-sparse-moe-的基本原理"&gt;1. Sparse MoE 的基本原理&lt;/h2&gt;
&lt;p&gt;在正式进入推荐系统的问题之前，先简单回顾一下 Sparse MoE 的核心机制。&lt;/p&gt;
&lt;h3 id="11-从-dense-到-sparse"&gt;1.1 从 Dense 到 Sparse&lt;/h3&gt;
&lt;p&gt;传统的 Dense 网络中，每个输入 token 都会经过完整的 FFN（或 Attention）计算，所有参数都参与每次前向传播。如果我们把 FFN 替换成 $E$ 个并行的&amp;quot;专家&amp;quot;（Expert），每个 token 只选择其中 $k$ 个专家计算，就得到了 Sparse MoE：&lt;/p&gt;
$$\mathcal{G}(\mathbf{x}; \mathbf{\Theta})_i = \operatorname{softmax}(\operatorname{TopK}(g(\mathbf{x}; \mathbf{\Theta}), k))_i$$&lt;p&gt;其中 $\operatorname{TopK}$ 函数保留前 $k$ 个最高分，其余设为 $-\infty$：&lt;/p&gt;
$$\operatorname{TopK}(g, k)_i = \begin{cases} g_i, &amp; \text{if } g_i \text{ in top-}k \\ -\infty, &amp; \text{otherwise} \end{cases}$$&lt;p&gt;直觉上很简单：一个轻量的 Router 网络计算每个专家的&amp;quot;得分&amp;quot;，选出 top-k 个专家，对它们的输出做加权求和。没被选中的专家不参与计算，因此计算量是稀疏的。&lt;/p&gt;
&lt;p&gt;在 LLM 场景，这种设计的收益非常显著：模型参数量可以做到很大（十几个专家、百亿级参数），但每次推理的激活参数只有全量的 $k/E$，训练和推理的计算成本与同激活参数量的 Dense 模型相当，而由于&amp;quot;记忆容量&amp;quot;更大，效果好得多。&lt;/p&gt;
&lt;h3 id="12-搜广推序列建模的不同之处"&gt;1.2 搜广推序列建模的不同之处&lt;/h3&gt;
&lt;p&gt;LLM 中，MoE 替换的是主干 FFN，整个网络几乎全是 Transformer Block，梯度流动路径非常规整。而在搜广推序列建模中，序列模块（Perceiver/Transformer）只是整个推荐模型的&lt;strong&gt;中间组件&lt;/strong&gt;——它的输入来自 Embedding 层处理后的序列特征，它的输出会被融合进主塔的精排打分流程。&lt;/p&gt;
&lt;p&gt;这个&amp;quot;中间件&amp;quot;的地位带来了几个独特挑战，直接导致了 LLM 领域的经典 MoE 方案在搜广推场景失效：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;挑战一：梯度流动路径更复杂。&lt;/strong&gt; 序列模块前后都有复杂的梯度来源，MoE 的 Router 权重会影响从精排打分一路反传到序列模块再到 Embedding 层的整个梯度链路。任何对输出幅度的改变都会被放大传播。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;挑战二：词表极大，token 值域宽。&lt;/strong&gt; 推荐系统的 item 词表往往千亿级别，embedding 的分布远比 LLM 的 token 分布分散。这意味着序列 token 的数值范围更大，网络对梯度大小的变化更加敏感。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;挑战三：序列模块容易&amp;quot;偷懒&amp;quot;。&lt;/strong&gt; 序列模块不是模型唯一的打分路径，主塔还有很多其他特征（如 DNN 特征、精排 bias 等）可以提供预测信号。如果序列模块的训练出了问题，模型可以通过增大其他路径的权重来弥补，从外部指标上看损失下降正常，但序列模块实际上已经欠拟合了。这种&amp;quot;偷懒&amp;quot;行为在 LLM 中几乎不存在，因为 LLM 的模型输出完全依赖 Transformer 主干。&lt;/p&gt;
&lt;p&gt;这三个特点，正是下面四个关键设计（Renorm、Share Expert、Learnable_coef、Double Router）的出发点。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-router-设计attention-和-ffn-需要不同的策略"&gt;2. Router 设计：Attention 和 FFN 需要不同的策略&lt;/h2&gt;
&lt;p&gt;序列建模组件分为 Attention 部分和 FFN 部分，两者都可以进行 MoE 化，但实验发现它们对 Router 架构有截然不同的偏好。&lt;/p&gt;
&lt;h3 id="21-attention-moe-的-per-head-分组"&gt;2.1 Attention MoE 的 Per-Head 分组&lt;/h3&gt;
&lt;p&gt;由于 Attention 存在 Multi-Head 结构，Attention MoE 有两种组织方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Per-head MoE（分组形式）&lt;/strong&gt;：对每个 head 独立做 MoE，每个 head 内的 QKV 矩阵进行专家路由&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;All-to-all MoE（全局形式）&lt;/strong&gt;：跨所有 head 做 MoE，整体方案类似 Dense 建模中的 Pertoken 形式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;初步实验发现 per-head 分组方案效果更优，因此目前的方案均使用分组形式。但值得注意的是，分组形式本质上降低了 Router 的自由度——理论上 all-to-all 形式能学到&amp;quot;分组&amp;quot;概念的 router 分布，这是后续持续探索的方向。&lt;/p&gt;
&lt;h3 id="22-router-架构的选择"&gt;2.2 Router 架构的选择&lt;/h3&gt;
&lt;p&gt;针对 Attention MoE 和 FFN MoE，分别验证了三种 Router 架构：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单层 MLP&lt;/strong&gt;：$\text{score} = xW_1^T$，最简单的线性打分&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;双层 MLP&lt;/strong&gt;：$\text{score} = \sigma(xW_1^T)W_2^T$，加一层非线性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cosine Router&lt;/strong&gt;：$\text{score} = \text{cosine\_sim}(\sigma(xW_1^T)W_2^T, \text{router\_emb})$，用余弦相似度打分&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实验结论非常清晰：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention MoE 中，双层 MLP + Cosine 表现最优。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Attention 建模本质上是在捕捉&amp;quot;哪个 token 和哪个 token 在语义上相关&amp;quot;，这依赖向量的&lt;strong&gt;方向&lt;/strong&gt;而非绝对大小。Cosine Router 对向量长度做了归一化，专注于方向相似度，因此在 Attention MoE 中自然表现更好。双层 MLP 提供了更强的非线性变换能力，能学到更抽象的路由特征。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FFN MoE 中，单层 MLP Router 效果最优。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;FFN 的作用更接近于&amp;quot;按激活强度分类处理&amp;quot;——高激活值的 token 应该被路由到擅长高激活模式的专家，低激活值的路由到另一套专家。这个决策依赖向量的&lt;strong&gt;模长&lt;/strong&gt;而非方向。Cosine Router 归一化了模长，反而损失了重要信息。单层 MLP 直接用线性变换打分，完整保留了模长信息，因此效果最好。&lt;/p&gt;
&lt;p&gt;这个差异给出了一个很好的直觉：&lt;strong&gt;Attention 需要&amp;quot;我和谁方向一致&amp;quot;，FFN 需要&amp;quot;我有多强的激活&amp;quot;。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="23-attention-moe-与-ffn-moe-的配合"&gt;2.3 Attention MoE 与 FFN MoE 的配合&lt;/h3&gt;
&lt;p&gt;在实际部署中，Attention MoE 和 FFN MoE 不是孤立工作的，它们通常组合在同一个 Transformer/Perceiver Block 内。两者的搭配会产生协同效应，但也引入了新的超参数：各自的专家数、topk 值、Router 类型，以及是否共享某些组件。&lt;/p&gt;
&lt;p&gt;目前线上方案中，Attention MoE 和 FFN MoE 的专家数和 topk 采用相同的配置（如 1 in 7），是出于工程简化的考虑，而不是因为两者的最优设置相同。未来更精细的调优可能需要为它们分别设置不同的稀疏度——例如 Attention MoE 使用更高的稀疏度（更多专家、更少激活比例），FFN MoE 使用更低的稀疏度，以匹配它们各自的建模特点和收敛行为。&lt;/p&gt;
&lt;p&gt;另一个实践中值得关注的问题是：&lt;strong&gt;Attention MoE 和 FFN MoE 对训练步数的敏感性不同&lt;/strong&gt;。实验观察到，Attention MoE 的 AUC 提升在训练初期就能体现，而 FFN MoE 中 Learnable_coef 的充分学习需要更长时间，收益往往在训练后期才完全展现。这意味着判断 FFN MoE 有效性需要足够长的训练步数，过早停止训练会低估 FFN MoE 的实际价值。这是在线上 A/B 实验中需要特别注意的地方——如果实验时长设置不够，可能会误判 FFN MoE 无效而放弃一个实际有收益的方向。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-renorm推荐序列建模的必需品"&gt;3. Renorm：推荐序列建模的必需品&lt;/h2&gt;
&lt;p&gt;这是本文最核心也最反直觉的一个发现。在 LLM 领域，Renorm（对 Router 权重重新归一化）是可选的优化手段。但在推荐系统的序列建模中，它几乎是&lt;strong&gt;必须的&lt;/strong&gt;——去掉 Renorm 会导致显著的 AUC 下降。&lt;/p&gt;
&lt;h3 id="31-什么是-router-gate-renorm"&gt;3.1 什么是 Router Gate Renorm&lt;/h3&gt;
&lt;p&gt;在 MoE 中，我们选出 top-k 个专家后，对它们的 gate 值进行 softmax 归一化，使得所有被选中专家的权重之和等于 1：&lt;/p&gt;
$$A + B = 1 \quad \text{（renorm 下）}$$$$y = A \cdot E_1(x) + B \cdot E_2(x)$$&lt;p&gt;&lt;strong&gt;不加 Renorm 的情况&lt;/strong&gt;：softmax 是在所有 $E$ 个专家上做的，然后才 top-k 截断。被截断后剩余 k 个专家的权重之和 $A + B &lt; 1$，输出的幅度比 Dense 模型更小。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;加 Renorm 的情况&lt;/strong&gt;：在 top-k 截断之后，对剩余的 k 个专家权重重新做 softmax（或者直接除以它们的和），使得 $A + B = 1$，输出方差与 Dense 模型保持一致。&lt;/p&gt;
&lt;h3 id="32-梯度视角的分析"&gt;3.2 梯度视角的分析&lt;/h3&gt;
&lt;p&gt;为了理解为什么 Renorm 重要，需要看梯度流动。以 2 个专家为例，MoE 的输出：&lt;/p&gt;
$$y = A \cdot E_1(x) + B \cdot E_2(x)$$&lt;p&gt;对输入 $x$ 的梯度：&lt;/p&gt;
$$\frac{\partial \mathcal{L}}{\partial x} = \text{grad} \cdot A W_1^T + \text{grad} \cdot B W_2^T$$&lt;p&gt;对每个专家权重矩阵 $W_1, W_2$ 的梯度：&lt;/p&gt;
$$\frac{\partial \mathcal{L}}{\partial W_1} = \text{grad} \cdot A \cdot x, \quad \frac{\partial \mathcal{L}}{\partial W_2} = \text{grad} \cdot B \cdot x$$&lt;p&gt;加了 Renorm（$A + B = 1$）时，对 $x$ 的梯度是 Dense 模型梯度的一个&amp;quot;加权平均&amp;quot;，总量等价于 Dense 的&amp;quot;一份&amp;quot;梯度。不加 Renorm 时，$A + B &lt; 1$，对 $x$ 的梯度总量小于 Dense 的一份，导致输入端的更新幅度偏小。&lt;/p&gt;
&lt;h3 id="33-实验验证梯度大小比梯度配比更重要"&gt;3.3 实验验证：梯度大小比梯度配比更重要&lt;/h3&gt;
&lt;p&gt;为了精确理解梯度的作用，设计了一组系统性消融实验：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;方案描述&lt;/th&gt;
&lt;th&gt;AUC 变化&lt;/th&gt;
&lt;th&gt;结论&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;v3.0&lt;/td&gt;
&lt;td&gt;去掉 Router 对 $x$ 的梯度（$\text{grad\_x} = \text{grad}(W_1^T + W_2^T)$）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-w13&lt;/strong&gt;（严重负向）&lt;/td&gt;
&lt;td&gt;$x$ 梯度不能被移除&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v3.1&lt;/td&gt;
&lt;td&gt;保留 $x$ 梯度，只对 $W$ 梯度去掉 router 因子&lt;/td&gt;
&lt;td&gt;+w5&lt;/td&gt;
&lt;td&gt;$x$ 梯度的配比比 $W$ 更关键&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v3.2&lt;/td&gt;
&lt;td&gt;去掉 router 对 $x$ 梯度，但 $x$ 梯度整体乘 0.5&lt;/td&gt;
&lt;td&gt;+w3&lt;/td&gt;
&lt;td&gt;梯度大小比梯度配比更重要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v3.3&lt;/td&gt;
&lt;td&gt;$x$ 梯度乘 0.25&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-w2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;梯度过小导致欠拟合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v3.4&lt;/td&gt;
&lt;td&gt;基线 + $x$ 学习率调小 1/2&lt;/td&gt;
&lt;td&gt;~&lt;/td&gt;
&lt;td&gt;学习率不是关键变量&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;v3.0 的严重负向说明一件事：给 $x$ 的梯度不能超过&amp;quot;一份 Dense&amp;quot;的大小，否则多层残差网络的更新会产生不稳定的冲击。这排除了&amp;quot;增大梯度来加速收敛&amp;quot;的直觉。&lt;/p&gt;
&lt;p&gt;v3.2 和 v3.3 的对比排除了&amp;quot;梯度配比&amp;quot;的假设——不论配比如何，梯度的绝对大小才是关键。梯度过小（v3.3）导致欠拟合，梯度过大（v3.0，相当于 dense 的两份）导致过度更新。&lt;/p&gt;
&lt;p&gt;v3.4 排除了&amp;quot;调小学习率可以等价于减小梯度&amp;quot;的假设。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心结论&lt;/strong&gt;：Renorm 自动把 Sparse MoE 的输出值域和方差控制为与 Dense 等价，从而使得对 $x$ 的梯度量始终维持在&amp;quot;恰好一份 Dense&amp;quot;的水平，这对多层残差网络的梯度稳定性至关重要。&lt;/p&gt;
&lt;h3 id="34-为什么推荐系统比-llm-更敏感"&gt;3.4 为什么推荐系统比 LLM 更敏感？&lt;/h3&gt;
&lt;p&gt;一个合理的猜测是：推荐系统的 item 词表极大（千亿级别），序列 Token 的嵌入分布远比 LLM 文本 token 分散，值域更宽。这使得模型对梯度的&amp;quot;份数&amp;quot;大小特别敏感——同样的梯度比例偏差，在推荐系统里会被词表规模放大，导致更显著的训练不稳定。LLM 的 token 空间相对集中（词表几万到几十万），这个问题没有那么严重，因此 Renorm 是可选项而非必需品。&lt;/p&gt;
&lt;h3 id="35-多层-residual-网络中-renorm-的意义"&gt;3.5 多层 Residual 网络中 Renorm 的意义&lt;/h3&gt;
&lt;p&gt;从更宏观的视角看，推荐序列建模组件通常是多层堆叠的（2L、4L 的 Perceiver）。在多层 Residual 网络中，每一层的输出都会通过残差连接叠加到下一层的输入。&lt;/p&gt;
&lt;p&gt;如果某一层的 MoE 输出幅度比 Dense 模型更小（不加 Renorm 的情况），这一层对应的残差更新就更弱，经过 LayerNorm 的归一化后，这一层的学习信号也相应更弱。在多层网络中，这种&amp;quot;信号衰减&amp;quot;会随层数累积，深层的参数更新越来越依赖残差连接的原始信号而不是本层的 MoE 计算——这正是上层 MoE 层比浅层更难收敛的根源。&lt;/p&gt;
&lt;p&gt;加了 Renorm 后，每一层 MoE 的输出方差与 Dense 保持一致，残差连接的更新幅度稳定，多层网络的训练才真正稳定。这也解释了为什么在分析多层 Perceiver 的梯度时，发现越上层的 Attention MoE 欠拟合越严重——它是 Renorm 只能部分缓解而无法根本消除的层间梯度衰减问题的体现，需要结合 layer-aware 的 Router scale 来完整解决。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="4-share-expert--learnable_coef解决专家配比问题"&gt;4. Share Expert + Learnable_coef：解决专家配比问题&lt;/h2&gt;
&lt;h3 id="41-引入-share-expert-的动机"&gt;4.1 引入 Share Expert 的动机&lt;/h3&gt;
&lt;p&gt;普通 Sparse MoE 的所有专家都是&amp;quot;竞争上岗&amp;quot;的——Router 每次只选 k 个，其余不参与计算。这有一个潜在问题：如果 Router 学得不好，某些专家可能长期被冷落，得不到足够的训练样本，最终形成&amp;quot;冷专家&amp;quot;——参数几乎没有被更新，不具备有效的建模能力。&lt;/p&gt;
&lt;p&gt;Share Expert（共享专家）是一种在 LLM 领域（如 DeepSeek-MoE）已被验证的改进方案：引入若干个&lt;strong&gt;始终激活&lt;/strong&gt;的专家，它们不参与 Router 竞争，每次前向传播都必定被计算。其作用是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;提供稳定的基础输出&lt;/strong&gt;，防止 Router 专家在训练初期输出不稳定时整个模块崩溃&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;承担通用知识&lt;/strong&gt;，让竞争性的 Router 专家专注于学习&amp;quot;差异化能力&amp;quot;，降低它们的学习难度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;天然平衡负载&lt;/strong&gt;，确保有部分参数始终被充分训练&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在推荐系统场景，这些动机同样成立，我们自然地尝试了引入 Share Expert。&lt;/p&gt;
&lt;h3 id="42-为什么直接引入-share-expert-会失败"&gt;4.2 为什么直接引入 Share Expert 会失败&lt;/h3&gt;
&lt;p&gt;然而，实验结果令人意外——直接引入 Share Expert 在多个推荐系统场景出现了显著负向。我们测试了两种方案：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Naive Share Expert&lt;/strong&gt;（直接加和，不做归一化）：&lt;/p&gt;
$$y = g(x) E_r(x) + E_s(x)$$&lt;p&gt;&lt;strong&gt;加 Renorm 的版本&lt;/strong&gt;（将 Share Expert 的 gate 视为常数 1，与 Router Expert 一起归一化）：&lt;/p&gt;
$$g_1(x) = \frac{g(x)}{g(x) + 1}, \quad g_2(x) = \frac{1}{g(x) + 1}, \quad y = g_1(x) E_r(x) + g_2(x) E_s(x)$$&lt;p&gt;两种方案在实验中都出现了&lt;strong&gt;严重负向&lt;/strong&gt;，且加了 Renorm 后负载分布极度不均衡（Share Expert 几乎承担了所有工作）。&lt;/p&gt;
&lt;p&gt;问题的根源在于：&lt;strong&gt;Share Expert 和 Router Expert 之间存在一个&amp;quot;配比&amp;quot;问题&lt;/strong&gt;，而这个配比在朴素方案中是固定死的，无法自适应。&lt;/p&gt;
&lt;p&gt;以加 Renorm 的版本为分析：$g_1 = g/(g+1)$ 和 $g_2 = 1/(g+1)$ 是此消彼长的关系。如果 Router Expert 的 gate 值 $g$ 偏小（这在 Router 训练初期很常见），那么 $g_2 \approx 1$，Share Expert 几乎以满权重贡献输出，Router Expert 的贡献趋近于零。这反过来导致 Router 专家几乎得不到梯度（因为它们的输出对总输出影响极小），形成恶性循环。&lt;/p&gt;
&lt;h3 id="43-learnable_coef一个标量解决配比问题"&gt;4.3 Learnable_coef：一个标量解决配比问题&lt;/h3&gt;
&lt;p&gt;解决方案是引入一个&lt;strong&gt;可学习的标量参数 coef&lt;/strong&gt;，让模型自己学习 Share Expert 和 Router Expert 应该以什么比例混合：&lt;/p&gt;
$$g_1(x) = \frac{\text{coef} \times g(x)}{g(x) + 1}, \quad g_2(x) = \frac{1}{g(x) + 1}$$$$y = g_1(x) E_r(x) + g_2(x) E_s(x)$$&lt;p&gt;这个改动看起来只是加了一个标量，但本质上给了模型一个&amp;quot;调节 Router Expert 权重的旋钮&amp;quot;——coef 越大，Router Expert 的贡献越大；coef 越小，Share Expert 相对越重要。而且 coef 是通过梯度学习的，会自动收敛到对当前任务最有利的配比。&lt;/p&gt;
&lt;p&gt;实验效果立竿见影：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方案&lt;/th&gt;
&lt;th&gt;AUC（vs 无 MoE 基线）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;基线（Perceiver 2L, Dense）&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attention MoE + FFN MoE&lt;/td&gt;
&lt;td&gt;+0.12%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+ Share Expert + Renorm&lt;/td&gt;
&lt;td&gt;+0.06%（&lt;strong&gt;负向！比无 Share 更差&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+ Share Expert + Renorm + Learnable_coef&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.15%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;有意思的是，观察训练过程中 coef 的变化轨迹：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Attention MoE 中&lt;/strong&gt;：coef 快速学到 1 附近，之后基本不变。这说明 Attention MoE 中 Share Expert 和 Router Expert 天然的配比（coef=1）就已经比较合适，不需要额外调整。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FFN MoE 中&lt;/strong&gt;：coef 从初始值持续增大，没有明显收敛的迹象。这说明 FFN MoE 中 Router Expert 需要更大的话语权——Share Expert 在 FFN 中的作用可能更多是&amp;quot;保底&amp;quot;而不是&amp;quot;主力&amp;quot;，应该把主要贡献留给专业化的 Router Expert。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个差异再次印证了 Attention 和 FFN 在 MoE 化中的本质区别：Attention 的 Share Expert 贡献比较均匀，FFN 的 Share Expert 更像是辅助角色。&lt;/p&gt;
&lt;h3 id="44-learnable_coef-的工程直觉"&gt;4.4 Learnable_coef 的工程直觉&lt;/h3&gt;
&lt;p&gt;从工程角度理解 Learnable_coef，它本质上是一个&amp;quot;把手工调参内化为梯度学习&amp;quot;的设计模式。&lt;/p&gt;
&lt;p&gt;传统的调参方式是：工程师先凭经验设置一个固定的 coef 值（比如 0.5 或 2.0），然后做消融实验，找到最优值后固化下来。这种方式的核心问题是：最优 coef 值会随着任务类型（Attention vs FFN）、序列长度、专家数等条件的变化而变化。换一个场景就需要重新调参，维护成本很高，而且在多层网络中不同层的最优 coef 也可能不同，手工调参根本无法覆盖所有情况。&lt;/p&gt;
&lt;p&gt;引入 Learnable_coef 后，这个调参过程被内化到模型训练中。不同的 Block（Attention Block vs FFN Block）可以学到不同的最优 coef 值，甚至不同层的同类型 Block 也可以学到各自的值。这种自适应性对于跨场景复用同一套架构非常重要——同一套代码部署到 TikTok Live、短视频、电商等不同场景，每个场景的 coef 会自动收敛到各自的最优值，无需为每个场景单独调参。&lt;/p&gt;
&lt;p&gt;从训练动态上看，coef 的收敛行为本身也是诊断 MoE 训练健康度的一个有用信号：如果 coef 持续增大且长时间不收敛，可能意味着当前的 Router 专家数不够（需要更多专家承担更细分的职责），或者 Share Expert 的隐层维度太小（能力受限）。反之，如果 coef 收敛到接近 0，说明 Share Expert 主导了输出，Router 专家没有学到差异化能力——这是一种退化情况，通常意味着 Router 的训练信号太弱，可能需要检查 Renorm 是否正确配置，或者调整负载均衡 Loss 的强度。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="5-double-router解决负载均衡中的-entropy-collapse"&gt;5. Double Router：解决负载均衡中的 Entropy Collapse&lt;/h2&gt;
&lt;p&gt;负载均衡是 Sparse MoE 工程化的经典难题，但在推荐系统场景，我们遇到了 LLM 领域很少讨论的两种特殊失效模式，被统称为 &lt;strong&gt;Entropy Collapse&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="51-softmax-router-的-entropy-collapse"&gt;5.1 Softmax Router 的 Entropy Collapse&lt;/h3&gt;
&lt;p&gt;扩大专家数量是提升 MoE 表达能力的直观手段，但实验发现：从 2 in 8 扩大到 2 in 16、2 in 32 后，softmax router 的效果没有提升，甚至持平。&lt;/p&gt;
&lt;p&gt;通过观察 Router 的 entropy 值（衡量专家选择的均匀程度）发现：softmax 在 32 个专家上的 entropy 约为 3.2，而理论上限是 $\log_2 32 = 5$。这说明即使有负载均衡 Loss 的约束，softmax router 在专家数增多时仍然会倾向于让 gate 值趋于平均——&lt;strong&gt;每个专家的激活权重都变小，区分度降低，专家失去了稀疏性和专业性&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;根本原因在于 softmax 的归一化机制：专家越多，每个专家分到的&amp;quot;概率总量&amp;quot;越少，softmax 对专家数的增加本质上是抑制的。&lt;/p&gt;
&lt;h3 id="52-sigmoid-router--load-balance-的坏死专家"&gt;5.2 Sigmoid Router + Load Balance 的坏死专家&lt;/h3&gt;
&lt;p&gt;为了解决 softmax 的问题，一个自然的想法是用 sigmoid router——sigmoid 独立计算每个专家的激活概率，不受其他专家影响，理论上不存在&amp;quot;概率被摊薄&amp;quot;的问题。&lt;/p&gt;
&lt;p&gt;但加上负载均衡 Loss 后，出现了另一种失效：负载均衡 Loss 对使用频率高的专家施加惩罚，训练过程中会把这些专家的 gate 值持续打压，直到 sigmoid 后的激活概率趋近于 0。最终结果是：几乎所有专家的激活值都被压到接近 0，出现大量&lt;strong&gt;坏死专家&lt;/strong&gt;（dead experts）——它们的参数几乎没有梯度，无法被有效训练。&lt;/p&gt;
&lt;p&gt;这正是推荐系统&amp;quot;序列模块容易偷懒&amp;quot;特性的体现：模型发现&amp;quot;让所有专家都不工作&amp;quot;是一种可行的低损失状态，因为序列模块的贡献可以被其他模块弥补。负载均衡 Loss 无意中给了模型一个制造坏死专家的激励。&lt;/p&gt;
&lt;h3 id="53-double-router解耦负载均衡和-moe-输出"&gt;5.3 Double Router：解耦负载均衡和 MoE 输出&lt;/h3&gt;
&lt;p&gt;分析两种失效的根源：问题都出在&lt;strong&gt;负载均衡约束作用于 MoE 输出路径的 Router&lt;/strong&gt;上——softmax router 被其归一化特性限制，sigmoid router 被 Load Balance Loss 打压。&lt;/p&gt;
&lt;p&gt;解决思路是：&lt;strong&gt;把负载均衡和 MoE 输出解耦&lt;/strong&gt;，让两件事由两套不同的 Router 来负责：&lt;/p&gt;
&lt;div class="mermaid-wrapper"&gt;
&lt;div class="mermaid"&gt;
graph LR
X[输入 x] --&gt; R1[Sigmoid Router&lt;br/&gt;主路由]
X --&gt; R2[Extra Softmax Router&lt;br/&gt;辅助路由]
R1 --&gt;|sigmoid gate 值| C[合并得分]
R2 --&gt;|softmax gate 值| C
C --&gt;|选 top-k 专家| M[MoE 计算]
R2 --&gt;|负载均衡 Loss| LB[Load Balance 约束]
M --&gt; Y[输出]
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sigmoid Router（主路由）&lt;/strong&gt;：计算每个专家的独立激活概率，用于 MoE 最终输出的计算。Sigmoid 的独立性保证了专家间不相互竞争压制，稀疏性和专业性得以保留。负载均衡 Loss 不直接作用于这条路径。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extra Softmax Router（辅助路由）&lt;/strong&gt;：仅用于计算负载均衡 Loss，不参与 MoE 输出的梯度路径。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最终专家得分为两个 Router 分数的叠加：&lt;/p&gt;
$$\text{score}_i = \text{score}^\text{sigmoid}_i + \text{score}^\text{softmax}_i$$&lt;p&gt;这样，负载均衡的约束只作用于 Extra Softmax Router，主路由的 Sigmoid Router 梯度不受干扰，专家激活值域得以维持。相比 DeepSeek 提出的无参数负载均衡方案，Double Router 通过引入可学习的 Extra Router，能在自适应调控的基础上引入语义信息，路由决策更加准确。&lt;/p&gt;
&lt;h3 id="54-消融实验"&gt;5.4 消融实验&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方案&lt;/th&gt;
&lt;th&gt;AUC 变化&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2 in 8, softmax（基线）&lt;/td&gt;
&lt;td&gt;+0.03%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 in 8, sigmoid + load balance&lt;/td&gt;
&lt;td&gt;+0.03%&lt;/td&gt;
&lt;td&gt;有坏死专家&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;double router，单层（消融）&lt;/td&gt;
&lt;td&gt;+0.02%&lt;/td&gt;
&lt;td&gt;验证：非&amp;quot;算两个分&amp;quot;带来收益&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;double router + load balance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.04%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;负载均衡，gate 值域大&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;消融实验（单层 double router，两个 Router 线性相关）排除了&amp;quot;多算一个分就有收益&amp;quot;的假设。Double Router 的收益来自于&lt;strong&gt;解耦&lt;/strong&gt;本身：主路由不受负载均衡 Loss 的干扰，梯度路径更清晰。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="6-专家初始化容易踩坑的工程细节"&gt;6. 专家初始化：容易踩坑的工程细节&lt;/h2&gt;
&lt;p&gt;MoE 的专家初始化是一个容易被忽视但实际上很重要的工程细节。&lt;/p&gt;
&lt;p&gt;在千川商城 CTR Attention MoE 的实验中，仅仅因为初始化 stddev 从 0.02 改为 0.05，就出现了明显的 weight 2 差异，影响了训练的稳定性。这提醒我们：&lt;strong&gt;Transformer 组件和 Sparse MoE 组件对初始化非常敏感&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;根据
的理论分析，对于多层 Transformer/MoE 的最优初始化：&lt;/p&gt;
$$\text{GlorotNormal}(\text{mode}=\text{'fan\_in'}, \text{scale}=1/\text{layer})$$&lt;p&gt;其中 layer 是层数，随着层数增加适当减小初始化 scale，防止深层网络的激活值爆炸。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;加了 Renorm 的情况&lt;/strong&gt;：MoE 的输出方差被归一化到与 Dense 等价，中间层的初始化不需要额外调整。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不加 Renorm 的情况&lt;/strong&gt;：因为稀疏激活导致输出方差减小，需要补偿性地调大中间层的初始化 scale：&lt;/p&gt;
$$\text{GlorotNormal}(\text{mode}=\text{'fan\_in'}, \text{scale}=1/(\text{layer} \times \text{topk}))$$&lt;p&gt;这个 $\times \text{topk}$ 的调整本质上是让每个专家的输出方差乘以 $\text{topk}$，使得 $\text{topk}$ 个专家加权求和后的总方差等价于 Dense 的单一 FFN。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="7-多层-moe-的收敛性分析"&gt;7. 多层 MoE 的收敛性分析&lt;/h2&gt;
&lt;p&gt;除了上述核心设计，多层 Sparse MoE 的收敛行为也值得单独讨论。在扩展到 4 层 Perceiver 的实验中，我们通过分析各层参数的 weight norm（权重矩阵的 $\ell_2$ 范数，反映参数的学习幅度）发现了一个规律性现象。&lt;/p&gt;
&lt;h3 id="71-attention-moe-的层间欠拟合趋势"&gt;7.1 Attention MoE 的层间欠拟合趋势&lt;/h3&gt;
&lt;p&gt;以 &lt;code&gt;v_dense&lt;/code&gt;（Value 矩阵的 norm）为例，在 4L Perceiver 中，各层的 norm 从低层到高层呈递减趋势：&lt;/p&gt;
$$1.45 \to 1.34 \to 1.29 \to 1.08$$&lt;p&gt;斜率越来越低，说明越上层的 Attention MoE 参数更新越弱，&lt;strong&gt;上层比下层更欠拟合&lt;/strong&gt;。进一步分析发现，QKVO 矩阵中 QO 比 KV 欠拟合更严重，这是因为 QO 矩阵没有跨序列的 Cross-Attention 部分提供额外的学习信号（KV 矩阵在 Perceiver 的 Cross-Attention 中额外被 source sequence 的梯度更新）。&lt;/p&gt;
&lt;h3 id="72-ffn-moe-的欠拟合更为严重"&gt;7.2 FFN MoE 的欠拟合更为严重&lt;/h3&gt;
&lt;p&gt;FFN MoE 中，各层的 weight norm 在扩专家数时几乎不变（大部分情况下只有 1.2 倍左右），而 Attention MoE 的 norm 变化更明显。这说明 FFN MoE 处于比 Attention MoE 更严重的欠拟合状态。猜测原因是：两层 MLP 的 FFN 结构比单层 Attention 的矩阵乘更难被稀疏 Router 充分拟合，梯度在两层 MLP 中的传播路径更长，Router 专家的更新信号更弱。&lt;/p&gt;
&lt;h3 id="73-对-router-设计的影响层感知的-router-scale"&gt;7.3 对 Router 设计的影响：层感知的 Router Scale&lt;/h3&gt;
&lt;p&gt;上述分析给出了一个清晰的工程指导：&lt;strong&gt;越上层的 MoE，应该给 Router 更大的权重倍数，以补偿层间梯度衰减带来的欠拟合&lt;/strong&gt;。具体来说，可以让 Router 的激活比例 $k/E$ 随层数增大——低层用更稀疏的路由（更强的专家化），高层用更密集的路由（更多激活，更强的梯度）。&lt;/p&gt;
&lt;p&gt;但这个方向目前还没有稳定的设计方案。简单的 layer-wise $k$ scaling 在实验中没有得到置信的正向结论，更精细的 layer-aware Router 设计（比如根据层的 weight norm 动态调整 $k$ 值）是未来的探索方向。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="8-性能优化smoe-lego-算子"&gt;8. 性能优化：SMoE-Lego 算子&lt;/h2&gt;
&lt;p&gt;方案设计完成后，还有一个重要的工程挑战：&lt;strong&gt;让 Sparse MoE 的稀疏性在 GPU 上真正生效，而不是只是代码层面的稀疏。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="71-为什么需要专用算子"&gt;7.1 为什么需要专用算子&lt;/h3&gt;
&lt;p&gt;这是一个常见的误区：在代码层面写了 TopK + 专家选择，就认为计算量是稀疏的。实际上，如果底层实现是 dense 矩阵乘法（把不需要的专家 gate 设为 0，但仍然参与矩阵乘），在 GPU 上执行的仍然是&lt;strong&gt;全量计算&lt;/strong&gt;，没有节省任何 FLOPS。&lt;/p&gt;
&lt;p&gt;真正的稀疏计算需要：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gather（收集）&lt;/strong&gt;：把需要路由到同一专家的 token 收集在一起，形成一个更小的批量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expert 计算&lt;/strong&gt;：对这个小批量做矩阵乘法（尺寸是 $B' \times D$ 而非 $B \times D$）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scatter（散布）&lt;/strong&gt;：把各专家的计算结果散布回原来的 token 位置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加权合并&lt;/strong&gt;：按 gate 值加权求和&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这涉及非规则的 memory access pattern，需要专门设计的 CUDA 算子来实现高效执行。&lt;/p&gt;
&lt;h3 id="72-smoe-lego-算子的设计"&gt;7.2 SMoE-Lego 算子的设计&lt;/h3&gt;
&lt;p&gt;SMoE-Lego 算子包含 5 个核心算子，实现了真正的稀疏训练和推理：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Input tokens (B×L)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Gate 计算] → TopK 路由决策
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Gather] → 按专家分组收集 token
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Expert 计算] → 各专家独立批量计算（真正稀疏）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Scatter] → 结果散布回原位置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[加权求和] → gate 加权合并
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Output tokens (B×L)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;算子既可以用于 Dense MoE 场景，也可以用于序列建模场景，通用性强。&lt;/p&gt;
&lt;p&gt;在 TikTok Live 直播场景的实测结果（Perceiver 2L, 4× Attention MoE + 4× FFN MoE，topk=2）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;单步时间&lt;/th&gt;
&lt;th&gt;训练吞吐&lt;/th&gt;
&lt;th&gt;显存占用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;朴素实现（全算）&lt;/td&gt;
&lt;td&gt;350ms&lt;/td&gt;
&lt;td&gt;1.16m/s&lt;/td&gt;
&lt;td&gt;60G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;s-pertoken + bmm（全算）&lt;/td&gt;
&lt;td&gt;330ms&lt;/td&gt;
&lt;td&gt;1.27m/s&lt;/td&gt;
&lt;td&gt;58G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TF 原生 Pertoken SMoE&lt;/td&gt;
&lt;td&gt;520ms&lt;/td&gt;
&lt;td&gt;857k/s&lt;/td&gt;
&lt;td&gt;56G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SMoE-Lego Final&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;216ms (-39%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.77m/s (+50%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;42G (-30%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;相比朴素的全算实现：训练时间减少 39%，吞吐提升 50%，显存减少 30%。基本上实现了 1/topk 的理论稀疏化收益。&lt;/p&gt;
&lt;h3 id="73-显存与吞吐的进一步优化"&gt;7.3 显存与吞吐的进一步优化&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;共享 Attention MoE 的 Router 计算&lt;/strong&gt;：实验发现，所有 Attention MoE 层共享同一套 Router 计算（即所有层使用相同的路由决策）不会损失 AUC。这个发现有点反直觉，但可以理解为：不同层的 Attention 在 per-head 分组后，每组内的 token 分布差异不大，相同的路由策略足够覆盖各层的需求。共享 Router 的好处是可以大幅节省 scatter 结果的显存（scatter 结果的显存占用为 $B \times L \times D \times K$，对于 4 层分别存储就是 4 倍）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gelu 进 XLA&lt;/strong&gt;：在 TikTok Live 实验中，通过排查训练 timeline 发现，Lego 算子中 FFN MoE 的 Gelu 激活函数因为默认 &lt;code&gt;min_cluster_size=12&lt;/code&gt; 的配置没有被 XLA 编译进内核，导致它在 CPU 上执行，整体耗时是 XLA 版本的 10 倍。将 &lt;code&gt;min_cluster_size&lt;/code&gt; 调小到 4 后，Gelu 成功被 XLA 编译，训练吞吐进一步提升 &lt;strong&gt;+7%&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这是一个典型的&amp;quot;配置细节决定性能&amp;quot;的案例：算法层面的工作再完美，一个工程配置项的疏漏就可能损失 7% 的吞吐。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="9-线上效果"&gt;9. 线上效果&lt;/h2&gt;
&lt;p&gt;方案在两个 TikTok Live 场景完成了完整的 A/B 实验：&lt;/p&gt;
&lt;h3 id="81-202511perceiver-2l--attention-moe--ffn-moe1-in-7"&gt;8.1 2025.11：Perceiver 2L + Attention MoE + FFN MoE（1 in 7）&lt;/h3&gt;
&lt;p&gt;架构：2 层 Perceiver，Attention 和 FFN 均做 MoE 化，每 7 个专家激活 1 个。这是最初的落地版本。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;变化&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;训练 AUC（CTR0s）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.24%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;离线效果&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serving AUC（CTR0s）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.54%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;在线效果，gap 明显大于离线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serving Logloss&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-0.47%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;校准提升&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Valuable Watch Live Days/User&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.97%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;核心看播渗透指标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active Send Gift Days/User&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.37%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;送礼行为提升&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public Diamond (cap100)/User&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.83%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;礼物价值提升&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App LT7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.035%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7 日留存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWLD (w/ LT/HLT/SD)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+5.36%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;综合时长指标（修正后）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;训练 AUC 和 Serving AUC 之间存在明显的 gap（+0.24% vs +0.54%），这是 MoE 场景的特有现象：稀疏激活在在线服务时能够更精准地路由特定类型的 item，激活最匹配的专家，而离线训练时因为 batch 内的多样性，路由决策的精准度相对较低。这个现象说明 MoE 的真实收益在在线场景会被放大。&lt;/p&gt;
&lt;h3 id="82-202603perceiver-2l--10k-full-sequencelrm-v2"&gt;8.2 2026.03：Perceiver 2L + 10k Full Sequence（LRM v2）&lt;/h3&gt;
&lt;p&gt;这次实验在更长的序列（10k）下验证了方案：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;变化&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;训练 AUC&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.02%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serving AUC&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.62%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serving Logloss&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-0.61%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Watch Live Days&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.52%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Valuable Watch Live Days&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+1.21%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Watch Live Duration&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.69%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Valuable Watch Live Duration&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.57%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一个有趣的附带收益：实验方案&lt;strong&gt;显著缓解了高分段样本 calibration 高估的问题&lt;/strong&gt;。在 baseline 下，模型对高置信度样本的 CTR 预测值系统性偏高（高估），加入 Sparse MoE 后这一现象明显改善。合理的解释是：MoE 的稀疏激活鼓励专家之间的专业化，减少了不同类型 item 之间的特征干扰，高置信度 item 的预测因此更加精准。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="10-总结与反思"&gt;10. 总结与反思&lt;/h2&gt;
&lt;h3 id="91-四个设计的核心逻辑一览"&gt;9.1 四个设计的核心逻辑一览&lt;/h3&gt;
&lt;p&gt;回顾整个方案，「Share Expert + Renorm + Learnable_coef + Double Router」这四个设计各自针对一个根本性问题，缺一不可：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;设计&lt;/th&gt;
&lt;th&gt;解决的问题&lt;/th&gt;
&lt;th&gt;根本洞见&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Renorm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;多层梯度不稳定，训练坍塌&lt;/td&gt;
&lt;td&gt;推荐 Token 值域大，梯度份数比 LLM 更敏感&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Share Expert&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;纯竞争 Router 的专家负载不均&lt;/td&gt;
&lt;td&gt;引入始终激活专家降低竞争压力，提供基础输出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Learnable_coef&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Share/Router Expert 配比固定，无法自适应&lt;/td&gt;
&lt;td&gt;FFN 中 Router Expert 需要更大话语权&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Double Router&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;负载均衡约束与 MoE 输出互相干扰&lt;/td&gt;
&lt;td&gt;将负载均衡和 MoE 输出解耦到两套 Router&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这四个设计不是独立的 trick，而是对一个共同问题（推荐序列建模中的 Sparse MoE 训练稳定性）的系统性解答。&lt;/p&gt;
&lt;h3 id="92-与-llm-moe-的本质差异"&gt;9.2 与 LLM MoE 的本质差异&lt;/h3&gt;
&lt;p&gt;从这个工程实践中，我们可以总结出搜广推 Sparse MoE 与 LLM Sparse MoE 在工程约束上的三个本质差异：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;差异一：梯度稳定性要求更高。&lt;/strong&gt; LLM 是端到端的 Transformer，梯度流动路径简单规整。推荐系统的序列模块是中间件，梯度来自多个方向，且下游的 item 词表庞大，导致对梯度幅度的敏感性远超 LLM。Renorm 因此从可选项变成了必选项。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;差异二：负载均衡策略完全不同。&lt;/strong&gt; LLM 中标准的辅助 Loss 基本有效。推荐系统中因为序列模块有&amp;quot;偷懒&amp;quot;的退路，任何直接打压 gate 值的约束都可能触发 Entropy Collapse。Double Router 的本质是把约束目标（负载均衡）和计算目标（MoE 输出）分开处理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;差异三：专家数扩展策略待探索。&lt;/strong&gt; LLM 中扩专家数是有稳定收益的。推荐系统中目前的稳定点在 2 in 8 附近，更大规模的专家数扩展（2 in 32+）目前没有置信且建设性的结论，是未来的重要探索方向。&lt;/p&gt;
&lt;h3 id="93-还未解决的开放问题"&gt;9.3 还未解决的开放问题&lt;/h3&gt;
&lt;p&gt;文档中也坦诚记录了尚未有稳定结论的几个方向：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;层间 Router 的异质性&lt;/strong&gt;：多层 MoE 中越靠上的层越难收敛，欠拟合更严重。理想的做法是上层用更大的 Router 倍数，实现 layer-aware 的动态 Router，但这还没有稳定的设计方案。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention MoE 的 all-to-all 形式&lt;/strong&gt;：目前使用 per-head 分组，降低了 Router 自由度。理论上 all-to-all 能学到更灵活的路由，但实际效果需要更大规模的验证。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Renorm 与 Share Expert 的大规模扩展&lt;/strong&gt;：目前主要在 2 in 8 附近验证了方案有效性。更大专家数下，这套组合是否依然是最优解，需要系统性的扩展实验来回答。&lt;/p&gt;
&lt;p&gt;推荐系统的 Sparse MoE 工程化，才刚刚开始。&lt;/p&gt;
&lt;h3 id="94-工程化落地的隐性成本"&gt;9.4 工程化落地的隐性成本&lt;/h3&gt;
&lt;p&gt;除了算法设计本身，Sparse MoE 落地的工程复杂度也远高于 Dense 模型迭代。这里有一些值得记录的隐性成本：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;训练稳定性监控成本更高&lt;/strong&gt;。Dense 模型只需要监控 loss 曲线和 AUC，而 Sparse MoE 需要额外监控：每个专家的被选中频率分布（检测坏死专家）、Router gate 值的值域分布（检测 entropy collapse）、各层的 weight norm（检测欠拟合）。这些监控指标在 Dense 模型迭代中是完全不需要的，但在 MoE 调试中是排查问题的关键。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;超参数调试空间更大&lt;/strong&gt;。相比 Dense 模型，MoE 引入了多个新的超参数：Router 类型（softmax/sigmoid/cosine）、专家数 $E$、激活数 $k$、负载均衡 Loss 的系数 $\alpha$、Learnable_coef 的初始化值、Z-loss 的系数等。这些超参数之间还有交互效应（比如 sigmoid + load balance 的组合才会触发 entropy collapse），调试难度显著高于 Dense 模型。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;算子工程投入不可忽视&lt;/strong&gt;。SMoE-Lego 算子的开发是整个工程中投入最重的部分之一。真正稀疏的 GPU 算子需要处理非规则 memory access、gather/scatter 的 kernel fusion、XLA/TF 图的算子注册与 JIT 编译等问题，这些都是对算子工程师的专业要求。前期如果没有这套算子，Sparse MoE 反而会比 Dense 慢（TF 原生 Pertoken SMoE 比朴素全算还慢了约 26%）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在线推理的 serving 改造&lt;/strong&gt;。训练侧的 MoE 改造完成后，Serving 侧也需要对应的工程支持：在线 feature 计算需要正确传递 Router 所需的输入特征，模型导出需要支持稀疏算子的图优化，推理引擎需要支持 TopK 路由的动态 batch 分发。这些工作往往需要算法、系统、基础设施团队的协同。&lt;/p&gt;
&lt;p&gt;这些隐性成本说明，Sparse MoE 不是一个&amp;quot;算法侧改改 config 就能上线&amp;quot;的优化，它需要算法、工程、基础设施各层面的同步投入。但从最终的线上收益来看（AUC +0.54%～+0.62%，看播时长 +5%+），这些投入是值得的。&lt;/p&gt;
&lt;h3 id="95-一个更宏观的视角moe-化是序列建模的下一个-scaling-阶段吗"&gt;9.5 一个更宏观的视角：MoE 化是序列建模的下一个 Scaling 阶段吗？&lt;/h3&gt;
&lt;p&gt;从历史上看，推荐系统的序列建模每隔 2-3 年就会迎来一次范式升级：从 Attention-weighted 到 Transformer Self-Attention，从 Self-Attention 到 Perceiver 压缩，从短序列到超长序列。每一次升级都以某种方式突破了前一阶段的资源瓶颈。&lt;/p&gt;
&lt;p&gt;Sparse MoE 是不是下一个范式升级？目前的实验结果表明，它能在几乎不增加推理成本的前提下提升模型容量，这正是当前计算瓶颈下最需要的技术特性。同时，它与序列长度扩展、层数扩展、宽度扩展是正交的——可以在做了 MoE 化之后，继续做这些维度的扩展。&lt;/p&gt;
&lt;p&gt;当然，目前的工作还有很多未解决的问题（专家数扩展收益不稳定、层间收敛性差异、负载均衡在大规模专家数下的表现等）。这些问题的解答，将决定 Sparse MoE 能走多远。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="参考资料"&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>