詳解梯度消失和梯度爆炸(反向傳播)?

什么是梯度消失?

梯度消失(Gradient Vanishing)?是指在訓練神經網絡時,反向傳播過程中計算得到的梯度(用于更新參數的重要信息)隨著網絡層數的增加而急劇減小,甚至趨近于零的現象。這會導致深層網絡中靠近輸入層的參數難以被有效更新,模型訓練困難,甚至無法收斂。

梯度消失的核心原因

梯度消失的本質與反向傳播的計算機制激活函數的特性密切相關:

  1. 反向傳播的鏈式法則 神經網絡的參數更新依賴反向傳播算法,而梯度的計算遵循鏈式法則。對于一個深層網絡,某一層參數的梯度需要通過其后續所有層的梯度相乘得到。例如,對于一個 3 層網絡(輸入層→隱藏層 1→隱藏層 2→輸出層),隱藏層 1 的參數梯度需要乘以隱藏層 2 的梯度和輸出層的梯度。 如果這些梯度的乘積小于 1(且層數較多),多次相乘后會導致梯度趨近于 0,即: 梯度1\times梯度2\times梯度3 \times\cdots 梯度n 當?n?很大且每個梯度小于 1 時,結果會 “消失”。

  2. 激活函數的選擇 早期神經網絡常用?sigmoid 或 tanh 等飽和激活函數,其導數特性會加劇梯度消失。若網絡中多層使用這類激活函數,反向傳播時梯度會被反復乘以小于 1 的值,導致深層梯度快速衰減。

梯度消失的危害

  • 深層參數難以更新:靠近輸入層的參數梯度幾乎為 0,無法通過訓練優化,導致這些層的參數近似 “凍結”,失去學習能力。
  • 模型欠擬合:深層網絡的優勢(捕捉復雜特征)無法發揮,模型可能退化為淺層網絡的效果。
  • 訓練不穩定:梯度過小會導致參數更新緩慢,模型收斂速度極慢,甚至停滯在較差的局部最優解。

梯度消失的解決方法

為緩解梯度消失問題,研究者提出了多種方案:

  1. 使用非飽和激活函數 用?ReLU(Rectified Linear Unit)?及其變體(如 Leaky ReLU、ELU)替代 sigmoid/tanh。ReLU 的導數在正區間為 1,避免了梯度衰減(但需注意 “死亡 ReLU” 問題)。

  2. 權重初始化策略 合理的參數初始化可減少梯度消失的概率,例如:

    • Xavier 初始化:適用于 tanh/sigmoid 等激活函數,使各層輸入和輸出的方差一致,避免梯度過度衰減或爆炸。
    • He 初始化:適用于 ReLU,考慮了 ReLU 會將一半輸入置零的特性,進一步平衡梯度。
  3. 批量歸一化(Batch Normalization) 通過對每一層的輸入進行標準化(調整均值和方差),使激活值分布更穩定,避免進入激活函數的飽和區域,從而維持梯度大小。

  4. 殘差網絡(ResNet) 引入 “跳躍連接”(Skip Connection),讓梯度可以直接從深層傳遞到淺層,繞過中間層的鏈式乘法,有效緩解深層網絡的梯度消失。

  5. 梯度裁剪(Gradient Clipping) 雖然主要用于解決梯度爆炸,但適度裁剪也能避免梯度在反向傳播中因過度衰減而消失(通過限制梯度的范圍)。

示例:sigmoid 激活函數導致的梯度消失

????????假設一個深層網絡使用 sigmoid 激活函數,其導數為:?

\sigma {}'\left ( x \right )= \sigma \left ( x \right )\cdot (1-\sigma \left ( x \right )) \leq 0.25

????????若網絡有 10 層,每層梯度均為 0.25,則輸入層的梯度為 0.25^{10} \approx 10^{-6},幾乎為 0,導致參數無法更新。

什么是梯度爆炸?

梯度爆炸(Gradient Explosion)是深度學習中一種常見的優化問題,指在模型訓練過程中,梯度(損失函數對參數的偏導數)的數值變得異常巨大,導致模型參數更新幅度過大,甚至超出合理范圍,最終使模型無法收斂或性能嚴重下降。

梯度爆炸的本質與表現

在反向傳播算法中,模型參數的更新依賴于梯度的計算。對于深層神經網絡,梯度需要從輸出層反向傳播到輸入層,過程中可能涉及多個矩陣乘法(或鏈式求導)。如果梯度在傳播過程中被不斷放大(例如,每次乘法都乘以一個大于 1 的數值),就會導致梯度數值呈指數級增長,最終超出計算機可表示的數值范圍(如浮點數溢出)。

常見表現
  • 模型參數值急劇增大,甚至變成NaN(非數值)或inf(無窮大)。
  • 損失函數值劇烈波動,無法穩定下降,甚至突然飆升。
  • 模型輸出結果異常(如數值極大),預測毫無意義。
  • 訓練過程早期就出現收斂失敗(如損失為NaN)。

梯度爆炸的典型原因

  1. 深層網絡的鏈式求導
    深層網絡中,梯度通過多層反向傳播時,若每一層的權重矩陣的譜范數(最大特征值)大于 1,梯度會隨網絡深度增加而呈指數級放大。例如,對于一個 10 層網絡,若每層梯度放大 1.1 倍,最終梯度將是初始值的1.1^10 ≈ 2.6倍;若每層放大 2 倍,10 層后將達到2^10 = 1024倍,極易爆炸。

  2. 權重初始化不當
    若初始權重值設置過大,會導致前向傳播的輸出值過大,反向傳播時梯度也會隨之放大,形成惡性循環。

  3. 激活函數選擇
    使用某些激活函數(如sigmoid在輸入值過大時導數接近 0,但早期未標準化的輸入可能導致中間層輸出過大)或未對輸入數據進行標準化處理,可能間接加劇梯度放大。

  4. 批量歸一化(Batch Normalization)缺失
    若未使用批量歸一化穩定各層輸入的分布,深層網絡中每層的輸入值可能隨訓練不斷放大,進一步導致梯度爆炸。

梯度爆炸的危害

  • 模型無法收斂:參數更新幅度過大,導致損失函數在最小值附近劇烈震蕩,甚至偏離最優解。
  • 數值不穩定:梯度或參數值超出浮點數表示范圍,出現NaNinf,使訓練中斷。
  • 泛化能力差:即使模型勉強收斂,參數值過大也可能導致過擬合,或輸出對輸入變化過于敏感(魯棒性差)。

解決梯度爆炸的常用方法

  1. 權重初始化
    采用合適的初始化方法(如 Xavier 初始化、He 初始化),使各層輸入和梯度的方差保持在合理范圍,避免初始權重過大。

  2. 梯度裁剪(Gradient Clipping)
    設定梯度的閾值,當梯度超過閾值時,將其縮放至閾值范圍內(如按范數裁剪),強制限制梯度的最大值。

  3. 批量歸一化(Batch Normalization)
    對每層的輸入進行標準化(使均值為 0、方差為 1),穩定各層輸入分布,減少梯度波動。

  4. 使用殘差連接(Residual Connections)
    在深層網絡(如 ResNet)中加入跳躍連接,使梯度可直接從后層傳播到前層,避免梯度被多層乘法放大。

  5. 降低學習率
    較小的學習率可減少參數更新幅度,緩解梯度爆炸導致的參數劇烈波動。

  6. 選擇合適的激活函數
    避免使用易導致輸出值過大的激活函數,例如用 ReLU 及其變體(如 Leaky ReLU)替代 sigmoid 或 tanh(在極端值處梯度更穩定)。

梯度爆炸與梯度消失的關系??

對比維度梯度消失(Gradient Vanishing)梯度爆炸(Gradient Exploding)
定義反向傳播時,梯度隨著網絡層數增加逐漸減小至接近 0,導致深層參數幾乎無法更新。反向傳播時,梯度隨著網絡層數增加急劇增大,導致深層參數更新幅度過大,模型不穩定。
核心成因激活函數選擇不當(如 sigmoid、tanh),其導數范圍較小(sigmoid 導數最大 0.25),多層乘積后梯度趨近于 0。權重初始化過大,或激活函數導數大于 1(如 ReLU 在正區間導數為 1,但極端情況下權重累積可能導致梯度劇增),多層乘積后梯度呈指數級增長。
模型表現- 模型收斂緩慢或無法收斂
- 深層網絡學習不到有效特征,性能差
- 訓練后期 loss 下降停滯
- 模型參數劇烈波動,loss 震蕩甚至發散
- 梯度值過大導致數值溢出(如出現infnan
- 模型權重值異常大,輸出結果不穩定
常見場景- 深層神經網絡(如早期的多層感知機)
- 使用 sigmoid/tanh 作為激活函數的網絡
- 循環神經網絡(RNN/LSTM/GRU)處理長序列時
- 權重初始化不合理的深層網絡
- 未使用梯度裁剪的復雜網絡
解決方法共性1. 合理初始化權重(如 Xavier 初始化、He 初始化)
2. 使用批量歸一化(Batch Normalization)
3. 采用殘差連接(Residual Connection)
4. 避免過度深的網絡結構
1. 合理初始化權重(如 Xavier 初始化、He 初始化)
2. 使用批量歸一化(Batch Normalization)
3. 采用殘差連接(Residual Connection)
4. 避免過度深的網絡結構
針對性解決方法1. 替換激活函數為 ReLU 及其變體(如 Leaky ReLU、Swish)
2. 使用 LSTM/GRU 替代傳統 RNN(針對序列模型)
1. 梯度裁剪(Gradient Clipping):限制梯度的最大閾值
2. 權重正則化(如 L1/L2 正則化):約束權重大小
本質聯系兩者均為深層神經網絡反向傳播中梯度異常的問題,根源是鏈式法則下梯度的累積效應,僅在梯度變化方向上相反(一個趨近于 0,一個趨近于無窮)。兩者均依賴網絡深度放大梯度問題:層數越多,梯度消失或爆炸的可能性越高;且均會導致模型訓練困難,無法有效學習特征。

梯度消失和梯度爆炸是深度網絡中常見的問題。在參數初始化時需要非常小心,以確保梯度和參數可以得到很好的控制。

完整代碼

"""
文件名: 4.8  數值穩定性和模型初始化
作者: 墨塵
日期: 2025/7/12
項目名: dl_env
備注: 
"""import torch
from torch import nn
from d2l import torch as d2l
# 手動顯示圖像(關鍵)
import matplotlib.pyplot as plt
import matplotlib.text as text  # 新增:用于修改文本繪制# -------------------------- 核心解決方案:替換減號 --------------------------
# 定義替換函數:將Unicode減號U+2212替換為普通減號-
def replace_minus(s):if isinstance(s, str):return s.replace('\u2212', '-')return s# 安全重寫Text類的set_text方法,避免super()錯誤
original_set_text = text.Text.set_text  # 保存原始方法
def new_set_text(self, s):s = replace_minus(s)  # 替換減號return original_set_text(self, s)  # 調用原始方法
text.Text.set_text = new_set_text  # 應用新方法
# -------------------------------------------------------------------------# -------------------------- 字體配置(關鍵修改)--------------------------
# 解決中文顯示和 Unicode 減號(U+2212)顯示問題
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams["text.usetex"] = True  # 使用Latex渲染
plt.rcParams["axes.unicode_minus"] = True  # 正確顯示負號
plt.rcParams["mathtext.fontset"] = "cm"    # 確保數學符號(如減號)正常顯示
d2l.plt.rcParams.update(plt.rcParams)      # 讓 d2l 繪圖工具繼承字體配置
# -------------------------------------------------------------------------if __name__ == '__main__':# 1. 生成輸入張量 x,范圍從 -8 到 8,步長 0.1# requires_grad=True 表示需要計算關于 x 的梯度x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)# 2. 計算 sigmoid 函數值 y# sigmoid(x) = 1 / (1 + e^(-x))y = torch.sigmoid(x)# 3. 計算梯度(導數)# y.backward() 需要傳入與 y 形狀相同的張量,表示初始梯度# 這里傳入全 1 張量,表示對每個元素的梯度權重為 1y.backward(torch.ones_like(x))# 4. 繪制 sigmoid 函數曲線和梯度曲線# x.detach().numpy():將 x 轉換為 numpy 數組(繪圖需要)# y.detach().numpy():sigmoid 函數值# x.grad.numpy():sigmoid 導數(梯度)值  # 梯度消失的現象集中體現在梯度(導數)值上d2l.plot(x.detach().numpy(), [y.detach().numpy(), x.grad.numpy()],legend=['sigmoid', 'gradient'], figsize=(4.5, 2.5))# 顯示圖像plt.show(block=True)  # block=True 確保窗口阻塞,直到手動關閉# 梯度爆炸M = torch.normal(0, 1, size=(4, 4))print('一個矩陣 \n', M)for i in range(100):M = torch.mm(M, torch.normal(0, 1, size=(4, 4)))print('乘以100個矩陣后\n', M)

實驗結果?

梯度消失

梯度爆炸

?

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

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

相關文章

端到端自動駕駛:挑戰與前沿

端到端自動駕駛:挑戰與前沿 End-to-End Autonomous Driving: Challenges and Frontiers 自動駕駛研究社區已見證了越來越多采用端到端算法框架的方法的快速增長,這些方法利用原始傳感器輸入生成車輛的運動規劃,而不是專注于諸如檢測和運動預測…

rust cargo 編譯雙架構的庫

這個錯誤表明你的 Rust 工具鏈沒有安裝 aarch64-apple-darwin 目標平臺。以下是完整的解決方案: 解決方案 ??安裝目標平臺?? (必須步驟) rustup target add aarch64-apple-darwin??驗證安裝?? (可選但推薦) rustup target list --installed # 應該能看到 aa…

Apache Shiro 框架詳解

文章目錄一、Shiro 核心功能二、Shiro 架構2.1 三層架構2.2 核心組件(SecurityManager 內部)三、核心流程詳解3.1 認證流程(登錄)流程步驟:認證流程序列圖:3.2 授權流程(權限校驗)流…

【保姆級喂飯教程】Windows下安裝Git Flow

目錄前言一、SourceTree二、Git for Windows (previously MSysGit)1. 下載補丁1.1 getopt.exe1.2 libintl3.dll1.3 libiconv2.dll1.4 安裝補丁2. 安裝Git Flow3. 測試3.1 初始化(Initialize)3.2 設置遠程3.3 創建分支3.4 功能開發3.5 功能提交3.6 推送分…

manifest.json只有源碼視圖沒其他配置

項目場景:提示:這里簡述項目相關背景:有時候我們從git上面拉下代碼,第一次運行時發現,沒運行項,再看manifest.json文件,就只有json文件,沒有其他配置項原因分析:提示&…

數據分析-名詞

一、網頁訪問數據指標1.IP (Internet Protocol)獨立IP 通常采用獨立IP數, 理論上指00:00-24:00內相同IP地址重復訪問只被計算一次。而不同的商業統計工具,縮短去 掉重復統計的時間,也是數據統計放大的一個常用套路。 &…

UDP屬于是一種什么服務器?

UDP是一種傳輸層協議,通常會被應用在計算機網絡中,為企業與用戶提供無連接的數據信息傳輸功能,與TCP協議相比較來說,UDP會更加的簡單但是UDP在可靠性方面沒有一定的保證,屬于是一種基于UDP協議進行通信的服務器。UDP服…

ARM單片機OTA解析(一)

文章目錄一、單片機燒寫程序的幾種方法二、Bootloader如何加載啟動App一、單片機燒寫程序的幾種方法 在線應用編程,由開發者實現Bootloader功能,比如ARM單片機的Code分區中的Flash本是存儲用戶應用程序的區間(上電從此處執行用戶代碼),開發者…

C語言基礎教程--從入門到精通

C語言基礎教程–從入門到精通(總體概括) 接下來會對每一個章節進行詳細的總結與整理,希望對大家有用!大家一起學習! 目錄C語言基礎教程--從入門到精通(總體概括)**接下來會對每一個章節進行詳細…

單細胞分析教程 | (二)標準化、特征選擇、降為、聚類及可視化

在完成質控(QC)后,我們已經過濾掉了低質量細胞、雙細胞和低表達基因,獲得了較為干凈的單細胞數據集單細胞分析教程 | (一)Python單細胞質控全流程。接下來,我們將進行以下關鍵步驟: …

大模型 Agent(智能體)技術簡介

大模型 Agent(智能體)技術 是當前人工智能領域的前沿方向,它賦予大型語言模型(LLM)自主感知、規劃、決策和行動的能力,使其不再局限于“被動應答”,而是能主動完成復雜任務。簡單來說&#xff0…

OneCode 3.0架構深度剖析:工程化模塊管理與自治UI系統的設計與實現

引言 OneCode 3.0作為新一代低代碼開發平臺,其架構設計圍繞"工程模塊化"與"UI自主化"兩大核心目標展開。本文將從底層接口到上層應用,全面解析OneCode 3.0的技術架構,包括核心工廠類、工程管理接口、數據倉庫設計以及動態…

功耗校準數據PowerProfile測試方法建議

場景步驟版本:xxxxA1A2結果(mA)screen,full1.打開飛行模式,滅屏時間最長,其他的基礎功能關2.進入到日歷應用界面3.將亮度設置至最大(4095),待電流穩定后,測試5分鐘,記錄電…

[附源碼+數據庫+畢業論文]基于Spring+MyBatis+MySQL+Maven+vue實現的供電公司安全生產考試管理系統,推薦!

摘 要 使用舊方法對安全生產考試信息進行系統化管理已經不再讓人們信賴了,把現在的網絡信息技術運用在安全生產考試信息的管理上面可以解決許多信息管理上面的難題,比如處理數據時間很長,數據存在錯誤不能及時糾正等問題。 這次開發的供電公…

輸入框過濾選項列表,el-checkbox-group單選

需求:根據輸入的文本動態過濾選項列表,并在下方顯示匹配到的選項。當用戶勾選匹配到的選項時,把該選項的值賦值給輸入框中綁定的值。當用戶取消選擇時,輸入框中的字段可以隨意編輯。組件:el-input、el-checkbox-group、…

身份認證缺陷

Authentication Bypasses審計創建AccountVerificationHelper實例,用于處理賬戶驗證邏輯parseSecQuestions函數的作用是從請求體中遍歷參數名,找到包含secQuestion的參數,將其值存入Map中并返回這里直接把AccountVerificationHelper整個分析一…

火山引擎:字節跳動的技術賦能初解

火山引擎是字節跳動旗下的企業級智能技術服務平臺,于2020年6月正式上線。它通過開放字節跳動在大數據、人工智能、視頻云等領域的核心技術,助力企業實現數字化轉型與業務增長。火山引擎界面核心能力與技術亮點:1.全棧云服務公有云與混合云:提…

VUE 帶有搜索功能的穿梭框(簡單demo)

一、template/ 組件代碼<el-dialog :title"title" :visible.sync"dialogVisible" width"60%" :before-close"handleClose" class"custom-dialog-line" ><div style"text-align: center ; width: 100%; height…

寫個掃雷小游戲

1.test.c&#xff08;測試源文件&#xff09;2.game.c&#xff08;游戲源文件&#xff09;3.頭文件

【Linux庖丁解牛】— system V共享內存!

1. 什么是system VSystem V IPC&#xff08;Interprocess Communication&#xff0c;進程間通信&#xff09;是Unix系統中一種經典的進程間通信機制&#xff0c;由AT&T在System V.2版本中引入&#xff0c;并廣泛應用于Linux等現代操作系統中。它通過三種核心機制實現進程間…