位置逐元素前馈(position-wise feed-forward)在Transformer架构中被广泛使用,可以放在自注意力(self-attention)层之后,它的主要目的是在每个序列的位置单独应用一个全连接前馈网络。
自注意力子层用于捕捉序列中的长距离依赖关系,而位置逐元素前馈子层则用于学习局部特征,二者可以配合使用。例如,在GPT(基于Transformer的解码器)中,每个解码器层都包含一个因果自注意力子层和一个位置逐元素前馈子层。这些子层共同使得GPT能够捕捉序列中的局部和全局特征。
在使用位置逐元素前馈前,一般会使用位置编码(Positional Encoding)把位置信息添加到了输入序列中,这是通过将位置编码与原始输入相加实现的。位置逐元前馈网络可以使用两个线性层中间夹一个激活函数的方式实现,比如这样:
# Apply first linear layer and activation function
output = self.dropout(self.activation(self.linear1(x)))
# Apply second linear layer
output = self.linear2(output)
第一个线性层扩展每个位置的表示,为学习更复杂的特征提供可能性,激活函数帮助模型学习更复杂的非线性特征,然后用第二线性层将每个位置的表示压缩回原始维度。
这样,位置特征敏感的部分就会被表达出来,提供给后续网络学习。