简介:前馈网络是Transformer中参数量最大的模块,约占单个Block的三分之二。本文从定义出发,系统剖析其结构设计、激活函数演进、门控机制与参数量计算,并延伸至张量并行、专家并行与算子融合等工程实践,帮助读者建立从原理到落地的完整认知。
前馈网络(Feed-Forward Network,FFN)是 Transformer 架构中紧跟在多头自注意力子层之后的核心组件。从结构上看,它由两层线性变换和一个非线性激活函数构成,对序列中每一个 token 位置独立地进行变换,不涉及 token 之间的信息交互。其最简形式可表示为:
FFN(x) = W2 · σ(W1 · x + b1) + b2
其中 x 为单个 token 的隐藏状态向量,W1 和 W2 为可学习权重矩阵,σ 为非线性激活函数。
从功能视角看,自注意力负责“token 之间如何交流”,而前馈网络负责“每个 token 自身如何被加工”。两者交替堆叠,构成了 Transformer Block 的基本骨架。从参数视角看,FFN 是 Transformer 中参数量最大的模块,在标准配置下占据单个 Block 约三分之二的参数,是模型存储事实知识与执行深层特征变换的主要载体。
理解 FFN 的价值,需要回到 Transformer 的整体设计。
自注意力机制的本质是加权聚合:每个 token 根据与其他 token 的相关性,对 Value 向量做加权求和。这一操作是线性的,且输出被限制在 Value 向量张成的子空间内。如果只有注意力层,模型的表达能力将受限于线性组合,难以拟合复杂的非线性映射。
前馈网络的作用正是在每个位置上引入非线性变换,将隐藏状态映射到更高维空间再投影回来,从而显著提升模型的表示能力。业界普遍认为,FFN 承担了以下关键职责:
标准 FFN 采用“升维—激活—降维”的瓶颈设计。设模型隐藏维度为 d_model,中间层维度为 d_ff,则参数量为:
Params = d_model × d_ff + d_ff + d_ff × d_model + d_model≈ 2 × d_model × d_ff
在经典配置中,d_ff 通常取 d_model 的 4 倍。以 d_model = 4096 为例,单个 FFN 的参数量约为 2 × 4096 × 16384 ≈ 1.34 亿。相比之下,多头自注意力部分的参数量约为 4 × d_model² ≈ 6700 万。前者约为后者的两倍,这解释了“FFN 占 Block 约三分之二参数”这一经验结论。
早期 Transformer 采用 ReLU 作为激活函数,计算简单但存在负半轴梯度为零的问题。GELU 通过高斯误差函数对输入做平滑门控,在负值区域保留少量梯度,实践中能带来更稳定的训练效果,逐渐成为主流选择。
SwiGLU 进一步引入门控机制,将 FFN 的第一层线性变换拆分为两条支路:一条经激活函数处理,另一条作为门控信号,两者逐元素相乘后再送入第二层。其形式可表示为:
FFN_SwiGLU(x) = W2 · (Swish(W1 · x) ⊙ W3 · x)
由于增加了一条支路,为保持参数量持平,中间层维度通常相应调小。门控机制让模型能够动态控制信息流通,在多项任务上表现出更优的收敛性与效果,已成为当前主流大模型 FFN 的常见设计。
FFN 的参数量巨大,单卡难以容纳,工程上必须做分布式切分。
张量并行:将 W1 按列切分、W2 按行切分,分布到多张加速卡上。前向计算时各卡独立完成局部矩阵乘,再通过一次通信完成结果汇总。这样既降低了单卡显存压力,又保持了计算的并行度。
专家并行与稀疏化:将 FFN 拆分为多个专家子网络,每个 token 只路由到少数专家进行计算。这种方法在保持总参数规模的同时,显著降低了单 token 的计算量,是提升模型容量与推理效率的重要方向。
算子融合:FFN 包含多次矩阵乘、激活与逐元素运算,频繁的显存读写会成为瓶颈。通过将相邻算子融合为单一内核,可以减少中间结果的落盘与读取,提升计算吞吐。这类优化在推理加速中尤为关键。
FFN 的设计选择直接影响模型的训练成本与推理表现。在以下场景中需要重点关注:
需要注意的是,FFN 对每个 token 独立处理,本身不具备跨 token 建模能力,其效果高度依赖前置注意力层提供的上下文质量。两者是协同关系,不能孤立评估。
前馈网络是 Transformer 中负责逐位置非线性变换的核心模块,以约三分之二的参数占比承担了知识存储与深度特征加工的主要职责。其结构从早期的两层全连接加 ReLU,演进到 GELU 与 SwiGLU 门控设计;其工程实现则依赖张量并行、专家并行与算子融合等手段来应对规模挑战。理解 FFN 的定义、原理与工程约束,是掌握 Transformer 架构与大模型基础设施的关键一环。