1. 程式人生 > >深度學習 --- 優化入門一(梯度下降所面臨的問題)

深度學習 --- 優化入門一(梯度下降所面臨的問題)

前面幾節詳細介紹了卷積神經網路和深度卷積神經網路,這個網路可以說是為影象處理量身製作,同時在2010年,hintion帶領的團隊使用AlexNet網路(深度卷積網路)在ImageNet大賽中獲得冠軍,更是奠定了卷積網路的商業地位,到目前為止該網路也是影象識別的主要網路之一。本節開始針對深度網路進行優化探討,然後針對卷積神經網路探討優化問題本篇。不是本人所寫,是國外的部落格,在閱讀時,感覺寫的很好,同時有影象很形象,因此這裡翻譯過來供大家參考,文末給出連結,通過優化可以知道深度網路的優缺點,如何針對網路進行優化將對我們都很有很有好處。這個系列會寫很多篇,都是乾貨

深度學習在很大程度上是關於解決大規模討厭的優化問題。神經網路僅僅是一個非常複雜的功能,由數百萬個引數組成,代表了問題的數學解決方案。考慮影象分類的任務.AlexNet網路是一個數學函式,它採用表示影象RGB值的陣列,並將輸出生成為一堆類分數。

通過訓練神經網路,我們基本上意味著我們正在最小化損失函式。這個損失函式的值為我們提供了衡量我們的網路在給定資料集上的效能與完美程度的距離。

損失函式

為了簡單起見,讓我們假設我們的網路只有兩個引數。在實踐中,這個數字大約是十億,但我們仍然會堅持整個帖子中的兩個引數示例,以便在嘗試視覺化事物時不會讓自己瘋狂。現在,一個非常好的損失函式的計數可能看起來像這樣,如下圖。

 

我為什麼說的英文一個非常好的損失函式?因為具有如上所述輪廓的損失函式是凸函式,但是這樣的損失函式一般不存在。然而,它仍然是一個體面的教學工具,以獲得一些關於梯度下降的最重要的想法。那麼,讓我們來吧!

圖中的Xÿ軸代表兩個權重的值。所述ž軸表示損失函式的值。我們的目標是找到損失最小的權值。一點一這被稱為損失函式的最小值

剛開始時隨機初始化了權重,所以你的神經網路可能就像你醉漢一樣,將貓的影象分類為人類。這種情況對應於輪廓上的點A,其中網路表現不好並且因此損失很高。我們需要找到一種方法以某種方式導航到“谷”的底部到乙點,其中損失函式具有最小值?那我們怎麼做呢?

梯åº| AE

梯度下降

當我們初始化我們的權重時,我們處於損失誤差很大的甲點。我們要做的第一件事就是檢查的xy平面中所有可能的方向,沿著哪個方向移動導致損失函式值的最大下降。這是我們必須移動的方向。這個方向由與梯度方向完全相反的方向給出。梯度,高維表親,為我們提供最陡上升的方向。

下圖將幫助你理解這一點。在曲線的任何一點,我們都可以定義一個與該點相切的平面。在更高的維度,我們總是可以定義超平面,但現在讓我們堅持使用維平面吧。然後,我們可以在這個平面上擁有無限的方向。在他們中間,正好一個方向將為我們提供功能最陡上升的方向。該方向由梯度給出。與之相反的方向是最陡下降的方向。這就是演算法得到它的名字的方式。我們沿著漸變的方向進行下降,因此,它被稱為漸變下降。(這裡需要大家深入理解什麼是梯度,為什麼梯度方向就是函式上升最快的方向,理解不請的檢視我的這篇文章,這裡你會徹底的深入理解什麼是梯度的)

AEA

現在,我們有了前進的方向,我們需要設定前進的步伐即每次前進多少。步驟此大小的稱為學習率\α。我們必須仔細選擇它,以確保我們能夠達到最低標準。

如果我們走得太快(\α很大),我們可能會超過最小值,並繼續沿著“山谷”的山脊反彈而不會達到最小值即會產生振盪。太慢了(\α很小),訓練時間可能太長,根本不可行。即使情況並非如此,學習速度非常慢也會使演算法更容易陷入區域性最小值,我們將在本文稍後介紹。

一旦我們得到了梯度和學習率,我們就採取一個步驟,並在我們最終的任何位置重新計算梯度,並重復該過程。

雖然梯度的方向告訴我們哪個方向有最陡的上升,但它的大小告訴我們最陡的上升/下降是多麼陡峭。因此,在最小值處,輪廓幾乎是平坦的,您會發現漸變幾乎為零。實際上,對於最小點而言,它恰好為零。

                                                                                       下降的梯度下降

                                                                                      使用太大的學習率的效果 

在實踐中,可能我們永遠也。不能正好到達極小值,但我們在極小值附近保持振盪。當我們在這個區域振盪時,損失值不會發生太大變化,因為我們只是在實際最小值附近反彈。通常,當損失值未在預定數量(例如10或20次迭代)中得到改善時,我們停止迭代。當這樣的事情發生時,我們說我們的訓練已經收斂了。 

常見錯誤

讓我稍稍停頓一下。如果你上網搜尋梯度下降的視覺化影象,你大概會看到從某一點開始,朝向最低點的一條軌跡,就像前面的動畫一樣。然而,這只是一個不精確的示意。實際上,軌跡完全被限制在XY權重平面上,完全不涉及ž軸上的移動這是因為權重是唯一的自由引數如下圖所示。:

XY平面中的每個點代表一個獨特的權重組合,我們希望有一組由最小值描述的權重。

基本方程

描述梯度下降更新規則的基本方程是:

grad_eq-4

 

此更新在每次迭代期間執行。這裡,w是權重向量,它位於xy平面中。從該向量中,我們相對於權重乘以α學習率)減去損失函式的梯度。梯度是一個向量,它給出了損失函式具有最陡上升的方向。最速下降的方向是與梯度完全相反的方向,這就是我們從權重向量中減去梯度向量的原因。

如果想象向量對你來說有點困難,幾乎相同的更新規則同時應用於網路的每個權重。唯一的變化是,由於我們現在為每個權重單獨執行更新,因此上述等式中的梯度將替換為沿特定權重所表示的方向的梯度向量的投影。

indiveq-2

對所有權重同時進行此更新。

在減去之前,我們將梯度向量乘以學習速率。這代表了我們之前談到的步驟。意識到即使我們保持學習速率不變,步長的大小也會因梯度的大小變化而變化,而損失輪廓的陡度也會變化。當我們接近最小值時,梯度接近零,我們朝著最小值採取越來越小的步驟。

從理論上講,這很好,因為我們希望演算法在接近最小值時採取較小的步驟。步長太大可能導致它超過最小值並在最小值的脊之間反彈。

梯度下降中廣泛使用的技術是具有可變的學習速率,而不是固定的學習速率。最初,我們可以承受很高的學習率。但是後來,我們想要在接近最小值時放慢速度。實現此的策略方法稱為模擬退火或衰減學習率。在此,學習速率在每個固定次數的迭代中衰減。主要採用的有動量學習法,AdaGrad和RMSProp,亞當,在下一節將詳細探討這些優化演算法。

梯度下降的挑戰之一:區域性極小值

好吧,目前為止,梯度下降看起來是一個非常美好的童話。不過我要開始潑涼水了。還記得我之前說過,我們的損失函式是一個非常好的函式,這樣的損失函式並不真的存在?

首先,神經網路是複雜函式,具有大量非線性變換。由此得到的損失函式看起來不像一個很好的碗,只有一處最小值可以收斂。實際上,這種聖人般的損失函式稱為凸函式,而深度網路的損失函式幾乎總是非凸的事實上,損失函式可能是這樣的:

ææ-1

 

上圖中有一個梯度為零的區域性極小值。然而,我們知道那不是我們能達到的最低損失(全域性最小值)。如果初始權重位於點A,那麼我們將收斂於區域性極小值,一旦收斂於區域性極小值,梯度下降無法逃離這一陷阱。

梯度下降是由梯度驅動的,而梯度在任何極小值處都是零。區域性極小值,顧名思義,是損失函式在區域性達到最小值的點。而全域性最小值,是損失函式整個定義域上可以達到的最小值。

讓事情更糟的是,損失等值曲面可能更加複雜,實踐中可沒有我們考慮的三維等值曲面。實踐中的神經網路可能有上億權重,相應地,損失函式有上億維度。在那樣的影象上梯度為零的點不知道有多少。

事實上,視覺化這樣的高維函式很難。然而,因為現在有很多極具天賦的人從事深度學習研究,人們找到了以三維形式視覺化損失函式的等值曲面的方法。最近的一篇論文提出了過過器歸一化(Filter Normalization)技術,本文就不解釋它的具體做法了。我們只要知道,它能夠為我們提供呈現損失函式複雜性的檢視。例如,下圖表示VGG-56深度網路在CIFAR-10資料集上的損失函式:

正如您所看到的那樣,損失情況與當地最小值相關。

梯度下降的挑戰之二:鞍點

我們碰到的另一種問題是鞍點,看起來是這樣的:

é

 

之前的圖片中,雙“峰”交匯處也有一個鞍點。

鞍點因形狀像馬鞍而得名。鞍點處,梯度在一個方向(X)上是極小值,在另一個方向上則是極大值。如果沿著X方向的等值曲面比較平,那麼梯度下降會沿著Ÿ方向來回振盪,造成收斂於最小值的錯覺。

梯度下降的挑戰之三:梯度懸崖

多層神經網路還經常會有極度陡峭的區域,就如同懸崖一樣,如下圖所示(其中藍色是損失值,綠色是梯度方向,載損失突變的時候也就是類似懸崖一樣的,在那一點梯度會變化很大,導致直接飛出這個區域,在高維的情況下更復雜,可能直接跳出該區域,達到未知區域),高度非線性的神經網路或者迴圈神經網路,在引數空間中常常含有尖銳的非線性,這導致了某些區域可能會產生非常高的梯度。當引數靠近這一懸崖區域時,高梯度會將引數彈射到很遠的地方,很可能導致原本的優化工作半途而廢。

             需要注意的是,由於迴圈神經網路涉及在多個時間段內相乘,因此梯度懸崖在遞迴神經網路中十分頻繁,特別是處理較長的時序序列時,該問題更加突出,這裡先給出這個概念,後面等講完RNN後再給出解決方法。

 

梯度下降的挑戰之四:梯度消失和梯度爆炸

這個將在下節詳細介紹,這裡為了完整性,列在這裡。

梯度下降的挑戰之五:梯度不精確

大多數優化演算法最原始的動機都是試圖獲取代價函式對應的精確梯度,從而優化學習器。但在實踐中,我們經常使用含有噪聲的梯度進行優化。比如梯度下降法需要遍歷所有訓練資料後計算出平均梯度,然後才修改網路,但這種方法在資料較大時訓練速度太慢,因此深度學習通常會進行資料取樣,使用最小批量梯度下降學習方法進行網路訓練,甚至在極端情況下還會使用隨機梯度下降(一次取樣一條資料)進行網路訓練。這種不精確的梯度,也就導致了訓練的穩定性較差,但梯度不精確有時也可以看作是防止過擬合以及逃離區域性最優或鞍點的方法。機器學習終究不是一個最優化問題,但其卻要依靠優化手段來完成機器學習任務。貝體問題,還需要根據實際需求進行思考。

梯度下降的挑戰之六:優化理論的侷限性

一些理論結果顯示,很多針對神經網路而設計的優化演算法有著侷限性,但在實踐中,這些理論結果卻很少對神經網路產生影響。這也是相比於其他機器學習演算法而言,神經網路更像是一個黑盒,神經網路中存在著大量的訓練技巧,這也使得訓練神經網路更像是藝術而非科學。
在神經網紹的訓練中,我們通常不關心能否找到精確的全域性最優解,我們僅僅是去降低代價函式的值,使其能夠獲得較好的泛化效能。但我們並不是不想獲得全域性最優解,只是理論分析神經網路演算法是一個極其困難的任務。總而言之,深度學習是實踐的產物,還缺乏強有力的理論支援,很多科研人員仍然對其保持著懷疑態度,如何理智地評估深度學習演算法效能邊界仍然是機器學習中一個重要的目標。

下面主要講解前兩個挑戰即區域性最優和鞍點,下面幾節會著重講解病態曲率(解決方法是SGD,動量(Momentum),AdaGrad,RMSProp,Adam),梯度消失,啟用函式,批量標準化(批量標準化)歸一化)

隨機性是救星

所以,我們該如何逃離區域性極小值和鞍點,努力收斂於全域性最小值呢?答案是隨機性。

目前為止,我們進行梯度下降時計算的損失函式累加了訓練集中所有可能樣本上的損失。如果我們碰到區域性極小值或鞍點,我們便陷入其中。幫助梯度下降擺脫這些的一種方法是使用隨機梯度下降。

隨機梯度下降並不通過累加所有損失函式計算損失,而是計算隨機取樣(無放回)的樣本的損失。與批量梯度下降不同,我們之前的方法在一個批次內處理所有樣本,因此稱為批量梯度下降。

相應地,隨機梯度下降的更新規則為:

SGD

                                                                             隨機梯度下降的更新細則

基於“單樣本損失”計算出的梯度,方向和基於“全樣本損失”計算出的梯度可能略有不同。因此,當“全樣本損失”可能將我們推入區域性極小值,或讓我們陷於鞍點時,“單樣本損失”梯度可能指向不同的方向,也許能幫助我們避開區域性極小值和鞍點。

即使我們陷入了“單樣本損失”的區域性極小值,下一個隨機取樣的資料點的“單樣本損失”可能不一樣,讓我們​​得以繼續移動。

當它真的收斂時,它收斂於根據幾乎所有“單樣本損失”計算得出的最小值。同時,經驗表明,鞍點極為不穩定,小小的輕推可能就足以逃離鞍點。

所以,這是否意味著,在實踐中,我們應該總是進行這樣的單樣本隨機梯度下降?

批量大小

答案是否,儘管理論上,隨機梯度下降也許能為我們提供最好的結果,從算力上看,它是一個不太可行的選項。隨機梯度下降時,我們需要一步一步地計算損失,而在批量梯度下降時,單獨損失的梯度可以平行計算。

因此,我們在這兩種方法之間尋找一個平衡。我們既不使用整個資料集,也不僅僅基於單個樣本構造損失函式,我們使用固定數量的樣本,比如,16,32,128,這稱為小批量。之所以稱為小批量,是為了區別批量(批次)梯度下降。選擇合適的小批量大小,可以確保我們既能有足夠的隨機性以擺脫區域性極小值,又能充分利用並行處理的算力優勢。

重新審視區域性極小值:它們並沒有你想像的那麼糟糕

在你仇視區域性極小值之前,先看下最近的研究吧。最近的研究表明,區域性極小值並不一定不好。在神經網路的損失曲面上,有太多的極小值了“。良好”的區域性極小值表現可能和全域性最小值一樣好。

為什麼我說“良好”?因為我們仍然可能陷入難以預測的訓練樣本導致的“糟糕”的區域性極小值。“良好”的區域性極小值,文獻中常稱為最優區域性極小值,在神經網路的高維損失函式中,可以有相當多個。

另外,許多神經網路進行的是分類任務。如果區域性極小值對應的正確標籤的分值在0.7-0.8之間,而同一樣本全域性最小值對應的正確標籤的分值在0.95-0.98之間,最終得到的輸出分類預測是一樣的。

我們希望極小值具有的性質是它位於較平坦的一邊。為什麼?因為平坦極小值更容易收斂,跳過極小值,在極小值周圍的“谷脊”反覆回彈的概率更低。

更重要的是,預測集的損失曲面一般和訓練集的略有不同。平坦寬闊的極小值,從訓練集到預測集的切換不會改變太多損失,而狹窄的極小值則不然。更平坦的極小值推廣性更好。

重新審視學習率

最近湧現了一堆學習率規劃的研究,以避免收斂於損失曲面的次優極小值。即使使用學習率衰減,仍有可能陷入區域性極小值。傳統上,訓練或者在固定數目的迭代之後結束,或者在損失沒有改善的10個(比方說)迭代後結束(文獻中稱為及早停止)。

更高的學習率也有助於幫助我們在訓練早期逃離區域性極小值。

也有人組合了及早停止和學習率衰減,每次遇到10個損失沒有改善的迭代,就降低學習率,並在學習率低於某個預訂的閾值時停止訓練。

近年來也曾流行週期學習率,緩慢增加學習率,然後降低學習率,迴圈往復。

æªå±ï¼2018å¹'5æ22æ¥ - å¨ - 37å¹'3æ18æ¥ï¼PM

Leslie N. Smith提出的“三角”和“三角2”迴圈學習率方法。在左圖中,min和max lr保持不變。在右邊,每個週期後差異減半。圖片來源:Hafidz Zulkifli

還有稱為熱重啟隨機梯度下降的技術,基本上就是學習率退火至下界後,還原學習率為原值。還有不同的學習率衰減的規劃方案,從指數衰減到餘弦衰減。

 

1_3kkV66xEObjWpYiGdBBivg

 

的隊最近一篇]介紹]論文了一種稱為隨機權值平均的技術。作者開發了一種方法,它首先收斂到最小值,快取權重,然後將學習率恢復到更高的值。然後,這種更高的學習速率將演算法從最小值推進到損失表面中的隨機點。然後使演算法再次收斂到另一個最小值。這重複幾次。最後,他們對所有快取權重集的預測進行平均,以產生最終預測。

0_7KQ5Yesnt4QGNLHl

 

結語

梯度下降就介紹到這裡了。不過我們還漏了一點沒講,如何應對病態曲率。隨機梯度下降的一些擴充套件,如動量,RMSProp,亞當可以用來克服這一問題。

不過我覺得我們介紹的內容對一篇部落格文章來說已經夠多了,剩餘的內容將在另一篇文章中介紹。

參考資料

  1. 可見化神經網路的損失曲面(論文):的arXiv:1712.09913

  2. Hafidz Zulkifli關於學習率規劃的文章:https://towardsdatascience.com/understanding-learning-rates-and-how-it-improves-performance-in-deep-learning-d0d4059c1c10

  3. 隨機權重平均(論文):的arXiv:1704.00109

原文地址:HTTPS://blog.paperspace.com/intro-to-optimization-in-deep-learning-gradient-descent/

這裡補充一下,這篇文章是從國外的論壇看到的,然後翻譯過來,本來打算自己總結的,但是這篇文章太好了,很形象,因此就翻譯過來,供以後自己查閱體會,同時了為了完整性,在原來的基礎上,增添了其他的問題,使其更加完整,優化方法還有很多,相信以後的更新將更偏向於優化。特此說明。此外這是一系列文章,在此基礎上我會根據本人的理解體系程序穿插知識。