简介:这份PDF文档汇总了强化学习课程A卷期末考试的原始试题与详细解答,面向高校相关专业学生、考研备考者及需要快速梳理强化学习核心概念的自学者。内容覆盖折扣因子、状态转移与奖励、贝尔曼方程、蒙特卡洛方法、时间差分方法、SARSA与Q-learning对比、值迭代与策略迭代、MDP以及状态-行动值函数等高频考点,并配有带计算步骤的典型例题与答案解析,便于对照公式理解推导过程。资源为单个PDF文件,大小约332KB,内容紧凑,适合考前冲刺、专题复习或作为教学配套练习使用。目前已有290人学习下载,题目与解答一一对应,能帮助读者快速定位薄弱环节,巩固强化学习中的关键算法与理论基础。
1. 强化学习到底在学什么:从一只学叼球的小狗说起
设想你在教一只小狗叼球。它一开始乱扑,扑错给轻奖励,叼到球给大奖励,几次以后就慢慢学会先看球再动嘴——因为它摸清了“什么状态下做什么动作,将来的甜头更大”。
强化学习就是让智能体通过试错,在一个马尔可夫决策过程(MDP)里学会这套判断。听起来玄学,可期末考卷把它拆成了固定考点:贝尔曼方程怎么算价值,蒙特卡洛和TD怎么更新价值,SARSA与Q-learning怎么改进策略,值迭代与策略迭代怎么找最优。这份A卷复习资料把每个考点都做成了带答案的原题,下面我用大白话把这套流程讲透。
2. 为什么要给未来奖励打折:折扣因子、状态转移与贝尔曼方程
强化学习的公式里,最先让你犯迷糊的一般是折扣因子γ。原题第一问设定“折扣因子γ=0.9的网格世界”,后面的贝尔曼方程全绕不开它。要搞懂这类题,得先把三件事串起来:γ怎么影响价值、状态转移和奖励提供什么信息、贝尔曼方程怎么把这些信息变成可解的方程组。
2.1 折扣因子:未来的100块为什么不值现在的100块
先问一个问题:一年后的100块,和现在手里的100块,你选哪个?大概率选现在。原因很简单——现在的钱马上能花,未来的钱要等,中间还可能变数不断。折扣因子γ就是把这种“未来的贬值”量化成一个0到1之间的系数。
γ=0.9的意思是:每往后走一步,奖励在“今天”的眼里就打9折。下一步的奖励只算90%,下两步只有81%,下三步只有72.9%。奖励越往后,折算到当前决策里的权重越小。这个设定不是拍脑袋,它解决了两个实际问题。
第一,避免价值变成无穷大。在一个永不终止的环境里,如果γ=1,累积奖励一路加下去迟早发散,算法没法比较“哪种策略更好”。打完折,几何级数在γ<1时收敛,价值才是一个可以计算的有限数。第二,控制决策眼光。γ越接近1,智能体越看重长远收益;γ越接近0,智能体越只顾眼前。期末题常把γ设成0.9,就是为了让当前奖励和远期奖励都保持一定分量。
计算时有一个高频结论:当某个状态的价值满足 v(s) = r + γv(s) 时,也就是“当前价值等于即时奖励加上折扣后的自身价值”,解出来就是 v(s) = r/(1-γ)。网格世界里的终止状态正是这种情况。原题里 s4 的价值只和自己有关,代入 γ=0.9 可得 v(s4) = 1/(1-0.9) = 10。这是整道计算题的“地基”,因为 s2、s3 的价值都指向 s4,地基定了,上面的状态才能一个个解出来。
2.2 状态转移与奖励:环境给智能体的两张牌
网格世界题的描述里有另一组关键信息:从 s1 出发,有50%概率进入 s2(奖励相关值为1),有50%概率进入 s3(奖励相关值为1);从 s2 出发总是进入 s4;从 s3 出发也总是进入 s4。这些内容翻译成强化学习的行话,就是“状态转移”和“奖励函数”。
状态转移回答“做了某个动作之后会到哪去”。关键在于它可以是概率性的——同一个动作不一定每次都落到同一个状态。例如原题中 s1 的两个去向各占一半概率。奖励则是在这次转移发生时,环境立刻给智能体的反馈。一个管去路,一个管打分,两者共同决定了“这一步到底划不划算”。
为什么概率这么重要?因为强化学习里的几乎所有公式都在算期望。期望就是给每种可能的下一个状态赋予一个概率权重,再把这些权重下的未来收益汇总。看到 P(s'|s,a) 和 r(s,a) 这类记号时,你要知道它们只是压在公式底层的信息卡片:这张写着“到哪儿去的概率”,那张写着“到那儿能拿多少”。贝尔曼方程所做的,不过是把两张卡片合起来,算一个带折扣的加权均值。
这部分还隐含一个重要习惯:做题时先把状态转移和奖励列成一张表,再写贝尔曼方程。列清楚了,后续每一步计算都不容易错。这也是复习这类题最值得养成的动作。
2.3 贝尔曼方程:把长远收益写成一封递归的信
现在可以进入核心:贝尔曼方程。它的形式看起来是一堆字母,本质上只有一句话——当前状态的价值,等于“本步的期望奖励,加上折扣后的下一个状态的期望价值”。
用原题的四个状态举例,可以写出四个方程:
v(s1) = 0.5×[0 + γv(s3)] + 0.5×[-1 + γv(s2)] v(s2) = 1 + γv(s4) v(s3) = 1 + γv(s4) v(s4) = 1 + γv(s4)
竖着看这些式子,会发现 s1 的价值取决于 s2、s3,而 s2、s3 又取决于 s4,s4 又取决于自己。这一串“我依赖你、你依赖它、它依赖我”的循环,正是递归的形态。方程的解,就是把这些层层依赖同时满足的那组状态价值。
具体代入很简单:先解 s4,v(s4)=1+0.9v(s4),得到 v(s4)=10;再带回 s2、s3,各自得到10;最后带回 s1,算出一个确定数值。整个过程可以用一小段Python描述:
gamma = 0.9 # 四个状态的贝尔曼方程 # v4 = 1 + gamma * v4 # v3 = 1 + gamma * v4 # v2 = 1 + gamma * v4 # v1 = 0.5 * (0 + gamma * v3) + 0.5 * (-1 + gamma * v2) v4 = 1 / (1 - gamma) # 终止状态自环,v(s)=r/(1-γ) v3 = 1 + gamma * v4 # s3 的价值指向 s4 v2 = 1 + gamma * v4 # s2 的价值也指向 s4 v1 = 0.5 * (0 + gamma * v3) \ + 0.5 * (-1 + gamma * v2) # s1 两个去向各占 50%这段代码不算算法,只是把四个方程翻译成可执行的算术。gamma=0.9 是折扣因子,v4 用自环公式一步求出,v3、v2 都是“即时奖励1 + 折扣后的 v4”,v1 则按两个去向的概率加权求和。执行完,v1 等于 8.5。很多人第一次算出这个数时会怀疑“价值怎么比即时奖励还高”,原因就是价值包含了后面无数步的折扣累积,只要 γ 不太小,价值就会明显高于第一步的奖励。
所以贝尔曼方程不是一道孤立的数学题,它是所有后续算法的理论源头。蒙特卡洛和时间差分本质上是用不同方式去估计方程里的期望;SARSA和Q-learning则在方程的基础上换了“下一步的动作价值取谁的”。把这张递归的关系记在脑子里,后面每一章都能对号入座。
3. 先跑完再复盘,还是走一步算一步:蒙特卡洛与时间差分
有了贝尔曼方程,下一步要让它“跑”起来变成可执行的算法。原题第二问直接问:蒙特卡洛和时间差分是什么,谁是在线算法谁是离线算法。这个问题其实是在问:你打算用什么节奏去更新价值。
3.1 蒙特卡洛方法:一局打完,完整复盘
蒙特卡洛的想法非常朴素:要估计一个状态的价值,那就真把这个状态所在的回合跑到结束,把这一路上累积的奖励全部收集起来,用一个“真实回报”来修正估计。
回报的定义是:
G(t) = r(t) + γr(t+1) + γ²r(t+2) + ...
r(t) 是当前步的即时奖励,后面每一项都带着越来越高的折扣。把这个 G(t) 和当前估计值 v(s) 一比,用学习率 α 修正:
v(s) ← v(s) + α×(G(t) - v(s))
更新的含义是:如果这次真实回报比原来的估计高,就往高调一点;低,就往低调一点。跑很多个回合后,v(s) 就会被拉向多次回报的平均值。这就像一个人看了十场球赛,用十场比分来估计主队的真实水平,每场结束只修正一点。
蒙特卡洛有一个绕不开的代价:必须等回合结束。围棋要下完一盘才能复盘,智能体要走到终止状态,才知道这一路的“总成绩单”。所以它被归为离线算法。这里的“离线”不是说它不能实时控制动作,而是说它的价值更新只能发生在完整轨迹结束之后。原题第八问给出的蒙特卡洛流程,就是五个步骤:先初始化价值;在环境中按策略跑一个回合并记录路径;算出从每个状态出发的累计回报 G(t);按上面的公式更新价值;重复直到收敛。这套流程特别适合回合分明的任务——一局游戏、一次导航、一盘对局,天然就知道终点在哪儿。
下面是一段更直观的Python伪代码,展示蒙特卡洛的一次完整更新:
alpha = 0.1 gamma = 0.9 def mc_update(rewards, states, V): G = 0 # 从回合末尾向前累计回报,天然实现 G = r + γr_next + ... for t in reversed(range(len(rewards))): G = rewards[t] + gamma * G s = states[t] # 用本次完整回报更新状态价值 V[s] = V[s] + alpha * (G - V[s]) return V这段代码的关键是“从后往前”累计:最后一刻的回报先记为 G,然后向前每一步 G = r + γG,这样每一步都拿到了从该状态到回合结束的完整回报,再按 α 的比例修正 V[s]。如果任务没有明确的“回合结束”,蒙特卡洛就用不了,这时就该轮到时间差分出场。
3.2 时间差分方法:走一步就估一次
时间差分的方法论是:没必要非等终点不可。每一步转移发生后,你手里已经有两个信息:刚拿到的即时奖励 r,以及新状态的当前估计价值 v(s')。于是可以立刻构造一个“本次看到的未来估计”:
r + γv(s')
它既用了真实采到的奖励 r,又用了尚未完全准确的猜测 v(s'),所以叫“自举”。更新公式是:
v(s) ← v(s) + α×(r + γv(s') - v(s))
方括号里的差叫 TD 误差。它衡量的是“刚刚走的这一步,比我原来预想的好多少”。如果实际奖励加下一步估计高于原来的价值,就把 v(s) 向上调;低则下调。每一步都能做一次这样的修正,完全不需要等到回合结束——这就是时间差分属于在线算法的原因:智能体可以一边走路一边修正对每条路的判断,走一步学一次。
TD 方法结合了两边的优点:它有蒙特卡洛的“采样”成分,从真实转移中拿数据;它又有动态规划的自举成分,用现有估计来更新未来估计。代价是初始阶段 TD 的估计会带着“想象成分”——因为下一步的 v(s') 还没准,可能把错误一路传下去。这个偏差会随着数据变多慢慢消失,但方差比完整回报要小,因为每一步只赌一步,不需要赌一整条轨迹。
用同场景对比:蒙特卡洛像“期末统一考试后按总成绩改平时的印象”,时间差分像“每道练习题做完立刻订正”。前者反馈更真实,但来得慢;后者反馈及时,但每道题的正确性会影响后面订正的基准。
3.3 在线与离线:先分清“更新时机”再谈算法
原题要求判断 MC 和 TD 谁在线谁离线,这正是最容易弄混的维度。在线/离线其实只回答一个问题:价值能不能在一回合结束前更新?
| 方法 | 更新时机 | 是否需要完整终止状态 | 主要风险 |
|---|---|---|---|
| 蒙特卡洛 | 回合结束后 | 必须 | 方差大,无法用于没有终止点的连续任务 |
| 时间差分 | 每一步结束后 | 不需要 | 初始估计不准确时,偏差会被自举放大 |
拿到任何算法,先问“它什么时候更新”,再去想别的。蒙特卡洛是离线算法,时间差分是在线算法,这个结论在期末题里可以直接用。但一定要记住:在线/离线针对的是“更新时机”,后面要讲的 on-policy/off-policy 针对的是“更新时数据是否来自当前策略”。两个维度互相独立,一个算法可以是在线的、off-policy,比如 Q-learning;也可以是离线的、on-policy,比如用当前策略收集回合后再用同一策略评估的蒙特卡洛。很多人栽跟头,就是把“在线”和“on-policy”当成了同一回事。
4. 最易混的概念逐个拆:SARSA、Q-learning、两种迭代与价值函数
原题从第三问开始进入高频易混区,考试丢分的重灾区也在这里。我把最常搞混的四组概念放在一起,每条说清“怎么混”和“怎么分”。
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 Q(s',a') - Q(s,a)]
公式几乎长得一样,唯一的区别是方括号里到底用 Q(s',a') 还是 max Q(s',a')。SARSA 用“当前策略在下一个状态实际选出的动作 a' 的Q值”;Q-learning 用“下一个状态里所有动作中最大的那个Q值”。
这背后的差异可以打个比方。你开车快到一个路口时,SARSA 会想:按我平时的驾驶习惯,我会转进哪条路,按这条路走下去收益有多少。Q-learning 会想:如果这里有一个完美司机,他会选哪条路,那条路能带来多高的收益。一个带着自己策略的“脚印”去评估,一个朝着“理论上最好的那个”去评估。
由此推出 on-policy 和 off-policy 的分野:
- SARSA 是 on-policy,学习和更新都基于当前正在用的策略。探索期里策略会犯错,SARSA 的价值估计也会包含这些错误的预期,因此更保守、更稳。
- Q-learning 是 off-policy,它用什么策略收集数据都可以,只要拿到 (s,a,r,s') 四元组,就可以用 max 那一项把价值朝“最优可能”修正,因此更乐观,更新方向更激进。
原题第四问给了一个代入题:Q(s1,a1)=2,执行 a1 后拿到奖励 r=3,转移到 s2 并选择了动作 a2,已知 Q(s2,a2)=3,α=0.5,γ=0.9。用 SARSA 算:
Q(s1,a1) = 2 + 0.5×[3 + 0.9×3 - 2] = 3.85
注意方括号里用的是 Q(s2,a2)=3,不是 s2 下所有动作的 max。如果把 3 换成 s2 里的最大Q值,同一道题就变成了 Q-learning。做题时关键不是背公式,而是看清题目给的是“实际选择的动作”还是“最大价值的动作”。
下面把两套更新放在一起对比:
# SARSA: 依赖实际下一步动作 a1 的 Q 值 Q[s][a] += alpha * (r + gamma * Q[s1][a1] - Q[s][a]) # Q-learning: 依赖下一状态所有动作的最大 Q 值 Q[s][a] += alpha * (r + gamma * max(Q[s1][:]) - Q[s][a])前一行里的 a1 来自当前策略的真实选择,后一行的 max 则绕开了当前策略。这就是两套算法在代码层面唯一的实质差异,也是判断到底是 on-policy 还是 off-policy 的起点。
4.2 值迭代与策略迭代:一个磨价值,一个磨方案
值迭代和策略迭代都在解决“找最优策略”的问题,但路径完全不同。
值迭代的更新:
v(s) ← max [r(s,a) + γ Σ P(s'|s,a) v(s')]
它每一步都直接把状态价值置成“所有动作里未来收益最大的那个”。整个过程中只关心一个变量——价值函数。价值磨到收敛,最优策略就是每个状态下选择价值最高的动作,自然浮现。
策略迭代换了一种节奏:
- 先随便初始化一个策略 π;
- 策略评估:用当前策略把每个状态的价值算出来;
- 策略改进:看看哪个动作能带来更高价值,把策略改成选那个动作;
- 重复评估和改进,直到策略不再变化。
打个比方:值迭代像“每到一个路口就重新查一次地图,把所有路的价值标出来,最后直接挑最优路”;策略迭代像“先按一套方案走几天,发现某条路更好就走那条,不断微调路线”。
两者的关系不是谁取代谁。值迭代通常代码简单,适合状态空间不大、转移概率已知的离散问题;策略迭代每轮评估价值时要解一组方程,轮数往往更少,但每轮开销更大。很多实际实现会先跑几轮策略迭代加速,再切到值迭代收尾。期末题考这个对比,通常是让你指出两个关键区别:值迭代更新价值时用 max,策略迭代则是“评估+改进”交替进行。
4.3 状态值 v(s) 与行动值 Q(s,a):一个看位置,一个看动作
状态值衡量“站在某个状态,按当前策略走下去,长期期望收益是多少”。行动值衡量“在这个状态执行某个动作,之后再按当前策略走,长期期望收益是多少”。
两者有明确关系:状态值等于行动值在策略分布下的加权平均。
v(s) = Σ π(a|s) Q(s,a)
也就是说,Q 比 v 多了一层“动作”信息。想判断一个状态本身好不好,看 v 就够了;想决定下一步做哪个动作,必须看 Q。
在策略改进时,我们得靠 Q 选出价值最高的动作,再把这个动作作为新策略的走向。这也是原题第九问要求写出两个公式、说出各自作用的原因:状态值用于评估状态和策略的好坏,行动值用于指导动作选择和策略改进。两者相互配合,一个管“评估”,一个管“决策”。
4.4 在线/离线与 on-policy/off-policy:两个独立维度,别混成一锅
这组混淆几乎每个人都会踩一回。我第一次做题也栽在这——把在线算法和 on-policy 当成同义词,结果一遇到 Q-learning 就糊涂了:它明明能每步更新,怎么还会是 off-policy?
关键在于“在线/离线”只回答更新时机,“on-policy/off-policy”只回答数据来源。
在线/离线轴的判断句是:这个算法需要等一个完整回合才能更新吗?等,就是离线;不等,就是在线。MC 离线,TD 在线。
on-policy/off-policy轴的判断句是:算法更新时,方括号里用的是当前策略实际选出的动作,还是不受当前策略控制的值?SARSA 用实际选出的动作,是 on-policy;Q-learning 用 max,是 off-policy。
把两个维度放在一起,会得到四个可能的组合。Q-learning 是“在线的 off-policy 算法”,这不是矛盾,恰恰说明两个维度本来就不相等。SARSA 是“在线的 on-policy 算法”。蒙特卡洛如果回合结束后用同一条策略评估,就是“离线的 on-policy”。做题时每遇到一个算法,先拆成两问:什么时候更新?更新时用谁的 Q 值?拆完这两问,这组概念就再也不会骗人了。
4.5 n-step Sarsa:夹在中间的学习节奏
原题第十问还讨论了一个细节:n-step Sarsa。它把 SARSA 和蒙特卡洛放在同一条轴上,n 就是“看一眼多远的未来”。
当 n=1 时,它就是标准 Sarsa,每一步只看一步以后,偏差相对大但方差小。当 n 趋向无穷时,它几乎等于蒙特卡洛,要等完整轨迹的回报,方差变大但偏差变小。n 取中间值时,它是两者的混合:看得越远,越接近真实回报;看得越近,越依赖自身估计。这个“偏差-方差权衡”是理解一切强化学习算法取舍的钥匙,也是原题把三者放一起考的原因。
5. 怎么选:有地图就规划,没地图就试错
原题第七问把基于模型和无模型的方法放在一起比较,并让你给出应用场景。这道题其实是整套资料的收尾:前面学的贝尔曼、MC、TD、SARSA、Q-learning,最终都指向一个问题——你知道环境长什么样吗?
如果你知道转移概率 P(s'|s,a) 和奖励 r(s,a),你手里就有一张完整地图。贝尔曼方程可以直接联立求解,值迭代、策略迭代都可以用精确公式推出最优策略。这种基于模型的方法,好处是样本效率高、不需要大量试错;风险全压在“模型准不准”上。模型一旦和真实环境有出入,后面所有决策都会被带偏。
而如果你对环境一无所知,只能用智能体去真实环境中采样,那么蒙特卡洛和时间差分这类无模型方法就是主场。它们不需要你画地图,靠大量交互一点点把价值函数磨出来。代价是样本效率低、收敛慢;好处是适应性强,环境再怎么动态变化,只要交互接口不变,算法就能慢慢跟上。
选择边界其实一句话就能概括:模型容易拿到且稳定的时候,优先用基于模型的方法;环境复杂、模型难以建立或总在变化的时候,直接上无模型方法。原题提到的棋类游戏和经典控制,是典型的模型已知场景;机器人导航、开放世界的控制任务,则是无模型方法的主场。
我自己复习这套题时,最深的教训不在于记不住公式,而在于动手前没先问“环境模型我知不知道”。明明题目给了转移概率,我却习惯性地想去套 Q-learning 的通用框架,绕了一大圈才走回贝尔曼方程的精确解。从那以后,我拿到任何强化学习问题,都强制自己先拆两步:第一步,环境模型可不可得;第二步,更新时机和数据来源各是什么。这两步走完,该用哪个算法、该写哪个公式,基本就清清楚楚了。
希望这套“先定义、再推导、后区分”的思路能帮到你。把这套题每一步都自己推一遍,强化学习就不再是那个一上来就劝退的黑匣子了。
本文还有配套的精品资源,点击获取