Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

BN要解决什么问题?

普通的SGD 学习速度慢,主要是因为1,艰难地调参(初始化)2.只能用比较小的learning rate 3.容易陷入gradient vanish的问题中 
btw. 3是2的部分原因(2的另一部分原因是grad的方向曲曲折折走了很多相互抵消的“路”),3更大的问题learning 会停在local minima就不动了,没找到global minima。

paper作者认为只要解决了internal co-variate shift的问题就会改善上面提到的三个问题。
那什么是internal co-variate shift,想象network中的两层layer,就叫layer1和layer2吧,layer1和layer2间的parameter(W和bias)改变的话会会导致input of layer(Wx+b)发生比较大的改变,这种现象就是internal co-variate shift。internal co-variate shift是我们不希望看到的,为什么?

看上面这个式子,如果Xi基本不怎么改变的话,那么上式中的grad求和是不是就变化不是特别大了。如果每次迭代Xi都有比较大的变化(即internal co-variate shift)的话,那么上式的在不同迭代步grad求和就可能时大时小,直观上你可以理解成,如果theta(也就是我上面说的W和bias)就可以往相对稳定的某个方向走向global mini,而不是曲曲折折来来回回地扭曲到global mini.这是解释同一个theta在不同迭代步中的表现,那在同一个迭代步中呢,如果不同维Xi基本都是同样的数据分布的话,是不是同一层中的theta的gard差不多大。还有就是BN缓解了gradient vanish 问题(这个待会解释)也就是不同layer间的grad的差别也变小了。因为传统的SGD一般是将就最小的grad选的learning rate(grad小一般要小的了learning rate),现在各个layer间的grad差别变小了,我们就可以用相对大的learning rate了。

Ps:上面这段逻辑是:learning rate可以增加是 因为BN同时缓解了internal co-variate shift和gradient vanish,其实还有后面要提到的对scale of parameter 的弹性(也是由BN带来的)也对放心用大的learning rate也有贡献。

 (看完最后再来看这里也行)先理清一下  为什么BN能Accelerating Deep Network Training BN?一方面是Reducing Internal Co-variate Shift带来的grad方向的稳定前进,另一方面是learning rate的增加,而放心让learning rate的增加 是因为由Reducing Internal Co-variate Shift、Reducing gradient vanish以及对 scale of parameter 有弹性三者共同保证的,这三者都是靠BN来达到的。
到此我们至少知道我们想要解决internal co-variate shift这个问题。能不能解决gradient vanish和对scale of parameter有弹性再说。
好,我们怎么解决internal co-variate shift?
用batch normalization

怎么解决的?(即BN的步骤是啥?)


很简单的思想,就是对每一批样本求均值方差,然后用normalize公式。以上这个过程叫做BN,那么把这个BN当作一个layer加在activation function层前就好了。
注意到后来又scale 了(gama)和shift(beta)了,是考虑到BN会把input of layer 映射到某个【-1,1】这个区间在activation function中只有中间近似一段线性的,我们肯定是不希望出现这种情况,首先是因为activation function本身就不能是线性的(只有非线性的函数组合才能近似任意函数,线性的任意组合还是线性的),其次BN相当于人为地将distribution变成【-1,0】一半,【0,1】一半,总之这样一定程度上丧失了activation function 的表征能力,那么我们scale+shift,这样就能让模型某些神经元是否需要normalization,或者只是某种程度上的normlazation.
notice: gama和beta也是需要学习的 就把它们当成是W和bias一样的parameter来学习,用 SGD,不过此时模型是加了norm层的模型了

btw: epsion就只是避免程序运行中分母=0
一批一批的放数据,等模型的参数都学习完后?怎么predict test data呢?
因为考虑到很多时候要predict的test data 的数据并不是很多,极端一点一次就只有一个,那么就没有batch来让你求mean 和var.把仅有的这个数据当成一个batch,想法可以,但是又一个问题,就是当你norm之后会变成0(大部分维)了,那么经过activation function就会变成0.5然后继续到下一层input变成零······。这个过程无论输入的test data是怎样的不同,predict 结果都是一样的,我们当然不希望这样。
那么我们想的办法就是 test time的mean和var用所有train data的计算来的mean 和 var
为了程序方便,实际中用的是 moving averages 



BN有什么好处?BN为什么能有这些好处?

这里补充解释一下前面提到的Reducing gradient vanish已经对 scale of parameter 有弹性
Reducing gradient vanish:是因为input of layer的范围几乎scale到【-1,1】,可以看到这在sigmoid function中几乎是不容易达到saturate 的部分的,所以比较难以因为sigmoid求导后为零而导致gradient vanish

scale of parameter 有弹性:先看公式

这三个公式都可看出无论parameter 大小对接近其后的layer的input都没啥区别,而且大的parameter甚至导致紧接其后layer 的input的变化比小parameter的带来的变化还有小一些,就是说不怕大的parameter带来更大的 Internal co-variate Shift。而大的learning rate在普通的SGD(without BN)一般会带来大的parameter,以及大的parameter带来更严重的 Internal co-variate Shift,现在不用担心了,安心用大的learning rate吧!没事的!

以下总结BN的优势:

1.可以用更大的learning rate(因为Reducing Internal co-variate Shift、Reducing gradient vanish以及对 scale of parameter 有弹性三者的功劳),迭代次数减少了(步长增加迭代次数自然减少),学习速度提高了14倍左右 

2.对初始参数的依赖降低,不用艰难调参(个人觉得是因为缓解了gradient  vanish,导致不容易收敛到local mini,更倾向收敛于global mini,所以对初始值的依赖降低了,不知道大家有没有别的看法)

3.gradient vanish 问题得到缓解(更有可能得到global mini 而不是local mini )

4. accuracy 提高了(因为更有可能得到global mini 而不是local mini)

5.Remove Local Response Normalization (BN本身就是normalization了,不需要再多一个了)

6.Reduce the photometric distortions (需要迭代的次数降低了,那么就不需要那么多样本了,当然自然也不需要那么多人工distort的样本了了)

7.Reduce the L2 weight regularization /Remove Dropout (不懂为什么会有regularization的功能)


讨论:

1.想知道单纯的norm将distribution变到mean=0,var=1的distribution.到底对实验的performance(除了训练速度,比如说accuracy)有何影响?
设计实验:用Relu,有normalization但是没有scale+shift 和普通的Relu 模型对比。
因为我总觉得人为地将input 的distribution normalize的那么均匀是有问题的,除了他对activation function表征能力削弱,因为Relu中并没有削弱表征能力,任然是<0的部分activation =0,>0的部分activation=input,最大的不同是人为的将distribution 变得均匀。
2.不知道为什么 SGD with batch normalization 有regularization的功能,是因为mini-batch 吗?但是普通的SGD也是mini-batch ,为什么没提到它的regularization的功能?
3.对初始参数的依赖降低,不用艰难调参(个人觉得是因为缓解了gradient  vanish,导致不容易收敛到local mini,更倾向收敛于global mini,所以对初始值的依赖降低了,不知道大家有没有别的看法)



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值