首先我们提出一个问题,为什么要有Batch Normalization这样神奇的操作?原有的深度神经网络是有什么问题吗?
还真有问题,那就要提到各位炼丹师们的困境,在深度学习中,模型的层数往往非常的巨大,尤其是chatGPT诞生之后,深度模型正在向着超大模型前进,参数动辄几千亿。在这样复杂的模型结构中,由于模型层与层之间存在高度关联和耦合,导致模型底层输入微小的变化,都有可能带来上层结果的剧烈变化;同时每一层模型参数的变化,会导致下一层输入的分布发生变化,进而需要上层网络不断地去适应这样的变化,导致了我们模型训练和收敛变得困难。上面的这种现象就叫做Internal Covariate Shift(内部协变偏移)。
ICS被定义为:在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift。
那么ICS对模型训练过程有什么影响呢?
其一模型上层网络要不断地调整来适应下层网络输入分布变化,造成网络学习效率低。
其二模型使用sigmoid、tanh等激活函数,ICS容易让激活函数陷入梯度饱和区域,影响模型训练速度。
针对以上的问题,大神们提出了要利用Batch Normalization的思想来解决internal Covariate shift问题。
BN具体是一个什么样的算法呢?他有什么神奇的力量,来解决这样一个由于等层数据分布发生变化,进而影响上层网络训练效率的问题?
Batch Normalization基本的思想是,将每一层的输出数据进行变换,将数据的均值变换为0,方差变换为1,这样变换后会丢失一部分数据信息,所以将变换后的数据在进行一次线性变换,从而让数据恢复自身的表达能力。
batch normalization有什么优势呢?
1.bn是的网络中每层输入分布都比较稳定,加速了模型学习速度。
BN通过规范化与线性变换使得每一层网络的输入数据的均值与方差都在一定范围内,使得后一层网络不必不断去适应底层网络中输入的变化,从而实现了网络中层与层之间的解耦,允许每一层进行独立学习,有利于提高整个神经网络的学习速度。
2.bn是的网络中的参数变得不那么敏感,从而简化了调参过层,使得训练结果更加稳定。
3.BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题
在不使用BN层的时候,由于网络的深度与复杂性,很容易使得底层网络变化累积到上层网络中,导致模型的训练很容易进入到激活函数的梯度饱和区;通过normalize操作可以让激活函数的输入数据落在梯度非饱和区,缓解梯度消失的问题;另外通过自适应学习
与
又让数据保留更多的原始信息。
4.BN具有一定的正则化效果
在Batch Normalization中,由于我们使用mini-batch的均值与方差作为对整体训练样本均值与方差的估计,尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音,与Dropout通过关闭神经元给网络训练带来噪音类似,在一定程度上对模型起到了正则化的效果。
另外,原作者通过也证明了网络加入BN后,可以丢弃Dropout,模型也同样具有很好的泛化效果。
参考:天雨粟:Batch Normalization原理与实战