Contents
BN(Batch Normalization),批标准化。和普通的数据标准化类似, 是将分散的数据统一的一种做法, 也是优化神经网络的一种方法。
实际上在BN提出来之前,在神经网络训练开始前,我们都要对数据做一个归一化处理 ,这样可以使得输入x经过激活函数后数据分布继续保持一致,提升网络的泛化能力。如果不对输入数据做归一化处理,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度这也正是为什么我们需要对数据都要做一个归一化预处理的原因。 普通数据标准化中的特征标准话有两种,一种叫做 min max normalization, 他会将所有特征数据按比例缩放到0-1的这个取值区间. 有时也可以是-1到1的区间. 还有一种叫做 standard deviation normalization, 他会将所有特征数据缩放成 平均值为0, 方差为1。我这里以图像数据为例,列出两个标准化的代码。 min max normalization
img_array = cv2.imread('xxx.jpg')
img_array = img_array/255
standard deviation normalization
X -= np.mean(X, axis = 0) # zero-center, X is the array of image
X /= np.std(X, axis = 0) # normalize
BN可以防止“梯度弥散”(梯度消失),且批量归一化做的是将数据转化为单位高斯数据。 高斯化就是减去均值再除以标准差,通俗理解就是位移均值的距离,移动到以0为中心,然后用标准差进行缩放,从而得到高斯分布。
Google在ICML文中描述的非常清晰,即在每次SGD时,通过mini-batch来对相应的activation做规范化操作,使得结果(输出信号各个维度)的均值为0,方差为1. 而最后的“scale and shift”操作则是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入,(即当 \(\gamma^{(k)} = \sqrt{Var[x^{k}]},\beta ^{(k)} = E[x^{k}]\)),从而保证整个network的capacity。(有关capacity的解释:实际上BN可以看作是在原模型上加入的“新操作”,这个新操作很大可能会改变某层原来的输入。当然也可能不改变,不改变的时候就是“还原原来输入”。如此一来,既可以改变同时也可以保持原输入,那么模型的容纳能力(capacity)就提升了。)
(这里的公式是用MathJax写的,这是自己第一次在wordpress用MathJax手写公式,记录下。)
MathJax 是一个开源的基于 Ajax 的数学公式显示的解决方案,其最大的优势在于可以以基于文本的方式显示页面中的数学公式。结合多种先进的Web技术,支持几乎所有的主流浏览器。MathJax 可以在HTML页面中,为LaTex数据和MathML数学公式提供了一个切实可行的的解决方案,支持Tex和LaTex、MathML、ASCIIMathML语言,拥有丰富的API接口。根据页面中定义的 LaTex 数据,便可生成对应的数学公式。
BN的两个参数\(\gamma, \beta \)的学习是通过链式法则(chain rule)计算的,计算公式如下:
bn参数如何学习
这里,我也不是很懂,直接搬运魏秀参大佬在知乎上的回答。
魏秀参在知乎上的回答
论文原文里面是“weights -> batchnorm -> activation -> weights -> batchnorm -> activation -> dropout”。原文认为这样可以利用到激活函数的不同区间(sigmoid的两个饱和区、中间的线性区等)实现不同的非线性效果,在特定的情况下也可能学习到一个恒等变换的batchnorm,一般用这个即可。 总的来说BN可以应用于网络中任意的activation set,根据我查的资料,一般都是放在激活函数的前面,至于在FCN和CNN怎么应用,可能还需要自己的经验吧,毕竟这也相当于超参数调整了。
莫烦-BN标准化 深度学习中 Batch Normalization为什么效果好-魏秀参回答 深度学习推理时融合BN,轻松获得约5%的提速