欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

5.Q-learning

程序员文章站 2022-03-18 16:50:56
目录深度强化学习目录简介上篇文章里讲了MC算法和TD算法,不过用的是V值函数,这回我们学习Q函数。在贝尔曼方程那一篇文章里我们说过,Q函数可以表示成最优Bellman等式的形式,且最优的Q等价于最优的策略π⋆\pi^\starπ⋆,又策略π\piπ一定可以收敛到最优策略π′\pi'π′,Q-learning就是基于这些思想来实现的。实现运用到的技术前面讲到了,Q-learning实际上就是对Q值函数使用TD算法(至于为什么不用MC算法,我也不清楚,可能是因为方差太大了吧)。TD算法的核心只有一个公...

目录

深度强化学习目录

简介

上篇文章里讲了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

5.Q-learning
TD算法,训练一个模型当做Q函数,采样rtr_t。但是在实际运行过程中,会发现如果同时update左边的Q model和右边的Q model,训练会变得不太稳定。也就是说,不能让同一个模型同时输出两次Q值。因此,我们产生了Target Network的想法,即固定右边的模型参数不变,转而只更新左边的模型。
5.Q-learning
当然了,为了这两个模型在理论上用的是同一个策略π\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。
5.Q-learning

伪代码步骤

  • 初始化训练模型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

推荐阅读