今日面试题:Transformer 中 FFN / MLP 层的作用
在 Transformer block 里,除了 self-attention,通常还会有一个 position-wise FFN / MLP 层。请你解释:
我只知道 FFN 是承载模型所有知识的地方,其他我就不清楚了,请你告诉我准确的答案吧
你的回答抓住了一个常见说法:FFN / MLP 确实承载了大量参数和知识记忆能力,但“FFN 是承载模型所有知识的地方”这个说法过于绝对。
主要不足有三点:
Transformer block 中的 FFN / MLP 层,核心作用是:在 self-attention 完成 token 间信息聚合之后,对每个 token 的 hidden state 做非线性特征变换,从而提升模型的表达能力。
第一,FFN 负责对单个 token 表示做深度加工。self-attention 会让一个 token 的表示融合上下文信息,例如当前 token 应该关注前文哪些词;而 FFN 接着对这个已经融合上下文的向量做非线性变换,提取更复杂的语义特征、模式组合和任务相关表示。
第二,FFN 和 self-attention 的职责不同。self-attention 的重点是信息路由:决定不同 token 之间如何交互,哪些 token 对当前 token 更重要。FFN 的重点是特征变换:对每个 token 当前的 hidden state 做升维、激活、降维,把表示映射到更有表达力的空间。
第三,FFN 是 position-wise 的。这意味着序列中每个位置的 token 都会经过同一套 FFN 参数,但处理过程彼此独立。比如第 3 个 token 和第 10 个 token 都用同一个 MLP,但 FFN 本身不会直接计算它们之间的关系;它只处理每个 token 自己的向量。token 之间的信息交换主要由 self-attention 完成。
第四,从工程角度看,FFN 通常占据 Transformer 参数量和计算量的大头。典型结构是先把 hidden size 扩大到数倍,例如从 d_model 扩到 4 * d_model,经过 GELU、SwiGLU 等非线性激活函数,再投影回原维度。因此 FFN 提供了大量参数容量,也常被认为存储了大量事实知识、模式和特征组合能力。但更准确的说法是:FFN 承载了模型知识和表达能力的重要部分,而不是全部知识的唯一来源。
更形象地说,可以把 FFN 理解成一个逐 token 的语义加工器:self-attention 先把上下文证据送到当前 token 面前,FFN 再结合模型预训练中学到的知识和模式,对这个 token 的 hidden state 做非线性变换,让它更明确地表达当前语境下的具体含义。例如 apple 在 I ate an apple 中会被加工成更偏水果的表示,而在 Apple laptop 中会被加工成更偏科技公司的表示。
一句话总结:attention 负责让 token 之间交换信息,回答“看哪里”;FFN 负责结合上下文证据和模型自身知识加工每个 token 的表示,回答“怎么理解和变换”。