1.计算方法的不同
BatchNorm:batch方向做归一化,算NHW的均值
LayerNorm:channel方向做归一化,算CHW的均值。为了能够在只有当前一个训练实例下,找到一个合理的统计范围,一个直接的想法是:把同一个卷积层作为集合,求均值和方差;对于RNN,就是把同层隐层神经元的响应值(不同时刻)作为集合,再求均值和方差。
InstanceNorm:一个channel内做归一化,算H*W的均值。LN是对所有的通道,那对一个通道做归一化就是IN,单个通道的feature map作为集合,并在此集合上求均值和方差,这种像素级上的操作,使得IN对于一些图片生成类的任务效果明显优于BN,比如图片风格转换。
GroupNorm:将channel方向分group,然后每个group内做归一化,算(C//G)HW的均值。LN是对于所有的通道,IN是对于单个通道,如果把所有通道分组,再各个组上做归一化,这就是GN。通道分组也是CNN常用的优化技巧。GN在mini-batch比较小的场景或者物体检测、视频分类等场景下效果优于BN。
2.各个归一化方法在pytorch里的函数
- class torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True)
- class torch.nn.InstanceNorm2d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
- class torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True)
- class torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine=True)
3.实验验证各个方法的效果
在cifar10数据集,用VGG16网络,只改变batchsize和归一化的函数,各个归一化方法的效果(时间单位是秒):
BN :
BatchSize=128时,epoch = 10,train acc = 88.378%,test acc = 84.810%,每个epoch时间= 12.721679000000002
BatchSize=32时,epoch = 20,train acc = 85.792%,test acc = 84.470%,每个epoch时间= 26.749455000000125
BatchSize=16时,epoch = 20,train acc = 80.408%,test acc = 79.260%,每个epoch时间= 44.35883400000057
BatchSize=8时,epoch = 20,train acc = 71.272%,test acc = 73.980%,每个epoch时间= 44.35883400000057
BatchSize=2时,epoch = 10,train acc = 10.206%,test acc = 10.000%,每个epoch时间= 252.75724199999968
LN :
BatchSize=1

本文对比了四种深度学习中的归一化方法:BatchNorm、LayerNorm、InstanceNorm和GroupNorm。通过在PyTorch中的实现以及在CIFAR10数据集上使用VGG16网络的实验,展示了它们在不同batch size下的性能差异。实验结果显示,BatchNorm在较大batch size时效果最佳,而GroupNorm在小batch size时表现优于其他方法,但存在平台期问题。
最低0.47元/天 解锁文章
2167

被折叠的 条评论
为什么被折叠?



