这篇笔记主要提及下面四篇关于DQN的著名论文的前两篇:
[1] Mnih, V., Kavukcuoglu, K., Silver, D., Graves, A., Antonoglou, I., Wierstra, D., & Riedmiller, M. (2013). Playing Atari with Deep Reinforcement Learning. 1–9. Retrieved from http://arxiv.org/abs/1312.5602
[2] Mnih, V., Kavukcuoglu, K., Silver, D., Rusu, A. A., Veness, J., Bellemare, M. G., … Hassabis, D. (2015). Human-level control through deep reinforcement learning. Nature, 518(7540), 529–533. https://doi.org/10.1038/nature14236
[3] Van Hasselt, H., Guez, A., & Silver, D. (2016). Deep reinforcement learning with double Q-Learning. 30th AAAI Conference on Artificial Intelligence, AAAI 2016, 2094–2100.
[4] Wang, Z., Schaul, T., Hessel, M., Van Hasselt, H., Lanctot, M., & De Frcitas, N. (2016). Dueling Network Architectures for Deep Reinforcement Learning. 33rd International Conference on Machine Learning, ICML 2016, 4(9), 2939–2947.
DQN(Deep Q-Learning)算是 DRL 的开山之作,算是采用了 Value function approximation 的 critic-only 类算法,实现了从感知到动作的端对端学习法,由 DeepMind 在 NIPS 2013 上提出[1],后在 Nature 2015 上提出改进版本[2]。Double-DQN[3] 和 Dualing-DQN[4] 都是 DQN 的改进版本,前者对训练算法进行了改进,后者对模型结构进行了改进。
一、 DQN:成功将DL和RL结合 [1]
1. DQN 简述
2013年这篇论文第一个提出利用深层强化学习模型从高维度传感器信号中学习控制策略。模型由卷积神经网络构成,通过本文提出的方法(Q-learning的变种),实现从原始像素输入到值函数输出。
1.1 RL 结合深度学习的问题
在深度学习盛行之前,RL需要依靠手工设计特征,并组合成值函数或策略函数。RL性能好坏很大部分取决于特征的质量。深度学习盛行之后,可以直接中原始的计算机视觉和语音信号中自动提取特征。深度学习的方式是利用一堆神经网络(例如卷积神经网络,多层感知机,循环神经网络,有限玻尔兹曼机等)进行深层联合,并采用监督或非监督模型进行学习。自然而然考虑是否能将深度学习和强化学习进行结合,利用深度学习进行特征提取,而不必手工设计特征。
但是将深度学习与强化学习结合并非易事,起码存在三个关键问题:
采用深度学习的方式通常需要很多带标签的训练数据,但是RL每次与环境交互只能获得一个奖励值,与深度学习的训练集相比,奖励值十分稀疏,并且还会带有噪声以及延迟。
深度学习算法假设数据集样本是独立的,但是在强化学习中,状态序列具有很大的关联度,状态之间并不能认为是服从独立分布的。
另外RL当学习到新的动作策略时,状态分布和动作分布都会发生改变,然而深度学习是假定数据具有固定的分布。
1.2 本篇论文的工作
本篇论文采用卷积神经网络来克服深度学习和RL结合的问题,并直接从视觉信号(像素)学习到成功的控制策略。提出Q-learning的改进版本对网络参数进行训练。同时为了解决数据关联度高,训练过程中数据分布不稳定的问题,本文采用了经验回放的机制,,每次随机抽取先前的一小部分transition进行训练,这样可以平滑训练集的分布。
2. 相关知识
动作空间是离散的,表示为 $\mathcal{A} = {1, \dots, K}$。 在每个时间步长,agent 会从 $\mathcal{A}$ 中挑选一个动作 $a_t$。
本文认为环境是部分可观察的,因此只用当前的观测值 $x_t$ 来表示当前环境的状态是不够的。因此将 $t$ 时刻的状态 $s_t$ 定义为动作值和观测值的序列,也就是 $s_t = x_1, a_1, x_2, \cdots, a_{t-1}, x_t$。 (这里描述的环境是动态的,部分感知的,因此状态的描述需要依赖于动作值和观察值的序列,但是如果环境是完全感知的,静态的,一般都是将 $x_t$ 等同于 $s_t$。DDPG的论文就是这么做的)
定义 $t$ 时刻的折扣奖励 $R_t = \sum_{t’=t}^T \gamma^{t’-t}r_{t’}$,其中 $T$ 是结束的时刻,$\gamma$ 是折扣因子。
定义最优动作-值函数 $Q^*(s,a) = max_\pi \mathbb{E} [R_t|s = s_t, a = a_t, \pi]$,$\pi$ 是动作分布(动作空间的各个动作被选择的概率)。最优动作-值函数满足贝尔曼方程,也就是可以写成:
上述公式中的 $r$ 和 $s’$ 由 $s$,$a$ 决定。通过上述的贝尔曼方程形式的动作-值函数,可以得到一种求解最优动作-值函数的迭代方法:
其中 $i$ 是迭代次数,当 $i \rightarrow \infty$时,$Q_i \rightarrow Q^*$。
但是实际上这种方法非常有限,对于状态空间庞大的环境,根本不适用。因为这种迭代形式的方法需要为每一个 $\{s, a\}$ 序列都求解一个动作-值,无法对庞大的状态空间进行泛化。
为了应对庞大的状态空间,过去的RL方法通常用线性函数(有时候也用非线性函数)来对动作-值函数进行逼近,表示为 $Q(s,a;\theta) \approx Q^*(s,a)$。而本文就是将线性函数逼近的方法改成神经网络逼近,该网络称之为 Q 网络。
Q 网络的参数更新通过最小化损失函数,其定义为 Q 网络输出的 Q 值和目标 Q 值的均方误差函数:
其中 $\rho(s, a)$ 称之为行为分布,也就是 $s$ 和 $a$ 序列的概率分布。 $y_t$ 是目标 Q 值,$\theta_{i-1}$ 在迭代过程中是保持不变的。需要注意的是,和监督学习不同,监督学习的目标通常是固定的,并且与网络的参数无关。然而此处目标的计算也依赖于网络的参数。
对均方误差损失函数计算 $\theta_i$ 的梯度:
在实际计算中,并不会计算梯度的完整期望,一般为了简便采用SGD方法来最小化上述损失函数。也就是,在每个时间不长,只选择一个样本来计算损失函数的梯度,代替损失函数梯度的期望值,这种方法就是我们熟悉的 Q-learning 方法。
Q-learning 方法是 model-free 和 off-policy 类型的方法。 model-free 是指不需要对环境进行建模,而是通过从环境中收集样本进行学习。另外,Q-learning 的目标策略和行动策略不是同一种策略,这种方式也称为 off-policy。目标策略采用的是贪婪策略,即 $a = max_a Q(s,a;\theta)$,行动策略采用的是 $\epsilon$ -贪婪策略,有 $1-\epsilon$ 的概率选择贪婪策略,有 $\epsilon$ 的概率选择随机策略。
在深度学习兴起之前,人们普遍认为将 model-free 强化学习算法和非线性函数逼近,或者 off-policy 结合的方法都可能导致 Q 网络发散。所以传统的强化学习一般都采用线性函数逼近动作-值函数。近年来,由于深度学习的兴起,越来越多研究采用深度学习方法与强化学习方法结合。有一篇工作和本文提出的 DQN 方法比较像,称之为 neural fitted Q-learning(NFQ)。不过有两点主要区别:
NFQ 采用批梯度下降方法最小化损失函数,DQN 采用随机梯度下降方法,相对来说,随机梯度下降方法的计算代价更小。
NFQ 采用深层自动编码器对视觉输入信号进行特征提取,利用非监督方法训练得到低维度的状态表示。然后再将低维度的状态表示应用 NFQ 学习控制策略(相当于将两种网络组合到一起,两种网络是单独训练的)。但是 DQN 直接应用视觉输入信号,不做任何处理,最终会学习到和动作-值显著关联的特征,也就是学习到的特征会根据获取到的动作-值而变化(相当于特征提取网络嵌入到 Q 网络,它们是一起训练的)。虽然文中是说不做任何处理,但是实际上还是对视觉信号做了灰度化以及下采样的预处理的,只不过输入依然是像素点而已。
3. 算法模型
3.1 DQN 的关键点
DQN 模型的目标是将强化学习和深层神经网络结合起来,只需要输入原始 RGB 图像并通过 SGD 对样本进行训练便可以输出最优 Q 网络。
DQN 模型中最重要的一个技巧是采用了经验回放机制。在每个时间步长,都会将经验 $e_t = (s_t, a_t, r_t, s_{t+1})$ 存储在数据集 $\mathcal{D} = \{e_1, e_2, \dots, e_N\}$ 中(其实终止标志 $done$ 也要存进去,表示当前状态是否还有后继状态),并且会保留许多 episode 的经验,即新的 episode 开启时,经验回放池 $\mathcal{D}$ 不会重置。
DQN 模型中采用 off-policy,与Q-learning是一样的,目标策略采用贪婪策略,行动策略采用 $\epsilon$ -贪婪策略。
因为从经验回放池中抽取的历史经验具有不一样的长度(因为状态实际上是一个动作-观测值序列),因此定义函数 $\phi$ 来将长度不一致的历史经验输出为固定长度的历史经验表示。函数 $\phi$ 的具体定义参考3.3节。
算法伪代码如下所示:
等式(3)就是上面的均方误差损失函数:
因为样本是从经验回放池 $\mathcal{D}$ 中均匀采样,因此写成下面这种形式会更清晰一些:
$U(\mathcal{D})$ 表示经验回放池 $\mathcal{D}$ 中样本的均匀分布。
3.2 DQN 的优点
DQN 与传统的在线 Q-learning相比,有以下一些优点:
每个时间步长的经验都有可能用于未来很多次参数更新过程,因此提高了数据的利用效率。
比起 Q-learning 直接用连续的样本学习,DQN 采用经验回放池的机制打破了数据间的关联性,降低了每次更新的方差。
通过使用经验重放,对行为分布的许多先前状态进行平均,平滑了训练样本数据分布,避免了参数的振荡或发散。另外 DQN 必须采用 off-policy,因为当前参数和生成样本时的参数已经不同,而使用旧参数生成的动作来采样更新当前参数,很容易陷入局部最优点或者震荡。
4. 工程上的设置
4.1 预处理函数 $\phi$ 的定义
将原本 210 * 160 像素,128 种颜色的图像下采样为 110 * 84 像素的灰度图像。
然后裁剪 84 * 84 像素的图像区域,主要包含 agent 正在运作的相关区域。
最后 $\phi$ 将裁剪后的历史状态最后 4 帧图像堆叠成一个向量,输入到 Q 网络中。
4.2 网络结构
第一层隐藏层采用 16 个 8 * 8 卷积核,步长为 4。采用非线性激活函数。
第二层隐藏层采用 32 个 4 * 4 卷积核,步长为 2。采用非线性激活函数。
最后一层隐藏层采用全连接层,并输出 256 个非线性激活函数的值。
输出层采用全连接线性的方式,并为每个动作输出一个 Q 值。
非线性激活函数第二篇论文中有提及,应该是 $max(0, x)$。
4.3 其他设置
由于每个游戏环境的 reward 范围不同,因此论文将正的 reward 限制为1,负的 reward 限制为-1,reward 值为0时保持不变。
采用 RMSProp 优化算法,mini-batch 的大小是32。$\epsilon$ -贪婪算法中的超参数 $\epsilon$ 在前面一百万时间步长中从1 退火到 0.1,最后保持不变。
训练一千万时间步长,经验回放池中存储最近一百万个帧。
游戏画面每隔 $k$ 帧,agent 就会选择一个新的动作。因为游戏仿真器的运算速度大于 DQN 模型计算动作的速度,为了防止画面卡顿,故此采用这样一个跳帧的方法。 $k$ 一般取值为4。
性能的度量标准采用的是预测的动作-价值函数 Q,而不是总的奖励值。
对于学习后的模型,选择动作还是采用 $\epsilon$ -贪婪策略,其中 $\epsilon$ 取值0.05。
5. 可以提升的地方
经验回放池只能存储最近的 $N$ 条经验,采样用的是均匀分布。但是一种更合理的方式应该是给这些经验值分配不同的重要性权重,从而将新的经验代替那些不重要的经验。
二、 Nature DQN:独立目标函数 [2]
1. 使用深层网络描述 Q 函数的问题
已经有相关研究指出使用非线性函数逼近器对动作-值函数(Q 函数)进行逼近存在发散问题。这种不稳定来源于以下一些原因:
用于训练的状态是一个序列,该序列中的前后的状态高度相关。
Q 网络的参数有微小更新就会导致策略发生巨大变化,并因此导致训练样本分布的巨大变化。
目标函数中使用的 Q 函数(目标 Q 函数)和待优化 Q 函数(在线 Q 函数或估计 Q 函数)之间存在参数联系,每次更新的目标都是固定上次更新的参数得来,优化目标跟着优化过程一直在变。
第一篇论文解决了前两个问题,但第三个问题还是存在的。目标 Q 函数参数的计算仍然依赖于估计 Q 函数的参数。
2. 论文中提出的解决方法
在第一篇 DQN 论文中,通过使用经验回放有效的解决了前两个问题,通过存储并随机采样经验来打破了样本之间的相关性,同时平滑了训练样本数据分布。
第三个问题则是这次改进完成的。通过让在线 Q 函数参数更新一定周期之后再去更新目标 Q 函数的参数,从而降低了目标 Q 函数与在线 Q 函数之间的相关性。
迭代更新 i 次后的损失函数表示如下:
对比上篇论文3.1节的公式,可以发现目标 Q 函数中的参数是 $\theta^-$,而不是$\theta_{i-1}$。$\theta^-$ 是每经过 C 个步长从在线 Q 函数中复制而来,然后保留不变。在目标 Q 网络参数更新和在线 Q 网络参数更新之间增加一个时延可以减缓参数更新的分散和抖动。
最后本篇论文中还有一个小改进:进行误差裁剪。将上述损失函数中的 $r+\gamma Q(s,a;\theta^- - Q(s,a;\theta_i))$ 裁剪到范围(-1, 1),这可以提高算法的稳定性。
本篇论文的伪代码如下:
可以发现比上篇论文的伪代码多了独立目标 Q 网络的参数 $\theta^-$。另外奖励裁剪和误差裁剪并没有体现在伪代码中,但实际应用时是用到的。
3. 工程上的设置
3.1 预处理
对每一帧进行编码时,取当前帧和前一帧每个像素颜色值的最大值。
将 RGB 帧转换为灰度帧,并裁剪大小为84 * 84。
预处理函数 $\phi$ 将每四个邻近帧作为状态输入到 Q 网络。
3.2 网络结构
不像以前一些方法,采用状态-动作对作为输入。DQN 的 Q 网络将状态表示作为输入,然后为每个动作输出一个 Q 值。
输入层是经过预处理和函数 $\phi$ 映射的 84 * 84 * 4 的灰度像素值
第一层隐藏层采用32个8 * 8,步长为4的卷积核,采用非线性激活函数(可能是 $\max(0,x)$)。
第二层隐藏层采用64个4 * 4,步长为2的卷积核,采用非线性激活函数。
第三层隐藏层采用64个3 * 3,步长为1的卷积核,采用非线性激活函数。
第四层隐藏层采用全连接层,输出为512维向量,采用非线性激活函数。
输出层是一个全连接层,对每个动作值对应一个输出。
这篇 DQN 论文相对于第一篇的网络结构更加复杂和庞大,隐藏层多了一层。
3.3 超参数的选取
所有超参数的选取并非通过系统的搜索而得到,只是在一些游戏上做非正式的搜索得到的。因为超参数的选取十分重要,因此放一下论文中的截图,以备之后参考:
3.4 其他设置
奖励裁剪、优化算法、跳帧数与第一篇 DQN 论文是一样的。
3.5 评估过程的设置
每个游戏玩30次,采用 $\epsilon$ -贪婪策略,其中$\epsilon=0.05$。
4. DQN 学习到的特征表示
DQN 可以将视觉上相似的画面表示成邻近的特征,并且还可以将奖励相似但视觉上不相似的画面也表示为邻近的特征,这说明 DQN 学习到的特征能够很好地预测 Q 值。
上图是采用 t-SNE 方法绘制的最后一层隐藏层输出的状态特征分布图。颜色越红,表示动作-值越大。左下方,右上方和中下方三组图,每组里面的图像从视觉上看是相似的,经过 DQN 输出的特征表示也是邻近的。而左上方,中上方和右下方三组图,虽然每组里面的图像从视觉上看不相似,但是它们的动作-值是相似的,因此经过 DQN 输出的特征表示也是邻近的。
5. DQN 的核心点
这篇论文中指出 DQN 的核心之处有三点:
使用了经验回放池
使用了独立的目标 Q 函数
深度卷积网络的设计
6. DQN 目前不能解决的问题
long-term credit assignment 问题,也就是无法处理需要长远规划的策略。如果决策需要考虑的时间维度太长,DQN 可能无法学习出比较合适的策略。
7. DQN 的神经生物学基础
DQN 是端到端强化学习方法,特征的学习和策略的学习并不是分开的,而是结合通过卷积神经网络结合在一起。获得的奖励会随时影响到卷积网络中的特征学习,然后制定出更好的策略,获取更好的奖励。在生物神经学中,已经有证据表明,在感知学习过程中,奖励信号可能会影响灵长类视觉皮质内表征的特征。
另外 DQN 中最重要的技巧——经验回放池,在神经生物学中也可以找到相似的机制。哺乳动物的海马体中存在一种物理机制,会在休息时间将最近经历过的经验轨迹重新激活(快速回放)。这意味着可以推测出动作-值函数可以通过历史经验进行学习。
不过海马体中对重要经验会存在更为深刻的印象,因此经验回放池也可以对经历过的经验分配不同的偏置权重,这是强化学习中的另一个话题,称为 prioritized sweeping。(上一篇论文中也提到过)