目錄
基于 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 的經驗回放、多步更新等技術優化訓練穩定性。