深度模型中的優化(一)、學習和純優化有什麼不同

  • 2019 年 10 月 5 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/weixin_36670529/article/details/100663905


深度學習在許多情況下都涉及優化。例如,模型中的進行推斷(如PCA)涉及求解優化問題。我們經常使用解析優化去證明或設計演算法。在深度學習涉及到的諸多優化問題中,最難的是神經網路訓練,甚至是幾百台機器投入幾天到幾個月來解析單個神經網路訓練問題,也是很常見的。因為這其中的優化問題很重要,代價也很高,因此研究者們開發了一組專門為此設計的優化技術。下面關注一類特定的優化問題:尋找神經網路上的一組參數

,它能顯著的降低代價函數

,該代價函數通常包括整個訓練集上的性能評估和額外的正則化。

1、學習和純優化有什麼不同

用於深度模型訓練的優化演算法與傳統的優化演算法在幾個方面有所不同。機器學習通常是間接作用的。在大多數機器學習問題中,我們關注某些性能度量P,其定義域測試集上並且可能是不可解的。因此,我們只是間接的優化P。我們希望通過降低代價函數

來提高P。這一點與純優化不同,純優化最小化目標J本身。訓練深度模型的優化演算法通常也會包括一些針對機器學習目標函數的特定結構進行的特化。

通常,代價函數可寫為訓練集上的平均,如

(1)

其中L是每個樣本的損失函數,

是輸入x時所預測的輸出,

是經驗分布。監督學習中,y是目標輸出,L的變數是

和y。不難將這種監督學習擴展成其他形式,如包括

或者

作為參數,或是去掉參數

,以發展不同形式的正則化或是無監督學習。式(1)定義了訓練集上的目標函數。通常,我們更希望最小化取自數據生成分布

的期望,而不僅僅是有限訓練集上的對應目標函數:

(2)

2、經驗風險最小化

機器學習演算法的目標是降低式(2)所示的期望泛化誤差。這個數據量被稱為風險(risk)。在這裡,我么強調該期望取自真實的潛在分布

。如果我們知道了真實分布

,那麼最小化風險變成了一個可以被優化演算法解決的優化問題。然而,我們遇到的機器學習問題,通常是不知道

,只知道訓練集中的樣本。將機器學習問題轉化問題的最簡單方法是最小化訓練集上的期望損失。這意味著用訓練集上的經驗分布

替代真實分布

。現在,我們將最小化經驗風險(empirical risk):

(3)

其中m表示訓練樣本的數目。

基於最小化這種平均訓練誤差的訓練過程被稱為經驗風險最小化(empirical risk minimization)在這種情況下,機器學習仍然和傳統的直接優化很相似。我們並不直接最優化風險,而是最優化經驗風險,希望也能夠很大的降低風險。一系列不同的理念構成了一些條件,使得在這些條件下真實風險的期望可以下降不同的量。然而,經驗風險最小化最容易導致過擬合。高容量的模型會簡單地記住訓練集。在很多情況下,經驗風險最小化並非真的可行。最有效的現代優化演算法是基於梯度下降的,但是很多有用的損失函數,如0-1損失,沒有有效的導數(導數要麼為0,要麼處處未定義)。這兩個問題說明,在深度學習中,我們很少使用經驗風險最小化。反之,我們會使用一個稍有不同的方法,我們真正優化的目標會更加不同於我們希望優化的目標。

3、代理損失函數和提前終止

有時,我們真正關注的損失函數(比如分類誤差)並不能被有效地優化。例如,即使對於線性分類器而言,精確地最小化0-1損失通常是不可解的(複雜度是輸入維數的指數級別)。在這種情況下,我們通常會優化代理損失函數(surrogate loss function)。代理損失函數作為原目標的代理,還具備一些優點。例如,正確類別的負對數似然通常用作0-1損失的代替。負對數似然允許模型估計給定樣本的類別的條件概率,如果該模型效果好,那麼它能夠輸出期望最小分類誤差所對應的類別。

在某些情況下,代理損失函數比原函數學到的更多。例如,使用對數似然替代函數時,在訓練集上的0-1損失達到0之後,測試集上的0-1損失還能持續下降很長一段時間。這是因為即使0-1損失期望是零時,我們還能來開不同類別的距離以改進分類器的魯棒性,獲得一個更強壯的、更值得信賴的分類器,從而,相對於簡單地最小化訓練集上的平均0-1損失,它能夠從訓練集數據中抽取更多資訊。

一般的優化和我們用於訓練演算法的優化有一個重要不同,訓練演算法通常不會停止在局部極小點。反之,機器學習通常優化代理損失函數,但是在基於提前終止的收斂條件滿足停止。通常,提前終止使用真實潛在損失函數,如驗證集上的0-1損失,並設計為在過擬合發生之前終止。與純優化不同的是,提前終止時代理損失函數仍然有較大的導數,而純優化終止時導數較小。

4、批量演算法和小批量演算法

機器學習演算法和一般優化演算法不同的一點是,機器學習演算法的目標函數通常可以分解為訓練樣本上的求和。機器學習中的優化演算法在計算參數的每一次更新時通常僅使用整個代價函數中一部分項來估計代價函數的期望值。

例如,最大似然估計問題可以在對數空間中分解成各個樣本的總和:

(4)

最大化這個總和等價於最大化訓練集在經驗分布上的期望:

(5)

優化演算法用到的目標函數J中的大多數屬性也是訓練集上的期望。例如,最常用的屬性是梯度:

(6)

準確計算這個期望的計算代價非常大,因為我們需要在整個數據集上的每個樣本上評估模型。在實踐中,我們可以從數據集中隨機取樣少量的樣本,然後樣本少量的樣本,然後計算這些樣本上的平均數。回想一下,n個樣本均值的標準差是

,其中

是樣本真實的標準差。分母

表明使用更多樣本來估計梯度的方法的回報是低於線性的。比較兩個假設的梯度計算,一個基於100個樣本,另一個基於10000個樣本。後者需要的計算量是前者的100倍,卻只降低了10倍的均值標準差。如果能夠快速地計算出梯度估計值,而不是緩慢地計算準確值,那麼大多數優化演算法會收斂地更快(就總的計算量而言,而不是指更新次數)。

另一個促使我們從小數目樣本中獲得梯度的統計估計的動機是訓練集的冗餘。在最壞的情況下,訓練集中所有的m個樣本都是彼此相同拷貝。基於取樣的梯度估計可以使用單個樣本計算出正確的梯度,而比原來的做法少花了m倍時間。實踐中,我們不大可能真的遇到這種最壞情況,但可能會發現大量樣本都對梯度做出了非常相似的貢獻。

使用整個訓練集的優化演算法被稱為批量(batch)或確定性(deterministic)梯度演算法,因為它們會在一個大批量中同時處理所有樣本。這個術語可能有點令人困惑,因為這個詞「批量」也經常被用來描述小批量中同時處理所以鹵樣本。這個術語可能有點令人困惑,因為這個詞「批量」也經常被用來描述小批量中同時處理所有樣本,這個術語可能有點令人困惑,因為這個詞「批量」也經常被用來描述小批量隨機梯度下降演算法中用到的小批量樣本。通常,術語「批量梯度下降」指使用全部訓練集,而術語「批量」單獨出現時指一組樣本。例如,我們普遍使用術語「批量大小」表示小批量的大小。

每次只使用單個樣本的優化演算法被稱為批量(batch)或確定性(deterministic)梯度演算法,因為它們會在一個大批量中同時處理所有樣本。這個術語可能有點令人困惑,因為這個詞「批量」單獨出現時指一組樣本。例如,我們普遍使用術語「批量大小」表示小批量的大小。每次只使用單個樣本的優化演算法有時被稱為隨機(stochastic)或者在線(online)演算法。術語「在線」通常是指從連續產生樣本的數據流中抽取樣本的情況,而不是從一個固定大小訓練集中遍歷多次取樣的情況。大多數用於深度學習的演算法介於兩者之間,使用一個以上而又不是全部的訓練樣本。傳統上,這些會被稱為小批量(minibatch)或小批量隨機(minibatch stochastic)方法,現在通常將它們簡單地稱為隨機(stochastic)方法。

隨機方法的典型示例是隨機梯度下降,小批量的大小通常由以下幾個因素決定:

  • 更大的批量會計算更精確的梯度估計,但是回報卻小於線性的。
  • 極小批量通常難以充分利用多核架構,這促使我們使用一些絕對最小批量,低於這個值的小批量處理不會減少計算時間。
  • 如果小批量處理中的所有樣本可以並行地處理(通常確實是如此),那麼記憶體消耗和批量大小會正比。對於很多硬體設施,這是批量大小的限制因素。
  • 在某些硬體上使用特定大小的數組時,運行時間會更少。尤其是在使用GPU時,通常使用2的冪數作為批量大小可以獲得更少的運行時間。一般,2的冪數的取值範圍是

,16有時在嘗試大模型時使用。

  • 可能由於小批量在學習過程中加入了雜訊,它們會有一些正則化效果。泛化誤差通常在批量大小為1時最好。因為梯度估計的高方差,小批量訓練需要較小的學習率以保持穩定性。因為降低的學習率和消耗更多步驟來遍歷整個訓練集都會產生更多的步驟,所以會導致總的運行時間非常大。

不同的演算法使用不用的方法從小批量中獲取不同的資訊。有些演算法對取樣誤差比其他演算法更敏感,這通常有兩個可能原因。一個是它們使用了很難在少量樣本上精確估計的資訊,另一個是它們以放大取樣誤差的方式使用了資訊。僅基於梯度g的更新方法通常相對魯棒,並能使用較小的批量獲得成功,如100。使用Hessian矩陣H,計算如

更新的二階方法通常需要更大的批量,如10000。這些大批量通常需要最小化估計

的波動。假設H被精確估計,但是有病態條件數。乘以H或者是其逆會放大之前存在的誤差(這個示例中是指g的精確估計)。即使H被精確估計,g中非常小的變化也會導致更新值

中非常大的變化。當然,我們通常只會近似地估計H,因此相對於我們使用具有較差條件的操作去估計g,更新

會含有更多的誤差。

小批量是隨機抽取的這點也很重要。從一組樣本中計算出梯度期望的無偏估計要求這樣的樣本是獨立的。我們也希望兩個連續的梯度估計是相互獨立的,因此兩個連續的小批量樣本也應該是獨立的,因此兩個連續的小批量樣本也應該是彼此獨立的。很多現實的數據集自然排列,從而得到連續樣本之間具有高度先關性。例如,假設我們有一個很長的血液樣本測試結果清單。清單上的數據有可能是這樣獲取再隨後的血液樣本取自第3個病人,等等。如果從這個清單上順序抽取樣本,那麼我們的每個小批量數據都很大,因為這個小批量很可能只代表著數據集上眾多患者中的某一個患者。在這種數據集中的順序有很大影響的情況下,很有必要在抽取小批量樣本前打亂樣本順序。對於非常大的數據集,如數據中心含有幾十億樣本的數據集,我們每次構建小批量樣本時都將樣本完全均勻地抽取出來時不太現實的。幸運的是,實踐中通常將樣本順序打亂一次,然後按照這個順序存儲起來就足夠了。之後訓練模型時都會重複用到的一組組小批量連續樣本是固定的,每個獨立的模型每次遍歷訓練數據時都會重複使用這個順序。然而,這種偏差真實隨機取樣的方法並沒有很嚴重的有害影響。不以某種範式打亂樣本順序才會極大地降低演算法的性能。很多機器學習上的優化問題都可以分解成並行地計算不同樣本上單獨的更新。換言之,我們在計算小批量樣本X上最小化J(X)的更新時,同時可以計算其他小批量樣本上的更新。

小批量隨機梯度下降的一個有趣動機是,只要沒有重複使用樣本,它將遵循著真實泛化誤差的梯度。很多小批量隨機梯度下降方法的實現都會打亂數據順序一次,然後多次遍曆數據來更新參數。第一次遍歷時,每個小批量樣本都用來計算真實泛化誤差的無偏估計。第二次遍歷時,估計將會是有偏的,因為它重新抽取了已經用過的樣本,而不是從和原先樣本相同的數據生成分布中獲取新的無偏的樣本。

我們不難從在線學習的情況中看出隨機梯度下降最小化泛化誤差的原因。這樣樣本或者小批量都是數據流(stream)中抽取出來的。換言之,學習器好像是一個每次看到新樣本的人,每個樣本

都來自數據生成分布

,而不是使用大小固定的訓練集。這種情況下,樣本永遠不會重複:每次更新的樣本是從分布

中取樣獲得的無偏樣本。

在x和y是離散時,以上的等價性很容易得到。在這種情況下,泛化誤差可以表示為

(7)

上式的準確梯度為

(8)

在式(5)和(6)中,我們已經在對數似然中看到了相同的結果,現在我們發現這一點在包括似然的其他函數L上也是成立的。在一些關於

和L的溫和假設下,在x和y是連續時也能得到類似的結果。

因此,我們可以從數據生成分布

中抽取小批量樣本

以及對應的目標

,然後計算該小批量損失函數關於對應參數的梯度

(9)

以此獲得泛化誤差準確梯度的無偏估計。最後,在泛化誤差上使用SGD方法在方向

上更新

。

當然,這個解釋只能用於樣本沒有重複使用的情況。然而,除非訓練集特別大,通常最好是多次遍歷訓練集。當然多次遍曆數據集更新時,只有第一遍滿足泛化誤差梯度的無偏估計。但是,額外的遍歷更新當然會由於減小訓練誤差而得到足夠的好處,以抵消其帶來的訓練誤差和測試誤差之間差距的增加。

隨著數據集規模的迅速曾錚,超越了計算能力的增速,機器學習應用每個樣本只使用一次的情況變得越來越常見,甚至是不完全使用訓練集。在使用一個非常大的訓練集時。過擬合不再是問題,而欠擬合和計算效率變成了主要的顧慮。

Tags: