加入極市專業CV交流群,與6000+來自騰訊,華為,百度,北大,清華,中科院等名企名校視覺開發者互動交流!更有機會與李開復老師等大牛群內互動!
同時提供每月大咖直播分享、真實項目需求對接、乾貨資訊匯總,行業技術交流。點擊文末「閱讀原文」立刻申請入群~
作者:全能言有三
授權轉載自公眾號:有三AI
【導讀】神經網絡要優化一個非常複雜的非線性模型,而且基本沒有全局最優解,初始化在其中扮演著非常重要的作用。尤其在沒有BN等技術的早期,它直接影響模型能否收斂,沒有好的初始化的深度學習模型訓練起來會很難。2006年Hinton等人在science期刊上發表了論文「Reducing the dimensionality of data with neural networks」,揭開了新的訓練深層神經網絡算法的序幕。
利用無監督的RBM網絡來進行預訓練,進行圖像的降維,取得比PCA更好的結果,通常這被認為是深度學習興起的開篇。
這麼看來,是因為好的初始化方法的出現,才有了深層神經網絡工程化落地的可能性。
好的初始化應該滿足以下兩個條件:
(1) 讓神經元各層激活值不會出現飽和現象;
(2) 各層激活值也不能為0。
也就是激活值不要太大,也不要太小,應該剛剛好,當然這還只是最基本的要求。
我們都知道在早期,sigmoid激活函數是多層感知器模型的標配,上面這篇文章同樣也是用sigmoid激活函數,沒有那麼多問題,是因為使用了預訓練。
如果不使用預訓練會如何?在Xavier Glorot和Yoshua Bengio提出xavier初始化方法的論文【1】中就對不同的激活函數使用不同的數據集做過實驗。
上面是一個四層的神經網絡在sigmoid函數激活下的訓練過程,可以看到最深的layer4層剛開始的時候很快就進入了飽和區域(激活值很低),其他幾層則比較平穩,在訓練的後期才能進行正常的更新。
為什麼會這樣呢?網絡中有兩類參數需要學習,一個是權重,一個是偏置。對於上面的結果作者們提出了一個假設,就是在網絡的學習過程中,偏置項總是學的更快,網絡真正的輸出就是直接由layer4決定的,輸出就是softmax(b+Wh)。既然偏置項學的快,那Wh就沒有這麼重要了,所以激活值可以低一點。
解釋雖然比較牽強,但是畢竟實驗結果擺在那裡,從tanh函數的激活值來看會更直觀。
這個圖有個特點是,0,1和-1的值都不少,而中間段的就比較少。在0值,逼近線性函數,它不能為網絡的非線性能力作出貢獻。對於1,-1,則是飽和區,沒有用。
1、全零初始化和隨機初始化
如果神經元的權重被初始化為0, 在第一次更新的時候,除了輸出之外,所有的中間層的節點的值都為零。一般神經網絡擁有對稱的結構,那麼在進行第一次誤差反向傳播時,更新後的網絡參數將會相同,在下一次更新時,相同的網絡參數學習提取不到有用的特徵,因此深度學習模型都不會使用0初始化所有參數。
而隨機初始化就是搞一些很小的值進行初始化,實驗表明大了就容易飽和,小的就激活不動,再說了這個沒技術含量,不必再討論。
2.標準初始化
對於均勻分布,X~U(a,b),概率密度函數等於:
它的期望等於0,方差等於(b-a)^2/12,如果b=1,a=-1,就是1/3。
下面我們首先計算一下,輸出輸入以及權重的方差關係公式:
如果我們希望每一層的激活值是穩定的,w就應該用n的平方根進行歸一化,n為每個神經元的輸入數量。
所以標準的初始化方法其權重參數就是以下分布:
它保證了參數均值為0,方差為常量1/3,和網絡的層數無關。
3.Xavier初始化
首先有一個共識必須先提出:神經網絡如果保持每層的信息流動是同一方差,那麼會更加有利於優化。不然大家也不會去爭先恐後地研究各種normalization方法。
不過,Xavier Glorot認為還不夠,應該增強這個條件,好的初始化應該使得各層的激活值和梯度的方差在傳播過程中保持一致,這個被稱為Glorot條件。
如果反向傳播每層梯度保持近似的方差,則信息能反饋到各層。而前向傳播激活值方差近似相等,有利於平穩地學習。
當然為了做到這一點,對激活函數也必須作出一些約定。
(1) 激活函數是線性的,至少在0點附近,而且導數為1。
(2) 激活值關於0對稱。
這兩個都不適用於sigmoid函數和ReLU函數,而適合tanh函數。
要滿足上面的兩個條件,就是下面的式子。
推導可以參考前面標準初始化的方法,這裡的ni,ni+1分別就是輸入和輸出的神經元個數了,因為輸入輸出不相等,作為一種權衡,文中就建議使用輸入和輸出的均值來代替。
再帶入前面的均勻分布的方差(b-a)^2/12,就得到了對於tanh函數的xavier初始化方法。
下面這兩個圖分別是標準初始化和xavier初始化帶來的各層的反傳梯度方差,可以看出xavier確實保持了一致性。
4.He初始化
Xavier初始化雖然美妙,但它是針對tanh函數設計的,而激活函數現在是ReLU的天下,ReLU只有一半的激活,另一半是不激活的,所以前面的計算輸入輸出的方差的式子多了一個1/2,如下。
因為這一次沒有使用均勻初始化,而是使用了正態分布,所以對下面這個式子:
綜上,對於兩大最經典的激活函數,各自有了對應的初始化方法。雖然後面還提出了一些其他的初始化方法,但是在我們這個系列中就不再詳述了。
初始化這個問題明顯比較麻煩,不然大家也不會這麼喜歡用pretrained模型了。
從前面我們可以看到,大家努力的方向有這麼幾個。
(1) 預訓練啊。
機智地一比,甩鍋給別人,😄。
(2) 從激活函數入手,讓梯度流動起來不要進入飽和區,則什麼初始化咱們都可以接受。
這其實就要回到上次我們說的激活函數了,ReLU系列的激活函數天生可以緩解這個問題,反過來,像何凱明等提出的方法,也是可以反哺激活函數ReLU。
(3) 歸一化,讓每一層的輸入輸出的分布比較一致,降低學習難度。
回想一下,這不就是BN幹的活嗎?所以才會有了BN之後,初始化方法不再需要小心翼翼地選擇。假如不用BN,要解決這個問題有幾個思路,我覺得分為兩派。
首先是理論派,就是咱們從理論上分析出設計一個怎麼樣的函數是最合適的。
對於Sigmoid等函數,xavier設計出了xavier初始化方法,對於ReLU函數,何凱明設計了he初始化方法。
在此之上,有研究者分別針對零點平滑的激活函數和零點不平滑的激活函數提出了統一的框架,見文【2】,比如對於sigmoid,tanh等函數,方差和導數的關係如此。
然後是實踐派,在訓練的時候手動將權重歸一化的,這就是向歸一化方法靠攏。
[1] Glorot X, Bengio Y. Understanding the difficulty of training deep feedforward neural networks[C]//Proceedings of the thirteenth international conference on artificial intelligence and statistics. 2010: 249-256.
[2] Kumar S K. On weight initialization in deep neural networks[J]. arXiv preprint arXiv:1704.08863, 2017.
[3] Mishkin D, Matas J. All you need is a good init[J]. arXiv preprint arXiv:1511.06422, 2015.
-完-
點擊左下角「閱讀原文」,即可申請加入極市目標跟蹤、目標檢測、工業檢測、人臉方向、視覺競賽等技術交流群,更有每月大咖直播分享、真實項目需求對接、乾貨資訊匯總,行業技術交流,一起來讓思想之光照的更遠吧~
△長按關注極市平臺
覺得有用麻煩給個在看啦~