當前位置:
首頁 > 最新 > 深度學習三人行-TF訓練DNN之進階

深度學習三人行-TF訓練DNN之進階

上期我們一起學習了

簡單的介紹了ANN(人工神經網路),並訓練了我們第一個DNN(深度神經網路),但是一個非常淺的DNN,只有兩個隱藏層。如果你需要解決一個非常複雜的問題,比如在高解析度的圖像中分辨不上百種不同類型的實體對象,這時候你就需要訓練一個更深的DNN來完成,可能是10層,並且每層會包含上百個神經元,並由上成千上百個連接器組成。這時候你將面臨如下問題:

你將面臨非常詭異的梯度消失或爆炸,這會直接影響DNN的構建並且導致淺層的網路非常難以訓練

如此大的神經網路,直接訓練的話,極度的慢

擁有大量參數的模型在訓練時,很容易出現過擬合現象

解決上面面臨的三個問題就是本文要講的內容。

一. 梯度消失與梯度爆炸

反向傳播演算法在輸出層和輸入層之間,傳播誤差梯度,一旦演算法計算完損失函數的梯度,就會利用這些梯度值利用梯度下降方法更新每個參數。但是,隨著往淺層的網路層傳播,梯度經常會變得越來越小,導致梯度下降演算法在低層連接間的權重值幾乎沒有什麼變化,同時訓練時也無法收斂到最優解。這就是梯度消失問題。

對於這個問題,常用的做法是選用好的權重初始化策略,使用更優秀的激活函數,批量標準化。

1.1 初始化策略

Xavier等人在論文Understanding the Difficulty of Training Deep Feedforward Neural Networks中提到,信號想在各個神經元中正常流動,需要神經網路在每一層輸出方差盡量相等。但現實是由於輸入層和輸出層的節點數不同,而很難做到這點的,因此文中提出一種初始化策略叫做Xavier初始化來解決這個問題。對於不同的激活函數,其參數初始化方法如下:

ninputs和noutputs是輸入和輸出層的連接數,另外對於ReLU激活函數的初始化方案有時候也叫He 初始化。tensorflow中通過variance_scaling_initializer()來進行初始化策略設置的,默認情況下,TF的全連接使用均勻分布初始化。

1.2 激活函數

我們在前面見到的神經網路通常是使用logistic函數作為激活函數的,由於logistic中心部位和兩側的梯度差別太大,如果權重初始化得太大,激活值基本都在sigmoid兩側,兩側梯度幾乎為0,傳播幾層就沒有梯度了。即使用很好的初始化演算法把激活值控制在一個合理範圍內,優化幾下有幾個神經元就又跑到兩側了,而一旦到兩側,因為梯度過小,就再也無法通過梯度更新來使其恢復。這也正是導致出現梯度消失的原因,因此改選其他激活函數也能解決這個問題。

ReLU激活函數

ReLU激活函數就是一個很好的選擇,ReLU(z) = max(0,z)。因為ReLU在正數值上不會出現飽和,並且計算起來很快。但是ReLU激活函數存在一個問題,會出現死掉的ReLu,即訓練期間,權重和神經元的輸入層結合輸出負數,會直接導致神經元只輸出0,而且一旦發生就很難再跳轉。有時候使用的時候,甚至出現一半的神經元死掉了,特別是使用很大的學習率時。

要想繼續使用ReLU,就需要使用它的變種,LeakyReLU(z) = max(αz, z)。

其中超參數α定義了有多少的泄露。即圖中z

另外還有RReLU和PReLU,RReLU是通過在訓練期間,每次給α設定一個給定範圍的隨機值,而在測試集上,使用前面隨機α的均值來預測。這樣也能夠表現很好,並且還有用於減少過擬合風險的正則化作用。PReLU的α是在訓練階段通過學習到的,而不是超參數,而是成為反向傳播的一個參數,PReLU在擁有大量的圖像數據集上表現非常好,但是小數據集上容易出現過擬合。tensorflow中通過下面定義:

ELU激活函數

另一種激活函數叫做ELU。在實驗測試下,ELU相比於ReLU,ELU減少了訓練時間並且在測試集上比所有的ReLU變種都要優秀。

分布圖如下:

和ReLU函數相比,兩者有如下不同點:

在z

ELU在z

ELU函數處處可導,即使是在z = 0處,這避免了函數在z = 0左右出現跳動,能夠很好的加速梯度下降

1.3 批量標準化(batch Normalization)

BN是2015年由Sergey提出,是另外一種解決梯度消失或爆炸問題的,通常在訓練的時候,前一層的參數發生變化,後一層的分布也會隨之改變。BN是在模型中每一層的激活函數前加入標準化操作,首先BN會對輸入數據進行零均值方差歸一化,該歸一化能夠加速收斂,甚至特徵之間沒有相關性,但是簡單的歸一化神經網路層的輸入,可能會改變該層的表徵能力,例如,對 sigmoid 函數的輸入進行歸一化,會使歸一化後的輸入趨向 s 型函數的線性端。因此還需要引入兩個參數來做相應的縮放和平移。BN的演算法如下:

其中μB是這個batch數據的均值,σB是標準差,γ是縮放因子,β是平移因子,ε是一個很小的數,防止除數為0,稱為平滑因子。很多激活函數都可以使用BN方法而不會造成梯度消失問題,同時模型對初始化權值的要求也降低了。BN類似於一個正則器,它減少了對於其他正則化方法使用的需求。

但是BN會增加模型的複雜度,畢竟每層都需要進行標準化操作。因此如果你想要一個輕量級的神經網路,前面的ELU激活函數加上He初始化,可能會是更好的選擇。現在來看一下tensorflow中對BN的使用,完整代碼回復DNN可查看。

1.4 梯度裁剪

梯度裁剪主要用於避免梯度爆炸的情況,是通過在反向傳播時,將梯度裁剪到一定範圍內的值,雖然大家更加喜歡使用BN,但是梯度裁剪也非常的有用,特別時在RNN中,因此有必要知道梯度裁剪已經如何使用。tensorflow是使用clip_by_value()函數來裁剪的:

二、提升訓練時間

訓練大型神經網路時,還常常會遇到訓練時間的問題,通常會採用復用部分網路和參數,來提升訓練的時間。

2.1 復用預訓練層

從0開始訓練大型的DNN網路一般很慢,我們可以找到一個可以完成相似任務的網路,然後利用其部分淺層的網路及參數,對輸入的特徵進行簡單的提取,這就是遷移學習(transfer learning)。這種方法不僅可以加快訓練速度,也只需要更少的訓練數據。

例如:我們已經訓練了一個DNN模型來對100個不同類型的圖片進行分類,包括動物,植物,汽車等等。現在我們想再訓練一個DNN來對汽車類別中具體的類別分類,如果復用之前訓練的DNN的話就能很簡單的獲取我們想要模型:

2.2 復用tensorflow模型

前面訓練模型時,我們用restore將模型進行了保存。

但是我們通常只想復用原模型中的部分內容,一個簡單的方法是配置Saver只保存原模型部分變數,例如下面只保存隱藏層的1,2,3層。

上面代碼中,首先,我們構建一個新模型,並確定是否是需要複製原模型中1到3的隱藏層,然後通過scope的正則表達式"hidden[123]"匹配出1到3的隱藏層,接下來創建一個字典映射出原模型中變數的名稱,接下來創建一個saver保存只包含這些1到3隱藏層的變數,創建另外一個Saver保存整個模型。

最後我們重新開啟一個session,並初始化所有變數,restore需要的1到3隱藏層的變數,利用這些變數在新任務上訓練模型並保存。

2.3 從其他框架復用

如果已經使用另一個框架訓練了模型,你會需要手動導入權重,然後將它分配給合理的變數。下面例子展示了如何使用從另一個框架訓練的模型的第一個隱藏中複製權重和偏差。

2.4 凍結淺層

由於第一個DNN的淺層可能已經學會檢測圖片類別的低級特徵,這將在其他圖片分類中有用,因此你可以復用這些淺層。通常來說訓練一個新的DNN,將模型的權重凍結是一個很好的做法,如果淺層權重固定了,那麼深層權重會變得容易訓練。為了在訓練階段凍結淺層網路,最簡單的方法是給訓練的優化器一個除了淺層網路變數的變數列表。

第三行中獲取到隱藏層3,4和輸出層的層所有的訓練變數列表。這樣就除去了淺層1,2的變數。接下來將提供的訓練變數列表給到優化器minimize函數。這樣就是實現淺層1,2的凍結。

2.5 緩存凍結層

因為凍結層無法改變,可以為每個訓練實例緩存最頂層凍結層的輸出。因為訓練多次遍歷整個數據集,這會給你帶來巨大的速度提升,因為訓練實例每次只需要經過凍結層一次。例如,你可以首先運行整個訓練集通過較低層

hidden2_outputs = sess.run(hidden2, feed_dict=)

在訓練階段,構建批次的訓練實例,你可以從隱藏層2構建批量輸出,並將數據餵給模型訓練。

最後一行運行前面定義的訓練操作(隱藏層1,2),並把二個隱藏層的批量輸出餵給模型作為整個模型輸出中隱藏層1,2的輸出,由於我們已經提供了隱藏1,2的輸出,因此模型不會再嘗試評估它。

三、內容小結

本文討論了我們再訓練更深的DNN模型時,遇到的問題,以及解決方法。訓練大型DNN常遇到如下問題:1.梯度消失和爆炸,2.訓練效率和速度問題,3.過擬合問題。對於梯度消失問題,我們提出如下解決方案,初始化策略方法:Xavier和He初始化,替換激活函數:ReLU,ReLU變種和ELU,以及BN(批量標準化)。對於訓練效率,我們提出了各種復用模型內容的方法,以及下篇會將的各種優化方法。過擬合問題,有很多的正則化方法可用,這也是下篇會講解的問題。

(如需更好的了解相關知識,歡迎加入智能演算法社區,在「智能演算法」公眾號發送「社區」,即可加入演算法微信群和QQ群)本文代碼回復關鍵字:tfdnn2

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 智能演算法 的精彩文章:

深度學習三人行-TensorFlow愛之再體驗

TAG:智能演算法 |