Caffe Batch Normalization推导2
Caffe Batch Normalization推导
首先仔细看过Caffe的BN层实现的话会发现caffe的BN层与论文的是不太一致的。
没有了 γ 和 β 。(因为如果有需要的话可以再加一个scale layer。)我这里将推导出给caffe的backward注释一样的diff公式。
那么我们先来定义一下问题。若 L 是网络的损失函数,那么就是已知 ∂L∂yi , yi=xi−x¯σ2+ϵ√ , x¯=1m∑mi=1xi , σ2=1m∑mi=1(xi−x¯)2 ,求 ∂L∂xi 。
推导的过程基本上就是链式规则的应用了。具体过程如下:
∂L∂xi=∑j=1m∂L∂yj⋅∂yj∂xi
∂x¯∂xi=1m
∂σ2∂xi=1m(∑j=1m(2(xj−x¯)⋅(−1m))+2(xi−x¯))
由于 ∑mj=1(2(xj−x¯)⋅(−1m)))=0 ,所以 ∂σ2∂xi=2m(xi−x¯) 。
∂yj∂xi=−12(σ2+ϵ)−32(xj−x¯)⋅∂σ2∂xi−1m(σ2+ϵ)−12i≠j
∂yj∂xi=−12(σ2+ϵ)−32(xj−x¯)⋅∂σ2∂xi+(1−1m)(σ2+ϵ)−12i=j
然后,我们将 ∂yj∂xi 代入 ∂L∂xi=∑mj=1∂L∂yj⋅∂yj∂xi
∂L∂xi=∑j=1&j≠im∂L∂yj⋅(−12(σ2+ϵ)−32(xj−x¯)⋅∂σ2∂xi−1m(σ2+ϵ)−12)+∂L∂yi⋅(−12(σ2+ϵ)−32(xj−x¯)⋅∂σ2∂xi+(1−1m)(σ2+ϵ)−12)
我们注意到 j=i 的情况和 j≠i 的情况只是多了一个 (σ2+ϵ)−12 。因此我们可以合并这两个情况,变成以下式子
∂L∂xi=∂L∂yi⋅(σ2+ϵ)−12+∑j=1m∂L∂yj⋅(−1m(σ2+ϵ)−32(xj−x¯)(xi−x¯)−1m(σ2+ϵ)−12)
然后我们提出公因式 (σ2+ϵ)−12 ,则
∂L∂xi=(σ2+ϵ)−12(∂L∂yi−1m∑j=1m∂L∂yj−1m∑j=1m∂L∂yj⋅(xj−x¯)(xi−x¯)(σ2+ϵ)12(σ2+ϵ)12)
我故意的拆分了 (σ2+ϵ) ,这是因为 yi=xi−x¯σ2+ϵ√ ,我们可以将它代入到这个式子中,这样,这个式子就变成了
∂L∂xi=(σ2+ϵ)−12(∂L∂yi−1m∑j=1m∂L∂yj−(1m∑j=1m∂L∂yj⋅yj)⋅yi)
至此我们得到了跟caffe的batch_norm_layer.cpp第187行一样的式子(只不过它用的矩阵的形式)
1 |
// if Y = (X-mean(X))/(sqrt(var(X)+eps)), then |
2 |
// |
3 |
// dE(Y)/dX = |
4 |
// (dE/dY - mean(dE/dY) - mean(dE/dY \cdot Y) \cdot Y) |
5 |
// ./ sqrt(var(X) + eps) |
6 |
// |
7 |
// where \cdot and ./ are hadamard product and elementwise division, |
8 |
// respectively, dE/dY is the top diff, and mean/var/sum are all computed |
9 |
// along all dimensions except the channels dimension. In the above |
10 |
// equation, the operations allow for expansion (i.e. broadcast) along all |
11 |
// dimensions except the channels dimension where required. |