值函数与最优值函数
第 0 课 · Stage 0 · 值函数与最优值函数
第零课 · Stage 0

值函数 V 与最优值函数 V

起点全书从「值」这一个概念开始——后面每一个算法要估的都是它。·方程、算法、骨架都还没出现。

这一课不推公式。我们只做一件事:把一个具体的数 一遍一遍刷出来,看着它一步步逼近真正的 。看完再回去看后面的推导,那些符号才有具体的数对应

先说清楚一件事:为什么整本讲义从「值函数」开始,而不是从某个算法、也不是从 MDP 的定义开始。

强化学习最后要的是策略——在每个状态该走哪一步。那为什么不直接讲策略?因为「该怎么走」这个问题没法直接回答:你要挑一个动作,就得比较几个动作;要比较,就得知道「走过去之后处境有多好」。这个「有多好」,就是值。值没定下来,「更好的动作」这句话根本没有意义。

值函数做的事只有一件:把「整个未来」压缩成每个状态上的一个数。

一条路好不好,本来取决于往后所有步。值函数把这一整条未来折算成一个数,写在格子里。有了它,选动作就从「想清楚整盘棋」退化成「看一眼邻居谁的数大」——深谋远虑变成一次局部比较。后面主线上几乎每一个算法——动态规划、蒙特卡罗、时序差分、Q-learning、DQN、Actor-Critic 里的 critic——估的都是这个数,区别只在用什么数据、按什么规则更新值函数是它们共同的对象:这个定义清楚了,后面各算法的差异才有可比的基准。

那为什么不先讲 MDP 的定义?五元组 (S, A, P, r, γ)形式,值函数是目的。先给形式,那些记号会显得没有来由;先把目的说清楚,下一课再补形式,那时每个符号都能对上一个你已经算过的量

两个名字先摆在这儿,这一课从头到尾都在算它们。

值函数 Vπ(s):在状态 s 下,照某个给定的走法 π 一直走下去,今后能拿到的期望累计回报。
Vπ(s) = Eπ[ Gt | St = s ]
最优值函数 V⋆(s):在状态 s 下,从现在开始按最优方式行动,所能获得的最大期望累计回报。
V⋆(s) = maxπ Vπ(s)

两行读一遍:上一行说「照这个走法走,平均能拿多少」;下一行说「所有走法里最好的那一种,能拿多少」。Gt 是从此刻起往后所有奖励折现相加,叫回报,§9 会展开写;E 表示取平均,因为落点可能带随机。

这一课的例子,正好把这两行的差别消掉了——这是故意的。那条链上每个状态只有一条路可走,没有第二种走法,所以 VπV是同一组数。于是「该选哪个动作」这件事整课不出现,你可以先把「值」本身看清楚:它是什么、怎么一遍遍算出来、为什么会停下来。等到下一课那间每格有 4 个动作的仓库,两者才真正分家。

所以这一课只用一条 5 个状态的链、一个 γ、一张能手算的表每个数都小到能在纸上验一遍。


§ 1示例:五状态链

一条最小的链,五个状态:

规则简单到没有任何歧义:

  • 每走一步就进下一个状态;走到 之后就原地打转,永远待在
  • 。也就是说 每站一次给 1 分,往后每一步都是 1 分,一直到无穷
  • 折现 :下一步拿到的 1 分,现在只值 0.9 分。
我们要的就是一个数:
出发,把未来所有的分折现加起来,一共值多少?

这个数是有答案的。从 走 4 步到 ,之后每一步都拿 1 分:

先记住这个数 6.5610。下面我们假装不知道它,用「刷」的方式一步一步把它逼出来——因为在真实问题里,你永远写不出这么一个闭式解。


§ 2有限期限值函数 Vk

§1 摆出了链、奖励和 γ,但一个数都还没算。要问「这条链值多少」,先得把「值」定义成一个算得出来的量——这一节把它定成「只给 k 步预算,最多能拿多少」。

先给它一句能读懂的话,再给式子。白话是这样的:

出发,如果只允许你再走 步,你最多能拿到多少(折现之后)。

就是预算——还允许走几步。就这么简单,没有别的含义。 不是时刻

写成式子,就是把「只允许走 k 步」这句话直译一遍——把回报那条无穷和只取前 k

Vk(s) = Rt+1 + γRt+2 + ⋯ + γk−1Rt+k (从 s 出发,只允许再走 k 步),  V0(s) = 0

这个式子读一遍就够了:s 出发,把接下来这 k 步收到的奖励逐个打折加起来,走满 k 步就停,再往后的一概不算

V0 = 0 不是「初值随便填」——一步都不许走,也就拿不到任何奖励,它是这一族里第一个正确答案。让 k 一直加下去,截掉的那一截就补齐了,剩下的正是 §9 那个回报 G

先手算一个。 是多少?意思是: 出发,只给你 3 步,能拿多少?照着数就行:

第几步这一步你在哪拿到折现后
第 1 步00
第 2 步00
第 3 步1
合计0.810
不是什么「迭代中间量」。它是一个独立成立的、精确的答案——只不过回答的是「只剩 3 步」这个问题。

所以刷第 遍并不是「第 次瞎猜」,而是把问题的期限从 步延长到 步,然后精确地回答它

§ 3值表的逐遍迭代

有了这个定义,把预算 k 从 1 一路加上去,就能一行一行把表填满。这一节先摆出整张表,再交出填表用的那一个公式——本课后面每一句话都建立在它上面。

每刷一遍,就把预算加一格,整张表被覆写成新的一版)。下面把每一版并排印出来只是为了对照——真跑的时候手里始终只有一张 5 个数的表,新的一版盖掉旧的,第 k 版一写完,前面那些就没有了:

刷第几遍这一行在回答
00001.0000只剩 1 步能拿多少
0000.90001.9000只剩 2 步能拿多少
000.81001.71002.7100只剩 3 步能拿多少
00.72901.53902.43903.4390只剩 4 步能拿多少
0.65611.38512.19513.09514.0951只剩 5 步能拿多少
1.24661.97562.78563.68564.6856只剩 6 步能拿多少
1.77802.50703.31704.21705.2170只剩 7 步能拿多少

表停在第 7 行只是为了看清规律——这条链在第 7 遍远没有收敛。离真值还差多少、要刷多少遍、什么样的问题能在有限遍精确收敛,都在 §6.3。

这些数没有一个是猜的,靠的是一个公式

这个式子读一遍就够了:站在 s、手上还有 k 步预算,这一格的值 = 当场收到的奖励,加上打一次折之后、站在下一格且预算只剩 k−1 步时的值。两个下标差一级,正是「走这一步花掉了一格预算」。

你花掉一步走到了 ,所以预算从 变成
就这么回事。 不是什么算法细节,是你真的少了一步可走。

挑四格当场算一遍,每一格都只用上一行(预算少一级)的数字

要算的格套公式代入上一行结果
1.9000
1.7100
2.7100
0.8100

在表上就是:要填某一格,往上一行(预算少一级)、沿转移方向的下一列去取数。

四行里藏着三件事。
  • 那个 1 只有 自己发得出来。 里的 1 是它站上去当场拿的; 里没有这个 1,它拿到的只是折过一次的、 上一稿的那份每往左一格,就再乘一个 0.9。这也是为什么同一行里相邻两格的差,越往左越小。
  • 取的永远是上一行。 用的是 不是同一行刚刚算出来的 。要是用了后者,你会得到 ——回表里找一下,那正好是下一行。就地更新(Gauss–Seidel)确实能多推进一格,但下标就不再对得上「只剩 步」这个解释了。
  • 非零值第一次出现的位置,每刷一遍往左挪一格。 只有 非零, 轮到 轮到 刷一遍,消息走一格——表里加粗的那条斜线就是它,这句话后面每一课都会再遇到。

我们只盯 那一列——那就是我们要的数:

预算 这一遍新加了离 6.5610 还差差距 / 上一遍
10.000006.5610
20.000006.56101.000
30.000006.56101.000
40.000006.56101.000
50.6561 = 0.65615.90490.900
61.2466 = 0.59055.31440.900
71.7780 = 0.53144.78300.900
103.0742 = 0.38743.48680.900
205.3452 = 0.13511.21580.900
406.4132 = 0.01640.14780.900
6.561000
V_k(s_0) 逐遍逼近 V⋆(s_0)
左:每刷一遍,级数就多加恰好一项 (蓝色小块),累计值(橙线)逼近虚线 。前 4 遍够不着奖励,全是 0。右:还差多少,与 完全重合——差距就是级数还没加完的那条尾巴

§ 4三处容易读错的地方:刷表、自举、递推方向

公式和表都到手了。但这套东西特别容易被读成别的东西:刷表被读成走路、自举被读成误差滚雪球、「从只剩 1 步开始」被读成时间倒流。这一节把三处一次讲掉,后面才不用带着误会往下读。

4.1 刷表的时候,什么都没在走

三件事必须分开:刷表——你在纸上算,agent 一步没动;收敛——表不再变,得到 V执行——这时才开始走,而且每一步只查表,不再算任何东西。

所以「是一开始就算完,还是走一步算一步」,答案是一开始全部算完。但更要紧的是下一句:刷表这个过程本身也不是在走。§3 那七行不是七步路。

V3 那一行验一遍:[0, 0, 0.8100, 1.7100, 2.7100]。这五个数同时成立、互不冲突,因为它们回答的是五个不同起点的同一个问题——「只给你 3 步预算,能拿多少」。要是这一行的意思是「走了 3 步之后」,那 agent 此刻只能站在一个格子里,另外四个数就该没有意义——可它们每一个都有意义,而且都精确。

「这一行为什么只能是 3 步」——因为 3 是你自己设定的参数,不是算出来的结果。第 k 行的定义就是「预算 = k」,换一行就是换一个预算、重新问一遍。所以 V3 这一行是五个各自独立的思想实验,唯一的共同点是每个都只给 3 步。把五条路逐条列出:

从哪儿出发这 3 步怎么走第 1 步第 2 步第 3 步合计
s0s0s1s2s30000
s1s1s2s3s40000
s2s2s3s4s400γ²·1 = 0.81000.8100
s3s3s4s4s40γ·1 = 0.9000γ²·1 = 0.81001.7100
s4s4s4s4s41·1 = 1.0000γ·1 = 0.9000γ²·1 = 0.81002.7100

五条路各走各的,谁也不影响谁;每一条都真的走满 3 步,也都真的只走 3 步。注意 s1 那一行——它第 3 步末确实踏进了 s4,但那一分是「从 s4 出发」的那一步才发的,预算已经用完,所以仍是 0。它要等到 V4 才第一次冒头(γ³ = 0.7290)。

值表不是世界的一张快照,是一张问答表
就像地图上每个路口都标着「离终点还有多远」——所有路口的数同时印在同一张纸上,不代表你同时站在所有路口

那还剩最后一问:我只想要 V(s0) 那一个数,为什么非得把五格全算出来?因为算不动V3(s2) 要引用 V2(s3),后者又要引用 V1(s4)——你要的那个数,是建立在别的格子的答案之上的。而且全算完之后你还额外得到一样东西:每一格都知道自己该怎么走(§7),从哪格出发都能用。

刷第 k 遍不是「走了第 k 步」,是「把预算调到 k,然后精确回答这个问题」。§2 那句「k 不是时刻」说的就是这件事,这里只是把它的后果讲透。

「边走边算」是有的,但那是 Stage 1 的事:没有转移规则的时候,你只能真走出去、把采样拿回来更新。这一课规则是完整给你的,所以能在动之前把答案全算完。

还有一件最容易搞混的事:刷 k 遍不等于要存 k 张表。§3 开头那句「新的一版盖掉旧的」说的就是这件事:k覆写的次数,不是表的层数——你不需要「准备一张 7 层以上的表」。会长出 K+1 层的,是那种把预算当成表的一个维度的写法(每个 k 存一整张表);这里的 k 不进表

4.2 自举:形式上是,但不带它的毛病

自举(bootstrapping)= 用自己的估计去更新自己的估计,不等真实结果出来。§3 那条备份公式右边引用的正是自己的上一稿,所以形式上它百分之百是自举;§3 那句「取的永远是上一行」还是自举的严格版本——连同一行刚算出来的新值都不许用。

反面是蒙特卡罗:把一整条轨迹走到底、拿到真实的回报 G,再回头更新。全程不引用任何自己的估计。这两条路后面讲蒙特卡罗与时序差分那一课会正面撞上。

但别把这里的自举,和后面那个危险的自举混为一谈。自举通常让人担心的是「拿一个还没算准的猜测去算另一个数,误差互相污染」。这一课不存在这个问题——§2 已经把话说清楚了:Vk 不是估计,是精确答案,它精确地回答了「只剩 k 步」。引用一个已经算准的更小的问题,和引用一个还在乱跳的猜测,是两回事。等到 Stage 1,值不再由规则算出、而是从样本估出来,还要再过一个函数逼近器,自举才开始咬人——那时它就是致命三角里的那条腿。

4.3 为什么从「只剩 1 步」起

递推只有一条通用原则:从你已经知道答案的那一端开始,往未知的方向推。§2 定义的值是「从这儿开始,今后还能拿多少」,这个量只有一端不用算——V0 = 0,也就是 §2 那个「预算为 0」的答案。种子只能是它,方向也就只剩一个。

而且 k 是从 0 往上长的,不是时间倒流。V1 回答「只给 1 步」,V2 回答「给 2 步」……k 数的是还允许走几步,不是「现在走到第几步」。每一稿都是一个完整问题的完整答案,后一稿引用前一稿。

那「消息一格一格往左传」又是怎么回事?不是 agent 在往左挪,是「看得见奖励」的范围在往外长。§5.2 那条「距离 = 预算」的分界线就是它:预算每加一格,够得着奖励的状态就往左多一个。传到 s0 用了 4 遍,正好是它到 s4 的距离——4 是距离,不是时刻

三句话收掉这一节。刷表是动手之前的离线计算,k 是预算不是时刻;它引用自己的上一稿,所以确实是自举,但被引用的那一稿是精确的,所以不带偏差;执行的时候你确实是一步步往前走,可要决定「站在 s 往哪走」,先得知道各个落点今后值多少——要往前走,就得先从后面算起

§ 5稀疏奖励与 γ 收缩

误会清掉,回到 §3 那张表。它里面有三条规律可以直接读出来,而且每一条后面都跟着一个后面反复要用的通用结论。

前两条讲奖励稀疏时值表会怎么长(5.1、5.2),第三条讲它离答案还差多少、这个差距按什么速度缩小(5.3)。第三条是后面所有收敛结论的原型。

5.1 稀疏奖励

的意思是:从 出发只给 4 步,你确实一分都拿不到(第 5 步才走到 )。这个 0 精确无误。

推广一下:如果起点离奖励有 50 步,你至少要刷 51 遍才第一次看见非零值。
稀疏奖励难学,难就难在这里,这不是算法设计的问题,是信息传播速度决定的。

5.2 首次非零值

那一遍,。为什么?因为预算刚好够走到 只来得及吃一口就没预算了。同理表里每个状态第一次冒头的值都是 是它到 的步数):

几步第一次非零在那个值
0
1
2
3
4

表里 0 与非 0 的那条分界线,就是 「距离 = 预算」 这条线——§3 第三条那句「刷一遍,消息走一格」,量出来就是它。

5.3 收缩率与截断误差

看「这一遍新加了」那一列: 也就是

所以「刷」这件事,就是在把那条无穷级数一项一项地加进来
遍 = 加完了前面若干项。

那「还差多少」就是还没加进来的那条尾巴

核对一下: ✓; ✓; ✓。表里那一列一个不差。

这就是为什么「差距 / 上一遍」那一列永远是 0.900。
尾巴每加进来一项,剩下的尾巴就整体乘一个 ——不多不少,精确

下一课那个「」的压缩性质,在这条链上就是这一列数字。它不是什么抽象定理,就是等比级数的尾巴在按

顺带回答了一个常见困惑:你从来不需要真的去加无穷项。你只是加了有限项,而没加的那部分小到可以忽略。

§ 6最优值函数:刷一遍不再变的那张表

§5 的三条规律都指向同一件事:预算越大,表越靠近某一张固定的表。这一节把那张表单独拿出来命名,再算清楚离它还差多少、要刷几遍才够。
预算无限时的那个答案。也就是这张表一直往下加行,最后稳定下来的那个数。

6.1 折现与收敛性

无穷多项加起来,为什么不是无穷大?因为折现。第 100 步拿到的 1 分只值 。越远的奖励在总和里占的权重越小,加到最后是个有限的数。 一直原地拿分,加起来是

其余各列停在 停 9、 停 8.1、 停 7.29、6.561——就是我们一路刷出来的那个数。

6.2 为什么 V⋆ 刷一遍不变

先说清楚下面在比什么。两条式子只差一个下标,差别只有一件事:刷一遍会不会变。而「变不变」不是看某一格,是看整张表——在这条链上就是 s0s4 那 5 个数合起来的一整组:按 §3 那条公式再刷一遍,5 个数一个都没变,才叫不变。

看清楚 各自满足的式子,区别只在下标

式子左右两边
不是同一个函数(预算差一级)
是同一个函数
为什么 两边可以是同一个?因为无穷步花掉一步,还剩无穷步。

预算是 的时候,走一步就变成 ,所以式子两边是两个不同的函数。
预算是无穷的时候,走一步还是无穷,所以式子两边是同一个函数。

这就是 V⋆ 的全部特别之处——一句大白话,不需要任何抽象。

在我们这条链上验一下:


那一格左右两边真的是同一个数,因为它走一步之后还是 ,未来还是那个无穷长的未来。

后面那些「」、「Bellman 方程是自洽条件」、「 是唯一与自己一致的函数」,说的全是这一件事。

6.3 那要刷几遍才够

6.2 说的是 V⋆ 刷一遍不变;可你手上拿着的是 Vk,它每刷一遍都还在动。所以还剩一个很实际的问题:刷到第几遍可以停手?

先看它为什么一定会停下来。5.3 那条尾巴 已经把话说完了:每刷一遍,它整体乘一个 γ。 时刷到第 100 遍,尾巴只剩 ——加了等于没加

这也顺带解释了 γ 的作用——它决定了「多远之后的事情可以不管」。γ 越接近 1,尾巴缩得越慢,你要刷的遍数越多(大致 1/(1−γ) 那个量级),算得越慢;γ 小则很快就够,但你也就真的看不了那么远。

那这条链要刷几遍才算完?把 §5.3 那条尾巴写成不等式,要求它小于精度 ε

γk / (1 − γ) < ε ⟹ k > ln( ε(1 − γ) ) / ln γ

代进 γ = 0.9 算三个数:

Vk(s0) 离 6.5610 差不到得刷几遍刷完之后的值
0.1446.4640
0.01666.5514
0.001886.5601
所以 §3 那张表印到第 7 行,是为了让你看清规律,不是因为第 7 遍收敛了。第 7 遍时 V7(s0) = 1.7780,离 6.5610 还差 4.7830——七成还没加进来。§3 第二张表之所以跳到 k = 10 / 20 / 40 / ∞,就是因为中间那几十行没什么可看的:每一行只是把尾巴再乘一个 0.9。

这条链为什么永远差一点点?因为 s4 一直在发分,奖励流没有尽头,尾巴 γk/(1−γ) 只能越缩越小、永远不会真的等于 0。这种情形下没有「第几遍就完事」这回事,只有「订一个阈值、够小了就停手」。

顺带一提:真写代码时没人去解上面那个对数不等式——你不知道 V,也就不知道「还差多少」。实际做法是盯相邻两轮的最大改动 Δ,小到一定程度就停手,收缩性保证这时离真值也够近了。这条只用两轮就能算的界下一课会给

另一类问题能在有限遍之内精确收敛:终点之后不再发奖励。走到终点之后不再有奖励,预算再多也拿不到东西,于是预算够了就精确,遍数由地图的尺寸决定,与 γ 无关。这条链不属于这一类(s4 一直发分),所以这里只需知道有这么两类下一课那间仓库正是这一类,论证和数字都在那里。

§ 7一步贪心与最优策略

§6 交出了 V⋆ 这张表,但值本身不是目的。这一节说明:有了它之后,「该往哪走」变成一个只看一步就能定的选择。

手上有了 ,做决策就不用再想未来了——只看一步就够

这个式子读一遍就够了:站在 s,把每个能走的动作都试着算一遍「这一步当场拿多少 + 打折之后落点值多少」,谁算出来最大就走谁。

大括号里那一整块——「这一步拿多少 + 到了那儿以后还能拿多少」——本身也是一个值,它有名字:动作价值 Q⋆(s,a)。用它,上面那一步贪心可以写得更短:

V⋆(s) = maxa Q⋆(s,a),  π⋆(s) = argmaxa Q⋆(s,a)

两行读一遍:上一行——这一格的值,就是它所有动作里最好的那个动作值下一行——最优策略在这一格该走的,就是取到那个最好值的动作。一个交出,一个交出动作

这条链上每个状态只有一个动作,所以 Q⋆(s0, 前进) = V⋆(s0) = 6.5610,两者完全重合,看不出差别。要到下一课那间每格有 4 个动作的仓库里,它们才真正分开——而分开之后 Q 会比 V 更好用:用 V 挑动作,必须先知道每个动作会落到哪;用 Q 只要在这一行里挑最大。

带不带星也要分清。V⋆ 和 Q⋆ 说的是「最优地走下去能拿多少」;不带星的 VQ 说的是「照某个给定的走法能拿多少」。这条链只有一种走法,所以这四个记号在这里指的是同一组数——上面那句「到 4 个动作的仓库里才分开」,对它们同样成立。

把「整个未来」压缩成了每个状态上的一个数
有了这张表,深谋远虑和目光短浅变成同一件事。

打个比方: 是一张地形图,最优决策就是「永远朝最陡的方向走」。地图一旦到手,全局规划就退化成纯局部的、瞬时的动作。

整个强化学习在做的,就是在没有地图的情况下,一边走一边把这张图画出来。

§ 8这套刷法的名字:策略评估与值迭代

到这里整套流程已经跑完:定义 Vk、逐遍刷表、刷到不再变、再拿它挑动作。这一节把这套流程的正式名字对上去——它有两个名字,而在这条链上两个恰好重合。

方法本身只有一句话:从预算 1 开始,一行一行往下加,加到再加也不变为止。这套刷法在动态规划里有正式名字,而且是两个。

先把名字的归属说清楚。这条链上每一格只有一个动作——只能往前走,所以 §3 那条公式里没有「取最大」。在动态规划的分类里,「照一个给定的走法把值刷出来」叫做策略评估值迭代要在「有多个动作可挑、必须取最大」时才有内容,那要到下一课那间 4 个动作的仓库。本课这套刷法,两者在这条链上恰好重合——因为候选只有一个,取不取最大都是它。所以前面那些结论(收敛、尾巴 γk、要刷几遍)对两者同时成立,你不必现在就分开记。
「值迭代」翻译成大白话就是:把预算一路加上去,加到再加也没用。

「收敛」的意思也很直接:预算再多也改变不了答案了。

§ 9回报

前面一直在用「今后能拿多少」这句话,却没给它一个正式的量。这一节补上:它叫回报,而值函数就是它的平均值。

开头只报了它的名字,式子一直没展开。现在把它写全:

Gt = Σk=0 γkRt+k+1 = Rt+1 + γRt+2 + γ²Rt+3 + γ³Rt+4 + ⋯
记号含义
Gt回报。从时刻 t 往后,所有奖励折现之后加起来的总和
Rt+1奖励。在时刻 t 行动之后收到的那一个奖励。下标写 t+1 而不是 t,因为它是这一步的结果
t时刻。已经走到第几步。它和前面那个 k 是两回事——k 是预算(还能走几步),t 是时间(走到第几步了)

这个式子是干什么用的。它把「今后能拿多少」从一句话变成一个能算、能取平均的量。值函数就是它的平均值——这一课能把 V⋆ 一格一格算出来,靠的正是背后有这么一个可加的量;后面所有算法要估计的,也都是它。

代进这条链核对一遍。从 s0 出发,前四步都还没站上 s4,所以 R1R4 全是 0;从 R5 起每一步都拿 1:

G0 = 0 + 0 + 0 + 0 + γ4·1 + γ5·1 + ⋯ = γ4/(1−γ) = 0.6561 / 0.1 = 6.5610

正是 §1 那个数。§3 那张表的每一行,也都是这个式子的截断版——把无穷和只取前 k 项,得到的就是 Vk;§5 里「还差多少」的那条尾巴,就是被截掉的那些项。

回报是一个样本,不是一个估计。这条链是确定性的,所以从 s0 出发算出来的 G0 永远是 6.5610,一次都不会变。一旦落点带上随机性,同一个起点每次跑出来的 G 都不一样——那时值函数取的是它的平均值,而不是某一次的结果。这条区别是后面所有「靠采样来学」的方法的立足点。

§ 10本章小结

  1. = 从 出发、预算 步,最多能拿多少。每一遍都是一个正确答案,只是问题的期限不同; 不是时刻。
  2. 备份公式管的就是预算:花掉一步走到 ,预算少一级。
  3. 遍 = 把无穷级数的前几项加进来;还差的那点就是没加完的尾巴 ,每刷一遍精确乘 。所以你从来不用真的加无穷项。
  4. = 预算无限的答案。它特别,是因为无穷减一还是无穷,所以式子两边是同一个函数:刷一遍它还是它自己。
  5. 有了 ,只看一步就能做最优决策。它把整个未来压成了每个状态上的一个数。
  6. 回报 G 是这一切的底座。值函数就是它的平均值;这条确定性链上 G 只有一个值,一旦有了随机性才需要「取平均」这件事。
你刚才做的这件事有名字,叫策略评估:给定一个策略,反复用「一步奖励 + 打折后的下一状态值」更新,把这个策略的值函数算出来。这条链上每个状态只有一条路可走,策略是退化的,所以算出来的 V 同时就是 V;一旦有动作可挑,两者就分家了。再往后讲动态规划那一课会正式讲策略评估,以及怎么用它把策略改好。
下一课把同样的问题搬到一个真正需要做决策的环境上:4×4 的仓库网格。这条链上你只能往前走,没有选择;到了仓库里,每一格有 4 个动作可挑,于是「取最大」第一次登场,Bellman 方程也才真正有内容。
下一课有一个可以亲手一格一格刷的交互组件——那里换成了 4×4 仓库,做的动作和本课这张表完全一样,只是每一格多了 4 个动作要比。
本课所有数字与插图都由随附的 code/ch0_chain_fig.py 生成(逐遍的 Vk 表、首次非零的 γd、差距 γk/(1−γ)、以及 §6.3 那张 44 / 66 / 88)。python ch0_chain_fig.py --embed 重画两版图,整跑不到 3 秒。
↑ 回到顶部