日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第五章 深度神经网络为何很难训练

發(fā)布時間:2025/3/21 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第五章 深度神经网络为何很难训练 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文
假設(shè)你是一名工程師,接到一項從頭開始設(shè)計計算機的任務(wù)。某天,你在工作室工作,設(shè)計邏輯電路,構(gòu)建 AND 門,OR 門等等時,老板帶著壞消息進來:客戶剛剛添加了一個奇特的設(shè)計需求:整個計算機的線路的深度必須只有兩層:


兩層線路


你驚呆了,跟老板說道:“這貨瘋掉了吧!”
老板說:“他們確實瘋了,但是客戶的需求比天大,我們要滿足它。”
實際上,在某種程度上看,他們的客戶并沒有太瘋狂。假設(shè)你可以使用貴重特殊的邏輯門可以 AND 起來你想要的那么多的輸入。同樣也能使用多值輸入的 NAND 門——可以AND 多個輸入然后求否定的門。有了這類特殊的門,構(gòu)建出來的兩層的深度的網(wǎng)絡(luò)便可以計算任何函數(shù)。
但是僅僅因為某件事是理論上可能的,就代表這是一個好的想法。在實踐中,在解決線路設(shè)計問題(或者大多數(shù)的其他算法問題)時,我們通??紤]如何解決子問題,然后逐步地集成這些子問題的解。換句話說,我們通過多層的抽象來獲得最終的解答。
例如,我們來設(shè)計一個邏輯線路來做兩個數(shù)的乘法。我們希望在已經(jīng)有了計算兩個數(shù)加法的子線路基礎(chǔ)上創(chuàng)建這個邏輯線路。計算兩個數(shù)和的子線路也是構(gòu)建在用語兩個比特相加的子子線路上的。最終的線路就長成這個樣子:


加法線路


最終的線路包含至少三層線路的單元。實際上,這個線路很可能會超過三層,因為我們可以將子任務(wù)分解成比上述更小的單元。但是基本思想就是這樣。
因此深度線路讓這樣的設(shè)計過程變得更加簡單。但是這對于設(shè)計本身幫助并不大。其實,數(shù)學(xué)證明對于某些函數(shù)設(shè)計的非常淺的線路可能需要指數(shù)級的線路單元來計算。例如,在1980年代早期的一系列著名的論文已經(jīng)給出了計算比特的集合的奇偶性通過淺的線路來計算需要指數(shù)級的門。另一當(dāng)面,如果你使用更深的線路,那么可以使用規(guī)模很小的線路來計算奇偶性:僅僅需要計算比特的對的奇偶性,然后使用這些結(jié)果來計算比特對的對的奇偶性,以此類推,構(gòu)建出總共的奇偶性。深度線路這樣就能從本質(zhì)上獲得超過淺線路的更強的能力。
到現(xiàn)在為止,本書講神經(jīng)網(wǎng)絡(luò)看作是瘋狂的客戶。幾乎我們遇到的所有的網(wǎng)絡(luò)就只包括一層隱含神經(jīng)元(另外還有輸入輸出層):


淺層神經(jīng)網(wǎng)絡(luò)


這些簡單的網(wǎng)絡(luò)已經(jīng)非常有用了:在前面的章節(jié)中,我們使用這樣的網(wǎng)絡(luò)可以進行準(zhǔn)確率高達 98% 的手寫數(shù)字的識別!而且,直覺上看,我們期望擁有更多隱含層的神經(jīng)網(wǎng)絡(luò)能夠變的更加強大:


深度神經(jīng)網(wǎng)絡(luò)


這樣的網(wǎng)絡(luò)可以使用中間層構(gòu)建出多層的抽象,正如我們在布爾線路中做的那樣。例如,如果我們在進行視覺模式識別,那么在第一層的神經(jīng)元可能學(xué)會識別邊,在第二層的神經(jīng)元可以在邊的基礎(chǔ)上學(xué)會識別出更加復(fù)雜的形狀,例如三角形或者矩形。第三層將能夠識別更加復(fù)雜的形狀。依此類推。這些多層的抽象看起來能夠賦予深度網(wǎng)絡(luò)一種學(xué)習(xí)解決復(fù)雜模式識別問題的能力。然后,正如線路的示例中看到的那樣,存在著理論上的研究結(jié)果告訴我們深度網(wǎng)絡(luò)在本質(zhì)上比淺層網(wǎng)絡(luò)更加強大。

對某些問題和網(wǎng)絡(luò)結(jié)構(gòu),Razvan Pascanu, Guido Montúfar, and Yoshua Bengio 在2014年的這篇文章 On the number of response regions of deep feed forward networks with piece-wise linear activations給出了證明。更加詳細(xì)的討論在Yoshua Bengio 2009年的著作 Learning deep architectures for AI 的第二部分。

那我們?nèi)绾斡?xùn)練這樣的深度神經(jīng)網(wǎng)絡(luò)呢?在本章中,我們嘗試使用基于 BP 的隨機梯度下降的方法來訓(xùn)練。但是這會產(chǎn)生問題,因為我們的深度神經(jīng)網(wǎng)絡(luò)并不能比淺層網(wǎng)絡(luò)性能好太多。
這個失敗的結(jié)果好像與上面的討論相悖。這就能讓我們退縮么,不,我們要深入進去試著理解使得深度網(wǎng)絡(luò)訓(xùn)練困難的原因。仔細(xì)研究一下,就會發(fā)現(xiàn),在深度網(wǎng)絡(luò)中,不同的層學(xué)習(xí)的速度差異很大。尤其是,在網(wǎng)絡(luò)中后面的層學(xué)習(xí)的情況很好的時候,先前的層次常常會在訓(xùn)練時停滯不變,基本上學(xué)不到東西。這種停滯并不是因為運氣不好。而是,有著更加根本的原因是的學(xué)習(xí)的速度下降了,這些原因和基于梯度的學(xué)習(xí)技術(shù)相關(guān)。
當(dāng)我們更加深入地理解這個問題時,發(fā)現(xiàn)相反的情形同樣會出現(xiàn):先前的層可能學(xué)習(xí)的比較好,但是后面的層卻停滯不變。實際上,我們發(fā)現(xiàn)在深度神經(jīng)網(wǎng)絡(luò)中使用基于梯度下降的學(xué)習(xí)方法本身存在著內(nèi)在不穩(wěn)定性。這種不穩(wěn)定性使得先前或者后面的層的學(xué)習(xí)過程阻滯。
這個的確是壞消息。但是真正理解了這些難點后,我們就能夠獲得高效訓(xùn)練深度網(wǎng)絡(luò)的更深洞察力。而且這些發(fā)現(xiàn)也是下一章的準(zhǔn)備知識,我們到時會介紹如何使用深度學(xué)習(xí)解決圖像識別問題。

(消失的戀人,哦不)消失的梯度問題

那么,在我們訓(xùn)練深度網(wǎng)絡(luò)時究竟哪里出了問題?
為了回答這個問題,讓我們重新看看使用單一隱藏層的神經(jīng)網(wǎng)絡(luò)示例。這里我們也是用 MNIST 數(shù)字分類問題作為研究和實驗的對象。

MNIST 問題和數(shù)據(jù)在這里(here )和這里( here).

這里你也可以在自己的電腦上訓(xùn)練神經(jīng)網(wǎng)絡(luò)。或者就直接讀下去。如果希望實際跟隨這些步驟,那就需要在電腦上安裝 python 2.7,numpy和代碼,可以通過下面的命令復(fù)制所需要的代碼

git clone https://github.com/mnielsen/neural-networks-and-deep-learning.git

如果你不使用 git,那么就直接從這里(here)下載數(shù)據(jù)和代碼。然后需要轉(zhuǎn)入 src 子目錄。
接著從 python 的 shell 就可以載入 MNIST 數(shù)據(jù):

>>> import mnist_loader >>> training_data, validation_data, test_data = \ ... mnist_loader.load_data_wrapper()

然后設(shè)置我們的網(wǎng)絡(luò):

>>> import network2 >>> net = network2.Network([784, 30, 10])

這個網(wǎng)絡(luò)擁有 784 個輸入層神經(jīng)元,對應(yīng)于輸入圖片的 28 * 28 = 784 個像素點。我們設(shè)置隱藏層神經(jīng)元為 30 個,輸出層為 10 個神經(jīng)元,對應(yīng)于 MNIST 數(shù)字 ('0', '1', ..., '9')。
讓我們訓(xùn)練 30 輪,使用 mini batch 大小為 10, 學(xué)習(xí)率 \eta = 0.1,正規(guī)化參數(shù) \lambda = 5.0。在訓(xùn)練時,我們也會在驗證集上監(jiān)控分類的準(zhǔn)確度:

>>> net.SGD(training_data, 30, 10, 0.1, lmbda=5.0, ... evaluation_data=validation_data, monitor_evaluation_accuracy=True)

最終我們得到了分類的準(zhǔn)確率為 96.48%(也可能不同,每次運行實際上會有一點點的偏差)這和我們前面的結(jié)果相似。
現(xiàn)在,我們增加另外一層隱藏層,同樣地是 30 個神經(jīng)元,試著使用相同的超參數(shù)進行訓(xùn)練:

>>> net = network2.Network([784, 30, 30, 10]) >>> net.SGD(training_data, 30, 10, 0.1, lmbda=5.0, ... evaluation_data=validation_data, monitor_evaluation_accuracy=True)

最終的結(jié)果分類準(zhǔn)確度提升了一點,96.90%。這點令人興奮:一點點的深度帶來了效果。那么就再增加一層同樣的隱藏層:

>>> net = network2.Network([784, 30, 30, 30, 10]) >>> net.SGD(training_data, 30, 10, 0.1, lmbda=5.0, ... evaluation_data=validation_data, monitor_evaluation_accuracy=True)

哦,這里并沒有什么提升,反而下降到了 96.57%,這與最初的淺層網(wǎng)絡(luò)相差無幾。再增加一層:

>>> net = network2.Network([784, 30, 30, 30, 30, 10]) >>> net.SGD(training_data, 30, 10, 0.1, lmbda=5.0, ... evaluation_data=validation_data, monitor_evaluation_accuracy=True)

分類準(zhǔn)確度又下降了,96.53%。這可能不是一個統(tǒng)計顯著地下降,但是會讓人們覺得沮喪。
這里表現(xiàn)出來的現(xiàn)象看起非常奇怪。直覺地,額外的隱藏層應(yīng)當(dāng)讓網(wǎng)絡(luò)能夠?qū)W到更加復(fù)雜的分類函數(shù),然后可以在分類時表現(xiàn)得更好吧。可以肯定的是,事情并沒有變差,至少新的層次增加上,在最壞的情形下也就是沒有影響。事情并不是這樣子的。
那么,應(yīng)該是怎樣的呢?假設(shè)額外的隱藏層的確能夠在原理上起到作用,問題是我們的學(xué)習(xí)算法沒有發(fā)現(xiàn)正確地權(quán)值和偏差。那么現(xiàn)在就要好好看看學(xué)習(xí)算法本身有哪里出了問題,并搞清楚如何改進了。
為了獲得一些關(guān)于這個問題直覺上的洞察,我們可以將網(wǎng)絡(luò)學(xué)到的東西進行可視化。下面,我畫出了一部分 [784, 30, 30, 10] 的網(wǎng)絡(luò),也就是包含兩層各有 30 個隱藏神經(jīng)元的隱藏層。圖中的每個神經(jīng)元有一個條形統(tǒng)計圖,表示這個神經(jīng)元在網(wǎng)絡(luò)進行學(xué)習(xí)時改變的速度。更大的條意味著更快的速度,而小的條則表示變化緩慢。更加準(zhǔn)確地說,這些條表示了 每個神經(jīng)元上的dC/db,也就是代價函數(shù)關(guān)于神經(jīng)元的偏差更變的速率?;仡櫟诙?#xff08;Chapter 2),我們看到了這個梯度的數(shù)值不僅僅是在學(xué)習(xí)過程中偏差改變的速度,而且也控制了輸入到神經(jīng)元權(quán)重的變量速度。如果沒有回想起這些細(xì)節(jié)也不要擔(dān)心:目前要記住的就是這些條表示了每個神經(jīng)元權(quán)重和偏差在神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)時的變化速率。
為了讓圖里簡單,我只展示出來最上方隱藏層上的 6 個神經(jīng)元。這里忽略了輸入層神經(jīng)元,因為他們并不包含需要學(xué)習(xí)的權(quán)重或者偏差。同樣輸出層神經(jīng)元也忽略了,因為這里我們做的是層層之間的比較,所以比較相同數(shù)量的兩層更加合理啦。在網(wǎng)絡(luò)初始化后立即得到訓(xùn)練前期的結(jié)果如下:

這個程序給出了計算梯度的方法generate_gradient.py. 也包含了其他一些在本章后面提到的計算方法。


比較隱藏層


該網(wǎng)絡(luò)是隨機初始化的,因此看到了神經(jīng)元學(xué)習(xí)的速度差異其實很大。而且,我們可以發(fā)現(xiàn),第二個隱藏層上的條基本上都要比第一個隱藏層上的條要大。所以,在第二個隱藏層的神經(jīng)元將學(xué)習(xí)得更加快速。這僅僅是一個巧合么,或者第二個隱藏層的神經(jīng)元一般情況下都要比第一個隱藏層的神經(jīng)元學(xué)習(xí)得更快?
為了確定我們的猜測,擁有一種全局的方式來比較學(xué)習(xí)速度會比較有效。我們這里將梯度表示為


梯度


在第 l 層的第 j 個神經(jīng)元的梯度。我們可以將 \delta^1 看做是一個向量其中元素表示第一層隱藏層的學(xué)習(xí)速度,\delta^2 則是第二層隱藏層的學(xué)習(xí)速度。接著使用這些向量的長度作為全局衡量這些隱藏層的學(xué)習(xí)速度的度量。因此,||\delta^1|| 就代表第一層隱藏層學(xué)習(xí)速度,而||\delta^2|| 就代表第二層隱藏層學(xué)習(xí)速度。
借助這些定義,在和上圖同樣的配置下,||\delta^1|| = 0.07而||\delta^2|| = 0.31,所以這就確認(rèn)了之前的疑惑:在第二層隱藏層的神經(jīng)元學(xué)習(xí)速度確實比第一層要快。
如果我們添加更多的隱藏層呢?如果我們有三個隱藏層,比如說在一個 [784, 30, 30, 10] 的網(wǎng)絡(luò)中,那么對應(yīng)的學(xué)習(xí)速度就是 0.012, 0.060, 0.283。這里前面的隱藏層學(xué)習(xí)速度還是要低于最后的隱藏層。假設(shè)我們增加另一個包含 30 個隱藏神經(jīng)元的隱藏層。那么,對應(yīng)的學(xué)習(xí)速度就是:0.003, 0.017, 0.070, 0.285。還是一樣的模式:前面的層學(xué)習(xí)速度低于后面的層。
現(xiàn)在我們已經(jīng)看到了訓(xùn)練開始時的學(xué)習(xí)速度,這是剛剛初始化之后的情況。那么這個速度會隨著訓(xùn)練的推移發(fā)生什么樣的變化呢?讓我們看看只有兩個隱藏層。學(xué)習(xí)速度變化如下:


學(xué)習(xí)速度變化圖1


為了產(chǎn)生這些結(jié)果,我在 1000 個訓(xùn)練圖像上進行了 500 輪 batch 梯度下降。這和我們通常訓(xùn)練方式還是不同的——我沒有使用 minibatch,僅僅使用了 1000 個訓(xùn)練圖像,而不是全部的 50,000 幅圖。我并不是想做點新鮮的嘗試,或者蒙蔽你們的雙眼,但因為使用 minibatch 隨機梯度下降會在結(jié)果中帶來更多的噪聲(盡管在平均噪聲的時候結(jié)果很相似)。使用我已經(jīng)確定的參數(shù)可以對結(jié)果進行平滑,這樣我們可以看清楚真正的情況是怎樣的。
如圖所示,兩層在開始時就有著不同的速度。然后兩層的學(xué)習(xí)速度在觸底前迅速下落。在最后,我們發(fā)現(xiàn)第一層的學(xué)習(xí)速度變得比第二層更慢了。
那么更加復(fù)雜的網(wǎng)絡(luò)是什么情況呢?這里是一個類似的實驗,但是這次有三個隱藏層([784, 30, 30, 30, 10]):


學(xué)習(xí)速度變化圖2


同樣,前面的隱藏層要比后面的隱藏層學(xué)習(xí)的更慢。最后一個實驗,就是增加第四個隱藏層([784, 30, 30, 30, 30, 10]),看看這里會發(fā)生什么:


學(xué)習(xí)速度變化圖3


同樣的情況出現(xiàn)了,前面的隱藏層的學(xué)習(xí)速度要低于后面的隱藏層。這里,第一層的學(xué)習(xí)速度和最后一層要差了兩個數(shù)量級,也就是比第四層慢了100倍。難怪我們之前在訓(xùn)練這些網(wǎng)絡(luò)的時候遇到了大麻煩!
現(xiàn)在我們已經(jīng)有了一項重要的觀察結(jié)果:至少在某些深度神經(jīng)網(wǎng)絡(luò)中,在我們在隱藏層 BP 的時候梯度傾向于變小。這意味著在前面的隱藏層中的神經(jīng)元學(xué)習(xí)速度要慢于后面的隱藏層。這兒我們只在一個網(wǎng)絡(luò)中發(fā)現(xiàn)了這個現(xiàn)象,其實在多數(shù)的神經(jīng)網(wǎng)絡(luò)中存在著更加根本的導(dǎo)致這個現(xiàn)象出現(xiàn)的原因。這個現(xiàn)象也被稱作是 消失的梯度問題(vanishing gradient problem)。

為何消失的梯度問題會出現(xiàn)呢?我們可以通過什么方式避免它?還有在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時如何處理好這個問題?實際上,這個問題是可以避免的,盡管替代方法并不是那么有效,同樣會產(chǎn)生問題——在前面的層中的梯度會變得非常大!這也叫做 爆炸的梯度問題(exploding gradient problem),這也沒比消失的梯度問題更好處理。更加一般地說,在深度神經(jīng)網(wǎng)絡(luò)中的梯度是不穩(wěn)定的,在前面的層中或會消失,或會爆炸。這種不穩(wěn)定性才是深度神經(jīng)網(wǎng)絡(luò)中基于梯度學(xué)習(xí)的根本問題。這就是我們需要理解的東西,如果可能的話,采取合理的步驟措施解決問題。
一種有關(guān)消失的(不穩(wěn)定的)梯度的看法是確定這是否確實是一個問題。此刻我們暫時轉(zhuǎn)換到另一個話題,假設(shè)我們正要數(shù)值優(yōu)化一個一元的函數(shù) f(x)。如果其導(dǎo)數(shù) f'(x) 很小,這難道不是一個好消息么?是不是意味著我們已經(jīng)接近極值點了?同樣的方式,在深度神經(jīng)網(wǎng)絡(luò)中前面隱藏層的小的梯度是不是表示我們不需要對權(quán)重和偏差做太多調(diào)整了?
當(dāng)然,實際情況并不是這樣的。想想我們隨機初始網(wǎng)絡(luò)中的權(quán)重和偏差。在面對任意的一種任務(wù),單單使用隨機初始的值就能夠獲得一個較好的結(jié)果是太天真了。具體講,看看 MNIST 問題的網(wǎng)絡(luò)中第一層的權(quán)重。隨機初始化意味著第一層丟失了輸入圖像的幾乎所有信息。即使后面的層能夠獲得充分的訓(xùn)練,這些層也會因為沒有充分的信息而很難識別出輸入的圖像。因此,在第一層不進行學(xué)習(xí)的嘗試是不可能的。如果我們接著去訓(xùn)練深度神經(jīng)網(wǎng)絡(luò),我們需要弄清楚如何解決消失的梯度問題

什么導(dǎo)致了消失的梯度問題?也就是在深度神經(jīng)網(wǎng)絡(luò)中的所謂的梯度不穩(wěn)定性

為了弄清楚為何會出現(xiàn)消失的梯度,來看看一個極簡單的深度神經(jīng)網(wǎng)絡(luò):每一層都只有一個單一的神經(jīng)元。下圖就是有三層隱藏層的神經(jīng)網(wǎng)絡(luò):


簡單的深度神經(jīng)網(wǎng)絡(luò)


這里,w_1, w_2, ... 是權(quán)重,而 b_1, b_2, ... 是偏差,C 則是某個代價函數(shù)。回顧一下,從第 j 個神經(jīng)元的輸出 a_j = \sigma(z_j),其中 \sigma 是通常的 sigmoid 函數(shù),而 z_j = w_j * a_j-1 + b_j是神經(jīng)元的帶權(quán)輸入。我已經(jīng)在最后表示出了代價函數(shù) C 來強調(diào)代價是網(wǎng)絡(luò)輸出 a_4 的函數(shù):如果實際輸出越接近目標(biāo)輸出,那么代價會變低;相反則會變高。
現(xiàn)在我們要來研究一下關(guān)聯(lián)于第一個隱藏神經(jīng)元梯度 dC/db_1。我們將會計算出dC/db_1 的表達式,通過研究表達式來理解消失的梯度發(fā)生的原因。
開始就簡單地給出 dC/db_1 的表達式。初看起來有點復(fù)雜,但是其結(jié)構(gòu)是相當(dāng)簡單的,我一會兒會解釋。下圖給出了具體的表達式:


dC/db_1


表達式結(jié)構(gòu)如下:對每個神經(jīng)元有一個 \sigma'(z_j) 項;對每個權(quán)重有一個 w_j 項;還有一個 dC/da_4項,表示最后的代價函數(shù)。注意,我已經(jīng)將表達式中的每個項置于了對應(yīng)的位置。所以網(wǎng)絡(luò)本身就是表達式的解讀。
你可以直接認(rèn)可這個表達式,直接跳到該表達式如何關(guān)聯(lián)于小時的梯度問題的。這對理解沒有影響,因為實際上上面的表達式只是前面對于BP 的討論的特例。但是也包含了一個表達式正確的解釋,所以去看看那個解釋也是很有趣的(也可能更有啟發(fā)性吧)。
假設(shè)我們對偏差 b_1 進行了微小的調(diào)整 \Delta b_1。這會導(dǎo)致網(wǎng)絡(luò)中剩下的元素一系列的變化。首先會對第一個隱藏元輸出產(chǎn)生一個 \Delta a_1 的變化。這樣就會導(dǎo)致第二個神經(jīng)元的帶權(quán)輸入產(chǎn)生 \Delta z_2 的變化。從第二個神經(jīng)元輸出隨之發(fā)生 \Delta a_2 的變化。以此類推,最終會對代價函數(shù)產(chǎn)生 \Delta C 的變化。這里我們有:


Paste_Image.png


這表示我們可以通過仔細(xì)追蹤每一步的影響來搞清楚 dC/db_1 的表達式。
現(xiàn)在我們看看 \Delta b_1 如何影響第一個神經(jīng)元的輸出 a_1 的。我們有 a_1 = \sigma(z_1) = \sigma(w_1 * a_0 + b1),所以有


Paste_Image.png


\sigma'(z_1) 這項看起很熟悉:其實是我們上面關(guān)于 dC/db_1 的表達式的第一項。直覺上看,這項將偏差的改變 \Delta b_1 轉(zhuǎn)化成了輸出的變化 \Delta a_1。\Delta a_1 隨之又影響了帶權(quán)輸入 z_2 = w_2 * a_1 + b_2:


Paste_Image.png


將 \Delta z_2 和 \Delta a_1 的表達式組合起來,我們可以看到偏差 b_1 中的改變?nèi)绾瓮ㄟ^網(wǎng)絡(luò)傳輸影響到 z_2的:


Paste_Image.png


現(xiàn)在,又能看到類似的結(jié)果了:我們得到了在表達式 dC/db_1 的前面兩項。以此類推下去,跟蹤傳播改變的路徑就可以完成。在每個神經(jīng)元,我們都會選擇一個 \sigma'(z_j) 的項,然后在每個權(quán)重我們選擇出一個 w_j 項。最終的結(jié)果就是代價函數(shù)中變化 \Delta C 的相關(guān)于偏差 \Delta b_1 的表達式:


Paste_Image.png


除以 \Delta b_1,我們的確得到了梯度的表達式:


Paste_Image.png

為何出現(xiàn)梯度消失:現(xiàn)在把梯度的整個表達式寫下來:


Paste_Image.png

除了最后一項,該表達式是一系列形如 w_j \sigma'(z_j) 的乘積。為了理解每個項的行為,先看看下面的sigmoid 函數(shù)導(dǎo)數(shù)的圖像:


Paste_Image.png


該導(dǎo)數(shù)在 \sigma'(0)=1/4 時達到最高?,F(xiàn)在,如果我們使用標(biāo)準(zhǔn)方法來初始化網(wǎng)絡(luò)中的權(quán)重,那么會使用一個均值為 0 標(biāo)準(zhǔn)差為 1 的高斯分布。因此所有的權(quán)重通常會滿足 |w_j| < 1。有了這些信息,我們發(fā)現(xiàn)會有 w_j \sigma'(z_j) < 1/4。并且在我們進行了所有這些項的乘積時,最終結(jié)果肯定會指數(shù)級下降:項越多,乘積的下降的越快。**這里我們敏銳地嗅到了消失的梯度問題的合理解釋。
更明白一點,我們比較一下 dC/db_1 和一個更后面一些的偏差的梯度,不妨設(shè)為 dC/db_3。當(dāng)然,我們還沒有顯式地給出這個表達式,但是計算的方式是一樣的。


比較梯度的表達式


兩個表示式有很多相同的項。但是 dC/db_1 還多包含了兩個項。由于這些項都是 < 1/4 的。所以 dC/db_1 會是 dC/db_3 的 1/16 或者更小。這其實就是消失的梯度出現(xiàn)的本質(zhì)原因了。
當(dāng)然,這里并非嚴(yán)格的關(guān)于消失的梯度微調(diào)的證明而是一個不太正式的論斷。還有一些可能的產(chǎn)生原因了。特別地,我們想要知道權(quán)重 w_j 在訓(xùn)練中是否會增長。如果會,項 w_j \sigma'(z_j) 會不會不在滿足之前 w_j \sigma'(z_j) < 1/4 的約束。事實上,如果項變得很大——超過 1,那么我們將不再遇到消失的梯度問題。實際上,這時候梯度會在我們 BP 的時候發(fā)生指數(shù)級地增長。也就是說,我們遇到了梯度爆炸的問題。
梯度爆炸問題:現(xiàn)在看看梯度爆炸如何出現(xiàn)的把。這里的例子可能不是那么自然:固定網(wǎng)絡(luò)中的參數(shù),來確保產(chǎn)生爆炸的梯度。但是即使是不自然,也是包含了確定會產(chǎn)生爆炸梯度(而非假設(shè)的可能)的特質(zhì)的。
共兩個步驟:首先,我們將網(wǎng)絡(luò)的權(quán)重設(shè)置得很大,比如 w_1 = w_2 = w_3 = w_4 = 100。然后,我們選擇偏差使得 sigma'(z_j) 項不會太小。這是很容易實現(xiàn)的:方法就是選擇偏差來保證每個神經(jīng)元的帶權(quán)輸入是 z_j = 0(這樣 sigma'(z_j) = 1/4)。比如說,我們希望 z_1 = w_1 * a_0 + b_1。我們只要把 b_1 = -100 * a_0 即可。我們使用同樣的方法來獲得其他的偏差。這樣我們可以發(fā)現(xiàn)所有的項 w_j * \sigma'(z_j)都等于 100*1/4 = 25。最終,我們就獲得了爆炸的梯度。
不穩(wěn)定的梯度問題:根本的問題其實并非是消失的梯度問題或者爆炸的梯度問題,而是在前面的層上的梯度是來自后面的層上項的乘積。當(dāng)存在過多的層次時,就出現(xiàn)了內(nèi)在本質(zhì)上的不穩(wěn)定場景。唯一讓所有層都接近相同的學(xué)習(xí)速度的方式是所有這些項的乘積都能得到一種平衡。如果沒有某種機制或者更加本質(zhì)的保證來達成平衡,那網(wǎng)絡(luò)就很容易不穩(wěn)定了。簡而言之,真實的問題就是神經(jīng)網(wǎng)絡(luò)受限于不穩(wěn)定梯度的問題。所以,如果我們使用標(biāo)準(zhǔn)的基于梯度的學(xué)習(xí)算法,在網(wǎng)絡(luò)中的不同層會出現(xiàn)按照不同學(xué)習(xí)速度學(xué)習(xí)的情況。

練習(xí)

  • 在我們對于消失的梯度問題討論中,使用了 |\sigma'(z) < 1/4| 這個結(jié)論。假設(shè)我們使用一個不同的激活函數(shù),其導(dǎo)數(shù)值是非常大的。這會幫助我們避免不穩(wěn)定梯度的問題么?

消失的梯度問題普遍存在:我們已經(jīng)看到了在神經(jīng)網(wǎng)絡(luò)的前面的層中梯度可能會消失也可能會爆炸。實際上,在使用 sigmoid 神經(jīng)元時,梯度通常會消失。為什么?再看看表達式 |w\sigma'(z)|。為了避免消失的梯度問題,我們需要 |w\sigma'(z)| >= 1。你可能會認(rèn)為如果 w 很大的時候很容易達成。但是這比看起來還是困難很多。原因在于,\sigma'(z) 項同樣依賴于 w:\sigma'(z) = \sigma'(w*a+b),其中 a 是輸入的激活函數(shù)。所以我們在讓 w 變大時,需要同時不讓 \sigma'(w*a+b) 變小。這將是很大的限制了。原因在于我們讓 w 變大,也會使得 w*a + b 變得非常大??纯?\sigma' 的圖,這會讓我們走到 \sigma' 的兩翼,這里會去到很小的值。唯一避免發(fā)生這個情況的方式是,如果輸入激活函數(shù)掉入相當(dāng)狹窄的范圍內(nèi)(這個量化的解釋在下面第一個問題中進行)。有時候,有可能會出現(xiàn)。但是一般不大會發(fā)生。所以一般情況下,會遇到消失的梯度。

問題

  • 考慮乘積 |\w\sigma'(wa+b)|。假設(shè)有 |\w\sigma'(wa+b)| >= 1。(1) 這種情況只有在 |w| >= 4 的時候才會出現(xiàn)。(2) 假設(shè) |w| >= 4,考慮那些滿足 |\w\sigma'(wa+b)| >= 1 的輸入激活 a 集合。證明:滿足上述條件的該集合能夠充滿一個不超過

    Paste_Image.png
    寬度的區(qū)間。(3) 數(shù)值上說明上述表達式在 |w| ~= 6.9 時候去的最高值約 0.45。所以即使每個條件都滿足,我們?nèi)匀挥幸粋€狹窄的輸入激活區(qū)間,這樣來避免消失的梯度問題。
  • 幺神經(jīng)元:考慮一個單一輸入的神經(jīng)元,x,對應(yīng)的權(quán)重 w_1,偏差 b,輸出上的權(quán)重 w_2。證明,通過合理選擇權(quán)重和偏差,我們可以確保 w_2 \sigma(w_1*x +b)~=x for x \in [0, 1]。這樣的神經(jīng)元可用來作為幺元試用,輸出和輸入相同(成比例)。Hint:可以重寫 x = 1/2 + \Delta,可以假設(shè) w_1 很小,和在 w_1 * \Delta使用 Taylor 級數(shù)展開。

在更加復(fù)雜網(wǎng)絡(luò)中的不穩(wěn)定梯度

現(xiàn)在已經(jīng)研究了簡單的網(wǎng)絡(luò),每一層只包含一個神經(jīng)元。那么那些每層包含很多神經(jīng)元的更加復(fù)雜的深度網(wǎng)絡(luò)呢?


Paste_Image.png


實際上,在這樣的神經(jīng)網(wǎng)絡(luò)中,同樣的情況也會發(fā)生。在前面關(guān)于 BP 的章節(jié)中,我們看到了在一個共 L 層的第 l 層的梯度:


Paste_Image.png

這里 \Sigma'(z^l)是一個對角矩陣,每個元素是對第 l 層的帶權(quán)輸入 \sigma'(z)。而 w^l 是對不同層的權(quán)值矩陣。\nbala_a C 是對每個輸出激活的偏導(dǎo)數(shù)向量。
這是更加復(fù)雜的表達式。不過,你仔細(xì)看,本質(zhì)上的形式還是很相似的。主要是包含了更多的形如 (w^j)^T \Sigma' (z^j) 的對 (pair)。而且,矩陣 \Sigma'(z^j) 在對角線上的值挺小,不會超過 1/4。由于權(quán)值矩陣 w^j 不是太大,每個額外的項 (w^j)^T \sigma' (z^l) 會讓梯度向量更小,導(dǎo)致梯度消失。更加一般地看,在乘積中大量的項會導(dǎo)致不穩(wěn)定的梯度,和前面的例子一樣。實踐中,一般會發(fā)現(xiàn)在 sigmoid 網(wǎng)絡(luò)中前面的層的梯度指數(shù)級地消失。所以在這些層上的學(xué)習(xí)速度就會變得很慢了。這種減速不是偶然現(xiàn)象:也是我們采用的訓(xùn)練的方法決定的。

深度學(xué)習(xí)其他的障礙

本章我們已經(jīng)聚焦在消失的梯度上,并且更加一般地,不穩(wěn)定梯度——深度學(xué)習(xí)的一大障礙。實際上,不穩(wěn)定梯度僅僅是深度學(xué)習(xí)的眾多障礙之一,盡管這一點是相當(dāng)根本的。當(dāng)前的研究集中在更好地理解在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時遇到的挑戰(zhàn)。這里我不會給出一個詳盡的總結(jié),僅僅想要給出一些論文,告訴你人們正在尋覓探究的問題。
首先,在 2010 年 Glorot 和 Bengio 發(fā)現(xiàn)證據(jù)表明 sigmoid 函數(shù)的選擇會導(dǎo)致訓(xùn)練網(wǎng)絡(luò)的問題。特別地,他們發(fā)現(xiàn) sigmoid 函數(shù)會導(dǎo)致最終層上的激活函數(shù)在訓(xùn)練中會聚集在 0,這也導(dǎo)致了學(xué)習(xí)的緩慢。他們的工作中提出了一些取代 sigmoid 函數(shù)的激活函數(shù)選擇,使得不會被這種聚集性影響性能。
第二個例子,在 2013 年 Sutskever, Martens, Dahl 和 Hinton 研究了深度學(xué)習(xí)使用隨機權(quán)重初始化和基于 momentum 的 SGD 方法。兩種情形下,好的選擇可以獲得較大的差異的訓(xùn)練效果。
這些例子告訴我們,“什么讓訓(xùn)練深度網(wǎng)絡(luò)非常困難”這個問題相當(dāng)復(fù)雜。本章,我們已經(jīng)集中于深度神經(jīng)網(wǎng)絡(luò)中基于梯度的學(xué)習(xí)方法的不穩(wěn)定性。結(jié)果表明了激活函數(shù)的選擇,權(quán)重的初始化,甚至是學(xué)習(xí)算法的實現(xiàn)方式也扮演了重要的角色。當(dāng)然,網(wǎng)絡(luò)結(jié)構(gòu)和其他超參數(shù)本身也是很重要的。因此,太多因子影響了訓(xùn)練神經(jīng)網(wǎng)絡(luò)的難度,理解所有這些因子仍然是當(dāng)前研究的重點。盡管這看起來有點悲觀,但是在下一章中我們會介紹一些好的消息,給出一些方法來一定程度上解決和迂回所有這些困難。



文/Not_GOD(簡書作者)
原文鏈接:http://www.jianshu.com/p/917f71b06499
著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”。

總結(jié)

以上是生活随笔為你收集整理的第五章 深度神经网络为何很难训练的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久国产精品系列 | 污污在线免费观看 | 国产精品尤物 | 日韩视频在线观看一区 | 久草视频手机在线观看 | 国产污污网站 | 久久99精品久久久久久水蜜桃 | 国产成人手机视频 | 体感预报日剧 | 熟妇女人妻丰满少妇中文字幕 | 综合网色 | 国产又粗又猛又爽69xx | 大伊人网| 欧美日韩一区免费 | 一区二区日韩av | 小早川怜子一区二区三区 | 日批免费在线观看 | 国产午夜在线视频 | 姐姐的秘密韩剧免费观看全集中文 | 日韩小视频 | 欧美一级日韩 | av黄色在线免费观看 | 影音先锋激情在线 | 亚洲福利视频一区二区 | 日韩一二三区 | 中文国产视频 | 校园sm主奴调教1v1罚视频 | 国产麻豆影视 | 四虎影成人精品a片 | 风间由美一区二区三区 | www欧美在线| 亚洲一区二区三区免费 | 久久男人的天堂 | 成人动漫在线观看视频 | 亚洲免费国产 | 日韩福利社 | 婷综合 | 久久性感美女视频 | 日本免费在线观看 | 欧美有码在线 | 欧美视频1区 | 淫品色影院| 91午夜视频在线观看 | 国产一区二区中文字幕 | 国产日韩在线免费观看 | 成人污污www网站免费丝瓜 | 免费美女av| 日韩va视频 | 欧美成人生活片 | 午夜激情一区二区 | 久久对白 | 日韩簧片在线观看 | 欧美一二三视频 | 呦呦av| 成人午夜大片 | 自拍三级视频 | 色屁屁ts人妖系列二区 | 久久艹综合 | 操大爷影院 | 三级av免费 | 美女扒开粉嫩的尿囗给男生桶 | 国产成人av在线播放 | 偷偷久久 | 成人一级片在线观看 | 日本孕妇孕交 | 亚洲第一第二区 | 欧美熟妇7777一区二区 | 精品夜夜澡人妻无码av | 久久九九爱 | 粉色视频免费观看 | 国产一区二区色 | 欧美性生活视频 | 青青草97国产精品免费观看 | 五月天婷婷伊人 | 精品欧美一区二区精品少妇 | 一级片中文 | 污片网站 | 乱视频在线观看 | 波多野结衣一二三区 | 性欧美最猛 | 在线免费观看av网站 | 娇小激情hdxxxx学生 | 天天干天天舔 | www..com黄色| 国产又粗又猛又爽69xx | 日韩欧美视频 | 男女视频免费观看 | 一级片在线免费观看视频 | 二区三区av | 男女午夜视频在线观看 | 日韩av中字 | 日本大尺度吃奶做爰久久久绯色 | 农村寡妇一区二区三区 | 毛片123| 国产精品sm| 久久一区av | 久久精品人人做人人爽 | 国产精品香蕉在线观看 | 91av俱乐部 |