五种归一化,在这里我们讨论前两种
一、概念
Batch Normalization(批标准化)和Layer Normalization(层标准化)都是神经网络中的标准化技术,它们对数据进行归一化处理以加速训练和提高模型的稳定性。
1.Batch Normalization
是对每个batch的数据进行归一化处理,通过计算每个神经元的均值和方差,将数据规范化到均值为0、方差为1的分布。这样可以加速模型的收敛速度,提高模型的泛化能力。Batch Normalization主要用于卷积神经网络(CNN)等需要大量数据预处理的模型中。
是第l层的第i个样本(对一个minibatch内所有样本的同一维度去做归一化)
是第l层的第i个样本(对一个minibatch内所有样本的同一维度去做归一化)
2.Layer Normalization
则是对单个神经元或一个特征映射的所有神经元进行归一化处理,综合考虑一个层内所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入。Layer Normalization主要用于循环神经网络(RNN)和Transformer等需要序列数据的模型中,因为它可以更好地处理序列数据的特性。
对于每一层所有神经元,共享同样的均值和标准差,但每个样本有各自的参数。
如batchsize=10, 我们会有10套均值和标准差
只和神经元的数量有关,与batch size的大小无关
3.layer norm用到RNN中
1.层归一化对于每个时刻进行单独的归一化,归一化的参数跟神经元的个数有关,与batchsize大小无关
2.不同时刻所用到的增益和偏置是共享的,所以不用担心变长问题
是第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)
两种方法的结果