introduction
最近读了提出batch normalization 的文章,是想 了解batch normalization 算法创建的思考过程。还是有些细节没弄懂,在这里记录下。
文章主要讲了batch normalization 主要想解决的问题,也就是internal covariate shift。文章接着分析了两种不太可行的batch normalization的思路,并分析了他们为什么不可行。 接下来,文章提出了正统的batch normalization算法,并介绍了如何对它做bp。最后,文章介绍了batch normalization的其他好处,例如加快学习速度,省却dropout操作等。
Towards Reducing Internal Covariate Shift
Internal Covariate Shift是指当网络参数不断变化时,不同层的activation 分布也随之变化。这所带来的坏处基本有两点。第一点是会使得网络不断地去适应新的分布,带来学习难度;第二点是当我们使用类似sigmoid的激活函数时,当输入分布不是0均值时,会容易进入非线性区,这会容易导致梯度消失或者降低训练速度。
两种不合适的思路
第一种:求导时没有将bn考虑进来,会导致bn操作将更新削弱。按照文中给出的例子,就是bn将
Δ
\Delta
Δb减掉了,所以bn层之后b没有更新,但是bn层之前b->
Δ
b
\Delta b
Δb +b 这样就会使得bn层之前
Δ
b
\Delta b
Δb不断累加,最终产生inf。(处于一知半解的状态,希望后面能理解)
第二种,思路完全没看明白,只是粘在这里,希望有机会能懂
BN 的正确做法
注意,这里的公式都是针对x的某个维度的,也就是
x
(
k
)
x^{(k)}
x(k)。
γ
\gamma
γ,
β
\beta
β都是可学习的变量。
BN bp算法
Training and Inference with Batch- Normalized Networks
Training的时候没有什么好说的,就是不断学习
γ
,
β
\gamma ,\beta
γ,β,在inference的时候,我们要固定所学到的
γ
,
β
\gamma ,\beta
γ,β,同时,对于均值和方差,我们也无法获取到,只能依赖之前的统计进行估算。
从上文可以看出,
E
[
x
]
E[x]
E[x]是通过对多个training mini-batches 的均值求期望得来的;Var[x]是通过多方差求期望得来的。
BN应该放在什么位置?
一般是放在线性变换之后,非线性变换之前。
这个图不是原文的,是https://www.learnopencv.com/batch-normalization-in-deep-networks/
这篇blog讲的。
之所以放在这里,而不是放在nonlinear之后,原文给出了这样的解释:
并不是十分理解文中给出的解答,只能记住一个linear层输出more Gaussian。
其实也有工作证明了放在激活函数之后,在特定情况下效果会更好。
BN的其他好处
Batch Normalization enables higher learning rates
通常更高的learning rates会导致梯度爆炸或者梯度消失。
BN首先可以避免梯度消失。由于之前已经说过,BN可以使输入均值为0,从而保证sigmoid(有可能使其他激活函数)的输入在线性区域,保证梯度存在。
BN其次可以避免梯度爆炸。通常大学习速度会导致参数变大,进一步导致梯度爆炸。作者用下面的公式表明,BN不仅不受大参数影响而梯度爆炸,反而参数越大,梯度越小。
为什么加入bn后前面层的bias可以省略
推导过程如下:
B
N
(
W
u
+
b
)
=
γ
x
i
k
−
E
(
x
k
)
σ
(
x
(
k
)
)
+
B
BN(Wu+b)=\gamma \frac {x_{i}^{k}-E(x^{k})} {\sigma(x^{(k)})}+B
BN(Wu+b)=γσ(x(k))xik−E(xk)+B
=
γ
w
k
m
i
+
b
−
E
(
w
k
m
+
b
)
σ
(
x
(
k
)
)
+
B
=\gamma \frac {w^{k}m_{i}+b-E(w^{k}m+b)} {\sigma(x^{(k)})}+B
=γσ(x(k))wkmi+b−E(wkm+b)+B
=
γ
w
k
m
i
−
E
(
w
k
m
)
σ
(
x
(
k
)
)
+
B
=\gamma \frac {w^{k}m_{i}-E(w^{k}m)} {\sigma(x^{(k)})}+B
=γσ(x(k))wkmi−E(wkm)+B
=
B
N
(
W
u
)
=BN(Wu)
=BN(Wu)