本次要总结分享的是DeepMind出品的强化学习经典DQN原始论文,论文链接DQN Paper,DeepMind使用该DQN方法,在某些电玩游戏上,机器表现超越人类。
动机和创新点
- 本篇论文所提方法是第一个将深度网络和强化学习结合起来进行训练的方法,具体而言,将深度网络(卷积网络)提取高维特征,使用Q-learning的学习方式来训练整个网络。
- 对于一些高维复杂场景,状态特征很难通过人工特征工程的方式提取,这对传统的一些强化学习算法带来挑战,而近些年流行的深度学习,能很好的从高维特征提取到高级特征,并且在自然语言处理、图像、语音等领域得到广泛的应用。
- 但是对于深度学习与强化学习的结合会面临以下几个挑战
- 大部分深度学习的应用,都需要大量标注好的训练样本,而对于强化学习算法,必须能从稀疏、充满噪声、延迟的奖励信息中去学习,与监督学习中直接学习input和target关联相比,强化学习并没有那么有效率,对样本的利用率较低。
- 大多数深度学习算法都是假设样本间是独立的,而在强化学习中,样本间通常是高度相关的,例如一个episode的样本是
马尔科夫
序列。 - 大多数深度学习算法都是假设样本是符合固定的分布,而在强化学习中,随着算法学习新的行为和奖励,数据分布通常会发生变化。
背景
符号定义
- ε \varepsilon ε:游戏环境
- a t a_t at: t t t 时刻采取的动作,其中 a t ∈ A ; A = { 1 , . . . , K } a_t \in A; \ A=\{1,...,K\} at∈A; A={1,...,K}
- x t x_t xt: t t t 时刻的游戏环境表征, x t ∈ R d x_t \in R^d xt∈Rd,可能是游戏原始图像,或是人工提取的特征向量。
- r t r_t rt: t t t 时刻根据游戏状态得到的奖励,在游戏里就是得分,这个奖励得分可能是有延迟性的(例如某些游戏到最后一步或者特定步后才能获得得分),因此可能依赖于之前一系列动作和游戏状态。
- s t s_t st: t t t 时刻游戏状态, s t = x 1 , a 1 , x 2 , . . . , a t − 1 , x t s_t = x_1, a_1, x_2,...,a_{t-1},x_t st=x1,a1,x2,...,at−1,xt,因为如果仅仅根据 x t x_t xt 很难理解当前游戏状态。假设每个序列都是有限长度的,这就会产生大量但是长度有限的MDP(马尔科夫决策过程),对于每个序列都是一个状态。
数学推导
我们之前总结过The Bellman Equation,从这里我们知道,强化学习的目标是最大化未来奖励:
R
t
=
∑
t
′
=
t
T
γ
t
′
−
t
r
t
′
R_t=\sum_{t'=t}^{T}\gamma^{t'-t}r_{t'}
Rt=t′=t∑Tγt′−trt′
上式中 T T T 为MDP序列长度。
根据The Bellman Equation得到optimal action-value function,也就是:
Q
∗
(
s
,
a
)
=
m
a
x
π
E
[
R
t
∣
s
t
=
s
,
a
t
=
a
,
π
]
Q^{*}(s,a)=\underset{\pi}{max}E[R_t|s_t=s, a_t=a, \pi]
Q∗(s,a)=πmaxE[Rt∣st=s,at=a,π]
等价于这种迭代形式:
Q
∗
(
s
,
a
)
=
E
s
′
∼
ε
[
r
+
γ
m
a
x
a
′
Q
∗
(
s
′
,
a
′
)
∣
s
,
a
]
Q^{*}(s,a) = E_{s'\sim\varepsilon}[r+\gamma \underset{a'}{max}Q^{*}(s',a')|s,a]
Q∗(s,a)=Es′∼ε[r+γa′maxQ∗(s′,a′)∣s,a]
这里的 π \pi π 是指策略函数。
上述这种
Q
Q
Q 函数,我们可以用深度网络去拟合,那么我们称这种深度网络为
Q
−
n
e
t
w
o
r
k
Q-network
Q−network,其损失函数为:
L
i
(
θ
i
)
=
E
s
,
a
∼
p
(
.
)
[
(
y
i
−
Q
(
s
,
a
;
θ
i
)
2
]
L_i(\theta_i) = E_{s,a\sim p(.)}[(y_i-Q(s,a;\theta_i)^2]
Li(θi)=Es,a∼p(.)[(yi−Q(s,a;θi)2]
上述 y i = E s ′ ∼ ε [ r + γ m a x a ′ Q ∗ ( s ′ , a ′ ) ∣ s , a ] y_i=E_{s'\sim\varepsilon}[r+\gamma \underset{a'}{max}Q^{*}(s',a')|s,a] yi=Es′∼ε[r+γa′maxQ∗(s′,a′)∣s,a], i i i 表示第 i i i 次迭代, p ( s , a ) p(s,a) p(s,a) 表示产生的动作行为概率分布。在训练时,我们将第 i − 1 i-1 i−1次更新得到的参数 θ i − 1 \theta_{i-1} θi−1 固定好,然后按照 L i ( θ i ) L_i(\theta_i) Li(θi) 进行参数更新。
- 注意上述算法是 model-free模式的,他是使用游戏环境产生的样本来进行学习的,而无需显示的去对游戏环境进行估计。
- 同时他也是 off-policy的学习方式,是采用贪心策略采取动作的,即 a = m a x a Q ( s , a ; θ ) a=\underset{a}{max}Q(s,a;\theta) a=amaxQ(s,a;θ),这就需要确保积累和探索了足够多的状态空间,在实际操作中,通常采用 ε-greedy strategy,也即随机产生的概率大于 1 − ε 1-\varepsilon 1−ε时,则在合法动作空间内随机产生一个动作。
算法流程
首先我们存储Agent与游戏环境交互产生的样本,如
e
t
=
{
s
t
,
a
t
,
r
t
,
s
t
+
1
}
e_t=\{s_t, a_t, r_t, s_{t+1}\}
et={st,at,rt,st+1},存入到data-set
D
=
e
1
,
e
2
,
.
.
.
,
e
N
D=e_1, e_2,...,e_N
D=e1,e2,...,eN,这个我们称之为
r
e
p
l
a
y
m
e
m
o
r
y
replay\ memory
replay memory,在算法的内层循环里,采用Q-learning 的更新方式,每次从
D
D
D 中随机采样minibatch样本,进行学习,来更新network的参数
θ
\theta
θ,在选择执行的动作时,采用ε-greedy strategy,也即随机产生的概率大于
1
−
ε
1-\varepsilon
1−ε时,则在合法动作空间内随机产生一个动作,反之直接从
Q
Q
Q 网络中取概率最大的动作,与游戏环境进行交互,产生新的样本。
上述做法有以下三个优点:
- 因为是off-policy学习方式,所以每个样本可以重复利用多次,提高数据利用效率
- 因为产生的样本之间是连续的,具有强相关性,不是相互独立不利于网络学习,算法里的随机采样操作打破了样本间相关性。
- 如果采用on-policy学习方式,也即是执行一步学习一步(没有 r e p l a y m e m o r y replay\ memory replay memory),然后陷入震荡或者局部最优的情况,本算法中采用的 e x p e r i e n c e r e p l a y experience\ replay experience replay,行为分布在其先前的许多状态上被平均化,从而平滑学习并避免参数中的振荡或发散。
显然上述算法流程中,有两个地方需要进行估计:
- Q ( ϕ j , a j ; θ ) Q(\phi_j, a_j; \theta) Q(ϕj,aj;θ) :当前状态下执行动作 a j a_j aj 的累积期望价值估计
- m a x a ′ Q ( ϕ j + 1 , a ′ ; θ ) \underset{a'}{max}Q(\phi_{j+1}, a'; \theta) a′maxQ(ϕj+1,a′;θ):下一个状态最大累积期望价值估计
在DQN实现代码里,分别用两个神经网络来估计上述两个 Q Q Q。
代码实现
代码实现这里参考的是莫烦AI教程代码,写的清晰易懂,推荐大家一读。莫烦教程里已经对代码细节进行了详细的讲解,这里只总结下几个我认为比较重要的点。
- 一个样本 ( s , a , r , s _ ) (s,a, r,s\_) (s,a,r,s_):表示在 s s s 下执行动作 a a a 后所获得的奖励 r r r,后的状态,
- 代码里用eval_net 和 target_net 分别估计 Q ( ϕ j , a j ; θ ) Q(\phi_j, a_j; \theta) Q(ϕj,aj;θ)、 m a x a ′ Q ( ϕ j + 1 , a ′ ; θ ) \underset{a'}{max}Q(\phi_{j+1}, a'; \theta) a′maxQ(ϕj+1,a′;θ),并且会每隔一定时间,就会将eval_net replace覆盖 target_net,对于target_net 只要max操作就行,而 eval_net输出中 需要将动作a对应的输出gather出来。
- 存储Agent与环境交互产生的样本 ( s , a , r , s _ ) (s,a, r,s\_) (s,a,r,s_),进行off-policy的学习,不断的训练eval_net 和 target_net 。
- 采用ε-greedy strategy,当产生的概率小于等于ε时,则选择 Q Q Q 输出概率最大的动作,否则在合法动作空间里随机产生动作。并且随着学习的进行ε 越来越大。
一些改进
Double DQN
在原始DQN中,用eval_net 和 target_net 分别估计
Q
(
ϕ
j
,
a
j
;
θ
)
Q(\phi_j, a_j; \theta)
Q(ϕj,aj;θ)、
m
a
x
a
′
Q
(
ϕ
j
+
1
,
a
′
;
θ
)
\underset{a'}{max}Q(\phi_{j+1}, a'; \theta)
a′maxQ(ϕj+1,a′;θ),实际上eval_net 和 target_net 这两个网络在网络更新上存在时延(定期覆盖),
Q
m
a
x
Q_{max}
Qmax 存在误差;并且实际实验发现,
m
a
x
a
′
Q
(
ϕ
j
+
1
,
a
′
;
θ
)
\underset{a'}{max}Q(\phi_{j+1}, a'; \theta)
a′maxQ(ϕj+1,a′;θ) 存在
o
v
e
r
e
s
t
i
m
a
t
e
overestimate
overestimate。在Double DQN,我们用
e
v
a
l
_
n
e
t
eval\_net
eval_net 预测
s
_
s\_
s_ 得到概率最大的动作
a
′
a'
a′,然后在
t
a
r
g
e
t
_
n
e
t
target\_net
target_net 中得出
a
′
a'
a′ 的概率。其他的和原始DQN一致。
也即原始DQN的
y
j
y_j
yj 为:
Y
j
=
R
j
+
γ
m
a
x
a
′
Q
(
ϕ
j
+
1
,
a
′
;
θ
)
Y_j = R_{j} + \gamma \underset{a'}{max}\ Q(\phi_{j+1}, a'; \theta)
Yj=Rj+γa′max Q(ϕj+1,a′;θ)
在Double DQN中
y
i
y_i
yi 为:
Y
j
=
R
j
+
γ
Q
(
ϕ
j
+
1
,
a
r
g
m
a
x
a
Q
(
ϕ
j
+
1
,
a
;
θ
j
)
,
θ
j
−
1
)
Y_j = R_{j} + \gamma\ Q(\phi_{j+1}, \underset{a}{argmax} Q(\phi_{j+1}, a; \theta_j), \theta_{j-1})
Yj=Rj+γ Q(ϕj+1,aargmaxQ(ϕj+1,a;θj),θj−1)
也可以这样理解:
t
a
r
g
e
t
_
Q
=
t
a
r
g
e
t
_
Q
(
s
_
,
a
r
g
m
a
x
a
(
e
v
a
l
_
Q
(
s
_
,
a
a
l
l
)
)
)
target\_Q= target\_Q(s\_, \underset{a}{argmax}(eval\_Q(s\_, a_{all})))
target_Q=target_Q(s_,aargmax(eval_Q(s_,aall)))
简而言之:区别就在于 这里的 target_net 里的最高奖励动作 是 由 eval_net 产生的,而不是直接reduce_max( target_net)。
Prioritized Experience Replay
因为原始的DQN,每次将Agent与环境交互产生的样本存储起来,然后进行mini_batch的学习,但是这种随机采样的方式,可能比较低效,因为可以思考带权重的采样方式,比如某个样本,模型学习的不好,在采样时应该给予比较大概率,在这里直接将 a b s ( s e l f . q _ t a r g e t − s e l f . q _ e v a l ) , a x i s = 1 ) abs(self.q\_target - self.q\_eval), axis=1) abs(self.q_target−self.q_eval),axis=1) 作为样本采样权重,这样学习起来必然效率更高。但是如何快速的计算每个样本的权重,以及根据权重快速采样呢?论文中提出使用一种 s u m T r e e sumTree sumTree 的结构。这里就不详细讲了。
个人总结
- 莫烦的强化学习教程其实以及非常详细,讲解的也非常通俗易懂,但是对于要应用的同学,还是需要自己精读相关论文,了解其中细节,才能深刻理解。
- 正是因为DQN中有 m a x a ′ Q ( ϕ j + 1 , a ′ ; θ ) \underset{a'}{max}Q(\phi_{j+1}, a'; \theta) a′maxQ(ϕj+1,a′;θ),限制了只能在离散的动作空间场景内应用。
参考
- https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf
- https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/DQN2/