2.1_.jpg

 前言:这是我八月份的第一篇笔记,之所以写动态规划算法的原因有两点。一方面是因为在前面几期推文中讲到的隐马尔科夫模型、时序分类算法CTC均有运用到动态规划算法;另一方面是后期要写的强化学习中也会用到动态规划。因此,动态规划算法在深度学习中是一个非常常用的基础算法,本期介绍基础理论,下一期通过具体的示例来说明一下如何使用动态规划算法解决实际问题。


动态规划算法是一种基于决策的问题优化算法,运用动态规划算法来解决优化控制问题,通常它具有以下三个基本元素:
  • 阶段。运用动态规划来解决优化问题最基本的一步是要把问题划分成多个阶段,并且按顺序每次解决一个阶段。尽管每单个阶段是一个普通的优化问题,它的解却能够帮助确定下一个阶段的特征。通常,阶段可能是指不同的时间段,例如运用动态规划问题优化一年中每一个月商品的库存量问题;但有时候阶段也可能不是对应着时间段,例如在堵车情况下规划最优路径的时候,这里的阶段就是确定每个子路径了。

 
  • 状态。与每一个阶段的优化问题相对应的是过程的状态。状态是反映当前决策对未来行动所造成的后果,例如在堵车问题中状态就是每个子路径的等待时间。要明确一个系统的状态通常是动态规划模型中最难发现的部分,而对于这个并没有成套的规则可循。不过,对于状态的选择,通常有两个特征:第一,状态应该包含足够的信息来对未来一步做出决策,而不关心系统是如何达到此状态的;第二,状态的数目应该比较小,因为在动态规划问题中,状态变量的数目通常不能超过3个,原因是如果超过的话将会导致计算量非常庞大。因此,在实践中,第二点通常会限制动态规划算法的使用。

 
 
  • 递归优化。递归优化的过程就是对于求解一个N阶段的问题,会按顺序去求解每一个单独阶段的优化问题,直到整体的优化解被找到。这个递归优化过程通常可以基于两种归纳法,逆向归纳法(backward induction)和正向归纳法(forward induction)。逆向归纳法的做法是首先分析问题的最后一个阶段,然后依次向前分析每个阶段,直到问题的所有阶段都有被包含;正向归纳法的做法是首先分析问题的初始阶段,然后依次向后分析每个阶段,直到问题的所有阶段都有被包含。在有些情况下,解决动态规划问题只能用两种归纳法中的其中一种,并且在大部分包含不确定性问题中,只能运用逆向归纳法去解决。




下面,我们来结合以上三个特征具体阐述一下动态规划的理论。假设现有一个对于特定阶段的回报函数为:

fn(dn,sn)

其中dn是一个决策,它可能是从所有决策集Dn中挑选的;sn是一个状态,对于系统而言,n的意思是接下来还需要进行n个阶段。通常情况下,给定阶段的决策集是依赖于那个阶段的状态的,换句话说,Dn可以写为Dn(sn),为了简化表达,我们直接写成Dn。假如系统一共有N个阶段,我们用n代表归纳过程中剩余的阶段,并且,我们认为系统要经过余下n个阶段的话,只需要知道当前的状态sn即可,对于之前的所有状态我们并不关心,也就是说下一个阶段的状态只取决于此阶段的状态以及此阶段要做的决策。于是,我们定义一个状态转移函数,对于系统从剩余n个阶段转移到剩余n-1个阶段的函数为:

sn-1=tn(dn,sn)

这里的dn是指基于当前阶段和状态所做的决策。注意一点的是,这里一旦状态和决策确定,下一个阶段的状态也就唯一被确定了。


下面我们可以使用一张图来描述多阶段决策过程。

2.2_.jpg



为了更好地将这些抽象的理论阐述清楚,我们来看一个具体的库存分配问题。在这个问题中,系统的状态sn是剩余n个月的库存量In,而决策dn是这个月要增加的库存量On,另外还要考虑每个阶段的库存消耗量Rn,因此,剩余n-1个月的库存含量的函数表达式(或者称之为状态转移表达式)为:

I(n-1)=tn(In,On)=In+On-Rn


而要优化的变量是库存配送的费用,即使得每个阶段的Cn(In,On)总和达到最小。


对于一般的问题,优化的目标都是使得总收益函数值达到最大或使得总损失函数值达到最小。因此,我们可以定义一个最优价值函数(optimal value function):

vn(sn)=Max[fn(dn,sn)+...+f1(d1,s1)+f0(d0,s0)]


其中,状态转移函数为:

sm-1=tm(dm,sm),其中dm∈Dm


而既然fn(dn,sn)是只依赖于dn的,而不依赖于之前的决策d(n-1),...,d0等,因此我们先算出最优价值函数的后面部分:

vn(sn)=Max{fn(dn,sn)+Max[fn-1(dn-1,sn-1)+...+f0(d0,s0)]}


于是,我们可以将最优价值函数写成如下的递归形式:


vn(sn)=Max[fn(dn,sn)+vn-1(sn-1)]


而sn-1=tn(dn,sn),因此可以改写成:

vn(sn)=Max{fn(dn,sn)+vn-1[tn(dn,sn)]}

这样,就突出了决策dn对最优价值函数的影响。



上面的最优价值函数遵循的最优化原则,也就是说对于一个多阶段的问题,不管当前的决策dn和当前的状态sn如何,所有之后的状态必须是最优的,假设当前的决策就导致下一个状态sn-1。
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家