3. 强化学习核心概念:智能体、环境、状态、动作、奖励,马尔可夫决策过程(MDP)
好,咱们进入正题。强化学习听起来玄乎,但核心骨架其实就五个词:智能体、环境、状态、动作、奖励。再加上一个数学框架——马尔可夫决策过程(MDP)。把这几个东西搞明白,后面写代码才不会晕。
我个人习惯,每接触一个新概念,先问自己三个问题:它是什么?它解决什么问题?它在代码里长什么样? 咱们今天就按这个路子来。
3.1 五个核心要素:先搭个认知框架
先看一张图,把整体关系理清楚。这是强化学习最基本的闭环:
说白了,这就是一个「试错-反馈-改进」的循环。智能体做动作,环境给反馈,智能体根据反馈调整策略。跟训练小狗握手一个道理——做对了给零食,做错了没奖励,慢慢它就懂了。
3.2 逐个拆解:从智能体到奖励
3.2.1 智能体(Agent)
智能体就是做决策的那个家伙。在代码里,它通常是一个类,里面装着策略函数。策略有两种:
- 确定性策略:给定状态 s,直接输出动作 a = μ(s)。比如「看到红灯就刹车」。
- 随机性策略:给定状态 s,输出动作的概率分布 π(a|s)。比如「有 80% 概率左转,20% 概率直行」。
我在项目中遇到过一个问题:用确定性策略训练机械臂抓取,结果每次卡在同一个位置。后来换成随机性策略,加了探索噪声,反而找到了更好的路径。嗯,这里要注意——探索和利用的平衡,后面会专门讲。
3.2.2 环境(Environment)
环境就是智能体生存的世界。它接收动作,更新状态,返回奖励。在机器人任务里,环境可能是仿真器(比如 MuJoCo、PyBullet),也可能是真实物理世界。
环境的核心是动力学模型:P(s', r | s, a)。意思是:在状态 s 执行动作 a 后,环境会转移到新状态 s',并给出奖励 r。
3.2.3 状态(State)
状态是环境在某个时刻的快照。它包含了智能体做决策需要的所有信息。对于关节标定任务,状态通常包括:
- 当前关节角度(比如 6 个关节的弧度值)
- 末端执行器位姿(x, y, z, roll, pitch, yaw)
- 目标位置
- 可能还有关节速度、力矩等
你想想看,如果状态里缺少关键信息,智能体就像蒙着眼睛走路,永远学不会。所以状态设计是强化学习落地的第一道坎。
3.2.4 动作(Action)
动作是智能体可以施加到环境上的控制信号。在机器人领域,动作空间有两种:
| 动作空间类型 | 特点 | 示例 |
|---|---|---|
| 离散动作空间 | 动作数量有限,可枚举 | 左转/右转/直行;抓取/释放 |
| 连续动作空间 | 动作是连续值,无限可能 | 关节力矩 [-10, 10] N·m;目标位置偏移量 |
关节标定任务通常是连续动作空间。比如输出 6 个关节的目标角度,每个角度在 -π 到 π 之间。处理连续动作空间,常用的算法有 DDPG、SAC、TD3,后面章节会手撕代码。
3.2.5 奖励(Reward)
奖励是智能体的「老师」。它告诉智能体刚才的动作是好是坏。奖励函数设计得好不好,直接决定训练能不能收敛。
我踩过最大的坑就是奖励函数太稀疏。比如「到达目标点给 +100,否则给 0」。结果智能体训练了 100 万步,一次目标都没碰到,永远拿不到奖励。后来改成密集奖励:
- 距离目标每靠近 1cm,给 +0.1
- 关节角度超出安全范围,给 -1
- 到达目标点,给 +10 并结束回合
效果立竿见影,训练速度快了 5 倍。
3.3 马尔可夫决策过程(MDP)
好,五个要素讲完了。现在把它们串起来,就是马尔可夫决策过程。MDP 是强化学习的数学基础,说白了就是一个五元组:
MDP = (S, A, P, R, γ)
| 符号 | 含义 | 说明 |
|---|---|---|
| S | 状态空间 | 所有可能状态的集合 |
| A | 动作空间 | 所有可能动作的集合 |
| P | 状态转移概率 | P(s' | s, a),在状态 s 执行动作 a 后转移到 s' 的概率 |
| R | 奖励函数 | R(s, a, s'),在状态 s 执行动作 a 转移到 s' 获得的奖励 |
| γ | 折扣因子 | γ ∈ [0, 1],越靠近 0 越短视,越靠近 1 越有远见 |
MDP 有一个关键性质:马尔可夫性。意思是:未来只取决于当前状态,跟过去的历史无关。用数学表达就是:
P(st+1 | st, at, st-1, at-1, ...) = P(st+1 | st, at)
为什么会这样?因为状态 st 已经包含了所有历史信息。在机器人任务里,只要你的状态设计得足够好(包含位置、速度、加速度等),马尔可夫性基本成立。
3.4 MDP 的求解目标:最大化累积奖励
智能体的目标不是拿到一次高奖励,而是长期累积奖励最大化。数学上定义了一个叫「回报」的东西:
G_t = r_t + γ·r_{t+1} + γ²·r_{t+2} + ... = Σ γ^k · r_{t+k}
折扣因子 γ 的作用很微妙:
- γ = 0:只看眼前,不管未来。适合「一步到位」的任务。
- γ = 0.9:比较有远见,但不太考虑 10 步以后的事。
- γ = 0.99:很有远见,适合长期规划任务,比如机器人走迷宫。
我一般从 γ = 0.95 开始调。如果任务需要长期规划,就往上加;如果任务比较短平快,就往下减。
3.5 从 MDP 到实际代码:一个最小示例
光说不练假把式。咱们用 Python 实现一个最简单的 MDP 环境——网格世界。智能体在 4×4 网格里移动,目标是走到右下角。
import numpy as np
class GridWorld:
def __init__(self, size=4):
self.size = size
self.state = 0 # 状态用一维索引表示
self.goal = size * size - 1 # 右下角
def reset(self):
self.state = 0
return self.state
def step(self, action):
# 动作: 0=上, 1=下, 2=左, 3=右
row = self.state // self.size
col = self.state % self.size
if action == 0: row = max(0, row - 1)
elif action == 1: row = min(self.size - 1, row + 1)
elif action == 2: col = max(0, col - 1)
elif action == 3: col = min(self.size - 1, col + 1)
self.state = row * self.size + col
# 奖励设计
if self.state == self.goal:
reward = 10.0
done = True
else:
reward = -0.1 # 每步给个小惩罚,鼓励尽快到达
done = False
return self.state, reward, done
# 测试一下
env = GridWorld()
s = env.reset()
print(f"初始状态: {s}")
for _ in range(5):
a = np.random.randint(0, 4) # 随机动作
s_next, r, done = env.step(a)
print(f"动作: {a}, 新状态: {s_next}, 奖励: {r}, 结束: {done}")
if done:
break
这个例子虽然简单,但包含了 MDP 的所有要素:状态空间(16 个格子)、动作空间(4 个方向)、转移概率(确定性的)、奖励函数(到达 +10,每步 -0.1)、折扣因子(代码里没写,但算法里会用到)。
3.6 本章小结
咱们把这一章的核心内容捋一遍:
- 五个要素:智能体做决策,环境给反馈,状态描述现状,动作改变现状,奖励评价好坏。
- MDP 五元组:(S, A, P, R, γ),是强化学习的数学骨架。
- 马尔可夫性:未来只取决于当前状态,不依赖历史。
- 求解目标:最大化带折扣的累积奖励。
- 奖励设计:密集奖励 > 稀疏奖励,简单 > 复杂。