2026-05-29

Question

今日面试题:Transformer 中 FFN / MLP 层的作用

在 Transformer block 里,除了 self-attention,通常还会有一个 position-wise FFN / MLP 层。请你解释:

  1. FFN / MLP 在 Transformer 中主要解决什么问题?
  2. 它和 self-attention 的职责有什么区别?
  3. 为什么说 FFN 是“逐 token 独立处理”的?
  4. 从工程角度看,FFN 对模型参数量、计算量和表达能力有什么影响?

Your Answer

我只知道 FFN 是承载模型所有知识的地方,其他我就不清楚了,请你告诉我准确的答案吧

Review

你的回答抓住了一个常见说法:FFN / MLP 确实承载了大量参数和知识记忆能力,但“FFN 是承载模型所有知识的地方”这个说法过于绝对。

主要不足有三点:

  1. 把 FFN 说成“承载所有知识”过于绝对。模型知识并不只存在于 FFN,attention、embedding、LayerNorm、输出层等参数也参与表达知识。
  2. 没有区分 FFN 和 self-attention 的职责。self-attention 主要负责 token 之间的信息交互,FFN 主要负责对每个 token 的表示做非线性变换和特征加工。
  3. 没有解释 position-wise 的含义。FFN 对序列中每个 token 使用同一套 MLP 独立处理,不直接看其他 token;跨 token 交互主要发生在 self-attention 中。

Improved Answer

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,经过 GELUSwiGLU 等非线性激活函数,再投影回原维度。因此 FFN 提供了大量参数容量,也常被认为存储了大量事实知识、模式和特征组合能力。但更准确的说法是:FFN 承载了模型知识和表达能力的重要部分,而不是全部知识的唯一来源。

更形象地说,可以把 FFN 理解成一个逐 token 的语义加工器:self-attention 先把上下文证据送到当前 token 面前,FFN 再结合模型预训练中学到的知识和模式,对这个 token 的 hidden state 做非线性变换,让它更明确地表达当前语境下的具体含义。例如 appleI ate an apple 中会被加工成更偏水果的表示,而在 Apple laptop 中会被加工成更偏科技公司的表示。

一句话总结:attention 负责让 token 之间交换信息,回答“看哪里”;FFN 负责结合上下文证据和模型自身知识加工每个 token 的表示,回答“怎么理解和变换”。