在强化学习中,状态空间(Observation Space)和动作空间(Action Space)是两个基础概念。理解这两个空间,就等于弄清楚“模型看到了什么”和“模型可以做什么”。
在本项目中,我们使用的是基于图像和传感器输入的强化学习模型,用于端到端的控制任务,如预测方向、速度或操作行为。下面我们从通用概念讲起,最后具体说明本项目的定义。
状态空间(Observation Space)
状态空间描述了智能体每一步能从环境中获取到的“状态信息”。这些信息构成了模型的输入,可以是一个向量,也可以是图像、组合信号等。
常见类型:
类型 | 示例 | 含义说明 |
---|---|---|
Box(4,) |
[-4.8, 4.8] × 4 |
连续变量向量,如位置、速度等 |
Box(84, 84, 3) |
图像输入 | 视觉输入,常用于端到端控制 |
Dict(...) |
多通道输入 | 图像 + 雷达 + IMU 组合观测 |
本项目中的状态空间定义:
在本项目中,我们的状态空间通常包括:
- 图像帧:从机器人前置摄像头获取的 RGB 图像(如
(224, 224, 3)
) - 附加状态向量(可选):如上一帧速度、转角、航向角等传感器读数
状态空间结构可能是:
Box(low=0, high=255, shape=(224, 224, 3), dtype=np.uint8)
或
Dict({
"image": Box(...),
"speed": Box(...),
"yaw": Box(...)
})
动作空间(Action Space)
动作空间描述了模型每一步可以采取的动作范围,也就是输出的结构。
常见类型:
类型 | 示例 | 用途说明 |
---|---|---|
Discrete(n) |
Discrete(3) |
离散控制,如左、右、直行 |
Box(...) |
Box(-1, 1, (2,), float32) |
连续动作,如转角和加速度控制 |
MultiBinary(n) |
MultiBinary(5) |
多位二进制开关组合 |
本项目中的动作空间定义:
我们通常使用连续动作空间来控制机器人,例如:
Box(low=np.array([-1.0, -1.0]), high=np.array([1.0, 1.0]), dtype=np.float32)
这表示:
- 第一个输出控制方向角(steering angle),范围 [-1, 1]
- 第二个输出控制加速度或速度,范围 [-1, 1]
动作会经过缩放,映射到实际的执行命令中,例如 [-1, 1] → [-30°, 30°]。
状态空间和动作空间如何影响模型设计?
-
模型输入必须匹配状态空间结构
- 图像输入通常使用卷积神经网络(CNN)提取空间特征
- 结构化向量信息则传入多层感知机(MLP)网络,MLP 是一种基本的前馈神经网络,由多个全连接层组成,适合处理低维向量输入 [1]
-
模型输出应匹配动作空间格式
- 如果是
Discrete
,通常用 softmax 输出多个动作概率 - 如果是
Box
,使用连续输出(如 tanh 激活)限定在动作范围内
- 如果是
示例:一个典型训练循环
obs, _ = env.reset()
for step in range(200):
action = policy(obs) # 模型根据 obs 生成动作
obs, reward, done, truncated, _ = env.step(action)
if done or truncated:
break
obs
来自状态空间定义,action
必须符合动作空间定义。两者必须和 env.observation_space
与 env.action_space
严格匹配。
总结
- 状态空间是模型的输入接口,反映了它感知世界的能力
- 动作空间是模型的输出接口,决定了它的控制能力
在实际项目中,状态空间和动作空间的设计直接决定了强化学习能否有效应用在任务中。理解它们,是进入 DRL 项目开发的第一步。
参考资料: [1] Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press. (第 6 章,Multilayer Perceptrons)