读《强化学习的数学原理》笔记(一):基本概念与贝尔曼公式 | 一方天地

2026-08-05 探索 Python, 强化学习

读《强化学习的数学原理》(赵世钰,Springer)前两章的笔记。全书用同一个 3×3 网格世界例子贯穿所有概念,这篇笔记也沿着这条线走。

为什么要写这篇

起因是给四足机器狗训练爬楼梯。一开始只会照着开源项目改奖励权重、调学习率,跑通了却说不清"为什么这样能学会"。于是决定系统补一遍强化学习的数学原理。

前两章的内容可以概括成一句话:

策略 → 产生随机轨迹 → 得到回报 → 取期望得到状态值 → 状态值之间用贝尔曼方程自洽起来。

这篇笔记就把这句话展开。

第一章:基本概念

全书用一个贯穿始终的例子:3×3 网格世界。9 个格子(s1 到 s9),有些是禁止区、右下角是目标格,任务是找一条"好"的路径到达目标。

3×3 网格世界:禁止区、目标与一条好路径

状态、动作、策略

奖励:人机接口

奖励(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') ]

一句话直觉:一个状态的值 = 下一步的立即奖励 + γ ×(未来状态的值)

贝尔曼方程的递归结构:v(s) = r + γ·v(s')

展开第二个期望时,用到了马尔可夫性质:给定 S_{t+1}=s' 后,未来的回报与"怎么来的"无关,所以 E[G_{t+1}|S_{t+1}=s'] = vπ(s')。状态值就这样被"递归"地互相引用——这叫自助法(bootstrapping)

矩阵向量形式

把每个状态的方程并到一起:

vπ = rπ + γ · Pπ · vπ

怎么解

闭式解

vπ = (I − γ·Pπ)^(-1) · rπ

好看,但要求矩阵求逆,状态一多(n 巨大)就是 O(n³),算不动。

迭代解

v[k+1] = rπ + γ·Pπ·v[k]   (从零开始,逐轮逼近)

每轮把"未来再多看一步"的奖励加进来,逐渐逼近真值。收敛靠的是 γ<1 带来的压缩:误差每轮被乘以 γ,最终压到 0。迭代解不需要求逆、甚至不需要显式知道模型——这为后面"无模型"算法埋了伏笔。

回到机器狗

这些概念在真实项目里长什么样?以我给 GO2 机器狗训练爬楼梯的工程为例:

机器狗 ↔ MDP 映射

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       # 脚离地久 → 鼓励迈腿、学会步态

这就是"奖励 = 人机接口"的实战版。整个爬楼梯行为不是被写死的,而是被这张表"引导"出来的。你调的每一个权重,都是在跟机器人说人话。

delta = reward + gamma * next_values - values

这行就是 v(s) - (r + γ·v(s'))——贝尔曼方程 v = r + γ·P·v 的残差。整个训练过程,就是让这个残差处处趋近于 0,即用一个神经网络在所有状态上逼近满足贝尔曼方程的解。你学的"解贝尔曼方程",在真实系统里长这样:不知道模型、全靠数据、让一个函数去满足方程

总结与下一步

下一篇预告:贝尔曼最优公式(BOE)——把贝尔曼方程里的 Σa π(a|s) 换成 max_a,回答"哪个策略最优"的问题。

本文由一方天地发布 · 查看完整体验