基于 Stable-Baselines3 的强化学习算法实验:DQN、PPO 与 SAC 在 CartPole、Acrobot 和 Pendulum 环境中的对比
1. CartPole-v1
CartPole 是强化学习中最经典的入门环境之一,中文可以理解为“倒立摆小车问题”。环境中有一辆可以左右移动的小车,小车上连接着一根可以自由摆动的杆。智能体的目标是通过控制小车向左或向右移动,使杆尽可能长时间保持竖直不倒。
这个环境的动作空间是离散的,智能体每一步只能选择两个动作之一:向左推小车或向右推小车。因此,CartPole 特别适合用于测试 DQN 这类离散动作算法,也适合用 PPO 进行基础策略学习。
CartPole 的任务难度相对较低,奖励机制也比较直观:只要杆没有倒下,小车没有超出边界,智能体每坚持一步就会获得奖励。因此,如果算法正常工作,训练曲线通常会比较快上升,最终可以接近满分表现。
在本实验中,CartPole 主要用于验证强化学习算法是否能够在简单离散控制任务中快速收敛。
2. Acrobot-v1
Acrobot 是一个比 CartPole 更难的离散动作控制环境。它由两个连接在一起的连杆组成,类似一个双节摆,但只有中间的关节可以施加力矩,底部关节是固定的。智能体的目标是通过不断摆动,让末端连杆达到指定高度。
Acrobot 的难点在于它不是直接把末端拉上去,而是需要先通过来回摆动积累能量,再利用惯性把末端甩到目标高度。因此,这个任务比 CartPole 更考验算法的长期决策能力。
Acrobot 的动作空间也是离散的,通常包括向一个方向施加力矩、不施加力矩、向反方向施加力矩。由于奖励通常是负值,智能体的目标不是“拿到更多正奖励”,而是尽快完成任务,从而减少累计负奖励。
在本实验中,Acrobot 可以作为一个更复杂的离散控制任务,用来观察 DQN 和 PPO 在难度更高的环境中是否还能稳定学习。
3. Pendulum-v1
Pendulum 是一个连续动作控制环境,中文可以理解为“单摆控制问题”。环境中有一根摆杆,智能体需要通过施加连续力矩,让摆杆从下垂状态逐渐摆动到竖直向上的位置,并尽量保持稳定。
和 CartPole、Acrobot 不同,Pendulum 的动作不是简单的“左”或“右”,而是一个连续数值,例如施加多大的力矩。因此,Pendulum 更适合用于测试连续动作算法,比如 SAC 和 PPO。
Pendulum 的奖励通常也是负值,越接近 0 表示控制效果越好。奖励会综合考虑摆杆角度、角速度和施加力矩的大小。如果摆杆离竖直目标越近、速度越稳定、控制力矩越合理,最终获得的负奖励就越小。
在本实验中,Pendulum 主要用于测试算法在连续动作空间中的控制能力。特别是 SAC 算法,它本身适合连续动作控制任务,因此在 Pendulum 上通常能取得比 PPO 更稳定的表现。
| 环境 | 动作空间 | DQN | PPO | SAC |
|---|---|---|---|---|
| CartPole-v1 | 离散 | 可用 | 可用 | 不适合 |
| Acrobot-v1 | 离散 | 可用 | 可用 | 不适合 |
| Pendulum-v1 | 连续 | 不适合 | 可用 | 可用 |
PPO跑CartPole:


DQN跑CartPole:


PPO跑Acrobot:


DQN跑Acrobot:


DQN和PPO跑Acrobot的评估:
PPO跑Pendulum:


SAC跑Pendulum:



参数解释:
Eval num_timesteps=100000, episode_reward=-122.18 +/- 4.20
Episode length: 200.00 +/- 0.00
意思是:模型训练到 100000 步 时,系统自动评估了一次。平均回合奖励是 -122.18,波动大约是 ±4.20。Pendulum 的奖励本来就是负数,越接近 0 越好。Episode length = 200 是因为 Pendulum-v1 每局最多 200 步,所以这个值固定为 200,不代表失败。
eval/
mean_ep_length 200
mean_reward -122
是刚才评估结果的表格版。mean_reward=-122 就是评估平均奖励,mean_ep_length=200 是评估时每局平均长度。
然后是训练过程中的损失:
train/
actor_loss 18.7
critic_loss 0.44
ent_coef 0.0139
ent_coef_loss -1.3
learning_rate 0.0003
n_updates 98999
actor_loss 是策略网络的损失。SAC 里面 actor 负责决定动作,也就是摆杆每一步施加多大力矩。这个值本身不是越小越好,不能单独用它判断训练好坏。
critic_loss 是价值网络,也就是 Q 网络的损失。它用于估计某个状态和动作的长期收益。你这里是 0.44,没有明显爆炸,说明训练是稳定的。
ent_coef 是熵系数,也可以理解为 SAC 的探索强度参数。数值越大,模型越倾向于探索;数值变小,说明策略逐渐稳定。
ent_coef_loss 是熵系数自己的优化损失,不用重点看。
learning_rate=0.0003 就是学习率,来自你脚本里 SAC 的设置。
n_updates=98999 是神经网络已经更新了多少次。你训练总步数是 100000,SAC 设置了 learning_starts=1000,也就是前 1000 步主要先收集经验,之后基本每步更新一次,所以大约 99000 次更新是合理的。
rollout/
ep_len_mean 200
ep_rew_mean -133
rollout 是训练过程中智能体实际和环境交互得到的数据。ep_len_mean=200 表示最近一批训练回合平均长度是 200 步。ep_rew_mean=-133 表示最近训练回合的平均奖励大约是 -133。
这里有一个小区别:eval/mean_reward=-122 是专门评估时的结果;rollout/ep_rew_mean=-133 是训练过程中收集数据的平均表现。一般写实验结果时,优先看 eval/mean_reward,因为评估时通常更稳定、更标准。
最后是时间信息:
time/
episodes 500
fps 25
time_elapsed 3790
total_timesteps 100000
episodes=500 表示训练期间一共跑了 500 局。因为 Pendulum 每局 200 步,500 × 200 = 100000,刚好对应你的总训练步数。
fps=25 表示每秒大约训练 25 个环境步。这个速度偏慢一点,但不影响结果。
time_elapsed=3790 表示训练总耗时 3790 秒,大约是 63 分钟。
total_timesteps=100000 就是你设置的训练总步数。
更多推荐



所有评论(0)