1. 简介
是神经网络中常用的一种优化 加快收敛的方式,而是一个自适应的重新参数化的方法,目的在于解决深层神经网络训练困难的问题。
Batch 通过一定的规范化手段,对每个隐层神经元,把其经过非线性函数映射后逐渐向取值区间极限饱和区靠拢的输入分布 强行拉回到均值为0,方差为1 的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,从而相当于放大了梯度,避免了梯度消失的问题,函数收敛加快。
https://www.cnblogs.com/guoyaohua/p/8724433.html
2. 主要思想:
我们机器学习训练模型 有一个前提假设是独立同分布。就是假设训练与测试数据之间是相同的分布,这是使得训练获得的模型在测试数据上拟合效果好的一个基本保障。
而神经网络中由于其特殊的学习方法,每一层神经网络训练完后,其实都相当于产生了新的数据。模型实例集合中的输入值x, 网络模型很难稳定的学规律。(Internal convariate shift 隐层数据摆动)
随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值 即梯度值很小更新缓慢),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,
Batch norm 的思想: 能不能其 激活的输入分布 固定下来?
如何固定?
借鉴了归一化的思想,可以将数据通过将归一化变为均值为0,方差为1的比较标准的正态分布。所以batch norm 通过还没有激活函数映射的激活值(x= WU+B) u 是真正输入,x是某个激活值。 进行归一化处理,并且由于这样之后,相当于做了线性拟合,违反了神经网络拟合非线性函数的初衷,使得函数表达能力下降。 所以加上参数 scale 和 shfit
(y=scale*x+shift) 这两个参数通过模型学习得到,相当于最终取得线性和非线性的一个平衡点。既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
对于独立同分布 自己的理解:
以线性回归为例,若训练集是线性分布 测试集时指数分布,那么拟合效果一定不好。 为了保证拟合效果尽可能好,可能就得多训练多学习 。
3. Batch Norm 优势? 为什么好?
- 调参简单,对初始化要求没那么高,可以使用很高的学习率。
- 提高训练速度,加快收敛(表现在解决了梯度消失问题,并且相当于一定的归一化)
- 可以移除或降低dropout,即类似于dropout 的一种防止过拟合手段,加快收敛。
理解:
- 可以使用大的学习率,对学习率大小限制不大,调参简单。
神经网络中,如果学习率过大,会导值参数更新幅度过大,函数的收敛呈现z字形的震荡(因为是沿着梯度下降最大的方向收敛,垂直与等高线,曲线下降),导致整体的收敛速度较慢
而batch norm 对输入数据做规范化即相当于做了归一化操作,解决测此问题。
- 使用Batch 可以移除或使用较小的dropout,加快收敛。
由于Batch 每一次做规则化的时候,相当于对噪声数据也一次做了规则化,给隐藏单元添加了噪音,迫使后部单元不过分依赖任何一个隐藏单元。类似于dropout。但是由于噪声很小,所以正则效果并不是特别大。
可以将Batch归一化和dropout一起使用或者 L2 正则化项,如果你想得到dropout更强大的正则化效果。(吴恩达深度学习笔记)
4. 和 drop等的 相对顺序?
Batch Normalization 层恰恰插入在 Conv 层或全连接层之后,而在 ReLU等激活层之前。而对于 dropout 则应当置于 activation layer 之后。
-> CONV/FC -> BatchNorm -> ReLu(or other activation) -> Dropout -> CONV/FC ->;
5. Batch norm 什么时候用比较好?
例如,
- 在神经网络收敛速度很慢时
- 过拟合时
- 防止梯度消失和梯度爆炸时
- 一般 也可用batch norm加快收敛,提高模型精度