终于我们开始系统进入RL的部分。如本系列一开始所说的,我个人的观点是把Dynamic Programming(DP,动态规划)模型作为理解RL算法的基础,因为我们总可以把RL算法看作近似动态规划(approximate dynamic programming, ADP)的算法。因此,本篇文章我们就先来介绍一下DP模型。内容主要来自经过我调整的之前的一个知乎回答:
什么是动态规划(Dynamic Programming)?动态规划的意义是什么?www.zhihu.com
参考的主要就是Dimitri P. Bertsekas的书籍[1]前两章。
一、定义:两个集合
;策略映射
;两个算子
本节我们定义为了准确描述动态规划模型必不可少的5个符号。
考虑
和
为两个集合,前者我们认为是包含所有状态(state)的集合,后者我们认为是包含所有控制(control,或者action)的集合。对任意
,定义
为针对状态
的可行控制集。然后我们再对任意
定义函数映射
如果你对动态规划一无所知,也无妨,那么你只需要把
当成两个任意的集合就可以。
那么我们现在定义了两组集合和一组函数。我们记无穷序列
(满足任意
)为非稳态的策略(nonstationary policies),因为如果我们把下标
代表不同的时间段,相当于每个时间段都在用不同的策略在应对。与之相对的,我们叫这样的序列
为稳态策略(stationary policies),因为每个时间段都用一样的策略(映射)。
坚持住,接下来就是定义最后最关键的符号了!我们把函数
的集合叫做
,并且定义一个映射
。(如果你已经熟悉动态规划,这里其实就是所谓的值函数。然后比如强化学习里面所谓Q learning就是对这里的
映射进行近似的一种算法。但对没有这些知识的同学,同样的,你只要当成
是两个在对应空间上的定义的映射就好)
在定义了这些符号后,抽象动态规划便主要是考虑如下两组递推映射
:
也就是说,
是将函数
结合
赋值给
的算子,
是将函数
赋值给
,并对
在控制集合上最优化的算子。
二、抽象动态规划模型
一般来说,一个动态规划问题会有
个“阶段”,那么对一个最终阶段成本
来说,在使用策略
的情况下,我们从不同状态
起始的N阶段总成本就可以写成:(算子的好处就体现出来了!)
对不熟悉上边算子"连乘"记号的,实际上这个N个算子“连乘”可以分解成
也就是说,实际上我们是先对
作用算子
,然后再对得到的
作用算子
,以此类推,最后作用算子
。这也就是动态规划模型所谓的逆向归纳(backward induction)式。在每一步归纳(induction)中,实际上我们就是把后一回合的值函数传递到前一回合(根据当前回合使用的策略)。
当
很大的时候,也即所谓的无限时间动态规划模型,我们可以考虑一个更为简洁的问题结构。即我们本来主要考虑的
阶段总成本可以和
无关,记作
即为原来成本函数的极限。动态规划模型的目标便是要找到一组最好的策略
,最小化这个总成本(如果最小值存在)。也即我们要找到“最小可能的”成本
在合理的条件下,这个问题等价于一个求不动点问题:
应当满足
即问题变成了求
的不动点(希望你已经熟悉
的定义了:))! 且如果
确实存在,一般来说我们在无限时间动态规划模型里只需要考虑稳态策略,因为一般来说存在一个最优的
是稳态的。那么这种情况下我们就得到问题求解等价于所谓的Bellman's equation:(找到对应的
)
也就是说,抽象的来看,动态规划需要解决的问题就是计算由5个符号定义的,这个等式的解!
三、两个重要性质:单调性与压缩性
本节我们介绍常见动态规划模型需要满足的两个重要性质,也即前一段末尾所说的“合理的条件”。只有满足了这两个条件,我们的动态规划模型才可以化为上述唯一确定的基于Bellman's equation的不动点求解问题。
先说单调性(Monotonicity):
也就是说算子
对于取值
是单调的。这也很好理解,这个意思就是说当我们在时间
的时候,如果从未来时间
到无穷的成本
对于所有状态
增加(单调上升)了,那么我们在时间
,对相同的状态
和控制
的总成本也应当上升。因此,不难想象,任何一个“合理”的动态规划模型都会满足这里的单调性。
再说压缩性(Contraction):
假设
是赋范空间,则对任意
,函数
且对某个
有
也就是说
是压缩映射(contraction mapping)!注意这里的范数一般来说取weighted sup-norm,不过本文不再展开(包括赋范空间的严格定义云云)。
不过这个压缩性的话可能就不如前面那个单调性,没什么特别直观的道理。然而如果你认同“折旧”(discount)的会计概念,比如未来的单位成本相比今天的单位成本要按照日期以固定比例
打个折扣 --- 放到我们的模型来说就是在从时间
到
的过程当中我们产生的额外成本都要乘以一个属于0,1之间的系数
,那么容易验证在这种情况下我们的模型一般就会满足这里的压缩性了。
好那么有没有什么直观的解释为什么我们的动态规划模型最好要满足这两个性质呢?
回忆:Bellman's equation的本质便是寻找
的不动点。而上图左,我们的
虽然单调但并不具有压缩性,因此实际上存在不止一个不动点(蓝线与黑虚线的交点)。相比之下,上图右的
既单调又有压缩性,我们便很容易知道这个时候Bellman's equation有唯一的不动点。因此,可以认为问题的性质就要好很多了。
四、马尔可夫决策过程(Markov Decision Process)
上面的讨论其实完全没有涉及具有实际意义的问题,因此如果你觉得太抽象了,本节便讨论如何将MDP用抽象动态规划的框架写出来。那么因为是MDP,我们有所谓的离散时间状态转移方程:
也就是说,如果时间k的时候我们处于状态
,并采取了控制
,那么
就决定了我们下一个时间点
的状态
。当然,这里还有一点噪音/随机性
,满足分布
,所以也跟当前状态和控制有关。那么我们的MDP问题就可以看成是要对任意的初始状态
,找到策略
最大化总的reward
:
注意这里我们使用了折旧系数
,且
就是每个时间段
的reward,最后的总成本就是所有成本的总和。利用我们抽象动态规划的框架,实际上这个问题等价于定义
也就是说我们考虑的两个算子定义为
如果你已经接触过动态规划/强化学习的文献,这可能就会是你更加熟悉的递推方程(在RL模型中,绝大部分都是用这里的infinite horizon discounted MDP来建模的)。
容易验证,
是单调的,且如果
有界(对任意
),
是压缩映射。即,前一节的两个性质的确是对普遍意义上的动态规划问题都成立的。
五、Value Iteration算法:一些分析
Value Iteration(VI)算法是最常见的求解DP和RL的算法之一(另一个是Policy Iteration及其变种)。这个算法非常简单,找到一个起始的值函数
,然后不断对它作用
算子即可。在单调性和压缩性的保证下,Bellman's equation有唯一不动点,所以只要我们作用的次数足够多,就一定有:
一个典型的VI算法的收敛路径。
我们在上图中画出VI算法收敛的图示,注意
是分段线性且convex的。VI算法就是在不停地迭代
算子,并最终收敛到
和45度线的交点(图中横轴,
)。
最后我们考虑近似VI算法的理论性质。即我们无法精确求出
的结果(比如action space太大,reward函数复杂等等),因此只能考虑近似地去求解
。假设我们有办法找到
作为近似,使得存在
,
那么我们的近似VI算法就可以得到一个序列
使得
那么利用三角不等式和算子
的压缩性,我们就有
令
并且利用
,我们就得到了近似VI算法的收敛速率:
我们注意到利用抽象动态规划模型的算子写法分析VI算法的收敛速率变得无比简单!至于实际问题中我们应该如何近似值函数,我们下次文章再重点讨论。
参考
- ^Bertsekas, D. P. (2018). Abstract dynamic programming. Athena Scientific.