归一化方法:BN LayerNorm(LN)InstanceNorm(IN)GroupNorm(GN) SwitchableNorm(SN)

您所在的位置:网站首页 代码归一化 归一化方法:BN LayerNorm(LN)InstanceNorm(IN)GroupNorm(GN) SwitchableNorm(SN)

归一化方法:BN LayerNorm(LN)InstanceNorm(IN)GroupNorm(GN) SwitchableNorm(SN)

2024-07-12 05:56| 来源: 网络整理| 查看: 265

本篇博客总结几种归一化办法,并给出相应计算公式和代码。

论文链接Batch Normalization:https://arxiv.org/pdf/1502.03167.pdf

Layer Normalizaiton:https://arxiv.org/pdf/1607.06450v1.pdf

Instance Normalization:https://arxiv.org/pdf/1607.08022.pdf https://github.com/DmitryUlyanov/texture_nets

Group Normalization: https://arxiv.org/pdf/1803.08494.pdf

Switchable Normalization:https://arxiv.org/pdf/1806.10779.pdf

https://github.com/switchablenorms/Switchable-Normalization

简单介绍:

归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年)、Switchable Normalization(2018年);

将输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在,

batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好; layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显; instanceNorm在图像像素上,对HW做归一化,用在风格化迁移; GroupNorm将channel分组,然后再做归一化,可用于batchsize较小时; SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。

谱归一化 适用于GAN环境中,抑制参数、梯度突变,在生成器和判别器中均采用谱归一化,并可以在加快速度上替代WGAN

谱归一化(Spectral Normalization)的理解_StreamRock的专栏-CSDN博客_谱归一化

1、Batch Normalization

归一化特点及优势:

主要操作是将网络内部数据将数据拉回到均值为0,方差为1的正太分布上;

1)数据分布一致,可简化并加快收敛过程;

2)由于对数据归一化处理,使得数据不会太大也不会太小,解决了梯度消失及梯度爆炸问题

3)minibatch相当于计算了整个数据均值和方差,在一定程度上增加了网络泛化性。

算法过程:

加入缩放平移变量的原因是:保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练。 这两个参数是用来学习的参数。

import numpy as np def Batchnorm(x, gamma, beta, bn_param): # x_shape:[B, C, H, W] running_mean = bn_param['running_mean'] running_var = bn_param['running_var'] results = 0. eps = 1e-5 x_mean = np.mean(x, axis=(0, 2, 3), keepdims=True) x_var = np.var(x, axis=(0, 2, 3), keepdims=True0) x_normalized = (x - x_mean) / np.sqrt(x_var + eps) results = gamma * x_normalized + beta # 因为在测试时是单个图片测试,这里保留训练时的均值和方差,用在后面测试时用 running_mean = momentum * running_mean + (1 - momentum) * x_mean running_var = momentum * running_var + (1 - momentum) * x_var bn_param['running_mean'] = running_mean bn_param['running_var'] = running_var return results, bn_param 2、Layer Normalizaiton

batch normalization存在以下缺点:

对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布; BN实际使用时需要计算并且保存某一层神经网络batch的均值和方差等统计信息,对于对一个固定深度的前向神经网络(DNN,CNN)使用BN,很方便;但对于RNN来说,sequence的长度是不一致的,换句话说RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其他sequence长很多,这样training时,计算很麻烦。(参考于https://blog.csdn.net/lqfarmer/article/details/71439314) 与BN不同,LN是针对深度网络的某一层的所有神经元的输入按以下公式进行normalize操作。

BN与LN的区别在于:

LN中同层神经元输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差; BN中则针对不同神经元输入计算均值和方差,同一个batch中的输入拥有相同的均值和方差。

所以,LN不依赖于batch的大小和输入sequence的深度,因此可以用于batchsize为1和RNN中对边长的输入sequence的normalize操作。

LN用于RNN效果比较明显,但是在CNN上,不如BN。

def ln(x, b, s): _eps = 1e-5 output = (x - x.mean(1)[:,None]) / tensor.sqrt((x.var(1)[:,None] + _eps)) output = s[None, :] * output + b[None,:] return output 3、Instance Normalization

BN注重对每个batch进行归一化,保证数据分布一致,因为判别模型中结果取决于数据整体分布。

但是图像风格化中,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对HW做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。

另参考:关于Batch Normalization的另一种理解_aipiano-CSDN博客

公式:

代码:

def Instancenorm(x, gamma, beta): # x_shape:[B, C, H, W] results = 0. eps = 1e-5 x_mean = np.mean(x, axis=(2, 3), keepdims=True) x_var = np.var(x, axis=(2, 3), keepdims=True0) x_normalized = (x - x_mean) / np.sqrt(x_var + eps) results = gamma * x_normalized + beta return results

在pytorch上支持函数使用:pytorch | 利用batch normalization对Variable进行normalize/instance normalize_IMAGES CAN TALKS-CSDN博客_batch normalization pytorch

4、Group Normalization

主要是针对Batch Normalization对小batchsize效果差,GN将channel方向分group,然后每个group内做归一化,算(C//G)*H*W的均值,这样与batchsize无关,不受其约束。

公式:

伪代码: 

代码:

def GroupNorm(x, gamma, beta, G=16): # x_shape:[B, C, H, W] results = 0. eps = 1e-5 x = np.reshape(x, (x.shape[0], G, x.shape[1]/16, x.shape[2], x.shape[3])) x_mean = np.mean(x, axis=(2, 3, 4), keepdims=True) x_var = np.var(x, axis=(2, 3, 4), keepdims=True0) x_normalized = (x - x_mean) / np.sqrt(x_var + eps) results = gamma * x_normalized + beta return results 5、Switchable Normalization

本篇论文作者认为,

第一,归一化虽然提高模型泛化能力,然而归一化层的操作是人工设计的。在实际应用中,解决不同的问题原则上需要设计不同的归一化操作,并没有一个通用的归一化方法能够解决所有应用问题; 第二,一个深度神经网络往往包含几十个归一化层,通常这些归一化层都使用同样的归一化操作,因为手工为每一个归一化层设计操作需要进行大量的实验。 因此作者提出自适配归一化方法——Switchable Normalization(SN)来解决上述问题。与强化学习不同,SN使用可微分学习,为一个深度网络中的每一个归一化层确定合适的归一化操作。

公式:

代码:

def SwitchableNorm(x, gamma, beta, w_mean, w_var): # x_shape:[B, C, H, W] results = 0. eps = 1e-5 mean_in = np.mean(x, axis=(2, 3), keepdims=True) var_in = np.var(x, axis=(2, 3), keepdims=True) mean_ln = np.mean(x, axis=(1, 2, 3), keepdims=True) var_ln = np.var(x, axis=(1, 2, 3), keepdims=True) mean_bn = np.mean(x, axis=(0, 2, 3), keepdims=True) var_bn = np.var(x, axis=(0, 2, 3), keepdims=True) mean = w_mean[0] * mean_in + w_mean[1] * mean_ln + w_mean[2] * mean_bn var = w_var[0] * var_in + w_var[1] * var_ln + w_var[2] * var_bn x_normalized = (x - mean) / np.sqrt(var + eps) results = gamma * x_normalized + beta return results

结果比较:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3