梯度弥散
在深度神經網絡中經常聽說梯度彌散,下面就介紹一下,并搜集了當時的科學家是怎樣避免的
梯度彌散問題
梯度下降法(以及相關的L-BFGS算法等)在使用隨機初始化權重的深度網絡上效果不好的技術原因是:梯度會變得非常小。具體而言,當使用反向傳播方法計算導數的時候,隨著網絡的深度的增加,反向傳播的梯度(從輸出層到網絡的最初幾層)的幅度值會急劇地減小。結果就造成了整體的損失函數相對于最初幾層的權重的導數非常小。這樣,當使用梯度下降法的時候,最初幾層的權重變化非常緩慢,以至于它們不能夠從樣本中進行有效的學習。這種問題通常被稱為“梯度的彌散”.
與梯度彌散問題緊密相關的問題是:當神經網絡中的最后幾層含有足夠數量神經元的時候,可能單獨這幾層就足以對有標簽數據進行建模,而不用最初幾層的幫助。因此,對所有層都使用隨機初始化的方法訓練得到的整個網絡的性能將會與訓練得到的淺層網絡(僅由深度網絡的最后幾層組成的淺層網絡)的性能相似。
梯度彌散一直是困擾著深度神經網絡的發展,那么如何解決梯度彌散問題呢?多倫多大學的Geoff Hinton提出了設想:受限玻爾茲曼機(RBM),即一類具有兩層結構的、對稱鏈接無自反饋的隨機神經網絡模型, 層與層之間是全連接,層內無鏈接 ,從而形成一個二分圖。
RBM是一種有效的特征提取方法,常用于初始化前饋神經網絡,可明顯提高泛化能力。而由多個RBM結構堆疊而成的深度信念網絡能提取出更好更抽象的特征,從而用來分類。
? ? 最后,再為大家總結描述一下RBM算法的過程:
a)?正向過程,對每個可見層的輸入,都要結合了一個單邊的權重和一個可見層的偏置,按隱藏層的條件概率公式計算出結果傳到隱藏層,有些節點可能會被激活,有的則可能不會被激活;
b)在反向過程中,對每個激活的隱藏層節點,也結合了一個單邊的權重和一個隱藏層的偏置,按可見層的條件概率公式重構可見層輸入;
c)?在可見層,將重構輸入與原始輸入進行比較,早期是用KL散度方法進行兩個概率分布差異度量,現在也引入了效率更高的CD散度來進行度量。根據比較結果,更新權值和偏置。
重復步驟a)到步驟c),直至重構的輸入與原始輸入的盡可能的接近。
根據RBM產生的DBM(deep Boltzmann Machine),DBN(deep Belief Nets),CAE(covolutional Auto-Encode),DAE(denoise Auto-Encode ),SAE(Stacked Auto-Encode)等都是利用的是逐層貪婪的訓練方法, 在一隱含層訓練穩定時在向下一層進行訓練學習達到穩定,依次類推,是一種堆疊的模式(stacked)。
Deep Neural Networks的問題:
- 以前機器學習的數據量不是很大(標記數據更少),而DNN待學習的參數非常的多(Andrew Ng在Google搞的那個有1.15billion個參數),這樣就會出現嚴重的過擬合現象;這也是DNN之前沒有像現在這樣火的原因之一(難以訓練,計算復雜度高等也是原因)。
- 層數多了以后,梯度下降的優化過程就變成非凸優化,比較容易陷入局部極值;(關于凸優化,非凸優化的區別可以參考http://hi.baidu.com/tuenmei/item/beedffa6714dce228819d329)
- 層數多以后,會出現梯度彌散(diffusion of gradients)的現象:梯度下降法(以及相關的L-BFGS算法等)在使用隨機初始化權重的深度網絡上效果不好的技術原因是:梯度會變得非常小。具體而言,當使用反向傳播方法計算導數的時候,隨著網絡的深度的增加,反向傳播的梯度(從輸出層到網絡的最初幾層)的幅度值會急劇地減小。結果就造成了整體的損失函數相對于最初幾層的權重的導數非常小。這樣,當使用梯度下降法的時候,最初幾層的權重變化非常緩慢,以至于它們不能夠從樣本中進行有效的學習。這種問題通常被稱為“梯度的彌散”(http://ufldl.stanford.edu/wiki/index.php/深度網絡概覽)。
- 利用未標記的數據,提出自編碼器(Auto Encoder,包括Forward Neural Networks,Restricted Boltzmann Machine),采用逐層學習的方式(layer-wise的pretraining);
- 減少參數,提出CNN (Convolution Neural Networks)。
針對梯度彌散如何去更好的解決也僅限于Hinton的RBM的那種設計。
以下是在知乎上看到的
dnn 從名字上你就可以看出來,是深度神經網絡,類比于淺層神經網絡,它的訓練方法也是BP,沒有引入無監督的預訓練。隱層的激活函數使用了 ReLU,改善了“梯度彌散”,通過正則化+dropout 改善了過擬合的現象,在輸出層 是softmax 作為激活函數。目標函數是交叉熵。
他是一個 有監督的判別模型。
stacked denoised autoencoder (SDA)深度學習結構,和DBN類似 使用 無監督的網絡“堆疊”起來的,他有分層預訓練來尋找更好的參數,最后使用BP來微調網絡。比dnn利用各種算法來初始化權值矩陣,從經驗上來看是有幫助的。但是缺點也很明顯,每層的貪婪學習權值矩陣,也帶來了過長的訓練時間。在大量的數據面前 dnn(relu)的效果已經不差于預訓練的深度學習結構了。最終DBN也是看成是“生成模型”。
CNN 也沒有pre-train過程,訓練算法也是用BP。 因為加入卷積 可以更好的處理2D數據,例如圖像和語音。并且目前看來 相比其它網絡有更好的表現。dnn/dbn/sda 等都是處理1D的數據。
CNN解決梯度彌散是使用的權值共享的策略。
補充:
今天再看RNN 時遇到一個關于梯度爆炸的概念
和梯度彌散的問題相反,這時候梯度會在?BP?的時候發生指數級地增長。也就是說,遇到了梯度爆炸的問題。
總結
- 上一篇: Lua pairs与ipairs效率分析
- 下一篇: 自媒体初学者如何正确学习视频剪辑【视频制