【强化学习】深度强化学习 - Deep Q-Network(DQN)算法

news2025/5/23 1:13:33

文章目录

    • 摘要
    • 一、DQN核心原理
      • 1. Q-learning回顾
      • 2. 用深度网络逼近Q函数
      • 3. 经验回放(Experience Replay)
      • 4. 目标网络(Target Network)
      • 5. 损失函数
      • 6. ε-贪心策略(ε-greedy)
    • 二、算法流程与伪代码
    • 三、典型实现步骤
    • 四、Python示例(PyTorch)

摘要

Deep Q-Network(DQN)将经典的Q-learning与深度神经网络相结合,使用卷积网络或多层感知机对动作价值函数进行逼近,并通过经验回放(Experience Replay)和目标网络(Target Network)两项关键技术稳定训练,从而在高维状态空间(如像素)下实现近乎人类水平的控制能力。DQN自2015年被DeepMind团队首次提出以来,已成为深度强化学习领域的基石算法之一,被广泛应用于游戏、机器人等场景。

一、DQN核心原理

1. Q-learning回顾

Q-learning是一种无模型、离线的值迭代算法,通过不断更新Q值

Q ( s t , a t ) ← Q ( s t , a t ) + α [ r t + 1 + γ max ⁡ a ′ Q ( s t + 1 , a ′ ) − Q ( s t , a t ) ] Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha\bigl[r_{t+1} + \gamma\max_{a'}Q(s_{t+1},a') - Q(s_t,a_t)\bigr] Q(st,at)Q(st,at)+α[rt+1+γamaxQ(st+1,a)Q(st,at)]

来逼近最优动作价值函数 Q ∗ ( s , a ) Q^*(s,a) Q(s,a)

2. 用深度网络逼近Q函数

DQN使用深度神经网络 Q ( s , a ; θ ) Q(s,a;\theta) Q(s,a;θ) 来近似离散系统中每对状态-动作的Q值,大幅提高了算法在高维、连续状态空间中的适用性。

3. 经验回放(Experience Replay)

训练过程中,将每次交互得到的 ( s t , a t , r t + 1 , s t + 1 ) (s_t,a_t,r_{t+1},s_{t+1}) (st,at,rt+1,st+1) 存入回放池(replay buffer),每次更新时随机抽样小批量数据,打破数据间的时序相关性,提升数据利用效率并降低方差。

4. 目标网络(Target Network)

原始Q网络的参数 θ \theta θ 会导致目标值频繁变化,DQN引入一个参数延迟更新的目标网络 Q ( s , a ; θ − ) Q(s,a;\theta^-) Q(s,a;θ),在固定步数 C C C 后将主网络参数复制给目标网络,以稳定训练过程。

5. 损失函数

DQN的目标是最小化均方贝尔曼误差(Mean Squared Bellman Error):

L ( θ ) = E ( s , a , r , s ′ ) ∼ D [ ( r + γ max ⁡ a ′ Q ( s ′ , a ′ ; θ − ) − Q ( s , a ; θ ) ) 2 ] . \mathcal{L}(\theta) = \mathbb{E}_{(s,a,r,s')\sim \mathcal{D}}\Bigl[\bigl(r + \gamma \max_{a'}Q(s',a';\theta^-) - Q(s,a;\theta)\bigr)^2\Bigr]. L(θ)=E(s,a,r,s)D[(r+γamaxQ(s,a;θ)Q(s,a;θ))2].

梯度通过反向传播计算并更新网络参数。

6. ε-贪心策略(ε-greedy)

为了兼顾探索与利用,DQN在每一步按概率 ε 随机选取动作,否则选择价值最大的动作 a = arg ⁡ max ⁡ a Q ( s , a ; θ ) a=\arg\max_a Q(s,a;\theta) a=argmaxaQ(s,a;θ),并随训练进程线性或指数衰减 ε。


二、算法流程与伪代码

输入:环境 Env,Q网络 Q(s,a;θ),目标网络 Q(s,a;θ⁻),回放池 D,折扣因子 γ,探索率 ε
1. 初始化 θ⁻ ← θ,D 为空
2. 对于每一集episode:
   a. 重置环境,获得初始状态 s
   b. 重复直到终止:
      i. 以 ε-贪心策略从 Q(s,a;θ) 选择 a
     ii. 执行动作 a,获得 (r, s')
    iii. 将 (s,a,r,s') 存入 D
     iv. 从 D 中随机抽样小批量 (s_j,a_j,r_j,s'_j)
      v. 计算目标 y_j = r_j + γ max_{a'} Q(s'_j,a';θ⁻)
     vi. 以梯度下降最小化 (y_j - Q(s_j,a_j;θ))²,更新 θ
    vii. 每 K 步将 θ 复制到 θ⁻
   c. 终止或更新 ε
3. 返回训练后的 Q 网络 θ

三、典型实现步骤

  1. 环境与依赖

    • 安装 Gym 或 Gymnasium,用于构建测试环境(如 CartPole-v1、Atari)。
    • 选择深度学习框架(PyTorch、TensorFlow)并导入相应模块。
  2. 定义Q网络

    • 对低维状态:使用全连接网络(MLP);对高维图像:使用卷积神经网络(CNN)。
    • 输出维度等于动作数;前向计算返回所有动作的Q值。
  3. 实现Replay Buffer

    • 环形队列或列表存储固定容量的过渡;实现 push(state, action, reward, next_state, done)sample(batch_size) 方法。
  4. 训练循环

    • 动作选择:ε-贪心策略;
    • 存储转移:将当前交互存入回放池;
    • 批量更新:当回放池样本数 ≥ 批量大小时,抽样并计算损失、反向传播更新主网络;
    • 目标网络更新:每隔固定步数同步主网络参数到目标网络;
    • ε衰减:逐步降低探索率至最小值。
  5. 超参数设置

    • 回放池大小(如 10 5 10^5 105)、批量大小(如 32–128)、γ(如 0.99)、学习率(如 1e-4)、ε初始/最小值及衰减策略、目标网络更新频率 K(如 1000 步)。
  6. 训练与评估

    • 多个随机种子、多轮训练,记录平均回报与方差;
    • 根据训练曲线判断收敛性,适时调整超参数。

四、Python示例(PyTorch)

import random, numpy as np
import torch, torch.nn as nn, torch.optim as optim
from collections import deque

class DQN(nn.Module):
    def __init__(self, state_dim, action_dim):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(state_dim, 128), nn.ReLU(),
            nn.Linear(128, 128), nn.ReLU(),
            nn.Linear(128, action_dim)
        )
    def forward(self, x):
        return self.net(x)

# 初始化
env = gym.make('CartPole-v1')
state_dim = env.observation_space.shape[0]
action_dim = env.action_space.n
policy_net = DQN(state_dim, action_dim)
target_net = DQN(state_dim, action_dim)
target_net.load_state_dict(policy_net.state_dict())
optimizer = optim.Adam(policy_net.parameters(), lr=1e-4)
replay_buffer = deque(maxlen=100000)

# 训练循环
for episode in range(1000):
    state = env.reset()
    done = False
    while not done:
        if random.random() < epsilon:
            action = env.action_space.sample()
        else:
            with torch.no_grad():
                action = policy_net(torch.FloatTensor(state)).argmax().item()
        next_state, reward, done, _ = env.step(action)
        replay_buffer.append((state, action, reward, next_state, done))
        state = next_state

        if len(replay_buffer) >= batch_size:
            batch = random.sample(replay_buffer, batch_size)
            states, actions, rewards, next_states, dones = map(
                lambda x: torch.FloatTensor(x), zip(*batch))
            q_values = policy_net(states).gather(1, actions.long().unsqueeze(1))
            next_q = target_net(next_states).max(1)[0].detach()
            target = rewards + gamma * next_q * (1 - dones)
            loss = nn.MSELoss()(q_values.squeeze(), target)
            optimizer.zero_grad(); loss.backward(); optimizer.step()

        # 同步目标网络
        if total_steps % target_update == 0:
            target_net.load_state_dict(policy_net.state_dict())
        total_steps += 1

    # ε衰减
    epsilon = max(epsilon_min, epsilon * epsilon_decay)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2381716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch 深入分析三种分页查询【Elasticsearch 深度分页】

前言&#xff1a; 在前面的 Elasticsearch 系列文章中&#xff0c;分享了 Elasticsearch 的各种查询&#xff0c;分页查询也分享过&#xff0c;本篇将再次对 Elasticsearch 分页查询进行专题分析&#xff0c;“深度分页” 这个名词对于我们来说是一个非常常见的业务场景&#…

DAY29 超大力王爱学Python

知识点回顾 类的装饰器装饰器思想的进一步理解&#xff1a;外部修改、动态类方法的定义&#xff1a;内部定义和外部定义 作业&#xff1a;复习类和函数的知识点&#xff0c;写下自己过去29天的学习心得&#xff0c;如对函数和类的理解&#xff0c;对python这门工具的理解等&…

Ubuntu 远程桌面配置指南

概述: 本文主要介绍在Ubuntu 22.04中通过VNC实现远程连接的方法。首先需安装图形化界面和VNC工具x11vnc,设置开机启动服务;然后在Windows客户端用VNC Viewer通过局域网IP和端口5900连接。 总结: 一、VNC配置与安装 安装图形化界面 在Ubuntu 22.04中需先安装: sudo apt …

推扫式高光谱相机VIX-N230重磅发布——开启精准成像新时代

随着各行业对高光谱成像技术需求的持续增长&#xff0c;市场对于高分辨率、高灵敏度以及快速成像的高光谱相机的需求愈发迫切。中达瑞和凭借多年的行业经验和技术积累&#xff0c;敏锐捕捉到这一市场趋势&#xff0c;正式推出全新一代推扫式可见光近红外高光谱相机——VIX-N230…

Parsec解决PnP连接失败的问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、准备环境二、DMZ三、端口映射1.Parsec设置固定端口2.路由器设置端口转发3.重启被控端Parsec四、多少一句1.有光猫管理员账号2.没有光猫管理员账号总结 前言…

软件I2C

软件I2C 注意&#xff1a; SDA&#xff08;串行数据线&#xff09;和SCL&#xff08;串行时钟线&#xff09;都是双向I/O线&#xff0c;接口电路为开漏输出。需通过上拉电阻接电源VCC。 软件I2C说明 说明&#xff0c;有的单片机没有硬件I2C的功能&#xff0c;或者因为电路设计…

Brooks Polycold快速循环水蒸气冷冻泵客户使用手含电路图,适用于真空室应用

Brooks Polycold快速循环水蒸气冷冻泵客户使用手含电路图&#xff0c;适用于真空室应用

关于在Unity项目中使用Post Processing插件打包到web端出现的问题

关于在Unity项目中使用Post Processing插件打包到web端出现的问题 解决方法&#xff1a;是不激活摄像机上的Post Processing有关组件&#xff0c;拉低场景中的Directional Light平行光的强度进行web端打包。 &#xff08;烘焙灯光时是可以激活。&#xff09; web端支持这个Pos…

Prompt Tuning:高效微调大模型的新利器

Prompt Tuning(提示调优)是什么 Prompt Tuning(提示调优) 是大模型参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)的重要技术之一,其核心思想是通过优化 连续的提示向量(而非整个模型参数)来适配特定任务。以下是关于 Prompt Tuning 的详细解析: 一、核心概念…

C++初阶-vector的底层

目录 1.序言 2.std::sort(了解) 3.vector的底层 3.1讲解 3.2构造函数 3.3push_back函数 3.4begin()和end()函数 3.5capacity()和size()函数和max_size函数 3.5.1size&#xff08;&#xff09;函数 为什么这样写&#xff1f; 底层原理 3.5.2max_size()函数 为什么这…

C语言指针深入详解(五):回调函数、qsort函数

目录 一、回调函数 1、使用回调函数改造前 2、使用回到函数改造后 二、qsort使用举例 1、使用qsort函数排序整型数据 2、使用qsort排序结构数据 三、qsort函数模拟实现 结语 &#x1f525;个人主页&#xff1a;艾莉丝努力练剑 &#x1f353;专栏传送门&#xff1a;《…

数据结构进阶:AVL树与红黑树

目录 前言 AVL树 定义 结构 插入 AVL树插入的大致过程 更新平衡因子 旋转 右单旋 左单旋 左右双旋 右左双旋 实现 红黑树 定义 性质 结构 插入 实现 总结 前言 在学习了二叉搜索树之后&#xff0c;我们了解到其有个致命缺陷——当树的形状呈现出一边倒…

基于Spring Boot + Vue的教师工作量管理系统设计与实现

一、项目简介 随着高校信息化管理的发展&#xff0c;教师工作量管理成为教务系统中不可或缺的一部分。为此&#xff0c;我们设计并开发了一个基于 Spring Boot Vue 的教师工作量管理系统&#xff0c;系统结构清晰&#xff0c;功能完备&#xff0c;支持管理员和教师两个角色。…

完善网络安全等级保护,企业需注意:

在数字化转型加速的当下&#xff0c;网络安全成为企业发展的基石。网络安全等级保护作为保障网络安全的重要举措&#xff0c;企业必须高度重视并积极落实。以下要点&#xff0c;企业在完善网络安全等级保护工作中需格外关注&#xff1a; 一、准确开展定级备案 企业首先要依据相…

Trae 04.22版本深度解析:Agent能力升级与MCP市场对复杂任务执行的革新

我正在参加Trae「超级体验官」创意实践征文&#xff0c;本文所使用的 Trae 免费下载链接&#xff1a;Trae - AI 原生 IDE 目录 引言 一、Trae 04.22版本概览 二、统一对话体验的深度整合 2.1 Chat与Builder面板合并 2.2 统一对话的优势 三、上下文能力的显著增强 3.1 W…

OceanBase 开发者大会:详解 Data × AI 战略,数据库一体化架构再升级

OceanBase 2025 开发者大会与5月17日在广州举行。这是继 4 月底 OceanBase CEO 杨冰宣布公司全面进入AI 时代后的首场技术盛会。会上&#xff0c;OceanBase CTO 杨传辉系统性地阐述了公司的 DataAI 战略&#xff0c;并发布了三大产品&#xff1a;PowerRAG、共享存储&#xff0c…

ubuntu环境下 基于Python 打包的 批量命令行可视化操作工具 GUI

文章目录 一.需求&#xff1a;二.原理支撑&#xff1a;三.简单Demo四.封装成GUI1.依赖库2.代码 五.打包成可执行文件六.命令行的配置七.运行效果 一.需求&#xff1a; 作为测试工程师&#xff0c;为了到现场高效的调试&#xff0c;部署工作&#xff0c;需要一个可视化的工具&a…

谷歌宣布推出 Android 的新安全功能,以防止诈骗和盗窃

在上周二的 Android Show 上&#xff0c;也就是Google I/O 开发者大会之前&#xff0c;谷歌宣布了 Android 的全新安全和隐私功能。这些新功能包括对通话、屏幕共享、消息、设备访问和系统级权限的全新保护。谷歌希望通过这些功能保护用户免遭诈骗&#xff0c;在设备被盗或被攻…

Qt/C++编写音视频实时通话程序/画中画/设备热插拔/支持本地摄像头和桌面

一、前言 近期有客户提需求&#xff0c;需要在嵌入式板子上和电脑之间音视频通话&#xff0c;要求用Qt开发&#xff0c;可以用第三方的编解码组件&#xff0c;能少用就尽量少用&#xff0c;以便后期移植起来方便。如果换成5年前的知识储备&#xff0c;估计会采用纯网络通信收发…

Android trace presentFence屏幕显示的帧

Android trace presentFence屏幕显示的帧 presentFence &#xff1a;当帧成功显示到屏幕时&#xff0c;present fence就会signal。 FrameMissed/GpuFrameMissed/HwcFrameMissed表示上一次合成的结果&#xff0c;当SurfaceFlinger合成后显示到屏幕上&#xff0c;present fence就…