值函数近似(value funtion approximation)
为了减少存储参数,应对无穷多状态或者动作,以及增强泛化能力(面对没有访问过的状态,也能得出状态值),可以使用函数去拟合这些值代替用表格形式存储参数。
1 函数拟合状态值
1.1 目标函数(object funtion)
为了使函数 v ^ ( s , w ) \hat v(s,w) v^(s,w)能够找到最优的参数 w w w去拟合状态值,先设计出目标函数 J ( w ) = E [ 1 2 ( v π ( S ) − v ^ ( S , w ) ) 2 ] J(w) = E[\frac{1}{2}(v_\pi(S) - \hat v(S,w))^2] J(w)=E[21(vπ(S)−v^(S,w))2],并使其最小。
1.2 SGD 进行优化参数
为了使目标函数最小,用 SGD 方法更新参数
w
t
+
1
=
w
t
−
α
t
∇
w
J
(
w
)
=
w
t
−
α
t
E
[
∇
w
1
2
(
v
π
(
S
)
−
v
^
(
S
,
w
)
)
2
]
=
w
t
+
α
t
E
[
(
v
π
(
S
)
−
v
^
(
S
,
w
)
)
∇
w
v
^
(
S
,
w
)
]
=
w
t
+
α
t
(
v
π
(
s
t
)
−
v
^
(
s
t
,
w
t
)
)
∇
w
v
^
(
s
t
,
w
t
)
(因为
S
G
D
)
=
w
t
+
α
t
(
r
t
+
1
+
γ
v
^
(
s
t
+
1
,
w
t
)
−
v
^
(
s
t
,
w
t
)
)
∇
w
v
^
(
s
t
,
w
t
)
(因为
v
π
(
s
)
无法得到,用
T
D
中的估计值代替)
\begin{align} w_{t+1} &= w_t - \alpha_t \nabla_w J(w)\\ &= w_t - \alpha_t E[\nabla_w \frac{1}{2}(v_\pi(S) - \hat v(S,w))^2]\\ &= w_t + \alpha_t E[(v_\pi(S) - \hat v(S,w))\nabla_w \hat v(S,w)]\\ &= w_t + \alpha_t (v_\pi(s_t) - \hat v(s_t,w_t))\nabla_w \hat v(s_t,w_t)& (因为 SGD)\\ &= w_t + \alpha_t (r_{t+1} + \gamma \hat v(s_{t+1},w_t) - \hat v(s_t,w_t))\nabla_w \hat v(s_t,w_t)& (因为v_\pi(s)无法得到,用TD中的估计值代替)\\ \end{align}
wt+1=wt−αt∇wJ(w)=wt−αtE[∇w21(vπ(S)−v^(S,w))2]=wt+αtE[(vπ(S)−v^(S,w))∇wv^(S,w)]=wt+αt(vπ(st)−v^(st,wt))∇wv^(st,wt)=wt+αt(rt+1+γv^(st+1,wt)−v^(st,wt))∇wv^(st,wt)(因为SGD)(因为vπ(s)无法得到,用TD中的估计值代替)
1.3 值函数选择
值函数相对参数可以选择线性也可以是非线性的。
线性的例如:
v
^
(
s
,
w
)
=
[
s
s
2
1
]
[
a
b
c
]
\hat v(s,w) = \begin{bmatrix} s&s^2&1 \end{bmatrix} \begin{bmatrix} a\\ b\\ c \end{bmatrix}
v^(s,w)=[ss21]
abc
其中矩阵
[
s
s
2
1
]
\begin{bmatrix}s&s^2&1\end{bmatrix}
[ss21]称为特征向量有很多种取法。
2 函数拟合动作值
道理同上
2.1 Sarsa 结合函数拟合
将 Q-table 的更新,换成值函数参数更新 w t + 1 = w t + α t ( r t + 1 + γ q ^ ( s t + 1 , a t + 1 , w t ) − q ^ ( s t , a t , w t ) ) ∇ w q ^ ( s t , a t , w t ) w_{t+1} = w_t + \alpha_t (r_{t+1} + \gamma \hat q(s_{t+1},a_{t+1},w_t) - \hat q(s_t,a_t,w_t))\nabla_w \hat q(s_t,a_t,w_t) wt+1=wt+αt(rt+1+γq^(st+1,at+1,wt)−q^(st,at,wt))∇wq^(st,at,wt)
2.2 Q-learning 结合函数拟合
将 Q-table 的更新,换成值函数参数更新 w t + 1 = w t + α t ( r t + 1 + γ max a q ^ ( s t + 1 , a , w t ) − q ^ ( s t , a t , w t ) ) ∇ w q ^ ( s t , a t , w t ) w_{t+1} = w_t + \alpha_t (r_{t+1} + \gamma \max_a \hat q(s_{t+1},a,w_t) - \hat q(s_t,a_t,w_t))\nabla_w \hat q(s_t,a_t,w_t) wt+1=wt+αt(rt+1+γmaxaq^(st+1,a,wt)−q^(st,at,wt))∇wq^(st,at,wt)
3 DQN(Deep Q Network)
原理于2.2节相同,将 q ^ \hat q q^的函数形式改成非线性的神经网络,但是为了能够更好利用深度学习的计算工具进行几个方面的改进。
3.1 两个函数(two Network)
目标函数 J ( w ) = E [ ( R t + 1 + γ m a x a Q ( S t + 1 , a , w T ) − Q ( S t , A t , w ) ) 2 ] J(w) = E[\big(R_{t+1} + \gamma max_a Q(S_{t+1},a,w_T) - Q(S_t, A_t, w)\big)^2] J(w)=E[(Rt+1+γmaxaQ(St+1,a,wT)−Q(St,At,w))2],因为 m a x a Q ( S t + 1 , a , w T ) max_a Q(S_{t+1},a,w_T) maxaQ(St+1,a,wT)的导数难求,所以将其分为两个不同网络分别是 target Network: Q ( S t + 1 , a , w T ) Q(S_{t+1},a,w_T) Q(St+1,a,wT) 和 main Network: Q ( S t , A t , w ) Q(S_t, A_t, w) Q(St,At,w)。当进行反向求梯度时保持 target network 不变,只更新 main network,更新一定次数后再将 main network 参数赋值给 target network。在实际网络设计中把 R t + 1 + γ m a x a Q ( S t + 1 , a , w T ) R_{t+1} + \gamma max_a Q(S_{t+1},a,w_T) Rt+1+γmaxaQ(St+1,a,wT)称为目标值 y T y_T yT, Q ( S t , A t , w ) Q(S_t, A_t, w) Q(St,At,w)称为当前值,损失函数就是 l = y T − Q ( S t , A t , w ) l = y_T - Q(S_t, A_t, w) l=yT−Q(St,At,w)
3.2 经验回放(experience replay)
在通过
π
b
\pi_b
πb生成经验
{
s
t
,
a
t
,
r
t
+
1
,
s
t
+
1
}
\{s_t,a_t,r_{t+1},s_{t+1}\}
{st,at,rt+1,st+1}(experience buffer)后,随机选取小批量的数据就称为经验回放。这一步是非常关键的,因为目标函数是关于状态动作组合(s,a)的期望,而在没有先验知识的情况下,状态动作组合应该满足均匀分布,如果按照 episode 生成的顺序进行选取就无法满足该要求。
同时这个技巧也可以使 experience 反复利用,提高利用效率。
4 代码链接
(GitHub)[https://github.com/wizard-lhx/rl-lesson-code]