作者:18届CYL
日期:2020-9-1
期刊:arxiv
标签: BN归一化
论文:《Batch Nomalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift》
一、背景知识
1、2015年 收录在arxiv。 介绍了一种归一化方法,可以加快收敛速度,减少学习率,dropout比例这种超参数的设计。在15年之后的模型中基本都会用到。作者:Sergey loffe、Christian Szegedy
2、机器学习领域有一个很重要的假设:IID独立同分布。(测试集和训练集的分布完全相同)。而神经网络其实的整体目标可以说是学习数据的分布。
3、神经网络中通常都会设置一个batch_size,也就是一次训练扔进去的数据数量(并行计算),合适大小的batch_size可以防止每次训练单独的数据导致的神经网络一直被‘局部视野困扰而四处乱撞’难以收敛。也不需要一次性扔进所有数据(计算能力受限)。
4、深层神经网络训练收敛慢的原因之一是:非线性变换前的激活输入值随着训练的进行朝着两个极端前进,导致梯度弥散。
5、神经网络的输入通常需要做归一化,已经证明了这种方式可以提高正确率,最有效的归一化是“白化”,可以降低特征相关性,均值为0,方差为1。但是缺点是降低特征相关性这一步计算量巨大。还有一个缺点是白化操作不是处处可微的。
二、提出问题
1、由于在训练过程中前一层的参数一直在变化,所以导致后一层的输入的分布在不断的改变,这就是internal covariate shift (内部协变量转变)现象,会让深层网络更加难以收敛,而且会导致学习率、dropout率、batch_size大小、初始值等等超参数需要小心翼翼的调试。
三、解决方法
1、然后作者受到白化的启发 想:每一层的输入之前都做一下归一化它不香吗?实际上他也的确是采用了白化的简易版本。具体就是想办法对深层网络前一层的非线性变换前的激活输入做归一化,归一成均值为0,方差为1。这样一是解决 输入的分布在不断的改变(internal covariate shift)这个主要问题,二是在一定程度上解决梯度弥散问题。
四、具体方法&关注细节
1、BN归一化(batch normalization)的基本公式
均值为0,方差为1:
评价:前面说过了变成均值为0,方差为1的正态分布,可以统一每一层的输入分布,也会在非线性变换之前将向两端靠拢的值拉到中间。 但是我们也可以很容易理解:这样简单粗暴的标准归一化后让上一层学到的非线性特征被消没了,该有的变化也没有了(一直没有变化还学习啥呀)
2、BN归一化的实际公式
在原有的基础上加一点偏离
为了解决标准归一化带来的问题引入了两个调节参数(自学习参数scale和shift),这两个参数是通过训练学习到的,用来使网络的表达能力增强,论文说这两个参数自学习的最终结果可以既达到归一化的优点又维持原输入学习到的特征。我个人理解:既然我们的自学习过程总会朝向最优的情况前进,那么我们在理解引入的自学习参数时,只需要考虑这两个参数最终在无限好的情况下是否能好到让x^这个标准归一化通过平移变胖变瘦来改变分布到达原输入的有效分布。
3、最终流程
(其实与上面一毛一样)
四、BN训练和测试时的小细节
BN在训练时由于一个batch_size大小的数据被一次性扔进去,而且是并行计算,所以E(x)是这几个数据输入后同一个神经元的值的平均值,方差同理。那么再测试的时候一次只扔进去一个数据该咋办?那就是:采用全局统计量做输入的时候的平均值和方差。
五、闪耀的结果
1、可视化with或without BN的训练过程
图a:正确率-训练轮次图 图bc:输入分布变化图
2、超级加速
3、其他优点
- 初始学习率可以非常大,让模型快速收敛,而且不需要谨小慎微的调学习率
- 一些情况下可以取代dropout
- 一定程度的正确率提升