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

了解了以上术语后,我们来看Q-learning的基本步骤:
【李宏毅机器学习课程笔记】深度强化学习(三)——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

Tips for Q-Learning

  1. Target Network
    先上图解:
    【李宏毅机器学习课程笔记】深度强化学习(三)——Q-Learning
    解释:这里实际上是用到了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))中的参数用我们学习到的参数替换掉。

  2. 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,上图:
    【李宏毅机器学习课程笔记】深度强化学习(三)——Q-Learning
    解释:在每次进行训练时,对于某个特定的环境,我们会有 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效果的话可以降低底数的值啊)

  3. Replay Buffer
    老规矩还是先上图:
    【李宏毅机器学习课程笔记】深度强化学习(三)——Q-Learning
    解释:
    在每次使用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 π的参数学习也是有帮助的,至于原因在后面的文章中会提到。

Typical Q-Learning Algorithm

介绍了以上内容之后,来梳理一下Q-learning的一般步骤:
(老师PPT上把buffer写成butter了…)
【李宏毅机器学习课程笔记】深度强化学习(三)——Q-Learning

Q-Learning for Continous Action

相关文章: