传统的强化学习算法会使用表格的形式存储状态价值函数 V ( s ) V(s) V(s) 或动作价值函数 Q ( s , a ) Q(s, a) Q(s,a) ,但是这样的方法存在很大的局 限性。
例如,现实中的强化学习任务所面临的状态空间往往是连续的,存在无穷多个状态,在这种情况下,就不能再使用 表格对价值函数进行存储。
价值函数近似利用函数直接拟合状态价值函数或动作价值函数,降低了对存储空间的要求,有 效地解决了这个问题。
为了在连续的状态和动作空间中计算值函数 Q π ( s , a ) Q_\pi(s, a) Qπ(s,a) ,我们可以用一个函数 Q ϕ ( s , a ) Q_\phi(\boldsymbol{s}, \boldsymbol{a}) Qϕ(s,a) 来表示近似计算,称为价值函数近 似 (value function approximation)。
Q
ϕ
(
s
,
a
)
≈
Q
π
(
s
,
a
)
Q_\phi(\boldsymbol{s}, \boldsymbol{a}) \approx Q_\pi(\boldsymbol{s}, \boldsymbol{a})
Qϕ(s,a)≈Qπ(s,a)
其中,
s
、
a
\boldsymbol{s} 、 \boldsymbol{a}
s、a 分别是状态
s
s
s 和动作
a
a
a 的向量表示,函数
Q
ϕ
(
s
,
a
)
Q_\phi(\boldsymbol{s}, \boldsymbol{a})
Qϕ(s,a) 通常是一个参数为
ϕ
\phi
ϕ 的函数,比如神经网络,其输出为 一个实数,称为
Q
\mathrm{Q}
Q 网络 (Q-network)。
深度Q网络(deep Q-network,DQN) 是指基于深度学习的Q学习算法,主要结合了价值函数近似与神经网络技术,并采用目标网络和经历回放的方法进行网络的训练。
在 Q学习中,我们使用表格来存储每个状态 s s s 下采取动作 a a a 获得的奖励,即 状态-动作值函数 Q ( s , a ) Q(s, a) Q(s,a) 。然而,这种方法在状态量巨大甚至是连续的任务中,会遇到维度灾难问题,往往是不可行的。 因此,深度Q网络采用了价值函数近似的表示方法。
深度Q网络 是基于价值的算法,在基于价值的算法里面,我们学习的不是策略,而是评论员(critic)
评论员就是评价演员的策略 π \pi π 好还是不好,即策略评估。
例如,有一种评论员称为状态价值函数
V
π
V_\pi
Vπ 。例如在玩雅达利游戏,状态
s
s
s 是某一个画面,
π
\pi
π 看到某一个画面,接下来一直 到游戏结束,期望的累积奖励有多大。如图下图a所示,
V
π
V_\pi
Vπ 是一个函数,输入一个状态,它会输出一个标量。这个标量代 表演员的策略
π
\pi
π 看到状态
s
s
s 的时候,预期到游戏结束的时候,它可以获得多大的奖励。例如,假设我们在玩太空侵略者, 图下图b 所示的状态
s
s
s ,这个游戏画面,
V
π
(
s
)
V_\pi(s)
Vπ(s) 也许会很大,因为这时还有很多的怪物可以击杀,所以我们会得到很高的分 数。一直到游戏结束的时候,我们仍然有很多的分数可以获得。如下图c 所示的情况我们得到的
V
π
(
s
)
V_\pi(s)
Vπ(s) 可能就很小,因为剩 下的怪物也不多,并且红色的防护罩已经消失了,所以我们可能很快就会“死掉”。因此接下来得到预期的奖励,就不会太大。

这里要强调一下,评论员的输出是与演员有关的,状态的价值其实取决于演员,当演员改变的时候,状态价值函数的输出其实也是会跟着改变的。
评论员其实都要绑定一个演员,它是在衡量某一个演员的好坏,而不是衡量一个状态的好坏。
衡量状态价值函数 V π ( s ) V_{\pi}(s) Vπ(s)有两种方法:基于蒙特卡洛的方法和基于时序差分的方法。
基于蒙特卡洛的方法 就是让演员与环境交互,我们要看演员好不好,就让演员与环境交互,让评论员评价。评论员就统计,演员如果看到状态 s a s_a sa ,接下来的累积奖励有多大; 如果它看到状态 s b s_b sb ,接下来的累积奖励有多大。
但是实际上,我们不可能看到所有的状 态。如果我们在玩雅达利游戏,状态是图像,那么无法看到所有的状态。所以实际上 V π ( s ) V_\pi(s) Vπ(s) 是一个网络。对一个网络来 说,就算输入状态是从来都没有看过的,它也可以相办法估测一个值。怎么训练这个网络呢?
如下图所示,如果在状态 s a s_a sa ,接下来的累积奖励就是 G a G_a Ga 。也就是对这个价值函数,如果输入是状态 s a s_a sa ,正确的输出应该是 G a G_a Ga ;如果输入状态是 s b s_b sb ,正确的输出应该是 G b G_b Gb 。所以在训练的时候,它就是一个回归问题 (regression problem) 。网络的输出就是一个值, 我们希望在输入 s a s_a sa 的时候,输出的值与 G a G_a Ga 越接近越好;输入 s b s_b sb 的时候,输出的值与 G b G_b Gb 越接近越好。接下来继续训练 网络,这是基于蒙特卡洛的方法。

在基于蒙特卡洛的方法中,每次我们都要计算累积奖励,也就是一直到游戏结束得到的所有奖励总和。所以我们必须玩到游戏结束。但是有些游戏时间很长,玩到游戏结束才能更新网络,这花的时间太多了所以我们在游戏时间长的环境中,一般选择采用基于时序差分的方法。
基于时序差分的方法不需要玩到游戏结束才能更新网络,只需要在游戏的某一个状态 s t s_t st 的时候,采取动作 a t a_t at 得到奖励 r t r_t rt ,接下来进入状态 s t + 1 s_{t+1} st+1 ,就可以使用时序差分的方法。我们可以通过下式来使用时序差分的方法。
V
π
(
s
t
)
=
V
π
(
s
t
+
1
)
+
r
t
V_\pi\left(s_t\right)=V_\pi\left(s_{t+1}\right)+r_t
Vπ(st)=Vπ(st+1)+rt
假设我们现在用的是某一个策略
π
\pi
π ,在状态
s
t
s_t
st 时,它会采取动作
a
t
a_t
at ,得到奖励
r
t
r_t
rt ,接下来进入
s
t
+
1
s_{t+1}
st+1 。状态
s
t
+
1
s_{t+1}
st+1 的值与 状态
s
t
s_t
st 的值,它们的中间差了一项
r
t
r_t
rt ,这是因为我们把
s
t
+
1
s_{t+1}
st+1 的值加上得到的奖励
r
t
r_t
rt 就可以得到
s
t
s_t
st 的值。有了上式 , 在训练的时候,我们并不是直接估测
V
π
V_\pi
Vπ ,而是希望得到的结果
V
π
V_\pi
Vπ 可以满足上式 。我们是这样训练的,如下图所示, 我们把
s
t
s_t
st 输入网络,因为把
s
t
s_t
st 输入网络会得到
V
π
(
s
t
)
V_\pi\left(s_t\right)
Vπ(st) ,把
s
t
+
1
s_{t+1}
st+1 输入网络会得到
V
π
(
s
t
+
1
)
,
V
π
(
s
t
)
V_\pi\left(s_{t+1}\right) , V_\pi\left(s_t\right)
Vπ(st+1),Vπ(st) 减
V
π
(
s
t
+
1
)
V_\pi\left(s_{t+1}\right)
Vπ(st+1) 的值应 该是
r
t
r_t
rt 。我们希望它们相减的损失与
r
t
r_t
rt 接近,训练下去,更新
V
π
V_\pi
Vπ 的参数,我们就可以把
V
π
V_\pi
Vπ 函数学习出来。

蒙特卡洛方法与时序差分方法有什么差别呢?
如下图所示,蒙特卡洛方法最大的问题就是方差很大。因为我们在玩游戏 的时候,游戏本身是有随机性的,所以我们可以把
G
a
G_a
Ga 看成一个随机变量。因为我们每次到
s
a
s_a
sa 的时候,最后得到的
G
a
G_a
Ga 其 实是不一样的。我们看到同样的状态
s
a
s_{a}
sa, 最后到游戏结束的时候,因为游戏本身是有随机性的,玩游戏的模型可能也有随机性,所以我们每次得到的
G
a
G_a
Ga 是不一样的,每一次得到的
G
a
G_a
Ga 的差别其实会很大。为什么会很大呢? 因为
G
a
G_a
Ga 是很多个奖励的和。(每个步骤的奖励都可以看为一个随机变量,这么多随机变量求和,不确定性大,方差固然就大)

通过下式,我们知道 G a G_a Ga 的方差相较于某一个状态的奖励,它是比较大的。
Var [ k X ] = k 2 Var [ X ] \operatorname{Var}[k X]=k^2 \operatorname{Var}[X] Var[kX]=k2Var[X]
其中, Var 是指方差 (variance)。
如果用时序差分的方法,我们要去最小化
V
π
(
s
t
)
⟷
r
+
V
π
(
s
t
+
1
)
V_\pi\left(s_t\right) \longleftrightarrow r+V_\pi\left(s_{t+1}\right)
Vπ(st)⟷r+Vπ(st+1)
其中,
r
r
r 具有随机性。因为即使我们在
s
t
s_t
st 采取同一个动作,得到的奖励也不一定是一样的,所以
r
r
r 是一个随机变量。但
r
r
r 的方差比
G
a
G_a
Ga 要小,因为
G
a
G_a
Ga 是很多
r
r
r 的加和,时序差分只是某一个
r
r
r 而已。
G
a
G_a
Ga 的方差会比较大,
r
r
r 的方差会比较小。
但是这里我们会遇到的一个问题是 V π V_\pi Vπ 的估计不一定准确。假设 V π V_\pi Vπ 的估计不准确,我们使用上式学习出来的结果也会是 不准确的。
所以蒙特卡洛方法与时序差分方法各有优劣。其实时序差分方法是比较常用的,蒙特卡洛方法其实是比较少用 的。
下图所示为时序差分方法与蒙特卡洛方法的差别。假设有某一个评论员,它去观察某一个策略 π \pi π 与环境交互 8 个回合的 结果。有一个策略 π \pi π 与环境交互了8 次,得到了 8 次玩游戏的结果。接下来这个评论员去估测状态的值。

我们先计算 s b s_b sb 的值。状态 s b s_b sb 在 8 场游戏里都存在,其中有 6 场得到奖励 1 ,有 2 场得到奖励 0 。所以如果我们要计算期 望值,只算智能体看到状态 s b s_b sb 以以后得到的奖励。智能体一直玩到游戏结束的时候得到的累积奖励期望值是 3 / 4 3 / 4 3/4 ,计算过程 为
6
×
1
+
2
×
0
8
=
6
8
=
3
4
\frac{6 \times 1+2 \times 0}{8}=\frac{6}{8}=\frac{3}{4}
86×1+2×0=86=43
但
s
a
s_a
sa 期望的奖励到底应该是多少呢? 这里其实有两个可能的答案: 0 和
3
/
4
3 / 4
3/4 。为什么有两个可能的答案呢? 这取决于我们 用蒙特卡洛方法还是时序差分方法。用 蒙特卡洛方法与用 时序差分方法 算出来的结果是不一样的。
假如我们用蒙特卡洛方法, s a s_a sa 就出现一次,看到状态 s a s_a sa ,接下来累积奖励就是 0 ,所以 s a s_a sa 期望奖励就是 0 。但时序差分 方法在计算的时候,需要更新
V π ( s a ) = V π ( s b ) + r V_\pi\left(s_a\right)=V_\pi\left(s_b\right)+r Vπ(sa)=Vπ(sb)+r
因为我们在状态 s a s_a sa 得到奖励 r = 0 r=0 r=0 以后,进入状态 s b s_b sb ,所以状态 s a s_a sa 的奖励等于状态 s b s_b sb 的奖励加上从状态 s a s_a sa 进入状态
用蒙特卡洛方法与时序差分方法估出来的结果很有可能是不一样的。就算评论员观察到一样的训练数据,它最后估出来的 结果也不一定是一样的。为什么会这样呢? 哪一个结果比较对呢? 其实都对。因为在第一个轨迹中, s a s_a sa 得到奖励 0 以人后, 再进入 s b s_b sb 也得到奖励 0 。这里有两个可能。
(1) s a s_a sa 是一个标志性的状态,只要看到 s a s_a sa 以后, s b s_b sb 就不会获得奖励, s a s_a sa 可能影响了 s b s_b sb 。如果是使用蒙特卡洛方法,它 会把 s a s_a sa 影响 s b s_b sb 这件事考虑进去。所以看到 s a s_a sa 以后,接下来 s b s_b sb 就得不到奖励, s b s_b sb 期望的奖励是 0 。
(2) 看到 s a s_a sa 以后, s b s_b sb 的奖励是 0 这件事只是巧合,并不是 s a s_a sa 造成的,而是因为 s b s_b sb 有时候就是会得到奖励 0 ,这只是单 纯“运气”的问题。其实平常 s b s_b sb 会得到的奖励期望值是 3 / 4 3 / 4 3/4,与 s a s_a sa 是完全没有关系的。所以假设 s a s_a sa 之后会进入 s b s_b sb ,得到的 奖励按照时序差分方法来算应该是 3 / 4 3 / 4 3/4 。
不同的方法考虑了不同的假设,所以运算结果不同。
还有另外一种评论员称为Q函数,它又被称为动作价值函数。
状态价值函数的输入是一个状态,它根据状态计算出这个状态以后的期望的累积奖励(expected accumulated reward)是多少。
动作价值函数的输入是一个状态-动作对,其指在某一个状态采取某一个动作,假设我们都使用策略 π \pi π ,得到的累积奖励的期望值有多大。
Q函数有两种写法:
(1)如下图a 所示,输入是状态与动作,输出就是一个标量。这种Q函数既适用于连续动作 (动作是无法穷举的),又适 用于离散动作。
(2)如下图b 所示,输入是一个状态,输出就是多个值。这种
Q
Q
Q 函数只适用于离散动作。假设动作是离散的,比如动作就 只有 3 个可能: 往左、往右或是开火。Q函数输出的 3 个值就分别代表
a
a
a 是往左的时候的
Q
\mathrm{Q}
Q 值,
a
a
a 是往右的时候的
Q
\mathrm{Q}
Q 值, 还有
a
a
a 是开火的时候的 Q 值。

如果我们去估计Q函数,看到的结果可能如下图所示。假设我们有 3 个动作: 原地不动、向上、向下。假设在第一个状 态,不管采取哪个动作,最后到游戏结束的时候,得到的期望奖励都差不多。因为乒乓球在这个地方时,就算我们向下, 接下来我们应该还可以接到乒乓球,所以不管采取哪个动作,都相差不了太多。假设在第二个状态,乒乓球已经反弹到很 接近边缘的地方,这个时候我们采取向上的动作,才能接到乒乓球,才能得到正的奖励。如果我们站在原地不动或向下, 接下来都会错过这个乒乓球,得到的奖励就会是负的。假设在第三个状态,乒乓球离我们的球拍很近了,所以就要采取向 上的动作。假设在第四个状态,乒乓球被反弹回去,这时候采取哪个动作都差不多。这是动作价值函数的例子。

虽然我们学习的 Q \mathrm{Q} Q 函数只能用来评估某一个策略 π \pi π 的好坏,但只要有了 Q \mathrm{Q} Q 函数,我们就可以进行强化学习,就可以决定要 采取哪一个动作,就可以进行策略改进。
如下图所示,假设我们有一个初始的演员,也许一开始很差,随机的也没有关 系。初始的演员称为 π , π \pi , \pi π,π 与环境交互,会收集数据。接下来我们学习策略 π \pi π 的 Q \mathrm{Q} Q 值,去衡量一下 π \pi π 在某一个状态强制采 取某一个动作,接下来会得到的期望奖励,用时序差分方法或蒙特卡洛方法都是可以的。我们学习出一个Q函数以后,就 可以找到一个新的策略 π ′ \pi^{\prime} π′ ,策略 π ′ \pi^{\prime} π′ 会比原来的策略 π \pi π 要好 (稍后会定义什么是好) 。
所以假设我们有一个Q函数和某一 个策略 π \pi π ,根据策略 π \pi π 学习出策略 π \pi π 的 Q \mathrm{Q} Q 函数,接下来可以找到一个新的策略 π ′ \pi^{\prime} π′ ,它会比 π \pi π 要好。我们用 π ′ \pi^{\prime} π′ 取代 π \pi π ,再 去学习它的 Q函数,得到新的Q函数以后,再去寻找一个更好的策略。这样一直循环下去,策略就会越来越好。

首先要定义的是什么是好。
π
′
\pi^{\prime}
π′ 一定会比
π
\pi
π 要好,什么是好呢? 这里的好是指,对所有可能的状态
s
s
s 而言,
V
π
′
(
s
)
⩾
V_{\pi^{\prime}}(s) \geqslant
Vπ′(s)⩾
V
π
(
s
)
V_\pi(s)
Vπ(s) 。也就是我们到同一个状态
s
s
s 的时候,如果用
π
\pi
π 继续与环境交互,我们得到的奖励一定会小于等于用
π
′
\pi^{\prime}
π′ 与环境交 互得到的奖励。所以不管在哪一个状态,我们用
π
′
\pi^{\prime}
π′ 与环境交互,得到的期望奖励一定会比较大。所以
π
′
\pi^{\prime}
π′ 是比
π
\pi
π 要好的策 略。
有了Q函数以后,我们把根据下式决定动作的策略称为 π ′ \pi^{\prime} π′ ,
π ′ ( s ) = arg max a Q π ( s , a ) \pi^{\prime}(s)=\underset{a}{\arg \max } Q_\pi(s, a) π′(s)=aargmaxQπ(s,a)
π ′ \pi^{\prime} π′ 一定比 π \pi π 好。假设我们已经学习出 π \pi π 的 Q \mathrm{Q} Q 函数,在某一个状态 s s s ,把所有可能的动作 a a a 一代入 Q \mathrm{Q} Q 函数,看看哪一个 a a a 可以让Q函数的值最大,这个动作就是 π ′ \pi^{\prime} π′ 会采取的动作。
但是在这里要解决一个 arg max \arg \max argmax 操作的问题,如果 a a a 是离散的,如 a a a 只有 3 个选项,将 每个动作都代入Q函数,看哪个动作的 Q \mathrm{Q} Q 值最大,这没有问题。但如果 a a a 是连续的,我们要解决 arg max \arg \max argmax 操作问题,就不 可行。
接下来讲一下为什么用 Q π ( s , a ) Q_\pi(s, a) Qπ(s,a) 决定的 π ′ \pi^{\prime} π′ 一定会比 π \pi π 好。假设有一个策略 π ′ \pi^{\prime} π′ ,它是由 Q π Q_\pi Qπ 决定的。我们要证明对所有 的状态 s s s ,有 V π ′ ( s ) ⩾ V π ( s ) V_{\pi^{\prime}}(s) \geqslant V_\pi(s) Vπ′(s)⩾Vπ(s) 。
怎么证明呢? V π ( s ) V_\pi(s) Vπ(s) 可写为
V π ( s ) = Q π ( s , π ( s ) ) V_\pi(s)=Q_\pi(s, \pi(s)) Vπ(s)=Qπ(s,π(s))
假设在状态 s s s 下按照策略 π \pi π ,会采取的动作就是 π ( s ) \pi(s) π(s) ,我们算出来的 Q π ( s , π ( s ) ) Q_\pi(s, \pi(s)) Qπ(s,π(s)) 会等于 V π ( s ) V_\pi(s) Vπ(s) 。一般而言, Q π ( s , π ( s ) ) Q_\pi(s, \pi(s)) Qπ(s,π(s)) 不一定等于 V π ( s ) V_\pi(s) Vπ(s) ,因为动作不一定是 π ( s ) \pi(s) π(s) 。但如果这个动作是 π ( s ) , Q π ( s , π ( s ) ) \pi(s) , Q_\pi(s, \pi(s)) π(s),Qπ(s,π(s)) 是等于 V π ( s ) V_\pi(s) Vπ(s) 的。
Q π ( s , π ( s ) ) Q_\pi(s, \pi(s)) Qπ(s,π(s)) 还满足如下的关系:
Q π ( s , π ( s ) ) ⩽ max a Q π ( s , a ) Q_\pi(s, \pi(s)) \leqslant \max _a Q_\pi(s, a) Qπ(s,π(s))⩽amaxQπ(s,a)
因为 a a a 是所有动作里面可以让 Q Q Q 函数取最大值的那个动作,所以 Q π ( s , a ) Q_\pi(s, a) Qπ(s,a) 一定大于等于 Q π ( s , π ( s ) ) ∘ Q π ( s , a ) Q_\pi(s, \pi(s))_{\circ} Q_\pi(s, a) Qπ(s,π(s))∘Qπ(s,a) 中的 a a a 就是 π ′ ( s ) \pi^{\prime}(s) π′(s) ,因为 π ′ ( s ) \pi^{\prime}(s) π′(s) 输出的 a a a 可以让 Q π ( s , a ) Q_\pi(s, a) Qπ(s,a) 最大,所以我们可得
max a Q π ( s , a ) = Q π ( s , π ′ ( s ) ) \max _a Q_\pi(s, a)=Q_\pi\left(s, \pi^{\prime}(s)\right) amaxQπ(s,a)=Qπ(s,π′(s))
于是
V
π
(
s
)
⩽
Q
π
(
s
,
π
′
(
s
)
)
V_\pi(s) \leqslant Q_\pi\left(s, \pi^{\prime}(s)\right)
Vπ(s)⩽Qπ(s,π′(s))
也就是在某一个状态,如果我们按照策略
π
\pi
π 一直执行下去,得到的奖励一定会小于等于在状态
s
s
s 故意不按照
π
\pi
π 所指示的方 向,而是按照
π
′
\pi^{\prime}
π′ 的方向走一步得到的奖励。但只有第一步是按照
π
′
\pi^{\prime}
π′ 的方向走,只有在状态
s
s
s ,才按照
π
′
\pi^{\prime}
π′ 的指示走,接下 来我们就按照
π
\pi
π 的指示走。虽然只有一步之差,但我们得到的奖励一定会比完全按照
π
\pi
π 得到的奖励要大。
接下来要证
Q π ( s , π ′ ( s ) ) ⩽ V π ′ ( s ) Q_\pi\left(s, \pi^{\prime}(s)\right) \leqslant V_{\pi^{\prime}}(s) Qπ(s,π′(s))⩽Vπ′(s)
也就是,只有一步之差,我们会得到比较大的奖励。但假设每步都是不一样的,每步都按照 π ′ \pi^{\prime} π′ 而不是 π \pi π ,得到的奖励一定 会更大,即 Q π ( s , π ′ ( s ) ) Q_\pi\left(s, \pi^{\prime}(s)\right) Qπ(s,π′(s)) 是指我们在状态 s t s_t st 采取动作 a t a_t at ,得到奖励 r t r_t rt ,进入状态 s t + 1 s_{t+1} st+1 ,即
Q π ( s , π ′ ( s ) ) = E [ r t + V π ( s t + 1 ) ∣ s t = s , a t = π ′ ( s t ) ] Q_\pi\left(s, \pi^{\prime}(s)\right)=\mathbb{E}\left[r_t+V_\pi\left(s_{t+1}\right) \mid s_t=s, a_t=\pi^{\prime}\left(s_t\right)\right] Qπ(s,π′(s))=E[rt+Vπ(st+1)∣st=s,at=π′(st)]
在状态 s s s 按照 π ′ \pi^{\prime} π′ 采取某一个动作 a t a_t at ,得到奖励 r t r_t rt ,进入状态 s t + 1 , V π ( s t + 1 ) s_{t+1} , V_\pi\left(s_{t+1}\right) st+1,Vπ(st+1) 是状态 s t + 1 s_{t+1} st+1 根据策略 π \pi π 所估出来的值。因为在同样的状态采取同样的动 作,我们得到的奖励和会进入的状态不一定一样,所以需要取期望值。
因为 V π ( s ) ⩽ Q π ( s , π ′ ( s ) ) V_\pi(s) \leqslant Q_\pi\left(s, \pi^{\prime}(s)\right) Vπ(s)⩽Qπ(s,π′(s)) ,也就是 V π ( s t + 1 ) ⩽ Q π ( s t + 1 , π ′ ( s t + 1 ) ) V_\pi\left(s_{t+1}\right) \leqslant Q_\pi\left(s_{t+1}, \pi^{\prime}\left(s_{t+1}\right)\right) Vπ(st+1)⩽Qπ(st+1,π′(st+1)) ,所以我们可得
E [ r t + V π ( s t + 1 ) ∣ s t = s , a t = π ′ ( s t ) ] ⩽ E [ r t + Q π ( s t + 1 , π ′ ( s t + 1 ) ) ∣ s t = s , a t = π ′ ( s t ) ] E[rt+Vπ(st+1)∣st=s,at=π′(st)]⩽ E[rt+Vπ(st+1)∣st=s,at=π′(st)]⩽E[rt+Qπ(st+1,π′(st+1))∣st=s,at=π′(st)]
因为 Q π ( s t + 1 , π ′ ( s t + 1 ) ) = r t + 1 + V π ( s t + 2 ) Q_\pi\left(s_{t+1}, \pi^{\prime}\left(s_{t+1}\right)\right)=r_{t+1}+V_\pi\left(s_{t+2}\right) Qπ(st+1,π′(st+1))=rt+1+Vπ(st+2) ,所以我们可得
E [ r t + Q π ( s t + 1 , π ′ ( s t + 1 ) ) ∣ s t = s , a t = π ′ ( s t ) ] = E [ r t + r t + 1 + V π ( s t + 2 ) ∣ s t = s , a t = π ′ ( s t ) ] E[rt+Qπ(st+1,π′(st+1))∣st=s,at=π′(st)]=E[rt+rt+1+Vπ(st+2)∣st=s,at=π′(st)]
我们再把上式代入 V π ( s ) ⩽ Q π ( s , π ′ ( s ) ) V_\pi(s) \leqslant Q_\pi\left(s, \pi^{\prime}(s)\right) Vπ(s)⩽Qπ(s,π′(s)) ,一直算到回合结束,即
V π ( s ) ≤ Q π ( s , π ′ ( s ) ) = E [ r t + V π ( s t + 1 ) ∣ s t = s , a t = π ′ ( s t ) ] ≤ E [ r t + Q π ( s t + 1 , π ′ ( s t + 1 ) ) ∣ s t = s , a t = π ′ ( s t ) ] = E [ r t + r t + 1 + V π ( s t + 2 ) ∣ s t = s , a t = π ′ ( s t ) ] ≤ E [ r t + r t + 1 + Q π ( s t + 2 , π ′ ( s t + 2 ) ∣ s t = s , a t = π ′ ( s t ) ] = E [ r t + r t + 1 + r t + 2 + V π ( s t + 3 ) ∣ s t = s , a t = π ′ ( s t ) ] ≤ ⋯ ≤ E [ r t + r t + 1 + r t + 2 + ⋯ ∣ s t = s , a t = π ′ ( s t ) ] = V π ′ ( s ) Vπ(s)≤Qπ(s,π′(s))=E[rt+Vπ(st+1)∣st=s,at=π′(st)]≤E[rt+Qπ(st+1,π′(st+1))∣st=s,at=π′(st)]=E[rt+rt+1+Vπ(st+2)∣st=s,at=π′(st)]≤E[rt+rt+1+Qπ(st+2,π′(st+2)∣st=s,at=π′(st)]=E[rt+rt+1+rt+2+Vπ(st+3)∣st=s,at=π′(st)]≤⋯≤E[rt+rt+1+rt+2+⋯∣st=s,at=π′(st)]=Vπ′(s)
因此
V π ( s ) ⩽ V π ′ ( s ) V_\pi(s) \leqslant V_{\pi^{\prime}}(s) Vπ(s)⩽Vπ′(s)
我们可以估计某一个策略的Q函数,接下来就可以找到另外一个策略 π ′ \pi^{\prime} π′ 比原来的策略 π \pi π 还要更好。
接下来讲一些在深度 Q \mathrm{Q} Q 网络里一定会用到的技巧。第一个技巧是目标网络(target network)。我们在学习 Q \mathrm{Q} Q 函数的时候, 也会用到时序差分方法的概念。
我们现在收集到一个数据,比如在状态 s t s_t st 采取动作 a t a_t at 以后,得到奖励 r t r_t rt ,进入状态 s t + 1 s_{t+1} st+1。 根据Q函数,我们可知
Q
π
(
s
t
,
a
t
)
=
r
t
+
Q
π
(
s
t
+
1
,
π
(
s
t
+
1
)
)
Q_\pi\left(s_t, a_t\right)=r_t+Q_\pi\left(s_{t+1}, \pi\left(s_{t+1}\right)\right)
Qπ(st,at)=rt+Qπ(st+1,π(st+1))
所以我们在学习的时候,
Q
\mathrm{Q}
Q 函数输入
s
t
、
a
t
s_t 、 a_t
st、at 得到的值,与输入
s
t
+
1
、
π
(
s
t
+
1
)
s_{t+1} 、 \pi\left(s_{t+1}\right)
st+1、π(st+1) 得到的值之间,我们希望它们相差
r
t
r_t
rt ,这 与时序差分方法的概念是一样的。
但是实际上这样的输入并不好学习,假设这是一个回归问题,如下图 所示:

Q π ( s t , a t ) Q_\pi\left(s_t, a_t\right) Qπ(st,at) 是网络的输出, r t + Q π ( s t + 1 , π ( s t + 1 ) ) r_t+Q_\pi\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) rt+Qπ(st+1,π(st+1)) 是目标,目标是会变动的。当然如果我们要实现这样的训练,其实 也没有问题,就是在做反向传播的时候, Q π Q_\pi Qπ 的参数会被更新,我们会把两个更新的结果加在一起 (因为它们是同一个模 型 Q π Q_\pi Qπ ,所以两个更新的结果会加在一起)。但这样会导致训练变得不太稳定,因为假设我们把 Q π ( s t , a t ) Q_\pi\left(s_t, a_t\right) Qπ(st,at) 当作模型的 输出,把 r t + Q π ( s t + 1 , π ( s t + 1 ) ) r_t+Q_\pi\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) rt+Qπ(st+1,π(st+1)) 当作目标,我们要去拟合的目标是一直在变动的,这是不太好训练的。
所以我们会把其中一个 Q \mathrm{Q} Q 网络,通常是把右边的 Q \mathrm{Q} Q 网络固定住。在训练的时候,我们只更新左边的 Q \mathrm{Q} Q 网络的参数, 而右边的 Q \mathrm{Q} Q 网络的参数会被固定。因为右边的 Q \mathrm{Q} Q 网络负责产生目标,所以被称为目标网络。因为目标网络是固定的,所以 现在得到的目标 r t + Q π ( s t + 1 , π ( s t + 1 ) ) r_t+Q_\pi\left(s_{t+1}, \pi\left(s_{t+1}\right)\right) rt+Qπ(st+1,π(st+1)) 的值也是固定的。我们只调整左边 Q \mathrm{Q} Q 网络的参数,它就变成一个回归问题。我们希望模型输出的值与目标越接近越好,这样会最小化它的均方误差 (mean square error)。
在实现的时候,我们会把左边的 Q Q Q 网络更新多次,再用更新过的 Q Q Q 网络替换目标网络。但这两个网络不要一起更新,一起更新,结果会很容易不好。一开始这两个网络是一样的,在训练的时候,我们会把右边的 Q \mathrm{Q} Q 网络固定住,在做梯度下降的 时候,只调整左边 Q Q Q 网络的参数。我们可能更新 100 次以后才把参数复制到右边的网络中,把右边网络的参数覆盖,目标值就变了。
就好像我们本来在做一个回归问题,训练后把这个回归问题的损失降下去以后,接下来我们把左边网络的参数 复制到右边网络,目标值就变了,接下来就要重新训练。
如下图所示,我们可以通过猫追老鼠的例子来直观地理解固定目标网络的目的。猫是
Q
\mathrm{Q}
Q 估计,老鼠是
Q
\mathrm{Q}
Q 目标。一开 始,猫离老鼠很远,所以我们想让猫追上老鼠。如下图b 所示,因为 Q 目标也是与模型参数相关的,所以每次优化后,
Q
\mathrm{Q}
Q 目标也会动。这就导致一个问题,猫和老鼠都在动。如下图c 所示,猫和老鼠会在优化空间里面到处乱动,这会产生非 常奇怪的优化轨迹,使得训练过程十分不稳定。所以我们可以固定
Q
Q
Q 网络,让老鼠动得不那么频慗,可能让它每 5 步动一 次,猫则是每一步都在动。如果老鼠每 5 次动一步,猫就有足够的时间来接近老鼠,它们之间的距离会随着优化过程越来 越小,最后它们就可以拟合,拟合后就可以得到一个最好的
Q
Q
Q 网络。

第二个技巧是探索。当我们使用
Q
\mathrm{Q}
Q 函数的时候,策略完全取决于
Q
\mathrm{Q}
Q 函数。给定某一个状态,我们就穷举所有的动作,采取 让Q值最大的动作,即
a
=
arg
max
a
Q
(
s
,
a
)
a=\underset{a}{\arg \max } Q(s, a)
a=aargmaxQ(s,a)
使用
Q
\mathrm{Q}
Q 函数来决定动作与使用策略梯度不一样,策略梯度的输出是随机的,它会输出一个动作的分布,我们根据这个动作 的分布去采样,所以在策略梯度里面,我们每次采取的动作是不一样的,是有随机性的。像
Q
\mathrm{Q}
Q 函数中,如果我们采取的动 作总是固定的,会遇到的问题就是这不是一个好的收集数据的方式。
假设我们要估测某一个状态,可以采取动作
a
1
、
a
2
a_1 、 a_2
a1、a2、
a
3
a_3
a3 。我们要估测在某一个状态采取某一个动作会得到的
Q
\mathrm{Q}
Q 值,一定要在那一个状态采取过那一个动作,才能估测出它的 值。如果没有在那个状态采取过那个动作,我们其实是估测不出它的值的。如果Q函数是一个网络,这个问题可能没有那 么严重。但是一般而言,假设
Q
\mathrm{Q}
Q 函数是一个表格,对于没有见过的状态动作对,它是估不出值的。如果
Q
\mathrm{Q}
Q 函数是网络,也 会有类似的问题,只是没有那么严重。所以假设我们在某一个状态,动作
a
1
、
a
2
、
a
3
a_1 、 a_2 、 a_3
a1、a2、a3 都没有采取过,估出来的
Q
(
s
,
a
1
)
Q\left(s, a_1\right)
Q(s,a1)
Q
(
s
,
a
2
)
、
Q
(
s
,
a
3
)
Q\left(s, a_2\right) 、 Q\left(s, a_3\right)
Q(s,a2)、Q(s,a3) 的值可能都是一样的,都是一个初始值,比如 0 ,即
Q
(
s
,
a
1
)
=
0
Q
(
s
,
a
2
)
=
0
Q
(
s
,
a
3
)
=
0
Q(s,a1)=0Q(s,a2)=0Q(s,a3)=0
但是如下图所示,假设我们在状态 s s s 采取动作 a 2 a_2 a2 ,它得到的值是正的奖励, Q ( s , a 2 ) Q\left(s, a_2\right) Q(s,a2) 就会比其他动作的 Q \mathrm{Q} Q 值要大。在 采取动作的时候,谁的 Q \mathrm{Q} Q 值最大就采取谁,所以之后永远都只会采取 a 2 a_2 a2 ,其他的动作就再也不会被采取了,这就会有问 题。
比如我们去一个餐厅吃饭。假设我们点了某一样菜,比如辣子鸡,我们觉得还可以。接下来我们每次去就都会点辣子鸡,再也不点别的菜了,那我们就不知道别的菜是不是会比辣子鸡好吃,这是一样的问题。

这个问题就是探索-利用窘境(exploration-exploitation dilemma) 问题,
有两个方法可以解决这个问题: ε \varepsilon ε-贪心探索和玻尔兹曼探索 (Boltzmann exploration)。
ε
\varepsilon
ε-贪心是指我们有
1
−
ε
1-\varepsilon
1−ε 的概率会按照
Q
\mathrm{Q}
Q 函数来决定动作,可写为
a
=
{
arg
max
Q
(
s
,
a
)
,
有
1
−
ε
的概率
a
,
否则
随机
a=\left\{\right.
a=⎩
⎨
⎧argmaxQ(s,a)a, 随机 , 有 1−ε 的概率 否则
通常将
ε
\varepsilon
ε 设为一个很小的值,
1
−
ε
1-\varepsilon
1−ε 可能是
0.9
0.9
0.9 ,也就是
0.9
0.9
0.9 的概率会按照
Q
\mathrm{Q}
Q 函数来决定动作,但是我们有
0.1
0.1
0.1 的概率是随 机的。通常在实现上
ε
\varepsilon
ε 会随看时间递减。在最开始的时候,因为不知道哪个动作是比较好的,所以我们会花比较大的力气 探索。接下来,随着训练的次数越来越多,我们已经比较确定哪个动作是比较好的。我们就会减少探索,会把
ε
\varepsilon
ε 的值变 小,主要根据Q函数来决定动作,比较少随机决定动作,这就是
ε
\varepsilon
ε-念心。
在玻尔兹曼探索中,我们假设对于任意的 s 、 a , Q ( s , a ) ⩾ 0 s 、 a , Q(s, a) \geqslant 0 s、a,Q(s,a)⩾0 ,因此 a a a 被选中的概率与 e Q ( s , a ) / T e^{Q(s, a) / T} eQ(s,a)/T 呈正比,即
π
(
a
∣
s
)
=
e
Q
(
s
,
a
)
/
T
∑
a
′
∈
A
e
Q
(
s
,
a
′
)
/
T
\pi(a \mid s)=\frac{\mathrm{e}^{Q(s, a) / T}}{\sum_{a^{\prime} \in A} \mathrm{e}^{Q\left(s, a^{\prime}\right) / T}}
π(a∣s)=∑a′∈AeQ(s,a′)/TeQ(s,a)/T
其中,
T
>
0
T>0
T>0 称为温度系数。如果
T
T
T 很大,所有动作几乎以等概率选择 (探索) ; 如果
T
T
T 很小,Q值大的动作更容易被 选中 (利用); 如果
T
T
T 趋于 0 ,我们就只选择最优动作(类似模拟退火过程)。
第三个技巧是经验回放 (experience replay)。如下图所示,经验回放会构建一个回放缓冲区 (replay buffer),回放缓冲区又被称为回放内存 (replay memory)。

回放缓冲区是指现在有某一个策略 π \pi π 与环境交互,它会去收集数据,我们把所 有的数据放到一个数据缓冲区 (buffer) 里面,数据缓冲区里面存储了很多数据。比如数据缓冲区可以存储 5 万条数据,每 一笔数据就是记得说,我们之前在某一个状态 s t s_t st ,采取某一个动作 a t a_t at ,得到了奖励 r t r_t rt ,进入状态 s t + 1 s_{t+1} st+1 。我们用 π \pi π 去与环 境交互多次,把收集到的数据放到回放缓冲区里面。回放缓冲区里面的经验可能来自不同的策略,我们每次用 π \pi π 与环境交互的时候,可能只交互 10000 次,接下来我们就更新 π \pi π 了。但是回放缓区里面可以放 5 万笔数据,所以 5 万笔数据可能 来自不同的策略。回放缓冲区只有在它装满的时候,才会把旧的数据丟掉。所以回放缓冲区里面其实装了很多不同的策略的经验。
如下图所示,有了回放缓冲区以后,我们怎么训练 Q \mathrm{Q} Q 模型、怎么估 Q \mathrm{Q} Q 函数呢? 我们会迭代地训练 Q \mathrm{Q} Q 函数,在每次迭代 里面,从回放缓冲区中随机挑一个批量 (batch) 出来,即与一般的网络训练一样,从训练集里面挑一个批量出来。我们采样该批量出来,里面有一些经验,我们根据这些经验去更新Q函数。这与时序差分学习要有一个目标网络是一样的。我们采样一个批量的数据,得到一些经验,再去更新 Q Q Q 函数。

如果某个算法使用了经验回放这个技巧,该算法就变成了一个异策略的算法。
因为本来 Q \mathrm{Q} Q 是要观察 π \pi π 的经验的,但实际上 存储在回放缓冲区里面的这些经验不是通通来自于 π \pi π ,有些是过去其他的策略所留下来的经验。因为我们不会用某一个 π \pi π 就把整个回放缓冲区装满,拿去测 Q Q Q 函数, π \pi π 只是采样一些数据放到回放缓冲区里面,接下来就让 Q Q Q 去训练。所以 Q Q Q 在采 样的时候,它会采样到过去的一些数据。
这么做有两个好处。
Q:我们观察 π \pi π 的值,发现里面混杂了一些不是 π \pi π 的经验,这有没有关系?
A: 没关系。这并不是因为过去的策略与现在的策略很像,就算过去的策略与现在的策略不是很像,也是没有关系的。主 要的原因是我们并不是去采样一个轨迹,我们只采样了一笔经验,所以与是不是异策略这件事是没有关系的。就算是异策 略,就算是这些经验不是来自于 π \pi π ,我们还是可以用这些经验来估测 Q π ( s , a ) Q_\pi(s, a) Qπ(s,a) 。

上图所示为一般的深度 Q \mathrm{Q} Q 网络算法。
深度 Q \mathrm{Q} Q 网络算法是这样的,我们初始化两个网络 :估计网络 Q Q Q 和 目标网络 Q ^ , Q ^ \hat{Q} , \hat{Q} Q^,Q^ 就等于 Q Q Q ,一开始 目标网络 Q ^ \hat{Q} Q^ 与原来的 Q Q Q 网络是一样的。
在每一个回合中,我们用演员与环境交互,在每一次交互的过程中,都会得到一个 状态 s t s_t st ,会采取某一个动作 a t 。 a_{t 。} at。 怎么知道采取哪一个动作 a t a_t at 呢? 我们就根据现在的 Q函数,但是要有探索的机制。比如 我们用玻尔兹曼探索或是 ε \varepsilon ε-贪心探索,接下来得到奖励 r t r_t rt ,进入状态 s t + 1 s_{t+1} st+1 。
所以现在收集到一笔数据 ( s t 、 a t 、 r t 、 s t + 1 ) \left(s_t 、 a_t 、 r_t 、 s_{t+1}\right) (st、at、rt、st+1) ,我们将其放到回放缓冲区里面。如果回放缓冲区满了,我们就把一些旧的数据丢掉。
接下来我们就从回放缓冲区里面去采样数据,采样到的是 ( s i 、 a i 、 r i 、 s i + 1 ) \left(s_i 、 a_i 、 r_i 、 s_{i+1}\right) (si、ai、ri、si+1) 。这笔数据与刚放进去的不一定是同一笔,我们可能抽到旧的。要注意的是, 我们采样出来不是一笔数据,采样出来的是一个批量的数据,采样一些经验出来。
接下来就是计算目标。假设我们采样出 一笔数据,根据这笔数据去计算目标。目标要用目标网络
Q
^
\hat{Q}
Q^ 来计算。目标是:
y
=
r
i
+
max
a
Q
^
(
s
i
+
1
,
a
)
y=r_i+\max _a \hat{Q}\left(s_{i+1}, a\right)
y=ri+amaxQ^(si+1,a)
其中,
a
a
a 是让
Q
^
\hat{Q}
Q^ 值最大的动作。因为我们在状态
s
i
+
1
s_{i+1}
si+1 会采取的动作
a
a
a 就是可以让
Q
^
\hat{Q}
Q^ 值最大的那一个动作。接下来我们要 更新
Q
\mathrm{Q}
Q 值,就把它当作一个回归问题。我们希望
Q
(
s
i
,
a
i
)
Q\left(s_i, a_i\right)
Q(si,ai) 与目标越接近越好。
假设已经更新了一定的次数,比如 C C C 次, 设 C = 100 C=100 C=100 ,那我们就把 Q ^ \hat{Q} Q^ 设成 Q Q Q ,这就是深度Q网络算法。
Q \mathrm{Q} Q :深度 Q \mathrm{Q} Q 网络和 Q \mathrm{Q} Q 学习有什么不同?
A: 整体来说,深度 Q Q Q 网络与 Q Q Q 学习的目标价值以及价值的更新方式都非常相似。主要的不同点在于:深度 Q Q Q 网络将 Q Q Q 学习与 深度学习结合,用深度网络来近似动作价值函数,而 Q Q Q 学习则是采用表格存储;深度 Q Q Q 网络采用了经验回放的训练方法, 从历史数据中随机采样,而 Q \mathrm{Q} Q 学习直接采用下一个状态的数据进行学习。
6-1 为什么在深度
Q
Q
Q 网络中采用价值函数近似的表示方法?
6-2 评论员的输出通常与哪几个值直接相关?
6-3 我们通常怎么衡量状态价值函数
V
π
(
s
)
V_\pi(s)
Vπ(s) ? 其优势和劣势分别有哪些?
6-4 基于本章正文介绍的基于蒙特卡洛的网络方法, 我们怎么训练模型呢? 或者我们应该将其看作机 器学习中什么类型的问题呢?
6-5 基于本章正文中介绍的基于时序差分的网络方法,具体地,我们应该怎么训练模型呢?
6-6 动作价值函数和状态价值函数的有什么区别和联系?
6-7 请介绍
Q
Q
Q 函数的两种表示方法。
6-8 当得到了
Q
Q
Q 函数后, 我们应当如何找到更好的策略
π
′
\pi^{\prime}
π′ 呢? 或者说
π
′
\pi^{\prime}
π′ 的本质是什么?
6-9 解决探索-利用窘境问题的探索的方法有哪些?
6-10 我们使用经验回放有什么好处?
6-11 在经验回放中我们观察
π
\pi
π 的价值, 发现里面混杂了一些不是
π
\pi
π 的经验, 这会有影响吗?
6-1 友善的面试官:请问深度
Q
\mathrm{Q}
Q 网络是什么? 其两个关键性的技巧分别是什么?
6-2 友善的面试官:那我们继续分析! 你刚才提到的深度
Q
Q
Q 网络中的两个技巧
目标网络和经 验回放, 其具体作用是什么呢?
6-3 友善的面试官:深度
Q
\mathrm{Q}
Q 网络和
Q
\mathrm{Q}
Q 学习有什么异同点?
6-4 友善的面试官:请问, 随机性策略和确定性策略有什么区别吗?
6-5 友善的面试官:请问不打破数据相关性, 神经网络的训练效果为什么就不好?