訓練深度神經網絡失敗的罪魁禍首不是梯度消失,而是退化

2020-12-22 機器之心Pro

選自severelytheoretical

機器之心編譯

參與:蔣思源、劉曉坤

作者通過深度線性網絡的例子對照證明了導致最終網絡性能變差的原因並不是梯度消失,而是權重矩陣的退化,導致模型的有效自由度減少,並指出該結論可以推廣到非線性網絡中。

在這篇文章中,我將指出一個常見的關於訓練深度神經網絡的困難的誤解。人們通常認為這種困難主要是(如果不全是)由於梯度消失問題(和/或梯度爆炸問題)。「梯度消失」指的是隨著網絡深度增加,參數的梯度範數指數式減小的現象。梯度很小,意味著參數的變化很緩慢,從而使得學習過程停滯,直到梯度變得足夠大,而這通常需要指數量級的時間。這種思想至少可以追溯到 Bengio 等人 1994 年的論文:「Learning long-term dependencies with gradient descent is difficult」,目前似乎仍然是人們對深度神經網絡的訓練困難的偏好解釋。

讓我們首先考慮一個簡單的場景:訓練一個深度線性網絡學習線性映射。當然,從計算的角度來看,深度線性網絡並不有趣,但是 Saxe 等人 2013 年的論文「Exact solutions to the nonlinear dynamics of learning in deep linear neural networks」表明深度線性網絡中的學習動力學仍然可以提供非線性網絡的學習動力學的信息。因此,我們從這些簡單的場景開始討論。下圖是一個 30 層網絡(誤差線是由 10 次獨立運行得到的標準差)的學習曲線和初始梯度範數(訓練之前)。

我將在之後簡短地解釋圖中的標籤「Fold 0」的含義。這裡的梯度是關於層激活值的(與關於參數的梯度的行為類似)。網絡的權重使用標準的初始化方法進行初始化。起初,訓練損失函數下降得很快,但很快漸進地收斂於一個次優值。此時,梯度並沒有消失(或爆炸),至少在初始階段。梯度確實隨著訓練過程變小,但這是預料之中的,從任何方面看都不能清楚表明梯度已經變得「太小」:

為了表明這裡的收斂到局部最優解的現象和梯度範數的大小本身並沒有關係,我將引入一種運算,它將增加梯度範數的值,卻使得網絡的性能變得更差。如下圖所示(藍線):

我只是簡單地改變了初始化方法而已。初始網絡的所有初始權重都是矩陣(使用標準方法初始化)。而在上圖的藍線中,我只是將每個初始權重矩陣的上半部分複製到下半部分(即初始權重矩陣被摺疊了一次,因此稱其為「Fold 1」網絡)。這種運算降低了初始權重矩陣的秩,使得它們更加的退化(degenerate)。注意這種運算僅應用於初始權重矩陣,並沒有加上其它對學習過程的約束,訓練過程保持不變。經過幾個 epoch 的訓練之後,梯度範數的變化如下圖所示:

因此,我引入了一種運算,它增大了全局的梯度範數,但是性能卻變差了很多。相反地,接下來我將引入另一種運算以減小梯度範數,卻能大幅地提升網絡的性能。如下圖所示(綠線):

正如圖中的標籤「Ortho」所示,這種運算將權重矩陣初始化為正交的。正交矩陣是固定(Frobenius)範數的矩陣中退化程度最低的,其中退化度可以用多種方法計算。以下是經過幾個 epoch 訓練之後的梯度範數:

如果梯度範數的大小本身和深度網絡的訓練困難並沒有關係,那是什麼原因呢?答案是,模型的退化基本上決定了訓練性能。為什麼退化會損害訓練性能?直觀地說,學習曲線基本上會在參數空間的退化方向變慢,因此退化會減少模型的有效維度。在以前,你可能會認為是用參數擬合模型,但實際上,由於退化,可以有效地擬合模型的自由度卻變少了。上述的「Fold 0」和「Fold 1」網絡的問題在於,雖然梯度範數值還不錯,但是網絡的可用自由度對這些範數的貢獻非常不均衡:雖然一些自由度(非退化的)貢獻了梯度的主要部分,但大部分(退化的)自由度對此沒有任何貢獻(僅作概念性的理解,並不是很準確的解釋。可以理解為在每個層中只有少量的隱藏單元對不同的輸入改變它們的激活值,而大部分隱藏單元對不同的輸入都是相同的反應)。

正如 Saxe 等人的論文表明,隨著相乘矩陣的數量(即網絡深度)增加,矩陣的乘積變得更加退化(線性相關)。以下分別是該論文中的 1 層、10 層和 100 層網絡的例子:

隨著網絡深度增加,積矩陣的奇異值變得越來越集中,而小部分出現頻率很低的奇異值變得任意的大。這種結果不僅僅和線性網絡相關。在非線性網絡中也會出現類似的現象:隨著深度增加,給定層的隱藏單元的維度變得越來越低,即越來越退化。實際上,在有硬飽和邊界的非線性網絡中(例如 ReLU 網絡),隨著深度增加,退化過程會變得越來越快。

Duvenaud 等人 2014 年的論文「Avoiding pathologies in very deep networks」裡展示了關於該退化過程的可視化:

隨著深度增加,輸入空間(左上角)會在每個點都扭曲成越來越細的細絲,而只有一個與細絲正交的方向會影響網絡的響應。在兩個維度上表示出輸入空間的變化可能會比較難,但是實驗證明輸入空間的點在局部會變為「hyper-pancakey」,即每一個點都有一個單一的方向正交於扭曲後的表面。若我們沿著這個敏感的方向改變輸入,那麼網絡實際上對變化會非常敏感。

最後我忍不住想提一下我和 Xaq Pitkow 的論文。在論文 SKIP CONNECTIONS ELIMINATE SINGULARITIES 中,我們通過一系列實驗表明本文討論的退化問題嚴重影響了深度非線性網絡的訓練,而跳過連接(ResNet 中採用的重要方法)幫助深度神經網絡實現高精度的訓練同樣是一種打破退化的方法。我們同樣懷疑其它如批量歸一化或層級歸一化等方法有助於深度神經網絡的訓練,除了原論文所提出的如降低內部方差等潛在的獨立性機制,也至少有一部分原因是退化被破壞而實現的。我們都知道分裂歸一化(divisive normalization)對於解相關隱藏單元的響應非常高效,它也可以看成一種打破退化的機制。

除了我們的論文外,我還應該提一下 Pennington、 Schoenholz 和 Ganguli 最近提出的論文 Resurrecting the sigmoid in deep learning through dynamical isometry: theory and practice。在該論文中,正交初始化完全移除了線性網絡中的退化問題。他們提出了一種計算非線性網絡雅可比矩陣的整個奇異值分布的方法,並表明在 hard-tanh 非線性網絡(而不是在 ReLU 網絡)中能實現獨立於深度的非退化奇異值分布。實驗結果表明有獨立於深度的非退化奇異值分布的網絡要比奇異值分布變得更寬(更高的方差)的網絡快幾個數量級。這是消除退化和控制整個網絡奇異值分布的重要性的有力證明,而不只是該論文比較有意思。

論文:SKIP CONNECTIONS ELIMINATE SINGULARITIES

論文地址:>

跳過連接(Skip connections)使得深度網絡訓練成為了可能,並已經成為各種深度神經架構中不可缺少的部分,但目前它並沒有一個非常成功和滿意的解釋。在本論文中,我們提出了一種新的解釋以說明跳過連接對訓練深度網絡的好處。訓練深度網絡的難度很大程度是由模型的不可識別所造成的奇異性(singularities)而引起。這樣的一些奇異性已經在以前的工作中得到證明:(i)給定層級結點中的置換對稱性(permutation symmetry)造成了重疊奇異性,(ii)消除(elimination)與對應的消除奇異性,即結點的一致性失活問題,(iii)結點的線性依賴性產生奇異問題。這些奇異性會在損失函數的表面產生退化的流形,從而降低學習的效率。我們認為跳過連接會打破結點的置換對稱性、減少結點消除的可能性以及降低節點間的線性依賴來消除這些奇異性。此外,對於典型的初始化,跳過連接會移除這些奇異性而加快學習的效率。這些假設已經得到簡化模型的實驗支持,也得到了大型數據集上訓練深度網絡的實驗支持。

原文連結:

相關焦點

  • 為什麼深度神經網絡這麼難訓練?
    有了這些多層抽象,深度神經網絡似乎可以學習解決複雜的模式識別問題。正如電路示例所體現的那樣,理論研究表明深度神經網絡本質上比淺層神經網絡更強大。 如何訓練深度神經網絡呢?本章嘗試使用我們熟悉的學習算法——基於反向傳播的隨機梯度下降,來訓練深度神經網絡。但是,這會產生問題,因為我們的深度神經網絡並不比淺層神經網絡的性能強多少。
  • 為什麼深度神經網絡這麼難訓練?|贈書
    當然不,下面深入探究使得深度神經網絡訓練困難的原因。仔細研究便會發現,在深度神經網絡中,不同層的學習速度差異很大。後面的層正常學習時,前面的層常常會在訓練中停滯不前,基本上學不到什麼。這種停滯並不是因為運氣不佳,而是有著更根本的原因,並且這些原因和基於梯度的學習技術相關。
  • 這篇論文讓你無懼梯度消失或爆炸,輕鬆訓練一萬層神經網絡
    選自arXiv作者:Batchlechner等機器之心編譯機器之心編輯部深度學習在眾多領域都取得了顯著進展,但與此同時也存在一個問題:深層網絡的訓練常常面臨梯度消失或梯度爆炸的阻礙,尤其是像 Transformer 這樣的大型網絡。
  • 不僅搞定「梯度消失」,還讓CNN更具泛化性:港科大開源深度神經網絡...
    時間見證了深度神經網絡深度的迅速提升(自LeNet的5層到ResNet的上千層),但尾端監督的訓練方式仍是當前主流方法。這種處理方式對於比較淺的網絡而言並沒有什麼問題,但是對於極深網絡而言則會由於梯度反向傳播過程中的「梯度消失」問題導致網絡收斂緩慢或者不收斂或收斂到局部最優。   針對上述現象,Deeply-Supervised Nets提出了多級監督方式進行訓練。該訓練方式的優化目標函數可以描述為:
  • 神經網絡訓練trick
    說好的足夠多的數據(https://en.wikipedia.org/wiki/Occam's_razor),仔細設計的神經網絡都可以得到比其他算法更好的準確率和泛化性呢(當然不是我說的當然這是啟發式的,並不是說tanh一定比sigmoid的好),ReLU也是很好的選擇,最大的好處是,當tanh和sigmoid飽和時都會有梯度消失的問題,ReLU就不會有這個問題,而且計算簡單,當然它會產生dead neurons,下面會具體說。
  • (圖解)類神經網絡的復興:深度學習簡史
    如何逼近最佳解有很多種不同的算法,最典型的方法是採用隨機梯度下降法(Stochastic Gradient Descent)。當線性關係資料的代價函數為凸函數,找到最佳解不是問題;然而問題在於非線性關係的資料:其代價函數為非凸函數,求解時容易陷入局部最佳解、而非全域最佳解,這個問題叫做梯度消失問題(Vanishing Gradient)。
  • 【深度學習】神經網絡知識專題總結
    二、訓練神經網絡本部分介紹了反向傳播算法的失敗案例,以及正則化神經網絡的常見方法。2.1 失敗案例很多常見情況都會導致反向傳播算法出錯。梯度消失較低層(更接近輸入)的梯度可能會變得非常小。在深度網絡中,計算這些梯度時,可能涉及許多小項的乘積。當較低層的梯度逐漸消失到 0 時,這些層的訓練速度會非常緩慢,甚至不再訓練。
  • 梯度消失和梯度爆炸的數學原理及解決方案
    隨便寫一下神經網絡的一些小知識吧,感覺很多大佬把這種小知識寫的非常深入淺出,很景仰很佩服。這篇文章主要還是參考了別人的技術博客。希望還算好理解。歡迎一起討論~梯度消失或者梯度爆炸是在訓練深度網絡時常常容易出現的情況,即在根據損失函數計算的誤差通過梯度反向傳播的方式對深度網絡權值進行更新時,得到的梯度值接近0或特別大,也就是消失或爆炸。
  • 【深度學習】梯度消失和梯度爆炸問題的最完整解析
    一旦算法計算出代價函數相對於網絡中每個參數的梯度,就可以使用這些梯度以梯度下降步驟來更新每個參數。不幸的是,隨著算法向下傳播到較低層,梯度通常會越來越小。結果梯度下降更新使較低層的連接權重保持不變,訓練不能收斂到一個好的最優解。我們稱其為梯度消失問題。在某些情況下,可能會出現相反的情況:梯度可能會越來越大,各層需要更新很大的權重直到算法發散為止。
  • 深度學習優化算法入門:三、梯度消失和激活函數
    不具有這一性質的數據可能導致梯度消失和訓練抖動。分布最好是正態的,否則可能導致網絡過擬合輸入空間的某個區域。在訓練過程中,不同batch和不同網絡層的激活分布,應該保持一定程度上的一致。如果不具備這一性質,那麼我們說分布出現了內部協方差偏移(Internal Covariate shift),這可能拖慢訓練進程。這篇文章將討論如何使用激活函數應對前兩個問題。文末將給出一些選擇激活函數的建議。梯度消失問題有豐富的文檔,隨著神經網絡越來越深,這一問題越來越得到重視。下面我們將解釋梯度為什麼會消失。
  • CNN(卷積神經網絡)、RNN(循環神經網絡)、DNN(深度神經網絡)的內部網絡結構有什麼區別?
    即便大牛們早就預料到神經網絡需要變得更深,但是有一個夢魘總是縈繞左右。隨著神經網絡層數的加深,優化函數越來越容易陷入局部最優解,並且這個「陷阱」越來越偏離真正的全局最優。利用有限數據訓練的深層網絡,性能還不如較淺層網絡。同時,另一個不可忽略的問題是隨著網絡層數增加,「梯度消失」現象更加嚴重。具體來說,我們常常使用sigmoid作為神經元的輸入輸出函數。
  • 人腦如何防止梯度消失和梯度爆炸?
    梯度消失和梯度爆炸一直是深度學習的難點,而人腦有接近900億個神經元,可以說是一個非常規模龐大的網絡。那麼人腦是如何防止梯度消失和梯度爆炸的?極市小編在知乎上發現了這個有意思的問題,分享給大家思考。感覺這個問題跟我的科研方向有一點關係,所以就厚著臉皮強答一波了。
  • 為什麼會有梯度爆炸和梯度消失?
    ,應用在神經網絡的BP算法中,由於深度神經網絡層級太深,在求導的過程中,由於鏈式法則,可能會出現梯度消失和梯度爆炸現象,為了搞清楚為什麼會出現這些情況,我們可以先從最簡單的單層神經網絡的求導過程著手,查看求導的結果。
  • 入門| 一文了解神經網絡中的梯度爆炸
    本文將介紹深度神經網絡中的梯度爆炸問題。 閱讀本文,你將了解: 什麼是梯度爆炸,模型訓練過程中梯度爆炸會引起哪些問題; 如何確定自己的網絡模型是否出現梯度爆炸; 如何修復梯度爆炸問題。 什麼是梯度爆炸? 誤差梯度是神經網絡訓練過程中計算的方向和數量,用於以正確的方向和合適的量更新網絡權重。
  • 神經網絡與深度學習
    隱藏層使得感知機能夠發展為擬合萬物的神經網絡模型,而反向傳播算法則是整個神經網絡訓練的核心要義。要學習深度學習,恐怕不得不先溫習一下機器學習,搞清楚二者之間的關係。簡單來說,機器學習就是從歷史數據中探索和訓練出數據的普遍規律,將其歸納為相應的數學模型,並對未知的數據進行預測的過程。
  • 人腦是怎麼防止梯度消失和梯度爆炸的?
    梯度消失和梯度爆炸一直是深度學習的難點,而人腦有接近900億個神經元,可以說是一個非常規模龐大的網絡。那麼人腦是如何防止梯度消失和梯度爆炸的?小編在知乎上發現了這個有意思的問題,分享給大家思考。感覺這個問題跟我的科研方向有一點關係,所以就厚著臉皮強答一波了。
  • 如何優化深度神經網絡?
    訓練一個深度神經網絡以實現最佳的性能是一件具有挑戰的任務。在本文中,我將會探索這項任務中最常見的問題及其解決方案。這些問題包括網絡訓練時間過長,梯度消失與爆炸以及網絡初始化,我們在此統稱為優化問題。而在訓練網絡中出現的另一類問題則稱作正則化問題,對此,我已經在之前的文章中討論過了,如果你沒有閱讀過,可以點擊下方連結閱讀原文。
  • 如何訓練深度神經網絡?老司機的15點建議
    本文為印度深度學習專家、創業者 Rishabh Shukla 在 GitHub 上發表的長博文,總結了他過去的開發經驗,旨在給新入門的開發者提供指導。雷鋒網做了不改變原意的編譯。在深度學習領域,為了高效訓練深度神經網絡,有些實踐方法被過來人強烈推薦。
  • 如何訓練深度神經網絡?老司機的 15 點建議
    在深度學習領域,為了高效訓練深度神經網絡,有些實踐方法被過來人強烈推薦。在這篇博文中,我會覆蓋幾種最常使用的實踐方法,從高品質訓練數據的重要性、超參數(hyperparameters)到更快創建 DNN(深度神經網絡) 原型模型的一般性建議。
  • 走近深度學習:神經網絡工作原理解析
    在本系列的第二篇文章中,作者努比詳解神經網絡,梳理各組成部分,分析工作原理、神經網絡訓練方式等,本文能夠輔助大家更好地理解深度學習目標檢測算法的網絡基礎,推薦大家閱讀!深度學習是機器學習中重要分支之一。它的目的是教會計算機做那些對於人類來說相當自然的事情。深度學習也是無人駕駛汽車背後的一項關鍵性技術,可以幫無人車識別停車標誌、區分行人與路燈柱。