DQN简单推导
U
t
=
R
t
+
γ
R
t
+
1
+
γ
2
R
t
+
2
+
γ
3
R
t
+
3
+
.
.
.
U_t = R_t + \gamma R_{t+1} + \gamma ^2 R_{t+2} + \gamma ^3 R_{t+3} + ...
Ut=Rt+γRt+1+γ2Rt+2+γ3Rt+3+...
Q
π
(
s
t
,
a
t
)
=
E
S
t
+
1
,
A
t
+
1
,
.
.
.
,
S
n
,
A
n
[
U
t
∣
S
t
=
s
t
,
A
t
=
a
t
]
Q_\pi (s_t, a_t) = E_{S_{t+1}, A_{t+1}, ..., S_n, A_n}[U_t|S_t = s_t, A_t = a_t]
Qπ(st,at)=ESt+1,At+1,...,Sn,An[Ut∣St=st,At=at]
Q
∗
(
s
t
,
a
t
)
=
max
π
Q
π
(
s
t
,
a
t
)
Q_*(s_t, a_t) = \max_πQ_π(s_t, a_t)
Q∗(st,at)=πmaxQπ(st,at)
我们可以这样理解
Q
∗
Q_*
Q∗:已知
s
t
s_t
st 和
a
t
a_t
at,不论未来采取什么样的策略 π,回报
U
t
U_t
Ut 的期望不可能超过
Q
∗
Q_*
Q∗。我们希望知道
Q
∗
Q_*
Q∗,因为它就像是先知一般,可以预见未来,在 t 时刻就预见 t 到 n时刻的累计奖励的期望。假如我们有
Q
∗
Q_*
Q∗这位先知,我们就遵照先知的指导,最大化未来的累计奖励。然而在实践中我们不知道
Q
∗
Q_*
Q∗ 的函数表达式。
为了近似出 Q ∗ Q_* Q∗,我们使用深度Q网络(deep Q network,缩写DQN),记作 Q(s, a; w)。其中的 w 表示神经网络中的参数。首先随机初始化 w,随后用“经验”去学习 w。学习的目标是:对于所有的 s 和 a,DQN 的预测 Q(s, a; w) 尽量接近 Q ∗ Q_* Q∗(s, a)。
训练 DQN 最常用的算法是时间差分(temporal difference,缩写 TD)。
U
t
=
R
t
+
γ
R
t
+
1
+
γ
2
R
t
+
2
+
γ
3
R
t
+
3
+
.
.
.
=
R
t
+
γ
U
t
+
1
U_t = R_t + \gamma R_{t+1} + \gamma ^2 R_{t+2} + \gamma ^3 R_{t+3} + ... = R_t + \gamma U_{t+1}
Ut=Rt+γRt+1+γ2Rt+2+γ3Rt+3+...=Rt+γUt+1
经过一系列数学推导,可以得到下面的定理。
贝尔曼方程的右边是个期望,我们可以对期望做蒙特卡洛近似。当智能体执行动作
a
t
a_t
at 之后,环境通过状态转移函数
p
(
s
t
+
1
∣
s
t
,
a
t
)
p(s_{t+1}|s_t, a_t)
p(st+1∣st,at) 计算出新状态
s
t
+
1
s_{t+1}
st+1。奖励
R
t
R_t
Rt 最多只依赖于
S
t
、
A
t
、
S
t
+
1
S_t、A_t、S_{t+1}
St、At、St+1。那么当我们观测到
s
t
、
a
t
、
s
t
+
1
s_t、a_t、s_{t+1}
st、at、st+1 时,则奖励
R
t
R_t
Rt也被观测到,记作
r
t
r_t
rt。有了四元组
(
s
t
,
a
t
,
r
t
,
s
t
+
1
)
,
(s_t, a_t, r_t, s_{t+1}),
(st,at,rt,st+1),
我们可以计算出贝尔曼方程右边期望的蒙特卡洛近似:
r
t
+
γ
⋅
max
a
∈
A
Q
∗
(
s
t
+
1
,
a
)
r_t + \gamma \cdot \max_{a \in \Alpha} Q_*({s_{t+1}, a})
rt+γ⋅a∈AmaxQ∗(st+1,a)
把
Q
∗
(
s
,
a
)
替换成神经网络
Q
(
s
,
a
;
w
)
Q_*(s, a) 替换成神经网络 Q(s, a; w)
Q∗(s,a)替换成神经网络Q(s,a;w),得到:
Q
(
s
t
,
a
t
;
w
)
⏟
预测
q
t
^
≈
r
t
+
γ
⋅
max
a
∈
A
Q
(
s
t
+
1
,
a
;
w
)
⏟
T
D
目标
y
t
^
\underbrace {Q(s_t, a_t; w)}_{预测\hat {q_t}} \approx \underbrace{r_t + \gamma \cdot \max_{a \in \Alpha} Q(s_{t+1}, a; w)}_{TD目标\hat {y_t}}
预测qt^
Q(st,at;w)≈TD目标yt^
rt+γ⋅a∈AmaxQ(st+1,a;w)
左边的
q
t
^
≜
Q
(
s
t
,
a
t
;
w
)
\hat{q_t} ≜ Q(s_t, a_t; w)
qt^≜Q(st,at;w)是神经网络在 t 时刻做出的预测,其中没有任何事实成分。右边的 TD 目标
y
t
^
\hat{y_t}
yt^ 是神经网络在 t + 1 时刻做出的预测,它部分基于真实观测到的奖励
r
t
r_t
rt。
q
t
^
\hat{q_t}
qt^和
y
t
^
\hat{y_t}
yt^两者都是对最优动作价值
Q
∗
(
s
t
,
a
t
)
Q_*(s_t, a_t)
Q∗(st,at) 的估计,但是
y
t
^
\hat{y_t}
yt^部分基于事实,因此比
q
t
^
\hat{q_t}
qt^更可信。应当鼓励
q
t
^
≜
Q
(
s
t
,
a
t
;
w
)
\hat{q_t} ≜ Q(s_t, a_t; w)
qt^≜Q(st,at;w)接近
y
t
^
\hat{y_t}
yt^。定义损失函数:
L
(
w
)
=
1
2
[
Q
(
s
t
,
a
t
,
;
w
)
−
y
t
^
]
2
L(w) = \frac{1}{2}[Q(s_t, a_t,;w) - \hat{y_t}]^2
L(w)=21[Q(st,at,;w)−yt^]2
假装
y
t
^
\hat{y_t}
yt^是常数(材料上这么写的,可以理解为是一个观测值),计算 L 关于 w 的梯度:
∇
w
L
(
w
)
=
(
q
t
^
−
y
t
^
)
⏟
T
D
误差
δ
t
⋅
∇
w
Q
(
s
t
,
a
t
;
w
)
\nabla_{w} L(w) = \underbrace{(\hat{q_t} - \hat{y_t})}_{TD误差\delta_t} \cdot \nabla_{w}Q(s_t, a_t; w)
∇wL(w)=TD误差δt
(qt^−yt^)⋅∇wQ(st,at;w)
做一步梯度下降,可以让
q
t
^
\hat{q_t}
qt^更接近
y
t
^
\hat{y_t}
yt^:
w
←
w
−
α
⋅
δ
t
⋅
∇
w
Q
(
s
t
,
a
t
;
w
)
w \leftarrow w - \alpha \cdot \delta_t \cdot \nabla_wQ(s_t, a_t; w)
w←w−α⋅δt⋅∇wQ(st,at;w)
这个公式就是训练 DQN 的 TD 算法。
训练流程
收集训练数据
算法所需数据为四元组
(
s
t
,
a
t
,
r
t
,
s
t
+
1
)
(s_t, a_t, r_t, s_{t+1})
(st,at,rt,st+1),与控制智能体运动的策略 π 无关。这就意味着可以用任何策略控制智能体与环境交互,比较常用的是 ϵ-greedy 策略:
a
t
=
{
a
r
g
m
a
x
a
Q
(
s
t
,
a
;
w
)
,
以概率
(
1
−
ϵ
)
均匀抽取
A
中的一个动作
,
以概率
ϵ
a_t = \left \{ \begin{aligned} argmax_a Q(s_t, a; w), 以概率(1-\epsilon) \\ 均匀抽取 A 中的一个动作,以概率\epsilon \end{aligned} \right.
at={argmaxaQ(st,a;w),以概率(1−ϵ)均匀抽取A中的一个动作,以概率ϵ
把智能体在一局游戏中的轨迹记作:
s
1
,
a
1
,
r
1
,
s
2
,
a
2
,
r
2
,
.
.
.
,
s
n
,
a
n
,
r
n
s_1, a_1, r_1, s_2, a_2, r_2, ..., s_n, a_n, r_n
s1,a1,r1,s2,a2,r2,...,sn,an,rn
把一条轨迹划分成 n 个
(
s
t
,
a
t
,
r
t
,
s
t
+
1
)
(s_t, a_t, r_t, s_{t+1})
(st,at,rt,st+1)这种四元组,存入数组,这个数组叫做经验回放数组(replay buffer)。
更新 DQN 参数 w
随机从经验回放数组中取出一个四元组,记作
(
s
j
,
a
j
,
r
j
,
s
j
+
1
)
(s_j, a_j, r_j, s_{j+1})
(sj,aj,rj,sj+1)。
设 DQN 当前的参数为
w
n
o
w
w_{now}
wnow,执行下面的步骤对参数做一次更新,得到新的参数
w
n
e
w
w_{new}
wnew。
- 对 DQN 做正向传播,得到 Q 值:
q j ^ = Q ( s j , a j ; w n o w ) 和 q j + 1 ^ = max a ∈ A Q ( s j + 1 , a ; w n o w ) \hat{q_j} = Q(s_j, a_j; w_{now}) 和\hat{q_{j+1}} = \max_{a \in \Alpha}Q(s_{j+1}, a; w_{now}) qj^=Q(sj,aj;wnow)和qj+1^=a∈AmaxQ(sj+1,a;wnow) - 计算 TD 目标和 TD 误差:
y j ^ = r j + γ ⋅ q j + 1 ^ 和 δ j = q j ^ − y j ^ \hat{y_j} = r_j + \gamma \cdot \hat {q_{j+1}} 和 \delta _j = \hat{q_j} - \hat{y_j} yj^=rj+γ⋅qj+1^和δj=qj^−yj^ - 对 DQN 做反向传播,得到梯度:
g j = ∇ w Q ( s j , a j ; w n o w ) g_j = \nabla_wQ(s_j,a_j; w_{now}) gj=∇wQ(sj,aj;wnow) - 做梯度下降更新 DQN 的参数:
w n e w ← w n o w − α ⋅ δ j ⋅ g j w_{new} \leftarrow w_{now} - \alpha \cdot \delta_j \cdot g_j wnew←wnow−α⋅δj⋅gj
参考 https://github.com/wangshusen/DRL/blob/master/Slides/1_Basics_2.pdf