https://www.cnblogs.com/itmorn/p/11241236.html
网络层中BN层的作用
https://zhuanlan.zhihu.com/p/75603087
对比机器学习的标准归一化
相同点:进行标准归一化的公式相同,都是减去均值除以方差;测试的时候都是使用的训练集的均值和方差进行归一化。
预测时均值和方差怎么求?
在训练时,我们会对同一批的数据的均值和方差进行求解,进而进行归一化操作。但是对于预测时我们的均值和方差怎么求呢?比如我们预测单个样本时,那还怎么求均值和方法呀!实际上在模型训练时我们就记录下每个batch下的均值和方差,待训练完毕后,我们求整个训练样本的均值和方差期望值,作为我们进行预测时进行BN的均值和方差。
不同点:机器学习使用的是全部数据的均值方差,归一化一次,只有一个μ和σ;BN使用的是每批次的数据,可以在每一层激活函数前都可以进行归一化,有多个μ和σ。
为什么要再缩放平移:
1、但这个处理对于在-11之间的梯度变化不大的激活函数,效果不仅不好,反而更差。比如sigmoid函数,s函数在-11之间几乎是线性,BN变换后就没有达到非线性变换的目的;而对于relu,效果会更差,因为会有一半的置零。总之换言之,减均值除方差操作后可能会削弱网络的性能。
缩放加移位:避免线性区
因此,必须进行一些转换才能将分布从0移开。使用缩放因子γ和移位因子β来执行此操作。
2、对净输入
m
a
t
h
b
f
z
(
l
)
mathbf{z}^{(l)}
mathbfz(l)的标准归一化会使得其取值集中到0附近,如果使用sigmoid激活函数时,这个取值区间刚好是接近线性变换区间,从而减弱了神经网络非线性变换的性质。因此,为了使归一化操作不对网络的表示能力造成负面影响,可以通过一个附加的缩放和平移变换改变取值区间。
https://baijiahao.baidu.com/s?id=1621528466443988599&wfr=spider&for=pc
https://blog.csdn.net/Yasin0/article/details/93379629
进一步解释:
BN的作用其实简单来说就是把隐层神经元激活输入从各种分布,拉回到【均值为0方差为1的分布】(限定数据,不一定是正态分布)。经过这个变换后某个神经元的激活x形成了均值为0,方差为1的正态分布,目的是把值往后续要进行的非线性变换的线性区拉动,增大导数值,增强反向传播信息流动性,加快训练收敛速度。
但是又出现了一个问题,如果都通过BNBN实现归一化的话,不就是把非线性函数替换成线性函数了?这意味着什么呢?这就要说到我们深度学习的学习过程是怎么实现的了,即通过多层非线性实现一个泛化的过程。如果是多层的线性函数其实这个深层就没有任何的意义,因为多层线性网络和一层线性网络是等价的。这意味着网络的表达能力下降了,也就是意味着深度的意义就没有了。所以BNBN为了保证非线性的获得,对变换后的满足【均值为0方差为1的正态分布】的x又进行了scale+shiftscale+shift操作。每个神经元增加了两个参数scalescale和shiftshift,这两个参数通过训练学习到的,关键就是在线性和非线性之间找到一个比较好的平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。最不济的情况,这两个参数可以等效成最开始的状态,也就是训练数据集本来的特征,这只是需要简单的计算就可以实现。
BN的本质就是利用优化变一下方差大小和均值位置,使得新的分布更切合数据的真实分布,保证模型的非线性表达能力。
CNN中BN的原理和使用
https://blog.csdn.net/qq_41994006/article/details/82792771
BN的步骤 \CNN中的BN
https://www.cnblogs.com/skyfsm/p/8453498.html
BN 的使用过程(含计算过程)
https://blog.csdn.net/m0_37192554/article/details/81981295