Batch Normalization

# Batch Normalization
优点:
1. 减少训练时间,使得更深的网络可训练:
    * 由于更小的 internal covariate shift,可以使用更大的learning rate;
    * 缓解梯度消失问题(对于sigmoid,tanh等).
2. 对于数据的初始化敏感度更低.
3.  减少overfitting的可能(因此也不需要太多的regularization).


## I. Main Idea
###1. What
![-w964](media/15501138084045/15501138223364.jpg)
若不对输入数据作scaling,数据的量级差异会有以下麻烦:
1. 假设w1, w2对输入的影响一样,那么x2由于变化差异大,对loss的影响很大。
2. 而因此就需要对x输入的不同维度设置不同的learning rate: 比如w1更大一点,w2更小一点。

所以将输入数据scale之后得到圆形的loss,将会容易train很多。

###2. How to scale
![-w889](media/15501138084045/15501943702744.jpg)
很简单,直接在每一个维度中求得各自的mean和std,然后再将每一个数据进行normalized。

##II. BN in Hidden Layers

###2.1 Why Batch Normalization
* 可以解决Internal Covariate Shift。在train的时候,Internal Covariate Shift可以想象在几个人的拉传播系统,当第一个人让第二个人调低左喇叭和第三个人让第二个人拉高右喇叭的时候,就可能会出现调整过        度的问题,因为每一次喇叭的调整都是基于另一个喇叭还没调整之前的位置。
    这个问题可以通过较小的learning rate解决, 但是这样会使得学习太慢。
* 所以我们可以在每一层都用normalization,使得数据都在同一个范围内,就可以缓解这个问题了,同时可以使用较大的learning rate。但一个问题是每一层的输入不像第一次是固定的,因为weight总在调整,所以每一层的mean和std都是变化的,怎么解决?  就用到Batch Normalization.
![-w955](media/15501138084045/15501948485092.jpg)
* 先说一下GPU为什么比CPU快, GPU每次进行运算是将所有的输入vector(以batch为单位打包)打包成matrix,再进行matrix平行运算。
![-w863](media/15501138084045/15501957684351.jpg)


* 通常是将经过线性变换W之后,进入activation之前进行normalized,原因是因为activation通常都有situation area,如果input落在这个area就会出现梯度消失(gradient vanished)的问题。所以我们比较希望input落在零的附近,即梯度比较大的地方。

* 而进行normalized的时候,由于W是变化的,如果用整体数据来算每一次layer输入的normalized,计算量巨大,不切实际。因此就把数据切为小份,进行batch normalization。而由大数定理可知,要使得计算每一次的mean 和std都比较准确,都需要比较大量的数据,因此batch不能太小.
![-w891](media/15501138084045/15501961428454.jpg)

* 因此如果用了BN,在BP的时候还要考虑mean和std,因此BP考虑的是整个batch 数据,而不是传统的单个数据。所以打印torch的model参数会出现running_mean和running_var。
![-w729](media/15501138084045/15501969009342.jpg)


* 如果某些activation要求输入数据的Mean和std的不是0和1,可以再加一层线性变换\beta和/gamma,这两个参数也是网络自己学出来的。(有的人会有疑问如果beta等于mean,gamma等于std的时候,输入到activation的数据不就是原本的数据了吗?首先这种巧合不太可能。其次在这里beta和gamma是自己学出来的,与输入数据没有直接关系,而mean和theta是与输入数据有直接关系的)
![-w755](media/15501138084045/15501972496990.jpg)

* Test Stage
由于testing的时候不是batch test的,所以无法计算test的输入数据normalized。
    1)  一个理想的方案:因为已经train完了,所以可以直接用所有数据输入到网络计算每一层的mean和std。但又有问题:数据量太大则无法进行。
    2) 一个可行的方案:每次计算mean的时候都保存起来,再求mean的mean,继而求std。但因为train的时候,由于weight在不断变化,mean的也在变化,因此越后期的mean越为准确。所以计算mean的mean时,可以给更大的权重给后期的mean。
    ![-w747](media/15501138084045/15501985894429.jpg)
    
    
##III. BN Benefit
![-w735](media/15501138084045/15501992661899.jpg)

## IV. Pytorch Implementation
![-w875](media/15501138084045/15502013679203.jpg)
![-w823](media/15501138084045/15502013821202.jpg)

https://pytorch.org/docs/stable/nn.html#batchnorm2d


## V. 说明
感谢李宏毅老师的视频讲解。链接:https://www.youtube.com/watch?v=BZh1ltr5Rkg

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值