机器学习工程师 - Udacity 强化学习 Part Eight

八、深度Q-学习

1.神经网络作为值函数
状态值函数将任何状态 s 映射到实数,表示根据当前策略 π 该状态的重要性。如果我们使用神经网络估算该函数,则输入需要以向量的形式提供进来。我们已经知道如何使用特征转换 x 执行这一步。现在输入可以经过神经网络。如果它旨在输出一个实数,即网络估算的值,那就与利用形成参数向量 W 的神经网络权重估算值函数这一基本概念相符。问题是如何学习这些参数。如果我们有一个参考或想要实现的目标,例如某个预言者提供的 vπ,我们可以将估算值和目标值之间的平方差当做误差或损失,然后沿着神经网络反向传播并调整权重以便最小化损失。对于大多数实际问题,没有预言家能告诉我们正确的值函数 vπ 或 qπ 应该是多少,我们需要使用更加现实的目标,这个目标基于我们与环境的互动。这正是强化学习与监督学习的根本区别。

2.蒙特卡洛学习
还记得在经典蒙特卡洛学习中用来更新值函数的递增步骤吗?

之后收到的累积折扣奖励。这是一个适合获得的目标。我们采用神经网络更新规则,并将未知真值函数替换为这个回报,这就获得了由神经网络或其他函数逼近器表示的具体状态值函数更新规则。

我们也可以对动作值函数执行相同的步骤。此时我们已经有了主要构建组件,即更新规则,我们根据它构建一个完整的蒙特卡洛算法。重点看看控制问题,并调整我们的经典蒙特卡洛算法以便使用函数逼近器。

它通常包含一个评估步骤。我们在此步估算当前策略下的每个状态动作对的值。为此,我们与环境互动,并使用策略 π 生成一个阶段,然后在该阶段中的每个时间步 t 使用状态动作对 St、At 和根据该阶段剩余时间步计算的回报 Gt 更新参数向量 w。接着是一个完善步骤。我们在该步骤根据这些 q 值提取 epsilon 贪婪策略。一开始 我们需要初始化参数 w。假设我们随机地初始化,并以采用同一 epsilon 贪婪方式定义的策略 π 开始,然后不断重复这两个步骤,直到权重收敛形成最优值函数和相应的策略。注意,这是蒙特卡洛所有经历版本。对于首次经历版本,仅当在某个阶段中首次见到该状态动作对时才更新权重。
注意:蒙特卡洛学习通常肯定会收敛于局部最优;对于线性函数逼近,它将收敛于全局最优。

3.时间差分学习

比较蒙特卡洛学习的递增更新步骤(使用在阶段中获得的实际回报)与时间差分的更新步骤(使用估算回报)。在最简单的形式 TD(0) 下,我们使用下个奖励和下个状态的折扣值。

和之前的方法类似,我们可以使用这个 TD 目标替换未知真值函数,这样就可以使用具体的数据,不再是想象的数据。

注意,我们需要调整值函数 才能使用函数逼近器 v^。这整个差值称之为 TD 误差,表示为 δt

我们也可以将同一概念应用到动作值函数。

我们已经准备好围绕这个更新规则构建一个算法。我们将使用 TD(0) 目标并再次侧重于控制问题。这本质上是 SARSA 算法。我们首先随机地初始化参数 W。策略 π 隐式地定义为针对估算动作值函数 Q^ 的 Epsilon 贪婪选择。然后我们开始与环境互动。对于每个阶段,我们以从环境获得的初始状态 S 开始。我们继续互动,直到抵达最终状态。在每个时间步,我们选择执行一个动作 A 并获得奖励 R 和下个状态 S′。现在根据 Epsilon 贪婪策略 π 从状态 S′ 选择另一个动作 A′,这样就获得了 SARSA 更新所需的一切,即 S A R S′ A′。将这些项代入梯度下降更新规则并相应地调整权重。最后,直接将 S′ 替换为新的 S,将 A′ 替换为新的 A 并重复刚刚的流程。这个公式适用于阶段性任务,在阶段性任务中,每个阶段都肯定会终止。

这个公式可以经过调整并应用于连续性任务,方法是消除阶段之间的界限并将一系列的动作当做一个很长的无止境阶段。
SARSA 是一种异同策略算法,表示我们的更新策略和执行动作时遵守的策略一样,通常效果很好并且能快速收敛,因为你会根据最新的策略执行动作。但是也有一些缺点,主要是学习的策略和遵守的策略关系太紧密。如果我们想遵守一个策略,例如更加探索性的策略,并学习更加优化的策略呢,这时候就需要用到离线策略算法。

4.Q学习
Q 学习是一种 TD 学习的离线策略变体,我们看看如何调整它以便用于函数逼近。
和 SARSA 一样,我们随机地初始化参数,并根据 Q 值定义一个 Epsilon 贪婪策略 π。在多个阶段中 我们使用该 Epsilon 贪婪策略不断采取动作并观察奖励和下个状态。主要区别在于更新步骤。我们不再根据相同的 Epsilon 贪婪策略选择下个动作,而是贪婪地选择一个动作,该动作将最大化后续预期值。注意,我们并非实际地采取该动作,而是用于执行更新步骤。实际上,我们甚至不需要选择该动作。我们可以在下个状态使用最大 Q 值。因此 Q 学习被视为离线策略方法,我们根据一个策略采取动作,即 Epsilon 贪婪策略 π,并根据另一个策略更新值 即贪婪策略。虽然这两个策略都根据相同的底层 Q 值进行定义,但这两个策略实际上是不同的策略。

对于阶段性任务,Q 学习算法看起来就是这样。我们也可以将同一算法用于连续性任务,将整个无止境的序列当做一个很长的阶段,或者稍加修改,取消阶段这一概念。这两种形式是等效的。在这两种情况下,我们可能需要额外的条件来判断我们是否完全学会了任务或完全出错了。

我们来比较下 SARSA 和 Q 学习。SARSA 是一个异同策略算法,遵守的是要学习的同一策略,通常更适合在线学习。在任何时间点,你都使用通过与环境互动获得的最新策略。但是,如果你使用 Epsilon 贪婪动作选择法以便促进探索效果,那么这种随机性还会影响到学习的 Q 值。另一方面,Q 学习是一种新策略方法,即选择动作时遵守的策略与要学习的策略不同,这样可能会导致糟糕的在线效果,因为你要学习的策略与遵守的策略之间不相关。不过比较好的一点是动作选择的 Epsilon 贪婪特性不会影响到学习的 Q 值,因此这两种方法各有利弊。要选择哪个方法取决于环境特性,以及你是更关心在线性能还是学习准确性。
Q 学习等新策略方法之所以变得如此热门,是因为它们使智能体在环境中采取的动作与学习流程不再相关,这样我们便有机会构建学习算法的不同变体。例如,你可以在采取动作时遵守更加探索性的策略,并学习最优值函数。当然,在线性能会很糟糕,但是在某个时间点,我们可以停止探索并遵守最优策略,以获得更好的结果。实际上,采取动作时遵守的策略不一定必须只限于智能体,人类可以演示所采取的动作,智能体可以通过观察这些动作的效果学习规律,并且离线学习或批量学习过程更加轻松,因为不需要在每个时间步更新策略,这对可靠地训练强化学习神经网络来说非常关键。
注意:因为 SARSA 和 Q 学习都是 TD 方法,它们都有一个缺点,即使用非线性算法逼近时,可能无法收敛于全局最优。

阅读延伸:Rahimi 和 Recht, 2007 年,《大规模内核机器的随机特征》 将会提供类似于 RBF 内核转换的有效逼近。

5.深度Q网络
在 2015 年 DeepMind 取得了突破性的成果,他们设计了一个可以学会玩视频游戏的智能体,并且比人类玩家的能力更强。如果你知道电子游戏 “Pong” 的底层游戏状态,或许可以轻松地编写一个玩这个游戏的程序,例如球的位置,挡板等。但是这个智能体只能获得原始的像素数据,即人类玩家在屏幕上看到的结果。它学会了从头开始玩各种不同的 Atari 游戏。他们将这个智能体称之为深度 Q 网络。正如它的名字所表示的含义,该智能体的核心是一个充当函数逼近器的深度神经网络,你一次传入一个你喜欢的视频游戏屏幕的图片,它会生成一个动作值向量,最大值表示采取的动作,根据强化信号,它会在每个时间步将游戏得分的变化往回馈送。一开始,当神经网络初始化为随机的值时,采取的动作很混乱,正如你所预期的,效果很差。但是随着时间的推移,它开始将游戏中的情景和顺序与相应的动作关联起来,并且学会很好地玩游戏。

输入空间非常复杂。Atari 游戏的分辨率为 210 x 160 像素,每个像素有 128 种可能的颜色。这依然是一个离散状态空间,但是处理起来非常庞大。为了降低复杂性,DeepMind 团队决定稍加处理,将帧转换为灰阶,并缩小为 84 x 84 像素的正方形。正方形图片使他们能够在 GPU 上使用更加优化的神经网络运算。为了使智能体能够访问一系列的帧,他们将四个此类帧堆叠起来,形成 84 x 84 x 4 的最终状态空间,也许还有其他处理序列数据的方法,但是这个似乎是一个效果很好的简单方法。

在输出端,与传统强化学习设置(一次仅生成一个 Q 值)不同,深度 Q 网络会为一个前向传递中的所有可能的动作生成一个 Q 值,不这么处理的话,你需要单独为每个动作运行该网络。现在,你可以直接根据该向量采取动作,要么是随机形式,要么选择值最大的动作。

这些创新型输入和输出转换,支持在后台使用强大却简单的神经网络结构。屏幕图片首先用卷积层处理,使系统能够发现空间关系,并探索空间规则。此外,因为将四个帧堆叠起来作为输入,这些卷积层还将从这些帧中提取时间属性。原始 DQN 智能体使用了三个此类卷积层,并采用 ReLU 激活函数,即正则化线性单元,然后是一层采用 ReLU 激活函数的完全连接隐藏层,以及一层完全连接的线性输出层 用于生成动作值向量。

他们在所有接受测试的 Atari 游戏上应用了同一架构,但是每个游戏都从头开始学习并使用重新初始化的网络。训练此类网络需要大量数据,但即使这样,也不能保证会收敛于最优值函数。实际上,在某些情况下,网络权重会因为动作和状态之间的关系非常紧密而振荡或发散,这样会导致非常不稳定并且效率很低的策略。为了克服这些挑战,研究人员想出了多个技巧,稍微修改了基础 Q 学习算法,其中经验回放和固定 Q 目标是他们的成果中最重要的贡献。

阅读延伸:Mnih et al.,2015 年,《通过深度强化学习实现人类级别的控制》

6.经验回放
经验回放和使用它来训练强化学习神经网络并不是什么新的理念,它一开始用于更高效地使用观察的经验。
对于基本的在线 Q 学习算法,我们与环境进行互动并且在每个时间步获得一个动作、状态、奖励、下个状态元组,从中学习规律,然后丢弃,在下个时间步移到下个元组。

似乎有点浪费。如果我们将这些经验元组存储在某个地方,我们可能会从中学习更多规律。此外,某些状态很罕见,某些动作的代价很高,因此最好能够回顾这些经验。这正是回放缓冲区的作用。

当我们与环境互动时,我们将每个经验元组存储在这个缓冲区中,然后从中抽取一小批元组以进行学习,因此,我们能够从单个元组中多次学习规律,回顾罕见的状态并更充分地利用经验。经验回放还能够解决另一个关键问题,这正是 DQN 所利用的方面。如果你思考获得的经验,就会发现每个动作 AT 都以某种方式影响下个状态 ST,意味着一系列经验元组可能关系非常紧密,按顺序从这些经验中学习规律的简单 Q 学习方法面临受到这种联系影响的风险,借助经验回放,我们可以随机地从缓冲区中取样,不一定必须是存储元组的同一顺序,这有助于打破相互之间的联系,并最终防止动作值严重振动或发散。
理解起来可能有点困难,我们来看一个示例。我正在学习打网球并对着墙壁不断练习,我更擅长于正手击球而不是反手击球,我可以比较直地击中墙壁,因此球不断回到位于右手边的同一区域,我可以不断正手击球,如果我是一个在线 Q 学习智能体学习如何玩网球,我可能会学会以下规律:当球朝着我的右侧飞来时,我应该用正手击球。一开始不太确定,但是当我不断练习击球时,越来越自信可以这么操作。很棒!我的正手击球技巧很厉害,但是我没有探索剩下的状态空间,解决方法是使用 Epsilon 贪婪策略以很小的概率随机采取动作,我会尝试不同的状态和动作组合,有时候会出错,但是我最终会得出最佳整体策略:当球朝着我的右侧飞来时,用正手击球;朝着我的左侧飞来时,使用反手。很棒!这个学习策略似乎很适合 Q 表格。我们认为这个非常简单的状态空间只有两个离散状态。但是对于连续状态空间,情况会变得很糟糕。首先,球可以从最左端和最右端之间的任何方向飞来,如果我尝试将这个范围离散化为很小的分桶则会有太多可能性,如果我学习的策略存在漏洞呢?我在练习时可能没有遇到一些状态或情况。相反,使用函数逼近器会更合适,例如线性组合径向基函数核或 Q 网络,它们可以泛化空间内的学习效果。现在,每次球飞向右侧时我成功地用正手击中,值函数稍微发生了变化,它对球的精确区域更加确定,但是也提高了整个状态空间内的正手击球值,效果是偏离精确位置的幅度越来越小,但是会逐渐累积起来。这正是在玩球时尝试学习所发生的情况,即按顺序处理每个经验元组。例如,如果正手击球很直,我很可能会在同一位置遇到球,这样会生成一个与上个状态非常相似的状态,因此我再次使用正手,如果成功了,则增加了我认为正手很合适的信念。我很容易陷入这种循环中,最终,如果一段时间内没有见到太多朝着左侧飞来的球,那么在整个状态空间内正手击球的值比反手击球的值更大,我的策略变成无论看到球朝着哪个方向飞来我都选择正手。太糟糕。如何解决这一问题?首先是停止一边练习一边学习,这时候最适合尝试不同的击球方式,随机地击球并探索状态空间,然后必须记住我的互动:在哪些情形下哪些击球方式效果很好,等等。当我短暂休息或回家休息的时候,最适合回忆这些经验并从中学习规律,主要优势是现在拥有一个更全面的示例集合,有时候球朝着右侧飞来,有时候朝着左侧飞来,有时候正手击球,有时候反手击球。我可以通过这些示例总结规律,按照任何顺序回顾它们,这样可以避免固定在一个状态空间区域或不断加强相同的动作。在一轮学习之后,我可以使用更新的值函数继续玩球,再次收集一系列的经验并批量学习,这样,经验回放可以帮助我们学习更鲁棒的策略。这种策略不会受到一系列观察经验元组之间的固有联系的影响。仔细思考就会发现,这种方法基本上是构建一个样本数据库,然后从中学习映射,这样的话,经验回放可以帮助我们将强化学习问题(或至少值学习部分)简化为监督学习情形。这很机智,我们可以将在监督学习环境中开发的学习技巧和最佳做法应用到强化学习中,甚至可以完善这一理念,例如,使罕见或更重要的经验元组优先级更高。

阅读延伸:Long-Ji Lin,1993 年,《使用神经网络的机器人强化学习》

7.固定Q目标
经验回放可以帮助我们解决一种类型的联系,即元组之间的连续经验,Q 学习还容易受到一种联系的影响。

Q 学习是一种时间差分 (TD) 学习,这里 R 加上 γ 乘以下个状态的最大潜在值称为 TD 目标,我们的目标是缩小该目标和当前预测 Q 值之间的差异,这个差异是 TD 误差。

这里的 TD 目标应该取代的是真值函数 qπ(S,A)。我们不知道真值函数是什么。我们一开始使用 qπ 定义平方误差损失,并针对 w 差分化以便获得梯度下降更新规则。qπ 并不依赖于我们的函数逼近器或其参数,因此形成一个简单的导数,即更新规则。但是 TD 目标依赖于这些参数,因此直接将真值函数 qπ 替换成这样的目标在数学上不成立。在现实中,可以忽略该问题。因为每个更新都会使参数出现小小的变化,我们基本上是朝着正确的方向前进。如果将 α 设为 1 并跳转到目标 那么可能会越过目标并进入错误的区域。此外,如果我们使用查询表或字典则不是什么大问题,因为每个状态动作对的 Q 值会单独存储。但是当我们使用函数逼近时会显著影响到学习效果,因为所有 Q 值都通过函数参数固有地联系到一起。

这里的问题是目标和我们要更改的参数之间有联系,这就像追赶一个移动的目标,实际上更糟糕,就像骑在驴背上训练驴沿直线行走,但是杆子上的胡萝卜会随之摆动。没错,驴子可能会向前行走,胡萝卜通常都被甩到前方,使驴子够不着。但是和常识相反,实际效果并不是你想象的那样,胡萝卜更有可能四处随机甩动,使驴子每一步走起来都很不平稳,并以不可预测的复杂形式影响到下个目标位置,驴子很有可能会到处跳动,最终放弃行走。你应该从驴背上下来,站在一个位置并用杆子摆动胡萝卜,当驴子抵达该位置后再向前移动几步,重新用杆子摆动胡萝卜并重复这一流程,这样做本质上是将目标位置与驴子的动作拆分开来,为驴子提供一个更加稳定的学习环境。

我们也可以在 Q 学习中进行几乎一样的操作,将用于生成目标的函数参数固定起来,用 w- 表示的固定参数,本质上是在学习过程中不会更改的 w 副本。在现实中 我们将 w 替换为 w-,用它来生成目标和更改 w 并持续一定数量的学习步骤,然后使用最新的 w 更新 w-,再次学习一定数量的步骤,以此类推,这样可以使目标和参数拆分开来使学习算法更加稳定,并且不太可能会发散或振荡。

8.深度Q学习算法
该算法中有两个交错的主要流程。一个流程是对环境取样,方法是执行动作,并以回放存储器的形式存储观察的经验元组;另一个流程是随机地从该存储器中选择一小批元组,并使用梯度下降更新步骤从该批次中学习规律。这两个流程并非直接相互依赖,因此你可以完成多个取样步骤然后完成一个学习步骤,或者具有不同随机批次的多个学习步骤。该算法的剩余步骤旨在支持这些步骤。一开始你需要初始化空的回放存储器。注意存储器是有限的,因此你可能需要使用循环 Q 保留最近 n 个经验元组。然后你还需要初始化神经网络的参数或权重。你可以采取一些最佳做法。例如从正态分布中随机抽取一些权重,方差等于每个神经元输入数量的两倍。Keras 和 TensorFlow 等现代深度学习库通常都包含这些初始化方法,因此你不需要自己实现这些方法。要采用固定 Q 目标技巧你需要第二组参数 w- 可以初始化为 w。注意,这一特定算法专门用于视频游戏。对于每个阶段和该阶段中的每个时间步 t,你会观察原始屏幕图像或输入帧 xt,并需要将其转换为灰阶形式,剪切为正方形,等等。此外,为了捕获时间关系,你可以堆叠一些输入帧以构建每个状态向量。我们用函数 phi 表示这个预处理和堆叠操作,该函数会接收一系列的帧并形成组合表示法。注意,如果我们要堆叠帧,例如四个帧,则需要对前三个时间步进行特殊处理。例如,我们可以将这些丢失的帧当做空帧,使用第一帧的副本,或跳过存储经验帧这一步,直到获得完整的序列。在现实中你无法立即运行学习步骤,需要等待,直到存储器中有足够数量的元组。注意,在每个阶段之后我们不清空存储器,这样可以跨阶段地回忆和形成批量经验。DQN 论文中用到了很多其他技巧和优化方式,例如奖励裁剪,误差裁剪,将过去的动作存储为状态向量的一部分处理终止状态,挖掘一段时间内的 ϵ 等。建议你在自己实现该算法之前阅读这篇论文,尤其是方法部分。注意,你可能需要选择应用哪些技巧,并针对不同类型的环境调整这些技巧。

阅读延伸:Mnih et al.,2015 年,《通过深度强化学习实现人类级别的控制》(DQN 论文); He et al. ,2015 年,《深入研究纠正器:在 ImageNet 分类方面超过人类水平》(权重初始化)

9.DQN改进
该论文提供了多个针对原始深度 Q 学习算法的改进建议,我们来看看其中三个最重要的改进:双 DQN,优先回放和对抗网络。
我们要解决的第一个问题是 Q 学习容易出现的过高估计动作值问题。我们来回顾下具有函数逼近的 Q 学习更新规则,并重点看看 TD 目标。这里的 max 运算有必要用到,以便计算可以从下个状态获得的最佳潜在值。

为了很好地理解这一点,我们重写目标并展开 max 运算。可以更有效地理解为,我们想要获得状态 S′ 的 Q 值,以及从该状态的所有潜在动作中实现最大 Q 值的动作。写成这样时,可以看出 arg max 运算有可能会出错,尤其是在早期阶段。因为 Q 值依然在变化,我们可能没有收集足够的信息来判断最佳动作是什么。Q 值的准确性在很大程度上取决于尝试了哪些动作以及探索了哪些周围的状态。实际上,事实证明这一部分会导致过高估计 Q 值,因为我们始终在一组杂乱数字中选择最大值。或许我们不应该盲目地信任这些值。如何使我们的估算更可靠?有一个经实践证明效果很好的方法是双 Q 学习。

我们使用一组参数 w 选择最佳动作,但是使用另一组参数 w′ 评估动作。相当于有两个单独的函数逼近器。它们必须在最佳动作上达成一致。如果根据 W′ W 选择的动作并不是最佳动作,那么返回的 Q 值不会那么高。长期下来可以避免该算法传播偶尔获得的更高奖励,这些奖励并不能反映长期回报。你可能会问,我们从哪获得第二组参数?在原始的双 Q 学习公式中你会保留两个值函数,在每一步随机地选择一个函数进行更新,并仅使用另一个评估动作。但是将 DQN 与固定 Q 目标结合使用时我们已经有一组替代的参数。还记得 W- 吗?实际上 W- 已经保留不用有一段时间了,它与 W 之间的区别已经足够大,可以重新用于该目的。原理就是这样。这个简单的修改可以使 Q 值变得可靠起来,防止它们在学习的早期阶段爆发或在后期阶段出现波动。经证明,形成的策略效果比 Vanilla DQN 强很多。
我们要讨论的下个问题与经验回放有关。回忆下经验回放的基本原理。我们与环境互动以便收集经验元组,将元组保存在缓冲区,然后随机抽取一个批次以从中学习规律,这样有助于打破连续经验之间的关系,并使学习算法稳定下来。到目前为止,没什么问题。但是某些经验可能比其他经验更重要,更需要学习。此外,这些重要的经验可能很少发生,如果我们均匀地按批次抽样,那么这些经验被选中的概率很小,因为缓冲区实际上容量有限,因此更早的重要经验可能会丢失。这时候就要用到优先经验回放了。

但是我们根据什么条件来为每个元组分配优先级呢?一种方法是使用 TD 误差增量,误差越大,我们从该元组中预计学到的规律就越多,我们将此误差的大小作为衡量优先级的条件,并将其与每个相应的元组一起存储在回放缓冲区。在创建批次时,我们可以使用该值计算抽样概率,选择任何元组 i 的概率等于其优先级值 pi,并用回放缓冲区中的所有优先级值之和标准化。选择某个元组后,我们可以使用最新的 Q 值将其优先级更新为新计算的 TD 误差。似乎效果不错。经证明,可以减少学习值函数所需的批次更新数量。有几个方面可以加以改进。首先,如果 TD 误差为 0,那么该元组的优先级值及其被选中的概率也为 0。0 或非常低的 TD 误差并不一定就表明我们从此类元组中学不到任何规律,可能是因为到该时间点为止经历的样本有限估值很接近真实的值。为了防止此类元组不被选中,我们可以在每个平衡值后面加上一个很小的常量 e。另一个类似的问题是贪婪地使用这些优先级值可能会导致一小部分经验子集不断被回放,导致对该子集的过拟合。为了避免该问题我们可以重新引入一些均匀随机抽样元素。这样会添加另一个超参数 a。我们用它将抽样概率重新定义为优先级 pi 的 a 次幂除以所有优先级之和 pk。每个都是 a 次幂。我们可以通过调整该参数控制采用优先级与随机性的幅度,a 等于 0 表示采用完全均匀随机性方法,a 等于 1 表示仅采用优先级值。当我们使用优先经验回放时,我们需要对更新规则进行一项调整。我们的原始 Q 学习更新来自于对所有经验的预期结果。在使用随机性更新规则时我们对这些经验抽样的方式必须与来源底层分布匹配。当我们从回放缓冲区均匀地抽样经验元组时能够满足这一前提条件,但是当我们采用非均匀抽样(例如使用优先级)时则不满足该前提条件,我们学习的 Q 值将因为这些优先级值出现偏差。我们只希望使用这些值进行抽样。为了更正这一偏差,我们需要引入一个重要的抽样权重,等于 1/N,N 是该回放缓冲区的大小,乘以 1/p(i) p(i) 是抽样概率。我们可以添加另一个超参数 b,并将每个重要抽样权重提升为 b,控制这些权重对学习的影响程度。实际上,这些权重在学习结束时更加重要,这时候 Q 值开始收敛。因此你可以逐渐将 b 从很低的值增加到 1。这些细节部分可能一开始很难明白,但是每个小小的改进都可以有效地达到更加稳定高效的学习算法,因此确保仔细阅读优先经验回放论文。
我们将简单介绍最后一个 DQN 增强技巧,叫做对抗网络。

名称很好懂。这是一个典型 DQN 架构。有一系列卷积层,然后是几个完全连接层,生成了 Q 值。对抗网络的核心概念是使用两个信息流,一个估算状态值函数,一个估算每个动作的优势。这两个信息流可能在一开始具有一些共同的层级,例如卷积层,然后分支为各自的完全连接层,最后通过结合状态和优势值获得期望的 Q 值。这么做的原因是大部分状态在动作之间变化不大,因此可以尝试直接估算它们。但是我们依然需要捕获动作在每个状态中产生的区别,这时候就要用到优势函数,需要进行一些调整,以便将 Q 学习应用于该架构。你可以在对抗网络论文中找到该调整方法。和双 DQN 以及经验回放一样,该技巧显著改善了 vanilla DQN。

阅读延伸

posted on 2019-02-28 20:22  paulonetwo  阅读(326)  评论(0编辑  收藏  举报

导航