原理
Policy iteration有两种方式实现,一种是使用两个数组,一个保存原来的值,一个用来进行更新,这种方法是雅克比方法,或者叫同步的方法,因为他可以并行的进行。
In-place的方法是高斯赛德尔方法。就是用来解方程组的迭代法。
Dynamic Programming
DP指的是给定环境的模型,通常是一个MDP,计算智能体最优策略的一类算法。经典的DP算法应用场景有限,因为它需要环境的模型,计算量很高,但是DP的思路是很重要的。许多其他的算法都是在尽量减少计算量和对环境信息情况,尽可能获得和DP接近的性能。
通常我们假定环境是一个有限(finite)的MDP,也就是state, action, reward都是有限的。尽管DP可以应用于连续(continuous)的state和action space,但是只能应用在几个特殊的场景上。一个常见的做法是将连续state和action quantize(量化),然后使用有限MDP。
DP关键在于使用value function寻找好的policy,在找到了满足Bellman optimal equation的optimal value function之后,可以找到optimal policy,参见第三章推导:
Bellman optimal equation:
v∗(s)=maxaE[Rt+1+γv∗(St+1)|St=s,At=a]=maxa∑s′,rp(s′,r|s,a)∗[r+γv∗(s′)]
q∗(s,a)=E[Rt+1+γmaxa′q∗(St+1,a′)|St=s,At=a]=∑s′,rp(s′,r|s,a)[r+γmaxaq∗(s′,a′)]
Policy Evaluation(Prediction)
给定一个policy,计算state value function的过程叫做policy evaluation或者prediction problem。
根据v(s)和它的后继状态v(s′)之间的关系:
vπ(s)=Eπ[Gt|St=s]=Eπ[Rt+1+γGt+1|St=s]=∑aπ(a|s)∑s′∑rp(s′,r|s,a)[r+γEπ[Gt+1|St+1=s′]]=∑aπ(a|s)∑s′,rp(s′,r|s,a)[r+γvπ(s′)]
只要γ<1或者存在terminal state,那么vπ的必然存在且唯一。这个我觉得是迭代法解方程的条件。数值分析上有证明。
如果环境的转换概率p是已知的,可以列出方程组,直接求解出每个状态s的v(s)。这里采用迭代法求解,随机初始化v0,使用式子(4)进行更新:
vk+1(s)=E[Rt+1+γvk(St+1) St=s]=∑aπ(a|s)∑s′,rp(s′,r|s,a)[r+γvk(s′)]
直到vk=vπ到达fixed point,Bellman equation满足这个条件。当k→∞时收敛到vπ。这个算法叫做iterative policy evaluation。
在每一次vk到vk+1的迭代过程中,所有的v(s)都会被更新,s的旧值被后继状态s′的旧值加上reward替换,正如公式(5)中体现的那样。这个目标值被称为expected update,因为它是基于所有s′的期望计算出来的(利用环境的模型),而不是通过对s′采样计算的。
在实现iterative policy evaluation的时候,每一次迭代,都需要重新计算所有s的值。这里有一个问题,就是你在每次更新s的时候,使用的s′如果在本次迭代过程中已经被更新过了,那么是使用更新过的s′,还是使用没有更新的s′,这就和迭代法中的雅克比迭代以及高斯赛德尔迭代很像,如果使用更新后的s′,这里我们叫它in-place的算法,否则就不是。具体那种方法收敛的快,还是要看应用场景的,并不是in-place的就一定收敛的快,这是在数值分析上学到的。
下面给出in-place版本的iterative policy evation算法伪代码。
iterative policy evation 算法
输入需要evaluation的policy π
给出算法的参数:阈值θ>0,当两次更新的差值小于这个阈值的时候,就停止迭代,随机初始化V(s),∀s∈S+,除了V(terminal)=0。
Loop
δ←0
for each s∈S
v←V(s) (保存迭代之前的V(s))
V(s)←∑aπ(a|s)∑s′,rp(s′,r|s,a)[r+γvk(s′)]
∇←max(δ,|v−V(s)|)
end for
until δ<θ
Policy Improvement
为什么要进行policy evaluation,或者说为什么要计算value function?
其中一个原因是为了找到更好的policy。假设我们已经知道了一个deterministic的策略π,但是在其中一些状态,我们想要知道是不是有更好的action选择,如a≠π(s)的时候,是不是这个改变后的策略会更好。好该怎么取评价,这个时候就可以使用值函数进行评价了,在某个状态,我们选择a≠π(s),在其余状态,依然遵循策略π。用公式表示为:
qπ(s,a)=E[Rt+1+γvπ(St+1)|St=s,At=a]=∑s′,rp(s′,r|s,a)[r+γvπ(s′)]
那么,这个值是是比v(s)要大还是要小呢?如果比v(s)要大,那么这个新的策略就比π要好。
用π和π′表示任意一对满足下式的deterministic policy:
qπ(s,π′(s))≥vπ(s)
那么π′至少和π一样好。可以证明,任意满足(7)的s都满足下式:
vπ′(s)≥vπ(s)
对于我们提到的π和π′来说,除了在状态s处,vπ′(s)=a≠vπ(s),在其他状态处π和π′是一样的,都有qπ(s,π′(s))=vπ(s)。而在状态s处,如果qπ(s,a)>vπ(s),注意这里a=π′(s),那么π′一定比π好。
证明:
vπ(s)≤qπ(s,π′(s))=E[Rt+1+γvπ(St+1)|St=s,At=π′(s)]=Eπ′[Rt+1+γvπ(St+1)|St=s]≤Eπ′[Rt+1+γqπ(St+1,π′(St+1))|St=s]=Eπ′[Rt+1+γEπ′[Rt+2+γvπ(St+2)|St+1,At+1=π′(St+1)|St=s]]=Eπ′[Rt+1+γRt+2+γ2vπ(St+2)|St=s]≤Eπ′[Rt+1+γRt+2+γ2Rt+3+γ3vπ(St+3)|St=s]≤Eπ′[Rt+1+γRt+2+γ2Rt+3+γ3Rt+4+⋯|St=s]=vπ′(s)
所以,在计算出一个policy的value function的时候,很容易我们就直到某个状态s处的变化是好还是坏。扩展到所有状态和所有action的时候,在每个state,根据qπ(s,a)选择处最好的action,这样就得到了一个greedy策略π′,给出如下定义:
π′(s′)=argmaxaqπ(s,a)=argmaxaE[Rt+1+γvπ(St+1|St=a,At=a)]=argmaxa∑s′,rp(s′,r|s,a)[r+vπ(s′)]
可以看出来,该策略的定义一定满足式子(7),所以π′比π要好或者相等,这就叫做policy improvement。当π′和π相等时,,根据式子(9)我们有:
vπ′(s′)=maxaE[Rt+1+γvπ′(St+1|St=a,At=a)]=maxa∑s′,rp(s′,r|s,a)[r+vπ′(s′)]
这和贝尔曼最优等式是一样的???殊途同归!!!
但是,需要说的一点是,目前我们假设的π和π′是deterministic,当π是stochastic情况的时候,其实也是一样的。只不过,原来我们每次选择的是使得vπ最大的action。对于stochastic的情况来说,输出的是每个动作的概率,可能有几个动作都能使得value function最大,那就让这几个动作的概率一样大,比如是n个动作,都是1n。
Policy Iteration
我们已经讲了Policy Evaluation和Policy Improvement,Evalution会计算出一个固定π的value function,Improvment会根据value function改进这个policy,然后计算出一个新的policy π′,对于新的策略,我们可以再次进行Evaluation,然后在Improvement,就这样一直迭代,对于有限的MDP,我们可以求解出最优的value function和policy。这就是Policy Iteration算法。
Policy Iteration算法
1.初始化
V(s)∈R,π(s)inA(s)
2.Policy Evaluation
Loop
Δ←0
For each s∈S
v←V(s)
V(s)←∑s′,rp(s′,r|s,a)[r+γV(s′)]
Δ←max(Δ,|v−V(s)|)
until Δ<θ
3.Policy Improvement
policy−stable←true
For each s∈S
oldaction=π(s)
π(s)=argmaxa∑s′,a′p(s′,r|s,a)[r+γV(s′)]
If oldaction≠π(s),policy−stable←false
If policy-stable,停止迭代,返回V和π,否则回到2.Policy Evalution继续执行。
Value Iteration
从Policy Iteration算法中我们可以看出来,整个算法分为两步,第一步是Policy Evaluation,第二步是Policy Improvement。而每一次Policy Evaluation都要等到Value function收敛到一定程度才结束,这样子就会非常慢。一个替代的策略是我们尝试每一次Policy Evaluation只进行几步的话,一种特殊情况就是每一个Policy Evaluation只进行一步,这种就叫做Value Iteration。给出如下定义:
vk+1(s)=maxaE[Rt+1+γvk(St+1)|St=s,At=a]=maxa∑s′,rp(s′,r|s,a)[r+γvk(s′)]
它其实就是把两个步骤给合在了一起,原来分开是:
vπ(s)=E[Rt+1+γvk(St+1)|St=s,At=a]=∑s′,rp(s′,r|s,a)[r+γvk(s′)]vπ′(s)=maxa∑s′,rp(s′,r|s,a)[r+γvπ(s′)]
另一种方式理解式(10)可以把它看成是使用贝尔曼最优等式进行迭代更新,Policy Evaluation用的是贝尔曼期望等式进行更新。下面给出完整的Value Iteration算法
Value Iteration 算法
初始化
阈值θ,以及随机初始化的V(s),s∈S+,V(terminal)=0。
Loop
v←V(s)
Loop for each s∈S
V(s)=maxa∑s′,rp(s′,r|s,a)[r+γV(s′)]
Δ←max(Delta,|v−V(s)|)
until Δ<θ
返回 输出一个策略π≈π∗,这里书中说是deterministic,我觉得都可以,π也可以是stochastic的,最后得到的π满足:
π(s)=argmaxa∑s′,rp(s′,r|s,a)[r+γV(s′)]
Asychronous Dynamic Programming
之前介绍的这些DP方法,在每一次操作的时候,都有对所有的状态进行处理,这就很耗费资源。所以这里就产生了异步的DP算法,这类算法在更新的时候,不会使用整个的state set,而是使用部分state进行更新,其中一些state可能被访问了很多次,而另一些state一次也没有被访问过。
其中一种异步DP算法就是在plicy evalutaion的过程中,只使用一个state。
使用DP算法并不代表一定能减少计算量,他只是减少在策略没有改进之前陷入无意义的evaluation的可能。尽量选取那些重要的state用来进行更新。
同时,异步DP方便进行实时的交互。在使用异步DP更新的时候,同时使用一个真实场景中的agent经历进行更新。智能体的experience可以被用来确定使用哪些state进行更新,DP更新后的值也可以用来指导智能体的决策。
Generalized Policy Iteration
之前介绍了三类方法,Policy Iteration,Value iteration以及Asychronous DP算法,它们都有两个过程在不断的迭代进行。一个是evaluation,一个是improvement,这类算法统一的被称为Generalized Policy Iteration(GPI),可以根据不同的粒度进行细分。基本上所有的算法都是GPI,policy使用value function进行改进,value function朝着policy的真实值函数改进,如果value function和policy都稳定之后,那么说他们都是最优的了。
GPI中evalution和improvemetnt可以看成既有竞争又有合作。竞争是因为evaluation和improment的方向通常是相对的,policy改进意味着value function不适用于当前的policy,value function更新意味着policy不是greedy的。然后长期来说,他们共同作用,想要找到最优的值函数和policy。
GPI可以看成两个目标的交互过程,这两个目标不是正交的,改进一个目标也会使用另一个目标有所改进,直到最后,这两个交互过程使得总的目标变成最优的。
Efficiency of Dynamic Programming
用n和k表示MDP的状态数和动作数,DP算法保证在多项式时间内找到最优解,即使策略的总数是kn个。
DP比任何在policy space内搜索的算法要快上指数倍,因为policy space搜索需要检查每一个算法。Linear Programming算法也可以用来解MDP问题,在某些情况下最坏的情况还要比DP算法快,但是LP要比只适合解决state数量小的问题。而DP也能处理states很大的情况。
Summary
- 使用贝尔曼公式更新值函数,可以使用backup diagram看他们的直观表示。
- 基本上所有的强化学习算法都可以看成GPI(generalized policy iteraion),先评估某个策略,然后改进这个策略,评估新的策略…这样子循环下去,直到收敛,找到一个不在变化的最优值函数和策略。
GPI不一定是收敛的,本章介绍的这些大多都是收敛的,但是还有一些没有被证明收敛。 - 可以使用异步的DP算法。
- 所有的DP算法都有一个属性叫做bootstrapping,即基于其他states的估计更新每一个state的值。因为每一个state value的更新都需要用到他们的successor state的估计。
They update estimates onthe basis of other estimates。