算法面经手撕系列(3)--手撕LayerNormlization

LayerNormlization

 在许多的语言模型如Bert里,虽然都是说做的LayerNormlization,但计算均值和方差只会沿着channel维度做,并不是沿着seq_L和channel维度一起做,参考:BERT用的LayerNorm可能不是你认为的那个Layer Norm
 LayerNormlization计算流程:

  1. init里初始化C_in大小的scale和shift向量
  2. 沿Channel维度计算均值和方差
  3. 归一化

代码

 LayerNorm(InstanceNorm)实现如下:

class LayerNormalization(nn.Module):
    def __init__(self,hidden_dim,eps=1e-6):
        super(LayerNormalization, self).__init__()

        self.eps=eps
        self.gamma=nn.Parameter(torch.ones(hidden_dim))
        self.beta=nn.Parameter(torch.zeros(hidden_dim))

    def forward(self,x):
        B,seq_L,C=x.shape

        mean=x.mean(dim=-1,keepdim=True)
        std=x.std(dim=-1,keepdim=True)

        out=(x-mean)/(std+self.eps)
        out=out*self.gamma+self.beta
        return out
if __name__=="__main__":
 tensor_input=torch.rand(5,10,8)
 model=LayerNormalization(8)
 res=model(tensor_input)
 print(res)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值