DQN

感慨一下,终于到DQN了,慢慢啃书看数学公式真让人难受,我也不知道我看懂没有,好像懂了,但是一合上书啥也不知道,薛定谔的学习。当我观测的时候我就坍塌成了我没懂0.0

相比之下我还是喜欢编代码跑跑gym里的小游戏,看看我训练的人工智障是否仍是个智障。好了,把这个基础知识搞了就去写个打砖块的人工智障吧!

传统的强化学习算法是表格形式存储状态价值函数或者状态-动作函数,但这样的方法很明显是受很大局限的。现实中的强化学习任务所面临的状态空间往往是连续的,存在无穷多个状态,在这种情况下,就不能再使用表格对价值函数进行存储。

价值函数近似利用函数直接拟合状态价值函数或动作价值函数,降低了对存储空间的要求,有效地解决了这个问题。

为了在连续的状态和动作空间中计算值函数$Q_{\pi}(s,a)$,我们可以用以个函数$Q_{\phi}(\vec s,\vec a)$来近似计算,成为价值函数近似。其中$\vec s,\vec a$分别是状态s和动作a的向量表示,函数$Q_{\phi}(\vec s,\vec a)$通常是一个参数为$\phi$的函数,比如神经网络,其输出为一个实数,我们将该神经网络称为Q网络

DQN是指基于深度学习的 Q 学习算法,主要结合了价值函数近似 与神经网络技术,并采用目标网络和经历回放的方法进行网络的训练。在 Q 学习中,我们使用表格来存 储每个状态 s 下采取动作 a 获得的奖励,即状态-动作值函数 Q(s, a)。然而,这种方法在状态量巨大甚至 是连续的任务中,会遇到维度灾难问题,往往是不可行的。因此,深度 Q 网络采用了价值函数近似的表示 方法。

状态价值函数

DQN是基于价值的算法,在基于价值的算法立马,我们学习的不是策略,而是评论员(状态价值函数或状态动作函数),其任务是评价现有的动作好还是不好。

有一种评论员就是状态价值函数$V_{\pi}$,它所评价的是在给定某一个状态的时候,如果接下来交互的演员的策略是 π,我们会得到多少奖励,这个奖励就是我们评价得出的值,所以评论员的输出值取决于状态和策略。在无穷多状态的情况下,$V_\pi(s)$是一个网络,因为对于一个网络来说,就算输入状态是从来都没有看到过的,它也可以想办法估测一个值。而训练这个网络就可以从采取蒙特卡洛方法或者时序差分方法,这个之前已经讲过,就不在此赘述。

42JBi.png

动作价值函数

还有另外一种评论员称为 Q 函数,状态价值函数的输入是一个状态,它 根据状态计算出这个状态以后的期望的累积奖励(expected accumulated reward)是多少。动作价值函数的输入是一个状态-动作对,其指在某一个状态采取某一个动作,假设我们都使用策略 π ,得到的累积奖励的期望值有多大。$Q_{\pi}(s,a)$

目标网络

我们都知道Q函数的更新公式为:
$$
Q_{\pi}(s_t,a_t)=r_t+Q_\pi(s_{t+1},\pi_{t+1})
$$
所以我们在学习的时候,Q函数输入$s_t,a_t$所得的输出,和输入$s_{t+1},\pi_{t+1}$所得的输出之间,我们希望它们的差值为$r_t$,但实际这样并不太好学习,因为$Q_\pi(s_t,a_t)$是网络的输出,$r_t+Q_\pi(s_{t+1},\pi_{t+1})$作为target,它的值是变动的。

所以在训练中,如下图所示,我们会把用于产生target的Q网络固定住,在做梯度下降时,只更新左边Q网络的参数,当更新到一定次数之后,再把左边的Q网络参数复制到右边,target目标网络就变了,然后再重新训练左边的Q网络,如此往复。

48KN4.png

探索

当我们使用 Q 函数的时候,策略完全取决于 Q 函数。给定某一个状态,我们就 穷举所有的动作,采取让 Q 值最大的动作,即
$$
a=arg\max_aQ(s,a)
$$
使用 Q 函数来决定动作与使用策略梯度不一样,策略梯度的输出是随机的,它会输出一个动作的分布,我 们根据这个动作的分布去采样,所以在策略梯度里面,我们每次采取的动作是不一样的,是有随机性的。 像 Q 函数中,如果我们采取的动作总是固定的,会遇到的问题就是这不是一个好的收集数据的方式。

解决这个问题可采用$\epsilon$-贪心算法,即:

4A9iv.png

通常在实现上 ε 会随着时间递减。在最开始的时候,因为不知道哪个动作是比较好的,所以我们会花比较大的力气探索。接下来,随着训练的次数越来越多,我们已经比较确定哪个 动作是比较好的。我们就会减少探索,会把 ε 的值变小,主要根据 Q 函数来决定动作,比较少随机决定动作。

也可以采用玻尔兹曼探索

我们假设对于任意的s,a,都有$Q(s,a)\geq 0$,因此a被选中的概率与$e^{Q(s,a)/T}$成正比,即:
$$
\pi(a\vert s)=\frac{e^{Q(s,a)/T}}{\sum_{a’\in A}e^{Q(s,a’)/T}}
$$
其中,T > 0 称为温度系数。如果 T 很大,所有动作几乎以等概率选择(探索);如果 T 很小,Q 值大的 动作更容易被选中(利用);如果 T 趋于 0,我们就只选择最优动作。

经验回放

经验回放会构建一个回放缓冲区 (replay buffer)回放缓冲区又被称为回放内存(replay memory)。我们把所有的数据放到一个数据缓冲区(buffer)里面,数据缓冲区里 面存储了很多数据。比如数据缓冲区可以存储 5 万笔数据,每一笔数据就是在某一个状态 st,采取某一个动作 at,得到了奖励 rt,进入状态 st+1。回放缓冲区里面的经验可能来自不同的策略,回放缓冲区只有在它装满的时候,才会把旧的数据丢掉。所以回放缓冲区里面其 实装了很多不同的策略的经验。

4A12i.png

有了回放缓冲区以后,我们怎么训练 Q 模型、怎么估 Q 函数呢?我们会迭代地训练 Q 函数,在每次迭代里面,从回放缓冲区中随机挑一个批量(batch)出来,即与一般的网络训练一样, 从训练集里面挑一个批量出来。我们采样该批量出来,我们根据这些经验去更新 Q 函 数。这与时序差分学习要有一个目标网络是一样的。我们采样一个批量的数据,得到一些经验,再去更新 Q 函数。

4Ab7v.png

如此一来该算法就变成了一个异策略的算法,因为我们用于学习Q网络的数据并不都来自于策略$\pi$与环境的交互,有些事过去的其他策略所留下的经验。这样有两个明显的好处:

  • 减少当前策略与环境的交互量以节约时间
  • 增加采用数据的多样性

DQN

4AZJJ.png