Layer/batch Normalization(归一化泛讲)

五种归一化,在这里我们讨论前两种

一、概念

Batch Normalization(批标准化)和Layer Normalization(层标准化)都是神经网络中的标准化技术,它们对数据进行归一化处理以加速训练和提高模型的稳定性。

1.Batch Normalization

是对每个batch的数据进行归一化处理,通过计算每个神经元的均值和方差,将数据规范化到均值为0、方差为1的分布。这样可以加速模型的收敛速度,提高模型的泛化能力。Batch Normalization主要用于卷积神经网络(CNN)等需要大量数据预处理的模型中。

是第l层的第i个样本(对一个minibatch内所有样本的同一维度去做归一化)

{a_{i}}^{l}是第l层的第i个样本(对一个minibatch内所有样本的同一维度去做归一化)

2.Layer Normalization

则是对单个神经元或一个特征映射的所有神经元进行归一化处理,综合考虑一个层内所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入。Layer Normalization主要用于循环神经网络(RNN)和Transformer等需要序列数据的模型中,因为它可以更好地处理序列数据的特性。

对于每一层所有神经元,共享同样的均值和标准差,但每个样本有各自的参数。

如batchsize=10, 我们会有10套均值和标准差

只和神经元的数量有关,与batch size的大小无关

3.layer norm用到RNN中

1.层归一化对于每个时刻进行单独的归一化,归一化的参数跟神经元的个数有关,与batchsize大小无关

2.不同时刻所用到的增益和偏置是共享的,所以不用担心变长问题

{a_{i}}^{t}是第t时刻的第i个隐藏神经元

总的来说,Batch Normalization和Layer Normalization都是为了解决神经网络中数据分布不一致的问题,它们的使用取决于具体的模型和任务需求

二、代码

1.Batch norm

(1)调用官方API 
使用的函数为torch.nn.BatchNorm1d()

代码实现:

因为要求输入的参数为(N,C,L)即(批大小,特征维度,序列长度),所以在第10行将L,C位置进行了交换,再传入函数

(2)手写batch_norm

算均值/方差的时候是对minibatch,时间长度两个维度进行计算,返回的是一个C维(特征维度)的数据,所以要将其扩两维(使用keepdim = True来保证输入和输出维度一样)w

bn_mean = inputx.mean(dim=(0,1), keepdim = True)

bn_std = inputx.std(dim=(0,1), unbiased=False, keepdim = True)

结果(手写和调用API结果一致):

2.Layer norm

(1)调用layer norm API

接受的input只需要保证batch_size在第一纬度就好,不用再进行转置

(2)手写

对于每个样本的每个时刻(per sample, per layer),对embedding求均值和标准差

ls_mean = inputx.mean(dim = -1, keepdim = True)

两种方法的结果

总体代码

  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值