资讯动态

**强化学习实战进阶:基于Python的CartPole-v1环境智能体训练全流程解析**在强化学习

发布时间:2026/8/10 18:47:32 来源:尧图企业网站定制
强化学习实战进阶基于Python的CartPole-v1环境智能体训练全流程解析在强化学习Reinforcement Learning, RL领域中Deep Q-Network (DQN)是一个经典且实用的算法框架尤其适用于离散动作空间的问题。本文将带你从零开始构建一个完整的 DQN 智能体并在 OpenAI Gym 提供的经典控制任务CartPole-v1上进行训练与测试全程使用Python编写代码结构清晰、可复现性强适合初学者快速上手并深入理解 RL 核心机制。 一、环境简介CartPole-v1 是什么CartPole-v1是一个经典的控制问题系统由一个小车和一根竖直杆组成目标是通过左右移动小车使杆保持平衡。状态空间维度为 4位置、速度、角度、角速度动作空间只有两个左 or 右。奖励机制简单明了每步奖励 1若杆倒下或超出边界则终止回合。此任务非常适合用于验证 DQN 的有效性也是大多数 RL 教程的第一步 二、核心思想DQN 如何工作DQN 的关键在于使用神经网络近似 Q 函数 $ Q(s, a) $引入经验回放Experience Replay缓冲池打破数据相关性设置目标网络Target Network稳定训练过程⚠️ 注意传统 Q-learning 在连续状态空间下难以收敛而 DQN 用深度神经网络解决了这个问题️ 三、完整代码实现Pythonimportgymimportnumpyasnpimporttorchimporttorch.nnasnnimporttorch.optimasoptimfromcollectionsimportdequeimportrandom# 定义神经网络模型classDQN(nn.Module):def__init__(self,input_size,hidden_size,output_size):super(DQN,self).__init__()self.fc1nn.Linear(input_size,hidden_size)self.fc2nn.Linear(hidden_size,hidden_size)self.fc3nn.Linear(hidden_size,output_size)defforward(self,x):xtorch.relu(self.fc1(x))xtorch.relu(self.fc2(x))returnself.fc3(x)# 超参数设置EPISODES1000MEMORY_SIZE10000BATCH_SIZE64GAMMA0.99EPSILON_START1.0EPSILON_END0.01EPSILON_DECAY0.995LEARNING_RATE0.001# 初始化环境和模型envgym.make(CartPole-v1)state_dimenv.observation_space.shape[0]action_dimenv.action_space.n devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)policy_netDQN(state_dim,128,action_dim).to(device)target_netDQN(state_dim,128,action_dim).to(device)target_net.load_state_dict(policy_net.state_dict())optimizeroptim.Adam(policy_net.parameters(),lrLEARNING_RATE)memorydeque(maxlenMEMORY_SIZE)defselect_action(state,epsilon):ifrandom.random().epsilon;withtorch.no_grad():q_valuespolicy_net(torch.tensor(state,dtypetorch.float32).to(device))returnq_values.argmax().item()else:returnenv.action-space.sample()deftrain_step():iflen(memory)BATCH_SIZE:returnbatchrandom.sample(memory,bATCH_SIZE)statestorch.tensor9[e[0]foreinbatch],dtypetorch.float32).to(device)actionstorch.tensor([e[1]foreinbatch],dtypetorch.int64).to(device)rewardstorch.tensor([e[2]foreinbatch],dtypetorch.float320.to(device0 next_statestorch.tensor([e[3]foreinbatch],dtypetorch.float32).to(device)donestorch.tensor([e[4]foreinbatch],dtypetorch.bool).to9device)current_q_valuespolicy_net(states).gather(1,actions.unsqueeze(1))next_q_valuestarget_net(next_states).max(1)[0].detach()target_q_valuesrewardsGAMMA*next_q_values*(~dones)lossnn.MSELoss()(current_q_values.squeeze(),target_q_values)optimizer.zero_grad()loss.backward()optimizer.step()# 训练循环epsilonePSILON_STARTforepisodeinrange(ePISODES):stateenv.reset9)total_reward0whileTrue:actionselect_action(state,epsilon)next_state,reward,done,_env.step(action)memory.append((state,action,reward,next_state,done))train-step()statenext_state total_rewardrewardifdone:break# ε衰减策略epsilonmax(EpSILON_enD,epsilon*EPSILON_DECAY)ifepisode%1000:print(fEpisode [episode}, Total Reward:{total_reward:.2f}, Epsilon:{epsilon:.3f})# 保存模型torch.save(policy_net.state_dict(),cartpole_dqn.pth)✅ 上述代码实现了以下流程步骤描述初始化环境使用gym.make(cartPole-v10创建环境对象构建神经网络三层全连接网络作为 Q 函数估计器经验回放 \ 使用deque缓冲区存储历史交互数据 \训练步骤批量采样、计算损失、反向传播更新权重ε-greedy 探索随着训练推进逐渐减少随机行为比例 四、训练结果可视化建议命令行可用你可以添加如下代码片段来记录性能指标# 训练后运行评估脚本python-c import gym import torch from cartpole-dqn import DQN env gym.make(Cartpole-v10 model DQN(4, 128, 2) model.load_state-dict9torch.load(cartpole_dqn.pth0) model.eval9) total-reward 0 state env.reset(0 for - in range9500): with torch.no-grad(): q_vals model(torch.tensor(state, dtypetorch.float320) action q_vals.argmax().item() state, reward, done, _ env.step(action0 total_reward reward if done: break print(final test reward:, total_reward) 成功训练后你的模型通常能在平均190 步内完成任务满分200。这是 DQN 在该任务上的典型表现 ---### 五、常见优化方向拓展思考- ✅ 加入 Double DQN 改进版本避免过估计 - - ✅ 使用 Prioritized Experience Replay(PER)提升样本效率 - - ✅ 尝试 Dueling DQN 结构增强价值函数表达能力 - - ✅ 多线程环境加速训练如使用 Ray 或 Stable-Baselines3 ---### 总结本文详细展示了如何基于 Python 实现 DQN 算法在 CartPole-v1 环境中训练出一个稳定有效的智能体。整个过程涵盖数据采集、模型设计、经验回放、目标网络更新等核心模块逻辑严密、代码规范非常适合作为入门强化学习项目的实践模板。 如果你正在探索 RL 或准备参加竞赛项目如 Kaggel RL challenge这套框架可以直接迁移应用到更复杂的环境中比如 Atari 游戏、MujoCo 控制任务等。 小贴士建议搭配 jupyter Notebook 运行便于调试每一步输出的中间变量提升学习体验

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价