当前位置: 移动技术网 > IT编程>脚本编程>Python > 5.Q-learning

5.Q-learning

2020年07月15日  | 移动技术网IT编程  | 我要评论

目录

深度强化学习目录

简介

上篇文章里讲了MC算法和TD算法,不过用的是V值函数,这回我们学习Q函数。在贝尔曼方程那一篇文章里我们说过,Q函数可以表示成最优Bellman等式的形式,且最优的Q等价于最优的策略π\pi^\star,又策略π\pi一定可以收敛到最优策略π\pi',Q-learning就是基于这些思想来实现的。

实现运用到的技术

前面讲到了,Q-learning实际上就是对Q值函数使用TD算法(至于为什么不用MC算法,我也不清楚,可能是因为方差太大了吧)。TD算法的核心只有一个公式:Qπ(st,at)=Qπ(st+1,at+1)+rtQ_\pi(s_t,a_t)=Q_\pi(s_{t+1},a_{t+1})+r_t

我们通过训练拟合Q值函数,采样即时奖赏r,来训练出最优的Q值函数,也即最优策略。
但具体实现的过程中,还是用到了一些小技巧,分别是:

  • Target Network(目标网络)
  • Exploration(探索)
  • Replay Buffer(回放缓存)

下面,我将对其分别进行讲解。

1.Target Network

来源B站李宏毅深度学习
TD算法,训练一个模型当做Q函数,采样rtr_t。但是在实际运行过程中,会发现如果同时update左边的Q model和右边的Q model,训练会变得不太稳定。也就是说,不能让同一个模型同时输出两次Q值。因此,我们产生了Target Network的想法,即固定右边的模型参数不变,转而只更新左边的模型。
来源b站李宏毅深度学习
当然了,为了这两个模型在理论上用的是同一个策略π\pi,所以这种固定也并非一成不变,而是左侧模型每update一定次数就更新一次右侧的模型。
比方说玩某个游戏玩了50轮,我们更新一次右边的模型,而这50轮游戏里每一轮结束时我们都会更新左侧的模型。
采用了Target Network,能让模型训练得更加稳定。

2.Exploration

Q-learning的行为是基于Q函数的:a=argmaxaAQ(s,a)a=arg \max_{a\in A}Q(s,a)

与Policy Gradient不同的是,这里策略产生的行为是固定的,而非一个概率分布。这就会产生一个问题:如果在初始的采样过程中某个行为先获得了一定成效,模型就会一直选择这个行为,而不会去拓展(explore)选择其他行为。
打个比方,打飞机游戏可以左移,右移,开火。刚开始的时候这三个动作在某个状态的Q值函数都是0,然后某轮游戏结束后,开火的Q值函数变成1了,接下来再碰到这个状态时模型就会直接选择开火,而不是去选择其他的动作,哪怕左移这个动作可能带来3的奖励值。
所谓的Exploration,就是不要模型这么死板的选择动作,至少不要在游戏开始的时候这么死板。
有两种解决方法,一种是Epsilon Greedy,另一种是Boltzmann Exploration。

Epsilon Greedy

非常简单,设置一个参数ε\varepsilon,每次采取行动前都取个随机数值,如果随机到数值小于ε\varepsilon,那就随机行动;反之则采取最大Q值的那个行为。
a={argmaxaAQ(s,a)probablity1εrandomotherwisea=\left\{ \begin{array}{rcl} & arg \max_{a\in A}Q(s,a) & {probablity \le 1-\varepsilon}\\ & random& {otherwise} \\ \end{array} \right.

公式里的ε\varepsilon往往是动态的,在刚开始训练的时候设置的大一些,在训练一定episode之后又设置的小一些,比方说ε=0.9episode\varepsilon=0.9^{episode}

Boltzmann Exploration

说Boltzmann可能不了解,但叫他另一个名字softmax肯定就很多人知道了。实际公式其实也就是softmax的公式:P(as)=exp(Q(s,a))aAexp(Q(s,a))P(a\vert s)=\frac{\exp(Q(s,a))}{\sum_{a' \in A}\exp{(Q(s,a'))}}
这样,就可以计算出每一个动作a的出现概率了。

3.Replay Buffer

如果还记得之前一篇关于on-policy和off-policy区别的文章,那就能理解这一部分了。on-policy就是policy一边采样一边训练,训练好了再用同一个agent去采样;off-policy就是一个agent只采样,另一个agent用采样得来的数据来训练模型。
Replay Buffer相当于开拓一个存储空间,用来存储采样来的经验。这里存储的经验就是一组st,at,rt,st+1s_t,a_t,r_t,s_{t+1},这些经验可能来自不同的策略π\pi,这是因为采样的模型也需要更新,只是更新的比较慢而已(比如说玩1万盘游戏更新一次)。我们用Replay Buffer中的经验来训练Target Network。
来自b站李宏毅深度学习

伪代码步骤

  • 初始化训练模型QQ,同时令目标模型Q^=Q\hat{Q}=Q
  • 在每一轮游戏episode:
    • 在每一个时间步t:
      • 基于模型QQ(采用epsilon greedy方法)获取状态sts_t,采取动作ata_t
      • 获得即时奖励rtr_t和下一个状态st+1s_{t+1}
      • (st,at,rt,st+1)(s_t,a_t,r_t,s_{t+1})存入Replay Buffer中
      • 从buffer里随机采样数量为Batch_size的经验序列数组(si,ai,ri,si+1)(s_i,a_i,r_i,s_{i+1}),其中batch size是自己设定的。
      • 对每一个采样出来的序列(一共有batch size个这样的序列),都通过目标模型Q^\hat{Q}计算其目标值yi=ri+maxaAQ^(si+1,a)y_i=r_i+\max_{a\in A}\hat{Q}(s_{i+1},a)
      • 更新模型QQ,令Q(si,ai)Q(s_i,a_i)回归拟合yiy_i,即满足公式Qπ(st,at)=Qπ(st+1,at+1)+rtQ_\pi(s_t,a_t)=Q_\pi(s_{t+1},a_{t+1})+r_t
    • NN个episode后,更新目标模型Q^=Q\hat{Q}=Q

总结

Q-learning的基本思想,就是将TD应用在Q值函数上,然后引入了三个小方法来解决实际运行中出现的问题。
接下来讨论DQN。

本文地址:https://blog.csdn.net/qq_39160779/article/details/107323028

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网