与买桂花同载酒 🌙

前馈神经网络

前馈神经网络 (FFN)

我们继续使用 “Thinking” 的例子。
FFN 的核心公式是:

场景设定与准备

为了方便口算,我们将上一章 Attention 算出的结果 $[13.6, 23.6]$ 简化取整。

  • 输入向量 ($x$)[10, 20]
    • 这是 Attention 层的输出,维度 $d_{model} = 2$。
  • 目标
    1. 升维(把 2 维变成 4 维),把特征拆解开。
    2. 通过 ReLU 过滤负数。
    3. 降维(把 4 维变回 2 维),整合结果。

我们需要预设两组权重矩阵(在真实模型中,这些是训练出来的):

  • 第一层参数 ($W_1, b_1$) - 负责升维
    • $W_1$ ($2 \times 4$ 矩阵)
    • $b_1$ ($1 \times 4$ 向量)
  • 第二层参数 ($W_2, b_2$) - 负责降维
    • $W_2$ ($4 \times 2$ 矩阵)
    • $b_2$ ($1 \times 2$ 向量)

1. 第一步:线性变换与升维 ($xW_1 + b_1$)

FFN 的第一层通常很宽(Wide)。我们假设 $W_1$ 和 $b_1$ 如下:

计算过程:

逐维度口算:

  • 第1维:$10\times1 + 20\times0 + 0 = \mathbf{10}$
  • 第2维:$10\times(-1) + 20\times2 + 0 = -10 + 40 = \mathbf{30}$
  • 第3维:$10\times2 + 20\times(-1) + (-5) = 20 - 20 - 5 = \mathbf{-5}$ (注意这个负数!)
  • 第4维:$10\times0 + 20\times1 + 0 = \mathbf{20}$

中间结果 ($Z$):

💡 意义:原本 2 个维度的信息,被拆解到了 4 个维度空间里,就像把一束白光用三棱镜分解成七色光。


2. 第二步:非线性激活 (ReLU)

公式:$\text{ReLU}(z) = \max(0, z)$
这一步非常简单粗暴:所有负数直接归零,正数保持不变。

💡 意义

  • 注意那个 -5 变成了 0
  • 这就是“筛选”。模型认为第 3 个维度的特征(可能是某种噪音或无关信息)对当前任务没有帮助,所以直接“关掉”了神经元。

3. 第三步:线性变换与降维 ($HW_2 + b_2$)

现在我们要把这个 4 维向量压回 2 维,方便传给下一层。
假设 $W_2$ 和 $b_2$ 如下:

计算过程:

逐维度口算:

  • 第1维
    $(10\times1) + (30\times1) + (0\times0) + (20\times2) + 1$
    $= 10 + 30 + 0 + 40 + 1 = \mathbf{81}$

  • 第2维
    $(10\times0) + (30\times1) + (0\times0) + (20\times1) + 1$
    $= 0 + 30 + 0 + 20 + 1 = \mathbf{51}$


4. 最终结果对比

让我们回顾一下全过程的变化:

阶段 向量值 维度 状态描述
FFN 输入 [10, 20] 2维 刚开完会(Attention),收集了信息,但比较杂。
中间层 (ReLU前) [10, 30, -5, 20] 4维 大脑风暴,把想法发散开,产生了很多念头。
激活后 (ReLU后) [10, 30, 0, 20] 4维 否定了不靠谱的念头(-5 被归零)。
FFN 输出 [81, 51] 2维 总结陈词,形成经过深思熟虑的新观点。