时序差分(TD)学习是强化学习最核心、最新颖的思想。TD学习结合了MC方法和DP方法的思想。TD learning 可以从经验中学习策略而不需要环境动态特性的模型;同时无需等待交互的最终结果,而可以基于已得到的其他状态的估计值来更新当前状态的价值函数(they bootstrap)。
本章先关注预测问题,然后是控制问题。这些方法的主要区别在于它们解决预测问题的不同方式。
相对于 c o n s t a n t constant constant- α \alpha α MC,上一章的方法都是 v a r i a b l e variable variable- α \alpha α MC(使用增量的方式取平均,便可得到变量步长参数 α \alpha α )。蒙特卡洛方法需要等到一幕结束时才能确定回报,来更新状态价值估计。TD方法只需要等到下一时刻即可更新估计。实际上,蒙特卡洛更新的目标是 G t G_t Gt,而TD更新的目标是 R t + 1 + γ V ( S t + 1 ) R_{t+1} + \gamma V(S_{t+1}) Rt+1+γV(St+1)。这种TD方法被称为 TD(0) 。
TD(0) is a bootstrapping method,因为它的更新某种程度上基于已存在的估计。TD methods combine the sampling of Monte Carlo with the bootstrapping of DP.
TD方法:采样+自举
表格型 TD(0) 的回溯图。Sample backups.
TD 误差。取决于下一个状态和下一个收益,在下一时刻才能获得。如果价值函数数组V在一幕内没有改变,则蒙特卡洛误差可写为TD误差之和。
例 6.1 开车回家:估计总时间=消耗时间+估计剩余时间。蒙特卡洛方法只能离线更新。根据TD方法的规则,each error is proportional to the change over time of the prediction, that is, to the temporal differences in predictions.
由上可得,时序差分:数值随时间的变化。
练习 6.2:
相比于DP方法,TD方法不需要环境模型,即动态函数p。相比于蒙特卡洛方法,TD方法自然地运用了一种在线的、完全递增的方法来实现。注:TD方法可以被应用于更广泛的问题。
一些蒙特卡洛方法必须忽略或折扣采取实验性动作的幕,这可能会大大减缓学习速度。而TD方法则不太容易受到这些问题的影响,因为它们从每次状态转移中学习,与采取什么后续动作无关。
对于任何固定的策略 π \pi π,TD(0) 都已经被证明能够收敛到 v π v_\pi vπ。大多数收敛性证明只适用于上述(6.2)算法中基于表格(table-based)的情况,但有些也适用于广义线性函数逼近(approximation)的情况。
目前还不能在数学上证明 TD 方法和蒙特卡洛方法哪个能更快地收敛,甚至尚不清楚如何来最恰当地形式化表述这个问题。不过在实践中,TD 方法在随机任务上通常比 c o n s t a n t constant constant- α \alpha α MC 方法收敛得更快。
例 6.2 随机游走:
马尔可夫收益过程(Markov reward process, MPR):不包含动作的马尔可夫决策过程。
练习 6.3:在第一幕中,智能体的序列为:C,0,B,0,A,0。因为终止状态价值为0, α \alpha α=0.1,其余状态价值为0.5。根据更新公式, V a = 0.45 V_a=0.45 Va=0.45。
练习 6.4:
练习 6.5:较大的 α \alpha α可以让算法快速收敛,但是后期却会造成估计值在真值周围以固定的幅度波动,波动幅度与 α \alpha α大小成正比。最初算法的估值十分接近真值,但是由于 α \alpha α为常数,使得估值又离开了真值,最终估值与真值的距离稳定在了一个固定的值。此现象与价值函数的初始化无关,假设将其初始化为真实值,较大的 α \alpha α会使估计偏离(drift away)真实值。
练习 6.6:动态规划:我们知道策略 π \pi π和动态函数p,因此所有状态都可以被精确计算。首访型MC策略估计:设置状态空间,并使用策略 π \pi π进行模拟。 在每个事件之后,对每个状态的回报进行回溯更新,并进行平均。我认为作者使用了动态编程,因为我们只需要解决6个简单的联立方程,而MC方法可能需要模拟数千幕才能收敛到真实值。
有限经验。思路:反复呈现这些经验,直到方法收敛至一个定值。
批量更新:根据给定的值函数,对于除终止状态外的每个时刻,计算增量,但是价值函数仅根据增量的和改变一次。然后利用新的值函数再次处理所有可用的经验,产生新的总增量,更新值函数,以此类推,直到值函数收敛。批量更新:只有在处理了整批的训练数据后才进行更新。
相比循环数据并每时刻进行更新(也算是一种异步更新?),优点?:减小采样方差对估计的影响?;在深度学习中,批处理一次性计算大型数组要比公开逐步计算各个小型数组速度更快[1]。
选择足够小的 α \alpha α,TD(0) 和 c o n s t a n t constant constant- α \alpha α MC 会收敛到不同的结果。在正常情况下,这些方法不会一下子就直接得到它们各自的批量更新最终结果。
例 6.3 批量更新的随机游走:每经过新的一幕后,之前所有幕的数据就被视为一个批次。批量TD方法始终优于批量蒙特卡洛方法。批量蒙特卡洛的估计是实际回报的样本平均,可以认为是最优估计,但是批量TD的性能却比批量MC更好。The Monte Carlo method is optimal only in a limited way, and that TD is optimal in a way that is more relevant to predicting returns.
例 6.4 你是预言者:V(A)的最优估计值 → \rightarrow → two reasonable answers:批量TD(0)方法:先建模,再根据模型计算(状态价值的更新顺序?答:多次迭代后才获得最优估计);批量蒙特卡洛方法:状态A只出现了一次且对应回报为0,因此V(A)=0。这个答案可以使训练数据上平方误差最小,实际上在这批数据上误差为零( ∑ ( \sum( ∑(采样-均值 ) 2 )^2 )2)。即使蒙特卡洛方法在现有数据上更好,但TD(0)方法会在未来数据上产生更小的误差(与真实值的误差?)。
两种方法的一般性区别:批量蒙特卡洛方法总是找出最小化训练集上均方误差的估计,而批量TD(0)总是找出完全符合马尔可夫过程模型的最大似然估计(the maximum-likelihood estimate)参数(这也使得在无法满足马尔可夫性时,MC方法的性能下降最小)。一般来说,一个参数的最大似然估计是使得产生训练数据的概率最优的参数值。确定性等价估计(certainty-equivalence estimate):如果模型正确,则估计正确;它等价于假设基本过程的估计是确定性的。
这一点也有助于说明为什么TD方法比蒙特卡洛方法收敛得更快。在以批量形式学习时,TD(0)计算的是真正的确定性等价估计。相比之下,批量蒙特卡洛计算的是最小平方误差估计,它对基本过程的估计(即对模型的估计)是近似的而不是确定性的。
最后,值得注意的是,直接计算确定性等价估计几乎是不可能的。对于n个状态的问题,建立过程的最大似然估计需要 n 2 n^2 n2 个内存( n × n n\times n n×n),用传统方法计算相应的价值函数则需要 n 3 n^3 n3 数量级的步骤。相比之下,TD方法则可以使用不超过 n n n 个内存,并通过在训练集上反复计算来逼近同样的答案。对于状态空间巨大的任务,TD方法可能是唯一可行的逼近确定性等价解的方法。
练习 6.7:(省略了部分流程)
For every step in the episode:
A ← A ← A← the action under policy b b b at state S S S
ρ t : t ← 1 b ( A ∣ S ) \rho_{t:t} \leftarrow \frac{1}{b(A|S)} ρt:t←b(A∣S)1
Obtain R , S ′ R, S' R,S′
Q ( s , a ) ← Q ( s , a ) + α [ ρ t : t R + ρ t : t γ Q ( s ′ , a ) − Q ( s , a ) ] Q(s,a) \leftarrow Q(s,a) + \alpha[\rho_{t:t}R + \rho_{t:t}\gamma Q(s',a) - Q(s,a)] Q(s,a)←Q(s,a)+α[ρt:tR+ρt:tγQ(s′,a)−Q(s,a)]
π ( S ) ← a r g m a x a Q ( S , a ) \pi(S) \leftarrow argmax_aQ(S,a) π(S)←argmaxaQ(S,a)
S ← S ′ S ← S' S←S′
TD预测 + GPI
和使用蒙特卡洛方法时一样,我们同样需要在试探和开发之间做出权衡。
Sarsa (an on-policy TD control method):和所有其他同轨策略方法一样,持续地为行动策略 π \pi π 估计其动作价值函数 q π q_\pi qπ,同时以 q π q_\pi qπ 为基础,朝着贪心优化的方向改变 π \pi π。
The convergence properties of the Sarsa algorithm depend on the nature of the policy’s dependence on Q. 策略为 ϵ \epsilon ϵ- g r e e d y greedy greedy 策略或 ϵ \epsilon ϵ- s o f t soft soft 策略。
例 6.5 Windy Gridworld:不能简单地将蒙特卡罗方法用在此任务中,因为不是所有策略都能保证终止。
强化学习早期的一个重要突破。待学习的动作价值函数使用对最优价值函数 q ∗ q_* q∗ 的近似而不是正在遵循的策略进行更新(作为对比,Sarsa使用待学习的动作价值函数本身作为学习目标)(价值迭代和Q-learning都将最优价值函数作为更新规则/学习(更新)目标,只不过一个是规划一个是学习)。
找到最优行为的条件:所有二元组都能持续更新;步长参数满足随机近似条件。
例 6.6 在悬崖边上行走:比较同轨策略和离轨策略两种方法间的区别。Sarsa 安全路径,Q-learning 最优路径。Q-learning 学到了最优策略,但由于动作是通过 ϵ \epsilon ϵ- g r e e d y greedy greedy 的方式来选择的,所以智能体偶尔会掉下悬崖。与之对比,Sarsa 考虑了动作选择的方式(即 ϵ \epsilon ϵ- g r e e d y greedy greedy),学到了一条更远但更安全的路径。由于 Q-learning 学到的最优策略偶尔会掉下悬崖,所以其在线性能不如学到迂回策略的 Sarsa。当然,如果 ϵ \epsilon ϵ 逐渐减小,那么两种方法都会渐近地收敛到最优策略。
练习 6.11:因为 Q-learning 用来学习的策略和生成样本的策略不同,其目标策略是贪心策略,而行为策略是 ϵ \epsilon ϵ- g r e e d y greedy greedy 策略。
练习 6.12:是的。如果采用贪心策略,两种算法将完全相同,但是动作选择和权重更新可能不同,这取决于Q和S的初始化。例如,如果每个状态-行动对被分配一个随机值 Q ( s , a ) ∈ ( 0 , 1 ) Q(s,a)∈(0,1) Q(s,a)∈(0,1),每种情况下的贪婪动作选择会不同。因为动作选择不同,更新也不同,并且因为两种算法都没有探索,所以不能保证它们会收敛在同一个解决方案上。
遵循 Q-learning 的模式,但对于下一个“状态-动作”二元组取期望。给定下一个状态,该算法确定地向期望意义上的Sarsa算法所决定的方向移动。
Expected Sarsa 更复杂,但它消除了因为随机选择 A t + 1 A_{t+1} At+1 而产生的方差。在悬崖行走中,状态的转移是确定的,随机性完全来自于策略。此时期望 Sarsa 可以放心地设定步长为1(学习目标不受策略的随机性的影响),而不用担心长期性能地损失。相比之下, Sarsa 只能在步长较小时有良好地长期表现,但这样短期性能会非常差。
在本例中期望 Sarsa 被用作一个同轨策略。但一般情况下,通过调整目标策略和行为策略,期望 Sarsa 可以成为离轨策略算法。期望 Sarsa 涵盖并推广了 Q-learning,同时比起 Sarsa 也稳定地提升了性能。除了增加了少许计算量外,期望 Sarsa 应该完全由于这两种 TD 算法。
构建目标函数时的最大化操作。在之前讨论的控制算法中,一个超过估计值的最大值被隐式地用作最大值的估计,这会产生一个显著的正偏差。正偏差(a positive bias):估计值大于真实值的部分。最大化偏差(maximization bias,又称过估计overestamation):一个超过估计值的最大值被隐式地作为对最大值的估计,所产生的一个显著的正偏差。注:隐式地(implicitly),表明这种对应关系可能是对的,也可能是错的。
例 6.7:最大化偏差会损害TD控制算法的性能。注:状态B有很多动作,它们的收益服从均值为-0.1,方差为1的正态分布。在交互中,很有可能一些动作的价值被高估(即它们的估值含有正偏差,估计值大于真实值甚至大于0),导致出现最大化偏差。在更新时,贪心策略不断地将被高估的动作的值反向传递给之前的状态。由于 Q-learning 根据动作价值的最大值来选取动作,最大化偏差可能会导致某些动作的估计值超过了实际最优动作的估计值,使得智能体不断选择这些动作,进而影响算法性能。
既然最大化偏差会影响智能体的决策,那么有没有算法可以避免最大化偏差?先考虑一个赌博机的例子。
有一种看法是,最大化偏差是由于确定价值最大的动作和估计其价值这两个过程使用了相同的样本。双学习(double learning):将样本分为两个集合,学习两个独立的对真实价值的估计 Q 1 ( a ) Q_1(a) Q1(a) 和 Q 2 ( a ) Q_2(a) Q2(a)。一个用来确定最大的动作(此动作可能不是实际最优动作) A ∗ = a r g m a x a Q 1 ( a ) A^*=argmax_aQ_1(a) A∗=argmaxaQ1(a),另一个用来计算其价值的估计 Q 2 ( A ∗ ) = Q 2 ( a r g m a x a Q 1 ( a ) ) Q_2(A^*)=Q_2(argmax_aQ_1(a)) Q2(A∗)=Q2(argmaxaQ1(a))。由于 E [ Q 2 ( A ∗ ) ] = q ( A ∗ ) E[Q_2(A^*)]=q(A^*) E[Q2(A∗)]=q(A∗),因此这个估计是无偏的。上述步骤也可以交换角色进行,以得到另一个无偏估计。这两个无偏估计便是对真实价值的最大值的估计。
如此我们便可以避免赌博机的动作价值估计的最大化偏差。虽然我们一共学习了两个估计值,但每次游戏只更新一个估计值(即执行动作,然后将收益添加到其中一个集合中)。双学习需要两倍的内存,但每步无需额外的计算量。注:两个集合,相当于对于每个动作,都有两个分布。即使第一个分布中存在最大化偏差,其选出来的动作在第二个分布中也产生最大化偏差的概率很小。
双学习的思想可以很自然地推广到具有完备MDPs的算法s中。Double Q-learning。用一个估计来更新另一个估计。两个动作价值的估计值都可以在行动策略中使用。
练习 6.13: Q 1 ( S , A ) ← Q 1 ( S , A ) + α ( R + γ ∑ a π ( a ∣ S ′ ) Q 2 ( S ′ , a ) − Q 1 ( S , A ) ) Q_1(S,A)\leftarrow Q_1(S,A) + \alpha(R+\gamma \sum_{a}\pi(a|S')Q_2(S',a)-Q_1(S,A)) Q1(S,A)←Q1(S,A)+α(R+γ∑aπ(a∣S′)Q2(S′,a)−Q1(S,A))
第一章中的井字棋游戏 → \rightarrow → afterstates & afterstate value functions:动作之后产生的状态的价值。当我们只知道环境动态的初始部分的信息/知识而不一定知道全部动态信息时,后位状态很有用。后位状态价值函数是利用这种知识的一种更高效的学习方法。
在井字棋中,很多“状态-动作”二元组都会产生相同的状态,即相同的后位状态。传统的价值函数会分别评估这些“状态-动作”二元组,而后位状态函数会将这些情况看作是一样的。
除了游戏,后位状态还能被应用在很多任务中。在这种情况下,动作实际上是根据它们完全已知的直接影响来定义的。
虽然又很多特殊任务使用特殊的学习算法,但是本书中提到的原理是广泛适用的。
练习 6.14:因为状态之间的转换是确定的,我们可以使用后位状态方法。对租车问题的每个状态,列出所有可能的后继状态。根据后继状态的价值, ϵ \epsilon ϵ-贪心地行动。类似于井字棋,我们的动作和对手的动作(租车还车数)交替进行。
由于很多二元组的后继状态都相同,使用后位状态将会减少需要评估的状态的数量,降低计算成本,因此能够加速收敛。
对于预测问题,如何维持足够的试探?
Expected Sarsa 是一种离轨策略方法。
TD方法是一种一般性方法,除了强化学习问题外,它们是用来学习如何在动态系统中做出长期预测的一般方法。
[1] Saitoh, Koki. Deep Learning from the Basics: Python and Deep Learning: Theory and Implementation. Packt Publishing Ltd, 2021.