Batch Normalization: Accelerating Deep Network Training b y Reducing Internal Covariate Shift论文解读

论文:链接

前言

机器学习中有个很重要的假设:IID 独立同分布假设,就是假设训练数据和测试数据是满足相同的分布,这是通过训练数据获得的模型在测试数据上表现效果好的一个基本保障,也就是说模型的泛化能力。那BatchNorm的作用是什么呢?BatchNorm就是在深度神经网络的训练过程中使得每一层神经网络的输入保持相同的分布。

其实BatchNorm的提出也是为了解决深度神经网络训练困难的问题,像Relu、residual network也是为了解决这一问题的。

Q:为什么深度神经网络随着网络深度的加深,训练起来越困难,收敛越来越慢?

一、BN的提出

1、internal covariate shift

【We define Internal Covariate Shift as the change in the distribution of network activations due to the change in network parameters during training.】
论文中作者提出在训练深度神经网络时经常会出现训练困难的问题,因为每一层参数迭代更新后,上一层网络的输出经过这一层网络的计算,数据的分布会发生变化,因此为下一层网络的学习带来困难。

在深度学习中包含很多隐藏层,在训练过程中,各层的参数不停的在变化,所以每个隐藏层都面临着covariate shift,也就是说在训练过程中,隐藏层的输入分布总是在变化,这也就违背了上面所说的IID。这一过程就是"Internal Covariate Shift",Internal 是指深层网络的隐藏层,是指发生在网络结构内部的,而covariate shift只发生在输入层。

既然有了上面的问题,那能不能让每个隐层节点的输入分布固定下来呢?

根据图像处理中图像的白化操作(对输入数据的分布变换到0均值,单位方差的正态分布)能加快神经网络的收敛速度这一思想,图像是神经网络的输入层,做白化能加快收敛,那么对于神经网络的内部,某个隐层的神经元是下一层的输入,也就是说相对于下一层网络结构来说,每一个隐层都是输入,那能不能对每一个隐层做白化操作呢。所以作者提出BatchNorm方法,可以理解为对深层神经网络每个隐层神经元做简化版本的白化操作。

二、BN的思想

神经网络在做非线性变换前的激活输入值(WX+B)随着神经网络的加深或者在输入训练过程中,其分布逐渐发生偏移或移动,之所以训练收敛慢,一般是整理分布逐渐往非线性函数取值区间的上下限两端靠近,所以这将导致反向传播时低层神经网络的梯度消失,这是训练神经网络收敛越来越慢的本质原因。而BN的本质就是把每层神经元激活输入值的分布通过一定的操作,使其变为均值为0,方差为1的标准正态分布(这个其实后面还有shift和scale)。这样使得激活输入值落到非线性函数对输入比较敏感的区域,这样输入小的变化就会引起损失函数大的变化,这样就会使得梯度变大,避免了梯度消失问题的产生,而且梯度大意味着学习收敛快,也加快了学习收敛速度。

三、训练阶段实现BN

在Mini-Batch中如何做SGD?
假设对一个深层神经网络,其中的两层结构如下:
在这里插入图片描述
对每个隐层神经元的输入值加入BN,它位于X=WU+B激活值获得之后,非线性函数变换之前,其图示如下:
在这里插入图片描述
对于Mini-Batch SGD来说,一次训练过程里面包含m个训练实例,其具体BN操作就是对于隐层内每个神经元的激活值来说,进行如下变换:
在这里插入图片描述
:这里t层的某个神经元x(k)不是t-1层神经元的输出,而是t层神经元的线性激活x=WU+B,这里的U才是t-1层神经元的输出值。上式公式为:某个神经元对应的原始的激活x通过减去mini-Batch内m个实例获得的m个激活x求得的均值E(x)并除以求得的方差Var(x)来进行转换。

经过上式变换后把某个神经元的激活值X的分布变换到均值为0,方差为1的标准正态分布,而对于激活函数tanh或者sigmoid函数,在0附近近似线性,这就相当于又增加了一层线性结构(起不到非线性的作用),所以在每个神经元在增加两个可学习参数shift和scale,来增强网络的表达能力。即进行如下变换:
在这里插入图片描述
BN的具体操作,如下:
在这里插入图片描述
其反向传播的过程为:
在这里插入图片描述

四、测试阶段实现BN

BN在训练过程中可以根据mini-batch中的m个实例进行激活值的调整,而在测试阶段输入只有一个实例,一个实例是没法求出均值和方差的。
所以在训练阶段是从所有实例中获得的统计量来代替从mini-batch获得的均值和方差统计量,决定了获得均值和方差的范围,那么要如何获得均值和方差呢。
每次做Mini-Batch训练时,都会有每个Mini-Batch里m个训练实例获得的均值和方差,现在要全局统计量,只要把每个Mini-Batch的均值和方差统计量记住,然后对这些均值和方差求其对应的数学期望即可得出全局统计量,即:
在这里插入图片描述
有了均值和方差,每个隐层神经元也已经有对应训练好的Scaling参数和Shift参数,就可以在推导的时候对每个神经元的激活数据计算NB进行变换了,在推理过程中进行BN采取如下方式:
在这里插入图片描述
这个公式其实是和训练时
在这里插入图片描述
等价的。
在测试过程中,对每个节点均值和方差是固定的,这个值可以事先计算好,如果隐层的节点较多的话可以减少计算量。
在这里插入图片描述

五、BN的优点

①不仅仅极大提升了训练速度,收敛过程大大加快;②还能增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;③另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值