Double-DQN算法

Double-DQN算法的原理簡介、與DQN對比等。
參考深度Q網絡進階技巧

1. 原理簡介

在DQN算法中,雖然有target_net和eval_net,但還是容易出現Q值高估的情況,原因在于訓練時用通過target_net選取最優動作
a ? = argmax ? a Q ( s t + 1 , a ; w ? ) a^{\star}=\underset{a}{\operatorname{argmax}} Q\left(s_{t+1}, a ; \mathbf{w}^{-}\right) a?=aargmax?Q(st+1?,a;w?)
并得到其Q值后,再根據
y t = r t + γ ? Q ( s t + 1 , a ? ; w ? ) y_{t}=r_{t}+\gamma \cdot Q\left(s_{t+1}, a^{\star} ; \mathbf{w}^{-}\right) yt?=rt?+γ?Q(st+1?,a?;w?)
算出TD-target,所以一旦高估,就會頻繁被選中然后導致目標值持續較大。

而Double-DQN算法則是設計兩個Q網絡,一個進行動作選取,一個進行Q值計算。即通過eval_net選取最優動作
a ? 2 = argmax ? a Q ( s t + 1 , a ; w ) a^{\star2}=\underset{a}{\operatorname{argmax}} Q\left(s_{t+1}, a ; \mathrm{w}\right) a?2=aargmax?Q(st+1?,a;w)
隨后再通過target_net計算其Q值得到TD_target目標值
y t = r t + γ ? Q ( s t + 1 , a ? 2 ; w ? ) y_{t}=r_{t}+\gamma \cdot Q\left(s_{t+1}, a^{\star2} ; \mathbf{w}^{-}\right) yt?=rt?+γ?Q(st+1?,a?2;w?)
毫無疑問, Q ( s t + 1 , a ? 2 ; w ? ) ≤ Q ( s t + 1 , a ? ; w ? ) Q\left(s_{t+1}, a^{\star2} ; \mathbf{w}^{-}\right) \leq Q\left(s_{t+1}, a^{\star} ; \mathbf{w}^{-}\right) Q(st+1?,a?2;w?)Q(st+1?,a?;w?).

2. 與DQN區別

進行TD算法梯度下降時,DQN算法是直接從target_net中選取最大Q值,而Double-DQN則是eval_net選取最優動作,target_net再選取該動作的Q值。

3. 代碼

直接在DQN的代碼上進行幾行的修改即可,修改類中的learn(update)方法。
代碼如下:

class DoubleDQN:
...def learn(self):# target parameter updateif self.learn_step_counter % TARGET_REPLACE_ITER == 0:self.target_net.load_state_dict(self.eval_net.state_dict())self.learn_step_counter += 1# sample batch transitionssample_index = np.random.choice(MEMORY_CAPACITY, BATCH_SIZE)b_memory = self.memory[sample_index, :]b_s = torch.FloatTensor(b_memory[:, :N_STATES])b_a = torch.LongTensor(b_memory[:, N_STATES:N_STATES + 1].astype(int))b_r = torch.FloatTensor(b_memory[:, N_STATES + 1:N_STATES + 2])b_s_ = torch.FloatTensor(b_memory[:, -N_STATES:])######## 就這一點和DQN不一樣 ########q_eval = self.eval_net(b_s).gather(1, b_a)  # 相當于Q(s,a)a_next_eval =  self.eval_net(b_s_)          # eval_net估計下一步動作q_next = self.target_net(b_s_).detach()     # target計算 Q(st+1)q_target = b_r + GAMMA * q_next.gather(1, torch.max(a_next_eval, 1)[1].unsqueeze(1))   # 根據eval_net估計的動作的最大值,找出target_net中對應的Q值,得到TD_targetloss = self.loss_func(q_eval, q_target)self.optimizer.zero_grad()  # 梯度重置loss.backward()  # 反向求導self.optimizer.step()  # 更新模型參數
...

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

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

相關文章

51單片機學習(3)-----獨立按鍵控制LED的亮滅狀態

前言:感謝您的關注哦,我會持續更新編程相關知識,愿您在這里有所收獲。如果有任何問題,歡迎溝通交流!期待與您在學習編程的道路上共同進步了。 目錄 一. 器件介紹及實驗原理 1.獨立按鍵 (1)獨…

react 實現路由攔截

簡單介紹下項目背景,我這里做了一個demo,前端使用mock數據,然后實現簡單的路由攔截,校驗session是否包含用戶作為已登錄的依據,react-router-dom是v6。不像vue可以設置登錄攔截beforeenter,react需要我們自…

外包干了3個月,技術退步明顯

先說一下自己的情況,本科生,19年通過校招進入廣州某軟件公司,干了接近4年的功能測試,今年年初,感覺自己不能夠在這樣下去了,長時間呆在一個舒適的環境會讓一個人墮落!而我已經在一個企業干了四年的功能測試…

Linux之用戶和用戶組的深入了解

目錄 一、簡介 1.1、用戶: 1.2、用戶組 1.3、UID和GID 1.3、用戶賬戶分類 查看用戶類別 超級用戶root(0) 程序用戶(1~499) 普通用戶(500~65535) 二、用戶 2.1、添加新的用戶賬號:useradd 2.2、刪除賬號:userdel 有-r與沒有-r區別…

OSDI 2023: Hyrax Fail-in-Place Server Operation in Cloud Platforms

我們使用以下6個分類標準對本文的研究選題進行分析: 1. 硬件故障類型 DRAM: 此類別涉及研究如何處理內存相關的錯誤。這包括單比特錯誤,使用傳統 ECC 進行校正,以及需要冗余、修復技術或隔離故障內存區域的更廣泛的故障。磁盤: 此處研究將解決存儲故障,尤其是 SSD 中的故障…

運維07:堡壘機

什么是跳板機 跳板機就是一臺服務器而已,運維人員在使用管理服務器的時候,必須先連接上跳板機,然后才能去操控內網中的服務器,才能登錄到目標設備上進行維護和操作 開發小張 ---> 登錄跳板機 ---> 再登錄開發服務器 測試…

貸齊樂系統最新版SQL注入(無需登錄繞過WAF可union select跨表查詢)

一、環境 已上傳資源(daiqile) 二、代碼解釋 1.1Request 不管get請求還是post請求都可以接收到 1.2過濾的還挺多 1.3第二個WAF把數據分為兩個了一個Key一個value,全是explode的功勞 1.4submit是if進入的前提 很明顯走進來了 1.5那我們在這…

學習JAVA的第三天(基礎)

目錄 流程控制語句 順序結構 分支結構 循環結構 分類: 練習 跳轉控制語句 練習 數組 數組介紹 數組的定義和靜態初始化 數組定義 數組的靜態初始化 數組元素訪問 數組遍歷 數組動態初始化 JAVA內存分配 流程控制語句 順序結構 是Java程序默認的執行流程…

UIKit 在 UICollectionView 中拖放交換 Cell 視圖的極簡實現

概覽 UIKit 中的 UICollectionView 視圖是我們顯示多列集合數據的不二選擇,而豐富多彩的交互操作更是我們選擇 UICollectionView 視圖的另一個重要原因。 如上圖所示:我們實現了在 UICollectionView 中拖放交換任意兩個 Cell 子視圖的功能,這…

js如何判斷一個對象中某一個屬性存在并且有值

在JavaScript中,可以使用不同的方法來判斷一個對象中某個屬性是否存在并且有值。以下是幾種常見的方法: 1、使用hasOwnProperty()方法:該方法用于檢查對象是否具有指定的屬性。可以通過以下方式來判斷屬性是否存在并且有值: if (…

整理了去年的一些運維面試題一

Ingress的yaml文件需要包含哪些? CICD搭建流程? JAVA程序打包工具? 如何檢測Linux端口如何通信? k8s集群之間如何通信的? docker組成部分? 20位掩碼有多少主機IP? 在linux中四個T的硬盤使用什…

Zabbix 遠程監控主機

目錄 1、安裝 Zabbix 安裝客戶端 服務端測試通訊 Web頁面添加主機 2、監控 Nginx 自定義腳本監控 Nginx web配置臺 3、監控 MySQL 配置模版文件 配置Web界面 1、安裝 Zabbix node-12 作為zabbix的被監控端,提供mysql服務器,配置zabbix監控node…

jquery寫組件滑動人機驗證組件

jquery組件,雖然 jquery 語法古老,但是寫好了用起來真的很爽啊,本文用滑動人機驗證給大家做個詳細教程(直接復制代碼就可以用噢o(* ̄▽ ̄*)ブ) 第一步 先看下組件本身 component.js (function() {…

Nginx網絡服務三-----(三方模塊和內置變量)

1.驗證模塊 需要輸入用戶名和密碼 我們要用htpasswd這個命令,先安裝一下httpd 生成文件和用戶 修改文件 訪問頁面 為什么找不到頁面? 對應的路徑下,沒有這個文件 去創建文件 去虛擬機瀏覽器查看 有的頁面不想被別人看到,可以做…

【UI自動化】使用poco框架進行元素唯一定位

直接選擇: 1.poco(text買入).click() 2.poco("android.widget.ImageView").click()相對選擇、空間選擇: 3.poco(text/name).parent().child()[0].click()正則表達式: 4.listpoco(textMatches".*ETF")今天主要想記錄下…

centos 系統盤 放到 win pc 中的異常解決

有一塊 2.5 480g sata ssd,之前是筆記本電腦的centos系統盤,后來沒用了,打算掛到臺式機上當下載盤。臺式機pc的主板是華碩 h610m-a。 難點一: 因為臺式pc上已經掛了兩塊3.5 hdd,發現sata的電源線都在3.5hdd附近&#…

利用RBI(Remote Browser Isolation)技術訪問ChatGPT

系統組網圖 #mermaid-svg-Bza2puvd8MudMbqR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Bza2puvd8MudMbqR .error-icon{fill:#552222;}#mermaid-svg-Bza2puvd8MudMbqR .error-text{fill:#552222;stroke:#552222;…

300分鐘吃透分布式緩存-10講:MC是怎么定位key的?

我們在進行 Mc 架構剖析時,除了學習 Mc 的系統架構、網絡模型、狀態機外,還對 Mc 的 slab 分配、Hashtable、LRU 有了簡單的了解。本節課,將進一步深入學習這些知識點。 接下來,進入 Memcached 進階的學習。會講解 Mc 是如何進行…

QT應用軟件【協議篇】周立功CAN接口卡代碼示例

文章目錄 USBCAN系列CAN接口卡規格參數資料下載QT引用周立功的庫安裝sdk代碼USBCAN系列CAN接口卡 USBCAN系列CAN接口卡兼容USB2.0全速規范,可支持1/2/4/8路CAN接口。采用該接口卡,PC機可通過USB連入CAN網絡,進行CAN總線數據采集和處理,主要具備以下幾大優勢特點: 支持車載…

正交匹配追蹤(Orthogonal Matching Pursuit, OMP)的MATLAB實現

壓縮感知(Compressed Sensing, CS)是一種利用稀疏信號的先驗知識,用遠少于奈奎斯特采樣定理要求的樣本數目恢復整個信號的技術。正交匹配追蹤(Orthogonal Matching Pursuit, OMP)是一種常見的貪婪算法(Gree…