详细可见paper《Batch Normalization: Accelerating Deep Network Training by Reducing Internet Covariate Shift》,2015
Make different features have the same scaling.
不管你是不是需要deep learning,你通常都会用到这个技术。
为什么要feature scaling?
现在的输入往往每一个input feature的每一个维度都会有不同的scale,但是如果他们scale差距很大时,将w1,w2和Loss拿出来作图,我们可以看出如果想要x1,x2对结果的影响一样的那么w1的scale较大、w2的scale较小。w1对结果的影响较大,w2对结果的影响较小。
如果把不同的feature做scaling,make different features have the same scaling,那么它的error surface接近于正圆。
然而椭圆形的error surface在不同的方向上gradient变化不同,在不同的方向上需要给其不同的learning rate,这会让我们的training变得不容易。如果我们做feature scaling,会让我们的error surface变得接近正圆,从而使我们的training变得容易。
所以我们进行feature scaling。
给了R批Data,然后去计算同一纬度下的mean和standard deviation,然后对每一个数值进行计算(见下图)
通常来说,我们做了feature scaling后,会让我们的training 变得快速。
对每一个layer做feature scaling对Deep learning上是由很大作用的,他会让internal covariate shift(内部协方差平移)问题轻微一些。
internal covariate shift(内部协方差平移)问题:
假设下图中当一个人两边的的话筒连在一起时,整个network才能得到好的processing。
下图,图一中,第二个人左手边的话筒高于右手边话筒,所以第一个人告诉第二个人要把话筒放低一些,第三个人告诉第二个人要把话筒放高一些,当两个都变时,结果会导致图二的现象。
为了解决这个问题,传统的方法是Learning rate设置的小一些,但是会导致training很慢。
然而batch normalization可以解决这个问题。
如果我们对每一个layer都做feature scaling,那么对下一个layer来说前一个layer的statistic就会是固定的,那么他的training可能就会更容易一些。
但每一个layer的output,它的mean和standard divation在不断的变化中,因为在整个training的过程中network的参数都是不断变化的。所以,我们没有很简单的办法一下子知道mean和standard divation为多少。
所以我们需要一个新的技术,即batch normalization。
x1,x2,x3是平行计算的
z——activation function input
a——activation function output
normalization 可以apply在activation function 的input/output,但现在比较多的是对activation function的input做normalization。
在做batch normaliztion的时候,我们希望mean和standard divation代表了整个training set的satistic,这就要求我们的batch不能太小。
这里“除”是element-wise(仅对应元素操作),mean和standard divation都是vector。
How to do backpropogation?
此时相当于多了两层(mean和standard divation),反向传播的时候也要传这两层。
有时候,你并不希望你得activation function input的 mean=0, standard divation = 1,所以你可以做以下操作,同时也会跟随网络更新。
mean和standard divation受data影响,β和γ是network学出来的。
在Testing时怎么做?
测试集中的mean和standard divation来自哪里?
理想的方法是using the whole training dataset,但是有时数据集过大,或者没有整合整个数据集。
所以较为实用的方法是:把过去所以的参数记录下来,取平均,但往往我们回给每个值不同的weight,training接近结束的地方的weight比较大。