在[#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$也可以在模型训练中慢慢确定。
简单来说:
先把向量升维,让模型有更多空间变换,
再通过激活函数引入非线性,
最后降维回原来的大小。
三、完整的编码器层
一个完整的编码器层流程为:
- 注意力机制,让Token之间交换信息。
- 与原始输入相加,做残差连接。
- 对相加结果进行LayerNorm。
- 进入前馈神经网络,让每个Token自己变换。
- 再次做残差连接。
- 再次进行LayerNorm。
形似:
$$ \text{Output} = \text{LayerNorm}(X + \text{FFN}(\text{LayerNorm}(X + \text{MultiHeadAttention}(X)))) $$
经过这一层,
Token既完成了相互之间的信息交换,
也完成了自身向量的非线性变换。
将这样的编码器层重复堆叠多次,
就是完整编码器的结构,
也是大模型不断深入理解文本的方式。