这里才是正文…
前馈神经网络 (FFN)
我们继续使用 “Thinking” 的例子。
FFN 的核心公式是:
$$\text{FFN}(x) = \text{ReLU}(xW_1 + b_1)W_2 + b_2$$
场景设定与准备
为了方便口算,我们将上一章 Attention 算出的结果 $[13.6, 23.6]$ 简化取整。
- 输入向量 ($x$):
[10, 20]- 这是 Attention 层的输出,维度 $d_{model} = 2$。
- 目标:
- 先升维(把 2 维变成 4 维),把特征拆解开。
- 通过 ReLU 过滤负数。
- 再降维(把 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$ 如下:
$$
W_1 = \begin{bmatrix}
1 & -1 & 2 & 0 \
0 & 2 & -1 & 1
\end{bmatrix}, \quad
b_1 = [0, \quad 0, \quad -5, \quad 0]
$$
计算过程:
$$
\begin{aligned}
Z &= x \cdot W_1 + b_1 \
&= [10, 20] \cdot \begin{bmatrix} 1 & -1 & 2 & 0 \ 0 & 2 & -1 & 1 \end{bmatrix} + [0, 0, -5, 0] \
\end{aligned}
$$
逐维度口算:
- 第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$):
$$[10, \quad 30, \quad -5, \quad 20]$$
💡 意义:原本 2 个维度的信息,被拆解到了 4 个维度空间里,就像把一束白光用三棱镜分解成七色光。
2. 第二步:非线性激活 (ReLU)
公式:$\text{ReLU}(z) = \max(0, z)$
这一步非常简单粗暴:所有负数直接归零,正数保持不变。
$$
\begin{aligned}
H &= \text{ReLU}([10, \quad 30, \quad \mathbf{-5}, \quad 20]) \
&= [10, \quad 30, \quad \mathbf{0}, \quad 20]
\end{aligned}
$$
💡 意义:
- 注意那个 -5 变成了 0。
- 这就是**“筛选”**。模型认为第 3 个维度的特征(可能是某种噪音或无关信息)对当前任务没有帮助,所以直接“关掉”了神经元。
3. 第三步:线性变换与降维 ($HW_2 + b_2$)
现在我们要把这个 4 维向量压回 2 维,方便传给下一层。
假设 $W_2$ 和 $b_2$ 如下:
$$
W_2 = \begin{bmatrix}
1 & 0 \
1 & 1 \
0 & 0 \
2 & 1
\end{bmatrix}, \quad
b_2 = [1, \quad 1]
$$
计算过程:
$$
\begin{aligned}
\text{Output} &= H \cdot W_2 + b_2 \
&= [10, 30, 0, 20] \cdot \begin{bmatrix} 1 & 0 \ 1 & 1 \ 0 & 0 \ 2 & 1 \end{bmatrix} + [1, 1]
\end{aligned}
$$
逐维度口算:
第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. 最终结果对比
$$
\text{FFN Output} = [\mathbf{81}, \mathbf{51}]
$$
让我们回顾一下全过程的变化:
| 阶段 | 向量值 | 维度 | 状态描述 |
|---|---|---|---|
| FFN 输入 | [10, 20] |
2维 | 刚开完会(Attention),收集了信息,但比较杂。 |
| 中间层 (ReLU前) | [10, 30, -5, 20] |
4维 | 大脑风暴,把想法发散开,产生了很多念头。 |
| 激活后 (ReLU后) | [10, 30, 0, 20] |
4维 | 否定了不靠谱的念头(-5 被归零)。 |
| FFN 输出 | [81, 51] |
2维 | 总结陈词,形成经过深思熟虑的新观点。 |