强化学习——动态规划法

文章目录

  • 前言
  • 一、动态规划法简单认识
  • 1.基本概念
  • 2.适用情况
  • 3.求解步骤
  • 4.典型案例
  • 二、值函数
    • 1.累计折扣奖励
    • 2.状态值函数
    • 3.动作值函数
    • 4.状态值函数与动作值函数的关系
    • 5.贝尔曼方程(动态规划法核心)
  • 三、策略评估
    • 1.基于状态值函数评估策略
    • 2.基于动作值函数评估策略
  • 四、策略改进(策略求解)
    • 1.基于状态值函数的策略改进
    • 2.基于动作值函数的策略改进
  • 五、动态规划法与强化学习的联系
  • 总结


前言

关于动态规划法的详细介绍:动态规划法


一、动态规划法简单认识

1.基本概念

我们在这里关注的是作为一种算法设计技术,作为一种使用多阶段决策过程最优的通用方法
它是应用数学中用于解决某类最优化问题的重要工具。
假设问题是由交叠的子问题所构成,我们就能够用动态规划技术来解决它。一般来说,这种子问题出如今对给定问题求解的递推关系中,这个递推关系包括了同样问题的更小子问题的解。动态规划法建议,与其对交叠子问题一次重新的求解,不如把每一个较小子问题仅仅求解一次并把结果记录在表中(动态规划也是空间换时间的)。这样就能够从表中得到原始问题的解。

2.适用情况

能采用动态规划求解的问题的一般要具有3个性质:

  1. 最优化原理:假设问题的最优解所包括的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
  2. 无后效性:即某阶段状态一旦确定。就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响曾经的状态。仅仅与当前状态有关;(该性质与马尔科夫性非常相似,这也是为什么动态规划会用在强化学习中
  3. 有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到(该性质并非动态规划适用的必要条件,可是假设没有这条性质。动态规划算法同其它算法相比就不具备优势)。

3.求解步骤

实际应用中能够按下面几个简化的步骤进行设计:

  1. 分析最优解的性质。并刻画其结构特征。
  2. 递归的定义最优解。
  3. 以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值。
  4. 依据计算最优值时得到的信息,构造问题的最优解。

4.典型案例

在这里列举一个三角数塔的问题,从顶点出发,能够向左走或向右走,要求从顶点开始走到最底层,请找出一条路径,使路径之和最大。
强化学习——动态规划法_第1张图片
正确路径为13-8-26-15-24(和为86)。
我淦,好难写。。。
我觉得大部分人一看到这个问题会想到从起点开始,一步步尝试,计算总和,然后对比不同的路线,但是这么操作非常地麻烦,会遇到重复计算的部分。
用动态规划法来求解:
拆分问题:从顶点开始的最优路径,就是从第二行两个点开始的最优路径取最大,按照这个思路逐次推广到最底层。问题就被逐渐拆分了。
由底向上:最底层的问题无法继续拆分,从最底层开始,比如比较底层12和7的大小,就能知道倒数第二行6的位置对应的后续最优路径( 6 → 12 6\to12 612)。
算法流程
1.初始化层数N, Q N = 0 Q_N=0 QN=0
2. 比较第n层相邻两个数大小,将最大值与(n-1)层对应的数相加并记录为 Q n − 1 Q_{n-1} Qn1
迭代公式: Q n − 1 i = M a x ( n i + Q n i , n i + 1 + Q n i + 1 ) Q_{n-1}^i=Max(n_i+Q_n^i,n_{i+1}+Q_n^{i+1}) Qn1i=Max(ni+Qni,ni+1+Qni+1)

该问题具体解法可以参看博客:动态规划法
动态规划算法讲解


二、值函数

MDP序列: s 0 , a 0 , r 1 → s 1 , a 1 , r 2 → s 2 , a 2 , r 3 → s 3 , a 3 , r 4 … s t , a t , r t + 1 → … s T − 1 , a T − 1 , r T → s T ( 终 止 状 态 ) s_0,a_0,r_1 \rightarrow s_1,a_1,r_2 \rightarrow s_2,a_2,r_3 \rightarrow s_3,a_3,r_4 \dots s_t,a_t,r_{t+1}\rightarrow\dots s_{T-1},a_{T-1},r_T\rightarrow s_T(终止状态) s0,a0,r1s1,a1,r2s2,a2,r3s3,a3,r4st,at,rt+1sT1,aT1,rTsT()

1.累计折扣奖励

G t = r t + 1 + γ r t + 2 + γ 2 r r + 3 + ⋯ + γ T − t − 1 r T G_t=r_{t+1}+\gamma r_{t+2}+\mathop{\gamma}^2r_{r+3}+\dots+\mathop{\gamma}^{T-t-1}r_T Gt=rt+1+γrt+2+γ2rr+3++γTt1rT

2.状态值函数

从当前状态开始的累计折扣奖励的期望,与策略有关
V π ( s ) = E [ r t + 1 + γ r t + 2 + γ 2 r r + 3 + … ∣ s t = s ] V_\pi(s)=E[r_{t+1}+\gamma r_{t+2}+\mathop{\gamma}^2r_{r+3}+\dots|s_t=s] Vπ(s)=E[rt+1+γrt+2+γ2rr+3+st=s]
对求期望的理解:后续的马尔科夫链有多条(多种可能),我们用期望表示,以状态 s s s开始的一条MDP序列可以计算一个 V π V_\pi Vπ,多条MDP序列求平均就是估计。
观察改公式的形式,可改写成如下形式:
V π ( s ) = E [ r t + 1 + γ V π ( s t + 1 ) ∣ s t = s ] = E [ r t + 1 ∣ s t = s ] + γ E [ V π ( s t + 1 ) ∣ s t = s ] V_\pi(s)=E[r_{t+1}+\gamma V_\pi(s_{t+1})|s_t=s]=E[r_{t+1}|s_t=s]+\gamma E[V_\pi(s_{t+1})|s_t=s] Vπ(s)=E[rt+1+γVπ(st+1)st=s]=E[rt+1st=s]+γE[Vπ(st+1)st=s]
状态值函数的理解:
E [ r t + 1 ∣ s t = s ] E[r_{t+1}|s_{t}=s] E[rt+1st=s]:当 t t t时刻状态为 s s s时,采取动作 a ′ a' a未知,但 a ′ ∽ π ( a ′ ∣ s ) a'\backsim\pi(a'|s) aπ(as) t + 1 t+1 t+1时刻的奖励可以用期望 E [ r t + 1 ] E[r_{t+1}] E[rt+1]表示,更进一步:
E [ r t + 1 ∣ s t = s ] = ∑ [ π ( a ′ ∣ s t ) ∗ R s a ( s t , a ′ ) ] E[r_{t+1}|s_t=s]=\sum [\pi(a' |s_t)*Rsa(s_t,a')] E[rt+1st=s]=[π(ast)Rsa(st,a)]
E [ V π ( s t + 1 ) ∣ s t = s ] E[V_\pi(s_{t+1})|s_t=s] E[Vπ(st+1)st=s]:状态由 s s s转移为 s t + 1 = s ′ s_{t+1}=s' st+1=s未知,但 s ′ ∼ P s a ( s ′ ) s'\sim Psa(s') sPsa(s),所以 t + 1 t+1 t+1时刻的状态值函数也用期望表示,类似的:
E [ V π ( s t + 1 ) ∣ s t = s ] = ∑ ( π ( a ′ ∣ s t ) ∗ ∑ ( P s a ( s t + 1 = s ′ ) ∗ V π [ s ′ ] ) ) E[V_\pi(s_{t+1})|s_t=s]=\sum\Big(\pi(a' |s_t)*\sum\big(Psa(s_{t+1}=s')*V_\pi[s']\big)\Big) E[Vπ(st+1)st=s]=(π(ast)(Psa(st+1=s)Vπ[s]))

整理状态值函数公式(Bellman方程)
V π ( s ) = ∑ ( π ( a ′ ∣ s ) ∗ ( R s a ( s , a ′ ) + γ ∑ ( P s a ′ ( s ′ ) ∗ V π ( s ′ ) ) ) ) V_\pi(s)=\sum \bigg(\pi(a' |s)*\Big(Rsa(s,a')+\gamma\sum\big(Psa'(s')*V_\pi(s')\big)\Big)\bigg) Vπ(s)=(π(as)(Rsa(s,a)+γ(Psa(s)Vπ(s))))
由该公式可以看出,只要我们已知状态转移概率 P s a Psa Psa以及奖励函数 R s a Rsa Rsa,即已知环境模型,那么通过该公式就可以评价策略函数 π \pi π的好坏。

3.动作值函数

从当前状态开始(不包括当前状态),采取动作 a a a,所得到的后续累计折扣奖励的期望。 Q π : S ∗ A → R Q_\pi:S*A\to R Qπ:SAR
Q π ( s , a ) = E [ r t + 1 + γ r t + 2 + γ 2 r r + 3 + … ∣ s t = s , a t = a ] Q_\pi(s,a)=E[r_{t+1}+\gamma r_{t+2}+\mathop{\gamma}^2r_{r+3}+\dots|s_t=s,a_t=a] Qπ(s,a)=E[rt+1+γrt+2+γ2rr+3+st=s,at=a],其中 r t + 1 r_{t+1} rt+1是常数
易看出动作值函数与状态值函数之间的关系:
Q π ( s , a ) = E [ r t + 1 + γ V π ( s t + 1 ) ∣ s t = s , a t = a ] Q_\pi(s,a)=E[r_{t+1}+\gamma V_\pi(s_{t+1})|s_t=s,a_t=a] Qπ(s,a)=E[rt+1+γVπ(st+1)st=s,at=a]
还是用概率计算期望:
Q π ( s , a ) = r t + 1 + γ ∑ P s a ( s ′ ) ∗ V π ( s ′ ) = R s a ( s , a ) + γ ∑ P s a ( s ′ ) ∗ V π ( s ′ ) Q_\pi(s,a)=r_{t+1}+\gamma\sum Psa(s')*V_\pi(s')=Rsa(s,a)+\gamma\sum Psa(s')*V_\pi(s') Qπ(s,a)=rt+1+γPsa(s)Vπ(s)=Rsa(s,a)+γPsa(s)Vπ(s)

4.状态值函数与动作值函数的关系

Q π ( s , a ) = R s a ( s , a ) + γ ∑ P s a ( s ′ ) ∗ V π ( s ′ ) Q_\pi(s,a)=Rsa(s,a)+\gamma\sum Psa(s')*V_\pi(s') Qπ(s,a)=Rsa(s,a)+γPsa(s)Vπ(s)
V π ( s ) = ∑ π ( a ∣ s ) ∗ Q π ( s , a ) V_\pi(s)=\sum\pi(a|s)*Q_\pi(s,a) Vπ(s)=π(as)Qπ(s,a)

5.贝尔曼方程(动态规划法核心)

{ Q π ( s , a ) = R s a ( s , a ) + γ ∑ P s a ( s ′ ) ∗ V π ( s ′ ) V π ( s ) = ∑ π ( a ∣ s ) ∗ Q π ( s , a ) \begin{cases} Q_\pi(s,a)=Rsa(s,a)+\gamma\sum Psa(s')*V_\pi(s')\\ V_\pi(s)=\sum\pi(a|s)*Q_\pi(s,a) \end{cases} {Qπ(s,a)=Rsa(s,a)+γPsa(s)Vπ(s)Vπ(s)=π(as)Qπ(s,a)
⇒ V π ( s ) = ∑ ( π ( a ′ ∣ s ) ∗ ( R s a ( s , a ′ ) + γ ∑ ( P s a ′ ( s ′ ) ∗ V π ( s ′ ) ) ) ) \rArr V_\pi(s)=\sum \bigg(\pi(a' |s)*\Big(Rsa(s,a')+\gamma\sum\big(Psa'(s')*V_\pi(s')\big)\Big)\bigg) Vπ(s)=(π(as)(Rsa(s,a)+γ(Psa(s)Vπ(s))))
⇒ Q π ( s , a ) = R s a ( s , a ) + γ ( ∑ P s a ( s ′ ) ∗ ( ∑ π ( a ′ ∣ s ) ∗ Q π ( s ′ , a ′ ) ) ) \rArr Q_\pi(s,a)=Rsa(s,a)+\gamma\Big(\sum Psa(s')*\big(\sum\pi(a'|s)*Q_\pi(s',a')\big)\Big) Qπ(s,a)=Rsa(s,a)+γ(Psa(s)(π(as)Qπ(s,a)))


三、策略评估

给定一个策略 π \pi π,求在这一策略下的值函数

1.基于状态值函数评估策略

V π ( s ) = ∑ ( π ( a ′ ∣ s ) ∗ ( R s a ( s , a ′ ) + γ ∑ ( P s a ′ ( s ′ ) ∗ V π ( s ′ ) ) ) ) V_\pi(s)=\sum \bigg(\pi(a' |s)*\Big(Rsa(s,a')+\gamma\sum\big(Psa'(s')*V_\pi(s')\big)\Big)\bigg) Vπ(s)=(π(as)(Rsa(s,a)+γ(Psa(s)Vπ(s))))

2.基于动作值函数评估策略

Q π ( s , a ) = R s a ( s , a ) + γ ( ∑ P s a ( s ′ ) ∗ ( ∑ π ( a ′ ∣ s ) ∗ Q π ( s ′ , a ′ ) ) ) Q_\pi(s,a)=Rsa(s,a)+\gamma\Big(\sum Psa(s')*\big(\sum\pi(a'|s)*Q_\pi(s',a')\big)\Big) Qπ(s,a)=Rsa(s,a)+γ(Psa(s)(π(as)Qπ(s,a)))


四、策略改进(策略求解)

已知状态值函数或动作值函数,求在这一值函数下的最优策略,也叫做贪心策略或者确定性策略

1.基于状态值函数的策略改进

π ( s ∣ a ) = { 1 if  a = a r g m a x ( R ( s , a ) + γ ∑ P s a ( s ′ ) ∗ V π ( s ′ ) ) 0 else  \pi(s|a) =\begin{cases} 1 &\text{if } a=argmax\big(R(s,a)+\gamma\sum Psa(s')*V_\pi(s')\big) \\ 0 &\text{else } \end{cases} π(sa)={10if a=argmax(R(s,a)+γPsa(s)Vπ(s))else 

2.基于动作值函数的策略改进

π ( s ∣ a ) = { 1 if  a = a r g m a x ( Q π ( s , a ) ) 0 else  \pi(s|a) =\begin{cases} 1 &\text{if } a=argmax\big(Q_\pi(s,a)\big) \\ 0 &\text{else } \end{cases} π(sa)={10if a=argmax(Qπ(s,a))else 
这两种改进策略在我看来实质是一样的,都是要去找最大的 Q ( s , a ) Q(s,a) Q(s,a),然后将对应的 π ( s ∣ a ) = 1 \pi(s|a)=1 π(sa)=1(贪心策略)


在已知环境模型的情况下,策略迭代法就是策略评估 → \to 策略改进 → \to 策略评估 → \to 策略改进 … \dots

五、动态规划法与强化学习的联系

为了评估策略的好坏,我们定义了动作值函数 Q π ( s ∣ a ) Q_\pi(s|a) Qπ(sa)与状态值函数 V π ( s ) V_\pi(s) Vπ(s),在贪心策略下,我们需要求解 M a x ( Q π ( s ∣ a ) ) Max\big(Q_\pi(s|a)\big) Max(Qπ(sa))
值函数记录了单个小问题的解,Bellman方程将序列求最优问题拆分成递归问题。
参照博客:动态规划与强化学习
1.动态规划和前面的有什么联系?

答:强化学习前面已经说过,是一种序列决策问题,一开始不清楚环境的工作方式,不知道执行什么动作是对的,什么是错的,然后就只好不断的在环境试错,进而发现一个好的策略。同样,规划(planning)也属于序列决策问题,不同的是规划的环境是已知的,比如游戏的规则已知等,那么agent就不需要靠与环境的交互来获取下一个状态了,而是知道自己执行某个动作后的状态是什么,然后再优化自己的策略。这两者是不一样的。

动态规划可以将一个复杂问题分为一系列简单的子问题,一旦解决了这些简单的子问题,再将这些子问题的解结合起来就变成复杂问题的解了,并且同时将它们的解保存起来,如果下次遇到相同的子问题,就不用重新计算了。动态规划本质上就是一种环境模型已知的规划方法(planning)。

2.动态规划到底是干什么的?

动态规划的“动态”,指的是某个问题由序列化状态组成,状态的转换是step-by-step进行的。因此,可以step-by-step解决问题。“规划”就是优化子问题。上一节我们提到,通过Bellman方程MDP被递归的切分成子问题,同时它有值函数,保存了每一个子问题的解,因此它能通过动态规划来求解。针对MDP,切分成的子问题就是在每个状态下应该选择的action是什么,MDP的子问题是以一种递归的方式存在,这一时刻的子问题取决于上一时刻的子问题选择了哪个action。

动态规划简单说可以分为两部分,一是预测(prediction),也就是已知MDP的状态、动作、奖励、转移概率、折扣因子和策略,求出每一个状态下的值函数,也就是每个状态下能获得的reward是多少。第二就是控制,什么意思呢,就是在前面的状态、动作等等都已知,但策略未知的情况下,计算出最优的值函数,并且借此计算出最优的策略。动态规划的目的就是完成上面的两件事。适用于动态规划的问题,一般状态转移矩阵都是已知的,简单说就是环境模型已知了,这个时候就可以看做planning问题了。

总结

定义值函数来求解累计折扣奖励,并进一步写出值函数的迭代公式 (Bellman方程),在环境已知的条件下(Model Base),通过求解一组Bellman方程(策略评估)就可以评价当前策略好坏,在通过动作值函数按照贪心策略更新策略,当策略不再改变就代表求出了最优策略。该过程也叫做策略迭代法,依靠模型。


经典强化学习算法后续:
蒙特卡罗法不依赖模型,大致原理是通过采集大量MDP序列后,抽样求解状态转移概率(打比方,抛硬币1000次,记录正反出现的次数,我们就可以计算出正面出现的概率为0.5),同样的我们从大量的MDP序列中求出 P s a Psa Psa。后面更新策略的方法同策略迭代类似。该方法也是需要再大量采集数据后才能进行更新策略。
时序差分法可以做到在线学习,即实时更新。大致原理:随机初始化Q表,每执行一步动作通过以前记录的Q表+当前动作奖励来更新Q表,最后的策略是通过最大Q值来反推(或者说动作选择基于Q表,选取最大Q值对应的动作)。

你可能感兴趣的:(动态规划,算法,贪心算法)