Deep Q-Learning
强化学习的求解方法,无论是动态规划DP,蒙特卡罗方法MC,还是时序差分TD,使用的状态都是离散的有限个状态集合 S S S。此时问题的规模比较小,比较容易求解。但是假如我们遇到复杂的状态集合呢?甚至很多时候,状态是连续的,那么就算离散化后,集合也很大,此时我们的传统方法(如Q-Learning),根本无法在内存中维护这么大的一张Q表。
值函数逼近
由于问题的状态集合规模大,一个可行的建模方法是价值函数的近似表示。从数学角度来看,函数逼近方法可以分为参数逼近和非参数逼近,因此强化学习值函数估计可以分为参数化逼近和非参数化逼近。其中参数化逼近又分为线性参数化逼近和非线性化参数逼近。
这一节,我们主要介绍参数化逼近。方法是我们引入一个状态价值函数 v ^ \hat{v} v^, 这个函数由参数 θ \theta θ描述,并接受状态 s s s作为输入,计算后得到状态 s s s的价值,我们将逼近的值函数写为: υ ^ ( s , θ ) \hat{\upsilon}\left(s,\theta\right) υ^(s,θ)。类似的,引入一个动作价值函数 q ^ \hat{q} q^,这个函数由参数 θ \theta θ描述,并接受状态 s s s与动作 a a a作为输入,计算后得到动作价值,我们将逼近的值函数写为: q ^ ( s , a , θ ) \hat{q}(s, a, \theta) q^(s,a,θ)。
当逼近的值函数结构确定时,那么值函数的逼近就等价于参数的逼近。值函数的更新也就等价于参数的更新。也就是说,我们需要利用试验数据来更新参数值。
函数逼近
υ
^
(
s
,
θ
)
\hat{\upsilon}\left(s,\theta\right)
υ^(s,θ)的过程是一个监督学习的过程,其数据和标签对为:
(
S
t
,
U
t
)
\left(S_t,U_t\right)
(St,Ut), 其中
U
t
U_t
Ut等价于蒙特卡罗方法中的
G
t
G_t
Gt,TD方法中的
r
+
γ
Q
(
s
′
,
a
′
)
r+\gamma Q\left(s',a'\right)
r+γQ(s′,a′),以及
T
D
(
λ
)
TD\left(\lambda\right)
TD(λ)中的
G
t
λ
G_{t}^{\lambda}
Gtλ。
训练的目标函数为:
a r g m i n θ ( q ( s , a ) − q ^ ( s , a , θ ) ) 2 argmin_{\theta}\left(q\left(s,a\right)-\hat{q}\left(s,a,\theta\right)\right)^2 argminθ(q(s,a)−q^(s,a,θ))2
值函数可以采用线性逼近也可以采用非线性逼近。非线性逼近常用的是神经网络。下面我们讨论非线性逼近。
DQN
本部分主要讲解DQN,也就是DeepMind发表在Nature上的一篇论文。题目是:Human-level control through deep reinforcement learning
Q-learning算法是1989年Watkins提出来的,2015年Nature论文所提出的DQN就是在Q-learning的基础上修改得到的。DQN对Q-learning的修改主要体现在三个方面:
(1)DQN利用深度卷积神经网络逼近值函数;
(2)DQN利用了经验回放对强化学习的学习过程进行训练;
(3)DQN独立设置了目标网络来单独处理时间差分算法中的TD偏差。
(1)DQN利用深度卷积神经网络逼近行为值函数
值函数利用神经网络进行逼近,属于非线性逼近。虽然逼近方法不同,但都是参数逼近。这里的值函数对应着一组参数,在神经网络里参数是每层网络的权重,我们用
θ
\theta
θ 表示。用公式表示值函数为:
Q
(
s
,
a
;
θ
)
Q\left(s,a;\theta\right)
Q(s,a;θ)。我们这时候对值函数进行更新时其实更新的是参数
θ
\theta
θ,当网络结构确定时,
θ
\theta
θ就代表值函数。DQN所用的网络结构是三个卷积层加两个全连接层,如图:
(2)DQN利用了经验回放对强化学习的学习过程进行训练
人在睡觉的时候,海马体会把一天的记忆重放给大脑皮层。利用这个启发机制,DeepMind团队的研究人员构造了一种神经网络的训练方法:经验回放。
通过经验回放为什么可以令神经网络的训练收敛且稳定?
原因是:对神经网络进行训练时,存在的假设是独立同分布。而通过强化学习采集到的数据之间存在着关联性,利用这些数据进行顺序训练,神经网络当然不稳定。经验回放可以打破数据间的关联。具体是这么做的:
在强化学习过程中,智能体将数据存储到一个数据库中,然后利用均匀随机采样的方法从数据库中抽取数据,然后利用抽取的数据对神经网络进行训练。这种经验回放的技巧可以打破数据之间的关联性。
(3)DQN设置了目标网络来单独处理时间差分算法中的TD偏差
利用神经网络对值函数进行逼近时,值函数更新的是参数
θ
\theta
θ,更新方法是梯度下降法。因此值函数更新实际上变成了监督学习的一次更新过程,其梯度下降法为:
θ t + 1 = θ t + α [ r + γ max a ′ Q ( s ′ , a ′ ; θ ) − Q ( s , a ; θ ) ] ∇ Q ( s , a ; θ ) \theta_{t+1}=\theta_{t}+\alpha\left[r+\gamma \max _{a^{\prime}} Q\left(s^{\prime}, a^{\prime} ; \theta\right)-Q(s, a ; \theta)\right] \nabla Q(s, a ; \theta) θt+1=θt+α[r+γmaxa′Q(s′,a′;θ)−Q(s,a;θ)]∇Q(s,a;θ)
其中
r
+
γ
max
a
′
Q
(
s
′
,
a
′
;
θ
)
r+\gamma\max_{a'}Q\left(s',a';\theta\right)
r+γmaxa′Q(s′,a′;θ)为TD目标,在计算
max
a
′
Q
(
s
′
,
a
′
;
θ
)
\max_{a'}Q\left(s',a';\theta\right)
maxa′Q(s′,a′;θ)值时用到的网络参数为
θ
\theta
θ。
我们称计算TD目标时所用的网络为TD网络。以往的神经网络逼近值函数时,计算TD目标的动作值函数所用的网络参数
θ
\theta
θ,与梯度计算中要逼近的值函数所用的网络参数相同,这样就容易使得数据间存在关联性,训练不稳定。为了解决这个问题,DeepMind提出计算TD目标的网络表示为
θ
−
\theta^-
θ−
;计算值函数逼近的网络表示为
θ
\theta
θ;用于动作值函数逼近的网络每一步都更新,而用于计算TD目标的网络每隔固定的步数更新一次。
因此值函数的更新变为:
θ t + 1 = θ t + α [ r + γ max a ′ Q ( s ′ , a ′ ; θ − ) − Q ( s , a ; θ ) ] ∇ Q ( s , a ; θ ) \theta_{t+1}=\theta_{t}+\alpha\left[r+\gamma \max _{a^{\prime}} Q\left(s^{\prime}, a^{\prime} ; \theta^{-}\right)-Q(s, a ; \theta)\right] \nabla Q(s, a ; \theta) θt+1=θt+α[r+γmaxa′Q(s′,a′;θ−)−Q(s,a;θ)]∇Q(s,a;θ)
DQN的算法流程
输入:迭代轮数
T
T
T,状态特征维度
n
n
n, 动作集
A
A
A, 步长
α
α
α,衰减因子
γ
γ
γ, 探索率
ϵ
ϵ
ϵ, 当前
Q
Q
Q网络
Q
Q
Q,目标
Q
Q
Q网络
Q
′
Q^{\prime}
Q′, 批量梯度下降的样本数
m
m
m,目标
Q
Q
Q网络参数更新频率
C
C
C。
输出:
Q
Q
Q网络参数
- 随机初始化所有的状态和动作对应的价值 Q Q Q. 随机初始化当前 Q Q Q网络的所有参数 w w w,初始化目标 Q Q Q网络 Q ′ Q^{\prime} Q′的参数 w ′ = w w^{\prime}=w w′=w。清空经验回放的集合 D D D。
- for i from 1 to
T
T
T,进行迭代:
a) 初始化 S S S为当前状态序列的第一个状态, 拿到其特征向量 ϕ ( S ) ϕ(S) ϕ(S)
b) 在 Q Q Q网络中使用 ϕ ( S ) ϕ(S) ϕ(S)作为输入,得到 Q Q Q网络的所有动作对应的 Q Q Q值输出。用 ϵ − ϵ− ϵ−贪婪法在当前 Q Q Q值输出中选择对应的动作 A A A
c) 在状态 S S S执行当前动作 A A A,得到新状态 S ′ S^{\prime} S′对应的特征向量 ϕ ( S ′ ) \phi\left(S^{\prime}\right) ϕ(S′)和奖励 R R R,是否终止状态is_end
d) 将 { ϕ ( S ) , A , R , ϕ ( S ′ ) , i s − e n d } \left\{\phi(S), A, R, \phi\left(S^{\prime}\right), i s_{-} e n d\right\} {ϕ(S),A,R,ϕ(S′),is−end}这个五元组存入经验回放集合 D D D
e) S = S ′ S=S^{\prime} S=S′
f) 从经验回放集合 D D D中采样 m m m个样本 { ϕ ( S j ) , A j , R j , ϕ ( S j ′ ) , i s − e n d j } , j = 1 , 2 , , , m \left\{\phi\left(S_{j}\right), A_{j}, R_{j},\phi\left(S_{j}^{\prime}\right), i s_{-} e n d_{j}\right\}, j=1,2,,, m {ϕ(Sj),Aj,Rj,ϕ(Sj′),is−endj},j=1,2,,,m计算当前目标Q值 y j y_{j} yj:
y j = { R j i s − e n d j i s t r u e R j + γ max a ′ Q ′ ( ϕ ( S j ′ ) , A j ′ , w ′ ) i s − e n d j i s f a l s e y_{j}=\left\{\begin{array}{ll}{R_{j}} & {i s_{-} e n d_{j}}\quad is \quad true\\ {R_{j}+\gamma \max _{a^{\prime}} Q^{\prime}\left(\phi\left(S_{j}^{\prime}\right), A_{j}^{\prime}, w^{\prime}\right)} & {i s_{-} e n d_{j}}\quad is\quad false\end{array}\right. yj={RjRj+γmaxa′Q′(ϕ(Sj′),Aj′,w′)is−endjistrueis−endjisfalse
g) 使用均方差损失函数 1 m ∑ j = 1 m ( y j − Q ( ϕ ( S j ) , A j , w ) ) 2 \frac{1}{m} \sum_{j=1}^{m}\left(y_{j}-Q\left(\phi\left(S_{j}\right), A_{j}, w\right)\right)^{2} m1∑j=1m(yj−Q(ϕ(Sj),Aj,w))2,通过神经网络的梯度反向传播来更新 Q Q Q网络的所有参数 w w w
h) 如果 T T T% C C C=1,则更新目标 Q Q Q网络参数 w ′ = w w^{\prime}=w w′=w
i) 如果 S ′ S^{\prime} S′是终止状态,当前轮迭代完毕,否则转到步骤 b)
注意,上述第二步的f步和g步的 Q Q Q值计算也都需要通过 Q Q Q网络计算得到。另外,实际应用中,为了算法较好的收敛,探索率 ϵ ϵ ϵ需要随着迭代的进行而变小。
参考文献:
[1]https://www.cnblogs.com/pinard/p/9756075.html
[2]https://zhuanlan.zhihu.com/p/26052182