读《强化学习的数学原理》笔记(一):基本概念与贝尔曼公式 | 一方天地
读《强化学习的数学原理》(赵世钰,Springer)前两章的笔记。全书用同一个 3×3 网格世界例子贯穿所有概念,这篇笔记也沿着这条线走。
为什么要写这篇
起因是给四足机器狗训练爬楼梯。一开始只会照着开源项目改奖励权重、调学习率,跑通了却说不清"为什么这样能学会"。于是决定系统补一遍强化学习的数学原理。
前两章的内容可以概括成一句话:
策略 → 产生随机轨迹 → 得到回报 → 取期望得到状态值 → 状态值之间用贝尔曼方程自洽起来。
这篇笔记就把这句话展开。
第一章:基本概念
全书用一个贯穿始终的例子:3×3 网格世界。9 个格子(s1 到 s9),有些是禁止区、右下角是目标格,任务是找一条"好"的路径到达目标。

状态、动作、策略
- 状态(state):智能体相对环境的"处境"。网格世界里就是当前位置,状态空间 S = {s1, s2, ..., s9}。
- 动作(action):每个状态能做的事。网格世界有 5 个动作:上/右/下/左/原地不动,动作空间 A(s)。
- 状态转移概率 p(s'|s,a):在状态 s 做动作 a,转移到 s' 的概率。可以是确定的,也可以是随机的。
- 策略(policy) π(a|s):在状态 s 选择动作 a 的概率。策略就是智能体的"行为规则"。
奖励:人机接口
奖励(reward) 是做完动作后拿到的实数,正数鼓励、负数惩罚。网格世界里:出界 -1、进禁止区 -1、到达目标 +1、其他 0。
关键是理解奖励的定位:它是"人机接口"。我们设计奖励,就是在引导智能体做出期望的行为——"进禁区扣分、到目标加分",智能体就会学会避开禁区、奔向目标。你给它什么奖励,它就成为什么样子。后面机器狗项目里那条长得吓人的奖励表,本质和这个 3×3 网格一模一样。
回报、折扣回报
轨迹(trajectory) 是"状态 → 动作 → 奖励 → 状态…"的链条:
s1 --a2, r=0--> s2 --a3, r=0--> s5 --a3, r=0--> s8 --a2, r=1--> s9
回报(return) 是这条轨迹上所有奖励之和,用来评价策略好坏。但轨迹可能无限长(到达目标后一直拿 +1),回报会发散,所以引入折扣率 γ(γ∈[0,1)):
G_t = R_{t+1} + γ·R_{t+2} + γ²·R_{t+3} + ...
γ 的作用有两个:让无限和收敛(几何级数),以及平衡远近——γ 接近 0 只看重近期奖励,接近 1 则远期奖励也很重要。
马尔可夫决策过程(MDP)
把所有概念装进一个框架,就是 MDP:状态集 S、动作集 A(s)、转移概率 p(s'|s,a)、奖励概率 p(r|s,a)、策略 π(a|s)。
再配上马尔可夫性质(无记忆性):
p(S_{t+1} | S_t, A_t, S_{t-1}, A_{t-1}, ...) = p(S_{t+1} | S_t, A_t)
即"未来只依赖当前,不依赖历史"。一个重要的推论是:策略一旦给定,MDP 就退化成只含状态的马尔可夫过程,转移概率变成
pπ(s'|s) = Σa π(a|s)·p(s'|s,a)
动作在这里"消失"了——因为策略已经把动作按概率加权平均掉了。这个公式在第二章还会再见到。
第二章:贝尔曼公式
为什么需要状态值
上一章说"回报评价策略",但轨迹是随机的——回报 G_t 是个随机变量,只看一条轨迹不靠谱。所以取期望,定义状态值:
vπ(s) = E[ G_t | S_t = s ]
也就是"从状态 s 出发、按策略 π 走下去,平均能拿多少折扣回报"。类似地还有动作值:
qπ(s,a) = E[ G_t | S_t = s, A_t = a ]
区别:v 是"动作由 π 替你选",q 是"先定死做动作 a、之后才由 π 接管"。两者互为表里:
vπ(s) = Σa π(a|s) · qπ(s,a)
推导:回报的递归结构
回报的定义可以"抽出第一项":
G_t = R_{t+1} + γ·(R_{t+2} + γ·R_{t+3} + ...) = R_{t+1} + γ·G_{t+1}
代入状态值定义,拆成两个期望:
vπ(s) = E[ R_{t+1} | S_t=s ] + γ · E[ G_{t+1} | S_t=s ]
(前一项:立即奖励;后一项:未来奖励)
把两个期望分别展开,就得到逐元素形式的贝尔曼方程:
vπ(s) = Σa π(a|s) · [ Σr p(r|s,a)·r + γ · Σs' p(s'|s,a)·vπ(s') ]
一句话直觉:一个状态的值 = 下一步的立即奖励 + γ ×(未来状态的值)。

展开第二个期望时,用到了马尔可夫性质:给定 S_{t+1}=s' 后,未来的回报与"怎么来的"无关,所以 E[G_{t+1}|S_{t+1}=s'] = vπ(s')。状态值就这样被"递归"地互相引用——这叫自助法(bootstrapping)。
矩阵向量形式
把每个状态的方程并到一起:
vπ = rπ + γ · Pπ · vπ
- rπ:每个状态期望立即奖励组成的向量
- Pπ:给定策略后的转移概率矩阵,它的第 i 行第 j 列是 pπ(sj|si),每行之和为 1——就是上一章那个"退化成马尔可夫过程"的转移矩阵
怎么解
闭式解:
vπ = (I − γ·Pπ)^(-1) · rπ
好看,但要求矩阵求逆,状态一多(n 巨大)就是 O(n³),算不动。
迭代解:
v[k+1] = rπ + γ·Pπ·v[k] (从零开始,逐轮逼近)
每轮把"未来再多看一步"的奖励加进来,逐渐逼近真值。收敛靠的是 γ<1 带来的压缩:误差每轮被乘以 γ,最终压到 0。迭代解不需要求逆、甚至不需要显式知道模型——这为后面"无模型"算法埋了伏笔。
回到机器狗
这些概念在真实项目里长什么样?以我给 GO2 机器狗训练爬楼梯的工程为例:

- 状态 = 观测向量:约 45 维,包含速度指令、IMU 角速度与姿态、12 个关节角度与角速度、上一步动作。工程师精心设计观测,就是为了让马尔可夫性质成立——只给关节角度不给角速度,狗就不知道自己"往哪转",学不会。
- 动作 = 12 个关节目标角度:四条腿 × 3 关节,通过 PD 控制器转成电机力矩。
- 策略 = 一个神经网络:输入观测、输出动作分布 π(a|s)。(怎么训练它属于后面的章节。)
- 奖励 = 那张权重表:
tracking_lin_vel = 1.0 # 前进跟随指令 → 鼓励往前走
tracking_ang_vel = 0.5 # 转向跟随指令
lin_vel_z = -2.0 # 惩罚上下颠簸 → 不让它蹦
orientation = -0.2 # 惩罚机身倾斜 → 不让它翻
base_height = -1.0 # 惩罚身体高度偏离目标
collision = -1.0 # 惩罚撞地
feet_air_time = 1.0 # 脚离地久 → 鼓励迈腿、学会步态
这就是"奖励 = 人机接口"的实战版。整个爬楼梯行为不是被写死的,而是被这张表"引导"出来的。你调的每一个权重,都是在跟机器人说人话。
- 折扣 γ = 0.99:每回合 20 秒、每步 0.02 秒,约 1000 步。γ^1000 ≈ 4×10^-5——半回合之后的奖励几乎被折扣成 0,所以狗学出来的是"短期眼光"。
- 贝尔曼方程:训练代码里有这么一行
delta = reward + gamma * next_values - values
这行就是 v(s) - (r + γ·v(s'))——贝尔曼方程 v = r + γ·P·v 的残差。整个训练过程,就是让这个残差处处趋近于 0,即用一个神经网络在所有状态上逼近满足贝尔曼方程的解。你学的"解贝尔曼方程",在真实系统里长这样:不知道模型、全靠数据、让一个函数去满足方程。
总结与下一步
- 第一章给了零件:状态、动作、策略、奖励、回报、折扣、MDP、马尔可夫性质。
- 第二章给了主梁:状态值、动作值,以及把它们自洽起来的贝尔曼方程 vπ = rπ + γ·Pπ·vπ,并给出两种解法。
- 两条主线始终没变:奖励是人机接口、γ<1 是收敛与折扣的根源。
下一篇预告:贝尔曼最优公式(BOE)——把贝尔曼方程里的 Σa π(a|s) 换成 max_a,回答"哪个策略最优"的问题。