第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版本。

避坑指南: 我曾经因为版本不匹配,训练出来的模型完全没法用。后来发现是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 环境接口标准 Stable-Baselines3 算法实现库 自定义环境 继承Env类 安装配置 环境接口 经典环境 算法封装 版本兼容 训练接口 空间定义 状态管理 奖励设计 三者结合:Gymnasium提供环境 → SB3提供算法 → 自定义环境扩展应用

这张图把本章的核心逻辑串起来了。你看,Gymnasium提供环境接口,SB3提供算法实现,自定义环境则让你能解决实际问题。三者缺一不可。

总结一下: 环境搭建是强化学习的第一步,也是最容易踩坑的一步。先把Gymnasium和SB3装好,跑通CartPole,再尝试自定义环境。别一上来就搞复杂项目,容易劝退。

可可精品资料库