强化学习DQN(Deep Q-Learning)、DDQN(Double DQN)
_学习记录…有错误感谢指出
Deep Q-Learning 的主要目的在于最小化以下目标函数:
J
(
ω
)
=
E
[
(
R
+
γ
max
a
∈
A
(
S
′
)
q
^
(
S
′
,
a
,
ω
)
−
q
^
(
S
,
A
,
ω
)
)
2
]
,
J(\omega) = {\rm E}\left[ {{{\left( {R + \gamma \mathop {\max }\limits_{a \in {\rm A}(S')} \hat q(S',a,\omega ) - \hat q(S,{\rm A},\omega )} \right)}^2}} \right],\
J(ω)=E[(R+γa∈A(S′)maxq^(S′,a,ω)−q^(S,A,ω))2],
在这里(S,A,R,S’)是一组随机变量
S‘表示继状态S后的下一个状态
采用梯度下降的方法实现对目标函数的最小化。
对目标函数拆分
y = R + γ max a ∈ A ( S ′ ) q ^ ( S ′ , a , ω ) (1) {\rm{y}} = R + \gamma \mathop {\max }\limits_{a \in {\rm{A}}(S')} \hat q(S',a,\omega )\tag 1 y=R+γa∈A(S′)maxq^(S′,a,ω)(1)
y ^ = q ^ ( S , A , ω ) (2) \hat y = \hat q(S,{\rm{A}},\omega )\tag 2 y^=q^(S,A,ω)(2)
可以发现,如果对目标函数求梯度,不仅 y ^ \hat{y} y^ 要对 ω \omega ω 求导,而且 y 也要对 ω \omega ω 求导。
由于 y 式中含有max,所以不易于求导,为了简化梯度下降的过程,在DQN算法中,求目标函数的梯度过程中,在一段时间内,假设 y 式中的 ω \omega ω 是常数(即对目标函数求梯度时,不对 y 求导)。
实现方法
引入两个神经网络
- 表示 y ^ \hat{y} y^ 的主神经网络(main network) q ^ ( s , a , ω ) \hat q(s,a,\omega ) q^(s,a,ω)
- 表示 y 的目标神经网络(target network) q ^ ( s , a , ω T ) \hat q(s,a,{\omega _T}) q^(s,a,ωT)
在这种定义下的目标函数为:
J
(
ω
)
=
E
[
(
R
+
γ
max
a
∈
A
(
S
′
)
q
^
(
S
′
,
a
,
ω
T
)
−
q
^
(
S
,
A
,
ω
)
)
2
]
(3)
J(\omega ) = {\rm{E}}\left[ {{{\left( {R + \gamma \mathop {\max }\limits_{a \in {\rm{A}}(S')} \hat q(S',a,{\omega _T}) - \hat q(S,{\rm{A}},\omega )} \right)}^2}} \right]\tag 3
J(ω)=E[(R+γa∈A(S′)maxq^(S′,a,ωT)−q^(S,A,ω))2](3)
ω
T
是
t
a
r
g
e
t
n
e
t
w
o
r
k
的参数
,
ω
是
m
a
i
n
n
e
t
w
o
r
k
的参数
\omega_T 是target\ network的参数,\omega 是main\ network的参数
ωT是target network的参数,ω是main network的参数
当
ω
T
\omega_T
ωT 是常数时,目标函数的梯度可以简单表示为:
∇
ω
J
=
E
[
(
R
+
γ
max
a
∈
A
(
S
′
)
q
^
(
S
′
,
a
,
ω
T
)
−
q
^
(
S
,
A
,
ω
)
)
∇
ω
q
^
(
S
,
A
,
ω
)
]
(4)
{\nabla _\omega }J = {\rm{E}}\left[ {\left( {R + \gamma \mathop {\max }\limits_{a \in {\rm{A}}(S')} \hat q(S',a,{\omega _T}) - \hat q(S,{\rm{A}},\omega )} \right){\nabla _\omega }\hat q(S,{\rm{A}},\omega )} \right]\tag 4
∇ωJ=E[(R+γa∈A(S′)maxq^(S′,a,ωT)−q^(S,A,ω))∇ωq^(S,A,ω)](4)
归纳
核心要点:
- 引入两个神经网络,分别为 main network 和 target network
为什么引入?
- 在求梯度的过程中,从数学的意义上为了方便计算梯度,引入两个神经网络分别作为预测网络与目标网络
实现细节:
- ω T \omega_T ωT 和 ω \omega ω 分别表示target network 和 main network 的权重,并且两个神经网络具有相同的结构和初始参数
- 在每一次迭代过程中,从经验仓库**(replay buffer)**中取出mini-batch个样本{ ( s , a , r , s ′ ) (s,a,r,s') (s,a,r,s′)}
- 进行梯度下降
- main network 的输入为状态s和动作a,输出结果为 q ^ ( s , a , ω ) {\hat q(s,a,\omega )} q^(s,a,ω)
- target network 将状态s和所有的动作A分别输入,针对输出结果取最大值,从而求得 max a ∈ A ( S ′ ) q ^ ( S ′ , a , ω T ) {\mathop {\max }\limits_{a \in {\rm{A}}(S')} \hat q(S',a,{\omega _T})} a∈A(S′)maxq^(S′,a,ωT),进而计算得到结果 y = R + γ max a ∈ A ( S ′ ) q ^ ( S ′ , a , ω T ) y = R + \gamma \mathop {\max }\limits_{a \in {\rm{A}}(S')} \hat q(S',a,{\omega _T}) y=R+γa∈A(S′)maxq^(S′,a,ωT)
- 计算TD error (或称目标损失函数): ( y − q ^ ( s , a , ω ) ) 2 {(y - \hat q(s,a,\omega ))^2} (y−q^(s,a,ω))2,并对其进行梯度下降,更新main network的权重 ω \omega ω
- main network 是在每一个episode都要进行更新,而 target network 是经过一定次数后,将 main network 的参数拷贝给自己用于参数更新
Experience replay(经验回放)
- 在我们收集到一些经验样本 ( s , a , r , s ′ ) {(s,a,r,s')} (s,a,r,s′) 时,并不直接按照我们收集时的顺序进行训练,而是采用经验回放的方式打乱顺序,随机选取进行训练
- **replay buffer: **我们将所有的样本存放在一个集合中,这个集合被称为replay buffer B = {(s,a,r,s’)}
- 在训练神经网络的每个episode,我们从遵从均匀分布,从replay buffer中随机取出mini-batch个样本,这个过程叫做经验回放。
伪代码(Pseudocode)
DDQN(Double DQN)
DDQN是在DQN的基础上进行的改进,两者模型结构基本一样,唯一区别在于两者的目标函数有所不同。
Y
D
Q
N
=
R
+
γ
max
a
∈
A
(
S
′
)
q
^
(
S
′
,
a
,
ω
T
)
Y
D
D
Q
N
=
R
+
γ
q
^
(
S
′
,
arg
max
a
∈
A
(
S
′
)
q
^
(
S
′
,
a
,
ω
)
,
ω
T
)
\begin{array}{l} {Y^{DQN}} = R + \gamma \mathop {\max }\limits_{a \in {\rm{A}}(S')} \hat q(S',a,{\omega _T})\\ {Y^{DDQN}} = R + \gamma \hat q(S',\mathop {\arg \max }\limits_{a \in {\rm{A}}(S')} \hat q(S',a,\omega ),{\omega _T}) \end{array}
YDQN=R+γa∈A(S′)maxq^(S′,a,ωT)YDDQN=R+γq^(S′,a∈A(S′)argmaxq^(S′,a,ω),ωT)
ω
T
是
t
a
r
g
e
t
n
e
t
w
o
r
k
的参数
\omega_T 是target\ network的参数
ωT是target network的参数
ω 是 m a i n n e t w o r k 的参数 \omega 是main\ network的参数 ω是main network的参数
Double DQN 的最优动作是根据目前正在更新的网络 main network 选择的,只是action value的值是由 target network 计算而得
DQN 的最优动作是由 target network 而来
引入DDQN的意义
DDQN由当前的main network选择动作,而DQN是由target network选择动作,所以前者计算的Q值是会小于等于后者。(这是因为DDQN由main network选择了动作之后,由target network计算Q值,而DQN直接通过target network计算从最大的Q值,使得DDQN的选择的Q值一定小于或等于DQN)这在一定程度上缓解了Q值得高估问题,使Q值更接近真实值。
Reference:
DQN部分
DDQN部分!](https://img-blog.csdnimg.cn/dcb07ab71df94e70ae009e71369c33cb.png#pic_center)