参考论文
“Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift“
1,
深度网络训练在实际中是复杂的,
在训练期间,随着前面层参数的变化,每一层输入分布也会随之发生变化(不是真实的输入分布)。——>内部协方差偏移
这使得训练会变得更慢,所以需要更低的学习率和更精细的参数初始化,并且使得网络难以用非线性饱和激活函数训练模型(sigmoid、tanh是典型的饱和非线性网络)。
随着网络层数的加深,神经元是前面乘以权重加偏置的结果,非线性饱和激活函数容易偏移到饱和区。
原因:
当网络输入的绝对值增大时,倾向于到sigmoid激活函数的饱和区,导数趋近于0,这样网络学习会越来越慢。激活函数的输入会受到前面所有层的w、b的影响,所以网络前面层参数的细微变化容易使得激活函数的输入进入到非线性网络的饱和区,尤其随着网络层数的加深这个现象会更加明显。
解决方案:
饱和问题/梯度消失——>使用relu、或者使用小的学习率解决;或者确保输入分布更加稳定,不容易陷入饱和区,
Neural Networks: Tricks of the trad
2, 解决方案具体做法:
https://zhuanlan.zhihu.com/p/24810318
https://zhuanlan.zhihu.com/p/34879333
由于对输入全部进行白化/归一化操作,运算量很大,所以找个替代方案,仅仅对一层的每个维度进行归一化。但是这样做会改变当前网络层本来的表示能力,比如通过归一化后输入倾向于在sogmoid函数的线性区,为了解决这个问题,:
但是公式的后面还有一个反向操作, 将 normalize 后的数据再扩展和平移. 原来这是为了让神经网络自己去学着使用和修改这个扩展参数 gamma, 和 平移参数 β, 这样神经网络就能自己慢慢琢磨出前面的 normalization 操作到底有没有起到优化的作用, 如果没有起到作用, 我就使用 gamma 和 belt 来抵消一些 normalization 的操作。注意下面公式两个参数就是BN需要学习的参数,
BN通过反向传播学习上面公式的参数
,3,BN优点
当学习率变大时,w->aw,更大的权重有更小的梯度,BN使得参数变化更为稳定
4,BN实验https://zhuanlan.zhihu.com/p/34879333
5,batch-size计算优点
一是因为一个batch的损失函数的梯度,目的是为了估计整个训练集的梯度,假设batch为1,只能估计一个样本的梯度,显然很不合理,所以batch越大越好,因为描述整体训练集的分布更具有客观性。
二是因为并行计算的效率更高
6,batch-size计算的缺点
对初始化的网络参数非常敏感,尤其随着网络的加深会更加敏感,网络的某层结果会受到前面所有层的影响(换句话说,前面任何一层出了问题,后面的层就白训练了。)