接口测试 多线程 Apache gitee events arraylist graph websocket 虚拟机 requirejs winbox使用教程 bootstrap单选按钮 完全去vm去虚拟化工具 jquery获取兄弟节点 hbuilder插件 linux查询文件内容 python开发 python编程工具 python自学入门 python调用命令行 java编程学习 怎么看java版本 java的random java如何使用 java调用方法 java比较字符串 java定义字符串 liunx命令大全 php实例 python教程视频 ILspy js删除节点 eclipse中文版下载 手机知识 网卡驱动安装包 抠图教程 jsp源码下载 grep正则表达式 chrome访问助手 熊猫头表情包制作
当前位置: 首页 > 学习教程  > 编程语言

再看 DRL

2020/11/24 11:13:00 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

DRL 里面有许多摸不清的概念 转载 https://zhuanlan.zhihu.com/p/109498587 Q 和 V 的意义 所以我们在做决策的时候,需要把眼光放远点,把未来的价值换到当前,才能做出选择。 为了方便,我们希望可以有一种方法衡量我做出每种选…

DRL 里面有许多摸不清的概念

转载 https://zhuanlan.zhihu.com/p/109498587

Q 和 V 的意义

所以我们在做决策的时候,需要把眼光放远点,把未来的价值换到当前,才能做出选择。

为了方便,我们希望可以有一种方法衡量我做出每种选择的价值。这样,我只要看一下标记,以后的事情我也不用理了,我选择那个动作价值更大,就选那个动作就可以了。

当然,我们也可以把这个标记标在状态上。

为了方便沟通,我们这样定义

  • 评估动作的价值,我们称为 Q 值:它代表了智能体选择这个动作后,一直到最终状态奖励总和的期望;
  • 评估状态的价值,我们称为 V 值:它代表了智能体在这个状态下,一直到最终状态的奖励总和的期望。

价值越高,表示我从当前状态到最终状态能获得的平均奖励将会越高。因为智能体的目标是获取尽可能多的奖励,所以智能体在当前状态,只需要选择价值高的动作就可以了。

对于 Q 值和 V 值的定义非常非常重要。对 Q、V 的清晰理解,是理解强化学习中几乎所有算法的基础。


V 的定义

假设现在需要求某状态 S 的 V 值,那么我们可以这样:

  • 我们从 S 点出发,并影分身出若干个自己;
  • 每个分身按照当前的策略选择行为;
  • 每个分身一直走到最终状态,并计算一路上获得的所有奖励总和;
  • 我们计算所有影分身获得的平均值,这个平均值就是我们要求的 V 值。

用大白话总结就是:从某个状态,按照策略(概率性策略),走到最终状态很多很多次;最终获得奖励总和的平均值,就是 V 值。

注:

  1. 从 V 值的计算,我们可以知道,V 值代表了这个状态的今后能获得奖励的期望。从这个状态出发,到达最终状态,平均而言能拿到多少奖励。所以我们轻易比较两个状态的价值。
  2. V 值跟我们选择的策略有很大的关系。V 值是会根据不同的策略有所变化的!

Q 的定义

Q 值和 V 值的概念是一致的,都是衡量在马可洛夫树上某一个节点的价值。只不过 V 值衡量的是状态节点的价值,而 Q 值衡量的是动作节点的价值。

现在我们需要计算,某个状态 S0 下的一个动作 A 的 Q 值:

  1. 我们就可以从 A 这个节点出发,使用影分身之术;
  2. 每个影分身走到最终状态,并记录所获得的奖励;
  3. 求取所有影分身获得奖励的平均值,这个平均值就是我们需要求的 Q 值。

用大白话总结就是:从某个状态选取动作 A,走到最终状态很多很多次;最终获得奖励总和的平均值,就是 Q 值。

注:与 V 值不同,Q 值和策略并没有直接相关而与环境的状态转移概率相关,且环境的状态转移概率是不变的


V值和Q值关系
v π ( s ) = ∑ a π ( a ∣ s ) q π ( s ∣ a ) v_\pi(s) = \sum_{a} \pi(a \vert s) q_\pi(s \vert a) vπ(s)=aπ(as)qπ(sa)
总结一下,从以上的定义,我们可以知道Q值和V值的意义相通的:所以,其实Q和V之间是可以相互换算的。
大白话就是:一个状态的V值,就是这个状态下的所有动作的Q值,在策略 π ( a ∣ s ) \pi(a\vert s) π(as) 下的期望。

q π ( s ∣ a ) = R s a + γ ∑ s ′ P s s ′ a v π ( s ′ ) q_\pi(s \vert a) = R_s^a + \gamma \sum_{s'} P_{ss'}^a v_\pi(s') qπ(sa)=Rsa+γsPssavπ(s)

实际应用中,我们更多会从V到V(衡量状态到状态的价值)。
v π ( s ) = ∑ a π ( a ∣ s ) q π ( s ∣ a ) = ∑ a π ( a ∣ s ) ( R s a + γ ∑ s ′ P s s ′ a v π ( s ′ ) ) v_\pi(s) = \sum_{a} \pi(a \vert s) q_\pi(s \vert a) = \sum_{a} \pi(a \vert s) \left(R_s^a + \gamma \sum_{s'} P_{ss'}^a v_\pi(s') \right) vπ(s)=aπ(as)qπ(sa)=aπ(as)(Rsa+γsPssavπ(s))


TD和MC的比较

TD算法对蒙地卡罗(MC)进行了改进。

  1. 和蒙地卡罗(MC)不同:TD算法只需要走N步。就可以开始回溯更新。
  2. 和蒙地卡罗(MC)一样:小猴需要先走N步,每经过一个状态,把奖励记录下来。然后开始回溯。
  3. 那么,状态的V值怎么算呢?其实和蒙地卡罗一样,我们就假设N步之后,就到达了最终状态了。
  • 假设“最终状态”上我们之前没有走过,所以这个状态上的纸是空白的。这个时候我们就当这个状态为0.
  • 假设“最终状态”上我们已经走过了,这个状态的V值,就是当前值。然后我们开始回溯。

Q-learning是基于时序差分的。
V ( S t ) ← V ( S t ) + α ( R t + 1 + γ V ( S t + 1 − V ( S t ) ) ) V(S_t) \leftarrow V(S_t) + \alpha \left( R_{t+1} +\gamma V(S_{t+1} - V(S_t)) \right) V(St)V(St)+α(Rt+1+γV(St+1V(St)))

TD更厉害的是,在很多时候,我们并不需要一直到最后,我们可以先用后面的估算,然后调整当前状态。

TD能够用在V值,那能不能用在计算Q值上呢?答案是肯定的。

  • 因为从状态St+1到动作At+1之间没有奖励反馈,所以我们直接用At+1的Q价值,代替St+1的V价值。 这样是不可以的!
  • 马可洛夫链不是链,是树。
  • 在St+1下,可能有很多动作At+1。不同动作的Q值自然是不同的。 所以Q(St+1,At+1)并不能等价于V(St+1)。

虽然不相等,但不代表不能用其中一个来代表V(St+1)。人们认为有个可能的动作产生的Q值能够一定程度代表V(St+1)

  • 在相同策略下产生的动作At+1。这就是 SARSA。
    注意,这里的At+1是在同一策略产生的。也就是说,St选At的策略St+1选At+1同一个策略。这也是SARSA和Qlearning的唯一区别。
  • 选择能够产生最大Q值的动作At+1。这就是Q-learning。

问题

  • 价值和奖励的定义?
    reward是环境给你的直接反馈,value fuction是我们根据一段时间的reward算出来的。

  • 策略是什么?

  • DQN的输入是什么数据内容?[s, a] 结合神经网络的输入输出特点?
    状态新旧的转换与中间选取的动作以及回报值
    2

  • 基于价值和基于策略的区别?https://zhuanlan.zhihu.com/p/54825295

1

policy gradient

学习,一定要算Q值和V值,往死里算。但算Q值和V值并不是我们最终目的呀,我们要找一个策略,能获得最多的奖励。我们可以抛弃掉Q值和V值么?
答案是,可以,策略梯度(Policy Gradient)算法就是这样以一个算法。

  • 记录数据 在DQN,我们记录data = (s,a,r,s_,d) 五要素。并且我们记录在一个队列,需要用到的时候,从队列中随机抽取。 但PG中,我们记录的data = (s,a,r) 三要素就可以了,我们的记录是不能打乱的。因为当我们要计算G值的时候,我们需要从后往前回溯计算
  • 清除数据 这些记录是用完即弃,可以看到,在learn函数最后,智能体学习完数据后,就会清空列表。

PG用一个全新的思路解决了问题。但实际效果显得不太稳定,在某些环境下学习较为困难。另外由于采用了MC的方式,需要走到最终状态才能进行更新,而且只能进行一次更新,这也是GP算法的效率不高的原因。

后面我们将会尝试解决这个问题,既然用MC比较慢,那么我们用TD可以不?答案是,当然可以。

Actor-Critic

也就是说,Actor-Critic,其实是用了两个网络:

两个网络有一个共同点,输入状态S:

  • 一个输出策略,负责选择动作,我们把这个网络成为Actor;
  • 一个负责计算每个动作的分数,我们把这个网络成为Critic。

TD-error
注:这是AC的重点。很多同学在这里会和DQN搞乱,也就是容易产生误解的地方。在DQN预估的是Q值,在AC中的Critic,估算的是V值。

这就掉进了正数陷阱。
这是因为Q值用于是一个正数,如果权重是一个正数,那么我们相当于提高对应动作的选择的概率。权重越大,我们调整的幅度将会越大。
在强化学习中,往往没有足够的时间让我们去和环境互动。这就会出现由于运气不好,使得一个很好的动作没有被采样到的情况发生。
要解决这个问题,我们可以通过减去一个baseline,令到权重有正有负。而通常这个baseline,我们选取的是权重的平均值。减去平均值之后,值就变成有正有负了。
Q值的期望(均值)就是V

所以我们可以得到更新的权重:Q(s,a)-V(s)
随之而来的问题是,这就需要两个网络来估计Q和V了。V和Q是可以互相换算的:Q(s,a)用gamma * V(s’) + r 来代替,于是整理后就可以得到:

gamma * V(s’) + r - V(s)
我们把这个差,叫做TD-error
这个和之前DQN的更新公式非常像,只不过DQN的更新用了Q,而TD-error用的是V。
所以整个流程就是:Critic的任务就是让TD-error尽量小。然后TD-error给Actor做更新。


本文链接: http://www.dtmao.cc/news_show_400427.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?