深度神经网络中BN(Batch Norm)的理解

BN的启发来源

之前的研究表明在图像处理中,对输入的图像进行白化(Whiten),就是对输入数据分布变换到0 均值,单位方差的正态分布,那么神经网络就会较快收敛。在神经网络中,相对下一层来说,每一个隐层都是输入层,那么能不能对每个隐层都做白化呢?这就是启发BN产生的原初想法,可以理解为对深层神经网络每个隐层神经元的激活值做简化版本的白化操作。

本质思想

深层神经网络在做非线性变换前的激活输入值随着网络深度的加深或在训练过程中,其分布逐渐发生偏移或变动,之所以收敛慢,一般是整体分布逐渐往非线性函数取值区间的上下限两端靠近,导致反向传播时低层神经网络的梯度消失。而**BN的思想就是对于每一个隐层神经元,把越来越偏的分布强制拉回到均值为0,方差为1的比较标准的分布,使得输入值落在非线性函数对输入值比较敏感的区域。**这样输入的小变化就会导致损失函数较大的变化,避免梯度消失问题,加快训练收敛过程。

训练过程如何做BN

对于Mini-Batch SGD来说,一次训练过程包含m个训练实例,其具体BN操作就是对于隐层内每个神经元的激活值来说,进行如下变换:深度神经网络中BN(Batch Norm)的理解_第1张图片
变换的意思是:某个神经元对应的原始的激活x通过减去mini-Batch内m个实例获得的m个激活x求得的均值E(x)并除以求得的方差Var(x)来进行转换。

Batch Normalization网络层的前向传播过程
深度神经网络中BN(Batch Norm)的理解_第2张图片
BN变换加快收敛的同时也会导致网络表达能力下降,为了防止这一点,每个神经元增加两个调节参数(scale和shift),这两个参数是通过训练来学习到的,用来对变换后的激活反变换,使得网络表达能力增强,即对变换后的激活进行如上图所示黑框中的scale和shift操作,这其实是变换的反操作:
在这里插入图片描述

推理(Inference)过程如何做BN

BN在训练的时候可以根据Mini-Batch里的若干训练实例进行激活数值调整,但是在推理(inference)的过程中,输入就只有一个实例,看不到Mini-Batch其它实例,如何获取均值E(x)和方差Var(x)。可以直接用全局统计量(所有的训练实例参与计算),即每次做Mini-Batch训练时,把每个Mini-Batch的均值和方差统计量记住,然后对这些均值和方差求其对应的数学期望即可得出全局统计量。

为了让激活函数更有效地使用输入信息,一般BN放在卷积层之后,激活函数之前。
参考博客:https://www.cnblogs.com/eilearn/p/9780696.html

你可能感兴趣的:(机器学习深度学习,深度学习,神经网络)