transformer结构在Muli-Head Attention层之后还添加了一层Feed-Forward层。Feed-Forward层包括两层全连接层以及一个非线性激活函数ReLu。
注意到在Mui-Head Attention的内部结构中,我们进行的主要都是矩阵乘法(scaled Dot-Product Attention),即进行的都是线性变换,而线性变换的学习能力是不如非线性变化的强的,所以Mui-Head Attention的输出尽管利用了Attention机制,学习到了每个单词的权重,但是这种表达能力可能并不强烈,我们仍然希望可以通过激活函数的方式,来强化每个单词的表达能力,比如 context: The animal didn't cross the road because it was too tired,利用激活函数,我们希望使得通过Attention层计算出的权重指数中,单词 it 在整个句子的表达中,数值较大的部分进行加强,数值较小的部分则进行抑制,从而使得相关的部分表达效果更好(这也是神经网络中激活函数的作用,即进行非线性映射,加强大的部分,抑制小的部分)。我觉得这也是为什么在Attentlon层后加了一个Layer Normallzalton层,通过对representation进行标准化处理,将数据移动到激活函数的作用区域,可以使得RLU激活函数更好的发挥作用。
同时在Feed-Forward层中,先将数据映射到高维空间再映射到低维空间的过程,可以学习到更加抽象的特征,即该Feed-Forward层使得单词的表达能力更强,更加能够表示单词与context中其他单词之间的作用关系。
# Position-wise Feed-Forward Networksclass PositionwiseFeedForward(nn.Module):"实现FFN函数"def __init__(self, d_model, d_ff, dropout=0.1):super(PositionwiseFeedForward, self).__init__()self.w_1 = nn.Linear(d_model, d_ff)self.w_2 = nn.Linear(d_ff, d_model)self.dropout = nn.Dropout(dropout)def forward(self, x):return self.w_2(self.dropout(F.relu(self.w_1(x))))
参考文献
Transformer模型中的Feed-Forward层的作用
本文链接:https://my.lmcjl.com/post/1982.html
4 评论