关于动态规划法的详细介绍:动态规划法
我们在这里关注的是作为一种算法设计技术,作为一种使用多阶段决策过程最优的通用方法。
它是应用数学中用于解决某类最优化问题的重要工具。
假设问题是由交叠的子问题所构成,我们就能够用动态规划技术来解决它。一般来说,这种子问题出如今对给定问题求解的递推关系中,这个递推关系包括了同样问题的更小子问题的解。动态规划法建议,与其对交叠子问题一次重新的求解,不如把每一个较小子问题仅仅求解一次并把结果记录在表中(动态规划也是空间换时间的)。这样就能够从表中得到原始问题的解。
能采用动态规划求解的问题的一般要具有3个性质:
实际应用中能够按下面几个简化的步骤进行设计:
在这里列举一个三角数塔的问题,从顶点出发,能够向左走或向右走,要求从顶点开始走到最底层,请找出一条路径,使路径之和最大。
正确路径为13-8-26-15-24(和为86)。
我淦,好难写。。。
我觉得大部分人一看到这个问题会想到从起点开始,一步步尝试,计算总和,然后对比不同的路线,但是这么操作非常地麻烦,会遇到重复计算的部分。
用动态规划法来求解:
拆分问题:从顶点开始的最优路径,就是从第二行两个点开始的最优路径取最大,按照这个思路逐次推广到最底层。问题就被逐渐拆分了。
由底向上:最底层的问题无法继续拆分,从最底层开始,比如比较底层12和7的大小,就能知道倒数第二行6的位置对应的后续最优路径( 6 → 12 6\to12 6→12)。
算法流程:
1.初始化层数N, Q N = 0 Q_N=0 QN=0
2. 比较第n层相邻两个数大小,将最大值与(n-1)层对应的数相加并记录为 Q n − 1 Q_{n-1} Qn−1
迭代公式: 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}) Qn−1i=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,r1→s1,a1,r2→s2,a2,r3→s3,a3,r4…st,at,rt+1→…sT−1,aT−1,rT→sT(终止状态)
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+⋯+γT−t−1rT
从当前状态开始的累计折扣奖励的期望,与策略有关
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+1∣st=s]+γE[Vπ(st+1)∣st=s]
状态值函数的理解:
E [ r t + 1 ∣ s t = s ] E[r_{t+1}|s_{t}=s] E[rt+1∣st=s]:当 t t t时刻状态为 s s s时,采取动作 a ′ a' a′未知,但 a ′ ∽ π ( a ′ ∣ s ) a'\backsim\pi(a'|s) a′∽π(a′∣s), 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+1∣st=s]=∑[π(a′∣st)∗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') s′∼Psa(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]=∑(π(a′∣st)∗∑(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)=∑(π(a′∣s)∗(Rsa(s,a′)+γ∑(Psa′(s′)∗Vπ(s′))))
由该公式可以看出,只要我们已知状态转移概率 P s a Psa Psa以及奖励函数 R s a Rsa Rsa,即已知环境模型,那么通过该公式就可以评价策略函数 π \pi π的好坏。
从当前状态开始(不包括当前状态),采取动作 a a a,所得到的后续累计折扣奖励的期望。 Q π : S ∗ A → R Q_\pi:S*A\to R Qπ:S∗A→R
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′)
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)=∑π(a∣s)∗Qπ(s,a)
{ 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)=∑π(a∣s)∗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)=∑(π(a′∣s)∗(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′)∗(∑π(a′∣s)∗Qπ(s′,a′)))
给定一个策略 π \pi π,求在这一策略下的值函数
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)=∑(π(a′∣s)∗(Rsa(s,a′)+γ∑(Psa′(s′)∗Vπ(s′))))
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′)∗(∑π(a′∣s)∗Qπ(s′,a′)))
已知状态值函数或动作值函数,求在这一值函数下的最优策略,也叫做贪心策略或者确定性策略
π ( 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} π(s∣a)={10if a=argmax(R(s,a)+γ∑Psa(s′)∗Vπ(s′))else
π ( 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} π(s∣a)={10if a=argmax(Qπ(s,a))else
这两种改进策略在我看来实质是一样的,都是要去找最大的 Q ( s , a ) Q(s,a) Q(s,a),然后将对应的 π ( s ∣ a ) = 1 \pi(s|a)=1 π(s∣a)=1(贪心策略)
在已知环境模型的情况下,策略迭代法就是策略评估 → \to →策略改进 → \to →策略评估 → \to →策略改进 … \dots …
为了评估策略的好坏,我们定义了动作值函数 Q π ( s ∣ a ) Q_\pi(s|a) Qπ(s∣a)与状态值函数 V π ( s ) V_\pi(s) Vπ(s),在贪心策略下,我们需要求解 M a x ( Q π ( s ∣ a ) ) Max\big(Q_\pi(s|a)\big) Max(Qπ(s∣a))
值函数记录了单个小问题的解,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值对应的动作)。