强化学习面试必知必答[4]::深度Q网络-DQN、经验回放等

强化学习从基础到进阶-常见问题和面试必知必答[4]::深度Q网络-DQN、double DQN、经验回放、rainbow、分布式DQN

1.核心词汇

  • 深度Q网络(deep Q-network,DQN):基于深度学习的Q学习算法,其结合了价值函数近似(value function approximation)与神经网络技术,并采用目标网络和经验回放等方法进行网络的训练。

  • 状态-价值函数(state-value function):其输入为演员某一时刻的状态,输出为一个标量,即当演员在对应的状态时,预期的到过程结束时间段内所能获得的价值。

  • 状态-价值函数贝尔曼方程(state-value function Bellman equation):基于状态-价值函数的贝尔曼方程,它表示在状态 sts_t 下对累积奖励 GtG_t 的期望。

  • Q函数(Q-function): 其也被称为动作价值函数(action-value function)。其输入是一个状态-动作对,即在某一具体的状态采取对应的动作,假设我们都使用某个策略 π\pi ,得到的累积奖励的期望值有多大。

  • 目标网络(target network):其可解决在基于时序差分的网络中,优化目标 Qπ(st,at)=rt+Qπ(st+1,π(st+1))Q_{\pi}\left(s_{t}, a_{t}\right) = r_{t}+Q_{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) 左右两侧会同时变化使得训练过程不稳定,从而增大回归的难度的问题。目标网络选择将右边部分,即 rt+Qπ(st+1,π(st+1))r_{t}+Q_{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) 固定,通过改变左边部分,即 Qπ(st,at)Q_{\pi}\left(s_{t}, a_{t}\right) 中的参数进行回归,这也是深度Q网络应用中比较重要的技巧。

  • 探索(exploration):我们在使用Q函数的时候,我们的策略完全取决于Q函数,这有可能导致出现对应的动作是固定的某几个数值的情况,而不像策略梯度中的输出是随机的,我们再从随机分布中采样选择动作。这会导致我们继续训练的输入值一样,从而“加重”输出的固定性,导致整个模型的表达能力急剧下降,这就是探索-利用窘境(exploration-exploitation dilemma)问题。我们可以使用 ε\varepsilon-贪心和玻尔兹曼探索(Boltzmann exploration)等探索方法进行优化。

  • 经验回放(experience replay):其会构建一个回放缓冲区(replay buffer)来保存许多经验,每一个经验的形式如下:在某一个状态 sts_t,采取某一个动作 ata_t,得到奖励 rtr_t,然后进入状态 st+1s_{t+1}。我们使用 π\pi 与环境交互多次,把收集到的经验都存储在回放缓冲区中。当我们的缓冲区“装满”后,就会自动删去最早进入缓冲区的经验。在训练时,对于每一轮迭代都有相对应的批量(batch)(与我们训练普通的网络一样,都是通过采样得到的),然后用这个批量中的经验去更新我们的Q函数。综上,Q函数在采样和训练的时候,会用到过去的经验,所以这里称这个方法为经验回放,其也是深度Q网络应用中比较重要的技巧。

  • 双深度Q网络(double DQN):在双深度Q网络中存在两个Q网络,第一个Q网络决定哪一个动作的Q值最大,从而决定对应的动作。另一方面,Q值是用 QQ' 计算得到的,这样就可以避免过度估计的问题。具体地,假设我们有两个Q函数并且第一个Q函数高估了它现在执行的动作 aa 的值,这没关系,只要第二个Q函数 QQ' 没有高估动作 aa 的值,那么计算得到的就还是正常的值。

  • 竞争深度Q网络(dueling DQN):将原来的深度Q网络的计算过程分为两步。第一步计算一个与输入有关的标量 V(s)\mathrm{V(s)};第二步计算一个向量 A(s,a)\mathrm{A(s,a)} 对应每一个动作。最后的网络将两步的结果相加,得到我们最终需要的Q值。用一个公式表示就是 Q(s,a)=V(s)+A(s,a)\mathrm{Q(s,a)=V(s)+A(s,a)} 。另外,竞争深度Q网络,使用状态价值函数与动作价值函数来评估Q值。

  • 优先级经验回放(prioritized experience replay,PER):这个方法是为了解决我们在第6章中提出的经验回放方法的不足而提出的。我们在使用经验回放时,均匀地取出回放缓冲区(reply buffer)中的采样数据,这里并没有考虑数据间的权重大小。但是我们应该将那些训练效果不好的数据对应的权重加大,即其应该有更大的概率被采样到。综上,优先级经验回放不仅改变了被采样数据的分布,还改变了训练过程。

  • 噪声网络(noisy net):其在每一个回合开始的时候,即智能体要和环境交互的时候,在原来的Q函数的每一个参数上加上一个高斯噪声(Gaussian noise),把原来的Q函数变成 Q~\tilde{Q} ,即噪声Q函数。同样,我们把每一个网络的权重等参数都加上一个高斯噪声,就得到一个新的网络 Q~\tilde{Q} 。我们会使用这个新的网络与环境交互直到结束。

  • 分布式Q函数(distributional Q-function):对深度Q网络进行模型分布,将最终网络的输出的每一类别的动作再进行分布操作。

  • 彩虹(rainbow):将7个技巧/算法综合起来的方法,7个技巧分别是——深度Q网络、双深度Q网络、优先级经验回放的双深度Q网络、竞争深度Q网络、异步优势演员-评论员算法(A3C)、分布式Q函数、噪声网络,进而考察每一个技巧的贡献度或者与环境的交互是否是正反馈的。

2.常见问题汇总

2.为什么在深度Q网络中采用价值函数近似的表示方法?

首先深度Q网络为基于深度学习的Q学习算法,而在Q学习中,我们使用表格来存储每一个状态下动作的奖励,即我们在正文中介绍的动作价值函数 Q(s,a)Q(s,a) 。但是在我们的实际任务中,状态量通常数量巨大,并且在连续任务中会遇到维度灾难等问题,使用真正的价值函数通常是不切实际的,所以使用了与价值函数近似的表示方法。

2.2 评论员的输出通常与哪几个值直接相关?

与状态和演员直接相关。我们在讨论输出时通常是针对一个演员衡量一个状态的好坏,也就是状态、价值从本质上来说是依赖于演员的。不同的演员在相同的状态下也会有不同的输出。

2.3 我们通常怎么衡量状态价值函数 Vπ(s)V_{\pi}(s) ?其优势和劣势分别有哪些?

(1)基于蒙特卡洛的方法:本质上就是让演员与环境交互。评论员根据统计结果,将演员和状态对应起来,即如果演员看到某一状态 sas_a ,将预测接下来的累积奖励有多大,如果看到另一个状态 sbs_b,将预测接下来的累积奖励有多大。但是其普适性不好,其需要匹配到所有的状态。如果我们面对的是一个简单的例如贪吃蛇游戏等状态有限的问题还可以应对,但是如果我们面对的是一个图片型的任务,我们几乎不可能将所有的状态(对应每一帧的图像)的都“记录”下来。总之,其不能对未出现过的输入状态进行对应价值的输出。

(2)基于蒙特卡洛的网络方法:为了弥补上面描述的基于蒙特卡洛的方法的不足,我们将其中的状态价值函数 Vπ(s)V_{\pi}(s) 定义为一个网络,其可以对于从未出现过的输入状态,根据网络的泛化和拟合能力,“估测”出一个价值输出。

(3)基于时序差分的网络方法,即基于时序差分的网络:与我们在前4章介绍的蒙特卡洛方法与时序差分方法的区别一样,基于时序差分的网络方法和基于蒙特卡洛的网络方法的区别也相同。在基于蒙特卡洛的方法中,每次我们都要计算累积奖励,也就是从某一个状态 sas_a 一直到游戏结束的时候,得到的所有奖励的总和。所以要应用基于蒙特卡洛的方法时,我们必须至少把游戏玩到结束。但有些游戏要玩到游戏结束才能够更新网络花费的时间太长了,因此我们会采用基于时序差分的网络方法。基于时序差分的网络方法不需要把游戏玩到结束,只要在游戏某一个状态 sts_t 的时候,采取动作 ata_t 得到奖励 rtr_t ,进入状态 st+1s_{t+1},就可以应用基于时序差分的网络方法。其公式与之前介绍的时序差分方法类似,即 Vπ(st)=Vπ(st+1)+rtV_{\pi}\left(s_{t}\right)=V_{\pi}\left(s_{t+1}\right)+r_{t}

(4)基于蒙特卡洛方法和基于时序差分方法的区别在于: 蒙特卡洛方法本身具有很大的随机性,我们可以将其 GaG_a 视为一个随机变量,所以其最终的偏差很大。而对于时序差分,其具有随机的变量 rr 。因为在状态 sts_t 采取同一个动作,所得的奖励也不一定是一样的,所以对于时序差分方法来说,rr 是一个随机变量。但是相对于蒙特卡洛方法的 GaG_a 来说,rr 的随机性非常小,这是因为 GaG_a 本身就是由很多的 rr 组合而成的。从另一个角度来说,在时序差分方法中,我们的前提是 rt=Vπ(st+1)Vπ(st)r_t=V_{\pi}\left(s_{t+1}\right)-V_{\pi}\left(s_{t}\right) ,但是我们通常无法保证 Vπ(st+1)V_{\pi}\left(s_{t+1}\right)Vπ(st)V_{\pi}\left(s_{t}\right) 计算的误差为0。所以当 Vπ(st+1)V_{\pi}\left(s_{t+1}\right)Vπ(st)V_{\pi}\left(s_{t}\right) 计算得不准确,得到的结果也会是不准确的。总之,两者各有优劣。

(5)目前,基于时序差分的方法是比较常用的,基于蒙特卡洛的方法其实是比较少用的。

2.4 基于本章正文介绍的基于蒙特卡洛的网络方法,我们怎么训练模型呢?或者我们应该将其看作机器学习中什么类型的问题呢?

理想状态下,我们期望对于一个输入状态,输出其无误差的奖励价值。对于价值函数,如果输入状态是 sas_a,正确的输出价值应该是 GaG_a。如果输入状态是 sbs_b,正确的输出价值应该是 GbG_b。所以在训练的时候,其就是一个典型的机器学习中的回归问题。我们实际中需要输出的仅仅是一个非精确值,即我们希望在输入状态 sas_a 的时候,输出价值与 GaG_a 越近越好;输入 sbs_b 的时候,输出价值与 GbG_b 越近越好。其训练方法与我们在训练卷积神经网络等深度神经网络时的方法类似。

2.5 基于本章正文中介绍的基于时序差分的网络方法,具体地,我们应该怎么训练模型呢?

基于时序差分网络的核心函数为 Vπ(st)=Vπ(st+1)+rtV_{\pi}\left(s_{t}\right)=V_{\pi}\left(s_{t+1}\right)+r_{t}。我们将状态 sts_t 输入网络,因为将 sts_t 输入网络会得到输出 Vπ(st)V_{\pi}(s_t),同样将 st+1s_{t+1} 输入网络会得到Vπ(st+1)V_{\pi}(s_{t+1})。同时核心函数 Vπ(st)=Vπ(st+1)+rtV_{\pi}\left(s_{t}\right)=V_{\pi}\left(s_{t+1}\right)+r_{t} 告诉我们, Vπ(st)V_{\pi}(s_t)Vπ(st+1)V_{\pi}(s_{t+1}) 的值应该是 rtr_t。我们希望它们两个相减的损失值与 rtr_t 尽可能地接近。这也是网络的优化目标,我们称之为损失函数。

2.6 动作价值函数和状态价值函数的有什么区别和联系?

(1)状态价值函数的输入是一个状态,它根据状态计算出当前这个状态以后的累积奖励的期望值是多少。

(2)动作价值函数的输入是状态-动作对,即在某一个状态采取某一个动作,同时假设我们都使用策略 π\pi ,得到的累积奖励的期望值是多少。

2.7 请介绍Q函数的两种表示方法。

(1)使用状态-动作对表示时,即当Q函数的输入是状态-动作对时,输出就是一个标量。

(2)仅使用状态表示时,即当Q函数的输入仅是一个状态时,输出就是多个价值。

2.8 当得到了Q函数后,我们应当如何找到更好的策略 π\pi' 呢?或者说 π\pi' 的本质是什么?

首先, π\pi'π(s)=aQπ(s,a)\pi^{\prime}(s)=\underset{a}{\arg \max} Q_{\pi}(s, a) 计算而得,其表示假设我们已经学习出 π\pi 的Q函数,对于某一个状态 ss ,把所有可能的动作 aa 一一代入这个Q函数,看看哪一个动作 aa 可以让Q函数的价值最大,那么该动作就是 π\pi' 将会执行的动作。所以根据以上方法决定动作的策略 π\pi' 一定比原来的策略 π\pi 要好,即 Vπ(s)Vπ(s)V_{\pi^{\prime}}(s) \geqslant V_{\pi}(s)

2.9 解决探索-利用窘境问题的探索的方法有哪些?

(1) ε\varepsilon-贪心: 我们有 1ε1-\varepsilon 的概率(通常 ε\varepsilon 很小)完全按照Q函数决定动作,但是有 ε\varepsilon 的概率使得动作是随机的。通常在实现上, ε\varepsilon的值会随着时间递减。也就是在最开始的时候,因为还不知道哪个动作是比较好的,所以我们会花比较大的力气做探索。接下来随着训练的次数越来越多,我们已经比较确定哪一种策略是比较好的,就会减少探索,从而把 ε\varepsilon 的值变小,主要根据Q函数来决定未来的动作,随机性就会变小。

(2) 玻尔兹曼探索:这个方法比较像策略梯度。在策略梯度里面,网络的输出是一个期望动作空间上的一个概率分布,我们根据概率分布去采样。所以也可以根据Q值确定一个概率分布,假设某一个动作的Q值越大,代表它越好,我们采取这个动作的概率就越高。

2.10 我们使用经验回放有什么好处

(1)首先,在强化学习的整个过程中,最花时间的过程是与环境交互,使用GPU乃至TPU来训练网络相对来说是比较快的。而用回放缓冲区可以减少与环境交互的次数。因为在训练的时候,我们的经验不需要通通来自于某一个策略(或者当前时刻的策略)。一些由过去的策略所得到的经验可以放在回放缓冲区中被使用多次,被反复地再利用,这样采样到的经验才能被高效地利用。

(2)另外,在训练网络的时候,我们其实希望一个批量里面的数据越多样越好。如果一个批量里面的数据都是同性质的,我们训练出的模型的拟合能力可能不会很乐观。如果一个批量里面都是一样的数据,在训练的时候,拟合效果会比较差。如果回放缓冲区里面的经验通通来自于不同的策略,那么采样到的一个批量里面的数据会是比较多样的。这样可以保证我们的模型的性能至少不会很差。

2.11 在经验回放中我们观察 π\pi 的价值,发现里面混杂了一些不是 π\pi 的经验,这会有影响吗?

没影响。这并不是因为过去的 π\pi 与现在的 π\pi' 很相似,就算过去的π\pi 不是很相似,其实也是没有关系的。主要的原因是我们并不是去采样一条轨迹,我们只能采样一个经验,所以与是不是异策略是没有关系的。就算是异策略,就算是这些经验不是来自 π\pi,我们还是可以使用这些经验来估测 Qπ(s,a)Q_{\pi}(s,a)

2.12 为什么传统的深度Q网络的效果并不好?可以参考其公式 Q(st,at)=rt+aQ(st+1,a)Q(s_t ,a_t)=r_t+\max_{a}Q(s_{t+1},a) 来描述。

因为实际应用时,需要让 Q(st,at)Q(s_t ,a_t)rt+aQ(st+1,a)r_t+\max_{a}Q(s_{t+1},a) 尽可能相等,即与我们的目标越接近越好。可以发现,目标值很容易一不小心就被设置得太高,因为在计算该目标值的时候,我们实际上在做的事情是看哪一个动作 aa 可以得到最大的Q值,就把它加上去,使其成为我们的目标。

例如,现在有4个动作,本来它们得到的Q值都是差不多的,它们得到的奖励也都是差不多的,但是在估算的时候是有误差的。如果第1个动作被高估了,那目标就会执行该动作,然后就会选这个高估的动作的Q值加上 rtr_t 当作目标值。如果第4个动作被高估了,那目标就会选第4个动作的Q值加上 rtr_t 当作目标值。所以目标总是会选那个Q值被高估的动作,我们也总是会选那个奖励被高估的动作的Q值当作Q值的最大值的结果去加上 rtr_t 当作新目标值,因此目标值总是太大。

2.13 在传统的深度Q网络中,我们应该怎么解决目标值太大的问题呢?

我们可以使用双深度Q网络解决这个问题。首先,在双深度Q网络里面,选动作的Q函数与计算价值的Q函数不同。在深度Q网络中,需要穷举所有的动作 aa,把每一个动作 aa 都代入Q函数并计算哪一个动作 aa 反馈的Q值最大,就把这个Q值加上 rtr_t 。但是对于双深度Q网络的两个Q网络,第一个Q网络决定哪一个动作的Q值最大,以此来决定选取的动作。我们的Q值是用 QQ' 算出来的,这样有什么好处呢?为什么这样就可以避免过度估计的问题呢?假设我们有两个Q函数,如果第一个Q函数高估了它现在选出来的动作 aa 的值,那没关系,只要第二个Q函数 QQ' 没有高估这个动作 aa 的值,计算得到的就还是正常值。假设反过来是 QQ' 高估了某一个动作的值,那也不会产生过度估计的问题。

2.14 请问双深度Q网络中所谓的 QQQQ' 两个网络的功能是什么?

在双深度Q网络中存在两个Q网络,一个是目标的Q网络,一个是真正需要更新的Q网络。具体实现方法是使用需要更新的Q网络选动作,然后使用目标的Q网络计算价值。双深度Q网络相较于深度Q网络的更改是最少的,它几乎没有增加任何的运算量,甚至连新的网络都不需要。唯一要改变的就是在找最佳动作 aa 的时候,本来使用 QQ' 来计算,即用目标的Q网络来计算,现在改成用需要更新的Q网络来计算。

2.15 如何理解竞争深度Q网络的模型变化带来的好处?

对于 Q(s,a)\mathrm{Q}(s,a) ,其对应的状态由于为表格的形式,因此是离散的,而实际中的状态却不是离散的。对于 Q(s,a)\mathrm{Q}(s,a) 的计算公式—— Q(s,a)=V(s)+A(s,a)\mathrm{Q}(s,a)=\mathrm{V}(s)+\mathrm{A}(s,a) 。其中的 V(s)\mathrm{V}(s) 对于不同的状态都有值, A(s,a)\mathrm{A}(s,a) 对于不同的状态都有不同的动作对应的值。所以从本质上来说,我们最终矩阵 Q(s,a)\mathrm{Q}(s,a) 的结果是将每一个 V(s)\mathrm{V}(s) 加到矩阵 A(s,a)\mathrm{A}(s,a) 中得到的。从模型的角度考虑,我们的网络直接改变的不是 Q(s,a)\mathrm{Q}(s,a) ,而是改变的 V\mathrm{V}A\mathrm{A} 。但是有时我们更新时不一定会将 V(s)\mathrm{V}(s)Q(s,a)\mathrm{Q}(s,a) 都更新。将状态和动作对分成两个部分后,我们就不需要将所有的状态-动作对都采样一遍,我们可以使用更高效的估计Q值的方法将最终的 Q(s,a)\mathrm{Q}(s,a) 计算出来。

2.16 使用蒙特卡洛和时序差分平衡方法的优劣分别有哪些?

优势:时序差分方法只采样了一步,所以某一步得到的数据是真实值,接下来的都是Q值估测出来的。使用蒙特卡洛和时序差分平衡方法采样比较多步,如采样NN步才估测价值,所以估测的部分所造成的影响就会比较小。

劣势:因为智能体的奖励比较多,所以当我们把NN步的奖励加起来时,对应的方差就会比较大。为了缓解方差大的问题,我们可以通过调整NN值,在方差与不精确的Q值之间取得一个平衡。这里介绍的参数NN是超参数,需要微调参数 NN,例如是要多采样3步、还是多采样5步。

2.17 深度Q网络相比基于策略梯度的方法为什么训练效果更好、更平稳?

在深度Q网络中,只要能够估计出Q函数,就可以找到一个比较好的策略。同样地,只要能够估计出Q函数,就可以增强对应的策略。因为估计Q函数是一个比较容易的回归问题,在这个回归问题中,我们可以时刻观察模型训练的效果是不是越来越好(一般情况下我们只需要关注回归的损失有没有下降,就可以判断模型学习得好不好),所以估计Q函数相较于学习一个策略来说是比较容易的。只需要估计Q函数,就可以保证现在一定会得到比较好的策略,同样其也比较容易操作。对比来说,策略梯度方法中的优化目标是最大化总回报,但是我们很难找到一个明确的损失函数来进行优化,其本质上是一个策略搜索问题,也就是一个无约束的优化问题。

2.18 深度Q网络在处理连续动作时存在什么样的问题呢?对应的解决方法有哪些呢?

我们在日常生活中常见的问题大都是包含连续动作的,例如智能体要进行自动驾驶,其就需要决定方向盘要左转几度或右转几度,这就是连续的动作;假设智能体是一个机器人,它身上有50个关节,它的每一个动作就对应到这50个关节的角度,这些角度也是连续的。

然而在使用深度Q网络时,很重要的一步是要求能够解决对应的优化问题。当我们预估出Q函数 Q(s,a)Q(s,a) 以后,必须要找到一个动作,它可以让 Q(s,a)Q(s,a) 最大。假设动作是离散的,那么动作 aa 的可能性是有限的。但如果动作是连续的,我们就不能像对离散的动作一样,穷举所有可能的动作了。

为了解决这个问题,有以下几种方案。

(1)第一个方案:我们可以使用采样方法,即随机采样出NN个可能的动作,然后一个一个代入Q函数中,计算对应的NN个Q值,并比较哪一个最大。但是这个方案因为使用采样方法所以不会非常精确。

(2)第二个方案:我们将这个连续动作问题,建模为一个优化问题,从而可以用梯度上升去最大化我们的目标函数。具体地,我们将动作视为变量,使用梯度上升更新动作对应的Q值。但是这个方案通常时间花销比较大,因为其需要迭代计算。

(3)第三个方案:设计一个特别的网络架构,即设计一个特别的Q函数,使得求解让Q函数最大化的动作 aa 变得非常容易。也就是这里的Q函数不是一个广义的Q函数,我们可以使用特殊方法设计Q函数,使得寻找让这个Q函数最大的动作 aa 非常容易。但是这个方案的Q函数不能随意设计,其必须有一些额外的限制。

(4)第四个方案:不用深度Q网络,毕竟用其处理连续动作比较麻烦。

3.面试必知必答

3.1 友善的面试官:请问深度Q网络是什么?其两个关键性的技巧分别是什么?

深度Q网络是基于深度学习的Q学习算法,其结合了价值函数近似与神经网络技术,并采用了目标网络和经验回放技巧进行网络的训练。目标网络和经验回放

3.2 友善的面试官:那我们继续分析!你刚才提到的深度Q网络中的两个技巧————目标网络和经验回放,其具体作用是什么呢?

在深度Q网络中某个动作价值函数的更新依赖于其他动作价值函数。如果我们一直更新价值网络的参数,会导致更新目标不断变化,也就是我们在追逐一个不断变化的目标,这样势必会不太稳定。为了解决基于时序差分的网络中,优化目标 Qπ(st,at)=rt+Qπ(st+1,π(st+1))Q_{\pi}\left(s_{t}, a_{t}\right) =r_{t}+Q_{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) 左右两侧会同时变化使得训练过程不稳定,从而增大回归难度的问题,目标网络选择将优化目标的右边即 rt+Qπ(st+1,π(st+1))r_{t}+Q_{\pi}\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) 固定,通过改变优化目标左边的网络参数进行回归。对于经验回放,其会构建一个回放缓冲区,用来保存许多数据,每一个数据的内容包括:状态 sts_t、采取的动作 ata_t、得到的奖励 rtr_t、下一个状态 st+1s_{t+1}。我们使用 π\pi 与环境交互多次,把收集到的数据都放到回放缓冲区中。当回放缓冲区“装满”后,就会自动删去最早进入缓冲区的数据。在训练时,对于每一轮迭代都有相对应的批量(与我们训练普通网络一样,通过采样得到),然后用这个批量中的数据去更新Q函数。即Q函数在采样和训练的时候会用到过去的经验数据,也可以消除样本之间的相关性。

3.3 友善的面试官:深度Q网络和Q学习有什么异同点?

整体来说,从名称就可以看出,两者的目标价值以及价值的更新方式基本相同。但有如下不同点:

(1)首先,深度Q网络将Q学习与深度学习结合,用深度网络来近似动作价值函数,而Q学习则是采用表格进行存储。

(2)深度Q网络采用了经验回放的技巧,从历史数据中随机采样,而Q学习直接采用下一个状态的数据进行学习。

3.4 友善的面试官:请问,随机性策略和确定性策略有什么区别吗?

随机性策略表示为某个状态下动作取值的分布,确定性策略在每个状态只有一个确定的动作可以选。从熵的角度来说,确定性策略的熵为0,没有任何随机性。随机性策略有利于我们进行适度的探索,确定性策略不利于进行探索。

3.5 友善的面试官:请问不打破数据相关性,神经网络的训练效果为什么就不好?

在神经网络中通常使用随机梯度下降法。随机的意思是我们随机选择一些样本来增量式地估计梯度,比如常用的批量训练方法。如果样本是相关的,就意味着前后两个批量很可能也是相关的,那么估计的梯度也会呈现出某种相关性。但是在极端条件下,后面的梯度估计可能会抵消掉前面的梯度估计量,从而使得训练难以收敛。

3.6 友善的面试官:深度Q网络都有哪些变种?引入状态奖励的是哪种?

深度Q网络有3个经典的变种:双深度Q网络、竞争深度Q网络、优先级双深度Q网络。

(1)双深度Q网络:将动作选择和价值估计分开,避免Q值被过高估计。

(2)竞争深度Q网络:将Q值分解为状态价值和优势函数,得到更多有用信息。

(3)优先级双深度Q网络:将经验池中的经验按照优先级进行采样。

3.7 友善的面试官:请简述双深度Q网络原理。

深度Q网络由于总是选择当前最优的动作价值函数来更新当前的动作价值函数,因此存在过估计问题(估计的价值函数值大于真实的价值函数值)。为了解耦这两个过程,双深度Q网络使用两个价值网络,一个网络用来执行动作选择,然后用另一个网络的价值函数对应的动作值更新当前网络。

3.8 友善的面试官:请问竞争深度Q网络模型有什么优势呢?

对于 Q(s,a)\boldsymbol{Q}(s,a) ,其对应的状态由于为表格的形式,因此是离散的,而实际的状态大多不是离散的。对于Q值 Q(s,a)=V(s)+A(s,a)\boldsymbol{Q}(s,a)=V(s)+\boldsymbol{A}(s,a) 。其中的 V(s)V(s) 是对于不同的状态都有值, A(s,a)\boldsymbol{A}(s,a) 对于不同的状态都有不同的动作对应的值。所以本质上,我们最终的矩阵 Q(s,a)\boldsymbol{Q}(s,a) 是将每一个 V(s)V(s) 加到矩阵 A(s,a)\boldsymbol{A}(s,a) 中得到的。但是有时我们更新时不一定会将 V(s)V(s)Q(s,a)\boldsymbol{Q}(s,a) 都更新。我们将其分成两个部分后,就不需要将所有的状态-动作对都采样一遍,我们可以使用更高效的估计Q值的方法将最终的 Q(s,a)\boldsymbol{Q}(s,a) 计算出来。

更多优质内容请关注公号:汀丶人工智能

#人工智能##深度学习##强化学习##DQN#
强化学习(原理+项目) 文章被收录于专栏

强化学习单智能体、多智能体原理应用介绍以及码源项目实战,后续会持续把深度学习涉及知识原理分析给大家,让大家在项目实操的同时也能知识储备,知其然、知其所以然、知何由以知其所以然。

全部评论

相关推荐

面试官人很好,态度和蔼可亲,没答出来时也会引导你去思考。由于是晚上面的,导致我白天一天都有点紧张,面的时候状态也不是很好,正常可能面试官提问完应该思考几秒再答,而我就像抢答一样一口气把所有会的都说出来,这样就导致逻辑比较混乱,东一句西一句的。首先是自我介绍,先把会的技术大致讲一下,由于我八股背的多所以着重讲了一下,Java,go,jvm,MySQL,Redis,计网,操作系统这些,然后一小部分闲聊,然后先问了一下项目,面试官问我这个项目是否落实之类的,直接坦言说是写的练手的,包括之前也写过IM通讯,外卖之类的。然后面试官就把提问的重点放在了八股上。先问了Java:类加载器(答:3种+自定义类加载器、tomcat、原因+双亲委派+好处)JVM参数(答:xmx,xms,newsize这些,问我是如何设定的,我回答是把内存分一半给堆,再把堆分一半给新生代,这方面确实不太了解)然后问了一下并发相关的:线程池(答:线程池的7个参数(忘了线程工厂和阻塞时间了),3个重要参数,还有线程如何启用,为什么要设计最大线程数之类的,提到Java栈默认分配1MB运行时不可以更改)AQS(答:先讲clh是自旋锁+list,然后是AQS在这个基础上做的两个优化,然后举了一下reentrantlock根据state如何获取资源)CAS(答:使用三个字段,aba问题,然后将通常搭配自旋锁实现,面试官问通常会自旋多少次,这个不太了解,答的100,然后问100次大概多少秒,回答微秒级,然后面试官讲了一下怎么做资源可能没用完,意识到可能还需要进行阻塞操作)然后考虑一下Linux命令(top,ps,如何使用管道符过滤线程和使用Linux启动线程没答出来)然后问Redis:持久化机制(答:三种aof,rdb,混合,aof的三个参数刷盘策略,rdb以快照保存,使用bgsave会使用子线程来保存不会阻塞,而aof虽然会阻塞但是只在写完数据后追加一条命令,不会太影响,然后是他俩的优缺点,还有混合是怎么保存数据的)集群模式(答:三种,主从复制到缺点再到哨兵机制,正常使用三个哨兵互相监督,主节点挂了投票选主哨兵然后选主节点,然后额外讲一下脑裂的问题,主节点进行数据更新然后把命令写入aof来同步从节点,最后cluster集群,如何实现,使用16383个哈希槽(艹答成16384了),先根据哈希码取余,再根据节点数取余决定放在哪个节点上,然后问了一下我会怎么选集群模式,首先是cluster的问题,会让管道操作之类的失效,然后哨兵会导致整个集群结构变得复杂,使用小项目可能会考虑哨兵,大的考虑cluster,然后考了一下cluster如果一个节点挂了怎么办,根据节点数重新取余然后数据转移,面试官说这么转移比较慢,有没有别的办法,我隐约记得使用一个类似环形数组的方式,想不起来了)然后考了一下MySQL的b+树(这方面的知识点太多了,导致我什么都想讲逻辑就比较乱,讲了一下聚簇索引,树的叶子节点对应着一张页16KB,MySQL有一个区的概念,把这些页放在同一个区中,这样叶子节点的双向链表遍历时速度更快,然后b+树的扇出比较大(非常二,说成扇度之类的,面试官以为说的是扇区)这样层数就比较小,一行1kb数据的话3层可以放心2000w数据)其他的暂时想不起来了算法是lru,面试官问要不要提示,我说写个,然后写了10分钟左右,说大概写好了,但是面试官指出了2个小错误,第一个马上就改回来了,第二个一直没看出来(大脑这时候已经停止工作了)反问:问学习建议,说根据实际的项目进行深入,考虑应该怎么做,还问了一下组里面是做Java的吗?面试官说他是做go的,组里什么语言都有,语言影响不大,连忙补充了一句我对go的底层有深入源码的学习)结束。总体感觉答得不太好,没有太体现出深度,细节也不够全面。
下一个更好呗:佬,我投完云智一直没消息,多久约的一面啊
查看14道真题和解析
点赞 评论 收藏
分享
04-11 00:51
已编辑
门头沟学院 Java
先说一下楼主的情况:双非本大三,两段实习,javaer,想要找一个暑期大厂offer,努力了两个月,三月份每天的状态就是算法,八股,项目,四月份更是一个面试没有,最终还是没有结果,心碎了一地。期间面了一些中小厂,大厂只有腾讯约面,其他大厂都投了一遍,但是还是石沉大海。再看一下楼主的面试结果吧,就不说ttl了腾讯s3:三面挂csig:一面挂teg:三面挂wxg:一面挂没错,面了八次腾讯,两次三面挂,当时真的心都碎了。其他中小厂都有面,有的没过,有的oc,但是都没有去。其他大厂投了简历,但是不是简历挂,就是测评挂,都说今年行情好很多,各大厂都扩招,可是问题出在那里呢?学历背景吗?实习经历吗?还是简历不够好看?依稀记得,从年初七就离开了家里,回到学校,早早准备面试,当时自己认为凭借着自己的两段实习经历,以及大二就开始准备的八股算法,拿大厂offer不是问题,但是还是不敢放松,回校的状态每天就是算法,八股,还有查看各种招聘信息,想着尽早投机会多,但是事实证明,投的早,不如投的刚刚好。当时想着,先投一些中小厂开始面试,找找面试感觉,从2.10就开始有面试了,基本都是线下面试,面试的感觉都很不错,觉得自己的状态慢慢回来了,期间也有oc一些中小厂,但是自己的目标并不在此,只是想练一下手,遂拒。后面投了腾讯的暑期实习基地,不久就约面了,第一次面这么大的厂,多少有点紧张,好在运气还不错,遇到的面试官也比较好,一直干到了三面,期间看牛客有不少说一面就挂了的,感觉自己还是比较幸运的,但是没想到倒在了三面,一周后就挂了,伤心是有的,但是想到这才刚刚开始,还有很多机会,便继续准备下一次面试了,很快,被另外一个部门捞了,一进会议,面试官没开摄像头,看网上说没开摄像头很多都是kpi,但是自己给自己打气,认为面试官只是不方便开摄像头罢了,面完,感觉良好,没问什么很难得问题,基本都答出来了,算法两道也a了一道,感觉实习不会这么严格吧?还是过了一会挂了,因为这个?还是技术不太匹配?面试过程中说搞C++的,心想,搞c++的你面我干啥?唉,这时候有点气馁,然后就接下来半个月没有面试。这时已经是三月底了,看到牛客好多人都已经陆陆续续拿到了offer,看人家的面试准备也没那么早,有0实习的,有没刷算法的,有两个面的,,,唉,反正是一言难尽啊,感觉努力没有什么意义,面试多半是看面试官的感觉,主观性很大啊,只要你技术没有太大的问题。第三次面试腾讯,面试来的比较突然,期间已经有几天没看八股什么的了,临时看了一下之前自己做的面试笔记,但是面试却异常顺利,三天闯到了三面,自己也不敢相信,三面玩感觉也良好,脑子里不得不想着一些“offer结算画面”,但是过了一会查看流程显示“流程终止”,我?哎,当时真的有苦说不出啊,也是一晚没睡。后面就逐渐开始褪去大厂梦了,看着曾经跟自己交流的牛油,朋友,认识的人,觉得他们技术不太如你,算法刷的没你多,进了大厂,但是这又如何呢?能力强不强不是你了说了,面试官说了算。也逐渐知道,不是你能力好就可以了,还得有运气,运气,运气。这个过程太累了,和自己和解吧,不用非得大厂,找个合适一点的就好,放轻松一点。今天有点心事睡不着,闲着想写一些自己的面试过程,勿喷。附上一张面试的情况,公司就不方便透露了。
怒卷的斯科特:八分运气两分实力
点赞 评论 收藏
分享
评论
2
3
分享

创作者周榜

更多
牛客网
牛客企业服务