深度强化学习(三)DQN与Q学习
一.DQN
通过神经网络来近似最优动作价值函数 Q ∗ ( a t , s t ) Q_*(a_t,s_t) Q∗(at,st),在实践中, 近似学习“先知” Q ⋆ Q_{\star} Q⋆ 最有效的办法是深度 Q \mathrm{Q} Q网络 (deep Q network, 缩写 DQN), 记作 Q ( s , a ; w ) Q(s, a ; \boldsymbol{w}) Q(s,a;w).训练DQN最常用的算法是时间差分(temporaldifference,缩写TD)
在上一节中我们推导了最优贝尔曼方程
Q
⋆
(
s
t
,
a
t
)
⏟
U
t
的期望
=
E
S
t
+
1
∼
p
(
⋅
∣
s
t
,
a
t
)
[
R
t
+
γ
⋅
max
A
t
+
1
∈
A
Q
⋆
(
S
t
+
1
,
A
t
+
1
)
⏟
U
t
+
1
的期望
∣
S
t
=
s
t
,
A
t
=
a
t
]
(1.1)
\underbrace{Q_{\star}\left(s_t, a_t\right)}_{U_t \text { 的期望 }}=\mathbb{E}_{S_{t+1} \sim p\left(\cdot \mid s_t, a_t\right)}[R_t+\gamma \cdot \underbrace{\max _{A_{t+1} \in \mathcal{A}} Q_{\star}\left(S_{t+1}, A_{t+1}\right)}_{U_{t+1} \text { 的期望 }} \mid S_t=s_t, A_t=a_t] \tag{1.1}
Ut 的期望
Q⋆(st,at)=ESt+1∼p(⋅∣st,at)[Rt+γ⋅Ut+1 的期望
At+1∈AmaxQ⋆(St+1,At+1)∣St=st,At=at](1.1)
贝尔曼方程的右边是个期望, 我们可以对期望做蒙特卡洛近似。当智能体执行动作
a
t
a_t
at 之后, 环境通过状态转移函数
p
(
s
t
+
1
∣
s
t
,
a
t
)
p\left(s_{t+1} \mid s_t, a_t\right)
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
)
,
\left(s_t, a_t, r_t, s_{t+1}\right) \text {, }
(st,at,rt,st+1),
我们可以计算出
r
t
+
γ
⋅
max
a
t
+
1
∈
A
Q
⋆
(
s
t
+
1
,
a
t
+
1
)
.
r_t+\gamma \cdot \max _{a_{t+1} \in \mathcal{A}} Q_{\star}\left(s_{t+1}, a_{t+1}\right) .
rt+γ⋅at+1∈AmaxQ⋆(st+1,at+1).
它可以看做是下面这项期望的蒙特卡洛近似:
E
S
t
+
1
∼
p
(
⋅
∣
s
t
,
a
t
)
[
R
t
+
γ
⋅
max
A
t
+
1
∈
A
Q
⋆
(
S
t
+
1
,
A
t
+
1
)
∣
S
t
=
s
t
,
A
t
=
a
t
]
.
\mathbb{E}_{S_{t+1} \sim p\left(\cdot \mid s_t, a_t\right)}\left[R_t+\gamma \cdot \max _{A_{t+1} \in \mathcal{A}} Q_{\star}\left(S_{t+1}, A_{t+1}\right) \mid S_t=s_t, A_t=a_t\right] .
ESt+1∼p(⋅∣st,at)[Rt+γ⋅At+1∈AmaxQ⋆(St+1,At+1)∣St=st,At=at].
由式
1.1
1.1
1.1 和上述的蒙特卡洛近似可得:
Q
⋆
(
s
t
,
a
t
)
≈
r
t
+
γ
⋅
max
a
t
+
1
∈
A
Q
⋆
(
s
t
+
1
,
a
t
+
1
)
.
Q_{\star}\left(s_t, a_t\right) \approx r_t+\gamma \cdot \max _{a_{t+1} \in \mathcal{A}} Q_{\star}\left(s_{t+1}, a_{t+1}\right) .
Q⋆(st,at)≈rt+γ⋅at+1∈AmaxQ⋆(st+1,at+1).
把公式 (4.3) 中的最优动作价值函数
Q
⋆
(
s
,
a
)
Q_{\star}(s, a)
Q⋆(s,a) 替换成神经网络
Q
(
s
,
a
;
w
)
Q(s, a ; \boldsymbol{w})
Q(s,a;w), 得到:
Q
(
s
t
,
a
t
;
w
)
⏟
预测
q
^
t
≈
r
t
+
γ
⋅
max
a
t
+
1
∈
A
Q
(
s
t
+
1
,
a
t
+
1
;
w
)
⏟
TD 目标
y
^
t
.
\underbrace{Q\left(s_t, a_t ; \boldsymbol{w}\right)}_{\text {预测 } \hat{q}_t} \approx \underbrace{r_t+\gamma \cdot \max _{a_{t+1} \in \mathcal{A}} Q\left(s_{t+1}, a_{t+1} ; \boldsymbol{w}\right)}_{\text {TD 目标 } \widehat{y}_t} .
预测 q^t
Q(st,at;w)≈TD 目标 y
t
rt+γ⋅at+1∈AmaxQ(st+1,at+1;w).
左边的
q
^
t
≜
Q
(
s
t
,
a
t
;
w
)
\widehat{q}_t \triangleq Q\left(s_t, a_t ; \boldsymbol{w}\right)
q
t≜Q(st,at;w) 是神经网络在
t
t
t 时刻做出的预测, 其中没有任何事实成分。右边的 TD 目标
y
^
t
\widehat{y}_t
y
t 是神经网络在
t
+
1
t+1
t+1 时刻做出的预测, 它部分基于真实观测到的奖励
r
t
r_t
rt 。
q
^
t
\widehat{q}_t
q
t和
y
^
t
\widehat{y}_t
y
t 两者都是对最优动作价值
Q
⋆
(
s
t
,
a
t
)
Q_{\star}\left(s_t, a_t\right)
Q⋆(st,at) 的估计, 但是
y
^
t
\widehat{y}_t
y
t 部分基于事实, 因此比
q
^
t
\widehat{q}_t
q
t 更可信。应当鼓励
q
^
t
≜
Q
(
s
t
,
a
t
;
w
)
\widehat{q}_t \triangleq Q\left(s_t, a_t ; \boldsymbol{w}\right)
q
t≜Q(st,at;w) 接近
y
^
t
\widehat{y}_t
y
t 。定义损失函数:
L
(
w
)
=
1
2
[
Q
(
s
t
,
a
t
;
w
)
−
y
t
^
]
2
.
L(\boldsymbol{w})=\frac{1}{2}\left[Q\left(s_t, a_t ; \boldsymbol{w}\right)-\widehat{y_t}\right]^2 .
L(w)=21[Q(st,at;w)−yt
]2.
假设
y
^
\widehat{y}
y
是常数 , 计算
L
L
L 关于
w
\boldsymbol{w}
w 的梯度:
∇
w
L
(
w
)
=
(
q
^
t
−
y
^
t
)
⏟
TD 误差
δ
t
⋅
∇
w
Q
(
s
t
,
a
t
;
w
)
.
\nabla_{\boldsymbol{w}} L(\boldsymbol{w})=\underbrace{\left(\widehat{q}_t-\widehat{y}_t\right)}_{\text {TD 误差 } \delta_t} \cdot \nabla_{\boldsymbol{w}} Q\left(s_t, a_t ; \boldsymbol{w}\right) .
∇wL(w)=TD 误差 δt
(q
t−y
t)⋅∇wQ(st,at;w).
做一步梯度下降, 可以让
q
^
t
\widehat{q}_t
q
t 更接近
y
^
t
\widehat{y}_t
y
t :
w
←
w
−
α
⋅
δ
t
⋅
∇
w
Q
(
s
t
,
a
t
;
w
)
.
\boldsymbol{w} \leftarrow \boldsymbol{w}-\alpha \cdot \delta_t \cdot \nabla_{\boldsymbol{w}} Q\left(s_t, a_t ; \boldsymbol{w}\right) .
w←w−α⋅δt⋅∇wQ(st,at;w).
二.训练流程
让我们思考一下训练网络需要那些数据,最重要的是 q ^ t , y ^ t \hat q_{t},\hat y_{t} q^t,y^t,而 q ^ t = Q ⋆ ( s t , a t , w ) \hat q_{t}=Q_{\star}(s_t,a_t,\boldsymbol w) q^t=Q⋆(st,at,w),所以我们需要知道 a t , s t ( w 随机初始化 ) a_t,s_t(\boldsymbol w随机初始化) at,st(w随机初始化),而TD目标 y ^ t \hat y_{t} y^t与 r t , s t + 1 r_t,s_{t+1} rt,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)而不需要知道策略 π \pi π(策略 π \pi π所代表的 a t , s t a_t,s_t at,st已经在四元组中)
收集训练数据:我们可以用任何策略函数
π
\pi
π 去控制智能体与环境交互, 这个
π
\pi
π 就叫做行为策略 (behavior policy)。比较常用的是
ϵ
\epsilon
ϵ-greedy 策略:
a
t
=
{
argmax
a
Q
(
s
t
,
a
;
w
)
,
以概率
(
1
−
ϵ
)
;
均匀抽取
A
中的一个动作,
以概率
ϵ
.
a_t= \begin{cases}\operatorname{argmax}_a Q\left(s_t, a ; \boldsymbol{w}\right), & \text { 以概率 }(1-\epsilon) ; \\ \text { 均匀抽取 } \mathcal{A} \text { 中的一个动作, } & \text { 以概率 } \epsilon .\end{cases}
at={argmaxaQ(st,a;w), 均匀抽取 A 中的一个动作, 以概率 (1−ϵ); 以概率 ϵ.
把智能体在一局游戏中的轨迹记作:
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, \cdots, s_n, a_n, r_n .
s1,a1,r1,s2,a2,r2,⋯,sn,an,rn.
把一条轨迹划分成 n n n 个 ( s t , a t , r t , s t + 1 ) \left(s_t, a_t, r_t, s_{t+1}\right) (st,at,rt,st+1) 四元组, 存入数组, 将这种数组叫做经验回放数组(replay buffer)。
更新 DQN 参数 w w w : 随机从经验回放数组中取出一个四元组, 记作 ( s j , a j , r j , s j + 1 ) \left(s_j, a_j, r_j, s_{j+1}\right) (sj,aj,rj,sj+1) 。设 DQN 当前的参数为 w now \boldsymbol{w}_{\text {now }} wnow , 执行下面的步骤对参数做一次更新, 得到新的参数 w new \boldsymbol{w}_{\text {new }} wnew 。
- 对
D
Q
N
\mathrm{DQN}
DQN 做正向传播, 得到
Q
\mathrm{Q}
Q 值:
q ^ j = Q ( s j , a j ; w now ) 和 q ^ j + 1 = max a ∈ A Q ( s j + 1 , a ; w now ) . \widehat{q}_j=Q\left(s_j, a_j ; \boldsymbol{w}_{\text {now }}\right) \quad \text { 和 } \quad \widehat{q}_{j+1}=\max _{a \in \mathcal{A}} Q\left(s_{j+1}, a ; \boldsymbol{w}_{\text {now }}\right) . q j=Q(sj,aj;wnow ) 和 q j+1=a∈AmaxQ(sj+1,a;wnow ). - 计算 TD 目标和 TD 误差:
y ^ j = r j + γ ⋅ q ^ j + 1 和 δ j = q ^ j − y ^ j . \widehat{y}_j=r_j+\gamma \cdot \widehat{q}_{j+1} \quad \text { 和 } \quad \delta_j=\widehat{q}_j-\widehat{y}_j . y j=rj+γ⋅q j+1 和 δj=q j−y j. - 对 DQN 做反向传播, 得到梯度:
g j = ∇ w Q ( s j , a j ; w now ) . \boldsymbol{g}_j=\nabla_{\boldsymbol{w}} Q\left(s_j, a_j ; \boldsymbol{w}_{\text {now }}\right) . gj=∇wQ(sj,aj;wnow ). - 做梯度下降更新 DQN 的参数:
w new ← w now − α ⋅ δ j ⋅ g j . \boldsymbol{w}_{\text {new }} \leftarrow \boldsymbol{w}_{\text {now }}-\alpha \cdot \delta_j \cdot \boldsymbol{g}_j . wnew ←wnow −α⋅δj⋅gj.
智能体收集数据、更新 DQN 参数这两者可以同时进行。可以在智能体每执行一个动作之后, 对 w \boldsymbol{w} w 做几次更新。也可以在每完成一局游戏之后, 对 w \boldsymbol{w} w 做几次更新。
三.Q学习
与DQN并无本质区别,唯一不同是DQN采用神经网络来近似
Q
⋆
Q_{\star}
Q⋆,使用梯度下降更新迭代公式。而Q学习迭代公式为
Q
~
new
(
s
j
,
a
j
)
←
Q
~
now
(
s
j
,
a
j
)
−
α
⋅
δ
j
←
(
1
−
α
)
Q
~
now
(
s
j
,
a
j
)
+
α
y
^
j
\begin{aligned} \widetilde{Q}_{\text {new }}\left(s_j, a_j\right) &\leftarrow \widetilde{Q}_{\text {now }}\left(s_j, a_j\right)-\alpha \cdot \delta_j \\ & \leftarrow (1-\alpha)\widetilde{Q}_{\text {now }}\left(s_j, a_j\right)+\alpha \hat y_j \end{aligned}
Q
new (sj,aj)←Q
now (sj,aj)−α⋅δj←(1−α)Q
now (sj,aj)+αy^j
四. 同策略 (On-policy) 与异策略 (Off-policy)
目标策略 (target policy):强化学习的目的,用这个策略函数来控制智能体。例如 a t = argmax a Q ( s t , a ; w ) a_t=\underset{a}{\operatorname{argmax}} Q\left(s_t, a ; \boldsymbol{w}\right) at=aargmaxQ(st,a;w)
行为策略 (behavior policy):控制智能体与环境交互的策略,作用是收集经验 (experience), 即观测的状态、动作、奖励。
Q \mathrm{Q} Q 学习算法用任意的行为策略收集 ( s t , a t , r t , s t + 1 ) \left(s_t, a_t, r_t, s_{t+1}\right) (st,at,rt,st+1) 这样的四元组, 然后拿它们训练目标策略, 即 DQN。
行为策略和目标策略可以相同, 也可以不同。同策略是指用相同的行为策略和目标策略,异策略是指用不同的行为策略和目标策略, DQN 属于异策略。
由于 DQN 是异策略, 行为策略可以不同于目标策略, 可以用任意的行为策略收集经验, 比如最常用的行为策略是
ϵ
\epsilon
ϵ-greedy:
a
t
=
{
argmax
a
Q
(
s
t
,
a
;
w
)
,
以概率
(
1
−
ϵ
)
;
均匀抽取
A
中的一个动作,
以概率
ϵ
.
a_t= \begin{cases}\operatorname{argmax}_a Q\left(s_t, a ; \boldsymbol{w}\right), & \text { 以概率 }(1-\epsilon) ; \\ \text { 均匀抽取 } \mathcal{A} \text { 中的一个动作, } & \text { 以概率 } \epsilon .\end{cases}
at={argmaxaQ(st,a;w), 均匀抽取 A 中的一个动作, 以概率 (1−ϵ); 以概率 ϵ.
让行为策略带有随机性的好处在于能探索更多没见过的状态。在实验中, 初始的时候让 ϵ \epsilon ϵ 比较大 (比如 ϵ = 0.5 \epsilon=0.5 ϵ=0.5 ); 在训练的过程中, 让 ϵ \epsilon ϵ 逐渐衰减, 在几十万步之后衰减到较小的值(比如 ϵ = 0.01 \epsilon=0.01 ϵ=0.01 ), 此后固定住 ϵ = 0.01 \epsilon=0.01 ϵ=0.01 。
比较大 (比如 ϵ = 0.5 \epsilon=0.5 ϵ=0.5 ); 在训练的过程中, 让 ϵ \epsilon ϵ 逐渐衰减, 在几十万步之后衰减到较小的值(比如 ϵ = 0.01 \epsilon=0.01 ϵ=0.01 ), 此后固定住 ϵ = 0.01 \epsilon=0.01 ϵ=0.01 。
异策略的好处是可以用行为策略收集经验, 把 ( s t , a t , r t , s t + 1 ) \left(s_t, a_t, r_t, s_{t+1}\right) (st,at,rt,st+1) 这样的四元组记录到一个数组里, 在事后反复利用这些经验去更新目标策略。这个数组被称作经验回放数组 (replay buffer), 这种训练方式被称作经验回放 (experience replay)。注意, 经验回放只适用于异策略, 不适用于同策略, 其原因是收集经验时用的行为策略不同于想要训练出的目标策略。