1. 程式人生 > >如何使用優化器讓訓練網路更快——神經網路的奧祕

如何使用優化器讓訓練網路更快——神經網路的奧祕

摘要: 本文介紹了建立神經網路時使用的多種優化器,並講述瞭如何使用優化器讓訓練網路更快。

通過使用Numpy來建立神經網路,讓我意識到有哪些因素影響著神經網路的效能。架構、超引數值、引數初始化,僅是其中的一部分,而這次我們將致力於對學習過程的速度有巨大影響的決策,以及所獲得的預測的準確性—對優化策略的選擇。我們會研究很多流行的優化器,研究它們的工作原理,並進行對比。

你在GitHub上可以找到所有程式碼:

機器學習演算法的優化

優化是搜尋用於最小化或最大化函式引數的過程。當我們訓練機器學習模型的時候,通常使用間接優化。我們選擇某種度量,如精確度或回撥,來指示模型如何很好地解決給定問題。然而,我們正在優化一個不同的代價函式J(θ)

,並且希望把它最小化以提高我們關心的度量。當然,代價函式的選擇通常與我們要解決的具體問題有關。本質上,它表明了我們離理想的解決方案有多遠。

陷阱

結果證明,通常要找到最小的非凸代價函式並不容易,我們必須使用先進的優化策略來找到它們。如果你已經學過了微分,就一定知道區域性最小值的概念,這些是我們的優化器可能陷入的最大陷阱。對於那些還沒有接觸過這個數學概念的人,我只能說這些是在給定的區域內函式取最小值的點,如上圖左側所示。

克服所謂的鞍點(saddle points)通常被認為更具有挑戰性。這些是穩定狀態,其中代價函式的值幾乎是不變的。這種情況顯示在上圖的右側。在這些點上,梯度幾乎在所有方向上都被歸零,使得無法逃離。

有時候,特別是在多層網路的情況下,我們可能必須處理代價函式中非常陡峭的區域。在這些地方,梯度的值急劇地增加,引起梯度爆炸,這會致使採取一些極大的步驟長度,並經常破壞之前的整個優化工作。然而,通過梯度裁剪,就是定義允許的最大梯度值,就可以很容易地避免這個問題。

梯度下降法(Gradient descent)

在我們瞭解更好的演算法之前,先看看一些基本的策略方法。可能一個最簡單的方法就是簡單地沿著與梯度相反的方向移動,這個方法可以用下面的等式來表示:

其中,α是一個稱為學習率的超引數,它會轉換為我們將在每次迭代中採取的步驟長度。它的值在一定程度上表示了一種折中選擇,是學習的速度和可以獲得結果的準確性之間的。選擇太小的步驟長度會導致我們冗長的計算和執行更多的迭代。另一方面,無論如何,選擇過大的步驟長度可以有效地阻止我們找到最小值。在圖2中表示了這種情況,我們可以看到,在隨後的迭代中,如何振動,而不能保持穩定。在此期間,定義了適當步驟的模型幾乎立即就被發現了。

圖2.對於小學習率和大學習率的值的梯度下降行為的視覺化。

此外,這個演算法容易受到前面描述的鞍點問題的影響。由於在隨後的迭代過程中執行校正的大小與計算的梯度成正比,我們將無法擺脫平穩期。

最後,為了達到這一目的,該演算法是無效的,它要求在每次迭代中使用整個訓練集。這意味著,在每一個時期,我們必須檢視所有的例子,以便執行下一步的優化。當訓練集包含數千個例子的時候,這可能不是問題,但是正如我在之前提到的,當有數百萬條記錄可供使用時,神經網路工作的效果最好,但在這種情況下,很難想象在每次迭代中我們都使用整個集合,這會浪費時間和計算機資源。

小批量梯度下降法(Mini-bach Gradient descent)

圖 3.梯度下降與小批量梯度下降的比較

讓我們來解決上節中提到的最後一個問題——低效。雖然向量化允許我們可以加速計算,但是要一次性處理太多的訓練例項,並且當資料集具有數百萬條記錄時,整個處理過程仍然需要很長時間才能完成。讓我們試著使用一個相當簡單的解決方法,將整個資料集分成更小的部分,在隨後的迭代中進行訓練。假設左邊的圖形表示我們想要優化的代價函式。可以看到,由於我們需要處理的資料量要小得多,新演算法就會使得決策更快。讓我們來看下比較模型移動中的對比。梯度下降會採取罕見的、相對大的步驟,幾乎沒有噪音。另一方面,批量梯度下降更頻繁地執行步驟,但是由於被分析的資料集中可能存在多樣性,則會有更多的噪音。甚至在一次迭代中,我們會朝著與預期相反的方向移動。然而,平均而言,我們會朝著最小值的方向移動。

圖4.將資料整合批拆分

那麼按照什麼尺寸拆呢?在深度學習中的通常情況下,答案是不確定的,取決於具體情況。如果整個資料集就是一批,那麼我們基本上就是處理一個普通的梯度下降。另一方面,如果大小是1,那麼在每次迭代中,我們只使用資料集中的一個例項,因此失去了向量化的好處。這種方法有時是合理的,被稱為隨機梯度下降。在實際環境中,我們通常會選擇從64到512個例子的範圍裡選擇一箇中間值。

指數加權平均法(exponentially weighted averges,EWA)

這一思想被廣泛應用於統計學、經濟學、深度學習等領域。許多高階的神經網路優化演算法使用了這個思想,因為它允許我們持續優化,即使在給定點所計算的梯度是零的情況下。讓我們來了解一下這個演算法,我們將使用最大的一家科技公司的股票作為例子。

圖 5.視覺化地顯示給不同的β值計算指數加權平均數

EWA實質上是對許多得到的值計算平均數,以便不受區域性波動的影響而關注整體趨勢。EWA的值是使用上面的遞推公式計算的,其中β是用於控制要計算平均值的數的範圍。在隨後的迭代中,我們考慮了1 /(1 -β)的例子。對於較大的β值,得到的曲線更平滑,因為我們平均了許多記錄。另一方面,曲線越來越向右移動,因為當我們把很長一段時間內的值進行平均的時候,EWA對新的趨勢適應的比較慢。這在圖5中可以看到,其中我們說明了股票在收盤時的實際價格,顯示了給不同的β引數計算的指數加權平均值。

動量梯度下降法(Gradient descent with momentum)

該方法利用指數加權平均法來避免代價函式的梯度接近於零的點。簡單來說就是,我們允許演算法獲得動量,因此即使區域性梯度為零,我們仍然可以依靠之前計算的值向前移動。由於這個原因,它一直是一個比純梯度下降更好的選擇。

通常我們給網路的每一層使用反向傳播來計算dWdb的值。這次,我們首先計算VdWVdb的中間值,而不是直接使用計算出來的梯度來更新神經網路引數的值,這些值實際上是關於單個引數的代價函式導數的EWA。最後,我們將在梯度下降中使用VdWVdb。整個過程可用上述方程表示。值得注意的是,這種方法的實現需要在迭代之間儲存EWA的值。

圖6.動量梯度下降法

現在我們嘗試開發一個關於EWA影響模型行為的直覺能力。再次想象上面的輪廓象徵著我們優化的代價函式。上圖顯示標準梯度下降和動量梯度下降的比較。我們可以看到,代價函式圖表的形狀推動一種非常緩慢的優化方法。正如股票市場價格的例子一樣,使用指數加權平均法允許我們關注主要的趨勢而不是噪聲。指示最小值的分量被擴大,並且承擔波動的分量被慢慢消除。更重要的是,如果我們在後續的更新中獲得的梯度指向一個相似的方向,那麼學習率將會提高。這將導致更快的收斂和減少振盪。然而,這種方法有一個缺點—當你接近最小值的時候,動量值會增大,並且可能變得相當大,以至於演算法不能在正確的地方停止。

RMSProp演算法

另一種提高梯度下降效能的方法是使用RMSProp方法—均方根傳播(Root Mean Squared Propagation)。它是有適應能力的,允許為模型每個引數的學習率單個調整。隨後的引數值是基於之前為特定引數計算的梯度值。

使用圖6的例子和上面的方程,讓我們考慮這個方法背後的邏輯。根據名稱,在每次迭代中,我們計算相應引數的代價函式導數的每個元素的平方。此外,我們使用EWA來計算在最近迭代中獲得的值的平均數。最後,在更新網路引數值之前,將相應的梯度分量除以平方和的平方根。這意味著對於梯度大的引數,學習率降低得更快;反之,對於梯度小的引數,學習率降低得則更慢。以這種方式,我們的演算法會減少波動,並防止噪音影響訊號。為了避免零作除數(數值穩定性),我們要向分母新增一個非常小的值,在公式中標記為ɛ。

在寫本文的時候,我對所分析優化器的質量飛躍感到非常驚訝。第一個是當我看到標準梯度下降和小批量梯度下降之間的訓練時間上的差異時;第二,比較RMSprop與迄今為止我們看到的一切。然而,這種方法有其缺點。隨著上述方程的分母在每次迭代中增大,學習率會越來越小。因此,這可能會導致模型完全停止執行。

圖7. 優化器比較

Adam

最後,讓我說一下Adam(自適應矩估計)。這是一種演算法,和RMSProp一樣,在大量的應用中效果不錯。它利用了RMSProp的最大優點,將應用與動量優化的思想結合起來。結果就會得到一種允許快速且有效的優化策略。上圖顯示了討論過的優化器如何處理函式複雜部分的優化。可以看到Adam在這種情況下做得很好。

遺憾的是,隨著我們的方法有效性的提高,計算的複雜度也增大了。以上我寫了十個矩陣方程來描述優化過程的單次迭代。對於那些不太熟悉數學的人,別擔心,沒有新的東西,這些是之前為動量和RMSProp 優化器所寫的方程。我們將簡單地使用這兩種想法。

總結

我希望能以一種由淺入深的方式來解釋這些複雜的問題。本文的相關工作使我能夠理解選擇正確的優化器是多麼的重要。對這些演算法的理解會讓我們有意識地使用它們,瞭解個體超引數的變化如何影響整個模型的效能。


本文作者:【方向】

閱讀原文