本文最后更新于 2026年7月22日 下午
赵老师开源的 Github 仓库、赵老师的 B站 课程视频
背景来自 XHS 马大可
Overview
Outline:
- 值迭代算法(Value iteration algorithm)
- 策略迭代算法(Policy iteration algorithm)
- 截断策略迭代算法(Truncated policy iteration algorithm)
Lec 12 值迭代算法
算法来源
回顾上一节,如何求解贝尔曼最优方程?
v=f(v)=πmax(rπ+γPπv)
压缩映射定理给出了一个迭代算法:
vk+1=f(vk)=πmax(rπ+γPπvk),k=1,2,3,…
其中,v0 可以任意选取。
该算法最终能找到最优状态值和最优策略。这就是 值迭代算法!
两步分解
算法 vk+1=f(vk)=maxπ(rπ+γPπvk) 可分解为两步:
问题:vk 是一个真实的 state value 吗?
- 不是,这里的 vk 就只是一个单纯的向量,就是一个值,并不是 state value!因为不能保证 vk 满足贝尔曼方程。
元素形式
步骤1:策略更新
原方程 πk+1=argmaxπ(rπ+γPπvk) 的元素形式为,
πk+1(s)=πargmaxa∑π(a∣s)qk(s,a)[r∑p(r∣s,a)r+γs′∑p(s′∣s,a)vk(s′)],s∈S
最优策略为
πk+1(a∣s)={10a=ak⋆(s)a=ak⋆(s)
其中,ak⋆(s)=argmaxaqk(s,a). πk+1 称为 贪心策略(greedy policy),因为它简单地选择最大的 q 值。
步骤2:值更新
原方程 vk+1=f(vk)=maxπ(rπ+γPπvk) 的元素形式为,
vk+1(s)=a∑πk+1(a∣s)qk(s,a)[r∑p(r∣s,a)r+γs′∑p(s′∣s,a)vk(s′)],s∈S=amaxqk(s,a)
最后一个等号是因为我们选取的 πk+1 是 贪心 的!
伪代码
整体过程:
vk(s)→qk(s,a)→贪心策略 πk+1(a∣s)→更新值 vk+1=amaxqk(s,a)
值迭代算法
-
初始化:已知概率模型 p(r∣s,a) 和 p(s′∣s,a),初始猜测 v0。
-
目标:搜索求解贝尔曼最优方程的最优状态值和最优策略。
-
当 vk 未收敛时(∥vk−vk−1∥>ϵ,ϵ 是预设阈值),
执行第 k 次迭代:
- 对每个状态 s∈S:
- 对每个动作 a∈A(s):
- 计算 q-value:qk(s,a)=∑rp(r∣s,a)r+γ∑s′p(s′∣s,a)vk(s′)
- 贪心策略:ak⋆(s)=argmaxaqk(s,a)
- 策略更新:πk+1(a∣s)=1 若 a=ak⋆,否则为 0
- 值更新:vk+1(s)=maxaqk(s,a)
例子
继续沿用 rboundary=rforbidden=−1,rtarget=1,折扣率为 γ=0.9。
(a) 策略;(b) 第一次迭代得到的策略;(c) 第二次迭代得到的策略
可以列出 Q-表: q(s,a) 的表达式。
| q-value |
a1 |
a2 |
a3 |
a4 |
a5 |
| s1 |
−1+γv(s1) |
−1+γv(s2) |
0+γv(s3) |
−1+γv(s1) |
0+γv(s1) |
| s2 |
−1+γv(s2) |
−1+γv(s2) |
1+γv(s4) |
0+γv(s1) |
−1+γv(s2) |
| s3 |
0+γv(s1) |
1+γv(s4) |
−1+γv(s3) |
−1+γv(s3) |
0+γv(s3) |
| s4 |
−1+γv(s2) |
−1+γv(s4) |
−1+γv(s4) |
0+γv(s3) |
1+γv(s4) |
当 k=0 时
令 v0(s1)=v0(s2)=v0(s3)=v0(s4)=0
| q-value |
a1 |
a2 |
a3 |
a4 |
a5 |
| s1 |
−1 |
−1 |
0 |
−1 |
0 |
| s2 |
−1 |
−1 |
1 |
0 |
−1 |
| s3 |
0 |
1 |
−1 |
−1 |
0 |
| s4 |
−1 |
−1 |
−1 |
0 |
1 |
k=0 时,对应的 q(s1,a) 在 a3、a5 处同时取到最大,随便选取一个即可,此处取 s5
步骤 1:策略更新
π1(a5∣s1)=1,π1(a3∣s2)=1,π1(a2∣s3)=1,π1(a5∣s4)=1
步骤 2:值更新
v1(s1)=0,v1(s2)=1,v1(s3)=1,v1(s4)=1
当 k=1 时
由于 v1(s1)=0,v1(s2)=1,v1(s3)=1,v1(s4)=1,我们有:
| q-table |
a1 |
a2 |
a3 |
a4 |
a5 |
| s1 |
−1+γ⋅0 |
−1+γ⋅1 |
0+γ⋅1 |
−1+γ⋅0 |
0+γ⋅0 |
| s2 |
−1+γ⋅1 |
−1+γ⋅1 |
1+γ⋅1 |
0+γ⋅0 |
−1+γ⋅1 |
| s3 |
0+γ⋅0 |
1+γ⋅1 |
−1+γ⋅1 |
−1+γ⋅1 |
0+γ⋅1 |
| s4 |
−1+γ⋅1 |
−1+γ⋅1 |
−1+γ⋅1 |
0+γ⋅1 |
1+γ⋅1 |
步骤 1:策略更新
π2(a3∣s1)=1,π2(a3∣s2)=1,π2(a2∣s3)=1,π2(a5∣s4)=1
步骤 2:值更新
v2(s1)=γ⋅1,v2(s2)=1+γ⋅1,v2(s3)=1+γ⋅1,v2(s4)=1+γ⋅1
该策略已经是最优策略!!
- k=2,3,…: 当 ∥vk−vk+1∥ 小于预设阈值时停止。
Lec 13 策略迭代算法
算法描述
给定一个随机初始策略 π0:
-
步骤 1:策略评估(Policy Evaluation,PE)
计算 πk 的状态值:
vπk=rπk+γPπkvπk
注:这里的 vπk 是一个 state value!
-
步骤 2:策略改进(Policy Improvement,PI)
πk+1=πargmax(rπ+γPπvπk)
该最大化是逐分量进行的!
整体算法按照如下序列进行,
π0PEvπ0PIπ1PEvπ1PIπ2PEvπ2PI⋯
关键问题
Q1:策略评估步骤中,如何通过求解贝尔曼方程得到状态值 vπk?
- 闭式解:
vπk=(I−γPπk)−1rπk
- 迭代解:
vπk(j+1)=rπk+γPπkvπk(j),j=0,1,2,…
- 策略评估中嵌入了另一个迭代算法!
Q2:策略改进步骤中,为什么新策略 πk+1 比 πk 更好?
引理(策略改进): 若 πk+1=argmaxπ(rπ+γPπvπk),则 vπk+1⩾vπk 对任意 k 成立。
证明: 由于 vπk+1 和 vπk 都是状态值,它们分别满足下面的贝尔曼方程:
vπk+1vπk=rπk+1+γPπk+1vπk+1,=rπk+γPπkvπk.
由于 πk+1=argmaxπ(rπ+γPπvπk),因此
rπk+1+γPπk+1vπk⩾rπk+γPπkvπk.
因此
vπk−vπk+1=(rπk+γPπkvπk)−(rπk+1+γPπk+1vπk+1)⩽(rπk+1+γPπk+1vπk)−(rπk+1+γPπk+1vπk+1)⩽γPπk+1(vπk−vπk+1).
反复调用上式可得
vπk−vπk+1⩽γ2Pπk+12(vπk−vπk+1)⩽⋯⩽γnPπk+1n(vπk−vπk+1)⩽n→∞limγnPπk+1n(vπk−vπk+1)=0.
上式最右端极限等于 0 是因为 γn→0 且 Pπk+1n 的每一个元素都在 [0,1] 区间。
因此,πk+1 比 πk 更优。
Q3:为什么这样的迭代算法最终能到达最优策略?
证明: 为了证明 {vπk}k=0∞ 的收敛性,我们引入另一个序列 {vk}k=0∞,该序列由下面的迭代算法产生:
vk+1=f(vk)=πmax(rπ+γPπvk).
这个迭代算法实际上就是值迭代算法。我们已经知道,给定任意的初始值 v0,vk 会收敛到 v⋆。
对任意的 π0,总是能找到 v0 使得 v0≤vπ0。下面用递归法证明 vk≤vπk≤v⋆ 对任意 k⩾1 都成立。
假设 vπk⩾vk 对某一个 k 成立,那么对于 k+1 有,
vπk+1−vk+1=(rπk+1+γPπk+1vπk+1)−πmax(rπ+γPπvk)⩾(rπk+1+γPπk+1vπk)−πmax(rπ+γPπvk)(因为 vπk+1⩾vπk 并且 Pπk+1⩾0)=(rπk+1+γPπk+1vπk)−(rπk′+γPπk′vk)(令 πk′=πargmax(rπ+γPπvk))⩾(rπk′+γPπk′vπk)−(rπk′+γPπk′vk)(因为 πk+1=πargmax(rπ+γPπvπk))=γPπk′(vπk−vk).
由于 vπk−vk⩾0 并且 Pπk′ 非负,我们有 Pπk′(vπk−vk)⩾0,因此 vπk+1−vk+1⩾0。
由于 vπk⩾vk 对于 k=0 成立,那么通过递归可知 vπk⩾vk 对任意 k⩾0 成立。最后,因为 vk 能收敛到 v⋆,所以 vπk 也必定能收敛到 v⋆。
Q4:值迭代和策略迭代算法之间有什么关系?
- 实际上二者都是截断策略迭代算法的特殊情况!(后面会讲到)
元素形式
步骤 1:策略评估
- Matrix-vector 形式:vπk(j+1)=rπk+γPπkvπk(j),j=0,1,2,…
- 元素形式:
vπk(j+1)(s)=a∑πk(a∣s)[r∑p(r∣s,a)r+γs′∑p(s′∣s,a)vπk(j)(s′)],s∈S
当 j→∞ 或 j 足够大或 ∥vπk(j+1)−vπk(j)∥ 足够小时停止。
步骤 2:策略改进
- Matrix-vector 形式:πk+1=argmaxπ(rπ+γPπvπk)
- 元素形式:
πk+1(s)=πargmaxa∑π(a∣s)qπk(s,a)[r∑p(r∣s,a)r+γs′∑p(s′∣s,a)vπk(s′)],s∈S
其中,qπk(s,a) 是策略 πk 下的动作值。令 ak⋆(s)=argmaxaqπk(s,a),则贪心策略为
πk+1(a∣s)={10a=ak⋆(s)a=ak⋆(s)
伪代码
策略迭代算法
- 初始化:已知概率模型 p(r∣s,a) 和 p(s′∣s,a),初始策略 π0。
- 目标:搜索最优状态值和最优策略。
- 当策略未收敛时,执行第 k 次迭代:
- 策略评估:
- 初始化:任意初始猜测 vπk(0)
- 当 vπk(j) 未收敛时,执行第 j 次迭代:
- 对每个状态 s∈S:
vπk(j+1)(s)=a∑πk(a∣s)[r∑p(r∣s,a)r+γs′∑p(s′∣s,a)vπk(j)(s′)]
- 策略改进:
- 对每个状态 s∈S:
- 对每个动作 a∈A(s):
qπk(s,a)=r∑p(r∣s,a)r+γs′∑p(s′∣s,a)vπk(s′)
- ak⋆(s)=argmaxaqπk(s,a)
- πk+1(a∣s)=1 若 a=ak⋆(s),否则为 0
例 1
策略迭代 例子1 之示意图
- 奖励设置为 rboundary=−1 且 rtarget=1。折扣率为 γ=0.9。
- 动作:aℓ,a0,ar 分别表示向左、保持不变和向右。
- 目标:使用策略迭代找出最优策略。
迭代 k=0:
步骤 1:策略评估
π0 被选为图 (a) 中的策略。贝尔曼方程为
vπ0(s1)vπ0(s2)=−1+γvπ0(s1),=0+γvπ0(s1).
vπ0(s1)=−10,vπ0(s2)=−9.
- 迭代求解方程。选取初始猜测 vπ0(0)(s1)=vπ0(0)(s2)=0:
{vπ0(1)(s1)=−1+γvπ0(0)(s1)=−1,vπ0(1)(s2)=0+γvπ0(0)(s1)=0,{vπ0(2)(s1)=−1+γvπ0(1)(s1)=−1.9,vπ0(2)(s2)=0+γvπ0(1)(s1)=−0.9,{vπ0(3)(s1)=−1+γvπ0(2)(s1)=−2.71,vπ0(3)(s2)=0+γvπ0(2)(s1)=−1.71,
步骤 2:策略改进
qπk(s,a) 的表达式:
| qπk(s,a) |
aℓ |
a0 |
ar |
| s1 |
−1+γvπk(s1) |
0+γvπk(s1) |
1+γvπk(s2) |
| s2 |
0+γvπk(s1) |
1+γvπk(s2) |
−1+γvπk(s2) |
代入 vπ0(s1)=−10,vπ0(s2)=−9 和 γ=0.9 得到
| qπ0(s,a) |
aℓ |
a0 |
ar |
| s1 |
−10 |
−9 |
−7.1 |
| s2 |
−9 |
−7.1 |
−9.1 |
通过寻找 qπ0 的最大值,改进后的策略为:
π1(ar∣s1)=1,π1(a0∣s2)=1.
该策略在一次迭代后即达到最优!在编程中,应继续迭代直到满足停止准则。
例 2
策略迭代 例子2 之示意图
- 奖励设置为 rboundary=−1 且 rtarget=1。折扣率为 γ=0.9。
我们可以注意到:越靠近目标的策略,越先变好!
- π0:所有策略都很差
- π1:target 的上下左右策略都变好!
- π2:target 周围一圈的策略都变好!
- π3:右下角附近的策略变好!
- ⋯
- π9:只有起点附近的还差
- π10:全部变好!
直观上的理解:
- 我在某状态 s 下选择其 greedy action 严重依赖于其他状态的策略。如果其他状态 s′ 有能够到达目标区域的策略,那我只需要让 s 到 s′ 就能到达目标区域,得到正的 reward。
Lec 14 截断策略迭代算法
比较值迭代与策略迭代
策略迭代:从 π0 开始
- 策略评估(PE):vπk=rπk+γPπkvπk
- 策略改进(PI):πk+1=argmaxπ(rπ+γPπvπk)
值迭代:从 v0 开始
- 策略更新(PU):πk+1=argmaxπ(rπ+γPπvk)
- 值更新(VU):vk+1=rπk+1+γPπk+1vk
两个算法非常相似。
Policy iteration:π0PEValue iteration:vπ0PIπ1PEvπ1PIπ2PEvπ2PI⋯u0PUπ1′VUu1PUπ2′VUu2PU⋯
我们详细比较每一步骤:
|
策略迭代算法 |
值迭代算法 |
备注 |
| 1) 策略: |
π0 |
N/A |
|
| 2) 值: |
vπ0=rπ0+γPπ0vπ0 |
v0:=vπ0 |
|
| 3) 策略: |
π1=argmaxπ(rπ+γPπvπ0) |
π1=argmaxπ(rπ+γPπv0) |
两个策略相同 |
| 4) 值: |
vπ1=rπ1+γPπ1vπ1 |
v1=rπ1+γPπ1v0 |
vπ1≥v1,因为 vπ1≥vπ0 |
| 5) 策略: |
π2=argmaxπ(rπ+γPπvπ1) |
π2′=argmaxπ(rπ+γPπv1) |
|
| ⋮ |
⋮ |
⋮ |
⋮ |
- 它们从相同的初始条件出发。
- 前三步是相同的。
- 第四步开始变得不同:
- 在策略迭代中,求解 vπ1=rπ1+γPπ1vπ1 需要一个迭代算法(无限次迭代)
- 在值迭代中,v1=rπ1+γPπ1v0 是一步迭代
截断策略迭代
考虑上面第四步求解 vπ1=rπ1+γPπ1vπ1 的过程,
截断策略(truncated policy iteration)迭代示意图
我们可以发现:
- 值迭代计算一次
- 策略迭代计算无穷次
- 截断策略迭代计算有限次(j 次)
伪代码
截断策略迭代算法
- 初始化: 概率模型 p(r∣s,a) 和 p(s′∣s,a) 对所有 (s,a) 均已知。初始猜测 π0。
- 目标: 搜索最优状态值和最优策略。
- 当策略尚未收敛时,执行第 k 次迭代:
- 策略评估:(PE)
- 初始化: 选取初始猜测为 vk(0)=vk−1。最大迭代次数设为 jtruncate。
- 当 j<jtruncate 时,执行:
- 对每个状态 s∈S,执行:
vk(j+1)(s)=a∑πk(a∣s)[r∑p(r∣s,a)r+γs′∑p(s′∣s,a)vk(j)(s′)]
- 令 vk=vk(jtruncate)
- 策略改进:(PI)
- 对每个状态 s∈S,执行:
- 对每个动作 a∈A(s),执行:
qk(s,a)=r∑p(r∣s,a)r+γs′∑p(s′∣s,a)vk(s′)
- ak∗(s)=argmaxaqk(s,a)
- πk+1(a∣s)=1 若 a=ak∗,否则 πk+1(a∣s)=0
但我们只计算有限步,是否会导致算法不再收敛?
从直观上看,截断策略迭代应介于值迭代和策略迭代之间。不用担心,收敛性从数学上可由以下定理保证!
命题(值改进):考虑求解策略评估步骤的迭代算法:
vπk(j+1)=rπk+γPπkvπk(j)
若初始猜测选为 vπk(0)=vπk−1,则有
vπk(j+1)≥vπk(j),j=0,1,2,…
证明: 一方面,因为 vπk(j)=rπk+γPπkvπk(j−1) 且 vπk(j+1)=rπk+γPπkvπk(j),所以有
vπk(j+1)−vπk(j)=γPπk(vπk(j)−vπk(j−1))=⋯=γjPπkj(vπk(1)−vπk(0)).(4.5)
另一方面,因为 vπk(0)=vπk−1,所以有
vπk(1)=rπk+γPπkvπk(0)=rπk+γPπkvπk−1≥rπk−1+γPπk−1vπk−1=vπk−1=vπk(0),
上式不等号是因为 πk=argmaxπ(rπ+γPπvπk−1)。
将 vπk(1)≥vπk(0) 代入 式(4.5),可得 vπk(j+1)≥vπk(j)。
值迭代、策略迭代、截断策略迭代三种算法的收敛速度示意图
可以看到:
- 策略迭代收敛最快;
- 值迭代收敛最慢;
- 截断策略迭代介于两者之间。
例子
在下图(左)的情境下使用截断策略迭代算法。
定义 ∥vk−v∗∥ 为时刻 k 的状态值误差。停止准则为 ∥vk−v∗∥<0.01。
- 横轴:迭代次数(iteration num)
- 纵轴:状态值误差(state value error)
截断策略迭代示例
可以发现:对 truncated policy iteration-x 算法:
- x 值越大(策略评估中迭代次数越多),值估计收敛越快。
- 但当 x 很大时,增加 x 的收益迅速下降。
- 实践中,在策略评估步骤执行少量的迭代次数即可。
总结
-
值迭代:求解贝尔曼最优方程的迭代算法。给定初始值 v0,
vk+1=πmax(rπ+γPπvk)
等价于两步:{策略更新(PU):πk+1=argmaxπ(rπ+γPπvk)值更新(VU):vk+1=rπk+1+γPπk+1vk
-
策略迭代:给定初始策略 π0,
由两步实现:{策略评估(PE):vπk=rπk+γPπkvπk策略改进(PI):πk+1=argmaxπ(rπ+γPπvπk)
-
截断策略迭代:策略评估中执行有限步迭代