批标准化BN和层标准化LN

BN,LN,IN,GN从学术化上解释差异:
BatchNorm:batch方向做归一化,算NHW的均值,对小batchsize效果不好;BN主要缺点是对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布
LayerNorm:channel方向做归一化,算CHW的均值,主要对RNN作用明显;
InstanceNorm:一个channel内做归一化,算H*W的均值,用在风格化迁移;因为在图像风格化中,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对HW做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。
GroupNorm:将channel方向分group,然后每个group内做归一化,算(C//G)HW的均值;这样与batchsize无关,不受其约束。
SwitchableNorm:将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。

实验

import numpy as np
import torch
from torch import nn

# data shape
batch_size = 2 # N
seq_size = 3  # channel or C
embedding_size = 4 # H*W

# Layer
BN = nn.BatchNorm1d(seq_size)
LN = nn.LayerNorm(embedding_size)

X = np.random.rand(2,3,4)

after_BN = BN(torch.tensor(X, dtype=torch.float32))
after_LN = LN(torch.tensor(X, dtype=torch.float32))

# 验证
# 均值=0,标准差=1
print("BN均值", after_BN.detach().numpy().mean(axis=(0,2)).round(6))
print("LN均差", after_LN.detach().numpy().mean(axis=(1,2)).round(6))

print("BN标准差", after_BN.detach().numpy().std(axis=(0,2)).round(6))
print("LN标准差", after_LN.detach().numpy().std(axis=(1,2)).round(6))

实验目的:之前一直以为批标准化是对最后一层做的,后来发现理解错了,特此记录

参考声明 https://blog.csdn.net/qq_23981335/article/details/106572171?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

原文地址:https://www.cnblogs.com/paiandlu/p/13578419.html