各种归⼀化层(BatchNorm、LayerNorm、InstanceNorm、
Group。。。
BN,LN,IN,GN,WS 从学术化上解释差异:
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结合,赋予权重,让⽹络⾃⼰去学习归⼀化层应该使⽤什么⽅法。
Weight Standardization:权重标准化,2019年约翰霍普⾦斯⼤学研究⼈员提出。
1、BatchNorm
=True)
微微一笑很倾城吻戏
BN图⽰
参数:
num_features: 来⾃期望输⼊的特征数,该期望输⼊的⼤⼩为’batch_size × num_features [× width]’
eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
momentum: 动态均值和动态⽅差所使⽤的动量。默认为0.1。
affine: 布尔值,当设为true,给该层添加可学习的仿射变换参数。
track_running_stats:布尔值,当设为true,记录训练过程中的均值和⽅差;
实现公式:
⼤部分深度⽹络通常都会使⽤ BN 层去加速训练和帮助模型更好收敛。虽然 BN 层⾮常实⽤,但从研究者的⾓度看,依然有⼀些⾮常显眼的缺点。⽐如(1)我们⾮常缺乏对于 BN 层成功原因的理解;(2)BN 层仅在 batch size ⾜够⼤时才有明显的效果,因此不能⽤在微批次的训练中。虽然现在已经有专门针对微批次训练设计的归⼀化⽅法(GN),但图 1 所⽰,它很难在⼤批次训练时媲美 BN 的效果。
2、GroupNorm
FAIR 团队的吴育昕和何恺明提出了组归⼀化(Group Normalization,简称 GN)的⽅法,GN 将信号通道分成⼀个个组别,并在每个组别内计算归⼀化的均值和⽅差,以进⾏归⼀化处理。GN 的计算与批量⼤⼩⽆关,⽽且在批次⼤⼩⼤幅变化时,精度依然稳定。通常来说,在使⽤ Batch Normalization(以下将简称 BN)时,采⽤⼩批次很难训练⼀个⽹络,⽽对于不使⽤批次的优化⽅法来说,效果很难媲美采⽤⼤批次BN时的训练结果。当使⽤ Group Normalization(以下将简称 GN),且 batch size ⼤⼩为 1 时,仅需要多写两⾏代码加⼊权重标准化⽅法,就能⽐肩甚⾄超越⼤批次BN时的训练效果。
参数:
num_groups:需要划分为的groups
num_features: 来⾃期望输⼊的特征数,该期望输⼊的⼤⼩为’batch_size x num_features [x width]’
李云迪是谁eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。友谊万岁
momentum: 动态均值和动态⽅差所使⽤的动量。默认为0.1。
affine: 布尔值,当设为true,给该层添加可学习的仿射变换参数。
实现公式:
Tensorflow的代码如下:
3、InstanceNorm
ine=Fal, track_running_stats=Fal) InstanceNorm3d(num_features, eps=1e-05, momentum=0.1, affine=Fal, track_running_stats=Fal)
参数:
num_features: 来⾃期望输⼊的特征数,该期望输⼊的⼤⼩为’batch_size x num_features [x width]’
eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
momentum: 动态均值和动态⽅差所使⽤的动量。默认为0.1。
取代英语affine: 布尔值,当设为true,给该层添加可学习的仿射变换参数。
track_running_stats:布尔值,当设为true,记录训练过程中的均值和⽅差;
实现公式:
4、LayerNorm
瑜伽能减肥吗LN图⽰
爱国的诗词参数:
normalized_shape: 输⼊尺⼨
[∗×normalized_shape[0]×normalized_shape[1]×…×normalized_shape[−1]] eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
elementwi_affine: 布尔值,当设为true,给该层添加可学习的仿射变换参数。
实现公式:
5、LocalResponNorm
size:⽤于归⼀化的邻居通道数
alpha:乘积因⼦,Default: 0.0001
beta :指数,Default: 0.75
k:附加因⼦,Default: 1
实现公式:
6、Weight Standardization
论⽂《》 JOURNAL OF LATEX CLASS FILES, VOL. 14, NO. 8, AUGUST 20151代码
下图是在⽹络前馈(青⾊)和反向传播(红⾊)时,进⾏权重梯度标准化的计算表达式:
以卷积神经⽹络中的卷积核为例,Pytorch中传统的卷积模块为:
引⼊WS后的实现为:
# Pytorch
class Conv2d(nn.Conv2d):
'''
shape:
input: (Batch_size, in_channels, H_in, W_in)
output: ((Batch_size, out_channels, H_out, W_out))
'''
def __init__(lf, in_channels, out_channels, kernel_size, stride=1,
padding=0, dilation=1, groups=1, bias=True):
super(Conv2d, lf).__init__(in_channels, out_channels, kernel_size, stride,
阿里巴巴六脉神剑padding, dilation, groups, bias)
def forward(lf, x):
weight = lf.weight #lf.weight 的shape为(out_channels, in_channels, kernel_size_w, kernel_size_h)
weight_mean = an(dim=1, keepdim=True).mean(dim=2,
keepdim=True).mean(dim=3, keepdim=True)
weight = weight - weight_mean
std = weight.view(weight.size(0), -1).std(dim=1).view(-1, 1, 1, 1) + 1e-5
weight = weight / pand_as(weight)
测量工程师
v2d(x, weight, lf.bias, lf.stride,
lf.padding, lf.dilation, lf.groups)
附录:
总结及代码测试
来源:《》
下图是对BatchNorm, LayerNorm, InstanceNorm和GroupNorm四种Normalization⽅式的⼀个汇总(我个⼈感觉这个图看起来⽅便⼀些).
图中每⼀个正⽅体块表⽰⼀个数据(⽐如说这⾥⼀个正⽅体就是⼀个图像)
每⼀个正⽅体中的C, H, W分别表⽰channel(通道个数), height(图像的⾼), weight(图像的宽)
下图介绍了4中Norm的⽅式, 如Layer Norm中NHWC----->N111表⽰是将后⾯的三个进⾏标准化, 不与batchsize有关.
我们可以看到, 后⾯的LayerNorm, InstanceNorm和GroupNorm这三种⽅式都是和Batchsize是没有关系的。