從代碼學習深度強化學習 - Double DQN PyTorch版

文章目錄

  • 前言
  • 理論篇:為什么需要 Double DQN?
  • 代碼實現篇:構建一個 Double DQN 智能體
    • 2.1 項目設置與輔助函數
    • 2.2 環境 (Environment)
    • 2.3 DQN 的核心組件
      • 2.3.1 Replay Buffer (經驗回放池)
      • 2.3.2 Q-Network (Q網絡)
      • 2.3.3 The Double DQN Agent (Double DQN 智能體)
  • 訓練與結果
    • 3.1 訓練主循環
    • 3.2 超參數設置與執行
    • 3.3 結果分析
  • 總結


前言

歡迎來到“從代碼學習深度強化學習”系列!在強化學習(RL)的世界里,Deep Q-Network (DQN) 算法無疑是一個里程碑,它巧妙地將深度學習的強大感知能力與Q-Learning的決策能力相結合,解決了許多之前無法攻克的復雜問題。

然而,經典的DQN算法并非完美無瑕。它存在一個眾所周知的問題——Q值過高估計 (Overestimation)。這個問題會導致智能體的學習過程不穩定,甚至無法收斂到最優策略。為了解決這一挑戰,研究者們提出了Double DQN,一個對原始DQN的優雅而高效的改進。

本篇博客旨在帶領大家深入理解Double DQN的核心思想,并通過一個完整的、帶有詳細注釋的PyTorch代碼實例,從零開始構建、訓練并評估一個Double DQN智能體。我們將以經典的Pendulum-v1環境為例,一步步揭開Double DQN如何通過解耦“動作選擇”與“價值評估”來緩解過高估計問題,最終實現更穩定、更高效的學習。

無論您是RL的初學者,還是希望深化對DQN家族算法理解的實踐者,相信通過本文的理論講解和代碼剖析,您都能對Double DQN有一個更透徹的認識。讓我們開始吧!

完整代碼:下載鏈接


理論篇:為什么需要 Double DQN?

在深入代碼之前,我們首先需要理解Double DQN所要解決的核心問題。普通的DQN算法在更新Q值時,通常會系統性地高估動作的價值,這個問題在動作空間較大的任務中尤為嚴重。

讓我們通過下面這張圖文并茂的理論講解來一探究竟。

普通DQN算法通常會導致對Q值的過高估計 (overestimation)。傳統DQN優化的TD誤差目標為:

其中 max ? a ′ Q ω ? ( s ′ , a ′ ) \max_{a^{\prime}}Q_{\omega^{-}}\left(s^{\prime},a^{\prime}\right) maxa?Qω??(s,a)由目標網絡 (參數為ω?) 計算得出,我們還可以將其寫成如下形式:

換句話說,max操作實際上可以被拆解為兩部分:首先選取狀態s’下的最優動作 a ? = arg ? max ? a ′ Q ω ? ( s ′ , a ′ ) a^*=\arg\max_{a^{\prime}}Q_{\omega^-}\left(s^{\prime},a^{\prime}\right) a?=argmaxa?Qω??(s,a),接著計算該動作對應的價值 Q ω ? ( s ′ , a ? ) Q_{\omega^-}\left(s^{\prime},a^*\right) Qω??(s,a?)。當這兩部分采用同一套Q網絡進行計算時,每次得到的都是神經網絡當前估算的所有動作價值中的最大值。

問題在于,神經網絡的估算值本身在某些時候會產生正向或負向的誤差。在DQN的更新方式下,神經網絡會正向誤差累積。因為max操作會傾向于選擇那些被“偶然”高估了價值的動作。因此,當我們用DQN的更新公式進行更新時,用于計算目標值的max Q本身就可能被高估了。同理,我們拿這個被高估的值來作為更新目標來更新上一步的值時,同樣會過高估計,這樣的誤差將會逐步累積。對于動作空間較大的任務,DQN中的過高估計問題會非常嚴重,造成DQN無法有效工作。

為了解決這一問題,Double DQN算法提出利用兩個獨立訓練的神經網絡估算 max ? a ′ Q ? ( s ′ , a ′ ) \max_{a^{\prime}}Q_*(s^{\prime},a^{\prime}) maxa?Q??(s,a)。具體做法是將原有的 max ? a ′ Q ω ? ( s ′ , a ′ ) \max_{a^{\prime}}Q_{\omega^{-}}\left(s^{\prime},a^{\prime}\right) maxa?Qω??(s,a)更改為 Q ω ? ( s ′ , arg ? max ? a ′ Q ω ( s ′ , a ′ ) ) Q_{\omega^-}\left(s^{\prime},\arg\max_{a^{\prime}}Q_\omega\left(s^{\prime},a^{\prime}\right)\right) Qω??(s,argmaxa?Qω?(s,a))

這個公式的核心思想是解耦(Decoupling)

  1. 動作選擇 (Action Selection): 利用主網絡(參數為ω)的輸出來選取價值最大的動作,即 arg ? max ? a ′ Q ω ( s ′ , a ′ ) \arg\max_{a^{\prime}}Q_\omega\left(s^{\prime},a^{\prime}\right) argmaxa?Qω?(s

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

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

相關文章

四非鼠鼠計算機專業的保研分享

四非鼠鼠的計算機專業保研分享 1.前言 鼠鼠的本科學校是一所不怎么出名的四非院校,專業是計算機科學與技術。在寫下這篇文章時,鼠鼠并不是為了炫耀什么,而是想把自己在保研路上的一些踩坑經歷分享出來,尤其是寫給那些和我一樣&a…

【C++詳解】STL-vector使用底層剖析和實現

文章目錄 vector介紹vector和string的區別補充知識initializer_listemplace_back結構化綁定 vector的使用構造析構遍歷修改insertfind流插入/流提取vector\<vector>(楊輝三角) vector模擬實現淺品STL源碼構造函數拷貝構造多參數構造迭代器區間構造n個val初始化swapoperat…

MySql升級安裝、socket 及密碼重置

升級 項目需要使用Mysql8.0, 查看自己的ubuntu22.04上mysql版本為5.7&#xff0c; 使用以下命令自動升級到8.0版本。 sudo apt install Mysqlsock錯誤&#xff1a; Can’t connect to local MySQL server through socket 運行mysql -u -p 報以下錯誤&#xff1a; ERROR 200…

Python網絡爬蟲技術:從入門到實戰

在當今數字化時代&#xff0c;網絡爬蟲技術已經成為數據挖掘和信息收集的重要工具。通過網絡爬蟲&#xff0c;我們可以高效地從互聯網上獲取大量有價值的數據&#xff0c;用于數據分析、市場研究、學術研究等多種場景。本文將帶你從零開始&#xff0c;了解Python網絡爬蟲的基本…

偏微分方程初值問題求解

題目 問題 2. (a) u t + 3 u x ? 2 u y = x ; u t + x u x + y u y = x ; u_t + 3u_x - 2u_y = x; \quad u_t + xu_x + yu_y = x; ut?+3ux??2uy?=x;ut?+xux?+yuy?=x; u t + x u x ? y u y = x ; u t + y u x + x u y = x ; u_t + xu_x - yu_y = x; \quad u_t + yu_…

【專業梳理】PMP知識體系,以SIPOC流程圖為核心的質量工具擴展

??1. SIPOC流程圖:質量管理的起點?? SIPOC(Supplier-Input-Process-Output-Customer)是六西格瑪和流程管理中的核心工具,用于定義和優化跨職能流程。在PMBOK中,它與質量管理知識領域(尤其是質量規劃、質量保證)緊密關聯: ??質量規劃??:通過SIPOC明確流程邊界…

OpenCV指定pid和vid通過MSMF打開攝像頭

在基于OpenCV的項目中&#xff0c;實際開發過程會面臨設備上存在多個攝像頭&#xff0c;需要指定攝像頭的pid和vid打開攝像頭。在OpenCV通過MSMF打開攝像頭時&#xff0c;需要傳入攝像頭的index&#xff0c;因此需要在打開該攝像頭前需要找出攝像頭的index&#xff0c;下面給出…

STM32F103ZET6系統啟動過程

STM32F103ZET6系統啟動過程 一、概述 STM32F103ZET6啟動過程指硬件選擇啟動模式后,執行固件程序之前的一系列動作。對于系統存儲器模式,系統執行Bootloader程序升級狀態,檢測數據進行串口升級;對于內部Flash模式,系統執行啟動文件,設置堆棧大小,配置系統時鐘,最終調用…

[Data Pipeline] Kafka消息 | Redis緩存 | Docker部署(Lambda架構)

第七章&#xff1a;Kafka消息系統&#xff08;實時流處理&#xff09; 歡迎回到數據探索之旅&#xff01; 在前六章中&#xff0c;我們構建了強大的**批量處理流水線**。 通過Airflow DAG&#xff08;批量任務編排&#xff09;協調Spark作業&#xff08;數據處理&#xff09;…

jquery 賦值時不觸發change事件解決——仙盟創夢IDE

一、傳統方法jquey change $(#village_id).trigger(change);$("#village_id").val(99);$("#village_id").change(); 不生效 二、傳統方法jquey $(#village_id).trigger(change); 四、傳統方法jquey <input type"text" /> <button…

Android | 簽名安全

檢驗和簽名 校驗開發者在數據傳送時采用的一種校正數據的一種方式&#xff0c; 常見的校驗有:簽名校驗(最常見)、dexcrc校驗、apk完整性校驗、路徑文件校驗等。 通過對 Apk 進行簽名&#xff0c;開發者可以證明對 Apk 的所有權和控制權&#xff0c;可用于安裝和更新其應用。…

Android14 耳機按鍵拍照

在相機拍照預覽界面 通過耳機按鍵實現拍照功能 耳機按鍵定義 frameworks/base/core/java/android/view/KeyEvent.java public static final int KEYCODE_HEADSETHOOK 79;相機界面 拍照邏輯 DreamCamera2\src\com\android\camera\PhotoModule.java Override public bool…

【AI作畫】第2章comfy ui的一般輸入節點,文本框的類型和輸入形式

目錄 CLIP文本編碼器 條件輸出和文本輸出 轉換某一變量為輸入 展示作品集 在默認的工作流之外&#xff0c;我們如何自己添加節點呢&#xff1f; 一般我們用到的sampler采樣器在“鼠標右鍵——添加節點——采樣——K采樣器” 我們用的clip文本編碼器在“鼠標右鍵——添加節…

vue3仿高德地圖官網路況預測時間選擇器

<template><div class"time-axis-container"><div class"time-axis" ref"axisRef"><!-- 刻度線 - 共25個刻度(0-24) --><divv-for"hour in 25":key"hour - 1"class"tick-mark":class&…

ZArchiver:高效解壓縮,輕松管理文件

在數字時代&#xff0c;文件的壓縮與解壓已成為我們日常操作中不可或缺的一部分。無論是接收朋友分享的大文件&#xff0c;還是下載網絡資源&#xff0c;壓縮包的處理都極為常見。ZArchiver正是一款為安卓用戶精心打造的解壓縮軟件&#xff0c;它以強大的功能、簡潔的界面和高效…

1432.改變一個整數能得到的最大差值

貪心思想&#xff0c;為了得到最大差&#xff0c;想辦法變成一個最大的數和一個最小的數。 這里有規則&#xff0c;從最高位開始&#xff0c; 變成最大&#xff0c;如果<9&#xff0c;則將該數位代表的數都變成9&#xff0c;如果該數位已經是9了&#xff0c;則將下一個數位…

前端跨域解決方案(4):postMessage

1 postMessage 核心 postMessage 是現代瀏覽器提供的跨域通信標準 API&#xff0c;允許不同源的窗口&#xff08;如主頁面與 iframe、彈出窗口、Web Worker&#xff09;安全交換數據。相比其他跨域方案&#xff0c;它的核心優勢在于&#xff1a; 雙向通信能力&#xff1a;支持…

大語言模型指令集全解析

在大語言模型的訓練與優化流程中&#xff0c;指令集扮演著關鍵角色&#xff0c;它直接影響模型對任務的理解與執行能力。以下對常見指令集展開詳細介紹&#xff0c;涵蓋構建方式、規模及適用場景&#xff0c;助力開發者精準選用 為降低指令數據構建成本&#xff0c;學術界和工…

OpenCV CUDA模塊設備層-----用于封裝CUDA紋理對象+ROI偏移量的一個輕量級指針類TextureOffPtr()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 TextureOffPtr<T, R> 是 OpenCV 的 CUDA 模塊&#xff08;opencv_cudev&#xff09;中用于封裝 CUDA 紋理對象 ROI 偏移量 的一個輕量級指…

Python 數據分析10

2.3.3其他 除了前面所介紹的常用語數據挖掘建模的庫之外&#xff0c;還有許多庫也運用于數據挖掘建模&#xff0c;如jieba、SciPy、OpenCV、Pillow等。 1.jieba jieba是一個被廣泛使用的Python第三方中文分詞庫。jieba使用簡單&#xff0c;并且支持Python、R、C等多種編程語言的…