深度學習 精選筆記(8)梯度消失和梯度爆炸

學習參考:

  • 動手學深度學習2.0
  • Deep-Learning-with-TensorFlow-book
  • pytorchlightning

①如有冒犯、請聯系侵刪。
②已寫完的筆記文章會不定時一直修訂修改(刪、改、增),以達到集多方教程的精華于一文的目的。
③非常推薦上面(學習參考)的前兩個教程,在網上是開源免費的,寫的很棒,不管是開始學還是復習鞏固都很不錯的。

深度學習回顧,專欄內容來源多個書籍筆記、在線筆記、以及自己的感想、想法,佛系更新。爭取內容全面而不失重點。完結時間到了也會一直更新下去,已寫完的筆記文章會不定時一直修訂修改(刪、改、增),以達到集多方教程的精華于一文的目的。所有文章涉及的教程都會寫在開頭、一起學習一起進步。

一、數值穩定性的重要性

到目前為止,實現的每個模型都是根據某個預先指定的分布來初始化模型的參數。

有人會認為初始化方案是理所當然的,忽略了如何做出這些選擇的細節。甚至有人可能會覺得,初始化方案的選擇并不是特別重要。

相反,初始化方案的選擇在神經網絡學習中起著舉足輕重的作用, 它對保持數值穩定性至關重要。 此外,這些初始化方案的選擇可以與非線性激活函數的選擇有趣的結合在一起。 選擇哪個函數以及如何初始化參數可以決定優化算法收斂的速度有多快。 糟糕選擇可能會導致我們在訓練時遇到梯度爆炸或梯度消失。

考慮一個具有 𝐿 層、輸入 𝐱和輸出 𝐨的深層網絡。 每一層 𝑙由變換 𝑓𝑙定義, 該變換的參數為權重 𝐖(𝑙) , 其隱藏變量是 𝐡(𝑙)(令 𝐡(0)=𝐱)。 網絡可以表示為:
在這里插入圖片描述
如果所有隱藏變量和輸入都是向量, 可以將 𝐨關于任何一組參數 𝐖(𝑙) 的梯度寫為下式,該梯度是 𝐿?𝑙 個矩陣 𝐌(𝐿)?…?𝐌(𝑙+1) 與梯度向量 𝐯(𝑙) 的乘積。
在這里插入圖片描述
因此,上面公式計算的結果容易受到數值下溢問題的影響. 當將太多的概率乘在一起時,這些問題經常會出現。 在處理概率時,一個常見的技巧是切換到對數空間, 即將數值表示的壓力從尾數轉移到指數。 不幸的是,上面的問題更為嚴重: 最初,矩陣 𝐌(𝑙) 可能具有各種各樣的特征值。 他們可能很小,也可能很大; 他們的乘積可能非常大,也可能非常小。

不穩定梯度帶來的風險不止在于數值表示; 不穩定梯度也威脅到優化算法的穩定性。

可能面臨一些問題:

  • 梯度爆炸(gradient exploding)問題: 參數更新過大,破壞了模型的穩定收斂;
  • 梯度消失(gradient vanishing)問題: 參數更新過小,在每次更新時幾乎不會移動,導致模型無法學習。

二、梯度消失

在深度神經網絡中,梯度消失指的是在反向傳播過程中,梯度逐漸變小并接近零,導致較深層的網絡參數無法得到有效更新,從而影響模型的訓練效果

梯度消失通常發生在使用激活函數導數具有較小值的情況下,尤其是在使用 sigmoid 或 tanh 激活函數時。

sigmoid函數 1/(1+exp(?𝑥))很流行, 因為它類似于閾值函數。 由于早期的人工神經網絡受到生物神經網絡的啟發, 神經元要么完全激活要么完全不激活(就像生物神經元)的想法很有吸引力。 然而,它卻是導致梯度消失問題的一個常見的原因。下圖是sigmoid函數變化圖和梯度變化圖。

%matplotlib inline
import tensorflow as tf
from d2l import tensorflow as d2lx = tf.Variable(tf.range(-8.0, 8.0, 0.1))
with tf.GradientTape() as t:y = tf.nn.sigmoid(x)
d2l.plot(x.numpy(), [y.numpy(), t.gradient(y, x).numpy()],legend=['sigmoid', 'gradient'], figsize=(4.5, 2.5))

在這里插入圖片描述
當sigmoid函數的輸入很大或是很小時,它的梯度都會消失。 此外,當反向傳播通過許多層時,除非在剛剛好的地方, 這些地方sigmoid函數的輸入接近于零,否則整個乘積的梯度可能會消失。 當網絡有很多層時,除非很小心,否則在某一層可能會切斷梯度。

事實上,這個問題曾經困擾著深度網絡的訓練。 因此,更穩定的ReLU系列函數已經成為從業者的默認選擇(雖然在神經科學的角度看起來不太合理)。

三、梯度爆炸

梯度爆炸則是指在反向傳播過程中,梯度變得非常大,超過了數值范圍,導致參數更新過大,模型無法穩定訓練。

梯度爆炸通常出現在網絡層數較多、權重初始化不當或者學習率設置過高的情況下。

相反,梯度爆炸可能同樣令人煩惱。 為了更好地說明這一點,生成100個高斯隨機矩陣,并將它們與某個初始矩陣相乘。 對于我們選擇的尺度(方差 𝜎2=1 ),矩陣乘積發生爆炸。 當這種情況是由于深度網絡的初始化所導致時,導致沒有機會讓梯度下降優化器收斂。

M = tf.random.normal((4, 4))
print('一個矩陣 \n', M)
for i in range(100):M = tf.matmul(M, tf.random.normal((4, 4)))print('乘以100個矩陣后\n', M.numpy())
一個矩陣 tf.Tensor(
[[ 3.7436965   2.652792    0.5994665  -0.17366047][ 0.6720035  -0.7297903   0.3705189  -0.5043682 ][ 0.53814566 -0.94948226  0.09689955 -0.4441989 ][ 0.6737587   0.41651404 -0.9230542   0.1903977 ]], shape=(4, 4), dtype=float32)
乘以100個矩陣后[[-1.9263415e+26  1.5658991e+27  3.4174752e+26 -9.1476850e+25][ 1.4916346e+24 -1.2148971e+25 -2.6495698e+24  7.0983965e+23][ 2.5503458e+25 -2.0726612e+26 -4.5202026e+25  1.2112884e+25][ 1.2258523e+25 -9.9649782e+25 -2.1730161e+25  5.8238054e+24]]

四、解決梯度消失和梯度爆炸的方法

  • 梯度裁剪(Gradient Clipping):限制梯度的大小,防止梯度爆炸。
  • 使用恰當的激活函數:如 ReLU 可以緩解梯度消失問題。
  • 參數初始化:使用合適的參數初始化方法,如 Xavier 或 He 初始化。
  • 批歸一化(Batch Normalization):通過規范化每層輸入,有助于緩解梯度消失和梯度爆炸問題。
  • 殘差連接(Residual Connections):在深層網絡中使用殘差連接有助于減輕梯度消失問題。

五、模型參數初始化

解決(或至少減輕)上述問題(梯度消失、梯度爆炸)的一種方法是進行參數初始化, 優化期間的注意和適當的正則化也可以進一步提高穩定性。

選擇適當的參數初始化方法取決于網絡的結構、激活函數的選擇以及具體任務的要求。良好的參數初始化可以幫助加速模型的收斂速度,提高模型的性能,并有助于避免梯度消失和梯度爆炸等問題。

1.默認初始化

使用正態分布來初始化權重值。如果不指定初始化方法, 框架將使用默認的隨機初始化方法,對于中等難度的問題,這種方法通常很有效。

2.Xavier初始化

Xavier初始化(Xavier Initialization):也稱為Glorot初始化,根據輸入和輸出的神經元數量來初始化參數。這種方法旨在使每一層的激活值保持在一個合理的范圍內,有助于避免梯度消失和梯度爆炸問題。

3.He初始化(He Initialization)

與Xavier初始化類似,但是在計算方差時只考慮了輸入神經元的數量,適用于使用ReLU激活函數的網絡。

4.正交初始化(Orthogonal Initialization)

通過生成一個正交矩陣來初始化權重,有助于避免梯度消失和梯度爆炸問題。

5.自適應方法(Adaptive Methods)

如自適應矩估計(Adagrad)、RMSProp、Adam等優化算法,這些算法在訓練過程中會自動調整學習率,有助于更好地初始化參數。

6.其它

深度學習框架通常實現十幾種不同的啟發式方法。 此外,參數初始化一直是深度學習基礎研究的熱點領域。 其中包括專門用于參數綁定(共享)、超分辨率、序列模型和其他情況的啟發式算法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712484.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712484.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712484.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

帶你快速初步了解Python列表

1.列表 列表主要是用來存儲多個數據,是有序的集合 2.創建列表 """ 語法:變量名 [數據1,數據2,數據3......] 注意:列表中的數據類型可以是各種不同的數據類型 """ 創建空列表 list1 [] print(list1) …

Gitlab: 私有化部署

目錄 1. 說明 2. 資源要求 3. 安裝 4. 配置實踐 4.1 服務器 4.2 人員與項目 4.2 部署準備 4.2.1 訪問變量及用戶賬號設置 4.2.2 Runner設置 4.2.3 要點 5. 應用項目 CI/CD 6. 參考 1. 說明 gitlab是一個強大且免費的代碼管理/部署工具,能統一集成代碼倉…

AngularJS入門

1. AngularJS簡介 AngularJS是一個JavaScript框架,用js編寫的庫 <script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script> <!-- 放在<body> 元素的底部。提高網頁加載速度 -->1.1. AngularJS 擴展了 HTML …

Freesia項目目錄結構

目錄結構 前端目錄&#xff1a; &#xff08;目錄結構來自layui-vue-admin&#xff09; src文件下 api&#xff08;前端請求后端服務的路由&#xff09;assert&#xff08;一些內置或必要的資源文件&#xff09;layouts&#xff08;全局框架樣式組件&#xff09;router&…

Unity(第十九部)射線

在Unity中&#xff0c;射線檢測通常用于碰撞檢測&#xff0c;比如&#xff1a;在游戲中&#xff0c;開槍射擊時&#xff0c;需要判斷擊中的物體、子彈擊中的位置&#xff1b;用鼠標來控制物體的移動&#xff1b;用鼠標拾取某個物體。 射線&#xff0c;顧名思義&#xff0c;在數…

【轉載】深度學習筆記——詳解損失函數

原文鏈接: https://blog.csdn.net/weixin_53765658/article/details/136360033 CSDN賬號: Purepisces github賬號: purepisces 希望大家可以Star Machine Learning Blog https://github.com/purepisces/Wenqing-Machine_Learning_Blog 損失函數 根據您使用的神經網絡類型和數…

第四十七回 一丈青單捉王矮虎 宋公明二打祝家莊-強大而靈活的python裝飾器

四面全是埋伏&#xff0c;宋江和眾人一直繞圈跑不出去。正在慌亂之時&#xff0c;石秀及時趕到&#xff0c;教大家碰到白楊樹就轉彎走。走了一段時間&#xff0c;發現圍的人越來越多&#xff0c;原來祝家莊以燈籠指揮號令。花榮一箭射下來紅燈龍&#xff0c;伏兵自己就亂起來了…

Northwestern University-844計算機科學與技術/軟件工程-復試注意事項【考研復習】

本文提到的西北大學是位于密歇根湖泊畔的西北大學。西北大學&#xff08;英語&#xff1a;Northwestern University&#xff0c;簡稱&#xff1a;NU&#xff09;是美國的一所著名私立研究型大學。它由九人于1851年創立&#xff0c;目標是建立一所為西北領地地區的人服務的大學。…

【力扣白嫖日記】550.游戲玩法分析IV

前言 練習sql語句&#xff0c;所有題目來自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免費數據庫練習題。 今日題目&#xff1a; 550.游戲玩法分析IV 表&#xff1a;Activity 列名類型player_idintdevice_idintevent_datedategames_played…

從 iOS 設備恢復數據的 20 個iOS 數據恢復工具

作為 iPhone、iPad 或 iPod 用戶&#xff0c;您可能普遍擔心自己可能會丟失存儲在珍貴 iOS 設備中的所有寶貴數據。數據丟失的原因多種多樣&#xff0c;這里列出了一些常見原因&#xff1a; 1. iOS 軟件更新 2. 恢復出廠設置 3. 越獄 4. 誤操作刪除數據 5. iOS 設備崩潰 …

C++筆記(五)--- 虛函數(virtual)

目錄 虛函數介紹 虛函數、覆蓋和重載區別 虛函數介紹 C的虛函數是多態性的表現 1.構造函數不能為虛函數2.子類繼承時虛函數仍為虛函數3.虛函數類外實現時&#xff0c;不需要加virtual4.有虛函數的類&#xff0c;析構函數一定要寫成虛函數&#xff08;否則可能會造成內存泄漏&…

【代碼隨想錄python筆記整理】第十六課 · 出現頻率最高的字母

前言:本筆記僅僅只是對內容的整理和自行消化,并不是完整內容,如有侵權,聯系立刪。 一、哈希表初步 在之前的學習中,我們使用數組、字符串、鏈表等等,假如需要找到某個節點,則都要從頭開始,逐一比較,直到找到為止。為了能夠直接通過要查找的記錄找到其存儲位置,我們選…

設備像素、css像素、設備獨立像素、dpr、ppi 之間的區別

設備像素、CSS 像素、設備獨立像素 (DIP)、設備像素比 (DPR) 和每英寸像素密度 (PPI) 是與屏幕分辨率和顯示質量相關的概念。它們之間的區別如下&#xff1a; 設備像素&#xff1a;設備像素是物理屏幕上的最小可見單元&#xff0c;用于實際渲染圖像或文本。它表示硬件像素點的數…

、JMETER與它的組件們

os進程取樣器 這個取樣器可以讓jmeter直接調用python寫的測試數據 這樣就可以調用python寫的測試數據給到jmeter進行調用 注意&#xff1a;1建議python返回轉json格式dumps一下&#xff1b;2py文件中需要把結果打印出來&#xff0c;可以不用函數直接編寫 傳到jmeter之后可以用…

你真的了解C語言中的【柔性數組】嗎~

柔性數組 1. 什么是柔性數組2. 柔性數組的特點3. 柔性數組的使用4. 柔性數組的優勢 1. 什么是柔性數組 也許你從來沒有聽說過柔性數組這個概念&#xff0c;但是它確實是存在的。 C99中&#xff0c;結構體中的最后?個元素允許是未知大小的數組&#xff0c;這就叫做柔性數組成員…

MyBatis 學習(五)之 高級映射

目錄 1 association 和 collection 介紹 2 案例分析 3 一對一關聯和一對多關聯 4 參考文檔 1 association 和 collection 介紹 在之前的 SQL 映射文件中提及了 resultMap 元素的 association 和 collection 標簽&#xff0c;這兩個標簽是用來關聯查詢的&#xff0c;它們的屬…

算法--時空復雜度分析以及各個數據量對應的可使用的算法(C++;1s內)

這里寫目錄標題 由數據范圍反推算法時間復雜度以及算法內容分析時間復雜度看循環實例1實例2 固定時間復雜度快排和歸并排序二分高精度算法雙指針算法單鏈表插入刪除操作棧和隊列的操作單調棧和單調隊列KMPTire并查集堆哈希表BFS、DFS圖的深度優先、寬度優先遍歷dijkstra算法樸素…

題目 1037: [編程入門]宏定義的練習

問題描述&#xff1a; 輸入兩個整數&#xff0c;求他們相除的余數。用帶參的宏來實現&#xff0c;編程序。 樣例輸入&#xff1a; 3 2 樣例輸出&#xff1a; 1 代碼分析&#xff1a; 這段代碼實現了輸入兩個整數&#xff0c;然后使用帶參數的宏計算它們相除的余數&…

「MySQL」深入理解MySQL中常用的SQL函數

「MySQL」深入理解MySQL中常用的SQL函數 窗口函數參考文章1. COALESCE 函數2. USING 函數3. LEAD 函數4. interval 函數5. INSTR 函數6. substring_index 函數7. LENGTH 函數和 CHAR_LENGTH 函數 窗口函數參考文章 SQL窗口函數 1. COALESCE 函數 COALESCE 函數的作用是從一…

瑞_Redis_Redis的Java客戶端

文章目錄 1 Redis的Java客戶端1.1 Jedis快速入門1.1.1 入門案例1.1.1.1 項目構建1.1.1.2 引入依賴1.1.1.3 建立連接1.1.1.4 釋放資源1.1.1.5 測試1.1.1.6 完整測試類代碼 1.1.2 Jedis連接池1.1.2.1 連接池工具類1.1.2.2 改造原始代碼 &#x1f64a; 前言&#xff1a;本文章為瑞…