摘要: 本文介紹了建立神經網絡時使用的多種優化器,並講述瞭如何使用優化器讓訓練網絡更快。git
經過使用Numpy來建立神經網絡,讓我意識到有哪些因素影響着神經網絡的性能。架構、超參數值、參數初始化,僅是其中的一部分,而此次咱們將致力於對學習過程的速度有巨大影響的決策,以及所得到的預測的準確性—對優化策略的選擇。咱們會研究不少流行的優化器,研究它們的工做原理,並進行對比。github
你在GitHub上能夠找到全部代碼:算法
優化是搜索用於最小化或最大化函數參數的過程。當咱們訓練機器學習模型的時候,一般使用間接優化。咱們選擇某種度量,如精確度或回調,來指示模型如何很好地解決給定問題。然而,咱們正在優化一個不一樣的代價函數J(θ),而且但願把它最小化以提升咱們關心的度量。固然,代價函數的選擇一般與咱們要解決的具體問題有關。本質上,它代表了咱們離理想的解決方案有多遠。網絡
結果證實,一般要找到最小的非凸代價函數並不容易,咱們必須使用先進的優化策略來找到它們。若是你已經學過了微分,就必定知道局部最小值的概念,這些是咱們的優化器可能陷入的最大陷阱。對於那些尚未接觸過這個數學概念的人,我只能說這些是在給定的區域內函數取最小值的點,如上圖左側所示。架構
克服所謂的鞍點(saddle points)一般被認爲更具備挑戰性。這些是穩定狀態,其中代價函數的值幾乎是不變的。這種狀況顯示在上圖的右側。在這些點上,梯度幾乎在全部方向上都被歸零,使得沒法逃離。機器學習
有時候,特別是在多層網絡的狀況下,咱們可能必須處理代價函數中很是陡峭的區域。在這些地方,梯度的值急劇地增長,引發梯度爆炸,這會導致採起一些極大的步驟長度,並常常破壞以前的整個優化工做。然而,經過梯度裁剪,就是定義容許的最大梯度值,就能夠很容易地避免這個問題。函數
在咱們瞭解更好的算法以前,先看看一些基本的策略方法。可能一個最簡單的方法就是簡單地沿着與梯度相反的方向移動,這個方法能夠用下面的等式來表示:性能
其中,α是一個稱爲學習率的超參數,它會轉換爲咱們將在每次迭代中採起的步驟長度。它的值在必定程度上表示了一種折中選擇,是學習的速度和能夠得到結果的準確性之間的。選擇過小的步驟長度會致使咱們冗長的計算和執行更多的迭代。另外一方面,不管如何,選擇過大的步驟長度能夠有效地阻止咱們找到最小值。在圖2中表示了這種狀況,咱們能夠看到,在隨後的迭代中,如何振動,而不能保持穩定。在此期間,定義了適當步驟的模型幾乎當即就被發現了。學習
圖2.對於小學習率和大學習率的值的梯度降低行爲的可視化。優化
此外,這個算法容易受到前面描述的鞍點問題的影響。因爲在隨後的迭代過程當中執行校訂的大小與計算的梯度成正比,咱們將沒法擺脫平穩期。
最後,爲了達到這一目的,該算法是無效的,它要求在每次迭代中使用整個訓練集。這意味着,在每個時期,咱們必須查看全部的例子,以便執行下一步的優化。當訓練集包含數千個例子的時候,這可能不是問題,可是正如我在以前提到的,當有數百萬條記錄可供使用時,神經網絡工做的效果最好,但在這種狀況下,很難想象在每次迭代中咱們都使用整個集合,這會浪費時間和計算機資源。
圖 3.梯度降低與小批量梯度降低的比較
讓咱們來解決上節中提到的最後一個問題——低效。雖然向量化容許咱們能夠加速計算,可是要一次性處理太多的訓練實例,而且當數據集具備數百萬條記錄時,整個處理過程仍然須要很長時間才能完成。讓咱們試着使用一個至關簡單的解決方法,將整個數據集分紅更小的部分,在隨後的迭代中進行訓練。假設左邊的圖形表示咱們想要優化的代價函數。能夠看到,因爲咱們須要處理的數據量要小得多,新算法就會使得決策更快。讓咱們來看下比較模型移動中的對比。梯度降低會採起罕見的、相對大的步驟,幾乎沒有噪音。另外一方面,批量梯度降低更頻繁地執行步驟,可是因爲被分析的數據集中可能存在多樣性,則會有更多的噪音。甚至在一次迭代中,咱們會朝着與預期相反的方向移動。然而,平均而言,咱們會朝着最小值的方向移動。
圖4.將數據集成批拆分
那麼按照什麼尺寸拆呢?在深度學習中的一般狀況下,答案是不肯定的,取決於具體狀況。若是整個數據集就是一批,那麼咱們基本上就是處理一個普通的梯度降低。另外一方面,若是大小是1,那麼在每次迭代中,咱們只使用數據集中的一個實例,所以失去了向量化的好處。這種方法有時是合理的,被稱爲隨機梯度降低。在實際環境中,咱們一般會選擇從64到512個例子的範圍裏選擇一箇中間值。
這一思想被普遍應用於統計學、經濟學、深度學習等領域。許多高級的神經網絡優化算法使用了這個思想,由於它容許咱們持續優化,即便在給定點所計算的梯度是零的狀況下。讓咱們來了解一下這個算法,咱們將使用最大的一家科技公司的股票做爲例子。
圖 5.可視化地顯示給不一樣的β值計算指數加權平均數
EWA實質上是對許多獲得的值計算平均數,以便不受局部波動的影響而關注總體趨勢。EWA的值是使用上面的遞推公式計算的,其中β是用於控制要計算平均值的數的範圍。在隨後的迭代中,咱們考慮了1 /(1 -β)的例子。對於較大的β值,獲得的曲線更平滑,由於咱們平均了許多記錄。另外一方面,曲線愈來愈向右移動,由於當咱們把很長一段時間內的值進行平均的時候,EWA對新的趨勢適應的比較慢。這在圖5中能夠看到,其中咱們說明了股票在收盤時的實際價格,顯示了給不一樣的β參數計算的指數加權平均值。
該方法利用指數加權平均法來避免代價函數的梯度接近於零的點。簡單來講就是,咱們容許算法得到動量,所以即便局部梯度爲零,咱們仍然能夠依靠以前計算的值向前移動。因爲這個緣由,它一直是一個比純梯度降低更好的選擇。
一般咱們給網絡的每一層使用反向傳播來計算dW和db的值。此次,咱們首先計算VdW和Vdb的中間值,而不是直接使用計算出來的梯度來更新神經網絡參數的值,這些值其實是關於單個參數的代價函數導數的EWA。最後,咱們將在梯度降低中使用VdW和Vdb。整個過程可用上述方程表示。值得注意的是,這種方法的實現須要在迭代之間存儲EWA的值。
圖6.動量梯度降低法
如今咱們嘗試開發一個關於EWA影響模型行爲的直覺能力。再次想象上面的輪廓象徵着咱們優化的代價函數。上圖顯示標準梯度降低和動量梯度降低的比較。咱們能夠看到,代價函數圖表的形狀推進一種很是緩慢的優化方法。正如股票市場價格的例子同樣,使用指數加權平均法容許咱們關注主要的趨勢而不是噪聲。指示最小值的份量被擴大,而且承擔波動的份量被慢慢消除。更重要的是,若是咱們在後續的更新中得到的梯度指向一個類似的方向,那麼學習率將會提升。這將致使更快的收斂和減小振盪。然而,這種方法有一個缺點—當你接近最小值的時候,動量值會增大,而且可能變得至關大,以致於算法不能在正確的地方中止。
另外一種提升梯度降低性能的方法是使用RMSProp方法—均方根傳播(Root Mean Squared Propagation)。它是有適應能力的,容許爲模型每一個參數的學習率單個調整。隨後的參數值是基於以前爲特定參數計算的梯度值。
使用圖6的例子和上面的方程,讓咱們考慮這個方法背後的邏輯。根據名稱,在每次迭代中,咱們計算相應參數的代價函數導數的每一個元素的平方。此外,咱們使用EWA來計算在最近迭代中得到的值的平均數。最後,在更新網絡參數值以前,將相應的梯度份量除以平方和的平方根。這意味着對於梯度大的參數,學習率下降得更快;反之,對於梯度小的參數,學習率下降得則更慢。以這種方式,咱們的算法會減小波動,並防止噪音影響信號。爲了不零做除數(數值穩定性),咱們要向分母添加一個很是小的值,在公式中標記爲ɛ。
在寫本文的時候,我對所分析優化器的質量飛躍感到很是驚訝。第一個是當我看到標準梯度降低和小批量梯度降低之間的訓練時間上的差別時;第二,比較RMSprop與迄今爲止咱們看到的一切。然而,這種方法有其缺點。隨着上述方程的分母在每次迭代中增大,學習率會愈來愈小。所以,這可能會致使模型徹底中止運行。
圖7. 優化器比較
最後,讓我說一下Adam(自適應矩估計)。這是一種算法,和RMSProp同樣,在大量的應用中效果不錯。它利用了RMSProp的最大優勢,將應用與動量優化的思想結合起來。結果就會獲得一種容許快速且有效的優化策略。上圖顯示了討論過的優化器如何處理函數複雜部分的優化。能夠看到Adam在這種狀況下作得很好。
遺憾的是,隨着咱們的方法有效性的提升,計算的複雜度也增大了。以上我寫了十個矩陣方程來描述優化過程的單次迭代。對於那些不太熟悉數學的人,別擔憂,沒有新的東西,這些是以前爲動量和RMSProp 優化器所寫的方程。咱們將簡單地使用這兩種想法。
我但願能以一種由淺入深的方式來解釋這些複雜的問題。本文的相關工做使我可以理解選擇正確的優化器是多麼的重要。對這些算法的理解會讓咱們有意識地使用它們,瞭解個體超參數的變化如何影響整個模型的性能。