PyTorch实战:用DQN算法教AI玩平衡杆游戏(附完整代码)

强化学习之DQN算法实战(Pytorch) 之前在博主另一篇关于Q-learning算法:https://blog.youkuaiyun.com/MR_kdcon/article/details/109612413,DQN算法是基于Q-learning算法的,关于Q-learning有兴趣的可以看一看,欢迎指出不足之处。 和上一篇Q-learning算法一样,本文也将以2个实例来学习DQN算法。 DQN,deep Qnetwork是强化学习与深度学习的一个结合,即将Q-learning算法与深度网络进行联合,从而让智能体agent进行学习。 实... 阅读详情

PyTorch实战:用DQN算法构建AI平衡杆智能体(附完整代码与可视化分析)

1. 项目概述与核心价值

CartPole平衡杆问题是强化学习领域的经典测试环境,它模拟了一个底部装有铰接杆的小车,智能体需要通过左右移动小车来保持杆子竖直。这个看似简单的任务实际上包含了状态感知、动作决策和长期奖励优化等强化学习核心问题。

深度Q网络(DQN)将传统的Q-Learning与深度学习相结合,通过神经网络近似Q值函数,解决了传统方法在连续状态空间下的维度灾难问题。PyTorch的动态计算图和自动微分机制,使得我们可以更直观地构建和调试DQN模型。本项目将实现以下技术亮点:

  • 双网络架构:分离的评估网络和目标网络设计,显著提升训练稳定性
  • 经验回放机制:打破样本间的时间相关性,提高数据利用率
  • ε-greedy策略:平衡探索与利用,避免陷入局部最优
  • 实时可视化:训练过程动态展示,直观理解算法收敛过程
import gym
import torch
import random
from collections import deque
import matplotlib.pyplot as plt

class DQNAgent:
    def __init__(self, state_size, action_size):
        self.state_size = state_size
        self.action_size = action_size
        self.memory = deque(maxlen=2000)  # 经验回放缓冲区
        self.gamma = 0.95    # 折扣因子
        self.epsilon = 1.0   # 探索率
        self.epsilon_min = 0.01
        self.epsilon_decay = 0.995
        self.learning_rate = 0.001
        self.model = self._build_model()  # 评估网络
        self.target_model = self._build_model()  # 目标网络

2. 环境解析与状态空间设计

CartPole-v1环境提供了4个维度的状态观测值:

状态参数物理意义数值范围
cart_pos小车位置[-4.8, 4.8]
cart_vel小车速度[-∞, ∞]
pole_ang杆子角度[-0.418, 0.418]弧度
pole_vel杆子角速度[-∞, ∞]

奖励函数设计为每步存活奖励+1,当出现以下情况时回合终止:

  • 杆子倾斜角度超过±12°
  • 小车移动超出轨道边界(±2.4单位)
  • 步数超过500步(v1版本)
env = gym.make('CartPole-v1')
print("观测空间:", env.observation_space)
print("动作空间:", env.action_space)

# 示例状态观测
state = env.reset()
print("初始状态示例:", state)

3. DQN网络架构与关键技术

3.1 神经网络设计

我们采用三层全连接网络作为Q函数逼近器:

  1. 输入层:4个神经元,对应环境状态维度
  2. 隐藏层:24个神经元,ReLU激活
  3. 输出层:2个神经元,对应左右动作的Q值
import torch.nn as nn

class QNetwork(nn.Module):
    def __init__(self, state_size, action_size):
        super(QNetwork, self).__init__()
        self.fc1 = nn.Linear(state_size, 24)
        self.fc2 = nn.Linear(24, 24)
        self.fc3 = nn.Linear(24, action_size)
    
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        return self.fc3(x)

3.2 经验回放实现

经验回放缓冲区存储转移样本(s, a, r, s', done),训练时随机采样小批量数据:

class ReplayBuffer:
    def __init__(self, capacity):
        self.buffer = deque(maxlen=capacity)
    
    def push(self, state, action, reward, next_state, done):
        self.buffer.append((state, action, reward, next_state, done))
    
    def sample(self, batch_size):
        return random.sample(self.buffer, batch_size)
    
    def __len__(self):
        return len(self.buffer)

3.3 训练流程关键步骤

  1. 动作选择:ε-greedy策略平衡探索与利用
  2. 目标计算:使用目标网络计算y = r + γ*maxQ(s',a')
  3. 损失函数:Huber损失减少异常值影响
  4. 网络更新:定期同步目标网络参数
def train(self, batch_size):
    if len(self.memory) < batch_size:
        return
    minibatch = self.memory.sample(batch_size)
    
    states = torch.FloatTensor([t[0] for t in minibatch])
    actions = torch.LongTensor([t[1] for t in minibatch])
    rewards = torch.FloatTensor([t[2] for t in minibatch])
    next_states = torch.FloatTensor([t[3] for t in minibatch])
    dones = torch.FloatTensor([t[4] for t in minibatch])
    
    current_q = self.model(states).gather(1, actions.unsqueeze(1))
    next_q = self.target_model(next_states).max(1)[0].detach()
    target = rewards + (1 - dones) * self.gamma * next_q
    
    loss = F.smooth_l1_loss(current_q.squeeze(), target)
    self.optimizer.zero_grad()
    loss.backward()
    self.optimizer.step()

4. 完整训练流程与超参数调优

4.1 训练参数配置

参数推荐值作用
batch_size64每次训练的样本量
gamma0.99未来奖励折扣因子
epsilon_start1.0初始探索率
epsilon_min0.01最小探索率
epsilon_decay0.995探索率衰减系数
target_update100目标网络更新间隔
lr1e-3学习率

4.2 训练监控与可视化

实时绘制两个关键指标:

  1. 回合持续时间(越长越好)
  2. 最近100轮平均得分(平滑曲线)
def plot_training(episode_durations):
    plt.figure(figsize=(10,5))
    plt.subplot(121)
    plt.plot(episode_durations)
    plt.title('Episode Durations')
    
    plt.subplot(122)
    means = [np.mean(episode_durations[max(0,i-100):i+1]) 
             for i in range(len(episode_durations))]
    plt.plot(means)
    plt.title('Last 100 Means')
    plt.tight_layout()
    plt.show()

4.3 性能优化技巧

  1. 奖励塑形:对杆子角度和小车位置设计更精细的奖励函数
  2. 网络结构调整:增加层宽或使用卷积层处理图像输入
  3. 优先经验回放:根据TD误差优先级采样重要经验
  4. 双DQN:解耦动作选择和价值评估,减少过估计
# 改进的奖励函数示例
def custom_reward(state):
    x, x_dot, theta, theta_dot = state
    r1 = (env.x_threshold - abs(x)) / env.x_threshold  # 位置奖励
    r2 = (env.theta_threshold_radians - abs(theta)) / env.theta_threshold_radians  # 角度奖励
    return r1 + r2

5. 实战演示与结果分析

经过500轮训练后,智能体通常能达到以下性能:

  • 平均存活时间 > 450步(v1版本最大500步)
  • 收敛时探索率ε ≈ 0.01
  • 训练损失稳定在0.1以下

测试时关闭探索,观察智能体控制效果:

def test_agent(env, agent, episodes=5):
    for ep in range(episodes):
        state = env.reset()
        done = False
        total_reward = 0
        
        while not done:
            env.render()
            action = agent.act(state, epsilon=0)  # 关闭探索
            state, reward, done, _ = env.step(action)
            total_reward += reward
        
        print(f"Test Episode {ep+1}, Total Reward: {total_reward}")
    env.close()

典型训练曲线展示:

  • 初期:随机策略,存活时间短(<50步)
  • 中期:快速学习阶段,性能指数级提升
  • 后期:稳定在接近最大步数,探索率降低

6. 进阶改进方向

对于希望进一步提升性能的开发者,可以考虑:

  1. Dueling DQN:分离状态价值和优势函数

    class DuelingQNetwork(nn.Module):
        def __init__(self, state_size, action_size):
            super().__init__()
            self.fc1 = nn.Linear(state_size, 64)
            self.value_stream = nn.Sequential(
                nn.Linear(64, 64),
                nn.ReLU(),
                nn.Linear(64, 1)
            )
            self.advantage_stream = nn.Sequential(
                nn.Linear(64, 64),
                nn.ReLU(),
                nn.Linear(64, action_size)
            )
        
        def forward(self, x):
            x = torch.relu(self.fc1(x))
            values = self.value_stream(x)
            advantages = self.advantage_stream(x)
            return values + (advantages - advantages.mean())
    
  2. 多步学习:使用n步回报平衡偏差和方差

  3. 噪声网络:参数空间噪声替代ε-greedy

  4. 分布式DQN:学习价值分布而不仅是期望值

实际部署时发现,当环境参数发生变化(如杆子质量改变)时,基础DQN的适应性有限。这时可以考虑结合元学习或在线微调技术提升模型的泛化能力。

用PyTorch从零实现DQN算法:以CartPole游戏为例(附完整代码) 本文以CartPole游戏为例,详细介绍了如何使用PyTorch从零实现深度Q网络算法。通过构建神经网络、经验回放池和ε-贪婪策略三大核心组件,并利用双网络结构稳定训练,手把手教你完成DQN算法的完整实现与调优,帮助读者掌握强化学习的关键实践技能。 阅读详情

相关推荐

PyTorch实战:DQN三大改进算法(DDQN、PER、Dueling DQN)深度解析

本文深度解析了DQN的三大改进算法:DDQN、PER和Dueling DQN。针对原始DQN存在的Q值高估、样本效率低和网络表征能力有限等问题,分别介绍了Double DQN如何解耦动作选择与评估以减轻高估,优先经验回放(PER)如何通过SumTree数据结构高效利用关键经验,以及Dueling DQN如何通过分离状态价值和动作优势提升网络性能。文章结合PyTorch实战代码,提供了清晰的实现思路和组合使用建议,帮助读者构建更稳定、高效的深度强化学习模型。

milk8的博客 486

PyTorch实战:用DQN算法训练智能体玩转Gym小车平衡杆(附完整代码解析)

本文详细介绍了如何使用PyTorch实现DQN算法训练智能体解决OpenAI Gym中的CartPole-v1平衡杆问题。通过完整的代码解析,涵盖了环境搭建、网络架构设计、经验回放缓冲区实现等关键步骤,并提供了训练流程可视化和超参数调优建议,帮助读者掌握强化学习实战技巧。

nept的博客 702

从Q-learning到DQN:用Python和PyTorch一步步搭建你的第一个智能体(附完整代码)

本文详细介绍了从Q-learning到深度Q网络(DQN)的演进过程,通过Python和PyTorch实战演示如何构建智能体解决CartPole游戏。内容涵盖Q-learning基础、DQN架构设计、经验回放技术以及训练流程优化,提供完整代码实现和调试技巧,帮助读者快速掌握强化学习核心技术。

weixin_30856725的博客 332

基于PyTorch的DQN算法实战:从理论到CartPole游戏实现

本文详细介绍了基于PyTorch框架实现DQN算法,并以经典CartPole游戏为例进行实战演练。内容涵盖从DQN核心原理(如经验回放和目标网络)的理解,到使用PyTorch和Gym环境一步步构建智能体、训练网络并调试优化的完整过程,是掌握深度强化学习入门的绝佳实践指南。

weixin_29084231的博客 353

PyTorch强化学习实战:DQN算法实现与调试技巧

强化学习作为机器学习的重要分支,通过智能体与环境的交互学习最优策略,在自动驾驶、游戏AI等领域具有广泛应用。其核心原理是马尔可夫决策过程(MDP),通过价值函数或策略梯度实现策略优化。PyTorch框架凭借动态计算图和自动微分机制,成为实现深度强化学习算法的首选工具。以经典的CartPole平衡问题为例,深度Q网络(DQN)通过结合Q-Learning与深度神经网络,有效解决了高维状态空间下的值函数近似问题。工程实践中需重点关注经验回放、目标网络等关键技术模块,合理设置探索率衰减、学习率等超参数。针对训练不

weixin_29079671的博客 235

强化学习核心算法解析:从DQN到PPO的实战入门指南

你好,我是专注于技术分享的博主。在探索人工智能前沿领域时,强化学习无疑是其中最激动人心、也最具挑战性的方向之一。很多开发者,尤其是刚接触这个领域的朋友,常常被其复杂的数学公式和抽象概念劝退,感觉无从下手。本文旨在为你扫清这些障碍,通过一条清晰的路径,从零开始理解强化学习的核心思想,并深入剖析DQN、PPO、A3C等经典算法。无论你是学生、算法工程师,还是对AI充满好奇的开发者,都能从本文中获得一套可理解、可复现的知识体系,为后续的科研或项目落地打下坚实基础。 1. 强化学习:从直觉到核心概念 在开始学习具体

weixin_30655569的博客 490

在快马平台10分钟搭建DQN游戏AI:零基础玩转强化学习实战

点击部署按钮时,看着自己写的AI在云端跑起来,这成就感绝了!调用Gym库的CartPole-v1环境,状态包含4个参数:杆角度、位置等。这个结合深度学习的强化学习算法,用游戏AI举例最直观——比如教AI玩平衡杆(CartPole),10分钟就能看到训练效果!在快马平台最爽的是训练完直接点【部署】,生成可交互的演示页。传统强化学习处理高维数据(如图像)很吃力,而DQN直接用神经网络拟合Q值函数,Atari游戏里打砖块、太空侵略者都能搞定。设置一个固定大小的记忆池,存储(状态,动作,奖励,下一状态)四元组。

ObsidianRaven13的博客 510

深度强化学习工程实践:从PPO、DQN算法原理到代码实现与调试

在实际工程和研究中,深度强化学习(Deep Reinforcement Learning, DRL)正从实验室走向更广泛的落地场景,从游戏AI、机器人控制到推荐系统、资源调度,其核心价值在于让智能体通过与环境的交互试错来学习最优策略。然而,对于开发者而言,从理论到实践存在一道鸿沟:算法原理看似复杂,代码实现细节繁多,环境配置、超参调试、训练不稳定等问题常常让人望而却步。本文将围绕深度强化学习的核心算法簇——包括PPO、DQN、A3C、Q-Learning等,提供一个从概念理解、环境搭建、代码实现到问题排查的

weixin_30700099的博客 309

使用PyTorch 2.8 进行强化学习开发:从DQN到PPO算法实现

本文介绍了如何在星图GPU平台上自动化部署PyTorch 2.8深度学习镜像,用于强化学习算法开发。通过该镜像,用户可以快速实现从基础DQN到先进PPO算法的完整流程,特别适用于游戏AI和机器人控制等场景。PyTorch 2.8的优化特性显著提升了强化学习模型的训练效率和稳定性。

weixin_29717341的博客 337

强化学习新手入门:从PPO、DQN到A3C,算法选择与实战指南

1. 先搞清楚强化学习到底在解决什么问题,以及为什么新手应该从这里开始 如果你刚接触强化学习,看到 PPO、DQN、A3C 这些算法名字,第一反应可能是“这么多,我该学哪个?”。很多教程一上来就堆砌公式和算法对比,反而让人更迷糊。作为过来人,我的建议是: 先别急着钻算法细节,你得先弄明白强化学习这个框架到底在解决哪一类问题,以及为什么它值得你花时间。 强化学习(Reinforcement Learning, RL)的核心思想非常直观:一个智能体(Agent)在一个环境(Environment)里,通过不断试

weixin_33739627的博客 409

从零理解强化学习:核心概念、算法演进与PPO、DQN等实战入门

最近两年,AI领域的热点似乎总在快速切换,从大语言模型到多模态,再到如今的“具身智能”。很多刚接触这个领域的朋友,看着这些新名词,常常会陷入一种困惑:这些听起来高大上的概念,到底该怎么入手?是不是需要先啃完一本几百页的教科书,才能理解其中的门道? 其实,很多前沿方向的核心思想,往往就藏在一些经典且基础的方法论里。比如“具身智能”,它强调智能体通过与环境的交互来学习和决策,这个核心范式,恰恰是 强化学习 最擅长解决的问题。你可能在各种技术新闻里见过PPO、DQN这些缩写,感觉它们既神秘又复杂。但我想说的是,理

xpp02的专栏 392

lightning-bolts与强化学习:用DQN和PPO玩转Atari游戏

lightning-bolts是一个基于PyTorch Lightning的深度学习工具库,提供了丰富的强化学习算法实现,包括DQN(深度Q网络)和PPO(近端策略优化)等主流算法,帮助开发者快速构建和训练Atari游戏AI模型。 ## 强化学习入门:从理论到实践 强化学习是一种让智能体通过与环境交互,从反馈中学习最优决策策略的机器学习方法。在Atari游戏中,智能体需要通过观察屏幕像素(状态

gitblog_00705的博客 505

SAP-PM设备模块-PM主数据之功能位置

SAP-PM模块学习

TRUIXIANG的博客 5138

深度Q网络(DQN)实战:从原理到代码实现

本文深入解析深度Q网络(DQN)的核心原理与实战实现。DQN巧妙结合强化学习与深度学习,通过经验回放、目标网络和梯度裁剪三大技术支柱,解决了传统Q学习在复杂环境中的不稳定问题。文章以CartPole-v1环境为例,提供了完整的PyTorch代码实现,并分享了关键的调参心得与常见问题排查指南,帮助读者从零构建并优化自己的DQN智能体。

gg901的博客 54

2024年全国大学生电子设计竞赛A题_AC-AC变换电路并联运行

AC-AC变换电路并联运行(A 题)【本科组】

qq_74395263的博客 7839

【AMD显卡在WIndow10/11部署带GPU支持的深度学习环境(Pytorch-DirectML篇)】

这篇是之前Tensorflow-DirectML的姊妹篇,如果对TF感兴趣的可以搜索我的博文。 首先我们丢一个官网地址,但是官网那个会误导新人如果你按那个操作的话。 https://docs.microsoft.com/en-us/windows/ai/directml/gpu-pytorch-windows 这里用我的方法操作: 首先声明一下,因为我的显卡是AMD RX6600,不带XT(性能和RTX3060 12G版本半斤八两),所以目前没有最新的WSL2驱动,如果有了的话欢迎告知我,所以我这里就.

weixin_44029053的博客 2万+

人工智能:强化学习基础——从Q-Learning到深度Q网络

本文系统介绍了深度强化学习中的Q-Learning及其进阶算法DQN。从马尔可夫决策过程等基础概念出发,详细讲解了表格型Q-Learning的实现原理,并指出其在处理高维状态时的局限性。重点阐述了DQN算法的三个核心改进:神经网络函数逼近、经验回放缓冲区和目标网络。通过PyTorch实现DQN玩CartPole游戏的完整案例,展示了状态预处理、网络架构设计和训练过程的实现细节。文章最后讨论了经典DQN的不足和改进方向,包括Double DQN和Dueling DQN等变体,为读者提供了从理论到实践的强化学习

2509_93882154的博客 792

基于AC算法的图像显著性检测及Matlab代码实现

以上是基于AC算法的图像显著性检测的Matlab代码实现。图像显著性检测是计算机视觉领域的一个重要任务,其目标是确定图像中最具有显著性的区域,即吸引人眼注意力的区域。图像显著性检测是计算机视觉领域的一个重要任务,其目标是确定图像中最具有显著性的区域,即吸引人眼注意力的区域。AC算法的原理基于人眼视觉系统的特性,人眼在观察图像时通常会先关注图像中的显著性区域,然后才会注意到其他细节。AC算法的原理基于人眼视觉系统的特性,人眼在观察图像时通常会先关注图像中的显著性区域,然后才会注意到其他细节。

TechPulseZ的博客 439

Reinforcement Learning (DQN) tutorial

Author: Adam Paszke This tutorial shows how to use PyTorch to train a Deep Q Learning (DQN) agent on the CartPole-v0 task from the OpenAI Gym. Task The agent has to decide between two actions - m

人工智能 7476

innovus:给channel加soft blockage

dbGet [dbGet top.fplan.pBlkgs.name finishfp_place_blkg_* -p].boxes就可以获得channel坐标。意思是给30um以下的channel加soft blk,至于channel的坐标,通过抓取该soft blk去获取,比较容易。工具自己加入的placement blockage命名上叫finishfp_place_blkg_*ICC2中有给channel自动加soft blockage的命令,相应的innovus也有类似的命令,我们可以使用。

m0_61544122的博客 484

KubeVela入门到精通-K8S多集群交付

KubeVela是一个功能强大、易于使用、高度可扩展的应用交付与管理平台。它基于Kubernetes和OAM 技术构建,通过开放应用模型(OAM)来作为顶层的抽像,提供了声明式部署、多集群/混合环境支 持、插件与扩展性、中心化管控以及易于使用与可观测性等特点。

小杨同学的博客 1270

5个实战项目:用Deep Learning Illustrated代码构建深度学习应用

想要快速入门深度学习?Deep Learning Illustrated项目为你提供了完美的起点!这个开源项目包含了丰富的深度学习实战代码,让你能够亲手构建AI应用。无论你是深度学习新手还是想要提升技能的开发者,这个项目都能帮助你通过实践掌握核心概念。今天我们将介绍5个精彩的实战项目,展示如何用这些代码构建真实的深度学习应用。 ## 🚀 项目概述与核心优势 Deep Learning Ill

gitblog_00169的博客 861

【人工智能论文发表】基于医学病例文本和多模态大模型的医疗影像分割方法研究

摘要:本研究提出MMS-Former,一种基于级联多模态Transformer的文本引导医学图像分割框架。该模型创新性地将临床文本信息深度融入图像分割全过程,通过SwinUNETR提取视觉特征,ClinicalBERT编码病历文本,并在解码器的每个上采样阶段通过交叉注意力模块实现多级文本特征融合。实验表明,相比纯视觉模型,MMS-Former在Dice系数和IoU指标上分别提升3%以上,在处理边界模糊目标时表现尤为突出。模型还设计了结合Dice损失和图文对比损失的复合目标函数,确保分割精度与语义对齐。代码实

u012133341的博客 141

从零掌握Tianshou强化学习:实战案例驱动的高效学习路径

你是否曾因强化学习框架过于复杂而望而却步?是否在寻找一个既强大又易用的PyTorch强化学习解决方案?今天,让我们一同探索Tianshou这个优雅的深度强化学习库,通过实际应用场景来掌握其核心精髓。 ## 为什么选择Tianshou:解决传统RL框架的痛点 传统的强化学习库往往面临三大挑战:代码复杂度高、API设计不友好、性能优化不足。Tianshou正是针对这些问题而生的解决方案。 ###

gitblog_00486的博客 912

Captcha must be filled out,解决Kaggle新用户注册无法弹出验证提示的问题

Captcha must be filled out

weixin_46713695的博客 5万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深度强化学习实战指南:从PPO、DQN到机器人控制

强化学习作为机器学习的重要分支,其核心在于智能体通过与环境的交互试错来学习最优策略。当面对高维状态空间时,深度强化学习通过神经网络强大的函数逼近能力,有效解决了传统方法的维度灾难问题。这一技术为智能决策系统提供了强大的框架,在机器人控制、游戏AI、自动驾驶等领域展现出巨大价值。本文聚焦于深度强化学习的工程实践,详细解析了PPO、DQN等核心算法,并提供了从环境配置、代码实现到调优部署的完整解决方案,旨在帮助开发者快速构建可用的智能体模型。

345

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 深入解析PCI-E接口:从1x到16x的引脚定义与性能差异
下一篇: 从AVX512到NEON:手把手教你计算不同CPU架构的FLOPS(附RK3588实测数据)
study
博客等级 码龄27年 67粉丝 1642原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值