DQN算法
上一节课讲到的Q-learning 算法存在一定的缺点,那就是在大范围状态空间中的数据处理能力不足。造成这种缺点的原因是其采用了表格的方式来存储Q值造成的,可以试想一下围棋的状态,它是有数万个状态的,如果以此来建立一个表格,将会在表格的查询、修改、存储上就要占用计算机很多的资源,使得计算机的学习效率降低。 这时我们就想能不能找到一个函数,使得我给这个函数一个状态作为输入,他就能输出在这个状态下所做动作的Q值。而神经网络就是非常适合做这件事情的,采用神经网络来拟合值函数,把状态作为输入,输出为状态值函数,根据状态值函数选择动作。
DQN算法描述
利用神经网络逼近值函数的过程如图所示,整个学习过程也就是学习神经网络的参数
θ
\theta
θ,当神经网络训练完成后,参数
θ
\theta
θ也就确定下来,对应值函数Q(s,a;
θ
\theta
θ)就不再发生变化,这时候训练过程就收敛了。 这里就是DQN的第一个特点,引入了神经网络,利用神经网络去拟合Q表,避免了因状态过多而造成的资源浪费。 在训练过程中,因为这些数据具有很强的时序性,所以它们之间必然会存在相关性,利用这些数据去训练Agent很有可能会造成Agent按照固定策略去学习,因此我们要打破这种相关性。这里就有了DQN算法的第二个特点,引入了记忆库,利用经验回放机制,使得在进行网络更新时输入的数据符合独立同分布,打破了数据之间的相关性。 相比传统的Q-learning算法更新Q值,DQN算法是对网络参数的更新,我们依然采用梯度下降的方式去更新
θ
\theta
θ,公式如下:
θ
t
+
1
=
θ
t
+
α
[
r
+
γ
max
?
a
′
Q
(
s
′
,
a
′
;
θ
)
?
Q
(
s
,
a
;
θ
)
]
?
Q
(
s
,
a
;
θ
)
\begin{align} {\theta}_{t+1}=\theta_t+\alpha[r+\gamma{\max_{a'}Q(s',a';\theta)}-Q(s,a;\theta)]{\nabla}Q(s,a;\theta) \end{align}
θt+1?=θt?+α[r+γa′max?Q(s′,a′;θ)?Q(s,a;θ)]?Q(s,a;θ)?? 但这个公式里面计算TD目标的动作值函数使用的参数
θ
\theta
θ与值函数计算梯度下降使用的参数
θ
\theta
θ相同,这样获得的数据也会具有相关性。这里就有了DQN的第三个特点,**引入目标网络,利用延后更新的目标网络计算
θ
\theta
θ,极大的提高了网络训练的稳定性和收敛性。**这样
θ
\theta
θ的更新公式就变成了:
θ
t
+
1
=
θ
t
+
α
[
r
+
γ
max
?
a
′
Q
(
s
′
,
a
′
;
θ
′
)
t
a
r
g
e
t
Q
?
N
e
t
w
o
r
k
?
Q
(
s
,
a
;
θ
)
e
v
a
l
]
?
Q
(
s
,
a
;
θ
)
\begin{align} {\theta}_{t+1}=\theta_t+\alpha[\underset{targetQ-Network }{r+\gamma{\max_{a'}Q(s',a';\theta{'})}}-\underset{eval }{Q(s,a;\theta)}]{\nabla}Q(s,a;\theta) \end{align}
θt+1?=θt?+α[targetQ?Networkr+γa′max?Q(s′,a′;θ′)??evalQ(s,a;θ)?]?Q(s,a;θ)?? TD目标网络使用的是参数
θ
′
\theta{'}
θ′,TD网络中的参数并不是在训练过程中每一步都更新的,而是固定一定的步数将价值网络保存下来的参数复制到TD网络中,他自身不会去通过训练更新参数,而是仅用来计算。通过设置独立的TD目标网络和暂时冻结的神经网络参数降低获得的数据的相关性,保证神经网络的稳定性。
DQN算法流程
初始化记忆库D,设置存储容量为N,使用随机数值初始化参数
θ
\theta
θ,令
θ
′
=
θ
\theta{'}=\theta
θ′=θ 重复执行每一个情节; 给定初始状态s; ??重复执行每一个情节中的每一步; ??在状态
s
t
s_t
st?执行动作
a
t
a_t
at?获得奖赏
r
t
r_t
rt? ,使得Agent状态由
s
t
→
s
t
+
1
s_t{\to}s_{t+1}
st?→st+1?; ??将{
s
t
,
a
t
,
r
t
,
s
t
+
1
s_t,a_t,r_t,s_{t+1}
st?,at?,rt?,st+1?}存储进记忆库D中; ??从记忆库中均匀采样一个样本数据batch计算q_eval和q_target; ??执行一次梯度下降,更新价值网络参数
θ
=
θ
+
Δ
θ
\theta=\theta+\Delta\theta
θ=θ+Δθ; ??每隔C步更新一次TD目标网络参数
θ
′
\theta{'}
θ′; ??判断
s
t
s_t
st?是否处于终止状态,若是,结束当前情节;否则
s
t
←
s
t
+
1
s_t{\leftarrow}s_{t+1}
st?←st+1?(这里的意思是赋值,不是状态跳转)继续循环 ??判断是否达到提前设置好的最大训练次数,若是,结束当前情节;否则继续训练;
|