深度神經網路為何很難訓練(包含梯度消失和梯度爆炸等)
我選取了原文的部分內容進行轉載。之前我搜索”梯度消失和梯度爆炸“的相關部落格,發現很多都解釋的不是很好,然後看到了 極客學院 的這篇介紹,感覺介紹的挺詳細,轉載一下,大家一起分享一下~
到現在為止,本書講神經網路看作是瘋狂的客戶。幾乎我們遇到的所有的網路就只包括一層隱含神經元(另外還有輸入輸出層):
這些簡單的網路已經非常有用了:在前面的章節中,我們使用這樣的網路可以進行準確率高達 98% 的手寫數字的識別!而且,直覺上看,我們期望擁有更多隱含層的神經網路能夠變的更加強大:
這樣的網路可以使用中間層構建出多層的抽象,正如我們在布林線路中做的那樣。例如,如果我們在進行視覺模式識別,那麼在第一層的神經元可能學會識別邊,在第二層的神經元可以在邊的基礎上學會識別出更加複雜的形狀,例如三角形或者矩形。第三層將能夠識別更加複雜的形狀。依此類推。這些多層的抽象看起來能夠賦予深度網路一種學習解決複雜模式識別問題的能力。然後,正如線路的示例中看到的那樣,存在著理論上的研究結果告訴我們深度網路在本質上比淺層網路更加強大。
對某些問題和網路結構,Razvan Pascanu, Guido Montúfar, and Yoshua Bengio 在2014年的這篇文章Learning deep architectures for AI 的第二部分。
那我們如何訓練這樣的深度神經網路呢?在本章中,我們嘗試使用基於 BP 的隨機梯度下降的方法來訓練。但是這會產生問題,因為我們的深度神經網路並不能比淺層網路效能好太多。
這個失敗的結果好像與上面的討論相悖。這就能讓我們退縮麼,不,我們要深入進去試著理解使得深度網路訓練困難的原因。仔細研究一下,就會發現,在深度網路中,不同的層學習的速度差異很大。尤其是,在網路中後面的層學習的情況很好的時候,先前的層次常常會在訓練時停滯不變,基本上學不到東西。這種停滯並不是因為運氣不好。而是,有著更加根本的原因是的學習的速度下降了,這些原因和基於梯度的學習技術相關
當我們更加深入地理解這個問題時,發現相反的情形同樣會出現:先前的層可能學習的比較好,但是後面的層卻停滯不變。實際上,我們發現在深度神經網路中使用基於梯度下降的學習方法本身存在著內在不穩定性。這種不穩定性使得先前或者後面的層的學習過程阻滯。
這個的確是壞訊息。但是真正理解了這些難點後,我們就能夠獲得高效訓練深度網路的更深洞察力。而且這些發現也是下一章的準備知識,我們到時會介紹如何使用深度學習解決影象識別問題。
(消失的戀人,哦不)消失的梯度問題
那麼,在我們訓練深度網路時究竟哪裡出了問題?
為了回答這個問題,讓我們重新看看使用單一隱藏層的神經網路示例。這裡我們也是用 MNIST 數字分類問題作為研究和實驗的物件。
MNIST 問題和資料在(這裡).
這裡你也可以在自己的電腦上訓練神經網路。或者就直接讀下去。如果希望實際跟隨這些步驟,那就需要在電腦上安裝 python 2.7,numpy和程式碼,可以通過下面的命令複製所需要的程式碼
git clone https://github.com/mnielsen/neural-networks-and-deep-learning.git
如果你不使用
為了讓圖裡簡單,我只展示出來最上方隱藏層上的
這個程式給出了計算梯度的方法該表示式如何關聯於小時的梯度問題的。這對理解沒有影響,因為實際上上面的表示式只是前面對於<a rel="nofollow" href="http://neuralnetworksanddeeplearning.com/chap2.html#the_four_fundamental_equations_behind_backpropagation" "="" style="padding: 0px; margin: 0px; background-color: transparent; color: rgb(45, 133, 202);">BP 的討論的特例。但是也包含了一個表示式正確的解釋,所以去看看那個解釋也是很有趣的(也可能更有啟發性吧)。
假設我們對偏差
b1 進行了微小的調整Δb1 。這會導致網路中剩下的元素一系列的變化。首先會對第一個隱藏元輸出產生一個Δa1 的變化。這樣就會導致第二個神經元的帶權輸入產生Δz2 的變化。從第二個神經元輸出隨之發生Δa2 的變化。以此類推,最終會對代價函式產生ΔC 的變化。這裡我們有:∂C∂b1≈ΔCΔb1 這表示我們可以通過仔細追蹤每一步的影響來搞清楚
∂C/∂b1 的表示式。 現在我們看看Δb1 如何影響第一個神經元的輸出a1 的。我們有a1=σ(z1)=σ(w1∗a0+b1) ,所以有Δa1≈∂σ(w1a0+b1)∂b1Δb1= 相關推薦
深度神經網路為何很難訓練(包含梯度消失和梯度爆炸等)
我選取了原文的部分內容進行轉載。之前我搜索”梯度消失和梯度爆炸“的相關部落格,發現很多都解釋的不是很好,然後看到了 極客學院 的這篇介紹,感覺介紹的挺詳細,轉載一下,大家一起分享一下~ 到現在為止,本書講神經網路看作是瘋狂的客戶。幾乎我們遇到的所有的網路
Deep Learning(深度學習)之(六)【深度神經網路壓縮】Deep Compression (ICLR2016 Best Paper)
Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman coding 這篇論文是Stanford的Song Han的
神經網路解決推薦系統問題(綜述:A Survey and New Perspectives )
--------隨著網路資訊數量的不斷增加、複雜性和動態性的不斷提高,推薦系統已經成為克服此類資訊過載的一個有效的關鍵解決方案,它能夠以個性化的方式來發現產品和服務,為使用者提供嚮導。 過去幾年深度學習在許多領域取得了巨大成功,首當其衝就是計算機視覺和語音識別。深度學習在處理複雜任
使用pytorch快速搭建神經網路實現二分類任務(包含示例)
# 使用pytorch快速搭建神經網路實現二分類任務(包含示例) --- ## Introduce [上一篇學習筆記](https://www.cnblogs.com/wangqinze/p/13418291.html)介紹了不使用pytorch包裝好的神經網路框架實現logistic迴歸模型,並且根據aut
深度學習 --- 優化入門三(梯度消失和啟用函式ReLU)
前兩篇的優化主要是針對梯度的存在的問題,如鞍點,區域性最優,梯度懸崖這些問題的優化,本節將詳細探討梯度消失問題,梯度消失問題在BP的網路裡詳細的介紹過(興趣有請的檢視我的這篇文章),然後主要精力介紹RuLU啟用函式,本篇還是根據國外的文章進行翻譯,然後再此基礎上補充,這樣使大家更容易理解,好,那
神經網路梯度消失和梯度爆炸及解決辦法
關注微信公眾號【Microstrong】,我現在研究方向是機器學習、深度學習,分享我在學習過程中的讀書筆記!一起來學習,一起來交流,一起來進步吧!目錄:(1)神經網路梯度消失與梯度爆炸(2)幾種啟用函式的比較一、神經網路梯度消失與梯度爆炸(1)簡介梯度消失與梯度爆炸層數比較多
RNN神經網路產生梯度消失和梯度爆炸的原因及解決方案
1、RNN模型結構 迴圈神經網路RNN(Recurrent Neural Network)會記憶之前的資訊,並利用之前的資訊影響後面結點的輸出。也就是說,迴圈神經網路的隱藏層之間的結點是有連線的,隱藏層的輸入不僅包括輸入層的輸出,還包括上時刻隱藏層的輸出。下圖為RNN模型結構圖: 2、R
php對前臺提交的表單資料做安全處理(防SQL注入和XSS攻擊等)
/** * 防sql注入字串轉義 * @param $content 要轉義內容 * @return array|string */ public static function escapeString($content) { $pa
選擇新增好友(包含 去重,刪除splice 等) v-show(解決顯示隱藏閃動問題)
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>選擇新增好友</title> <link rel="stylesheet" href="b
深度學習:梯度消失和梯度爆炸
梯度消失 主要是因為網路層數太多,太深,導致梯度無法傳播。本質應該是啟用函式的飽和性。 DNN結果出現nan值? 梯度爆炸,導致結果不收斂。都是梯度太大惹的禍,所以可以通過減小學習率(梯度變化直接變小)、減小batch size(累積梯度更小)、 features規格化(避
機器學習總結(二):梯度消失和梯度爆炸
神經網路的訓練過程通常分為兩個階段:前向傳播和反向傳播。 前向傳播如下圖所示,原理比較簡單 上一層的神經元與本層的神經元有連線,那麼本層的神經元的啟用等於上一層神經元對應的權值進行加權和運算,最後通過一個非線性函式(啟用函式)如ReLu,sigmoid等
FTPClient實現ftp的上傳下載(包含中文檔名和中文路徑問題)
整理一個ftp上傳下載的工具類,轉編碼的問題經測試都已經很好的解決,我這裡用的ftp為Windows系統下,Linux下的ftp操作寫法不一樣,下次有用到再整理: FtpUtil jar commons-net-3.3.jar maven依賴
【火爐煉AI】深度學習003-構建並訓練深度神經網路模型
【火爐煉AI】深度學習003-構建並訓練深度神經網路模型 (本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 前面我們講解過單層神經網路模型,發現它結構簡單,難以解決一些實際的比較複雜的問題,故而現
#####好好好好####Keras深度神經網路訓練分類模型的四種方法
Github程式碼: Keras樣例解析 歡迎光臨我的部落格:https://gaussic.github.io/2017/03/03/imdb-sentiment-classification/ (轉載請註明出處:https://gaussic.github.io) Keras的官方E
機器學習與深度學習系列連載: 第二部分 深度學習(十二)卷積神經網路 3 經典的模型(LeNet-5,AlexNet ,VGGNet,GoogLeNet,ResNet)
卷積神經網路 3 經典的模型 經典的卷積神經網路模型是我們學習CNN的利器,不光是學習原理、架構、而且經典模型的超引數、引數,都是我們做遷移學習最好的源材料之一。 1. LeNet-5 [LeCun et al., 1998] 我們還是從CNN之父,LeCun大神在98年提出的模
深度學習資料整理(深度神經網路理解)
https://blog.csdn.net/tiandijun/article/details/25192155 近這兩年裡deep learning技術在影象識別和跟蹤等方面有很大的突破,是一大研究熱點,裡面涉及的數學理論和應用技術很值得深入研究,這系列部落格總結了
深度學習入門筆記(二)————線性神經網路解決異或問題(程式碼)
首先梳理一下思路 輸入為1,0。00異或為0,01異或為1,10異或為1,11異或為0.所以輸出為2類如下圖可知,需要兩條線劃分。 Madaline用間接地辦法解決。多個線性函式進行劃分,然後對各個神經元的輸出做邏輯運算。如圖,用兩條直線實現了異或的劃分。 線
[深度學習] 神經網路中的啟用函式(Activation function)
20180930 在研究調整FCN模型的時候,對啟用函式做更深入地選擇,記錄學習內容 啟用函式(Activation Function),就是在人工神經網路的神經元上執行的函式,負責將神經元的輸入對映到輸出端。 線性啟用函式:最簡單的linear fun
cs231n斯坦福基於卷積神經網路的CV學習筆記(二)神經網路訓練細節
五,神經網路 注意點part1 例項:邏輯迴歸二層神經網路訓練函式 使用權重w和偏差值biase計算出第一個隱含層h,然後計算損失,評分,進行反向傳播回去 多種常用啟用函式(一般預設max(0,x)),如sigmoid函式具有飽和區梯度0,非零點中心,計算x複
使用NetworkX模組繪製深度神經網路(DNN)結構圖
本文將展示如何利用Python中的NetworkX模組來繪製深度神經網路(DNN)結構圖。 在文章Keras入門(一)搭建深度神經網路(DNN)解決多分類問題中,我們建立的DNN結構圖如下: 該DNN模型由輸入層、隱藏層、輸出層和softmax層組成,