深度学习中的Batch Normalization

很早就打算写这篇博客了,最近遇到的问题比较多,所以拖了又拖,今天问题似乎解决了,等着程序运行的时候再来回顾一下Batch Normalization算法。 
Batch Normalization是2015年Google研究员在论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》一文中提出的,同时也将BN应用到了2014年的GoogLeNet上,也就是Inception-v2。 
BN算法在很大程度上加速了训练过程,放宽了网络初始化的条件,论文中还提出有了BN可以在不使用Dropout,同时也可以在一定程度上提升网络的识别效果,在之后的ResNet等等新网络中有广泛的应用。 
下面我们来详细的看一下BN算法。

1. 要解决的问题

自从2012年以来,CNN网络模型取得了非常大的进步,而这些进步的推动条件往往就是模型深度的增加。从AlexNet的几层,到VGG和GoogleNet的十几层,甚至到ResNet的上百层,网络模型不断加深,取得的效果也越来越好,然而网络越深往往就越难以训练。我们知道,CNN网络在训练的过程中,前一层的参数变化影响着后面层的变化(因为前面层的输出是后面的输入),而且这种影响会随着网络深度的增加而不断放大。在CNN训练时,绝大多数都采用mini-batch使用随机梯度下降算法进行训练,那么随着输入数据的不断变化,以及网络中参数不断调整,网络的各层输入数据的分布则会不断变化,那么各层在训练的过程中就需要不断的改变以适应这种新的数据分布,从而造成网络训练困难,难以拟合的问题。
(可以这样想,比如网络中每一层都是一个人,今天前面一层的人说要你往左走3,明天有让你往左走2,第三天又让你往右走5,结果三天下来,你还在原地,这样就让你的进度变慢了。PS:我是这样理解的,如有问题,请指出) 
BN算法解决的就是这样的问题,他通过对每一层的输入进行归一化,保证每层的输入数据分布是稳定的,从而达到加速训练的目的。

2. BN算法流程

BN就是在神经网络的训练过程中对每层的输入数据加一个标准化处理。 
这里写图片描述

传统的神经网络,只是在将样本xx输入输入层之前对xx进行标准化处理(减均值,除标准差),以降低样本间的差异性。BN是在此基础上,不仅仅只对输入层的输入数据xx进行标准化,还对每个隐藏层的输入进行标准化。

这里写图片描述



BN算法的理论推导我这里就不多说了(原因是理解的不透彻= =),这里只讲一下算法的流程。 

首先,BN算法在每一次iteration中的每一层输入都进行了归一化,将输入数据的分布归一化为均值为0,方差为1的分布,如下式:
x^(k)=xkE[xk]Var[xk]x^(k)=xk−E[xk]Var[xk]
其中, xkxk 表示输入数据的第 kk 维, E[xk]E[xk] 表示该维的平均值, Var[xk]+ϵVar[xk]+ϵ 表示标准差。 
但是这种做法有一个致命的缺点,尽管这样把每层的数据分布都固定了,但是这种分布不一定是前面一层的要学习到的数据分布,这样强行归一化就会破坏掉刚刚学习到的特征,BN算法的第二步就解决了这个缺点。 
BN算法在第二步中设置了两个可学习的变量 γγ ββ ,然后用这两个可学习的变量去还原上一层应该学到的数据分布
y(k)=γkx^(k)+β(k)y(k)=γkx^(k)+β(k)
添加这种操作的目的就是还原出上一层需要学习的数据分布,这样 BN就把原来不固定的数据分布全部转换为固定的数据分布,而这种数据分布恰恰就是要学习到的分布 ,从而加速了网络的训练。BN算法的流程如下图所示: 


这里写图片描述 

2.1 BN算法在训练和测试时的应用

BN算法在训练时的操作就如我们上面所说,首先提取每次迭代时的每个mini-batch的平均值和方差进行归一化,再通过两个可学习的变量恢复要学习的特征。 
但是在实际应用时就没有mini-batch了,那么BN算法怎样进行归一化呢?实际上在测试的过程中,BN算法的参数就已经固定好了,首先进行归一化时的平均值和方差分别为:

E[x]=EB[μB]E[x]=EB[μB]
Var[x]=mm1EB[σ2B]Var[x]=mm−1EB[σB2]
即平均值为所有mini-batch的平均值的平均值,而方差为每个batch的方差的无偏估计(无偏估计介绍见 什么是无偏估计?——知乎  
最终BN算法的训练和测试的流程如下图所示: 


这里写图片描述 

2.2 BN算法在CNN中的应用

BN算法在CNN中往往放在每个卷积层之后,ReLU操作之前。在CNN中操作时,BN算法把每个特征图看作一个神经元,计算该特征图对应数据的均值和方差进行归一化,并且每个特征图对应两个学习变量γγββ。详细介绍见http://blog.csdn.net/hjimce/article/details/50866313中关于BN在CNN中的使用方法介绍。 
最后介绍一下BN在Caffe中的使用

layer {
  bottom: "Convolution1"
  top: "Convolution1"
  name: "bn1"
  type: "BatchNorm"
  batch_norm_param {
    use_global_stats: true
  }
  include {
    phase: TEST
  }
}
layer {
  bottom: "Convolution1"
  top: "Convolution1"
  name: "bn1"
  type: "BatchNorm"
  include {
    phase: TRAIN
  }
}
layer {
  bottom: "Convolution1"
  top: "Convolution1"
  name: "scale1"
  type: "Scale"
  scale_param {
    bias_term: true
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

Caffe中并没有实现BN层分为两个部分BatchNorm和Scale层,其中BatchNorm又根据use_global_stats的值分为两种,use_global_stats为true时该层的参数保持不变,这种应该应用在test的情况下,而train的过程中要保证use_global_stats一定不为true,当然,默认情况下use_global_stats为false。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值