在[#260812]中,
完成了注意力机制、残差连接与归一化,
但注意力层只是编码器的一部分。


注意力层之后,
还需要经过前馈神经网络,
进一步处理Token的向量。


一、为什么需要前馈神经网络


注意力机制负责的是Token之间的信息交换,
它让每个Token查看其他Token,
得到一个加权求和后的新向量。


但这样得到的向量,
本质上仍然是其他Token向量的组合,
缺少更复杂的变换能力。


简单来说:

注意力机制负责Token之间”互相看”,
前馈神经网络负责每个Token”自己想”。


二、前馈神经网络的计算


前馈神经网络的结构很简单,
与[#260810]提到的非线性函数类似:


$$ Y = g(WX + b) $$


只不过前馈神经网络做了两次这样的变换:


$$ \text{FFN}(X) = W_2 \cdot \text{ReLU}(W_1 X + b_1) + b_2 $$


其中:

  • $W_1$、$b_1$:第一层的权重和偏移。
  • $\text{ReLU}$:激活函数,将负数全部变为0。
  • $W_2$、$b_2$:第二层的权重和偏移。

与${W_q}$、${W_k}$、${W_v}$以及$\gamma$、$\beta$一样,
$W_1$、$b_1$、$W_2$、$b_2$也可以在模型训练中慢慢确定。


简单来说:

先把向量升维,让模型有更多空间变换,

再通过激活函数引入非线性,

最后降维回原来的大小。


三、完整的编码器层


一个完整的编码器层流程为:

  1. 注意力机制,让Token之间交换信息。
  2. 与原始输入相加,做残差连接。
  3. 对相加结果进行LayerNorm。
  4. 进入前馈神经网络,让每个Token自己变换。
  5. 再次做残差连接。
  6. 再次进行LayerNorm。

形似:

$$ \text{Output} = \text{LayerNorm}(X + \text{FFN}(\text{LayerNorm}(X + \text{MultiHeadAttention}(X)))) $$


经过这一层,
Token既完成了相互之间的信息交换,
也完成了自身向量的非线性变换。


将这样的编码器层重复堆叠多次,
就是完整编码器的结构,
也是大模型不断深入理解文本的方式。