Transformer前馈全连接层和规范化层(3)

1、·什么是前馈全连接层:
·在Transformer中前馈全连接层就是具有两层线性层的全连接网络.
·前馈全连接层的作用:
·考虑注意力机制可能对复杂过程的拟合程度不够,通过增加两层网络来增强模型的能力.
 

class PositionwiseFeedForward(nn.Module):
    def __init__(self,d_model, d_ff,dropout=0.1):
        """
        d_model:词嵌入维度也是第一个线性层的输入维度
         d_ff:第一个是线性层的输出维度也是第二个线性层的输入维度
        """
        super(PositionwiseFeedForward,self).__init__()
        
        #两层全连接层
        self.w1=nn.Linear(d_model,d_ff)
        self.w2=nn.Linear(d_ff,d_model)
        self.dropout = nn.Dropout(dropout)
    def forward(self, x):
        #输入参数为x代表来自上一层的输出
      #首先经过第一个线性层,然后使用Funtional中relu函数进行激活,
     #之后再使用dropout进行随机置0,最后通过第二个线性层w2,返回最终结果.

        return self.w2(self.dropout(F.relu(self.w1(x))))

将上一章的多头注意力的mha_result作为输入x 

d_model =512
d_ff = 64
dropout = 0.2
x=mha_result
ff=PositionwiseFeedForward(d_model, d_ff,dropout)
ff_result = ff(x)
print(ff_result)
print(ff_result.shape)

 Transformer前馈全连接层和规范化层(3)_第1张图片

 2、规范化层
·规范化层的作用:
·它是所有深层网络模型都需要的标准网络层,因为随着网络层数的增加,通过多层的计算后参数可能开始出现过大或过小的情况,这样可能会导致学习过程出现异常,模型可能收敛非常的慢.因此都会在一定层数后接规范化层进行数值的规范化,使其特征数值在合理范围内.

class LayerNorm(nn.Module):
    """
    features=d_model:词嵌入维度
    另一个是eps它是一个足够小的数,在规范化公式的分母中出现,防止分母为E.默认是1e-6.
    """
    def __init__(self,features, eps=1e-6):
        super(LayerNorm,self).__init__()
        #根据features的形状初始化两个参数张量a2,和b2,第一个初始化为1张量,
        #也就是里面的元素都是1,第二个初始化为0张量,也就是里面的元素都是0,这两个张量就是规范化层的参数
        #因为直接对上一层得到的结果做规范化公式计算,将改变结果的正常表征,因此就需要有参数作为调节因子
        #使其即能满足规范化要求,又能不改变针对目标的表征.最后使用nn.parameter封装,代表模型的参数
        self.a2=nn.Parameter(torch.ones(features))
        self.b2=nn.Parameter(torch.zeros(features))
        self.eps=eps
        
    def forward(self,x):
        #输入参数x代表来自上一层的输出'
        
        #在函数中,首先对输入变量x求其最后一个维度的均值,并保持输出维度与输入维度一致.
        mean=x.mean(-1,keepdim=True)
        
        #接着再求最后一个维度的标准差,然后就是根据规范化公式,用x减去均值除以标准差获得规范化的结果
        std = x.std(-1,keepdim=True)
        
        #最后对结果乘以我们的缩放参数a2,*号代表同型点乘,即对应位置进行乘法操做,加上位移参数b2.返回即可.
        return self.a2 * (x - mean) / (std + self.eps) + self.b2
        

 其中keepdim=True表示维度不会变换。将前馈全连接层的ff_result作为输入x 

features = d_model =512
eps=1e-6
ln = LayerNorm(features,eps)
ln_result = ln(ff_result) 
print(ln_result)
print(ln_result.shape)

Transformer前馈全连接层和规范化层(3)_第2张图片

 Transformer前馈全连接层和规范化层(3)_第3张图片

 

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