【深度学习-基础知识】batchNormal原理及caffe中是如何使用的

目录

一、Batchnorm解决的问题

二、Batchnorm 原理解读

☆加入可训练的参数alpha 和 beta的作用:

三、caffe中为什么bn层要和scale层一起使用

1、caffe中BatchNorm层参数:

2、☆BN在训练和测试阶段的区别

3、caffe中scale层参数

三、❤❤融合BatchNorm+Scale层到卷积层进行推理加速

四、BatchNorm层训练和测试的注意事项

五、BatchNorm的好处


一、Batchnorm解决的问题

  • 网络层输入分布的波动较大Batchnorm就是使网络每层的输入分布想对稳定。

Internal Covariate Shift:深度学习的网络较深,每一层的输入依赖上一层输出,随着训练进行,网络参数(W和b)更新,使得每一层的输入分布波动比较大,这会使得模型训练收敛比较困难。

  • (1)网络参数需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低;
  • (2)网络的训练过程,随着一层一层传导,深层网络层的输入容易陷入梯度饱和区(即sigmoid函数两侧,梯度接近于0),减缓网络收敛速度。

简单一句话:在训练过程中,每轮迭代网络层的输入数据分布变化很大的话,使得数据抖动很大,导致权重变化也会很大,网络很难收敛。而batch norm会将数据归一化,减少不同batch间数据的抖动情况,从而提高训练速度加快收敛。

___________________________________________________________________________

PS:不想关注的太细,该小节后面不用细看了。

机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。那BatchNorm的作用是什么呢?BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同的分布。

如果ML系统实例集合<X,Y>中的输入值X的分布老是变,这不符合IID假设,网络模型很难稳定的学规律,这不得引入迁移学习才能搞定吗,我们的ML系统还得去学习怎么迎合这种分布变化啊。对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是covariate shift问题只发生在输入层。

BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

dropout和bN抑制过拟合的方法有着统一的思想, 即:

在训练阶段引入随机性, 防止过度匹配; 在测试阶段通过求期望等方式在全局去除掉这种随机性, 从而获得确定而准确的结果。

二、Batchnorm 原理解读

☆加入可训练的参数alpha 和 beta的作用:

  • 防止每层特征被归一化成一样的,网络学习不到输入数据的特征,加入可学习的alpha 和 beta能够时网络参数有一定的分布移动和差异。

之前就说过,为了减小输入分布波动,对神经网络的每一层做归一化不就可以了,假设将每一层输出后的数据都归一化到0均值,1方差,满足正太分布,但是,此时有一个问题,每一层的数据分布都是标准正太分布,导致其完全学习不到输入数据的特征,因为,费劲心思学习到的特征分布被归一化了,因此,直接对每一层做归一化显然是不合理的。 
但是如果稍作修改,加入可训练的参数alpha 和 beta做归一化,那能防止每层特征归一化成一样,接下来结合下图的伪代码做详细的分析:

流程图:

三、caffe中为什么bn层要和scale层一起使用

这个问题首先要清楚BN的是做什么的。它其实做了两件事:

  • (1)输入归一化:x_norm = (x - mean) / var,其中mean和var是个累计计算的均值和方差。
  • (2)对归一化后的x进行比例缩放和位移:y = alpha * x_norm + beta,其中的alpha和beta是通过迭代学习得到的

那么caffe中的BN层其实只做了第一件事,scale层做了第二件事

1、caffe中BatchNorm层参数:

BatchNorm是进行归一化,计算

                  

eps是在分母的var项上加一个小值,防止方差为0时出错,默认为1e-5;

1.1 caffe的BN层共有三个参数:均值mean方差variance滑动系数moving_average_fraction

  • 参数mean,variance是由输入数据计算直接计算得到的,参数moving_average_fraction是指定的,一般为0.99,并且不通过反向传播更新;
  • 因此上面三个参数都与学习率和衰减率无关,所以网络中lr_mult和decay_mult都为0;
  • 参数moving_average_fraction是控制均值和方差滑动更新的系数,训练网络更新均值和方差会用到它。

1.2 BN层中还有一个参数use_global_stats

  • use_global_stats:如果为true,则使用事先保存的均值和方差,否则采用滑动平均的方式计算更新全局的均值和方差。
  • 该参数缺省时,网络测试时设置为true,训练阶段设置为false

1.3 更重要的一点:由于BN层中会做归一化处理,因此BN层前的那个卷积层应当将bias关闭,因为BN的操作会做一个减去均值的操作,因此卷积层有没有bias都会被这个减法操作去除掉,所以这时候bias不起作用,因此将其关闭可以减少参数量且不影响模型准确率。

layer {
  name: "conv1_bn"
  type: "BatchNorm"
  bottom: "conv1"
  top: "conv1"
  batch_norm_param {  
        use_global_stats: true #训练时为false,测试时为true 
  }  
  #参数mean,variance是由输入数据计算直接计算得到的,moving_average_fraction是指定的,
  #因此都与学习率和衰减率无关,所以lr_mult和decay_mult都为0
  param {	#参数mean均值
    lr_mult: 0.0  #网络当前层的局部学习率.当前层学习率=base_lr*lr_mult;base_lr为网络基础学习率
    decay_mult: 0 #网络当前层的局部衰减率	
  }
  param {	#参数variance方差
    lr_mult: 0.0
  }
  param {	#参数moving_average_fraction滑动系数,默认0.999
    lr_mult: 0.0
  }
}

2、☆BN在训练和测试阶段的区别

  • 训练阶段:每轮迭代时会计算当前batch中特征的均值和方法;并使用移动平均法更新训练集整体的均值和方差值(供测试阶段使用)。
  • 测试阶段:使用的均值和方差是整个训练集的均值和方差。整个训练集的均值和方差的值通常是在训练的同时用移动平均法来计算的。

3、caffe中scale层参数

Scale是将BatchNorm得到的数据做线性变换:

 

bias_term在这里打开!学习率系数设定为1即可,无需decay_mult。

layer {
  name: "conv1_scale"
  type: "Scale"
  bottom: "conv1"
  top: "conv1"
  param {
    lr_mult: 1.0
    decay_mult: 0
  }
  param {
    lr_mult: 1.0
    decay_mult: 0
  }
  scale_param {
    bias_term: true
  }
}

三、❤❤融合BatchNorm+Scale层到卷积层进行推理加速

在推理时BatchNorm非常耗时,可以将训练时学习到的BatchNorm+Scale的线性变换参数融合到卷积层。具体方法为:

  • 1、识别prototxt文件中的Batch和Scale层,直接删除(这要求BatchNorm和Scale层中top和bottom名保持一致,才能保证删除BatchNorm和Scale层后数据仍然能够正确传输,如上文中示例所用的方式)
  • 2、修改caffemodel的weight,将convolution的bias_term修改为true,并用Convolution+BatchNorm+Scale的等效weight和bias去替换原来的weight和新打开的bias_term。convolution输出值为wx+b,作为BatchNorm层的输入.
  • 3、另外,有些网络使用了dropout层防止过拟合,在预测时可直接删除dropout层,并不影响预测时数据的传输。

合并具体公式:

参考:模型推理加速技巧:融合BN和Conv层 - 知乎

四、BatchNorm层训练和测试的注意事项

1:BatchNormal层:

BN层的设定一般是按照conv->bn->scale->relu的顺序来形成一个block。

use_global_stats:为True时,使用保存的均值,方差;为False时,滑动计算均值方差。在caffe中,该参数缺省的话,TEST阶段自动置为True, 其他阶段为False. 当Finetune需要freeze BN的参数时,要把该参数置为False,否则均值,方差仍在更新;

moving_average_fraction:滑动系数,默认0.999;

eps:加在var上面的,防止标准化时分母为0。

五、☆BatchNorm的好处

BatchNorm为什么NB呢,关键还是效果好。

1)BN使得网络中每层输入数据的分布相对稳定,加快了模型学习速度;

        BN通过规范化与线性变换使得每一层网络的输入数据的均值与方差都在一定范围内,使得后一层网络不必不断去适应底层网络中输入的变化,从而实现了网络中层与层之间的解耦,允许每一层进行独立学习,有利于提高整个神经网络的学习速度。

2)BN使得模型对网络中的参数不那么敏感,使调参过程变得简单多了,对于初始化要求没那么高,而且可以使用较大的学习率等;

        使用Batch Normalization之后,抑制了参数微小变化随着网络层数加深被放大的问题,使得网络对参数大小的适应能力更强,此时我们可以设置较大的学习率而不用过于担心模型divergence的风险。

3)BN具有一定的正则化效果。不用Dropout也能达到很好的泛化效果;

        在Batch Normalization中,由于我们使用mini-batch的均值与方差作为对整体训练样本均值与方差的估计,尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音,与Dropout通过关闭神经元给网络训练带来噪音类似,在一定程度上对模型起到了正则化的效果。

4)BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题

        在不使用BN层的时候,由于网络的深度与复杂性,很容易使得底层网络变化累积到上层网络中,导致模型的训练很容易进入到激活函数的梯度饱和区;通过normalize操作可以让激活函数的输入数据落在梯度非饱和区,缓解梯度消失的问题;另外通过自适应学习\gamma\beta又让数据保留更多的原始信息。

六、☆pytroch中BatchNorm2d用法

torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  • 一个batch中 γ and β 是可学习的参数(长度为C的向量) ,默认值为γ = 1 ,β = 0;
  • 从γ 和 β 的长度可以知道,在计算均值和方差时,是按照通道计算的(channel)。batch中特征图每个通道会计算一个均值和方差值。

训练过程中使用momentum更新均值和方差的方式:

为之前计算的均值和方差值,为当前batch计算的方差和均值,momentum默认为0.1,则方差和均值的更新公式就是0.9*原先的结果+0.1*当前batch计算结果;

参考:

Batch Normalization原理与实战 - 知乎

https://blog.csdn.net/zhuiqiuk/article

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值