在[#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完整串起来。