编程与 AI13 分钟阅读更新于 2026-08-03

Transformer 的 FFN 为什么通常比模型主干更宽

围绕 Position-wise Feed-Forward Network 两次线性变换的描述,解释 FFN 中间维度为什么扩大,以及它与 d_model、参数量和注意力的关系。

相关工具

FFN 的输入输出宽度和中间宽度不是一回事

Transformer 的主干表示通常保持 d_model 宽度,便于注意力、FFN、残差和层间接口连接。资料 对 FFN 的描述则包含两个线性变换:先把每个位置的表示映射到中间空间,再映射回模型宽度。

因此,FFN 可以同时拥有固定的输入输出宽度和更宽的内部表示。主干需要形状稳定,内部需要足够空间展开特征,这两个要求并不冲突。

Transformer FFN 输入输出保持 d_model 但中间隐藏空间更宽的示意图
FFN 的输入、中间空间与输出

每个位置的 d_model 表示先进入更宽的 FFN 中间空间,再投影回 d_model。

为什么要先把特征展开

如果 FFN 始终只在 d_model 宽度内做变换,中间可用的特征通道有限。第一层线性变换把当前位置映射到更宽的空间,可以为不同特征组合提供更多独立方向。

展开不是简单复制每个维度,而是通过可学习矩阵重新组合输入。一个中间通道可以响应某种局部模式,另一个通道可以响应另一种上下文组合,随后激活函数和第二层线性变换再决定这些响应如何汇合。

激活函数让宽空间真正有用

两次线性变换之间加入 ReLU、GELU 等激活函数后,中间通道不再只是线性叠加。不同通道可以在不同输入条件下被激活或抑制,FFN 因而具备更强的非线性特征加工能力。

如果没有激活函数,先扩大再压缩仍然可以合并成一次线性映射。宽度增加会带来更多参数,但不会带来同等意义上的非线性表达。中间宽度和激活函数需要配合才能发挥作用。

Transformer FFN 宽中间空间经过激活后压缩回模型宽度的流程图
展开、激活与压缩

FFN 先将模型表示投影到宽中间空间,经激活函数筛选后再压回主干宽度。

FFN 宽度会直接影响参数量

设输入输出宽度是 d_model,中间宽度是 d_ff,两个线性层的主要参数规模大致与 d_model×d_ff 和 d_ff×d_model 有关。d_ff 越大,FFN 可用的中间通道越多,参数量和计算量也越高。

因此,模型规模不能只看层数和 d_model,还要看 FFN 中间宽度。两个模型即使注意力头数相同,FFN 宽度不同,整体参数量和每个位置的加工成本也可能差很多。

宽 FFN 不会让序列位置互相通信

FFN 的中间空间更宽,表示的是单个位置内部的特征通道更多,而不是它能看到更多位置。经典 Position-wise FFN 对每个位置独立应用同一组参数,不直接读取其他位置。

跨位置的信息仍由 Self-Attention 或交叉注意力提供。一个位置先通过注意力获得相关上下文,再由宽 FFN 对融合后的结果进行非线性加工。宽度提升的是位置内的特征处理能力,不是上下文范围。

注意力和 FFN 的成本来源不同

注意力需要建立位置之间的关系,序列长度增加时,关系矩阵会带来额外成本。FFN 则对每个位置独立计算,成本通常随位置数近似线性增长,但会受到 d_model 和 d_ff 的乘积影响。

长序列任务中,注意力可能成为关系计算瓶颈;宽 FFN 则持续增加每个位置的特征加工成本。评估 Transformer 规模时,需要分别看序列关系开销和逐位置变换开销。

Transformer 注意力跨位置计算与 FFN 逐位置计算成本对比图
注意力与 FFN 的职责和成本

注意力主要处理跨位置关系,FFN 主要处理逐位置特征,二者的计算增长来源不同。

为什么 FFN 输出还要回到 d_model

宽中间空间只存在于 FFN 内部,输出需要回到 d_model,才能与输入通过残差连接相加,也才能交给下一层注意力或 FFN。统一主干宽度是层间传递稳定的基础。

第二层线性变换承担的不只是降维,它还学习如何把中间通道组合成下一层需要的模型表示。展开和压缩是一条完整的特征变换链,不能只把第二层看成尺寸调整。

不同模型的宽度比例可以不同

经典 Transformer 会设置一个比 d_model 更大的 d_ff,但具体比例、激活函数和门控结构可能因模型而异。有些模型使用更宽的 FFN,有些使用门控线性单元或稀疏专家,让部分输入只激活部分参数。

学习基础结构时,先抓住稳定主线:FFN 逐位置处理,第一层扩大特征空间,中间经过非线性,第二层回到 d_model。遇到具体模型,再查看它的 d_ff、激活和门控方式。

用四个问题检查 FFN 宽度

第一,FFN 输入和输出是否回到 d_model;第二,中间宽度 d_ff 是多少;第三,两次线性变换之间是否有激活;第四,FFN 是否逐位置共享参数并与注意力分工。

这四个问题能把“FFN 更宽”从单纯的配置数字还原成计算逻辑:用更多中间通道加工每个位置已经融合的上下文,同时保持 Transformer 主干接口不变。

常见问题

FFN 中间维度越大一定越好吗?

不一定。更大的 d_ff 会增加表达空间,也会增加参数量、计算量和内存需求,需要结合模型规模、数据和任务判断。

FFN 变宽后能看到更长上下文吗?

不能直接做到。FFN 主要增强单个位置的特征加工,跨位置读取仍由注意力层负责。

为什么 FFN 输出必须回到 d_model?

为了接入残差连接,并与后续注意力、FFN 和层间接口保持统一模型宽度。