FFN 层(前馈网络)是 Transformer 架构中一个至关重要的组成部分,它为模型提供了强大的非线性建模能力。它实际上是一个非常简单的多层感知机(MLP),但对模型的整体性能至关重要。

我们来详细分析一下 FFN 层的结构:两个线性投影层和一个中间的激活函数

FFN 层的结构解析

        FFN 层位于每个 Transformer 块的自注意力机制之后。其核心功能是独立地对序列中每个位置的向量进行复杂的变换。它的经典结构可以表示为:

FFN(x)=W2(Activation(W1(x)))

其中:

  • x 是自注意力层的输出向量。

  • W1​ 是第一个线性层(向上投影)。

  • Activation 是非线性激活函数。

  • W2​ 是第二个线性层(向下投影)

1. 第一个线性层:向上投影(Up Projection/W1​)

        这个层是 FFN 过程中的扩张阶段,其主要目标是增加维度,以捕获更复杂和多样的特征组合。

  • 功能: 将输入的向量维度 D_model​(模型的隐藏层维度)扩展到一个更大的维度 D_intermediate​。

    • 在许多经典 Transformer 模型中,D_intermediate​ 通常是 Dmodel​ 的 4 倍(例如 D_model​=768, D_intermediate​=3072)。

    • 在最新的 LLM 中(如 Qwen、LLaMA),由于使用了 SwiGLU 激活函数,扩张比例通常是 ≈2.7 倍到 ≈3.5 倍。

  • 物理意义: 你可以将这个过程想象成将一个简单的概念(Dmodel​)分解成数个更细粒度的、潜在的特征D_intermediate​),为接下来的非线性变换做准备。这个层是学习新的、高维特征表示的关键。

2. 中间的非线性激活函数(Activation)

非线性激活函数是 FFN 层的灵魂。如果没有这个函数,无论 FFN 层有多少个线性层,它们最终都只会等价于一个单一的线性变换,失去了深度学习的意义。

  • 经典激活函数: ReLU(整流线性单元)或 GELU(高斯误差线性单元)。

  • 现代 LLM 中的激活函数: SwiGLU(或简称 GLU 门控单元)。

    • SwiGLU 是 门控(Gated)机制的变体。它将输入 x 分成两路,一路经过线性变换后乘以另一路经过 Swish 激活函数处理后的结果。

    • 优点: 引入门控机制能让信息流更有选择性地通过网络,从而提高模型的表示能力和训练稳定性。这也是为什么现代 LLM 倾向于使用 SwiGLU 来替换传统的 ReLU/GELU。

3. 第二个线性层:向下投影(Down Projection/W2​)

这个层是 FFN 过程中的收缩阶段,其主要目标是将高维特征压缩回模型的主维度。

  • 功能: 将激活函数输出的 D_intermediate​ 维向量收缩回模型的原始维度 D_model​。

  • 物理意义: 它将扩张和非线性变换后产生的复杂特征表示提炼和整合,只保留对下一个 Transformer 块最有价值的信息,然后将其输出,作为下一个自注意力层的输入(或者如果是最后一个 FFN,则作为最终的输出)。

FFN 的重要性:模型的“知识库”

FFN 层的重要性经常被低估,但它在 LLM 中扮演着两个关键角色:

  1. 非线性能力: FFN 通过引入激活函数,使得模型能够学习和模拟输入与输出之间的非线性关系,这是处理复杂任务所必需的。

  2. 知识存储: 经验研究表明,Transformer 模型所学到的大部分事实性知识和世界模型都存储在 FFN 层的权重中(特别是 W1​ 矩阵)。当模型在自注意力层中确定了关注的焦点后,FFN 层负责对这些焦点信息进行深入的“思考”和知识应用。

因此,在进行 LoRA/QLoRA 微调时,对 FFN 层的 Up/Down 投影层进行适配器的插入(如 target_modules='all-linear'),是确保模型能够学习并存储新领域或新任务知识的关键操作。

注意力层的结构解析

自注意力机制(Self-Attention Mechanism)的目的是计算序列中每个 token 与其他所有 token 的关联强度,并基于这些强度来加权求和,提取上下文信息。它的核心步骤可以概括为以下三个部分:

1. 线性投影(Q/K/V 投影层)

这是您前面提到的步骤,它们是线性变换

Query(Q)=XW_Q\\ Key(K)=XW_K\\ Value(V)=XW_V

  • X 是输入序列的表示(一个矩阵)。

  • W_Q​,W_K​,W_V​ 是可学习的权重矩阵(即 Q/K/V 投影层),它们执行线性变换,将输入 X 映射到各自的向量空间。

2. 注意力得分计算(Softmax引入非线性)

这是核心的注意力计算阶段,它通过 Softmax函数引入了关键的非线性

\text{Attention Score}(S) = \frac{QK^T}{\sqrt{d_k}}

\text{Attention Weights}(A) = \text{Softmax}(S)

  • Softmax 函数: Softmax(S)是一个非线性函数,它将原始的注意力得分 S 转换为概率分布,确保所有权重之和为 1。这是注意力机制中唯一也是最重要的非线性环节

  • 作用: Softmax允许模型做出选择性的关注。例如,它可以将一个很高的得分放大,同时将其他较低的得分压缩到接近零,从而让模型“聚焦”于序列中最相关的部分。

3. 输出聚合与最终投影(V 和 O 投影层)

最后一步是使用 Softmax得到的权重 A 来加权求和 Value 矩阵 V,然后通过 Output 投影层(W_O​)进行最终的线性变换。

\text{Output}_{\text{Attention}} = AV

\text{Output}_{\text{Layer}} = \text{Output}_{\text{Attention}} W_O

  • W_O​ 投影层: 这又是一个线性变换(O 投影层),用于整合多头注意力(Multi-Head Attention)的结果,并将其转换回模型的主维度。

结论:注意力层的非线性在哪?

总结来说,注意力层中没有像 FFN 层那样直接插入 ReLU 或 GELU 这样的独立非线性激活层。但是,它通过以下方式实现了至关重要的非线性能力:

机制

类型

作用

Q/K/V/O 投影层

线性变换

学习将输入映射到最佳的 Q,K,V 空间。

Softmax 函数

非线性变换

这是注意力机制的唯一非线性来源。它将原始相似性分数转化为选择性的、概率性的关注权重,使模型能够进行有意义的上下文提取。

因此,注意力层是一个线性投影非线性(Softmax线性投影的结构。正是 Softmax的存在,使得注意力机制能够从输入中“选择”并“聚合”信息,而不是简单地进行线性叠加。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐