在[#260812]中,
注意力机制计算完后,
经过了残差连接与LayerNorm。
但这还不是一个完整的Transformer层。
每个Token还需要进入前馈神经网络,
对自身的信息进行进一步计算。
一、前馈神经网络
前馈神经网络,
也叫Feed Forward Network,
简称FFN。
它的作用与注意力机制不同。
注意力机制负责让不同Token之间互相查看,
而FFN只处理每个Token自身的向量。
简单来说:
注意力机制负责交流信息,
FFN负责消化信息。
二、FFN的计算过程
最简单的FFN,
由两个线性层和一个激活函数组成。
形似:
$$ \text{FFN}(X) = \text{ReLU}(XW_1+b_1)W_2+b_2 $$
先将输入向量${X}$,
通过${W_1}$映射到更高维度。
而后经过ReLU等激活函数,
让线性函数变为非线性函数。
最后通过${W_2}$,
再映射回原本的维度。
假设模型的维度为${d_{model}}$,
FFN中间层的维度为${d_{ff}}$。
则计算过程形似:
$$ d_{model} \rightarrow d_{ff} \rightarrow d_{model} $$
在原始Transformer中,
${d_{ff}}$通常为${d_{model}}$的4倍。
例如:
$$ 512 \rightarrow 2048 \rightarrow 512 $$
先扩展维度,
让模型有更多空间计算特征。
再压缩回原本维度,
让输出可以继续进入下一层。
图解:
三、每个Token单独计算
设输入矩阵为${X}$,
其中每一行都是一个Token的向量。
FFN会对每一行分别进行相同的计算,
但不会在FFN内部让不同Token互相查看。
即:
$$ \text{FFN}(X_1), \text{FFN}(X_2), \dots, \text{FFN}(X_n) $$
虽然每个Token使用相同的${W_1}$、${W_2}$,
但因为输入向量不同,
最后输出的结果也不同。
注意力机制与FFN交替出现,
让模型先获取其他Token的信息,
再对自己的信息进行计算。
四、FFN后的残差连接
与注意力机制一样,
FFN计算完成后也需要残差连接和归一化。
形似:
$$ Y = \text{LayerNorm}(X + \text{FFN}(X)) $$
至此,
一个Transformer层中的注意力机制、
前馈神经网络、残差连接与归一化就都有了。
明天再补上位置编码与整体结构,
就可以把Transformer完整串起来。