第1章:环境搭建与工具链
说实话,做强化学习最让人头疼的往往不是算法本身,而是环境搭不起来。我见过太多人卡在安装这一步,一卡就是半天。今天咱们就把这事彻底搞定。
1.1 Gymnasium库:强化学习的“健身房”
Gymnasium是 Gym的继承者,说白了就是一套标准化的环境接口。你想想看,如果没有统一接口,每个算法都要适配不同的环境,那得多痛苦?
安装其实很简单:
pip install gymnasium
如果你想玩经典控制问题,再加个:
pip install gymnasium[classic-control]
我个人习惯用conda创建虚拟环境再装,避免污染全局Python。嗯,这里要注意,如果你用的是Python 3.11以上版本,有些依赖可能还没完全适配,建议先用3.10。
gymnasium.make("CartPole-v1"),如果能正常创建环境,说明安装成功了。
1.2 Stable-Baselines3:拿来即用的算法库
Stable-Baselines3(简称SB3)是目前最流行的强化学习算法库之一。它把PPO、DQN、A2C这些经典算法都封装好了,你直接调用就行。
安装命令:
pip install stable-baselines3
我在项目中遇到过一个问题:SB3对PyTorch版本有要求。如果你先装了PyTorch 2.0以上版本,再装SB3可能会报错。解决方案是先装SB3,让它自动帮你装好兼容的PyTorch版本。
pip install stable-baselines3[extra] 安装完整版,它会自动处理依赖。
1.3 自定义环境入门
很多时候,现成的环境满足不了你的需求。比如你想让机器人走迷宫,或者让游戏角色学会跳跃——这时候就需要自定义环境了。
自定义环境的核心是继承 gymnasium.Env 类,然后实现几个关键方法:
import gymnasium as gym
from gymnasium import spaces
import numpy as np
class MyEnv(gym.Env):
def __init__(self):
super().__init__()
# 定义动作空间和观察空间
self.action_space = spaces.Discrete(2)
self.observation_space = spaces.Box(
low=-1.0, high=1.0, shape=(4,), dtype=np.float32
)
def reset(self, seed=None, options=None):
# 重置环境状态
return self._get_obs(), {}
def step(self, action):
# 执行动作,返回新状态、奖励、是否结束等信息
return self._get_obs(), reward, terminated, truncated, {}
def _get_obs(self):
# 获取当前观察
return np.array([...], dtype=np.float32)
你想想看,这个结构其实很清晰:reset 负责初始化,step 负责推进,_get_obs 负责返回当前状态。说白了就是一个“状态机”。
1.4 常见环境介绍
咱们先认识两个最经典的环境,它们就像强化学习界的“Hello World”。
CartPole(倒立摆)
任务很简单:控制小车左右移动,让杆子保持直立。状态空间是4维的(小车位置、速度、杆子角度、角速度),动作空间是2维的(左、右)。
这个环境我特别喜欢用来快速验证算法。为什么?因为它收敛快,几分钟就能看到效果。如果你连CartPole都训练不好,那算法大概率有问题。
MountainCar(山地车)
任务是把小车从山谷底部开到山顶。难点在于:小车动力不足,必须来回摆动积累能量。状态空间是2维的(位置、速度),动作空间是3维的(左、不动、右)。
这个环境比CartPole难一些。我记得第一次跑MountainCar时,看着小车在山谷里来回晃悠,就是上不去,急得不行。后来才发现,这个环境需要更长的训练时间,而且奖励设计很稀疏——只有到达山顶才有正奖励。
| 环境名称 | 状态维度 | 动作维度 | 难度 | 典型应用 |
|---|---|---|---|---|
| CartPole-v1 | 4 | 2(离散) | 简单 | 算法快速验证 |
| MountainCar-v0 | 2 | 3(离散) | 中等 | 稀疏奖励问题 |
| Acrobot-v1 | 6 | 3(离散) | 中等 | 多关节控制 |
| LunarLander-v2 | 8 | 4(离散) | 较难 | 连续控制入门 |
1.5 本章知识体系
下面这张图帮你理清本章的核心逻辑:
这张图把本章的核心逻辑串起来了。你看,Gymnasium提供环境接口,SB3提供算法实现,自定义环境则让你能解决实际问题。三者缺一不可。