图解强化学习 |手算DQN
2026/6/8 7:33:47 网站建设 项目流程

🌞欢迎来到图解强化学习的世界
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

📆首发时间:🌹2026年5月30日🌹

✉️希望可以和大家一起完成进阶之路!


目录

DQN算法的基础认识

DQN算法的网络结构

DQN算法的更新过程

DQN 算法的更新过程

更新公式

手算过程

DQN算法的改进

Double DQN

Dueling DQN

DQN算法的基础认识

深度 Q 网络

DQN是基于价值、离线、无模型的深度强化学习算法,用神经网络替代Q表拟合动作价值,解决Q

表爆炸问题,可处理高维状态。采用ε-贪心策略选动作,借助时序差分更新网络;引入经验回放、

目标网络提升训练稳定性。但仍不适用于连续动作场景。


DQN算法的网络结构

假设状态有4个维度,有2个动作

输入:状态 s 【1*4】

输出:当前状态下所有离散动作对应的 Q 值 【1*2】

作用:评估每个动作的长期价值,依据最大 Q 值选择最优动作


DQN算法的更新过程

DQN 算法的更新过程

1. 智能体根据状态s,经当前Q网络输出各动作Q值,用贪心选动作a,执行后得到奖励r、下一状

s'

2. 将样本(s,a,r,s')存入经验回放池。

3. 从回放池随机采样批量样本,利用目标Q网络计算s'对应的最大Q值,结合折扣因子算出目

标Q值。

4. 计算预测Q值与目标Q值的损失,反向传播更新当前Q网络参数。

5. 固定步数间隔,将当前Q网络参数同步至目标Q网络,循环迭代。

更新公式

Q 估计

我们通过NN 预测出Q(s2, a1) 和 Q(s2,a2) 的值, 这就是Q 估计.

Q现实

然后我们选取 Q 估计中最大值的动作来换取环境中的奖励reward. 并进入了下一个状态S‘

然后再把这个新的状态输入到网络中。 最后得到目标值。【第一项是环境给出的,第二项是网络

给出的】。

均方误差损失函数 (MSE Loss)


手算过程

假设我们现在有3个状态

当前网络输出 Q (s,a)

[ [2.5, 8.7], # S2 [3.1, 1.2], # S4 [4.0, 5.0] # S1 ]

使用动作取出对应 Q 值(gather)

curr_Q = [ [8.7], # 动作1 [3.1], # 动作0 [5.0] # 动作1 ]

目标网络输出 next_Q

next_Q = [ [1.5, 9.0], [2.0, 1.8], [6.0, 8.0] ]

取每一行最大值

max_next_Q = [9.0, 2.0, 8.0]

计算 目标 Q 值 expected_Q

expected_Q = [ [9.91], [2.98], [-1.0] ]

计算 loss(均方误差)

curr_Q = [8.7, 3.1, 5.0] expected_Q = [9.91, 2.98, -1.0]


DQN算法的改进

Double DQN

Double DQN 是传统 DQN 的改进版本,主要解决原生 DQN Q 值过估计问题。

原生 DQN 使用同一目标网络既选最大动作、又评估 Q 值,容易高估动作价值;

Double DQN 拆分两步:用当前网络选最优动作,再用目标网络计算该动作的 Q 值,估计更精

准、训练更稳定。

它保留 DQN 全部结构:神经网络、经验回放、双网络架构,仅修改目标 Q 值计算逻辑。

Dueling DQN

把Q要拆分 V 和 A

Dueling DQN(对决网络 DQN)是 DQN 的网络结构改进版本,不改变训练流程、经验回放、双

网络机制。

它将单个 Q 值输出拆分为状态价值和动作优势两个分支:

状态价值 (V(s)):描述当前状态本身能获得的整体收益,和动作无关;

动作优势 (A(s,a)):描述某个动作相对平均水平的优劣,体现动作差异。

然后再通过这两个分支的输出,最后得到最终的结果

优势:能区分 “状态好坏” 与 “动作好坏”,对动作不敏感的状态拟合更精准,训练收敛更快、鲁棒

性更强。

状态价值 V(Value 支路)

value = tensor([ [10.0], # 第1个状态 [ 2.0] # 第2个状态 ])

动作优势 A(Advantage 支路)

advantage = tensor([ [4.0, 8.0], # 第1个状态:动作0=4,动作1=8 [7.0, -1.0] # 第2个状态:动作0=7,动作1=-1 ])

第一步:计算每个状态的 Advantage 均值

mean_A = tensor([ [6.0], [3.0] ])

第二步:优势去中心化(A - 均值)

centered_A = tensor([ [-2.0, 2.0], [ 4.0, -4.0] ])

第三步:加上状态价值 V → 得到最终 Q

Q = tensor([ [ 8.0, 12.0], # 状态1:选动作1 [ 6.0, -2.0] # 状态2:选动作0 ])

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询