教程 | 神經網絡的奧祕之優化器的妙用

選自 Towards Data Science

機器之心編譯

作者:Piotr Skalski

參與:張璽、路

加強對神經網絡內部運行流程的理解有助於研究者和開發者訓練神經網絡。本文作者 Piotr Skalski 撰寫了一系列文章介紹神經網絡的奧祕,本文就是其中一篇,介紹了神經網絡訓練過程中的常見優化策略,並進行了分析和對比,包括梯度下降、小批量梯度下降、動量梯度下降、RMSProp、Adam 等。

之前的文章介紹了,我可以只使用 Numpy 來創建神經網絡。這項挑戰性工作極大地加深了我對神經網絡內部運行流程的理解,還使我意識到影響神經網表現的因素有很多。精選的網絡架構、合理的超參數,甚至準確的參數初始化,都是其中一部分。本文將關注能夠顯著影響學習過程速度與預測準確率的決策──優化策略的選擇。本文挑選了一些常用優化器,研究其內在工作機制並進行對比。

注:由於我想覆蓋的學習材料範圍太大,因此文中未列出任何代碼段。不過,大家可以在 GitHub 上找到所有用於創建可視化的代碼。此外,我還準備了一些 notebook,幫助大家更好地理解本文所討論的問題。

代碼地址: https://github.com/SkalskiP/ILearnDeepLearning.py

優化

優化是不斷搜索參數以最小化或最大化目標函數的過程。我們通常使用間接優化方法訓練機器學習模型,選擇一個評價指標(如準確率、精度或召回率)表明模型求解給定問題的優良程度。但是,我們一直在優化不同的成本函數 J(θ),希望最小化成本函數以改善評價指標。毫無疑問,成本函數的選擇通常與需要解決的具體問題相關。本質上,這種「有意設計」表明我們與理想解決方案有多遠。正如大家所知,這個問題相當複雜,可以再另寫一篇主題文章。

沿途陷阱

結果證明,尋找非凸成本函數最小值通常不太容易,本文應用高級優化策略去定位最小值。如果你學過微積分,就一定知道局部極小值──優化器極易落入的最大陷阱之一。對於那些還不瞭解局部極小值之美的讀者,我只能說局部極小值是給定區域內函數取最小值的點集。如上圖左半部分所示,優化器定位的點並非是全局最優解。

而「鞍點」問題則被人們認爲更具挑戰性。當成本函數值幾乎不再變化時,就會形成平原(plateau),如上圖右半部分所示。在這些點上,任何方向的梯度都幾乎爲零,使得函數無法逃離該區域。

有時候,尤其是在多層網絡中,我們必須處理成本函數的陡峭區域。陡峭區域中的梯度增長迅速(也就是梯度爆炸)會引起大步躍遷,通常會破壞先前的優化結果。不過,該問題可以通過梯度裁剪輕鬆解決。

梯度下降

在學習高級算法前,我們先來了解一些基本策略。最直接有效的方法之一是向函數上當前點對應梯度的反方向前進,公式如下:

超參數 α 表示學習率,代表算法每次迭代過程的前進步長。學習率的選擇一定程度上代表了學習速度與結果準確率之間的權衡。選擇步長過小不利於算法求解,且增加迭代次數。反之,選擇步長過大則很難發現最小值。具體過程見圖 2,圖中展示了不穩定的迭代過程。而選擇合適步長後,模型幾乎立即發現最小點。

圖 2. 大、小學習率條件下梯度下降過程的可視化。爲了易於觀察,圖中僅展示了最後 10 步的可視化情況。

此外,該算法很容易受鞍點問題的影響。因爲後續迭代過程的步長與計算得到的梯度成比例,所以我們無法擺脫 plateau。

最重要的是,算法由於每次迭代過程中都需要使用整個訓練集而變得低效。這意味着,在每個 epoch 中我們都必須考慮所有樣本,以確保執行下輪優化。對於只有幾千個樣本的訓練集來說,這也許不是問題。但是,擁有數百萬樣本的神經網絡才能表現最佳。基於此,每次迭代都使用全部數據集令人難以想象,既浪費時間又佔用內存。上述原因致使純粹的梯度下降無法應用於大部分情況。

小批量梯度下降

圖 3. 梯度下降與小批量梯度下降對比圖。

我們首先嚐試解決上一節提到的最後一個問題──低效性。儘量向量化通過單次處理多個訓練樣本來加速計算,但在使用百萬量級的數據集時優化過程還是需要花費很長時間。此處,我們試用一個簡單的方法──將完整數據集切分成許多小批量以完成後續訓練。小批量梯度下降的可視化動圖見圖 3。假設左圖的等高線象徵需要優化的成本函數。如圖所示,由於新算法的待處理數據較少,它能夠快速完成優化。我們再看看兩個模型的移動軌跡對比。當噪音較少時,梯度下降採取較少步和相對較大的步長。另一方面,小批量梯度下降前進更頻繁,但由於數據集的多樣性,噪聲更多。甚至可能在某次迭代過程中,算法移動的方向與預計方向相反。不過,小批量梯度下降通常一直朝向最小值移動。

圖 4. 將數據集劃分爲多個批量。

大家肯定想知道如何選擇批量大小?以深度學習爲例,批量大小通常不是絕對的,應參照具體情況。如果批量與整體數據集大小相等,那它就與普通梯度下降無異。另一方面,如果批量爲 1,那麼算法每次迭代僅適用數據集中的 1 個樣本,這也失去了向量化的意義,該方法有時被稱爲隨機梯度下降。實際情況下,我們通常會選擇中間值──64 至 512 個樣本。

指數加權平均

指數加權平均應用廣泛,如統計學、經濟學,甚至深度學習。即便給定點的梯度爲 0,指數加權平均仍能持續優化,所以許多高級神經網絡優化算法都採用此概念。

圖 5. 不同 β值的指數加權平均(EWA)圖示。

指數加權平均本質上是對之前的數值求平均值,避免局部波動,關注整體趨勢。指數加權平均的計算公式如上所示,其中參數 β 控制待平均的數的範圍。後續迭代過程中,算法將使用 1/(1 - β) 個樣本。β 值越大,平均的樣本數越多,圖像越平滑。另一方面,圖像緩慢右移是因爲,平均時間範圍較長會使指數加權平均適應新趨勢較慢。如圖 5 所示,股票實際收盤價與另外 4 條曲線展示了不同 β 值條件下的指數加權平均值。

動量梯度下降

動量梯度下降利用指數加權平均,來避免成本函數的梯度趨近於零的問題。簡單說,允許算法獲得動量,這樣即使局部梯度爲零,算法基於先前的計算值仍可以繼續前進。所以,動量梯度下降幾乎始終優於純梯度下降。

如以往一樣,我們使用反向傳播計算網絡各層的 dW 和 db 值。然而,這次我們沒有直接使用計算梯度來更新神經網絡參數,我們首先計算 VdW 和 Vdb 的中間值。然後在梯度下降中使用 VdW 和 Vdb。值得注意的是,實現該方法需要記錄迭代過程中的指數加權平均值。大家可以在 Github 中看到全部過程。

圖 6. 動量梯度下降。

我們嘗試想象下指數加權平均對模型行爲的影響,再想象下成本函數的等高線。上圖對比展示了標準梯度下降與動量梯度下降。我們可以看到成本函數圖的形態使得優化非常緩慢。以股市價格爲例,使用指數加權平均使得算法專注於未來走勢而非噪聲。最小值分量被放大,振盪分量逐漸消失。此外,如果後續更新過程中所得梯度指向類似方向,則學習率將增加,進而實現更快收斂並減少振盪。然而,動量梯度下降的不足之處在於,每當臨近最小點,動量就會增加。如果動量增加過大,算法將無法停在正確位置。

RMSProp

RMSProp(Root Mean Squared Propagation)是另一種改善梯度下降性能的策略,是最常用的優化器。該算法也使用指數加權平均。而且,它具備自適應性──其允許單獨調整模型各參數的學習率。後續參數值基於爲特定參數計算的之前梯度值。

運用圖 6 及上述公式,大家來思考下該策略背後的邏輯。顧名思義,每次迭代我們都要計算特定參數的成本函數的導數平方。此外,使用指數加權平均對近期迭代獲取值求平均。最終,在更新網絡參數之前,相應的梯度除以平方和的平方根。這表示梯度越大,參數學習率下降越快;梯度越小,參數學習率下降越慢。該算法用這種方式減少振盪,避免支配信號而產生的噪聲。爲了避免遇到零數相除的情況(數值穩定性),我們給分母添加了極小值 ɛ。

必須承認,在本篇文章的寫作過程中,我有兩次異常興奮的時刻──本文所提及優化器的快速革新讓我震驚不已。第一次是當我發現標準梯度下降和小批量梯度下降訓練時間的差異。第二次就是現在,比較 RMSprop 與我知道的所有優化器。然而,RMSprop 也有缺點。由於每次迭代過程中公式的分母都會變大,學習率會逐漸變小,最終可能會使模型完全停止。

圖 7. 優化器對比。

Adam

最後,我再說說 ADAM。與 RMSProp 類似,ADAM 應用廣泛且表現不俗。它利用了 RMSProp 的最大優點,且與動量優化思想相結合,形成快速高效的優化策略。上圖展示了本文討論的幾類優化器在處理函數困難部分的優化過程。Adam 的優異表現一目瞭然。

不幸的是,隨着優化方法有效性的提高,計算複雜度也會增加。上面列了 10 個描述優化過程單次迭代的矩陣公式。我知道那些數學基礎薄弱的讀者情緒肯定不高。但是不要擔心,它們並不是什麼新內容。這裏的公式和前文給出的動量梯度下降和 RMSProp 一樣。不過這裏我們需要一次性運用這兩個策略的思路。

總結

希望本文能夠深入淺出地解釋所有難點。在這篇文章的寫作過程中,我明白了選擇合適優化器的重要性。理解上述算法才能自如地運用優化器,理解每個超參數如何改變整個模型的性能。

原文鏈接:https://towardsdatascience.com/how-to-train-neural-network-faster-with-optimizers-d297730b3713

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章