5.Q-learning

目录

深度强化学习目录

简介

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

实现运用到的技术

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

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

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

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

1.Target Network

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

2.Exploration

Q-learning的行为是基于Q函数的: a = a r g max ⁡ a ∈ A Q ( s , a ) a=arg \max_{a\in A}Q(s,a) a=argaAmaxQ(s,a)

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

Epsilon Greedy

非常简单,设置一个参数 ε \varepsilon ε,每次采取行动前都取个随机数值,如果随机到数值小于 ε \varepsilon ε,那就随机行动;反之则采取最大Q值的那个行为。
a = { a r g max ⁡ a ∈ A Q ( s , a ) p r o b a b l i t y ≤ 1 − ε r a n d o m o t h e r w i s e a=\left\{ \begin{array}{rcl} & arg \max_{a\in A}Q(s,a) & {probablity \le 1-\varepsilon}\\ & random& {otherwise} \\ \end{array} \right. a={argmaxaAQ(s,a)randomprobablity1εotherwise

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

Boltzmann Exploration

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

3.Replay Buffer

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

伪代码步骤

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

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值