動手學深度學習11.9. Adadelta-筆記練習(PyTorch)

以下內容為結合李沐老師的課程和教材補充的學習筆記,以及對課后練習的一些思考,自留回顧,也供同學之人交流參考。

本節課程地址:72 優化算法【動手學深度學習v2】_嗶哩嗶哩_bilibili

本節教材地址:11.9. Adadelta — 動手學深度學習 2.0.0 documentation

本節開源代碼:...>d2l-zh>pytorch>chapter_optimization>adadelta.ipynb


Adadelta

Adadelta是AdaGrad的另一種變體(?11.7節?), 主要區別在于前者減少了學習率適應坐標的數量。 此外,廣義上Adadelta被稱為沒有學習率,因為它使用變化量本身作為未來變化的校準。 Adadelta算法是在 (Zeiler, 2012)中提出的。

Adadelta算法

簡而言之,Adadelta使用兩個狀態變量,?\mathbf{s}_t?用于存儲梯度二階導數的泄露平均值,?\Delta\mathbf{x}_t?用于存儲模型本身中參數變化二階導數的泄露平均值。請注意,為了與其他出版物和實現的兼容性,我們使用作者的原始符號和命名(沒有其它真正理由讓大家使用不同的希臘變量來表示在動量法、AdaGrad、RMSProp和Adadelta中用于相同用途的參數)。

以下是Adadelta的技術細節。鑒于參數du jour是?\rho?,我們獲得了與?11.8節?類似的以下泄漏更新:

\begin{aligned} \mathbf{s}_t & = \rho \mathbf{s}_{t-1} + (1 - \rho) \mathbf{g}_t^2. \end{aligned}

與?11.8節?的區別在于,我們使用重新縮放的梯度?\mathbf{g}_t'?執行更新,即

\begin{aligned} \mathbf{x}_t & = \mathbf{x}_{t-1} - \mathbf{g}_t'. \\ \end{aligned}

那么,調整后的梯度?\mathbf{g}_t'?是什么?我們可以按如下方式計算它:

\begin{aligned} \mathbf{g}_t' & = \frac{\sqrt{\Delta\mathbf{x}_{t-1} + \epsilon}}{\sqrt{?{\mathbf{s}_t + \epsilon}}} \odot \mathbf{g}_t, \\ \end{aligned}

其中?Δxt?1?是重新縮放梯度的平方??\mathbf{g}_t'?的泄漏平均值。我們將?\Delta \mathbf{x}_{0}?初始化為0,然后在每個步驟中使用?\mathbf{g}_t'?更新它,即

\begin{aligned} \Delta \mathbf{x}_t & = \rho \Delta\mathbf{x}_{t-1} + (1 - \rho) {\mathbf{g}_t'}^2, \end{aligned}

和?\epsilon?(例如?10^{-5}?這樣的小值)是為了保持數字穩定性而加入的。

代碼實現

Adadelta需要為每個變量維護兩個狀態變量,即?\mathbf{s}_t?和?\Delta\mathbf{x}_t?。這將產生以下實現。

%matplotlib inline
import torch
from d2l import torch as d2ldef init_adadelta_states(feature_dim):s_w, s_b = torch.zeros((feature_dim, 1)), torch.zeros(1)delta_w, delta_b = torch.zeros((feature_dim, 1)), torch.zeros(1)return ((s_w, delta_w), (s_b, delta_b))def adadelta(params, states, hyperparams):rho, eps = hyperparams['rho'], 1e-5for p, (s, delta) in zip(params, states):with torch.no_grad():# In-place updates via [:] 原地更新,不會干擾計算圖的結構s[:] = rho * s + (1 - rho) * torch.square(p.grad)g = (torch.sqrt(delta + eps) / torch.sqrt(s + eps)) * p.gradp[:] -= gdelta[:] = rho * delta + (1 - rho) * g * gp.grad.data.zero_()

對于每次參數更新,選擇?\rho = 0.9?相當于10個半衰期。由此我們得到:

data_iter, feature_dim = d2l.get_data_ch11(batch_size=10)
d2l.train_ch11(adadelta, init_adadelta_states(feature_dim),{'rho': 0.9}, data_iter, feature_dim)

輸出結果:
loss: 0.244, 0.031 sec/epoch

為了簡潔實現,我們只需使用高級API中的Adadelta算法。

trainer = torch.optim.Adadelta
d2l.train_concise_ch11(trainer, {'rho': 0.9}, data_iter)

輸出結果:
loss: 0.243, 0.011 sec/epoch

小結

  • Adadelta沒有學習率參數。相反,它使用參數本身的變化率來調整學習率。
  • Adadelta需要兩個狀態變量來存儲梯度的二階導數和參數的變化。
  • Adadelta使用泄漏的平均值來保持對適當統計數據的運行估計。

練習

  1. 調整?\rho?的值,會發生什么?
    解:
    類似于RMSProp的?\gamma?,?\rho?之于Adadelta也是一個介于 0 和 1 之間的值,用于平衡歷史信息和當前信息的權重。
    當?\rho?接近于1時,模型會更多地依賴于過去的梯度和更新量信息;
    當?\rho?接近于0時,模型會更多地依賴于當前的梯度和更新量信息。
  2. 展示如何在不使用?\mathbf{g}_t'?的情況下實現算法。為什么這是個好主意?
    解:
    \mathbf{g}_t'?是一個顯式的中間變量,不使用?\mathbf{g}_t',即直接在更新變量時進行計算和累積量時進行計算,這樣做可以減少內存占用,但實際計算量是重復的,所以每epoch的計算用時增加了。
def adadelta_no_g(params, states, hyperparams):rho, eps = hyperparams['rho'], 1e-5for p, (s, delta) in zip(params, states):with torch.no_grad():            s[:] = rho * s + (1 - rho) * p.grad ** 2p[:] -= (torch.sqrt(delta + eps) / torch.sqrt(s + eps)) * p.graddelta[:] = rho * delta + (1 - rho) * ((torch.sqrt(delta + eps) / torch.sqrt(s + eps)) * p.grad) ** 2p.grad.data.zero_()
d2l.train_ch11(adadelta_no_g, init_adadelta_states(feature_dim),{'rho': 0.9}, data_iter, feature_dim)

輸出結果:
loss: 0.243, 0.016 sec/epoch

3. Adadelta真的是學習率為0嗎?能找到Adadelta無法解決的優化問題嗎?
解:
不是,Adadelta 是一種自適應學習率優化算法,它的學習率并不是固定的也不是為0,而是動態調整的,具體為:?\eta = \frac{\sqrt{\Delta\mathbf{x}_{t-1} + \epsilon}}{\sqrt{?{\mathbf{s}_t + \epsilon}}}

Adadelta 在處理非凸優化問題時可能會遇到困難。非凸優化問題的損失函數可能有多個局部最小值,Adadelta 可能會陷入局部最小值而無法找到全局最小值。
在某些情況下,梯度可能非常稀疏,即大部分梯度值為零,這時,Adadelta 的累積梯度平方?st?可能會變得非常小,導致學習率變得非常大。這可能會導致參數更新過大,從而破壞訓練過程。例如,在訓練稀疏數據集(如某些自然語言處理任務)時,Adadelta 可能會表現不佳。

4. 將Adadelta的收斂行為與AdaGrad和RMSProp進行比較。
解:

算法AdaGradRMSPropAdadelta
收斂速度在訓練初期,AdaGrad 的收斂速度較快,因為它能夠快速調整學習率以適應稀疏梯度。在訓練初期,RMSProp 的收斂速度相對較快,因為它能夠更好地適應動態變化的梯度。在訓練初期,Adadelta 的收斂速度可能較慢,因為它依賴于歷史信息來調整學習率。
后期表現由于累積梯度平方不斷增大,學習率逐漸減小,最終可能趨近于零,導致訓練停止。由于引入了衰減率 $\gamma$,RMSProp 能夠保持相對穩定的學習率,避免了學習率趨近于零的問題。Adadelta 能夠自適應地調整學習率,避免了手動設置全局學習率的問題。
適用場景適用于稀疏梯度問題,如自然語言處理中的詞嵌入。適用于非平穩優化問題,如深度神經網絡的訓練。適用于非平穩優化問題,尤其是需要長期依賴歷史信息的任務。

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

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

相關文章

Android Audio基礎(13)——audiomixer

在 Android 平臺上,音頻混合器 AudioMixer 主要用在 AudioFlinger 里,將多路音頻源數據混音(包括混音、音量處理、重采樣及處理聲道等)。位于 framework 的音頻處理模庫 libaudioprocessing(frameworks/av/media/libau…

【React】使用Swiper報錯`Swiper` needs at least one child

問題 聊天頁面的表情面板&#xff0c;滑動效果使用了ant design mobile的Swiper。 原代碼中&#xff0c;Swiper 組件在 isShow 為 false 時渲染的是 <></>&#xff08;空元素&#xff09;&#xff0c;控制臺警告Swiper needs at least one child&#xff0c;Swip…

Matlab教程001:軟件介紹和界面使用

1.1 軟件介紹 1.1.1 Matlab的介紹 MATLAB&#xff08;MATrix LABoratory&#xff09;是一款由 MathWorks 公司開發的高級編程語言和交互式環境&#xff0c;廣泛用于 科學計算、數據分析、機器學習、工程建模、仿真和信號處理 等領域。 1.1.2 主要應用領域 數據分析與可視化…

藍橋杯算法實戰分享:算法進階之路與實戰技巧

引言 藍橋杯作為國內極具影響力的程序設計競賽&#xff0c;為眾多編程愛好者和專業人才提供了展示自我的舞臺。參與藍橋杯不僅能檢驗自身編程水平&#xff0c;還能拓寬技術視野&#xff0c;為未來職業發展積累寶貴經驗。本文將結合歷年真題與參賽經驗&#xff0c;全面分享藍橋…

Android Compose 層疊布局(ZStack、Surface)源碼深度剖析(十三)

Android Compose 層疊布局&#xff08;ZStack、Surface&#xff09;源碼深度剖析 一、引言 在 Android 應用開發領域&#xff0c;用戶界面&#xff08;UI&#xff09;的設計與實現一直是至關重要的環節。隨著技術的不斷演進&#xff0c;Android Compose 作為一種全新的聲明式…

MongoDB 面試備戰指南

MongoDB 面試備戰指南 一、基礎概念 1. MongoDB是什么類型的數據庫&#xff1f;和關系型數據庫有什么區別&#xff1f; 答案&#xff1a; MongoDB是文檔型NoSQL數據庫&#xff0c;核心區別&#xff1a; 數據模型&#xff1a;存儲JSON-like文檔&#xff08;動態schema&#xf…

毫米波雷達標定(2)

1. 前言 前面文章中介紹了產線上毫米波雷達的標定原理和流程,這篇文章則主要介紹其在線標定方法。相對于產線標定,在線標定具備使用自然場景而不是依賴特定標靶的優點,但因此其標定精度會相對差一點。在線標定一般應用于售出產品的維護場景,如果其標定結果精度可以滿足使用…

Linux fority source和__builtin_xxx

這段代碼是用于啟用和配置 GCC/Clang 的 Fortify Source 安全機制的預處理指令。Fortify Source 主要用于在編譯時增強對緩沖區溢出等內存安全問題的檢查。以下是對每一部分的詳細解釋&#xff1a; 1. 最外層條件編譯 # if CONFIG_FORTIFY_SOURCE > 0目的&#xff1a;檢查…

SQL GROUP BY 自定義排序規則

在 SQL 中&#xff0c;GROUP BY 子句用于將結果集按一個或多個列進行分組。默認情況下&#xff0c;GROUP BY 會按照列的自然順序&#xff08;如字母順序或數字順序&#xff09;進行排序。如果你需要按照自定義的排序規則對結果進行分組&#xff0c;可以使用 ORDER BY 子句結合 …

語言模型理論基礎-持續更新-思路清晰

1.預訓練 相似的任務A、B&#xff0c;任務A已經用大數據完成了訓練&#xff0c;得到模型A。 我們利用-特征提取模型的-“淺層參數通用”的特性&#xff0c;使用模型A的淺層參數&#xff0c;其他參數再通過任務B去訓練&#xff08;微調&#xff09;。 2.統計語言模型 通過條件…

ResNet與注意力機制:深度學習中的強強聯合

引言 在深度學習領域&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;一直是圖像處理任務的主流架構。然而&#xff0c;隨著網絡深度的增加&#xff0c;梯度消失和梯度爆炸問題逐漸顯現&#xff0c;限制了網絡的性能。為了解決這一問題&#xff0c;ResNet&#xff08;殘差…

【C++】——C++11新特性

目錄 前言 1.初始化列表 2.std::initializer_list 3.auto 4.decltype 5.nullptr 6.左值引用和右值引用 6.1右值引用的真面目 6.2左值引用和右值引用比較 6.3右值引用的意義 6.3.1移動構造 6.4萬能引用 6.5完美轉發——forward 結語 前言 C&#xff0c;這門在系統…

【C++網絡編程】第5篇:UDP與廣播通信

一、UDP協議核心特性 1. UDP vs TCP ?特性 ?UDP?TCP連接方式無連接面向連接&#xff08;三次握手&#xff09;可靠性不保證數據到達或順序可靠傳輸&#xff08;超時重傳、順序控制&#xff09;傳輸效率低延遲&#xff0c;高吞吐相對較低&#xff08;因握手和確認機制&…

MOSN(Modular Open Smart Network)是一款主要使用 Go 語言開發的云原生網絡代理平臺

前言 大家好&#xff0c;我是老馬。 sofastack 其實出來很久了&#xff0c;第一次應該是在 2022 年左右開始關注&#xff0c;但是一直沒有深入研究。 最近想學習一下 SOFA 對于生態的設計和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概覽 SOFABoot-01-螞蟻金服開源的 s…

微信小程序日常開發問題整理

微信小程序日常開發問題整理 1 切換渲染模式1.1 WebView 的鏈接在模擬器可以打開&#xff0c;手機上無法打開。 1 切換渲染模式 1.1 WebView 的鏈接在模擬器可以打開&#xff0c;手機上無法打開。 在 app.json 中看到如下配置項&#xff0c;那么當前項目就是 keyline 渲染模式…

【Altium Designer】銅皮編輯

一、動態銅皮與靜態銅皮的區分與切換 動態銅皮&#xff08;活銅&#xff09;&#xff1a; 通過快捷鍵 PG 創建&#xff0c;支持自動避讓其他網絡對象&#xff0c;常用于大面積鋪銅&#xff08;如GND或電源網絡&#xff09;。修改動態銅皮后&#xff0c;需通過 Tools → Polygo…

Java「Deque」 方法詳解:從入門到實戰

Java Deque 各種方法解析&#xff1a;從入門到實戰 在 Java 編程中&#xff0c;Deque&#xff08;雙端隊列&#xff09;是一個功能強大的數據結構&#xff0c;允許開發者從隊列的兩端高效地添加、刪除和檢查元素。作為 java.util 包中的一部分&#xff0c;Deque 接口繼承自 Qu…

ffmpeg+QOpenGLWidget顯示視頻

?一個基于 ?FFmpeg 4.x? 和 QOpenGLWidget的簡單視頻播放器代碼示例&#xff0c;實現視頻解碼和渲染到 Qt 窗口的功能。 1&#xff09;ffmpeg庫界面&#xff0c;視頻解碼支持軟解和硬解方式。 硬解后&#xff0c;硬件解碼完成需要將數據從GPU復制到CPU。優先采用av_hwf…

深入解析嵌入式內核:從架構到實踐

一、嵌入式內核概述 嵌入式內核是嵌入式操作系統的核心組件&#xff0c;負責管理硬件資源、調度任務、處理中斷等關鍵功能。其核心目標是在資源受限的環境中提供高效、實時的控制能力。與通用操作系統不同&#xff0c;嵌入式內核通常具有高度可裁剪性、實時性和可靠性&#xff…

20250324-使用 `nltk` 的 `sent_tokenize`, `word_tokenize、WordNetLemmatizer` 方法時報錯

解決使用 nltk 的 sent_tokenize, word_tokenize、WordNetLemmatizer 方法時報錯問題 第 2 節的手動方法的法1可解決大部分問題&#xff0c;可首先嘗試章節 2 的方法 1. nltk.download(‘punkt_tab’) LookupError: *******************************************************…