DQN(Deep Q-learning)入门教程(二)之最优选择

在上一篇博客:DQN(Deep Q-learning)入门教程(一)之强化学习介绍中有三个很重要的函数:html

  • 策略:\(\pi(a|s) = P(A_t=a | S_t=s)\)算法

  • 状态价值函数:\(v_\pi(s)=\mathbb{E}\left[R_{t+1}+\gamma \left(S_{t+1}\right) | S_{t}=s\right]\)app

  • 动做价值函数:\(q_{\pi}(s,a) = \mathbb{E}_{\pi}(R_{t+1} + \gamma q_{\pi}(S_{t+1},A_{t+1}) | S_t=s, A_t=a)\)函数

两个价值函数分别表明了某个状态的价值,和在状态\(s_t\)下作某个action的价值。而策略函数就是咱们须要进行求解的。由于对于咱们来讲,确定是但愿某个策略可以获得最大的价值。好比说,你会选择努力学习而不是去网吧,以得到棒棒糖的奖励。学习

通常来讲,比较难去找到一个最优策略,可是能够经过比较若干不一样策略的优劣来肯定一个较好的策略,也就是局部最优解。字体

​ ——强化学习(二)马尔科夫决策过程(MDP)ui

最优策略

首先,咱们知道“好的策略产生好的价值”,所以策略的好坏能够经过价值的大小来比较。咱们定义最佳的策略是 \(\pi_*\) ,而咱们的目的就是为了寻找这个 \(\pi_*\)lua

  1. 最优状态价值函数:表明全部策略下产生的不一样状态的状态的价值函数中的最大值spa

    \[v_{*}(s) = \max_{\pi}v_{\pi}(s) \]

  2. 最优动做价值函数:表明全部策略下产生众多动做价值函数中的最大值3d

    \[q_{*}(s,a) = \max_{\pi}q_{\pi}(s,a) \]

    怎么理解这个最优动做(行为)价值函数呢?我的以为(若是有错的话,欢迎在评论区留言告诉我)

应该是这样的:

目前咱们有一个最好的策略 \(\pi_*\),它必定可以保证咱们得到最好的分数。咱们在\(t\)时刻执行的动做是\(a\),而后在接下来的时刻,执行的策略都是 \(\pi_*\) ,所以\(q_*(s,a)\) 必定是在当前状态\(s\)下可以执行\(a\)可以得到最好的分数了。那么,他有什么含义呢?它能够表明在当前状态执行\(a\) 动做好很差。好比说\(q_*(s,a_1) > q_*(s,a_2)\) 则就表明\(a_1\)\(a_2\)好,由于它可以得到更多的奖励分数。

  1. 两个之间的关系:

结合下图,咱们能够知道:

\[v_{*}(s) = \max_{\pi}v_{\pi}(s) = \max_{a}q_{*}(s,a) \\ q_{*}(s,a) = \max_{\pi}q_{\pi}(s,a) = R_s^a + \gamma \sum\limits_{s' \in S}P_{ss'}^av_{*}(s') \]

实际上,寻找最优策略的过程就是寻找最优动做的过程:选取一个\(a\)使得\(q_{\pi}(s,a)\)最大。针对于最优策略,基于动做价值函数咱们能够定义为:

\[\pi_{*}(a|s)= \begin{cases} 1 & {if\;a=\arg\max_{a \in A}q_{*}(s,a)}\\ 0 & {else} \end{cases} \]

最优策略实例

下图是UCL强化强化学习课程的一个实例,黄色圆圈的开始状态,红色方块的是结束状态。\(R\)表明reward,每个状态能够执行的action为红色字体(例如Facebook,Study等等),其中黑色的点分支对应的数字表明执行这个action以后的状态转移几率。

咱们设衰减因子:\(\gamma = 1\),由于每个state都只对应2个action,所以,咱们设初始策略\(\pi(a|s) = 0.5\)。其终点(也就是\(s_5\))没有下一个状态,同时也没有相应的动做,由于咱们定义其价值为\(v_5 =0\)

这里复说一下状态价值函数的定义:\(v_{\pi}(s) = \sum\limits_{a \in A} \pi(a|s)(R_s^a + \gamma \sum\limits_{s' \in S}P_{ss'}^av_{\pi}(s'))\)

  1. 针对于\(v_1\)\(v_1 = 0.5*(-1+v_1) +0.5*(0+v_2)\)
  2. 针对于\(v_2\)\(v_2 = 0.5*(-1+v_1) +0.5*(-2+v_3)\)
  3. 针对于\(v_3\)\(v_3 = 0.5*(-2+v_4) +0.5*(0+v_5)\)
  4. 针对于\(v_4\)\(v_4 = 0.5*(10+v_5) +0.5*(1+0.2*v_2+0.4*v_3+0.4*v_4)\)

解得方程组为:\(v_1=-2.3, v_2=-1.3, v_3=2.7, v_4=7.4\)

上面是咱们固定了策略\(\pi(a,s) = 0.5\)获得得每个状态得价值函数,所以上面的到的\(v\)极可能不是最大的价值函数,由于这个策略不是最好的策略。

寻求最佳策略就是寻找最佳得动做价值函数,所以咱们若是可以获得最优动做价值函数,也就获得了策略 \(\pi_*\)

仍是以上面得那个例子为例,经过求解每个action对应得\(q_*(s,a)\)。而后就能够获得最优策略。(策略即为\(s_2 \rarr s_3 \rarr s_4 \rarr s_5\)

下图中的9.4应该为8.4

求解过程以下所示,过程稍微有点多,实在是很差使用Latex进行说明,就使用草稿纸进行推导了。

上面的部分是咱们人为的推导方法 ,电脑确定没有咱们这么聪明,那么对于电脑来讲,应该怎么进行推导呢?

求解方法

求解方法有不少种,下面将介绍一种最基本的动态规划算法。

动态规划

当问题具备下列两个性质时,一般能够考虑使用动态规划来求解:

  1. 一个复杂问题的最优解由数个小问题的最优解构成,能够经过寻找子问题的最优解来获得复杂问题的最优解
  2. 子问题在复杂问题内重复出现,使得子问题的解能够被存储起来重复利用,也就是说子问题之间存在递推关系,经过较小的子问题状态递推出较大的子问题的状态。

而强化学习恰好知足这个。为何呢?由于bellman方程:

\[\begin{equation} v_\pi(s) =\mathbb{E}\left[R_{t+1}+\gamma v\left(S_{t+1}\right) | S_{t}=s\right] \\ v_{\pi}(s)=\sum_{a \in A} \pi(a | s)\left(R_{s}^{a}+\gamma \sum_{s^{\prime} \in S} P_{s s^{\prime}}^{a} v_{\pi}\left(s^{\prime}\right)\right) \end{equation} \]

咱们能够将求解每个状态的价值函数定义为子问题,由于递推的关系,咱们可使用上一此迭代获得的价值函数来更新此时的价值函数。(妙哉!!!)

强化学习有两个基本问题:

  1. 预测(Prediction):对给定策略(\(\pi\)),奖励(Reward),状态集(S),动做集(A),和状态转化该几率(P),衰减因子(\(\gamma\)),目标是求解基于该策略的价值函数 \(v_{\pi}\)
  2. 控制(Control):寻找一个最优策略的过程(实际上就是寻找最优的价值函数)。对给定奖励(Reward),状态集(S),动做集(A),和状态转化该几率(P),衰减因子(\(\gamma\)),求解最优价值函数 \(v_*\) 和最优策略 \(\pi_*\)

策略评估求解预测问题

首先,咱们来看如何使用动态规划来求解强化学习的预测问题,即求解给定策略的状态价值函数的问题。这个问题的求解过程咱们一般叫作策略评估(Policy Evaluation)。

策略评估的基本思路是从任意一个状态价值函数开始,依据给定的策略,结合贝尔曼指望方程、状态转移几率和奖励同步迭代更新状态价值函数,直至其收敛,获得该策略下最终的状态价值函数。

—— 强化学习(三)用动态规划(DP)求解

首先假设咱们已知第\(k\) 轮的状态价值函数,那么咱们就能够获得第\(k+1\)轮的状态价值函数:

\[v_{k+1}(s) = \sum\limits_{a \in A} \pi(a|s)(R_s^a + \gamma \sum\limits_{s' \in S}P_{ss'}^av_{k}(s')) \]

同时又能够简化为:

\[\begin{equation}\mathbf{v}^{k+1}=\mathcal{R}^{\pi}+\gamma \mathcal{P}^{\pi} \mathbf{v}^{k}\end{equation} \]

这里引用Planning by Dynamic Programming中的一个例子:咱们有一个4x4的宫格。只有左上和右下的格子是终止格子。该位置的价值固定为0,个体若是到达终止格子,则中止移动。个体在16宫格其余格的每次移动,获得的即时奖励\(R\)都是-1,若往边界走,则会返回到原来的位置(也就是下一个状态仍是原来的地方)。个体只能上下左右移动,每次移动一个位置。衰减因子\(\gamma = 1\)\(P=1\)。给定的策略是随机策略,每一个方向的移动几率是\(0.25\)

  • K=1时:

    第一行第二个:

    \[\begin{equation}\begin{aligned} v^{(1,2)} &= 0.25[(R +v^{1,0}) + (R +v^{1,1}) + (R +v^{1,2}) + (R +v^{2,1})] \\&= 0.25\times[(-1 + 0) + (-1 + 0) + (-1 + 0) + (-1 + 0)] \\&= -1 \end{aligned}\end{equation} \]

    其余同理,结果如图所示。

  • K=2时:

    第一行第二个:

    \[\begin{equation}\begin{aligned} v^{(1,2)} &= 0.25[(R +v^{1,0}) + (R +v^{1,1}) + (R +v^{1,2}) + (R +v^{2,1})] \\ &= 0.25\times[(-1 + 0) + (-1 + -1) + (-1 + -1) + (-1 + -1)] \\ &= \frac{7}{4} \\ &\approx-1.7 \end{aligned}\end{equation} \]

    而后咱们一直这样迭代下去,直到每一个格子的价值的变化小于某一个阈值时,咱们会中止迭代。

    所以最终的获得结果以下:

求解的过程并不复杂,固然,若是咱们的数据不少的话,那么须要的迭代的次数也会增多。

策略迭代求解控制问题

针对于第二个控制问题,咱们能够基于一种初始化策略,而后获得状态价值,而后在基于状态价值来及时的调整咱们的策略,这个方法就叫作策略迭代(Policy Iteration)。过程示意图以下:

其中调整的方法是贪婪法。个体在某个状态下选择的行为是其可以到达后续全部可能的状态中状态价值最大的那个状态。算法的流程以下:

从算法中来看,实际上须要耗费的步骤仍是挺多的。先进行价值迭代,而后又进行策略迭代,而后不符合的话又重复操做,一直迭代到价值和策略收敛才能够。

价值迭代求解控制问题

上述的策略迭代还有有一点问题,好比说上述的格子问题,实际上在\(k=3\)的时候就已经获得最优动做策略了:

为了解决策略迭代出现的步骤多的问题,一个特殊的改进就是当策略评估仅进行一次更新的时候就中止。也就是说二者的区别以下:

  1. 策略迭代:策略更新计算的是每个状态\(s\)各个行为\(a\)指望值,而后进行更新旧值,直到\(v - V(s)\)小于某个阈值。而后在从其中选择最好的\(a\)
  2. 价值迭代:直迭代就是用某个行为 \(a\) 获得的最大的状态价值函数,来更新原来的状态价值函数,最后获得\(a\)

算法的流程以下:

不过值得注意的是,以上动态规划获得的策略解\(\pi_*\)不必定是全局最优解,只是局部最优解。所以咱们还须要使用探索率\(\epsilon\),来跳出局部最优解。

总结

关于最佳策略的求解方法还有不少,好比说MC方法,时序差分方法等等,可是由于这个系列博客主要是为了快速入门到入土,就不那么详细的讲解了。若是想了解更多能够看看刘建平Pinard强化学习

在下一个篇博客中,将介绍Q-learning。

参考

相关文章
相关标签/搜索