本文主要是介绍对 BatchNormalization 中 Internal Convariate Shift 的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言:写的不好,主要解释了对内部协变量漂移(Internal Convariate Shift)的理解。
之前对BatchNormalization的理解不是很透彻,在搭建神经网络的时候也没有很注意去使用,今天集中搜索整理了下Batch Normalization的相关资料,才知道BatchNormalization的重要性,并不是用了Relu激活函数,BatchNormalization就没有用了。
为什么要使用Batch Normalization?
1. 降低内部协变量漂移(Internal Convariate Shift)
神经网络的最终目的:说到底,就是学习训练样本的流形分布。
每一层神经网络的目的:学习当前层神经网络的输入或上一层神经网络的输出的分布。
机器学习(包含深度学习)的使用的基本假设:IID 独立同分布假设,就是训练数据集与测试数据集服从相同的分布。这是通过训练数据训练得到的模型能在测试数据上工作的一个基本保障。
深度学习中的IID 独立同分布假设:1)神经网络的训练集与测试集服从相同的分布。
2)神经网络每一次输入的mini-batch的样本都服从同一个分布。
每层神经网络的IID 独立同分布假设:鉴于每层神经网络的目的,我们希望每一层神经网络在每一次迭代时的输入都服从同一个分布,只有这样,这层神经网络才能有效学习这个分布。否则,如果一个神经网络每一次输入的都是服从不同分布的样本,那么,最后神经网络也不知道该学习哪个分布了,从而导致学习效果变差。
协变量漂移/偏移(Convariate Shift):一般是指训练集与测试集的分布不同,或每次迭代时输入层输入的样本服从的分布不同。
内部协变量漂移(Internal Convariate Shift):Internal 指的是深层网络的隐藏层。内部协变量漂移是指,针对深层神经网络的内部的某个隐藏层,它的输入数据是上一层神经网络的输出。而随着神经网络的训练,每一层神经网络的参数(包含上一层)是不断变化的,因此,即使上一层网络的输入服从相同的分布,经过网络参数的变化,上一层网络的输出数据与上一次迭代时的输出数据不再服从同一个分布。从而导致,当前层神经网络的当前次的输入数据与上一次迭代时的输入数据服从不同的分布。我们把这种现象叫做内部协变量漂移。最后用一句话描述就是:由于神经网络参数的不断变化,每一层隐藏层神经网络在每一次迭代时的输入数据都服从不同的分布,这种现象叫内部协变量漂移。(我这里倾向于把shift翻译为“漂移”而不是“偏移”,因为每次迭代时内部输入数据都服从不同的分布,所以“漂移”更形象)
(附)如何判断是否已经出现协变量漂移:MCC(Matthews correlation coefficient),这个指标本质上是用一个训练集数据和预测集数据之间的相关系数,取值在[-1,1]之间,如果是1就是强烈的正相关,0就是没有相关性,-1就是强烈的负相关。
2.梯度消失
批标准化可以使数据远离激活函数的极限饱和区。relu激活函数虽然不存在梯度消失的问题,但是把小于0的数值激活为0。批标准化可以减少被置零的数值的数目。
Batch Normalization的执行时机
在激活函数之前
Batch Normalization解决的问题
1. 内部协变量漂移
2. 梯度消失
3. 加快收敛速度,提升训练速度。
Relu 激活函数下仍有使用Batch Normalization的必要
参考:【深度学习】深入理解Batch Normalization批标准化
TensorFlow 中 Batch Normalization API 的一些坑
批标准化详解(Batch Normalization for Reducing Internal Covariate Shift)
深度模型中relu激活函数的不足,batch normalization怎么解决梯度消失爆炸的数值问题
标准化(BN)与激活函数
这篇关于对 BatchNormalization 中 Internal Convariate Shift 的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!