智能体(Agent)开发入门:基于PyTorch与强化学习库的实战

张开发
2026/6/29 10:17:48 15 分钟阅读
智能体(Agent)开发入门:基于PyTorch与强化学习库的实战
智能体Agent开发入门基于PyTorch与强化学习库的实战1. 为什么学习智能体开发最近几年智能体技术越来越火。从游戏AI到自动驾驶从聊天机器人到自动化交易系统智能体正在改变我们与技术互动的方式。简单来说智能体就是一个能感知环境、做出决策并采取行动的程序。强化学习是训练智能体的主要方法之一。通过PyTorch这样的深度学习框架配合Gymnasium这样的强化学习环境库我们可以相对轻松地构建和训练自己的智能体。今天我们就从最经典的CartPole平衡问题开始带你一步步搭建你的第一个智能体。2. 环境准备与快速部署2.1 安装必要工具首先确保你已经安装了Python 3.8或更高版本。然后创建一个新的虚拟环境python -m venv rl_env source rl_env/bin/activate # Linux/Mac rl_env\Scripts\activate # Windows接下来安装必要的库pip install torch gymnasium matplotlib2.2 验证环境让我们先快速验证一下环境是否正常工作import gymnasium as gym env gym.make(CartPole-v1) observation, info env.reset() print(初始观察值:, observation) env.close()如果运行后看到类似初始观察值: [-0.012 0.041 -0.03 0.039]的输出说明环境已经正确安装。3. 理解CartPole问题CartPole是一个经典的强化学习测试环境。问题描述很简单一个小车可以在轨道上左右移动车上有一根可以自由旋转的杆子。你的目标是控制小车移动让杆子保持直立不倒。环境会给你4个观察值小车位置小车速度杆子角度杆子顶端速度你的智能体需要根据这些观察值决定是向左推(0)还是向右推(1)小车。每保持杆子直立一步就会得到1分的奖励。如果杆子倾斜超过15度或者小车移动超过轨道边界游戏就结束了。4. 构建智能体的大脑4.1 设计策略网络我们的智能体需要一个大脑来做决策。这里我们用一个简单的神经网络import torch import torch.nn as nn import torch.nn.functional as F class PolicyNetwork(nn.Module): def __init__(self): super().__init__() self.fc1 nn.Linear(4, 128) # 输入层4个观察值 self.fc2 nn.Linear(128, 2) # 输出层2个动作 def forward(self, x): x F.relu(self.fc1(x)) x F.softmax(self.fc2(x), dim-1) return x这个网络接收4个观察值经过一个128个神经元的隐藏层最后输出两个动作的概率分布。4.2 理解网络输出网络最后使用了softmax激活函数这意味着它会输出两个动作的概率。比如可能输出[0.7, 0.3]表示有70%的概率选择动作0(左推)30%的概率选择动作1(右推)。这种概率性的选择在强化学习中很重要因为它允许智能体探索不同的动作而不是总是选择当前看起来最好的动作。5. 训练智能体5.1 训练循环的基本结构训练一个强化学习智能体通常包含以下几个步骤让智能体与环境交互收集经验根据这些经验计算好动作和不好动作调整网络参数使智能体更倾向于选择好动作重复上述过程让我们来实现这个训练循环def train(env, policy, episodes1000, learning_rate0.01): optimizer torch.optim.Adam(policy.parameters(), lrlearning_rate) for episode in range(episodes): obs, _ env.reset() done False rewards [] log_probs [] # 与环境交互 while not done: obs_tensor torch.FloatTensor(obs) action_probs policy(obs_tensor) # 根据概率选择动作 action torch.multinomial(action_probs, 1).item() log_prob torch.log(action_probs[action]) obs, reward, terminated, truncated, _ env.step(action) done terminated or truncated rewards.append(reward) log_probs.append(log_prob) # 计算并应用梯度 returns [] R 0 for r in reversed(rewards): R r 0.99 * R # 折扣因子0.99 returns.insert(0, R) returns torch.FloatTensor(returns) returns (returns - returns.mean()) / (returns.std() 1e-9) policy_loss [] for log_prob, R in zip(log_probs, returns): policy_loss.append(-log_prob * R) optimizer.zero_grad() loss torch.stack(policy_loss).sum() loss.backward() optimizer.step() if episode % 50 0: print(fEpisode {episode}, 总奖励: {sum(rewards)})5.2 开始训练现在我们可以创建环境实例和策略网络然后开始训练env gym.make(CartPole-v1) policy PolicyNetwork() train(env, policy, episodes1000)训练过程中你会看到每50个episode输出一次总奖励。随着训练进行这个数字应该会逐渐增加说明智能体正在学习如何保持杆子平衡。6. 测试训练效果训练完成后让我们看看智能体的表现def test(env, policy, episodes10): for episode in range(episodes): obs, _ env.reset() done False total_reward 0 while not done: obs_tensor torch.FloatTensor(obs) action_probs policy(obs_tensor) action torch.argmax(action_probs).item() obs, reward, terminated, truncated, _ env.step(action) done terminated or truncated total_reward reward print(f测试Episode {episode}, 总奖励: {total_reward}) test(env, policy)理想情况下经过足够训练后智能体应该能在大多数测试中达到200分的满分(这是CartPole-v1环境的最高分限制)。7. 可视化训练过程为了更直观地理解训练过程我们可以绘制奖励随训练次数的变化import matplotlib.pyplot as plt def train_with_logging(env, policy, episodes1000): # ... (与之前相同的训练代码但添加以下内容) episode_rewards [] for episode in range(episodes): # ... (之前的训练循环代码) episode_rewards.append(sum(rewards)) plt.plot(episode_rewards) plt.xlabel(Episode) plt.ylabel(Total Reward) plt.title(训练过程) plt.show() env gym.make(CartPole-v1) policy PolicyNetwork() train_with_logging(env, policy)这张图会显示智能体的表现如何随着训练逐步提升。一开始奖励可能很低随着训练进行曲线应该会稳步上升。8. 下一步学习建议现在你已经成功训练了第一个强化学习智能体如果想继续深入学习可以考虑以下方向尝试更复杂的环境如LunarLander或Atari游戏实现更高级的算法如DQN、PPO或SAC添加经验回放(experience replay)机制尝试连续动作空间的问题探索多智能体强化学习强化学习是一个广阔的领域这个简单的CartPole示例只是冰山一角。随着你深入学习你会发现更多有趣且具有挑战性的问题等待解决。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章