【李宏毅机器学习课程笔记】深度强化学习(三)——Q-Learning

本文深入探讨了Q-Learning,一种强化学习中的Value-Based方法,介绍了Q-value函数、Target Network、Exploration、Replay Buffer等关键概念,并讨论了Double DQN、Dueling DQN、Priority Replay等优化策略。此外,还讲解了如何应对连续动作空间的挑战以及Distributional Q-function。最后,总结了Q-Learning的典型算法流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Q-Learning简介

Q-Learning是强化学习中一种Value-Based的方法,它所学习的不是一个Policy,而是一个Critic,Critic并不直接采取行为,而是评价当前的行为是好的或者不好的;

相关术语:

  1. State value function V π ( s ) {V^\pi }(s) Vπ(s)
    这个function的输入是一个环境s,输出是当前actor π \pi π 在此环境下进行互动直到当前Episode结束时获得的reward的期望值(下文称为cumulated reward)。

    Q:如何衡量 V π ( s ) {V^\pi }(s) Vπ(s)
    A:两种方法。

    一种被称为Monte-Carlo based approach(MC),即让actor和环境进行互动,critic在一旁观察,每看到一个状态,就计算当前状态的cumulated reward,期望该cumulated reward等于我们实际在Episode结束时获得的reward值。但由于我们不可能将所有的state都统统扫过,因而可以将 V π ( s ) {V^\pi }(s) Vπ(s)理解为一个neutral network。

    另一种被称为Temporal-difference approach(TD),在MC方法里每次看到一个状态都要计算cumulated reward,而TD方法则利用了这样的一个原理: V π ( s t ) = V π ( s t + 1 ) + r t {V^\pi }({s_t}) = {V^\pi }({s_{t + 1}}) + {r_t} Vπ(st)=Vπ(st+1)+rt即将状态 s t {s_t} st s t + 1 {s_{t+1}} st+1两个自变量都置入 V π ( s ) {V^\pi }(s) Vπ(s)这个neutral nrtwork里,然后让它们的结果作差,期望差值接近我们实际获得的 r t {r_t} rt

    两种方法的区别:MC的方差会很大(由于游戏的随机性,从同一个初始状态开始运行,最后Episode结束时获得的Reward值每次都是不一样的;但TD方法由于有差值的存在,方差就显得没有那么大了,但由于需要多计算一个state value function,准确度上会稍差。

  2. State-action value function Q π ( s , a ) {Q^\pi }(s,a) Qπ(s,a)
    这个function的输入是一个环境s和一个动作a,输出是在环境s下采取了动作a之后当前actor π \pi π 的cumulated reward的期望值。(注意,它和state value function的不同之处在于这里的动作a是强制执行的,即 π \pi π本身在环境s下不一定会采取动作a)

    这个function的写法有两种,如下图所示:(若可采取的动作是不可穷举的话,则只能采用左边的写法)
    在这里插入图片描述

了解了以上术语后,我们来看Q-learning的基本思想:
在这里插入图片描述

定义一个初始的actor π \pi π ,让它去和环境互动,同时计算 Q π ( s , a ) {Q^\pi }(s,a) Qπ(s,a),然后找到一个更好的actor π ′ \pi' π (这个找的过程下文会详细解释),令 π \pi π = π ′ \pi' π,重新进行这个过程。
那么怎么找到这个更好的actor?为解决这个问题,首先我们需要定义什么叫做“更好的actor”

所谓更好的actor,就是对于任意的环境s,都有 V π ( s ) ≤ V π ′ ( s ) {V^\pi }(s) \le {V^{{\pi '}}}(s) Vπ(s)Vπ(s)
事实上, π ′ \pi' π满足这样一个条件: π ′ ( s ) = a r g max ⁡ a Q π ( s , a ) {\pi'}(s) = arg\mathop {\max }\limits_a {Q^\pi }({\rm{s,a}}) π(s)=argamaxQπ(s,a)
满足这个条件的 π ′ \pi' π 一定会比 π \pi π 更好,下图证明了这个结论:
在这里插入图片描述

使用Q-Learning时的一些细节

Target Network

先上图解:
在这里插入图片描述
解释:这里实际上是用到了TD方法的思想,只是把 V π ( s t ) = V π ( s t + 1 ) + r t {V^\pi }({s_t}) = {V^\pi }({s_{t + 1}}) + {r_t} Vπ(st)=Vπ(st+1)+rt换成了 Q π ( s t , a t ) = Q π ( s t + 1 , π ( s t + 1 ) ) + r t {Q^\pi }({s_t},{a_t}) = {Q^\pi}({s_{t+1}},\pi(s_{t+1}))+{r_t} Qπ(st,at)=Qπ(st+1,π(st+1))+rt
但是这样直接做学习效果一般会很差,这是因为同步更新了两个model的参数之后,我们的目标函数 Q π ( s t + 1 , π ( s t + 1 ) ) {Q^\pi}({s_{t+1}},\pi(s_{t+1})) Qπ(st+1,π(st+1))也不是固定的了,会给训练参数带来很多困难,所以一般的做法是将 Q π ( s t + 1 , π ( s t + 1 ) ) {Q^\pi}({s_{t+1}},\pi(s_{t+1})) Qπ(st+1,π(st+1))的值固定下来,即只更新 Q π ( s t , a t ) {Q^\pi }({s_t},{a_t}) Qπ(st,at)中的参数,更新若干次之后再将 Q π ( s t + 1 , π ( s t + 1 ) ) {Q^\pi}({s_{t+1}},\pi(s_{t+1})) Qπ(st+1,π(st+1))中的参数用我们学习到的参数替换掉。

Exploration

在上文提到的Q-learning步骤中,我们说 π ′ \pi' π满足这样一个条件: π ′ ( s ) = a r g max ⁡ a Q π ( s , a ) {\pi'}(s) = arg\mathop {\max }\limits_a {Q^\pi }({\rm{s,a}}) π(s)=argamaxQπ(s,a)
这样找到的 π ′ \pi' π 一定会比 π \pi π 更好,但这样做也有一定的局限性,那就是你计算 a r g max ⁡ a Q π ( s , a ) arg\mathop {\max }\limits_a {Q^\pi }({\rm{s,a}}) argamaxQπ(s,a)所用到的a都是我们之前在其他状态下执行过的动作,我们并不知道执行其他动作或者在某些情况下执行之前reward没有那么高的动作会不会得到更高的reward。
(帮助理解:这就好比你去了一家餐厅点了红烧牛柳和椒麻鸡两道菜,尝过之后发现红烧牛柳要比椒麻鸡好吃得多,那么之后你再去这家餐厅就只会点红烧牛柳了,即使未来的时间内可能发生了某些你不知道的事情,比如这家餐厅换了一位做椒麻鸡更好吃的厨师等等)

为了避免这种局限性,我们采用的一种方法叫Epsilon Greedy,上图:
在这里插入图片描述
解释:在每次进行训练时,对于某个特定的环境,我们会有 1 − ε {1 - \varepsilon} 1ε的概率采取我们当前学习到的使 Q π ( s , a ) {Q^\pi }({\rm{s,a}}) Qπ(s,a)最大的动作a,但也会有 ε \varepsilon ε的概率随机采取其他任意一项动作。(当然,随着训练次数的增多,慢慢地我们将使 Q π ( s , a ) {Q^\pi }({\rm{s,a}}) Qπ(s,a)最大的动作a确定下来之后,这个 ε \varepsilon ε的值也会逐渐降低。)

另外一种方法叫做Boltzmann Exploration,它使用如下的式子来决定采用哪个动作: P ( a ∣ s ) = exp ⁡ ( Q ( s , a ) ) ∑ a exp ⁡ ( Q ( s , a ) ) P(a|s) = {{\exp (Q(s,a))} \over {\sum\nolimits_a {\exp (Q(s,a))} }} P(as)=aexp(Q(s,a))exp(Q(s,a))
即先将各个动作获得的reward(因为有正有负)取绝对值,再除以所有的动作获得的reward绝对值之和,以此作为采取该动作的概率,根据这个概率分布来决定要采取哪一个动作。
(个人想法:这里为什么要取绝对值而不使用 e Q ( s , a ) {e^{Q(s,a)}} eQ(s,a)呢…使用绝对值的话假设动作 a 1 a_1 a1的reward期望为1,动作 a 2 a_2 a2的reward期望为-100的话,那岂不是要训练很久才知道 a 1 a_1 a1才是更好的动作吗…不太明白。如果担心指数爆炸级增长会导致没有好的exploration效果的话可以降低底数的值啊)

Replay Buffer

老规矩还是先上图:
在这里插入图片描述
解释:
在每次使用actor π \pi π和环境进行一次互动之后,将这次互动中的一些细节(互动前的环境 s t s_t st、采用的动作 a t a_t at、得到的reward r t r_t rt、互动后转换的环境 s t + 1 s_{t+1} st+1)当作一条experience记录到buffer中(可以将其理解为一个“缓存”的概念,当然,buffer中experience的数量是有限的,当buffer满了时就删去最久远的experience),这样在学习 Q π ( s , a ) {Q^\pi }({\rm{s,a}}) Qπ(s,a)时就可以每次从buffer中拿出一些experience进行学习来更新参数。
这里其实借鉴了一些off-policy的思想(off-policy的定义在上篇博客中提到过),因为buffer中的experience并不都是actor π \pi π 与环境进行互动的结果,有一部分是其他actor的互动。但这些experience对actor π \pi π的参数学习也是有帮助的,至于原因在后面的文章中会提到。

Tips of Q-Learning(Q-Learning的变式)

本节介绍的大多是用于优化Q-Learning的训练效果的Q-Learning的一些变形。

Double DQN(DDQN)

使用Double DQN的意义在于,实际使用DQN时Q-value函数经常是被高估的。

原因在于:根据上一节中对Target Network的介绍,我们知道Q-Learning实际上进行运作的时候,我们的目标是让 Q ( s t , a t ) Q({s_t},{a_t}) Q(st,at) r t + max ⁡ a Q ( s t + 1 , a ) {r_t}+{\mathop {\max }\limits_a Q({s_{t + 1}},a)} rt+amaxQ(st+1,a)越接近越好。但实际上 r t + max ⁡ a Q ( s t + 1 , a ) {r_t}+{\mathop {\max }\limits_a Q({s_{t + 1}},a)} rt+amaxQ(st+1,a)的值是很容易被高估的。从字面上理解, max ⁡ a Q ( s t + 1 , a ) {\mathop {\max }\limits_a Q({s_{t + 1}},a)} amaxQ(st+1,a)指的是在action set中选择那个使Q-value值最大的action。但Q-function毕竟是个network,难免有误差,假设有一个action的Q-value值被高估了,这个action就会被当作是 max ⁡ a Q ( s t + 1 , a ) {\mathop {\max }\limits_a Q({s_{t + 1}},a)} amaxQ(st+1,a)的解参与到target的计算中。

如何解决这个问题?DDQN的做法是让两个network分别完成选择action和计算对应的Q-value值两项工作,即原来DQN的计算方式是:
在这里插入图片描述
而现在的计算方式是:
在这里插入图片描述
这样做的好处是,如果选择action的network Q Q Q 高估了Q-value的值,只要计算Q-value值的network Q ′ Q' Q 没有高估,那最后的结果就还是正常的;反之,如果计算Q-value值的network Q ′ Q' Q 高估了,只要选择action的network Q Q Q 没有高估,那这个action也不会被选择出来。一定程度上避免了target的高估现象。

实际上,根据上一节对Target Network的介绍,我们知道在Q-Learning中恰好就是有两个Q-network的,故我们实际操作时,一般用我们会更新参数的Q-network来选择action,而用Target network Q ′ Q' Q (即fixed value)来计算Q-value值。

Dueling DQN

相比于DQN,Dueling DQN唯一的不同就是更改了network的架构。原本的Q-network输出为 Q ( s , a ) {Q}({\rm{s,a}}) Q(s,a),而Dueling DQN的输出有两个:第一部分是仅仅与状态 s s s有关,与具体要采用的动作 a a a无关,这部分我们叫做价值函数部分,记做 V ( s ) V(s) V(s),第二部分同时与状态 s s s和动作 a a a有关,这部分叫做优势函数(Advantage Function)部分,记为 A ( s , a ) A(s,a) A(s,a),那么最终我们的Q-value可以重新表示为:
Q ( s , a ) = V ( s ) + A ( s , a ) Q(s,a)=V(s)+A(s,a) Q(s,a)=V(s)+A(s,a)

问题来了,这样做的好处是什么?
我们在这里举个例子:

在这里插入图片描述
如图所示,假设state和action都是离散的,第一个表格为在该状态下采取各action的Q-value,第二个表格是各个状态的价值函数,第三个表格为优势函数(或者说就是 r t r_t rt),假设某一天我通过sample发现第一个表格中的某些地方需要修改为如下的值:
在这里插入图片描述
因为我们不能直接变更Q-value的值(只能变更 V ( s ) V(s) V(s) A ( s , a ) A(s,a) A(s,a)),这样你在训练该网络的时候就可能会选择不更改 A ( s , a ) A(s,a) A(s,a)的值,只更改 V ( s ) V(s) V(s)的值:
在这里插入图片描述
这样的好处是你可以不用sample到所有的state-action,就可以以比较有效率的方式去估算所有的Q-value。
在这里插入图片描述
当然,有些时候训练网络时也会做出不管 V ( s ) V(s) V(s)的值,只修改 A ( s , a ) A(s,a) A(s,a)的情况(甚至有些情况下所有的 V ( s ) V(s) V(s)一律为0,即 Q ( s , a ) = A ( s , a ) Q(s,a)=A(s,a) Q(s,a)=A(s,a)),为了防止这些情况发生,有时我们也会对 A ( s , a ) A(s,a) A(s,a)做出一定的约束(constraints),如 ∑ a A ( s , a ) = 0 \sum\nolimits_a {A(s,a)} = 0 aA(s,a)=0等,让network倾向于改变 V ( s ) V(s) V(s)来解决问题。

实际操作时,我们一般令 A ( s , a ) A(s,a) A(s,a) V ( s ) V(s) V(s)相加前先做一个normalization,令其满足我们制定的constraints。

Priortized Replay

还记得上一节有关Q-Learning使用细节当中介绍的Replay Buffer吗?当时在介绍的时候我们说我们每次从Experience Buffer中uniform地拿出每一笔data,但实际上有一些数据是我们需要格外注意的,就是那些与目前得到的model契合效果不是很好的data,换句话说,这些data使 Q ( s t , a t ) Q({s_t},{a_t}) Q(st,at) r t + max ⁡ a Q ( s t + 1 , a ) {r_t}+{\mathop {\max }\limits_a Q({s_{t + 1}},a)} rt+amaxQ(st+1,a)的差距比较大。那既然这些data的训练效果不好,就应该给这些data更大的几率被sample到。

Multi-steps

仍然是基于Replay Buffer,之前每次我们从Experience Buffer中拿出的数据是这样的格式: ( s t , a t , r t , s t + 1 ) ({s_t},{a_t},{r_t},{s_{t+1}}) (st,at,rt,st+1)现在我们可以存入多个step的data到buffer中,即: ( s t , a t , r t , ⋅ ⋅ ⋅ , s t + N , a t + N , r t + N , s t + N + 1 ) ({s_t},{a_t},{r_t},···,{s_{t+N}},{a_{t+N}},{r_{t+N}},{s_{t+N+1}}) (st,at,rt,,st+N,at+N,rt+N,st+N+1)

然后在做Q-network的学习过程就变成了这样:
在这里插入图片描述
这样做实际上是结合了我们第一节中提到过的MC和TD两种方法,因而MC和TD的利弊都会在其中有所体现:因为我们经历了若干步之后才会去计算Q-value,那么它的误差就会比较小;但由于我们把若干个 r t r_t rt都加了起来,它们的variance积累起来就会比较大,因而我们需要仔细调整N的值来在这两个之间取得一个平衡。

Noisy Net

基于上一节Q-Learning相关细节中提到的Exploration机制,在那里我们介绍了Epsilon-Greedy算法,它相当于是在action的space上加入了噪声(Noise on action)。

但是也有更好的方法存在,就是我们这里的Noisy Net,顾名思义即网络上加噪声,更确切的说是参数上加噪声(Noisy on parameters)。具体的操作是在每个Episode开始之前,在Q-network的每个参数上加噪声(如高斯噪声等),在整个Episode的进行过程中不改变noise,直到该Episode结束时才添加新的noise。

这样做和Noise on action是有很大区别的,以Epsilon Greedy为例,因为它是给出了一个采取action的概率分布,这意味着在不同的Episode当中即使是同样的network遇到完全一样的state,它采取的action也有可能是不一样的,这并不符合我们实际工作中希望看到的它的表现(在真实世界里,我们当然希望同一个network在遇到相同的状态时总是能给出相同的action)。而Noise on parameters就不会出现这样的情况,我们将它的这种特性称为State-dependent Exploration。

Distributional Q-function

在了解这个变形之前,请允许我重新介绍一下State-action value function Q π ( s , a ) {Q^\pi }(s,a) Qπ(s,a):它表示在环境s下强制采取了动作a之后当前actor π \pi π 的cumulated reward的期望值
注意这里的“期望值”,在环境s下强制采取了动作a之后,当前actor π \pi π 的cumulated reward其实本应该是一个Distribution(概率分布),我们对它取mean值才得到了这个期望值。
有趣的是,不同的Distribution有时得到的期望值是相同的,即:
在这里插入图片描述

这说明,有些时候只凭Q-value一个scalar是没法model这些distribution的,这就是Distributional Q-function想要完成的工作。下图展示了它与一般的DQN之间的区别。
(注:右图中每一种颜色的条形图代表在相同状态下采取某一种action得到的cumulated reward的Distribution)
在这里插入图片描述
Distribution Q-function的应用有很多。比如当我们得到期望值最大的那个action,其distribution表现出明显的不稳定时,我们可以退而求其次选择期望值相差不大但明显较为稳定的action来规避风险。

Rainbow

Rainbow,实际上就是将前面介绍的所有方法(加上A3C,这个方法后面的课程中会讲到)混合使用。

Typical Q-Learning Algorithm

介绍了以上内容之后,来梳理一下Q-learning的详细步骤:
(老师PPT上把buffer写成butter了…)
在这里插入图片描述

Q-Learning for Continous Action

Q-Learning有一个很大的缺点,它处理continous的action是非常困难的(continous action即那些连续性强的动作,如自驾车的方向盘转动时的角度就是一个continous action),我们一般用vector来表示continous action。
a = a r g max ⁡ a Q ( s , a ) a = arg\mathop {\max }\limits_a {Q}({\rm{s,a}}) a=argamaxQ(s,a)
当上式中的a是离散的时候,这就意味着a由有限个值构成其取值范围,我们可以将所有可取到的a带入到式子中计算Q-value,取最大的那个action作为这个方程的解。但当a是continous的时候,我们就不能采用这种穷举的方法。
解决这个问题的方式有很多种:

  • Sample若干个范围内离散的值,看哪一个action使得Q-value的值最大,这种方法得到的解可能不是很精确。
  • Gradient Ascent(梯度上升),当然这种方法可能会遇到Local Maximize的问题,且运算量比较大
  • 另设计一个network来简化找到最优解的过程,图解:
    在这里插入图片描述
    需要注意的是,这里network的output中,矩阵 Σ ( s ) \Sigma (s) Σ(s) 一定是正定矩阵,因而 ( a − μ ( s ) ) T Σ ( s ) ( a − μ ( s ) ) {(a - \mu (s))^T}\Sigma (s)(a - \mu (s)) (aμ(s))TΣ(s)(aμ(s))
    一定是非负数,为了让 Q ( s , a ) Q(s,a) Q(s,a)最大,易解得 a = μ ( s ) a=\mu(s) a=μ(s)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值