Transformer 中逐位置前馈网络 FFN 有什么作用?
未标记
考查重点:逐 Token 非线性特征转换。基础FFN对每个token独立执行线性升维→非线性→线性投影回原维,位置间共享参数,补充特征变换;token间信息混合主要来自Attention,门控FFN是另需说明的变体
本题目录
参考答案
核心回答
FFN 对每个词元的隐藏向量独立做非线性特征变换。原始 Transformer 中,它由“线性升维→非线性激活→线性投影回原维”组成,同一层中所有位置共享这套参数。它为模型补充特征加工能力,输出回到模型维度后,便于与残差分支相加。
注意力主要负责在不同位置之间交换信息,FFN 主要在单个位置的特征维度上加工。这里的“独立”指该层不直接读取其他位置,不代表输入没有上下文:前面的注意力已经把上下文信息融入了隐藏向量。
逐位置计算的维度是什么
把一个词元写成行向量 x,输入维度为 d,中间维度为 m:
FFN(x) = activation(xW1 + b1)W2 + b2
x: d
W1: d × m
中间结果:m
W2: m × d
输出: d
原论文采用 ReLU,并以512→2048→512为具体配置;四倍中间维度是这套配置,不是所有模型的固定要求。MindSpore 的编码器层也将输入维度、中间维度和激活函数分别暴露为配置。
“位置共享参数”是说这一层处理第1、第2个词元时使用相同的 W1、W2;不同层通常有各自的前馈参数,不能理解成所有层共享一套权重。多个位置可以并行计算,等价于对每个位置应用同一个函数。
中间的非线性为什么重要
如果去掉激活,两次仿射变换可以合并成一次仿射变换,额外的中间层便失去了这部分非线性表达能力。激活使模型能根据输入组合特征,再投影回原空间。
这不意味着整个注意力模块是线性的,也不意味着模型知识只存放在前馈层。这里讨论的是 FFN 自身增加的变换能力。
现代门控版本有什么不同
SwiGLU 使用两个输入投影,其中一支经过 SiLU,再逐元素相乘,最后投影回输出维度。省略偏置,按行向量写为:
SwiGLU(x) = (SiLU(xW_gate) ⊙ xW_up)W_down
它有三个权重矩阵;相同 d、m 下,权重参数量从基础两层结构的2dm变成3dm。若希望保持近似相同的参数预算,可以相应缩小门控结构的中间维度,而不能只看两者是否都叫“升维”。具体中间维度、激活与偏置,以实际模型为准。
参考资料
- 国内:WeThinkIn:模型架构与工作原理:采用跨位置通信与逐位置加工的分工,以及门控前馈的三个投影,组织基础结构和变体的比较。
- 国内:WeThinkIn:深度学习网络架构:采用逐词元的特征升降维和门控比较,说明前馈层的非线性加工能力。
- 国内:Datawhale:第二章 Transformer架构:采用前馈层代码中的两个线性层及激活顺序,说明同一函数如何处理不同位置。
- 国内:MindSpore:TransformerEncoderLayer:采用输入维度、中间维度和激活函数分别配置的约定,说明四倍宽度和某一种激活都不是结构的强制要求。
- 国外:Vaswani 等:Attention Is All You Need:采用第3.3节逐位置、位置间共享而层间不同的定义,以及原始模型的维度例子。
- 国外:Shazeer:GLU Variants Improve Transformer:采用门控乘积与三矩阵结构,以及通过调整中间维度比较参数预算的方法,解释门控版本的区别。
相关面经
1 篇百度
AI InfraTransformer中的FFN模块作用是什么?常见激活函数有哪些?不同激活函数有什么区别?