强化学习期末刷题:贝尔曼方程、SARSA与Q-learning考点精讲

发布时间:2026/10/24 16:34:46
强化学习期末刷题:贝尔曼方程、SARSA与Q-learning考点精讲

简介:面向高校人工智能、计算机相关专业学生的《A卷强化学习期末考试原题加答案》是一份备考资源,针对强化学习课程期末考核所涉及的核心概念与方法进行系统梳理。该资料以 PDF 形式提供,共 1 个文件,压缩包整体约 332KB,内容紧凑且便于直接查阅与打印复习。资源覆盖折扣因子、状态转移与奖励、贝尔曼方程、蒙特卡洛方法、时间差分方法、SARSA 与 Q-learning、值迭代与策略迭代、马尔可夫决策过程、状态-行动值函数和学习率等重点专题,每道题目均配有步骤清晰的参考解答,便于读者对照理解计算过程与算法差异。资源还比较了在线算法与离线算法的适用场景、基于模型与无模型方法的优缺点,帮助构建完整的强化学习知识框架。目前已有290人学习下载,适合期末冲刺复习、考研备考。

1. 强化学习期末考试原题加答案:考前刷卷比看十遍课件有用

期末周时间紧,光看课件和公式推导很难知道自己到底掌握到什么程度。这份强化学习期末考试原题加答案,把一学期最重要的考点浓缩进十道题里:网格世界的贝尔曼方程手算、蒙特卡洛与TD方法对比、SARSA与Q-learning的更新方式辨析、值迭代与策略迭代的步骤拆解,还有n-step Sarsa和标准Sarsa、MC学习之间的转换关系。每道题都带参考答案和推导过程,适合三类人:期末前想快速刷真题的本科生,需要系统梳理强化学习核心概念的考研党,以及入门强化学习后想用题目检验自己的开发者和研究者。这份资料的判断标准只有一个——题够不够典型,答案够不够清楚。

2. 贝尔曼方程与MDP手算:把四状态网格世界算到小数点后两位

2.1 从题目文字到方程组:先搞清楚状态、奖励和转移

原题第一题是典型的网格世界手算题,状态空间只有四个状态,转移和奖励都预先给定。这种题的价值在于:不需要写代码,靠纸笔就能推完整个值函数估计过程,是理解贝尔曼方程最好的训练场。先把状态和转移关系拆清:

  • 状态s₁:奖励为-1,50%概率转移到s₃(转移奖励1),50%概率转移到s₂(转移奖励1)
  • 状态s₂:奖励为1,总是转移到s₄(转移奖励0)
  • 状态s₃:奖励为1,总是转移到s₄(终止状态)
  • 状态s₄:奖励为0,是终止状态

每走一步,既产生当前状态的即时奖励,又叠加转移后的未来价值。把贝尔曼方程写出来:

# 四状态Bellman方程组(γ=0.9) # v(s1) = 0.5*(-1 + 0.9*v(s3)) + 0.5*(-1 + 0.9*v(s2)) # v(s2) = 1 + 0.9*v(s4) # v(s3) = 1 + 0.9*v(s4) # v(s4) = 0 # 终止状态,价值恒为0

这里有个关键约定:终止状态的价值定义为0,因为它之后没有任何后续奖励。很多人在这一步翻车,把s₄当成普通状态继续套递归,结果算出一个奇怪的发散值。从s₁出发,无论走哪条分支都要先支付-1的即时奖励,所以两个分支的括号里都带着-1。

2.2 折扣因子γ=0.9时的完整手算过程

有了方程组,代入γ=0.9逐步回代。从终止状态开始反推是最稳妥的做法,因为v(s₄)是已知边界条件:

gamma = 0.9 v4 = 0 v2 = 1 + gamma * v4 # 1 + 0.9*0 v3 = 1 + gamma * v4 # 1 + 0.9*0 v1 = 0.5*(-1 + gamma*v3) + 0.5*(-1 + gamma*v2) print(f"v(s4)={v4:.4f}") # v(s4)=0.0000 print(f"v(s2)={v2:.4f}") # v(s2)=1.0000 print(f"v(s3)={v3:.4f}") # v(s3)=1.0000 print(f"v(s1)={v1:.4f}") # v(s1)=-0.1000

v(s₁)=-0.1这个结果值得多说一句:它不等于各分支奖励的简单平均,因为未来价值v(s₂)和v(s₃)经过折扣后反过来影响了当前状态的估值。这正体现了动态规划的思想——单步奖励差,不代表整个状态价值差,要看后续状态的连锁反应。

原卷答案里出现了v(s₄)=1/(1-γ)的写法,那是把s₄当成奖励为1的自环吸收态才成立。但题目白纸黑字写了"s₄奖励为0,是终止状态",所以这里以终止价值为0重算。刷题时遇到这种不一致要警惕,别背答案,按题目条件推。我在第5章避坑部分还会再展开。

2.3 状态值与行动值:第六题和第九题的对照练习

第六题给了三个状态的状态值,要求计算某个状态下采取不同动作的状态值;第九题则直接考状态值函数和行动值函数的公式与作用对比。两题连起来看,恰好覆盖了贝尔曼方程的两种形态:

# 第六题:已知 v(s2)=6, v(s3)=5, γ=0.9 # 从s1采取a1到s2,奖励4 v1_a1 = 4 + 0.9 * 6 # 9.4 # 从s1采取a2到s3,奖励2 v1_a2 = 2 + 0.9 * 5 # 6.5 print(f"策略1: 采取a1 -> v(s1)={v1_a1:.1f}") # 9.4 print(f"策略2: 采取a2 -> v(s1)={v1_a2:.1f}") # 6.5

状态值V(s)评估"当前状态好不好",行动值Q(s,a)评估"当前状态下哪个动作最好"。第六题算的是给定动作下的状态值,本质是在做策略评估;如果要找最优策略,就在9.4和6.5之间取max。这两道题放在一起,就是在提醒你:别把策略评估和策略改进混成一步,这是值迭代与策略迭代的根本区别。

3. 蒙特卡洛与TD方法:离线更新还是在线更新,边界在这里

3.1 蒙特卡洛:完整回合结束后的"事后结算"

第二题要求分析蒙特卡洛方法和时间差分方法,并判断在线还是离线。蒙特卡洛的核心逻辑很简单:玩完一整局,统计每个状态的实际累计回报,然后取平均作为该状态的估计值。它不需要环境模型,也不需要当前状态的估计值去推下一个状态,只需要一条完整的轨迹。

特点在于:更新必须等到回合结束。中间无论走多少步,都不能回头修正之前的状态价值。这决定了它是离线算法——严格说,是"回合终止才更新"。如果一轮对局要几百步,那收集一条样本的效率很低,但因为用的是真实回报,估计的偏差相对较小,主要问题是方差大。实战里MC常用于游戏类场景,一盘结束就能拿到明确的胜负或得分信号。

3.2 时间差分方法:走一步就更新,边走边学

TD方法的核心公式是一个就地更新:

# TD(0)更新公式 # V(s_t) <- V(s_t) + α * [r_t + γ * V(s_{t+1}) - V(s_t)]

TD方法在t时刻迈出一步,拿到即时奖励r_t和下一个状态的价值估计V(s_{t+1}),立刻就把当前状态的价值往目标方向推一点。它不需要完整轨迹,所以天然支持在线的逐步学习。这就好比边开车边看导航,每隔几秒修正一次路线,而不是到了终点再复盘。

TD的代价是引入偏差——因为用"估计去更新估计"(自举),初始值估计不准时误差会传播。但它的方差比MC低,因为每步只看一个随机转移而不是整条轨迹的累计随机变量。第二题的答案里还特别强调了MC是离线、TD是在线,这个点考试频率极高。实际判断标准就一条:更新是否需要等待整个回合结束。需要就是离线,不需要就是在线。

3.3 n-step Sarsa:把MC和TD放进同一个谱系

第二题单独考MC与TD,第十题却把标准Sarsa、n-step Sarsa和MC拉到一起对比。n-step Sarsa的更新公式是:Q的学习目标由n步真实奖励加上第n步之后的估计值组成。

# n-step Sarsa 回报定义 # G_t^(n) = r_t + γ*r_{t+1} + ... + γ^(n-1)*r_{t+n-1} + γ^n * Q(S_{t+n}, A_{t+n})

当n=1时,它就是标准SARSA,完全依赖自举;当n趋于无穷大时,它退化成蒙特卡洛,完全依赖真实累计回报。n越大,偏差越小、方差越大;n越小,方差越小、偏差越大。这是理解算法谱系的钥匙:所谓不同算法,不过是"用多少步真实奖励来替换估计值"的不同选择。

4. SARSA与Q-learning对比:一个公式之差,on-policy与off-policy的分界线

4.1 两行公式背后的策略差异

第三题直接要求列出SARSA和Q-learning的更新公式。把它们并排写出来对比,差异一目了然:

# SARSA: Q(s,a) <- Q(s,a) + α * [r + γ*Q(s',a') - Q(s,a)] # Q-learning: Q(s,a) <- Q(s,a) + α * [r + γ*max_{a''} Q(s',a'') - Q(s,a)] # 行为策略在SARSA里是ε-greedy或其他策略;Q-learning的目标用的是max

SARSA的更新目标是下一个状态s'、下一个动作a'对应的Q值,其中a'是当前行为策略实际选出来的动作。Q-learning的更新目标则是s'下所有动作Q值的最大值,不管你实际下一步选了什么。这两个目标函数决定了它们的身份:SARSA是on-policy,因为更新用的目标值来自正在执行的行为策略;Q-learning是off-policy,因为目标值来自对最优策略的贪心假设,与行为策略无关。

考试里常见的问法是"SARSA和Q-learning谁更安全"。落实到具体情况:SARSA因为跟着行为策略走,在存在死亡陷阱(比如悬崖边走会掉下去)的环境里,它会把"避免危险"编码进Q值;Q-learning因为总是取max,在学习过程中会高估危险区域的乐观价值,实际执行时如果行为策略比较贪心,容易一头撞进陷阱。这是两类算法在实践中的一个真实差别。

4.2 手算SARSA更新:把每个数代进去

第四题给了一组具体的Q值,要求手动计算一次SARSA更新。起始条件:Q(s₁,a₁)=2,r=3,转移到s₂并选择a₂,Q(s₂,a₂)=3,α=0.5,γ=0.9:

Q_s1a1_old = 2 r = 3 gamma = 0.9 Q_s2a2 = 3 alpha = 0.5 Q_s1a1_new = Q_s1a1_old + alpha * (r + gamma * Q_s2a2 - Q_s1a1_old) # = 2 + 0.5 * (3 + 0.9*3 - 2) # = 2 + 0.5 * (3 + 2.7 - 2) # = 2 + 0.5 * 3.7 # = 3.85 print(f"更新后Q(s1,a1) = {Q_s1a1_new:.2f}")

这种手算题有两个高频失分点。一是漏掉γ对Q(s₂,a₂)的折扣,直接把0.9×3算成3;二是忘记减去旧Q值Q(s₁,a₁)=2,把括号里的式子写成了(r+γQ')就算了。每步都要严格按照"旧值+α×(目标值-旧值)"的模板代入,目标值里该折扣的折扣、该减的减,才能拿到步骤分。

4.3 值迭代与策略迭代:交错前进还是大步循环

第五题考的是值迭代和策略迭代的步骤。值迭代的更新公式是:

# v(s) <- max_a [ r(s,a) + γ * Σ_{s'} P(s'|s,a) * v(s') ]

它每一轮都把状态值更新为当前所有动作下能达到的最大值,本质上是贝尔曼最优方程的定点迭代。不需要显式维护策略,收敛后直接从Q值贪心提取策略。

策略迭代则是两步反复交替:先固定策略,做策略评估,算出该策略下的状态值;再做策略改进,按照当前状态值选择最优动作更新策略。直到策略不再变化,收敛到最优。策略迭代的收敛速度通常比值迭代快,但每一步都要解一次方程组或做多轮迭代,计算开销更大;值迭代每次只要做一次max操作,实现简单但迭代次数可能更多。考试答题时,步骤一定要写全:初始化策略、策略评估、策略改进、判断终止,四步缺一不可。

5. 强化学习刷题避坑:五个高频失误与排查方法

5.1 终止状态的价值被写成1/(1-γ):条件没看清

现象:第一题里把s₄的价值算成1/(1-γ)=10,导致v(s₁)、v(s₂)、v(s₃)全部连锁出错。

原因:某些教材用"s₄奖励1、带自环"的示例推导出v=1/(1-γ),直接套模板没注意本题s₄的奖励是0且是终止状态。

解决:动笔之前先圈出终止状态。终止状态的定义就是V=0,没有后续奖励。如果题目给了"奖励0、终止"这类字眼,直接令V(s)=0往回代。

5.2 蒙特卡洛被答成"离线学习"而丢掉后半句

现象:只写"MC是离线算法",判卷扣分。

原因:课程讲义里沿用了"离线"这个说法,但简单两个字不足以解释MC的本质——它不需要模型,但必须等回合结束才能更新。

解决:按"先跑完整回合并记录回报→计算累积回报→更新状态值→重复"四步作答,每步后面补一句作用。MC更新的触发条件是回合终止,不是"离线训练"这种模糊概念。

5.3 第六题把策略评估当成值迭代,直接用max取最优

现象:题目问"计算状态s₁在不同策略下的状态值",有人直接写max(9.4, 6.5)=9.4,当作最优值函数。

原因:看到v(s₁)就默认要求最优值,没注意题目问的是"该策略下"的值,而不是"最优策略下"的值。

解决:区分"策略评估"和"策略改进"。题目要求计算某个策略下的状态值,就按该策略每个动作逐一计算期望;只有题目明确说求最优策略或最优值函数时,才用max。

5.4 SARSA手算漏掉旧Q值的减法

现象:第四题算出Q(s₁,a₁)=2+0.5×(3+0.9×3)=4.85,和正确答案3.85差1分。

原因:把SARSA公式记成了Q_new = Q_old + α×(r + γQ_next),括号里漏了-Q_old这一项。

解决:UPDATE模板统一写成 new = old + α × (target - old)。先把target算清楚(r+γ×Q(s',a')),再和old做差,乘以α,最后加回old。每一步都单独打草稿,别心算跳步。

5.5 n-step Sarsa的n搞不清边界

现象:把n=0当成标准Sarsa来记。

原因:n-step是从时间步t开始往后数真实奖励的步数。n=1表示只取一步真实奖励,其余用自举估计,这才是标准Sarsa;n=∞才是MC。

解决:默念三遍"n=1是Sarsa,n=∞是MC,n越大越靠近MC"。看到"n-step"先确认n的值再写公式,避免把系数和指数写错。

6. 复习收尾:用n-step Sarsa串起整张算法谱系

如果只挑一条线索串起全部考点,我建议用n-step Sarsa。它把标准Sarsa和蒙特卡洛学习放在了两端,n=1时退化为标准Sarsa,完全靠自举更新;n→∞时退化为MC,完全靠真实累计回报。改变n,就是改变偏差与方差的权衡比例,而TD方法恰好是这条谱系上n=1的特例加上一个学习率α。

# 谱系对照 # MC: G_t = r_t + γ*r_{t+1} + γ^2*r_{t+2} + ... 方差大, 偏差小 # n-step: G_t = r_t + γ*r_{t+1} + ... + γ^(n-1)*r_{t+n-1} # + γ^n * Q(S_{t+n}, A_{t+n}) 折中 # SARSA: G_t = r_t + γ * Q(S_{t+1}, A_{t+1}) 方差小, 偏差大

顺着这条线回看整张卷子就清楚了:第一题的贝尔曼方程是Dyna-style规划的基础,第二题的MC与TD对比是时序差分学习的起点,第三题的SARSA与Q-learning是on-policy与off-policy的分水岭,第五题的值迭代与策略迭代是动态规划求最优的策略,第十题则是把这几个方法统一进一个框架收网。建议刷这套题时别按顺序刷,先从第十题开始,带着谱系感倒着做。

从那以后我每次复习强化学习,都会强制自己先默写一遍n-step Sarsa的回报公式,再顺着它展开成Sarsa和MC两个特例,最后落到值迭代的公式上。整套知识框架用十分钟就能过一遍,比盲目刷二三十道零散题管用。这份原题卷覆盖的考点和手算题型很典型,考前值得沉下心走一遍,希望帮到你。

本文还有配套的精品资源,点击获取