機器學習乾貨-TensorFlow神經網絡(3)

本文針對前兩節內容作承接行介紹。本文主要分析深度學習中的梯度消失和梯度爆炸問題,並總結其解決方法。本文分為3個部分:

  • 為什麼會產生梯度消失和梯度爆炸?
  • 梯度消失和梯度爆炸的原因分析;
  • 解決該問題的有效方法。

1 為什麼會產生梯度消失和梯度爆炸?

在介紹梯度消失以及爆炸之前,先了解梯度消失的根源—–深度神經網絡和反向傳播。目前深度學習方法中,深度神經網絡的發展造就了我們可以構建更深層的網絡完成更復雜的任務,深層網絡比如深度卷積網絡、LSTM、YOLO等。在處理複雜任務上,深度網絡比淺層的網絡具有更好的效果。但目前優化神經網絡的方法都是基於反向傳播的思想,即根據損失函數計算的誤差通過梯度反向傳播的方式,指導深度網絡權值的更新優化。首先,深層網絡由許多非線性層堆疊而來,每一層非線性層都可以視為是一個非線性函數 f(x) ,因此整個深度網絡可以視為是一個複合的非線性多元函數。函數如下:

機器學習乾貨-TensorFlow神經網絡(3)

最終目的是希望這個多元函數可以很好的完成輸入到輸出之間的映射。假設不同的輸入,輸出的最優解是g(x) 優化深度網絡就是為了尋找到合適的權值,滿足Loss=L(g(x),F(x)) ,F(x))取得極小值點,如使基本損失函數:

機器學習乾貨-TensorFlow神經網絡(3)

假設損失函數的數據空間如下圖,最優權值就是尋找圖中的最小值點,這就轉化為求最小值問題,一般都會採用梯度下降的方法。

機器學習乾貨-TensorFlow神經網絡(3)

由此可見,產生梯度消失或梯度爆炸問題是在神經網絡進行梯度優化計算中產生,造成模型算法終止。

2 梯度消失和梯度爆炸的原因分析?

其實梯度消失和梯度爆炸可以算一種情況。在神經網絡模型中,一般會在深層網絡和選擇損失函數是造成梯度消失和爆炸,因此從這兩個角度分析梯度消失和爆炸的原因。首先是深層神經網絡方面,如下圖是一個具有3層隱含層的神經網絡模型:

機器學習乾貨-TensorFlow神經網絡(3)

機器學習乾貨-TensorFlow神經網絡(3)

如果此部分大於1,則在層數增多的時候,最終求出的梯度更新將以指數形式增加,即發生梯度爆炸;反之,隨著層數的增多,求出的梯度更新信息將會以指數形式衰減,即發生梯度消失。

小結:從深層網絡角度來講,不同的層學習的速度差異很大,表現為網絡中靠近輸出的層學習的情況很好,靠近輸入的層學習的很慢,有時甚至訓練了很久,前幾層的權值和剛開始隨機初始化的值差不多。因此,梯度消失和爆炸,其根本原因在於反向傳播訓練法則,屬於模型缺陷。

其次是激活函數的選擇問題,在上文計算權值更新信息時需要計算前層偏導信息,那麼就與選擇的激活函數有關了。如使用sigmoid,梯度消失就會很明顯了,原因看下圖,左圖是sigmoid的損失函數圖,右邊是其導數的圖像,如果使用sigmoid作為損失函數,其梯度是不可能超過0.25的,這樣經過鏈式求導之後,很容易發生梯度消失。使用tanh作為激活函數,它的導數圖如下,可以看出,tanh比sigmoid要好一些,但是它的導數仍然是小於1的。他們的數學表達為:

機器學習乾貨-TensorFlow神經網絡(3)

其函數曲線及其導數圖如下:

機器學習乾貨-TensorFlow神經網絡(3)

3 解決該問題的有效方法?

這裡主要提供4種有效的解決方法,當然也有一些其他有效方法。

(1)梯度剪切及正則化,這個方法主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,然後更新梯度的時候,如果梯度超過這個閾值,那麼就將其強制限制在這個範圍之內。這可以防止梯度爆炸。另外一種解決梯度爆炸的手段是採用權重正則化(weithts regularization)比較常見的是L1正則和L2 正則,在各個深度框架中都有相應的API可以使用正則化,如在tensorflow中直接給出了調用接口,用以下代碼可以直接計算出正則損失:

<code>regularization_loss = tf.add_n(tf.losses.get_regularization_losses(scope='my_resnet_50'))/<code>

再看正則項中的損失函數:

機器學習乾貨-TensorFlow神經網絡(3)

α是正則項係數。因此,如果發生梯度爆炸,權值的範數就會變的非常大;通過正則化項,可以部分限制梯度爆炸的發生。但實際上在深度神經網絡中,往往是梯度消失更多一些。

(2)預訓練加微調方法,該方法來自Hinton在2006年發表的一篇論文,Hinton為了解決梯度的問題,提出採取無監督逐層訓練方法,其基本思想是每次訓練一層隱節點,訓練時將上一層隱節點的輸出作為輸入,而本層隱節點的輸出作為下一層隱節點的輸入,此過程就是逐層“預訓練”(pre-training);在預訓練完成後,再對整個網絡進行“微調”(fine-tunning)。Hinton在訓練深度信念網絡(Deep Belief Networks中,使用了這個方法,在各層預訓練完成後,再利用BP算法對整個網絡進行訓練。該思想相當於是先尋找局部最優,然後整合起來尋找全局最優,此方法有一定的好處,但應用較少。

(3)激活函數選擇,使用不同的激活函數會產生不同的效果。常見的ReLU,Elu等激活函數。ReLU:思想也很簡單,如果激活函數的導數為1,那麼就不存在梯度消失爆炸的問題,每層的網絡都可以得到相同的更新速度。ReLU的數學表達式:

機器學習乾貨-TensorFlow神經網絡(3)

其函數圖像:

機器學習乾貨-TensorFlow神經網絡(3)

從上圖中,我們可以很容易看出,ReLU函數的導數在正數部分是恆等於1的,因此在深層網絡中使用ReLU激活函數就不會導致梯度消失和爆炸的問題。

ReLU的優點:

  • 解決了梯度消失、爆炸的問題
  • 計算方便,計算速度快
  • 加速了網絡的訓練

ReLU的缺點:

  • 由於負數部分恆為0,會導致一些神經元無法激活
  • 輸出不以0為中心

但它仍然是目前使用最多的激活函數。另外還由如LeakReLU激活函數,ELU激活函數,具有由於ReLU的激活函數,若在訓練過程中也可以嘗試替換激活函數。

(4)目前最好的解決辦法LSTM ,長短期記憶網絡(long-short term memory networks),不容易發生梯度消失,主要原因在於LSTM內部複雜的“門”(gates),如下圖,LSTM通過它內部的“門”可以接下來更新的時候“記住”前幾次訓練的”殘留記憶“。因此,常用於NLP自然語言處理,有序問題處理等。

機器學習乾貨-TensorFlow神經網絡(3)


分享到:


相關文章: