通過使用Numpy來建立神經網絡,讓我意識到有哪些因素影響着神經網絡的性能。架構、超參數值、參數初始化,僅是其中的一部分,而這次我們将緻力于對學習過程的速度有巨大影響的決策,以及所獲得的預測的準确性—對優化政策的選擇。我們會研究很多流行的優化器,研究它們的工作原理,并進行對比。
你在
GitHub 上可以找到所有代碼:機器學習算法的優化
優化是搜尋用于最小化或最大化函數參數的過程。當我們訓練機器學習模型的時候,通常使用間接優化。我們選擇某種度量,如精确度或回調,來訓示模型如何很好地解決給定問題。然而,我們正在優化一個不同的代價函數J(θ),并且希望把它最小化以提高我們關心的度量。當然,代價函數的選擇通常與我們要解決的具體問題有關。本質上,它表明了我們離理想的解決方案有多遠。

陷阱
結果證明,通常要找到最小的非凸代價函數并不容易,我們必須使用先進的優化政策來找到它們。如果你已經學過了微分,就一定知道局部最小值的概念,這些是我們的優化器可能陷入的最大陷阱。對于那些還沒有接觸過這個數學概念的人,我隻能說這些是在給定的區域内函數取最小值的點,如上圖左側所示。
克服所謂的鞍點(saddle points)通常被認為更具有挑戰性。這些是穩定狀态,其中代價函數的值幾乎是不變的。這種情況顯示在上圖的右側。在這些點上,梯度幾乎在所有方向上都被歸零,使得無法逃離。
有時候,特别是在多層網絡的情況下,我們可能必須處理代價函數中非常陡峭的區域。在這些地方,梯度的值急劇地增加,引起梯度爆炸,這會緻使采取一些極大的步驟長度,并經常破壞之前的整個優化工作。然而,通過梯度裁剪,就是定義允許的最大梯度值,就可以很容易地避免這個問題。
梯度下降法(Gradient descent)
在我們了解更好的算法之前,先看看一些基本的政策方法。可能一個最簡單的方法就是簡單地沿着與梯度相反的方向移動,這個方法可以用下面的等式來表示:
其中,α是一個稱為學習率的超參數,它會轉換為我們将在每次疊代中采取的步驟長度。它的值在一定程度上表示了一種折中選擇,是學習的速度和可以獲得結果的準确性之間的。選擇太小的步驟長度會導緻我們冗長的計算和執行更多的疊代。另一方面,無論如何,選擇過大的步驟長度可以有效地阻止我們找到最小值。在圖2中表示了這種情況,我們可以看到,在随後的疊代中,如何振動,而不能保持穩定。在此期間,定義了适當步驟的模型幾乎立即就被發現了。
對于國小習率和大學習率的值的梯度下降行為的可視化。
此外,這個算法容易受到前面描述的鞍點問題的影響。由于在随後的疊代過程中執行校正的大小與計算的梯度成正比,我們将無法擺脫平穩期。
最後,為了達到這一目的,該算法是無效的,它要求在每次疊代中使用整個訓練集。這意味着,在每一個時期,我們必須檢視所有的例子,以便執行下一步的優化。當訓練集包含數千個例子的時候,這可能不是問題,但是正如我在之前提到的,當有數百萬條記錄可供使用時,神經網絡工作的效果最好,但在這種情況下,很難想象在每次疊代中我們都使用整個集合,這會浪費時間和計算機資源。
小批量梯度下降法(Mini-bach Gradient descent)
梯度下降與小批量梯度下降的比較
讓我們來解決上節中提到的最後一個問題——低效。雖然向量化允許我們可以加速計算,但是要一次性處理太多的訓練執行個體,并且當資料集具有數百萬條記錄時,整個處理過程仍然需要很長時間才能完成。讓我們試着使用一個相當簡單的解決方法,将整個資料集分成更小的部分,在随後的疊代中進行訓練。假設左邊的圖形表示我們想要優化的代價函數。可以看到,由于我們需要處理的資料量要小得多,新算法就會使得決策更快。讓我們來看下比較模型移動中的對比。梯度下降會采取罕見的、相對大的步驟,幾乎沒有噪音。另一方面,批量梯度下降更頻繁地執行步驟,但是由于被分析的資料集中可能存在多樣性,則會有更多的噪音。甚至在一次疊代中,我們會朝着與預期相反的方向移動。然而,平均而言,我們會朝着最小值的方向移動。
将資料內建批拆分
那麼按照什麼尺寸拆呢?在深度學習中的通常情況下,答案是不确定的,取決于具體情況。如果整個資料集就是一批,那麼我們基本上就是處理一個普通的梯度下降。另一方面,如果大小是1,那麼在每次疊代中,我們隻使用資料集中的一個執行個體,是以失去了向量化的好處。這種方法有時是合理的,被稱為随機梯度下降。在實際環境中,我們通常會選擇從64到512個例子的範圍裡選擇一個中間值。
指數權重平均法( exponentially weighted averges ,EWA)
這一思想被廣泛應用于統計學、經濟學、深度學習等領域。許多進階的神經網絡優化算法使用了這個思想,因為它允許我們持續優化,即使在給定點所計算的梯度是零的情況下。讓我們來了解一下這個算法,我們将使用最大的一家科技公司的股票作為例子。
可視化地顯示給不同的β值計算指數權重平均數
EWA實質上是對許多得到的值計算平均數,以便不受局部波動的影響而關注整體趨勢。EWA的值是使用上面的遞推公式計算的,其中β是用于控制要計算平均值的數的範圍。在随後的疊代中,我們考慮了1 /(1 -β)的例子。對于較大的β值,得到的曲線更平滑,因為我們平均了許多記錄。另一方面,曲線越來越向右移動,因為當我們把很長一段時間内的值進行平均的時候,EWA對新的趨勢适應的比較慢。這在圖5中可以看到,其中我們說明了股票在收盤時的實際價格,顯示了給不同的β參數計算的指數權重平均值。
動量梯度下降法(Gradient descent with momentum)
該方法利用指數權重平均法來避免代價函數的梯度接近于零的點。簡單來說就是,我們允許算法獲得動量,是以即使局部梯度為零,我們仍然可以依靠之前計算的值向前移動。由于這個原因,它一直是一個比純梯度下降更好的選擇。
通常我們給網絡的每一層使用反向傳播來計算
dW和
db的值。這次,我們首先計算
VdW Vdb的中間值,而不是直接使用計算出來的梯度來更新神經網絡參數的值,這些值實際上是關于單個參數的代價函數導數的EWA。最後,我們将在梯度下降中使用
。整個過程可用上述方程表示。值得注意的是,這種方法的實作需要在疊代之間存儲EWA的值。
現在我們嘗試開發一個關于EWA影響模型行為的直覺能力。再次想象上面的輪廓象征着我們優化的代價函數。上圖顯示标準梯度下降和動量梯度下降的比較。我們可以看到,代價函數圖表的形狀推動一種非常緩慢的優化方法。正如股票市場價格的例子一樣,使用指數權重平均法允許我們關注主要的趨勢而不是噪聲。訓示最小值的分量被擴大,并且承擔波動的分量被慢慢消除。更重要的是,如果我們在後續的更新中獲得的梯度指向一個相似的方向,那麼學習率将會提高。這将導緻更快的收斂和減少振蕩。然而,這種方法有一個缺點—當你接近最小值的時候,動量值會增大,并且可能變得相當大,以至于算法不能在正确的地方停止。
RMSProp 算法
另一種提高梯度下降性能的方法是使用RMSProp方法—均方根傳播(Root Mean Squared Propagation)。它是有适應能力的,允許為模型每個參數的學習率單個調整。随後的參數值是基于之前為特定參數計算的梯度值。
使用圖6的例子和上面的方程,讓我們考慮這個方法背後的邏輯。根據名稱,在每次疊代中,我們計算相應參數的代價函數導數的每個元素的平方。此外,我們使用EWA來計算在最近疊代中獲得的值的平均數。最後,在更新網絡參數值之前,将相應的梯度分量除以平方和的平方根。這意味着對于梯度大的參數,學習率降低得更快;反之,對于梯度小的參數,學習率降低得則更慢。以這種方式,我們的算法會減少波動,并防止噪音影響信号。為了避免零作除數(數值穩定性),我們要向分母添加一個非常小的值,在公式中标記為ɛ。
在寫本文的時候,我對所分析優化器的品質飛躍感到非常驚訝。第一個是當我看到标準梯度下降和小批量梯度下降之間的訓練時間上的差異時;第二,比較RMSprop與迄今為止我們看到的一切。然而,這種方法有其缺點。随着上述方程的分母在每次疊代中增大,學習率會越來越小。是以,這可能會導緻模型完全停止運作。
優化器比較
Adam
最後,讓我說一下Adam(自适應矩估計)。這是一種算法,和RMSProp一樣,在大量的應用中效果不錯。它利用了RMSProp的最大優點,将應用與動量優化的思想結合起來。結果就會得到一種允許快速且有效的優化政策。上圖顯示了讨論過的優化器如何處理函數複雜部分的優化。可以看到Adam在這種情況下做得很好。
遺憾的是,随着我們的方法有效性的提高,計算的複雜度也增大了。以上我寫了十個矩陣方程來描述優化過程的單次疊代。對于那些不太熟悉數學的人,别擔心,沒有新的東西,這些是之前為動量和RMSProp 優化器所寫的方程。我們将簡單地使用這兩種想法。
總結
我希望能以一種由淺入深的方式來解釋這些複雜的問題。本文的相關工作使我能夠了解選擇正确的優化器是多麼的重要。對這些算法的了解會讓我們有意識地使用它們,了解個體超參數的變化如何影響整個模型的性能。
本文由北郵
@愛可可-愛生活老師推薦,
阿裡雲雲栖社群組織翻譯。
文章原标題《how to train neural network faster with optimizers》
作者:Piotr Skalski
譯者:奧特曼,審校:袁虎。
文章為簡譯,更為詳細的内容,請檢視
原文