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

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

  • 策略:π(a|s)=P(At=a|St=s)

  • 状态价值函数:vπ(s)=E[Rt+1+γ(St+1)|St=s]

  • 动作价值函数:qπ(s,a)=Eπ(Rt+1+γqπ(St+1,At+1)|St=s,At=a)

两个价值函数分别代表了某个状态的价值,和在状态st下做某个action的价值。而策略函数就是我们需要进行求解的。因为对于我们来说,肯定是希望某个策略能够得到最大的价值。比如说,你会选择努力学习而不是去网吧,以获得棒棒糖的奖励。

一般来说,比较难去找到一个最优策略,但是可以通过比较若干不同策略的优劣来确定一个较好的策略,也就是局部最优解。

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

最优策略

首先,我们知道“好的策略产生好的价值”,因此策略的好坏可以通过价值的大小来比较。我们定义最佳的策略是 π ,而我们的目的就是为了寻找这个 π

  1. 最优状态价值函数:代表所有策略下产生的不同状态的状态的价值函数中的最大值

    v(s)=maxπvπ(s)

  2. 最优动作价值函数:代表所有策略下产生众多动作价值函数中的最大值

    q(s,a)=maxπqπ(s,a)

    怎么理解这个最优动作(行为)价值函数呢?个人觉得(如果有错的话,欢迎在评论区留言告诉我)

应该是这样的:

目前我们有一个最好的策略 π,它一定能够保证我们获得最好的分数。我们在t时刻执行的动作是a,然后在接下来的时刻,执行的策略都是 π ,因此q(s,a) 一定是在当前状态s下能够执行a能够获得最好的分数了。那么,他有什么含义呢?它可以代表在当前状态执行a 动作好不好。比如说q(s,a1)>q(s,a2) 则就代表a1a2好,因为它能够获得更多的奖励分数。

  1. 两个之间的关系:

结合下图,我们可以知道:

v(s)=maxπvπ(s)=maxaq(s,a)q(s,a)=maxπqπ(s,a)=Rsa+γsSPssav(s)

实际上,寻找最优策略的过程就是寻找最优动作的过程:选取一个a使得qπ(s,a)最大。针对于最优策略,基于动作价值函数我们可以定义为:

π(a|s)={1ifa=argmaxaAq(s,a)0else

最优策略实例

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

我们设衰减因子:γ=1,因为每一个state都只对应2个action,因此,我们设初始策略π(a|s)=0.5。其终点(也就是s5)没有下一个状态,同时也没有相应的动作,因为我们定义其价值为v5=0

这里复说一下状态价值函数的定义:vπ(s)=aAπ(a|s)(Rsa+γsSPssavπ(s))

  1. 针对于v1v1=0.5(1+v1)+0.5(0+v2)
  2. 针对于v2v2=0.5(1+v1)+0.5(2+v3)
  3. 针对于v3v3=0.5(2+v4)+0.5(0+v5)
  4. 针对于v4v4=0.5(10+v5)+0.5(1+0.2v2+0.4v3+0.4v4)

解得方程组为:v1=2.3,v2=1.3,v3=2.7,v4=7.4

上面是我们固定了策略π(a,s)=0.5得到得每一个状态得价值函数,因此上面的到的v很可能不是最大的价值函数,因为这个策略不是最好的策略。

寻求最佳策略就是寻找最佳得动作价值函数,因此我们如果能够得到最优动作价值函数,也就得到了策略 π

还是以上面得那个例子为例,通过求解每一个action对应得q(s,a)。然后就可以得到最优策略。(策略即为s2s3s4s5

下图中的9.4应该为8.4

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

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

求解方法

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

动态规划

当问题具有下列两个性质时,通常可以考虑使用动态规划来求解:

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

而强化学习刚好满足这个。为什么呢?因为bellman方程:

(1)vπ(s)=E[Rt+1+γv(St+1)|St=s]vπ(s)=aAπ(a|s)(Rsa+γsSPssavπ(s))

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

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

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

策略评估求解预测问题

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

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

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

首先假设我们已知第k 轮的状态价值函数,那么我们就可以得到第k+1轮的状态价值函数:

vk+1(s)=aAπ(a|s)(Rsa+γsSPssavk(s))

同时又可以简化为:

(2)vk+1=Rπ+γPπvk

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

  • K=1时:

    第一行第二个:

    (3)v(1,2)=0.25[(R+v1,0)+(R+v1,1)+(R+v1,2)+(R+v2,1)]=0.25×[(1+0)+(1+0)+(1+0)+(1+0)]=1

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

  • K=2时:

    第一行第二个:

    (4)v(1,2)=0.25[(R+v1,0)+(R+v1,1)+(R+v1,2)+(R+v2,1)]=0.25×[(1+0)+(1+1)+(1+1)+(1+1)]=741.7

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

    因此最终的得到结果如下:

求解的过程并不复杂,当然,如果我们的数据很多的话,那么需要的迭代的次数也会增多。

策略迭代求解控制问题

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

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

从算法中来看,实际上需要耗费的步骤还是挺多的。先进行价值迭代,然后又进行策略迭代,然后不符合的话又重复操作,一直迭代到价值和策略收敛才可以。

价值迭代求解控制问题

上述的策略迭代还有有一点问题,比如说上述的格子问题,实际上在k=3的时候就已经得到最优动作策略了:

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

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

算法的流程如下:

不过值得注意的是,以上动态规划得到的策略解π不一定是全局最优解,只是局部最优解。因此我们还需要使用探索率ϵ,来跳出局部最优解。

总结

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

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

参考

posted @   渣渣辉啊  阅读(5503)  评论(2编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示