Temporal-Difference Learning
让我们再回顾一下贝尔曼方程。在给定模型(给定pδ)时,我们可以对于给定的策略π,用公式vπ(s)=a∑π(a∣s)[r∑r⋅pr(r∣s,a)+γs′∑pδ(s′∣s,a)⋅vπ(s′)]求出每个状态s的状态值。我们在蒙特卡罗方法一文中提到,因为现实中大多数pδ可能并不能被提前建模,所以需要用“采样”的方法来得到概率pδ。基础的蒙特卡罗方法,需要采样足够多次才能得出一个相对准确的估计。我们也提出了一系列优化方案,来降低所需的采样次数。本文我们将介绍一类特殊的优化方案,称为时序差分方法(Temporal-Difference Learning)。
给定策略π,在贝尔曼方程中的a∑π(a∣s)r∑r⋅pr(r∣s,a)这一项可以看作“依照策略π,在状态s做动作得到的即时奖励的期望”,我们把它记为E[R∣s],其中R是一个关于s,a,pr的随机变量。而a∑π(a∣s)s′∑pδ(s′∣s,a)⋅vπ(s′)这一项可以看作“依照策略π,从状态s转移得到的节点的状态值的期望”,我们把它记为E[vπ(S′)∣s],其中S′是一个关于s,a,pδ的随机变量。这样,贝尔曼方程就可以写作:
vπ(s)=E[R+γ⋅vπ(S′)∣s]
这称为贝尔曼期望方程(Bellman Expectation Equation)。经过这样的改写,我们就可以通过对随机变量R,S′做采样,来代替期望的计算,从而也就不再要求pδ是已知的。
我们用上一文中的Robbins-Monro算法来求解贝尔曼期望方程:令g(v(s))=v(s)−E[R+γ⋅vπ(S′)∣s],那么方程g(v(s))=0的解v就是状态值的准确值vπ。根据Robbins-Monro算法,我们需要对所有s∈S迭代vt+1(s)=vt(s)−atg~(vt(s))。其中,为了采样g~(vt(s)),需要在状态s采样两个随机变量R,S′的值r,s′:g~(v(s))=v(s)−(r+γ⋅vπ(s′))。这样得到的迭代式为:vt+1(s)=vt(s)−at⋅[vt(s)−(rt+γ⋅vπ(st′))]。但是这个迭代式右边出现了vπ,而这是未知量,导致我们无法用这个式子做求解。于是,人们把右边的vπ直接替换为了vt,得到了这样一个迭代式:
vt+1(s)=vt(s)−at⋅[vt(s)−(rt+γ⋅vt(st′))]
对于每一时刻t,我们都要对所有s∈S采样rt和st′,用上面这个式子计算vt+1(s)。由Robbins-Monro算法的收敛性分析可以证明:当t∑at=∞,t∑at2<∞时,vt(s)将会以概率1收敛到vπ(s)。
在实际应用中,通常会取at是一个小的常量。此时虽然t∑at2<∞不再满足,但是实验表明效果很好。
一个重要的观察是,我们实际上可以在机器做任务的过程中就完成上述更新。随意设定每个状态s的初值v0(s),接下来我们让机器从状态s0出发依照策略π行动,于是我们得到了一列样本s0,r1,s1,r2,⋯,rn,sn。对于s0而言,r1和s1本身就构成了一次对“R,S′”的采样,所以此时已经能够完成v1(s0)的更新。一般地,ri+1,si+1就能够完成vk(si)的更新,其中k是si已经被更新的次数。所以,我们可以按照本次行动经过的状态设定时刻,每次由st转移到st+1时,就做更新:
vt+1(s)={vt(st)−at⋅[vt(st)−(rt+1+γ⋅vt(st+1))]vt(s),s=st,s=st
可见,这样的更新是在线的。只需要从足够多个初始状态出发,按照策略行动足够多次,就可以在行动的过程中自动完成所有状态的状态值的求解。
上面这个算法就称为时序差分方法,简称TD-Learning。直观上,TD-Learning在每一次修改v(st)时,会减去一个“相邻时刻的差分项”vt(st)−(rt+1+γ⋅vt(st+1)),这个差分项随着t的增大而减小,直到t→∞时,因为vt→vπ,所以vπ(st)−(rt+1+γ⋅vπ(st+1))=0(期望意义下)。
通常会记:vt:=rt+1+γ⋅vt(st+1),称为“TD-target”;记δt:=vt(st)−(rt+1+γ⋅vt(st+1)),称为“TD-error”。
和一般的蒙特卡罗方法相比,时序差分方法最大的优势在于:每一次更新只需要采样很少一组随机变量,因此它对状态值的估计的方差更小;并且,时序差分方法的采样可以立即完成,而蒙特卡罗方法必须等待采样完N个样本之后才能做更新。
SARSA
我们定义过动作值qπ(s,a)=r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅vπ(s′),代表从状态s出发做a动作时总奖励的期望。那么贝尔曼方程可以写为vπ(s)=a∑π(a∣s)qπ(s,a),代入可得
qπ(s,a)=r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅a∑π(a∣s)qπ(s′,a)
给定策略π,我们将r∑r⋅pr(r∣s,a)这一项记为E[R∣s,a],其中R是一个关于s,a,pr的随机变量。而s′∑pδ(s′∣s,a)⋅a∑π(a∣s)qπ(s′,a)可以记为E[qπ(S′,A′)∣s,a],其中S′,A′是一个关于s,a,pδ的随机变量。于是上述方程可以写作:
qπ(s,a)=E[R+γ⋅qπ(S′,A′)∣s,a]
用与上一节完全相同的方法,我们可以给出下面这组计算qπ的迭代式:
qt+1(s,a)={qt(st,at)−at⋅[qt(st,at)−(rt+1+γ⋅qt(st+1,at+1))]qt(s,a),(s,a)=(st,at),(s,a)=(st,at)
由此可见,要更新q(st,at),我们需要用到的采样信息为rt+1,st+1,at+1。因为每一轮更新只涉及“st,at,rt+1,st+1,at+1”,所以这个算法被称为SARSA算法。通过SARSA算法,我们可以在给定策略π时计算出每对(s,a)的动作值。
Policy Searching using TD-Learning
上面的算法都是基于给定的策略π求解状态值和动作值,和我们最初在贝尔曼方程一文中介绍的迭代方法相比,TD-Learning是model-free的(不依赖于模型pδ的)。如果把上面的算法结合上我们在蒙特卡洛方法一文中得到的model-free的更新策略,我们就又得到了一个model-free的求解最优策略的算法:
初始时任意设定策略π0,从状态s0出发。对于任意时刻t,设当前所处状态为st,按照当前策略πt采样动作at,即时奖励rt+1,状态转移目标st+1,再次由πt采样得到动作at+1。此时按照SARSA算法更新动作值qt+1(st,at)。基于更新后的动作值,用ε-greedy的方式更新策略πt+1,也即:
πt+1(a∣st)=⎩⎨⎧1−∣A∣ε(∣A∣−1)∣A∣ε,a=argamaxqt+1(st,a),otherwise
(采用ε-greedy的策略,可以增加采样的覆盖范围,提高效率。)
该算法通常也被称为SARSA算法。
有一种SARSA算法的变种,在更新qt+1时不需要采样at+1,而把qt(st+1,at+1)这一项替换为了a∑πt(a∣st+1)qt(st+1,a))。这个算法称为Expected SARSA,它在实际中也有很好的效果。它减少了采样次数,因此变得更稳定。当然,它增大了计算的开销。
另一种SARSA算法的变种,在更新qt+1时会连续进行n轮的采样。在t时刻位于状态st时,它通过采样st,at,rt+1,st+1,at+1,rt+1,⋯,st+n,at+n,用qt+1(st+1,at+1)=qt(st,at)−at⋅[qt(st,at)−(rt+1+γ⋅rt+2+γ2⋅rt+3+⋯ +γn⋅qt(st+n,at+n))]做更新。这称为n-step SARSA。这样,我们可以调整n的取值,来改善算法的表现。当n=1时,这就是普通的SARSA算法;当n很大时,这就是蒙特卡洛算法。
Q-Learning
到目前为止的TD-Learning算法,都是基于给定的策略π,用Robins-Monro算法求解贝尔曼方程。我们看到,通过把这样的算法和策略迭代结合起来,它就可以用来求解最优策略。
从另一方面看,如果可以用Robins-Monro算法直接求解贝尔曼最优化方程,那么我们不需要做策略迭代。因为我们已经证明了,假设我们已经求出各个“状态-动作对”上的动作值,那么取动作值最大的状态做转移就是最优策略。
我们证明,只要把SARSA算法的更新修改为下面的形式,就可以求出贝尔曼最优化方程的解q。这个算法称为Q-Learning:
qt+1(s,a)={qt(st,at)−at⋅[qt(st,at)−(rt+1+γ⋅amaxqt(st+1,a))]qt(s,a),(s,a)=(st,at),(s,a)=(st,at)
类比之前几节的论证,这一更新可以看作是在求解方程
q(s,a)=E[R+γ⋅amaxq(S′,a)∣s,a]
也即
q(s,a)=r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅a0maxq(s′,a0)
如果q满足该方程,那么一定满足下面这个在两边同时关于a取max的方程
amaxq(s,a)=amax[r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅a0maxq(s′,a0)]
令v(s)=amaxq(s,a),那么得到
v(s)=amax[r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅v(s′)]
我们证明过这等价于
v(s)=πmaxa∑π(a∣s)[r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅v(s′)]
而这就是贝尔曼最优化方程。可见,Q-Learning算法解出了贝尔曼最优化方程中的动作值。于是,只需要在每个状态取动作值的最大值,就能得到最优策略。
注意,qt+1(st+1,at+1)=qt(st,at)−at⋅[qt(st,at)−(rt+1+γ⋅amaxqt(st+1,a))]这一步迭代中,只需从st,at出发采样rt+1,st+1,不用采样at+1。这意味着,Q-Learning的更新是不依赖于策略迭代的,也即不需要有一个已经求出的πt,依据πt来采样at+1。在Q-Learning中,我们可以依据一个任意的策略π0采样一列s0,a0,r1,⋯,然后利用这一列数据更新策略。这样的策略更新方法称为off-policy,传统的依赖于策略的迭代的更新方法称为on-policy。Off-policy是Q-Learning相对于传统TD-Learning的一个巨大优势,它使得“用来采样的策略”和“想要最优化的策略”是相对独立的,前者称为behavior policy,后者称为target policy。Behavior policy不依赖于target policy,意味着我们可以用现存的人类数据代替采样,这样的做法称为experience replay,可以更高效地求解最优策略。
Value Function Approximation
到目前为止我们所介绍的强化学习算法中,我们总是需要对每个状态s∈S计算状态值或动作值,从而才能找到最优策略。这样的方法对于“走迷宫”这样的状态不多且有限的场景是有效的。然而,在许多场景中,状态的总数远超计算机的存储能力,我们几乎可以认为状态数是无限的。比如,想象“2048游戏”,尽管只有16个格子,但每个格子上的数字可能有12种,因此这意味着总状态数达到1216。甚至会有状态是连续分布的场景。在这些场景中,计算每个状态的状态值或动作值就变得不现实了。
State Value Estimation
一个解决方案是,用“拟合”的方式计算状态值或动作值。这是一个传统的机器学习问题,下面以计算状态值为例。给定策略π,∀s∈S,状态值的准确值为vπ(s)。我们定义一个函数v^(s,w)作为对vπ(s)的估计,其中w是待训练参数。 用v^拟合v,也即训练得到参数w,就是最小化损失函数J(w)。假设总状态数是有限的,那么可以用传统的最小二乘法作为损失函数,也即
J(w)=∣S∣1s∈S∑(vπ(s)−v^(s,w))2
在强化学习中,对于马尔可夫决策过程,一个更常用的损失函数是上面这个函数的加权形式:
J(w)=s∈S∑dπ(s)⋅(vπ(s)−v^(s,w))2
其中,dπ是该马尔可夫决策过程的稳态分布,满足Pπ⊤dπ=dπ。其中,Pπ(i,j)就是我们在贝尔曼方程一文中定义过的“从状态si转移到sj的概率”。从数学上看,dπ是矩阵Pπ⊤关于特征值1的一个特征向量。取稳态分布作为损失函数的权重有一个很自然的原因:稳态分布反映出该决策过程进行经过足够次以后每个状态被访问的频率,我们希望频率越高的状态上v^估计的误差更小。
无论是最小二乘法还是稳态分布,损失函数都可以看作是一个状态集S上的随机变量S满足某一分布时,下面这个表达式的期望:
J(w)=E[(vπ(S)−v^(S,w))2]
定义了损失函数以后,“求解(实际上是拟合)”状态值函数的任务就转化为了最小化损失函数J(w)。这可以转化为求方程∇wJ(w)=0。注意,J(w)表达式中的vπ是未知的,所以这个方程也必须用Robins-Monro算法来求解:wk+1= wk−akg~(wk),其中g~(wk)是对∇wJ(wk)的近似。 我们做计算:∇wJ(w)= E[∇w(vπ(S)−v^(S,w))2]=−2⋅E[(vπ(S)−v^(S,w))∇wv^(S,w)]。因为v^的模型是已知的,随机变量S可以通过一次采样st得到,所以唯一困难之处在于估计vπ(st)。显然,我们不能用v^(st,wt)来估计,不然迭代项会被减为0。一个常用的方法是用“TD-target” rt+1+γ⋅v^(st+1,wt)来估计vπ(st),这样得到迭代式:
wk+1=wk+ak[rt+1+γ⋅v^(st+1,wt)−v^(st,wt)]∇wv^(st,wt)
在实践中我们通常用这一迭代式来计算v^。虽然可以证明,从数学上这一迭代式并不收敛到J(w)=E[(vπ(S)−v^(S,w))2]的极小值点。
Action Value Estimation
和状态值函数的拟合完全类似,给定策略π,如果要拟合动作值,也就是要最小化函数
J(w)=E[(qπ(S,A)−q^(S,A,w))2]
可以用下面这个迭代式求解:
wk+1=wk+ak[rt+1+γ⋅q^(st+1,at+1,wt)−q^(st,at,wt)]∇wq^(st,at,wt)
给定策略π0,根据拟合得到的q^,在每个状态选择q^的最大值,就可以得到一个新策略π1。重复此过程,就能求出值函数近似下的最优策略。这一算法就是值函数近似下的SARSA算法。
同理,也有值函数近似下的Q-Learning算法就是要最小化函数
J(w)=E[(R+γ⋅amaxq^(S′,a,w)−q^(S,A,w))2]
可以用下面这个迭代式求解:
wk+1=wk+ak[rt+1+γ⋅amaxq^(st+1,a,wt)−q^(st,at,wt)]∇wq^(st,at,wt)
Deep Q-Learning
在值函数近似中,很关键的一个问题是:应该怎样设计v^(或q^)的模型呢?近些年,最常用的做法就是用神经网络作为v^(或q^)的模型。理论上,神经网络具有近似一切非线性函数的能力。把神经网络作为q^的模型的值函数近似下的Q-Learning算法,就称为Deep Q-Learning,也称为“Deep Q-Network”,简称DQN。
原则上,选定合适的神经网络作为q^的模型,上一节的迭代式wk+1=wk+ak[rt+1+γ⋅amaxq^(st+1,a,wt)−q^(st,at,wt)]∇wq^(st,at,wt)就已经给出了一个DQN算法。然而这样的做法在实践中并不常见,原因是要上述迭代式并不是一个传统的梯度下降的迭代式。要使用该式,我们必须深入到神经网络的底层结构上做计算和更新。而实践中,神经网络模型通常是以黑盒的形式存在的,在做强化学习时我们通常不希望深入到模型的底层架构中去。基于这些理由,产生了下面这样的DQN的改进算法。
引入两个神经网络q^(s,a,w)和q^(s,a,wT),前者称为main network,后者称为target network。把损失函数改写为:
J(w,wT)=E[(R+γ⋅amaxq^(S′,a,wT)−q^(S,A,w))2]
在训练时,我们暂时固定target不做更新,只关于w做更新。在这一步更新中,设已经采样得到s,a,r,s′,此时要最小化关于w的函数(r+γ⋅a0maxq^(s′,a0,wT)−q^(s,a,w))2,只需调用传统的梯度下降算法。在梯度下降进行若干步以后,我们把更新后的w赋值给wT。重复上述过程。实践证明,这样的DQN算法有非常好的效果。
参考资料
[1] 赵世钰 《强化学习的数学原理》