強化學習與神經網絡結合(以 DQN 展開)

目錄

基于 PyTorch 實現簡單 DQN

double DQN

dueling DQN

Noisy DQN:通過噪聲層實現探索,替代 ε- 貪心策略

Rainbow_DQN如何計算連續型的Actions


強化學習中,智能體(Agent)通過與環境交互學習最優策略。當狀態空間或動作空間龐大時,傳統表格法(如 Q-Learning)難以存儲所有狀態 - 動作值(Q 值)。此時引入神經網絡,用其函數擬合能力近似 Q 函數,即深度 Q 網絡(DQN)。

圖片所示的運流程

1.環境交互:智能體根據當前狀態St,選擇動作A執行,環境反饋獎勵R,轉移到新狀態St+1

Q 值計算:將St+1輸入 Q 網絡,計算所有動作的 Q 值,取最大值

目標值構建:更新目標為

為折扣因子,平衡短期與長期獎勵)

損失計算:當前 Q 值Q(St,a)作為預測值,目標值作為標簽,通過均方誤差(MSE計算損失

網絡更新:利用梯度下降優化 Q 網絡,減少損失

基于 PyTorch 實現簡單 DQN

import torch  
import torch.nn as nn  
import torch.optim as optim  
import gym  # 定義Q網絡  
class QNetwork(nn.Module):  def __init__(self, state_dim, action_dim):  super(QNetwork, self).__init__()  
        self.fc = nn.Sequential(  
            nn.Linear(state_dim, 64),  
            nn.ReLU(),  
            nn.Linear(64, action_dim)  )  def forward(self, x):  return self.fc(x)  # 初始化環境與網絡  
env = gym.make('CartPole-v1')  
state_dim = env.observation_space.shape[0]  
action_dim = env.action_space.n  
q_net = QNetwork(state_dim, action_dim)  
optimizer = optim.Adam(q_net.parameters(), lr=0.001)  
criterion = nn.MSELoss()  # 訓練循環  
for episode in range(100):  
    state = env.reset()  
    state = torch.FloatTensor(state)  
    total_reward = 0  
    done = False  while not done:  # 選擇動作(簡化示例,未包含探索策略)  with torch.no_grad():  
            q_values = q_net(state.unsqueeze(0))  
        action = torch.argmax(q_values).item()  # 執行動作,獲取反饋  
        next_state, reward, done, _ = env.step(action)  
        next_state = torch.FloatTensor(next_state)  
        reward = torch.tensor(reward, dtype=torch.float32)  # 計算目標值與當前Q值  with torch.no_grad():  
            next_q = q_net(next_state.unsqueeze(0)).max(1)[0]  
        target = reward + 0.99 * next_q  
        current_q = q_net(state.unsqueeze(0))[0][action]  # 計算損失并更新網絡  
        loss = criterion(current_q, target)  
        optimizer.zero_grad()  
        loss.backward()  
        optimizer.step()          state = next_state  
        total_reward += reward  print(f"Episode {episode}, Total Reward: {total_reward}")  env.close()  

agent與env的交互

判斷done:

done 狀態是由環境(env)在交互過程中返回的終止信號,用于標識當前回合(episode)是否結束

done 的來源:

在 observation_, reward, done = env.step(action) 這一步中,環境會根據智能體執行的動作(action),反饋當前狀態的后續信息:

observation_:執行動作后轉移到的新狀態。

reward:執行動作獲得的即時獎勵。

done:一個布爾值(True/False),由環境規則定義。當環境認為當前回合結束時(如達到任務目標、觸發終止條件等),done 會被置為 True

double DQN

Double DQN(Double Deep Q-Network)是對傳統DQN的改進算法,旨在解決Q值估計過估計(Overestimation)的問題

傳統DQN的局限

傳統DQN通過 同一個網絡 同時完成兩個任務:

1. 選擇動作:根據當前狀態選擇Q值最大的動作(貪心策略)。

2. 評估價值:計算目標Q值以更新網絡參數。

這會導致**過估計**問題:網絡在計算目標值時,傾向于選擇自身高估的動作,從而引入偏差,導致訓練不穩定甚至發散。

Double DQN的核心改進

Double DQN通過 分離動作選擇和動作評估 來解決過估計問題,具體方法如下:

1. 引入兩個網絡:

- 在線網絡(Online Network):負責選擇動作(ε-貪心策略)

- 目標網絡(Target Network):負責計算目標Q值,其參數定期從在線網絡復制

2. 解耦動作選擇與評估:

- 用在線網絡選擇動作a_t = argmax Q(s_t, a; θ)

- 用目標網絡評估該動作的Q值 Q(s_{t+1}, a_t; θ^-)

算法流程

1. 初始化:

- 在線網絡和目標網絡結構相同,但參數獨立

- 目標網絡參數初始化為在線網絡的副本θ^- = θ

2. 經驗回放池:存儲訓練樣本s_t, a_t, r_t, s_{t+1}

3. 訓練循環:

- 步驟1:在線網絡根據當前狀態選擇動作

- 步驟2:執行動作,獲取獎勵和下一狀態

- 步驟3:將樣本存入經驗回放池

- 步驟4:從池中隨機采樣一批數據

- 步驟5:計算目標Q值:

target_Q = r + γ * Q_target(s_{t+1}, argmax Q_online(s_{t+1}, a; θ); θ^-)

- 步驟6:用在線網絡計算當前Q值,并通過MSE損失更新參數

- 步驟7:定期更新目標網絡參數(如每C步復制θ到θ^-)

關鍵技術細節

1. 目標網絡更新策略:

- 目標網絡參數并非實時更新,而是每隔C步從在線網絡復制一次,避免梯度震蕩

2. 經驗回放(Experience Replay):

- 打破數據相關性,提高樣本利用率

3. ε-貪心策略:

- 平衡探索與利用,確保充分探索環境

偽代碼

初始化在線網絡 Q(θ) 和目標網絡 Q(θ^-)
θ^- = θ  # 初始同步
經驗回放池 D 初始化for episode in episodes:
    初始化狀態 swhile s 非終止狀態:
        根據 ε-貪心策略選擇動作 a(由 Q(θ) 決定)
        執行動作 a,得到獎勵 r 和下一狀態 s'
(s, a, r, s') 存入 D
        從 D 中隨機采樣 mini-batchfor 每個樣本 (s_i, a_i, r_i, s'_i):
            a_next = argmax Q(s'_i, a; θ)  # 在線網絡選動作
            Q_target = r_i + γ * Q_target(s'_i, a_next; θ^-)  # 目標網絡評估
            loss = MSE(Q(s_i, a_i; θ), Q_target)
            反向傳播更新 θ
        每隔 C 步,θ^- = θ  # 同步目標網絡
        s = s'

優勢與效果

1. 減少過估計:通過分離動作選擇和評估,顯著降低Q值偏差

2. 訓練更穩定:目標網絡參數定期更新,避免梯度震蕩

3. 性能提升:在Atari游戲等任務中,Double DQN比傳統DQN表現更優,如《Pong》《Breakout》等

擴展與變種

1. Dueling DQN:將Q值分解為狀態價值和動作優勢,進一步提升性能

2. Rainbow DQN:融合Double DQN、Dueling DQN、Prioritized Replay等技術

3. Noisy DQN:通過噪聲層實現探索,替代ε-貪心策略

Double DQN通過解耦動作選擇與評估,有效解決了傳統DQN的過估計問題,成為深度強化學習的經典算法之一。其核心思想是利用兩個網絡的分工協作,平衡探索與利用,提升訓練穩定性和樣本效率

dueling DQN

Dueling DQN(對決網絡 DQN)是對傳統 DQN 的改進,核心在于將 Q 值拆解為狀態價值和動作優勢,讓網絡更高效地學習

核心思想:拆分 Q 值的意義

傳統 DQN 直接學習 Q (s, a),即 “狀態 - 動作” 的價值。而 Dueling DQN 將 Q 值拆分為兩部分:

狀態價值 V (s):衡量當前狀態本身的好壞,不依賴具體動作。例如 “站在十字路口” 這個狀態的基礎價值。

動作優勢 Adv (s, a):衡量某個動作相對于平均動作的優勢。例如 “在十字路口,右轉比左轉 / 直行更好” 的優勢。

公式:Q(s, a) = V(s) + Adv(s, a)。

通過這種拆分,網絡能更清晰地學習 “狀態本身的價值” 和 “動作的相對優勢”,尤其在狀態價值明顯、動作選擇影響較小時,學習效率更高。

網絡結構:共享特征 + 雙分支

共享特征提取層:

前幾層網絡(如卷積層、全連接層)用于提取狀態特征,類似傳統 DQN 的特征處理。雙分支結構:V (s) 分支:輸入共享層特征,輸出標量(狀態價值)。

Adv (s, a) 分支:輸入共享層特征,輸出向量(每個動作的優勢)。

約束條件:為避免 V 和 Adv 的表示冗余,通常對 Adv 添加約束,例如讓同一狀態下所有動作的 Adv 均值為 0(∑Adv(s, a)/num_actions = 0)。這樣 V (s) 實際代表該狀態下所有動作 Q 值的平均值。

共享特征提取層:特征的 “通用加工廠”

作用:無論是計算狀態價值?V(s)?還是動作優勢Adv(s,a),都需要先從原始狀態(如游戲畫面、機器人傳感器數據)中提取有意義的特征。

類比理解:類似炒菜前的備菜環節。不管最后是要炒青菜還是炒肉,都需要先洗菜、切菜(提取特征)。共享特征層就是 “洗菜切菜” 的通用流程,用卷積層、全連接層等處理原始狀態,得到后續分支可用的特征。

雙分支結構:分工明確的 “價值分析員”

V(s) 分支

目標:評估“狀態本身的價值”,不考慮具體動作。例如,在“游戲角色站在能量道具旁邊”的狀態,V(s)衡量這個狀態潛在的整體收益(無論撿道具還是不撿,先評估狀態基礎價值)。

輸出:一個標量(單一數值),代表狀態?s?的價值。

Adv(s,a) 分支:

目標:評估每個動作的“相對優勢”。例如,在上述狀態下,“撿道具”這個動作比“不撿道具”好多少,優勢通過Adv(s,a) 體現。

輸出:向量,每個元素對應一個動作的優勢值。比如游戲有 4 個動作,就輸出 4 個數值,分別表示每個動作的優勢。

更新機制:為何能 “一次性調整所有 Q 值”?

普通 DQN 的更新局限:

傳統 DQN 更新時,只針對選中的動作調整 Q 值。例如在狀態 s 下選動作 a,僅更新 Q (s, a),其他動作的 Q 值不受影響。Dueling DQN 的更新優勢:由于Adv(s, a)的和為 0 的約束,網絡更傾向于先調整V(s)(狀態價值)。而V(s)是該狀態下所有動作 Q 值的平均值,調整V(s)相當于對該狀態下所有動作的 Q 值進行了一次全局更新。

舉例:若狀態 s 的 V (s) 從 10 提升到 12,且 Adv (s, a) 不變,那么所有動作的 Q 值都會增加 2。這種 “批量更新” 讓網絡學習更高效,尤其在狀態價值主導決策時,能更快收斂。

Noisy DQN:通過噪聲層實現探索,替代 ε- 貪心策略

傳統探索策略的局限

ε- 貪心的問題:通過固定概率(如 ε=0.1)隨機選動作實現探索,但 ε 需手動調整,且無法根據訓練階段動態適應。例如,前期需要強探索,后期應聚焦利用,ε- 貪心難以靈活平衡

Noisy DQN 的核心原理:參數空間噪聲

Noisy DQN 將探索直接融入網絡結構,通過在網絡參數中添加噪聲,讓智能體在決策時自然產生探索行為:

噪聲添加方式:在網絡的全連接層參數(權重W和偏置b)中加入噪聲。例如,對某一層的權重W,實際使用W + epsilon_W是噪聲,偏置b同理使用b + epsilon_b。

探索與利用的平衡:訓練階段:噪聲激活,智能體因參數擾動嘗試不同動作,實現探索。例如,原本選 Q 值最高的動作,加噪聲后可能因參數變化選擇其他動作。

推理階段:去掉噪聲(或噪聲趨近于 0),直接基于確定的網絡參數選擇最優動作,專注利用。

實現細節:噪聲層設計

噪聲類型:常用高斯噪聲,如權重噪聲,偏置噪聲,通過超參數sigma控制噪聲強度。

Frostbite 噪聲層:一種典型實現,對權重和偏置的噪聲初始化做特殊設計。例如,權重噪聲epsilon_W的每個元素初始化為(x是高斯分布樣本),確保噪聲有合理的方差尺度,避免探索過度或不足。

噪聲的動態調整:訓練中可逐漸降低噪聲強度(如退火策略),讓智能體從探索為主過渡到利用為主,無需像 ε- 貪心一樣手動設定探索概率。

Rainbow_DQN如何計算連續型的Actions

Rainbow DQN 最初設計用于離散動作空間(如 Atari 游戲中的有限操作),若要處理連續動作空間,需對其進行改造

離散化處理:將連續動作轉為離散

區間劃分對連續動作的每個維度(如機器人關節角度、車輛速度)劃分離散區間。例如,動作是二維連續空間?(a_1, a_2),可將?a_1分為?N_1?個區間,a_2分為?N_2個區間,形成N_1 * N_2個離散動作組合。

直接套用 Rainbow DQN離散化后,動作空間變為有限集合,直接使用 Rainbow DQN 的網絡結構(如融合 Double DQN、Dueling DQN 等模塊)計算每個離散動作的 Q 值,選擇 Q 值最高的動作執行。局限性:離散化粒度影響性能,粒度過粗丟失細節,過細則計算量劇增。

結合連續動作策略網絡:改造輸出層

若需保持動作連續性,可改造 Rainbow DQN 的網絡結構,引入連續動作生成機制:

策略網絡輸出修改網絡末端,輸出連續動作的參數。例如:均值 - 方差輸出:網絡輸出動作的均值?mu和方差sigma^2,基于高斯分布?采樣連續動作。

直接回歸:通過全連接層直接回歸連續動作值(如 DDPG 的思路),但需結合評論家網絡(Critic)評估動作價值,與 Rainbow DQN 的 Q 學習框架融合。

價值函數計算保留 Rainbow DQN 的多組件改進(如優先經驗回放、雙網絡結構),但將 Q 值計算適配連續動作。例如,使用積分或采樣近似連續動作空間的 Q 值:

其中是連續動作的策略分布。

典型實踐框架

實際應用中,常將 Rainbow DQN 的優化組件(如多步引導、噪聲探索)與連續動作算法結合,形成新框架:

網絡結構:特征提取層:與 Rainbow DQN 一致,提取狀態特征。

策略分支:輸出連續動作參數(如均值、方差)。

價值分支:計算狀態 - 動作對的 Q 值,融合 Dueling DQN 等思想。

訓練流程:

結合策略梯度(PG)或深度確定性策略梯度(DDPG)的訓練方式,利用 Rainbow DQN 的經驗回放、多步更新等技術優化訓練穩定性。

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

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

相關文章

“11.9元“引發的系統雪崩:Spring Boot中BigDecimal反序列化異常全鏈路狙擊戰 ?

💥 "11.9元"引發的系統雪崩:Spring Boot中BigDecimal反序列化異常全鏈路狙擊戰 🎯 🔍 用 Mermaid原生防御體系圖 #mermaid-svg-XZtcYBnmHrF9bFjc {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…

Cortex-M7進入異常中斷分析

使用cmbacktrace庫,其支持M3,4,7。 1、串口輸出異常信息 #define cmb_println(...) Debug_Printf(__VA_ARGS__)//cmb_println處理可變參數和格式化字符串 int Debug_Printf(const char *fmt, ...) {char buffer[DEBUG_TxBUFLEN];INT16U n;va_list args;va_star…

如何管理間接需求?團隊實踐分享

管理間接需求的核心方法包括明確需求識別流程、建立規范的需求管理體系、實施有效的需求溝通機制。 其中,明確需求識別流程最為關鍵。企業在實際業務中,往往會遇到大量的間接需求,如非直接生產性的采購需求、服務類需求等。這些需求往往隱蔽性…

與Aspose.pdf類似的jar庫分享

如果你在尋找類似于 Aspose.PDF 的 JAR 庫,這些庫通常用于處理 PDF 文檔的創建、編輯、轉換、合并等功能。以下是一些類似的 Java 庫,它們提供 PDF 處理的功能,其中一些是收費的,但也有開源選項: 1. iText (iText PDF…

2-2 MATLAB鮣魚優化算法ROA優化CNN超參數回歸預測

本博客來源于CSDN機器魚,未同意任何人轉載。 更多內容,歡迎點擊本專欄目錄,查看更多內容。 目錄 0.引言 1.ROA優化CNN 2.主程序調用 3.結語 0.引言 在博客【ROA優化LSTM超參數回歸】中,我們采用ROA對LSTM的學習率、迭代次數…

企業入駐成都國際數字影像產業園,可享150多項專業服務

企業入駐成都國際數字影像產業園,可享150多項專業服務 全方位賦能,助力影像企業騰飛 入駐成都國際數字影像產業園,企業將獲得一個涵蓋超過150項專業服務的全周期、一站式支持體系,旨在精準解決企業發展各階段的核心需求&#xf…

線路板元器件介紹及選型指南:提高電路設計效率

電路板(PCB)是現代電子設備的核心,其上安裝了各類電子元器件,這些元器件通過PCB的導電線路彼此連接,實現信號傳輸與功能執行。 元器件的選擇與安裝直接決定了電子產品的性能與穩定性。本文將為大家詳細介紹電路板上的…

探究 Arm Compiler for Embedded 6 的 Clang 版本

原創標題:Arm Compiler for Embedded 6 的 Clang 版本 原創作者:莊曉立(LIIGO) 原創日期:20250218(首發日期20250326) 原創連接:https://blog.csdn.net/liigo/article/details/14653…

RedHat7.6_x86_x64服務器(最小化安裝)搭建使用記錄(二)

PostgreSQL數據庫部署管理 1.rpm方式安裝 掛載系統安裝鏡像: [rootlocalhost ~]# mount /dev/cdrom /mnt 進入安裝包路徑: [rootlocalhost ~]# cd /mnt/Packages 依次安裝如下程序包: [rootlocalhost Packages]# rpm -ihv postgresql-libs-9…

瀏覽器存儲 IndexedDB

IndexedDB 1. 什么是 IndexedDB? IndexedDB 是一種 基于瀏覽器的 NoSQL 數據庫,用于存儲大量的結構化數據,包括文件和二進制數據。它比 localStorage 和 sessionStorage 更強大,支持索引查詢、事務等特性。 IndexedDB 主要特點…

panda3d 渲染

目錄 安裝 設置渲染寬高: 渲染3d 安裝 pip install Panda3D 設置渲染寬高: import panda3d.core as pdmargin 100 screen Tk().winfo_screenwidth() - margin, Tk().winfo_screenheight() - margin width, height (screen[0], int(screen[0] / 1…

Node.js 包管理工具 - NPM 與 PNPM 清理緩存

NPM 清理緩存 1、基本介紹 npm 緩存是 npm 用來存儲已下載包的地方,以加快后續安裝速度 但是,有時緩存可能會損壞或占用過多磁盤空間,這時可以清理 npm 緩存 2、清理操作 執行如下指令,清理 npm 緩存 npm cache clean --for…

STM32F103_LL庫+寄存器學習筆記05 - GPIO輸入模式,捕獲上升沿進入中斷回調

導言 GPIO設置輸入模式后,一般會用輪詢的方式去查看GPIO的電平狀態。比如,最常用的案例是用于檢測按鈕的當前狀態(是按下還是沒按下)。中斷的使用一般用于計算脈沖的頻率與計算脈沖的數量。 項目地址:https://github.…

【C++進階二】string的模擬實現

【C進階二】string的模擬實現 1.構造函數和C_strC_str: 2.operator[]3.拷貝構造3.1淺拷貝3.2深拷貝 4.賦值5.迭代器6.比較ascll碼值的大小7.reverse擴容8.push_back尾插和append尾插9.10.insert10.1在pos位置前插入字符ch10.2在pos位置前插入字符串str 11.resize12.erase12.1從…

wokwi arduino mega 2560 - 點亮LED案例

截圖: 點亮LED案例仿真截圖 代碼: unsigned long t[20]; // 定義一個數組t,用于存儲20個LED的上次狀態切換時間(單位:毫秒)void setup() {pinMode(13, OUTPUT); // 將引腳13設置為輸出模式(此…

vue3項目使用 python +flask 打包成桌面應用

server.py import os import sys from flask import Flask, send_from_directory# 獲取靜態文件路徑 if getattr(sys, "frozen", False):# 如果是打包后的可執行文件base_dir sys._MEIPASS else:# 如果是開發環境base_dir os.path.dirname(os.path.abspath(__file…

后端學習day1-Spring(八股)--還剩9個沒看

一、Spring 1.請你說說Spring的核心是什么 參考答案 Spring框架包含眾多模塊,如Core、Testing、Data Access、Web Servlet等,其中Core是整個Spring框架的核心模塊。Core模塊提供了IoC容器、AOP功能、數據綁定、類型轉換等一系列的基礎功能,…

LeetCode 第34、35題

LeetCode 第34題:在排序數組中查找元素的第一個和最后一個位置 題目描述 給你一個按照非遞減順序排列的整數數組nums,和一個目標值target。請你找出給定目標值在數組中的開始位置和結束位置。如果數組中不存在目標值target,返回[-1,1]。你必須…

告別分庫分表,時序數據庫 TDengine 解鎖燃氣監控新可能

達成效果: 從 MySQL 遷移至 TDengine 后,設備數據自動分片,運維更簡單。 列式存儲可減少 50% 的存儲占用,單服務器即可支撐全量業務。 毫秒級漏氣報警響應時間控制在 500ms 以內,提升應急管理效率。 新架構支持未來…

第十四屆藍橋杯真題

一.LED 先配置LED的八個引腳為GPIO_OutPut,鎖存器PD2也是,然后都設置為起始高電平,生成代碼時還要去解決引腳沖突問題 二.按鍵 按鍵配置,由原理圖按鍵所對引腳要GPIO_Input 生成代碼,在文件夾中添加code文件夾,code中添加fun.c、fun.h、headfile.h文件,去資源包中把lc…