理解深度学习中Batch Normalization

首先来看下LRN

下面是借鉴知乎某位大神的讲解

什么是 Local Response Normalization(LRN)

​ 我们都知道,Normalization是深度神经网络中一项最常用也是最终要的技术之一。早在Alexnet时代,Normalization便已经被应用到了视觉分类任务中,也就是本节所要介绍的LRN。虽然后来的BN的出现,逐渐替代了LRN,但是在这里也简单地介绍以下。说到为什么要使用LRN就不得不提到神经生物学中的一个概念叫做 lateral inhibition(横向抑制),简单来讲就是兴奋的神经细胞抑制周围神经细胞的能力。应用到深度神经网络中,这种横向抑制的目的是进行局部对比度增强,以便将局部特征在下一层得到表达。

​ LRN是一个非训练层,即该层中不存在可训练的参数。假设某一个CNN层的输出为一个 WxHxC 的张量,要对该张量做LRN我们应该怎么做呢。假设我们取n的大小为3,现在我们要计算(x, y, i)位置上 LRN 后的值,我们便可以以 (x,y, i)点位中心,在channel维度范围内取一个1xn大小的网格,此时我们便可以通过(x, y, i)位置的数值和其周围的数值对(x, y, i)位置进行正则化,具体计算公式如下

其中 i 表示第 i 个通道,x,y分别表示在宽高维度所在的位置。 (k,α,β,n) 这些皆为超参数,其中k是为了防止除0的情况发生,α,β为常数,n为邻域的长度。边界情况则用0补齐。假设某个网格里面的数据长这样:[1,2,4],并且令 (k,α, β, n)=(0,1,1,N) (N为通道数), 则通过公式我们可以计算出

取一个3x3x4的Feature map进行LRN操作,效果如图所示(其中不同的颜色代表不同的通道,总的通道数为4。我们设置超参数 (k,α, β, n)=(0,1,1,2)

那么使用LRN对我们的卷积神经网络有多大的提升呢。Alexnet论文中有这么一段话

Response normalization reduces our top-1 and top-5 error rates by 1.4% and 1.2%, respectively. We also verified the effectiveness of this scheme on the CIFAR-10 dataset: a four-layer CNN achieved a 13% test error rate without normalization and 11% with normalization3

也就是说在Imagenet数据集上获得了%1.4左右的提升,在CIFAR数据集上获得了2%的提升。提升效果还是比较明显。

 

 

什么是Batch Normalization

顾名思义,batch normalization嘛,就是“批规范化”。

​ 如图所示,feature map: [公式] 包含 N 个样本,每个样本通道数为 C,高为 H,宽为 W。对其求均值和方差时,将在 N、H、W上操作,而保留通道 C 的维度。具体来说,就是把第1个样本的第1个通道,加上第2个样本第1个通道 ...... 加上第 N 个样本第1个通道,求平均,得到通道 1 的均值。对所有通道都施加一遍这个操作,就得到了所有通道的均值和方差。具体公式为:

​ 最后我们将每个pixel对应的值减去均值,除以方差,就得到了规范化的结果。在此基础上,BN还增加了两个可训练的参数 γ,β。所以最终的表达式为:

预测阶段要怎么做BN

我们知道BN在每一层计算的 [公式] 与 [公式] 都是基于当前batch中的训练数据,但是这就带来了一个问题:我们在预测阶段,有可能只需要预测一个样本或很少的样本,没有像训练样本中那么多的数据,此时 [公式] 与 [公式] 的计算一定是有偏估计,这个时候我们该如何进行计算呢?

利用BN训练好模型后,我们保留了每组mini-batch训练数据在网络中每一层的 [公式] 与 [公式] 。此时我们使用整个样本的统计量来对Test数据进行归一化,具体来说使用均值与方差的无偏估计:

得到每个特征的均值与方差的无偏估计后,我们对test数据采用同样的normalization方法:

在实际计算的过程中,我们并不会保留训练过程中的所有历史值,再求平均,因为训练早期模型为收敛时的值没有太大的价值,甚至会干扰对均值和方差的估计。因此我们可以加入一个momentum参数。 该参数作用于mean和variance的计算上,这里保留了历史batch里的mean和variance值,借鉴优化算法里的momentum算法将历史batch里的mean和variance的作用延续到当前batch。一般momentum的值为0.9 , 0.99等. 多个batch后, 即多个0.9连乘后,最早的batch的影响会变弱。

而最后的“scale and shift”操作则是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入(即当 [公式] ),从而保证整个network的capacity。(有关capacity的解释:实际上BN可以看作是在原模型上加入的“新操作”,这个新操作很大可能会改变某层原来的输入。当然也可能不改变,不改变的时候就是“还原原来输入”。如此一来,既可以改变同时也可以保持原输入,那么模型的容纳能力(capacity)就提升了。)

 

 

 

 

[公式]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值