參考博客
大神鏈接:
1、https://blog.csdn.net/weixin_44791964?type=blog
2、https://www.jianshu.com/p/b05282e9ca57
文章目錄
- 背景
- 前景知識
- BN演算法原理
- BN演算法的優點
- BN的代碼實作
學習神經網路的時候,發現了很多的演算法在輸入層之前加上了Batch Normalization 演算法,記錄一下自己的學習,
背景
Batch Normalization論文是2015年深度學習領域,超級火的一篇論文,論文的全稱為《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
論文的原文鏈接如下:
鏈接一 https://arxiv.org/abs/1502.03167v3
鏈接二 http://proceedings.mlr.press/v37/ioffe15.pdf
在BN演算法出現之前,當前深度學習網路雖然發展迅速,但也面臨著引數過多,類似于學習率、引數初始化、權重衰減系數、Drop out比例等,都是需要人為的去選擇引數,經常需要大量的時間進行調參,BN演算法幫助人們加速這一程序,使得在各類超參的選擇上不需要那么多精力,
前景知識
為了減少資料值的大小,還要保留資料的分布特性,減少網路對不同批次資料分布型別的依賴,我們一般情況下們都會對資料進行歸一化操作,歸一化操作成了我們把資料送入神經網路的標準操作,
雖然我們在將資料送入神經網路之前進行了歸一化操作,但是后續神經節點,卻沒有歸一化,雖然我們有各類激活函式使得網路呈現非線性,防止網路節點輸出過大,但深度網路的訓練是一個復雜的程序,只要網路的前面幾層發生微小的改變,那么后面幾層就會被累積放大下去,一旦網路某一層的輸入資料的分布發生改變,那么這一層網路就需要去適應學習這個新的資料分布,所以如果訓練程序中,訓練資料的分布一直在發生變化,那么將會影響網路的訓練速度,
也就是因為神經網路中間層之間沒有進行資料的歸一化,所以每次的資料分布在訓練程序中都不一樣,會很大的影響下一層的輸出的資料分布,直接會影響到引數的訓練程序,我們把網路中間層在訓練程序中,資料分布的改變稱之為:“Internal Covariate Shift”,對Google提出的“Internal Covariate Shift”的理解可以參考這個,
那么什么方法可以解決這個問題呢?
就是對中間層也進行資料歸一化操作,使得中間層輸出的資料分布較為穩定,說起來好像是挺容易的,不就是歸一化操作嘛,容易,但是實作起來卻沒有那么容易,細看在此文章之前的文章,卻沒有人實作過,原因為:如果漸漸單單對中間層的資料使用已有的歸一化方法,會強制的改變資料的分布結構,有一種強行將資料全部扭到一種分布模式的感覺,
比如強行變成均值為零、標準差為1的分布,這樣的話,會影響到下一層網路可以學習到的東西,無論上一層網路給啥,歸一化之后都一樣,下一層還學啥,直接擺爛了,
所以我們需要一種演算法,能夠對中間層資料進行歸一化,且最大程度上保留資料的分布特征,我們的厲害的BN演算法橫空出世(BN演算法NB),
BN演算法原理
將BN演算法之前,我們還需要了解一種歸一化演算法–白化演算法,這個演算法在論文中也有提及到,
白化演算法:
白化的目的是去除輸入資料的冗余資訊,假設訓練資料是影像,由于影像中相鄰像素之間具有很強的相關性,所以用于訓練時輸入是冗余的;白化的目的就是降低輸入的冗余性,
輸入資料集X,經過白化處理后,新的資料X’滿足兩個性質:
(1)特征之間相關性較低;相當于PCA程序,
(2)所有特征具有相同的方差,
具體公式:
公
式
一
:
C
o
v
[
x
]
=
E
x
∈
X
[
x
x
T
]
?
E
[
x
]
E
[
x
]
T
公式一:Cov[x] = E_{x∈X} [xx^T] ? E[x]E[x]^T
公式一:Cov[x]=Ex∈X?[xxT]?E[x]E[x]T
公
式
二
:
C
o
v
[
x
]
?
1
/
2
(
x
?
E
[
x
]
)
公式二:Cov[x]?1/2(x ? E[x])
公式二:Cov[x]?1/2(x?E[x])
從公式可以看出來,它需要公式一計算協方差矩陣Cov[x],以及產生白花激活的公式二,以及這些變換的導數用于反向傳播,要進行完上述的所有程序,我們需要計算的資料量十分的大,這促使我們尋求一種替代方法,以一種可微分的方式執行輸入規范化,并且不需要在每次引數更新后分析整個訓練集,
論文作者為了減少計算量和方便后向計算僅僅使用了下面的公式進行預處理,也就是近似白化預處理:
公
式
三
:
x
^
(
k
)
=
x
(
k
)
?
E
[
x
(
k
)
]
V
a
r
[
x
(
k
)
]
公式三:\widehat{x}{^{(k)}} =\frac{x(k) ? E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}}
公式三:x
(k)=Var[x(k)]
?x(k)?E[x(k)]?
訓練程序中采用batch 隨機梯度下降,上面的
E
[
x
(
k
)
]
E[x^{(k)}]
E[x(k)]指的是每一批訓練資料神經元
x
(
k
)
x^{(k)}
x(k)的平均值;然后分母就是每一批資料神經元
x
(
k
)
x^{(k)}
x(k)激活度的一個標準差了,
但是直接這樣做的話也會強制的使得資料的分布特征為同一型別,作者為了解決這樣的問題,提出了一種開創性的想法,如下:
公
式
四
:
y
(
k
)
=
γ
(
k
)
x
^
(
k
)
+
β
(
k
)
公式四:y^{(k)} = γ^{(k)}\widehat{x}^{(k)} + β^{(k)}
公式四:y(k)=γ(k)x
(k)+β(k)
其中
γ
(
k
)
=
V
a
r
[
x
(
k
)
]
γ^{(k)} =\sqrt{Var[x^{(k)}]}
γ(k)=Var[x(k)]
? 和
β
(
k
)
=
E
[
x
(
k
)
]
β^{(k)} =E[x^{(k)}]
β(k)=E[x(k)];
每一個神經元
x
(
k
)
x^{(k)}
x(k)都會有一對這樣的引數
γ
(
k
)
γ^{(k)}
γ(k)、
β
(
k
)
β^{(k)}
β(k),這樣做的目的是讓歸一化之后的資料特性的分布特性由資料自己來決定,是可以恢復出原始的某一層所學到的特征的,
這樣就完美的解決了怎么對資料進行歸一化,以及最大程度不改變資料分布特性的兩個問題,
論文中給出了演算法的具體計算流程如下:

即主要分為了四個步驟,也就是我們在上面所提到的那些步驟:
從步驟中可以得知,為小批量的訓練方法,
1、計算每一批次的輸入資料的平均值,
2、利用步驟一所求得的平均值進行輸入資料方差的求取,
3、步驟三中所用的公式和我們上述公式三不一樣的地方是加上了
?
\epsilon
?,
?
\epsilon
?是一個極小值,是為了防止方差為零、或者無線接近于零的情況發生,使得結果無限大的情況發生,
4、利用公式四進行消除歸一化所帶來的標準化的影響,也可以說是反標準化的一步,
至此,基本的BN的演算法就這么多,但是我們上述的 x ( k ) x^{(k)} x(k)是針對于每一批的小樣本來說,我們訓練完了我們的模型之后,輸入很有可能的是單個樣本,那個時候我們該如何計算平均值和方差呢?
論文中的方法為:
在訓練結束后,引數都是固定化的,BN的引數也是固定化了,一旦固定化,就要有一個確切的值,論文中的最終BN階段的平均值和方差來自于所有訓練樣本的平均值和方差,也就是所有小批次的平均值和方差,
具體公式如下:
對于均值來說直接計算所有batch的平均值:
平
均
值
:
E
[
x
]
←
E
B
[
μ
B
]
平均值:E[x] ← E_B[μ_B]
平均值:E[x]←EB?[μB?]
對于標準偏差采用每個batch的無偏估計:
方
差
:
V
a
r
[
x
]
←
m
m
?
1
E
B
[
σ
B
2
方差:Var[x] ← \frac{m}{m?1}E_B[σ^2_B
方差:Var[x]←m?1m?EB?[σB2?
最后測驗階段,BN的使用公式就是:
y
=
γ
V
a
r
[
x
]
+
?
x
+
(
β
?
γ
E
[
x
]
V
a
r
[
x
]
+
?
)
y = \frac{γ}{\sqrt{Var[x]+\epsilon}}x +(β-\frac{γE[x]}{\sqrt{Var[x]+\epsilon}})
y=Var[x]+?
?γ?x+(β?Var[x]+?
?γE[x]?)
以上就是BN演算法的大致思想和步驟,具體內容,可以深入閱讀一下文章,
BN演算法的優點
1、Batch Normalization 對每層資料規范化后,可以使用更高的學習率(因為不加以規范之前,每層的資料的分布特性復雜,采用較高學習率容易不收斂),所以網路訓練時可以設定較高的初始學習率,加快收斂,
2、你再也不用去理會過擬合中drop out、L2正則項引數的選擇問題,采用BN演算法后,可以選擇更小的L2正則約束引數了,因為BN具有提高網路泛化能力的特性;也不需要使用使用區域回應歸一化層了,因為BN本身就是一個歸一化網路層;
3、防止過擬合,在網路的訓練中,Bn使得一個minibatch中所有樣本都被關聯在了一起,因此網路不會從某一個訓練樣本中生成確定的結果,這樣就會使得整個網路不會朝這一個方向使勁學習,一定程度上避免了過擬合,
4、防止梯度爆炸和梯度消失,因為規范化之后,資料較為標準,在各個點的梯度都不會過大或者過于小,
BN的代碼實作
代碼可以參考這里 和 這里
代碼為Pytorch實作的,和上面公式很貼切
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/433375.html
標籤:AI
下一篇:【數字信號處理】線性常系數差分方程 ( 卷積 與 “ 線性常系數差分方程 “ | 使用 matlab 求解 “ 線性常系數差分方程 “ )
