transformer学习笔记:Feed-Forward Network

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 Networks

class 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层的作用

你可能感兴趣的:(transformer,学习,深度学习)