热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BatchNorm(针对面试问题总结)

参考:基础|batchnorm原理及代码详解https:blog.csdn.netqq_25737169articledetails79048516详解机器学习中

参考:

基础 | batchnorm原理及代码详解 https://blog.csdn.net/qq_25737169/article/details/79048516

详解机器学习中的梯度消失、爆炸原因及其解决方法 https://blog.csdn.net/qq_25737169/article/details/78847691

Pytorch Batch Normalizatin layer的坑  https://zhuanlan.zhihu.com/p/65439075

 



1. Batch Norm 为什么有效?

深度学习的话尤其是在CV上都需要对数据做归一化,因为深度神经网络主要就是为了学习训练数据的分布,并在测试集上达到很好的泛化效果

但是,如果我们每一个batch输入的数据都具有不同的分布,显然会给网络的训练带来困难。

另一方面,数据经过一层层网络计算后,其数据分布也在发生着变化,此现象称为Internal Covariate Shift(内部协变量偏移),接下来会详细解释,会给下一层的网络学习带来困难。

batchnorm 直译过来就是批规范化,就是为了解决这个分布变化问题

 

补充两个知识点:


1.1 Internal Covariate Shift


Internal Covariate Shift :此术语是google小组在论文Batch Normalizatoin中提出来的,其主要描述的是:训练深度网络的时候经常发生训练困难的问题,因为,每一次参数迭代更新后,上一层网络的输出数据经过这一层网络计算后,数据的分布会发生变化,为下一层网络的学习带来困难(神经网络本来就是要学习数据的分布,要是分布一直在变,学习就很难了),此现象称之为Internal Covariate Shift。

Batch Normalizatoin 之前的解决方案就是使用较小的学习率,和小心的初始化参数,对数据做白化处理,但是显然治标不治本。

1.2 covariate shift


Internal Covariate Shift 和Covariate Shift具有相似性,但并不是一个东西,Internal发生在神经网络的内部,后者发生在输入数据上。Covariate Shift主要描述的是由于训练数据和测试数据存在分布的差异性,给网络的泛化性和训练速度带来了影响,我们经常使用的方法是做归一化或者白化。想要直观感受的话,看下图:https://blog.csdn.net/qq_25737169/article/details/79048516

 

优点:

Batchnorm 是归一化的一种手段,极限来说,这种方式会减小图像之间的绝对差异,突出相对差异,加快训练速度。

因为对数据做归一化可以加快训练速度,能对数据做去相关性,突出它们之间的分布相对差异。

 

2. Batch Norm 步骤

è¿éåå¾çæè¿°

 

3. Batch Norm的 两个参数有什么作用?

3.1 如果只做归一化,为什么是学不到任何东西的?

如果在每一层之后都归一化成0-1的高斯分布(减均值除方差)那么数据的分布一直都是高斯分布,数据分布都是固定的了,这样即使加更多层就没有意义了,深度网络就是想学习数据的分布发现规律性,BN就是不让学习的数据分布偏离太远,详细细节可以去看论文。beta gama都是学习的(怎么学的还不清楚?),代码里他们定义的是variable, trainable是True

3.2 两个参数的作用

为了减小InternalCovariate Shift,对神经网络的每一层做归一化不就可以了,假设将每一层输出后的数据都归一化到0均值,1方差,满足正太分布,但是,此时有一个问题,如果每一层的数据分布都是标准正太分布,导致其完全学习不到输入数据的特征,因为,费劲心思学习到的特征分布被归一化了,因此,直接对每一层做归一化显然是不合理的。
但是如果稍作修改,加入可训练的参数做归一化,那就是BatchNorm 实现的了。

接下来详细介绍一下这额外的两个参数,之前也说过如果直接做归一化不做其他处理,神经网络是学不到任何东西的,但是加入这两个参数后,事情就不一样了。先考虑特殊情况下,如果γ 和β 分别等于此batch的标准差和均值,那么yi  就还原到归一化前的x了吗,也即是缩放平移到了归一化前的分布,相当于batchnorm没有起作用,$ β$ 和γ 分别称之为 平移参数和缩放参数 。这样就保证了每一次数据经过归一化后还保留的有学习来的特征,同时又能完成归一化这个操作,加速训练

 

3.3 两个参数是怎么学习的(γ 和β )?


1. 注意momentum的定义

Pytorch中的BN层的动量平滑和常见的动量法计算方式是相反的,默认的momentum=0.1

[公式]

BN层里的表达式为:

[公式]

其中γβ是可以学习的参数。在Pytorch中,BN层的类的参数有:

CLASS torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

num_features  - 来自预期输入大小(N,C,H,W)的CC(N,C,H,W)

eps  - 为数值稳定性添加到分母的值。 默认值:1e-5

动量 - 用于running_mean和running_var计算的值。 对于累积移动平均值(即简单平均值),可以设置为“无”。 默认值:0.1

affine  - 一个布尔值,当设置为True时,此模块具有可学习的仿射参数。 默认值:True

track_running_stats  - 一个布尔值,当设置为True时,此模块跟踪运行的均值和方差,当设置为False时,此模块不跟踪此类统计信息,并始终在训练和评估模式下使用批次统计信息。 默认值:True

 2. 具体计算是:

running_mean = momentum * running_mean + (1 - momentum) * x_mean
running_var = momentum * running_var + (1 - momentum) * x_var

 running_mean 存储的是 当前为止训练集中所有batch 的 均值的加权结果。

momentum 在pytorch 中默认为 0.1,即:当前batch的均值占 0.9的 比重,之前的runing_mean 占0.1的比重。

这篇有提到: Pytorch Batch Normalizatin layer的坑  


https://zhuanlan.zhihu.com/p/65439075

 

4. Batch Norm 训练和测试的区别?

训练阶段:首先计算均值和方差(每次训练给一个批量,计算批量的均值方差),然后归一化,然后缩放和平移,完事!

测试阶段:每次只输入一张图片,这怎么计算批量的均值和方差,于是,就有了代码中下面两行,在训练的时候实现计算好mean、 var,测试的时候直接拿来用就可以了,不用计算均值和方差。

running_mean = momentum * running_mean + (1 - momentum) * x_mean
running_var = momentum * running_var + (1 - momentum) * x_var

 

5. Batch Norm 可以防止过拟合吗?

在dropout部分, 我们已经解释过, 之所以dropout可以抑制overfitting, 是因为在训练阶段, 我们引入了随机性(随机cancel一些Neuron),减少网络的匹配度, 在测试阶段, 我们去除掉随机性, 并通过期望的方式marginalize随机影响。
在BatchNormalization中, 训练阶段, 我们随机选取了Batch进行Normalization, 并计算runningmean等, 在测试阶段, 应用running_mean这些训练参数来进行整体Normalization, 本质上是在Marginalize训练阶段的随机性。 因此, BatchNormalization也提供了Regularization的作用, 实际应用中证明, NB在防止过拟合方面确实也有相当好的表现。

 

Batch Norm 总结

1 优点

(1)没有它之前,需要小心的调整学习率和权重初始化,但是有了BN可以放心的使用大学习率,但是使用了BN,就不用小心的调参了,较大的学习率极大的提高了学习速度。(因为batchnorm将特征归一化到0点附近,显然会加快训练速度;并更进一步的通过变换拉大数据之间的相对差异性,使特征更容易区分)
(2)Batchnorm本身上也是一种正则的方式,可以代替其他正则方式如dropout等
(3)batchnorm降低了数据之间的绝对差异,有一个去相关的性质,更多的考虑相对差异性,因此在分类任务上具有更好的效果。

2 缺点


韩国团队在2017NTIRE图像超分辨率中取得了top1的成绩,主要原因竟是去掉了网络中的batchnorm层,由此可见,BN并不是适用于所有任务的,在image-to-image这样的任务中,尤其是超分辨率上,图像的绝对差异显得尤为重要,所以batchnorm的scale并不适合。
 

 

 

 

 


推荐阅读
author-avatar
刘刚michaelup_340
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有