前言
最近要找工作,也是复习一下面经。之前经常看过的BN也是面试中的重中之重,记得当时面试华为诺亚方舟实验室的时候,面试官就问到了我BN和LN的区别,当时也仅仅是将这两者的区别说出来了,但是并没有进行扩展,现在想想也是有点后悔的(其实当时自己也不知道该扩展啥)。在今天也就做一下总结,来概括一下这两者的区别以及BN的动机原理。
1、动机
在机器学习领域有个非常重要的假设样本之间的独立同分布,也就是训练数据和测试数据假设是满足相同分布,这样我们通过训练数据训练模型才能够在测试数据上获得较好的效果(这个独立同分布是一个前提)。 然而,往往很多时候,真实情况并不是我们希望看到的那样,也就是训练数据和测试数据往往分布会不一致,这时候往往会大大降低神经网络(其他模型也一样)的泛化能力,所以在神经网络的训练中,为了让训练数据和测试数据尽量一致,我们会对所有输入数据进行归一化处理。
那么这个和BN有啥关系呢? BN是用来解决"Internal Covariate Shift"问题的。 首先,先解释下"Covariate shift"现象, 这个指的就是训练集的数据分布和测试集的数据分布不一致。 而"internal"表示的是神经网络隐层中的数据分布不一致问题。
也就是在神经网络的训练过程中, 每个隐藏的参数都在不停的变化,从而使得后一层的输入发生变化,从而每一批训练数据的分布也会随之改变,导致了网络在每次迭代中都需要拟合不同的数据分布,这样增大了训练的复杂度以及过拟合的风险。
所以BatchNorm的基本思想就提出来了: 能不能让每个隐层节点的激活输入分布变得稳定一点呢? 作者在图像白化操作中得到了启发(所谓白化,就是对输入数据分布变换到0均值,单位方差的正态分布, 那么神经网络会较快收敛), 从而进行推论,图像是深度神经网络的输入层,做白化能加快收敛,那么其实对于深度网络来说,其中某个隐层的神经元是下一层的输入,意思是其实深度神经网络的每一个隐层都是输入层,不过是相对下一层来说而已,那么能不能对每个隐层都做白化呢?所以BN可以理解为对深层神经网络每个隐层神经元的激活值做简化版本的白化操作, 再白话一点,BN就是针对每一批数据在网络的每一层输入之前增加归一化处理(均值0,标准差为1), 这样就将所有的批数据强制在统一的分布下。
2、BN的算法流程
首先先看一下大佬