强化学习的目标是要让机器自动地找出一个决策过程里每一步的“最优”决策。例如,在一个n×n的网格图中,有一个机器人站在左上角的方框内,它可以上下左右移动或原地不动,它的目标是要到达右下角的方框内,但是其运动过程中要尽量避免那些被标记为“障碍”的格子。这样一个任务就是一个“决策过程”的任务,强化学习的目标就是让机器人找出每一步应当如何移动的“最优策略”。
Markov Decision Process
我们为决策过程建立一个数学模型。首先,我们有n个状态(state) si,它们构成状态集合S(网格);在每个状态上有m个可能的动作(action) aj(上下左右的移动);在状态si采取动作aj会使状态转移到δ(si,aj),这是状态转移函数。状态转移函数可能是确定性的,也有可能是不确定性的。对于不确定性的状态转移函数,我们用概率来描述,p(sj∣si,aj)表示“位于状态si时采取动作aj会转移到状态sj的概率”。机器的任务是要在每个状态做出关于动作的决策(policy),这个决策也可能是不确定性的,此时我们也用概率来描述,π(aj∣si)表示在状态si做出aj决策的概率。
在上面这个模型中,决策仅取决于当前所处的状态,而与状态的历史信息无关,所以把这样的决策过程称为“马尔可夫决策过程(Markov Decision Process)”。
在强化学习中,最重要的是如何来评估机器所作出的决策,从而来优化机器的决策行为。我们引入一个称为“奖励”的函数:假设第t步决策时,机器位于si,做出决策aj时,此时我们赋予这个决策一个实数Rt,称为第t步的即时奖励(immediate reward),简称奖励。奖励也可以是概率的,这时需要描述第t步在si做出决策aj时奖励为Rt的概率pr(Rt∣si,aj)。我们可以用从初始到结束的所有奖励之和的累加R1+R2+⋯+Rt来做评估,我们把这个值称为决策的总奖励或返回值(return)。我们也可以对返回值做一些调整,例如设定一个0<γ<1的实数γ,把R1+γR2+⋯+γt−1Rt作为返回值,这样我们就可以控制机器的决策是更“长远”的还是更“短视”的(这个γ称为discounted rate)。
值得注意的是,如果决策或奖励是非确定性的,那么决策的返回值是一个随机变量而不是一个确定的值。这时,我们可以用返回值的期望来评估决策过程,这个期望就称为状态值(state value)。状态值是一个关于初始状态的函数(当然也是关于决策π的),我们可以把初始状态为s0的状态值记为vπ(s0)。
Bellman Equation
根据马尔可夫过程是没有记忆的(memory-less),计算从状态s出发的状态值vπ(s),只需要递归地计算从s转移出去的所有状态s′的状态值vπ(s′),但是这种“递归”不是一种DAG形式的递归,状态的转移是可以成环的。这意味着,状态值的计算并不简单。但是,因为vπ(s)和vπ(s′)之间的关系是线性的,因此总可以用线性方程组的形式来求解。
例如,当我们采用discounted rate来计算状态值时,对于从状态s出发的状态值vπ(s),那么我们可以根据定义展开,得到vπ(s)=a∑s′∑π(a∣s)pδ(s′∣s,a)⋅[r∑r⋅pr(r∣s,a)+γ⋅vπ(s′)]。化简可得
vπ(s)=a∑π(a∣s)[r∑r⋅pr(r∣s,a)+γs′∑pδ(s′∣s,a)⋅vπ(s′)]
这就是贝尔曼方程(Bellman Equation)。如果令rπ(s):=a∑π(a∣s)r∑r⋅pr(r∣s,a),pπ(s′∣s):=a∑π(a∣s)pδ(s′∣s,a),那么就有vπ(s)=rπ(s)+γs′∑pπ(s′∣s,a)⋅vπ(s′)。这个关系对于任意s都成立,因此可以写出线性方程组:
vπ(s1)⋮ vπ(sn)=rπ(s1)⋮ rπ(sn)+γPπ(s1∣s1)⋮ Pπ(s1∣sn)⋯⋱⋯Pπ(sn∣s1)⋮Pπ(sn∣sn)vπ(s1)⋮ vπ(sn)
用字母表示矩阵,就得到
vπ=rπ+γPπvπ
其中Pπ就可以看作状态转移图的邻接矩阵,Pπ(i,j)表示从状态si出发,决策π将会有Pπ(i,j)的概率将状态转移到sj。这样,我们就得到了状态值的计算公式:
vπ=(I−γPπ)−1rπ
由于矩阵求逆的开销可能较大,常见的代替方法是做迭代:vπ(k+1)=rπ+γPπvπ(k),其中vπ(0)可以是任取的一个向量,可以证明vπ(k)在这样的迭代下是收敛的。
Bellman Optimality Equation
根据贝尔曼方程,我们可以在马尔可夫决策过程给定决策时计算状态值。而在强化学习中,重要的问题是如何找出一个好的决策。
我们可以这样比较两个决策。对于决策π1和决策π2,如果在任意一个状态s上都有vπ1(s)≥vπ2(s),就称π1比π2更优。假如我们希望找到一个“最优”的决策,那么就是希望找到一个决策π∗满足:对于任意决策π,都有π∗比π更优。
贝尔曼方程告诉我们,当决策π给定时,s上的状态值必须满足方程vπ(s)=a∑π(a∣s)[r∑r⋅pr(r∣s,a)+γs′∑pδ(s′∣s,a)⋅vπ(s′)]。我们把右边括号里这一项记为qπ(s,a)=r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅vπ(s′),在给定s,a时,这一项是关于决策π的。可以看到,qπ表示从状态s做出a动作所产生的返回值的期望。于是,贝尔曼方程可以写作vπ(s)=a∑π(a∣s)qπ(s,a)。
贝尔曼最优化方程为我们提供了一个求解最优决策的方法。它说我们只需要解下面这个方程,就能得出最优决策下的状态值函数v(s):
v(s)=πmaxa∑π(a∣s)[r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅v(s′)]
我们把上面这个公式用矩阵的形式写出来
v=πmax(rπ+γPπv)
令f(v)=πmax(rπ+γPπv),那么这个方程就是要求解函数f(v)的不动点。可以证明,f是一个压缩映射,也即存在η∈(0,1)使得∀x1,x2, ∥f(x1)−f(x2)∥≤η∥x1−x2∥。压缩映射定理告诉我们,压缩映射的不动点存在且唯一,并且恰好等于数列xk+1=f(xk)的极限,且数列xk是指数收敛的。这就为我们提供了迭代求解最优决策的方法:vk+1=πmax(rπ+γPπvk)。
已知vk时,如何计算πmax(rπ+γPπvk)呢?对于状态s,我们要求πmaxa∑π(a∣s)[r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅vk(s′)]。而当vk固定时,r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅vk(s′)是与π无关的量。因此,最优的π就是π(a∣s):= 1[a=arga0max[r∑r⋅pr(r∣s,a0)+γ⋅s′∑pδ(s′∣s,a0)⋅vk(s′)]]。可见,不需要任何最优化技巧,只需代入每种动作做计算,就可以得到πmax(rπ+γPπvk)。
我们来验证贝尔曼最优化方程的解v∗的确是最优决策的状态值,也即验证对于任意π都有v∗≥vπ。因为v∗满足v∗=πmax(rπ+γPπv∗),因此对于任意π都有v∗≥rπ+γPπv∗。所以对于任意π,有v∗−vπ≥rπ+γPπv∗−rπ−γPπvπ=γPπ(v∗−vπ)。重复使用这个公式,得到v∗−vπ≥γPπ(γPπ(v∗−vπ))。由此可得∀n∈N,v∗−vπ≥γnPπn(v∗−vπ)。令n→∞,有v∗−vπ≥0。因此v∗的确是最优决策的状态值。
接下来验证,决策π∗(a∣s):=1[a=arga0max[r∑r⋅pr(r∣s,a0)+γ⋅s′∑pδ(s′∣s,a0)⋅v∗(s′)]]就是最优决策,且满足π∗=argπmax(rπ+γPπv∗)。因为v∗是贝尔曼最优化方程的解,所以v∗(s)=πmaxa∑π(a∣s)[r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅v∗(s′)],因为r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅v∗(s′)是一个与π无关的量,所以使得期望最大的概率分布就是π∗,也即v∗(s)=a∑π∗(a∣s)[r∑r⋅pr(r∣s,a)+γ⋅s′∑pδ(s′∣s,a)⋅v∗(s′)]。这恰好是贝尔曼方程,说明π∗恰好是v∗对应的一组决策。
这个简洁的结果说明,最优决策总是一个确定性的决策,它总会选择使得r∑r⋅pr(r∣s,a0)+γ⋅s′∑pδ(s′∣s,a0)⋅v(s′)最大的那个动作,也就是使得qπ(s,a)最大的那个动作。所以我们把qπ(s,a)称为“动作值(action value)”。用动作值来表示,贝尔曼最优化方程就写为v(s)=πmaxa∑π(a∣s)qπ(s,a)。当决策接近最优决策时,可以用动作值来衡量动作的价值。
综上所述,在给定决策模型p、奖励函数pr以及系数γ时,可以通过迭代vk+1=πmax(rπ+γPπvk)解出最优决策状态值v∗,由v∗计算最大的动作值就得到最优决策π∗。所以,要求出模型p上的好的决策,人只需对pr和γ做调参,找到最好的v∗,然后使用其对应的决策即可。
Value Iteration & Policy Iteration
上面的求解最优策略的过程,是初始时任选一个v0,由v0我们计算出一个策略π0(a∣s):=1[a=arga0max[r∑r⋅pr(r∣s,a0)+γ⋅s′∑pδ(s′∣s,a0)⋅v0(s′)]],然后就有v1=rπ0+γPπ0v0,依次类推,vk会收敛到v∗。这个过程称为值迭代(value iteration),它的每一步迭代可以看作两步:首先由上一步的状态值vk计算得到一个最大化动作值的策略πk,由这个策略再生成下一步的状态值vk+1。
显然,如果初始时给定的是一个初始策略,我们也可以做迭代。因为从数学上,我们只需要交换一下上面两步的顺序。但是,在给定初始策略π0时,由于我们还没有计算得到任何状态值,所以我们必须用贝尔曼方程来求解v0:v0=rπ0+γPπ0v0。而我们提到过,大多数时候矩阵求逆是效率低下的,所以求解贝尔曼方程本身也需要迭代:v0(k+1)=rπ0+γPπ0v0(k)。得到v0的精确值以后,再计算下一次迭代的策略π1(a∣s):=1[a=arga0max[r∑r⋅pr(r∣s,a0)+γ⋅s′∑pδ(s′∣s,a0)⋅v0(s′)]]。这个方法称为策略迭代(policy iteration)。策略迭代的每一步迭代都需要用迭代的方法计算状态值。但是实践中,我们无法迭代无穷步得到精确的状态值,所以我们只能在解贝尔曼方程的迭代进行有限步之后截断。所以事件中的策略迭代其实是截断策略迭代(truncated policy iteration)。
既然已经有了能够精确计算的值迭代,为什么我们还要讨论策略迭代呢?我们发现,策略迭代在每一步迭代地用vk(j+1)=rπj+γPπ0vk(j)解贝尔曼方程的时候,所作的计算和值迭代中的vj+1=rπ0+γPπ0vj所作的计算是相同的,但是策略迭代会进行多轮这样的计算。可以证明,策略迭代的收敛速度是高于值迭代的。截断策略迭代的收敛速度介于值迭代与策略迭代之间。
参考资料
[1] 赵世钰 《强化学习的数学原理》