快速訓練神經網路的優化演算法一覽
作者:Piotr Skalski
編譯:Bing
今天的文章會重點關注決定神經網路學習處理速度的因素,以及獲得預測的精確度,即優化策略的選擇。我們會講解多種主流的優化策略,研究它們的工作原理,並進行相互比較。
機器學習演算法的優化
優化是尋找可以讓函式最小化或最大化的引數的過程。當我們訓練機器學習模型時,我們通常會使用間接優化,選擇一種特定的衡量尺度,例如精確度或查全率等可以表現模型解決方法表現的指標。但是我們現在進行優化的是另一種不同的價值函式J(θ),希望通過將它的值最小化後,提高目標指標的表現。當然,價值函式的選擇通常和正在解決的問題有關,更重要的是,它通常表示我們距離理想解決方案的距離。可以想象,這一話題非常複雜。
陷阱無處不在
通常,找到非凸價值函式的最小值並不容易,我們必須用高階的優化策略定位它們。如果你學過微積分,你會了解“區域性最小值”的定義——這可能是優化器最容易陷入的陷阱。此類情景的例子可以從上圖左邊看到,可以清楚地發現,優化器定位的點並不是最優解。
想克服所謂的“鞍點”問題會更困難。在水平處,價值函式的值幾乎是常數,上圖右側體現了這一問題,在這些點上,梯度在各個方向上幾乎為零,所以很難逃脫。
有時,尤其是在多層網路中,我們要處理的價值函式可能很陡。在這種區域,梯度的值可能會急劇增加,即形成梯度爆炸,導致巨大的步長。但是這一問題可以通過梯度裁剪(gradient clipping)避免。
梯度下降
在瞭解高階演算法之前,先讓我們看看基礎演算法。也許最直接的方法之一就是向梯度的相反方向發展。這一策略可以用以下公式表示:
其中α是一個稱為學習率的超引數,是每次迭代中採取的步長長度。在某種程度上,它的選擇表示了在學習速度和精確度之間的權衡。選擇的步長太小就會導致繁瑣的計算,不可避免地會進行多次迭代。但是,選擇的值過大,又無法找到最小值。如下圖所示,我們可以看到在相鄰的兩次迭代上是如何變化的,而不是趨於穩定。同時,如果模型確定了合適的步長,可能會立刻找到一個最小值。
除此之外,演算法還對“鞍點”問題很脆弱,因為在連續迭代中的修正尺寸對計算梯度是成比例的,這樣的話,就無法從平坦處逃脫。
最後,重點是這種演算法並不高效,它在每次迭代中都需要用全部的訓練集。這意味著,在每個epoch中我們都要檢視所有樣本,從而在下次進行優化。如果只有幾千個樣本還好,但如果有上百萬個樣本呢?在這種情況下,很難想象每次迭代需要花費多少時間
mini-batch梯度下降
在這一部分,我們要重點解決梯度下降不高效的問題。雖然向量化處理加速了計算,當資料集有百萬個樣本時,可以一次性處理多個訓練樣本。這裡我們可以試試另一種方法,將整個資料集分成多個更小的批次(batch),用它們進行連續迭代。如上面動圖所示,由於每次處理的資料量更少了,新演算法做決策的速度更快了。另外注意觀察模型之間動作的對比。梯度下降演算法每一步都很長,且噪聲較小,而mini-batch梯度下降的步長更小,噪聲更大。甚至在mini-batch中,一次迭代可能會向相反方向發展。但是平均來說,都能達到最小值。
那麼怎樣選擇batch size呢?在深度學習中,這類答案是不固定的,取決於要解決的案例。如果batch size等於整個資料集,那麼處理起來就是普通的梯度下降。如果size為1,那麼每次迭代禁止資料集的一個樣本。這種方法通常比較公平,常見的就是隨機梯度下降,它是通過選擇一個隨機資料集記錄,用它們當做訓練集進行連續迭代。但是,如果我們決定使用mini-batch,通常會選擇一箇中間值,通常是從64到512之間的樣本中選擇。
指數加權平均
這一概念在統計學或經濟學中都有出現。很多高階神經網路優化演算法都用到了這一方法,因為它能在梯度為零的情況下依舊進行優化。我們接下來以去年至今某大型科技公司的股票走勢為例進行講解。
EWA主要是對之前的值進行平均,以便獨立考慮區域性波動,並專注於整體趨勢。它的值使用上面的遞迴公式計算的,其中β適用於控制要平均的值的範圍引數。對於較大的β值,我們得到的圖形更平滑,因為記錄更多。
帶有動量的梯度下降
這一策略用指數加權平均避免了某一點處價值函式接近於0的可能。簡單來說,我們讓演算法具有一定動量,所以即使區域性梯度為0,我們仍然可以更具此前計算的值向前。所以這與純梯度下降相比是更好的方法。
通常,我們用反向傳播計算網路中每一層dW和db的值。但是這一次,我們不直接用計算梯度更新神經網路引數的值,而是先計算 和 的中間值。之後我們在梯度下降中用刀 和 ,過程如下公式所示:
如上文中股票的例子,指數加權平均可以讓我們專注於領先趨勢而不是噪聲。指示最小值的分量被放大,並且緩慢消除負責震盪的分量。更重要的是,如果我們在後續更新中獲得指向類似方向的梯度,則學習率將增加。然而,這種方法有一個缺點:當你接近最小值時,動量值會增加,並且可能會變得很大,以至於演算法無法再正確位置停止。
RMSProp
另一種提高梯度下降效能的方法就是使用RMSProp策略,這也是最常用的優化演算法之一。這也是另一種使用甲醛梯度下降的演算法,並且它是可自適應的,可以對模型每個引數調整學習率。後續引數的值取決於此前特殊引數上梯度的值。
但是,這種方法也有缺點,如上等式中的分母在每次迭代中增加,我們的學習率就會越來越小,結果可能導致模型完全停止。
Adam
最後的最後,我們來到了自適應動量估計。這也是使用廣泛的演算法,它吸取了RMSProp最大的優點,將動量優化的概念相結合,使得策略可以做出快速高效的優化。
但是,儘管方法高效,計算的複雜程度也相應上升。如上所示,我寫了十個矩陣等式,表示優化過程中的單次迭代。可能很多人看起來都非常陌生。不要擔心!這些等式和此前的動量和RMSProp優化演算法相似。
結語
這篇文章對幾種優化演算法做了大致總結,瞭解這些演算法有助於在不同情況下正確使用。如果想了解更多細節,可以閱讀論智此前的優化算法系列文章:
ofollow,noindex">深度學習優化演算法入門:一、梯度下降