Transformer 的 FFN 为什么通常比模型主干更宽
围绕 Position-wise Feed-Forward Network 两次线性变换的描述,解释 FFN 中间维度为什么扩大,以及它与 d_model、参数量和注意力的关系。
相关工具
FFN 的输入输出宽度和中间宽度不是一回事
Transformer 的主干表示通常保持 d_model 宽度,便于注意力、FFN、残差和层间接口连接。资料 对 FFN 的描述则包含两个线性变换:先把每个位置的表示映射到中间空间,再映射回模型宽度。
因此,FFN 可以同时拥有固定的输入输出宽度和更宽的内部表示。主干需要形状稳定,内部需要足够空间展开特征,这两个要求并不冲突。

每个位置的 d_model 表示先进入更宽的 FFN 中间空间,再投影回 d_model。
为什么要先把特征展开
如果 FFN 始终只在 d_model 宽度内做变换,中间可用的特征通道有限。第一层线性变换把当前位置映射到更宽的空间,可以为不同特征组合提供更多独立方向。
展开不是简单复制每个维度,而是通过可学习矩阵重新组合输入。一个中间通道可以响应某种局部模式,另一个通道可以响应另一种上下文组合,随后激活函数和第二层线性变换再决定这些响应如何汇合。
激活函数让宽空间真正有用
两次线性变换之间加入 ReLU、GELU 等激活函数后,中间通道不再只是线性叠加。不同通道可以在不同输入条件下被激活或抑制,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 规模时,需要分别看序列关系开销和逐位置变换开销。

注意力主要处理跨位置关系,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 和层间接口保持统一模型宽度。