价值学习
上一篇博客已经介绍了一些强化学习的基本概念,其中包括了价值函数:动作价值函数和状态价值函数。首先动作价值函数 Q ∗ Q^* Q∗能告诉你每个动作带来的平均回报,所以我们应该选择平均回报最高的那个,但是我们并不知道 Q ∗ Q^* Q∗函数,价值学习的基本思想就是学习一个函数来近似 Q ∗ Q^* Q∗。下面介绍价值学习的一些概念
Deep Q-Network(DQN)
其实就是利用神经网络近似
Q
∗
Q^*
Q∗ 函数。所以我们使用神经网络
Q
(
s
,
a
;
w
)
Q(s,a;w)
Q(s,a;w)来近似
Q
∗
(
s
,
a
)
Q^*(s,a)
Q∗(s,a)。所以引入了DQN这种神经网络,如下图所示
这幅图就是DQN网络的示意图,我们通过当前的状态,输出对不同动作的打分(上、左、右),然后智能体选择分数较大的动作。
这幅图就是说明在游戏中,DQN的变换状态,智能体不断的选择得分最高的action,然后迁移到下一个状态。下面我们来分析如何训练这个神经网络。
Temporal Difference (TD) Learning
时间差分学习:指从采样得到的不完整的状态序列学习,该方法通过合理的 bootstrapping,先估计某状态在该状态序列(episode)完整后可能得到的 return,并在此基础上利用累进更新平均值的方法得到该状态的价值,再通过不断的采样来持续更新这个价值。概念还是比较难理解的。下面看一个简单的例子。
首先有一个模型 Q ( w ) Q(w) Q(w)预测从A触发到达B需要1000分钟,那下面开始更新模型,我们的预测 q = Q ( w ) , q = 1000 q=Q(w),q=1000 q=Q(w),q=1000,然后我们实际走一遍这个路程,发现我们实际花费了860分钟,那么我们可以开始更新模型。那么计算损失Loss L = 1 2 ( q − y ) 2 L=\frac {1}{2}(q-y)^2 L=21(q−y)2,下面我们对Loss关于w求导 ∂ L ∂ w = ∂ L ∂ q ⋅ ∂ q ∂ w = ( q − y ) ∂ Q ( w ) ∂ w \frac{\partial L}{\partial w}=\frac{\partial L}{\partial q} \cdot \frac{\partial q}{\partial w} =(q-y)\frac{\partial Q(w)}{\partial w} ∂w∂L=∂q∂L⋅∂w∂q=(q−y)∂w∂Q(w)。梯度求出来之后,我们可以根据梯度下降来跟新参数 w t + 1 = w t − α ⋅ ∂ L ∂ w ∣ w = w t w_{t+1}=w_t-\alpha \cdot \frac {\partial L}{\partial w}|_{w=w_{t}} wt+1=wt−α⋅∂w∂L∣w=wt。这种方法是一种常见的方法,但是我必须完成整个旅程才能更细模型,如果我不完成整个路程,走到半路就不前进了,该如何更新?下面就引出了TD算法。
我们从A出发到C时,已经花费了300分钟,然后模型告诉我们从C到终点B还要花费600分钟,那么我们就可以预测最终会花费900分钟,虽然900也是估计的但其中还有一部分是真实的,所以比1000更为准确一点。这就是TD算法的大致意思,下面看一下TD算法在DQN中的应用。
T
A
−
>
B
≈
T
A
−
>
C
+
T
C
+
B
T_{A->B}\approx T_{A->C}+T_{C+B}
TA−>B≈TA−>C+TC+B
这个公式就是对上面行程问题的总结,下面看一下在DQN中
Q
(
s
t
,
a
t
;
w
)
≈
r
t
+
γ
⋅
Q
(
s
t
+
1
,
a
t
+
1
;
w
)
Q(s_t,a_t;w)\approx r_t+\gamma\cdot Q(s_{t+1},a_{t+1};w)
Q(st,at;w)≈rt+γ⋅Q(st+1,at+1;w)
可以做一个不太严谨的证明:
U
t
=
R
t
+
γ
R
t
+
1
+
γ
2
R
t
+
2
+
⋯
=
R
t
+
γ
(
R
t
+
1
+
γ
R
t
+
2
+
⋯
)
=
R
t
+
γ
⋅
U
t
+
1
U_t=R_t+\gamma R_{t+1}+\gamma ^2R_{t+2}+\cdots \\ = R_t+\gamma (R_{t+1}+\gamma R_{t+2}+\cdots) \\ =R_t+ \gamma\cdot U_{t+1}
Ut=Rt+γRt+1+γ2Rt+2+⋯=Rt+γ(Rt+1+γRt+2+⋯)=Rt+γ⋅Ut+1
下面我们就可以使用TD learning来训练DQN,首先我们获取了在
t
t
t时刻的模型预测值
Q
(
s
t
,
a
t
;
w
t
)
Q(s_t,a_t;w_t)
Q(st,at;wt)。到了
t
+
1
t+1
t+1时刻,我们观测到了真实的结果
y
t
=
r
t
+
γ
⋅
Q
(
s
t
+
1
,
a
t
+
1
;
w
t
)
=
r
t
+
γ
⋅
m
a
x
a
Q
(
s
t
+
1
,
a
;
w
t
)
y_t=r_t+\gamma \cdot Q(s_{t+1},a_{t+1};w_t) \\ =r_t+\gamma \cdot \underset{a}{max} Q(s_{t+1},a;w_t)
yt=rt+γ⋅Q(st+1,at+1;wt)=rt+γ⋅amaxQ(st+1,a;wt)
所以得出损失值
L
t
=
1
2
[
Q
(
s
t
,
a
t
;
w
)
−
y
t
]
2
L_t=\frac{1}{2}[Q(s_t,a_t;w)-y_t]^2
Lt=21[Q(st,at;w)−yt]2。根据梯度下降更新损失值。
总结
我们知道根据 Q ∗ Q* Q∗函数能够反映每一个动作的好坏,只要有了该函数,我们就能根据该函数来控制agent运动,每一个时刻智能体只要选出得分最高的动作执行就可以,但是实际是我们并没有 Q ∗ Q^* Q∗函数,所以价值学习的目的就是学习一个 Q ∗ Q^* Q∗函数。所以我们使用DQN来近似一个 Q ∗ Q^* Q∗函数,然后根据TD算法来跟新迭代DQN模型。