价值函数的近似表示
之前的内容都是讲解一些强化学习的基础理论,这些知识只能解决一些中小规模的问题,很多价值函数需要用一张大表来存储,获取某一状态或行为价值的时候通常需要一个查表操作(Table Lookup),这对于那些状态空间或行为空间很大的问题几乎无法求解,而许多实际问题都是这些拥有大量状态和行为空间的问题,本讲开始的内容就主要针对如何解决实际问题。
本讲主要解决各种价值函数的近似表示和学习,在实际应用中,对于状态和行为空间都比较大的情况下,精确获得各种v(S)和q(s,a)几乎是不可能的。这时候需要找到近似的函数,具体可以使用线性组合、神经网络以及其他方法来近似价值函数:
v
(
S
)
≈
v
(
S
,
w
)
v ( S ) \approx v ( S , w )
v(S)≈v(S,w)
w
w
w是引入的参数,通常是一个矩阵或至少是一个向量。
通过函数近似,可以用少量的参数w来拟合实际的各种价值函数。各种近似方法分为两大类,一类是“递增方法”,针对每一步,近似函数得到一些信息,立即优化近似函数,主要用于在线学习;另一类是“批方法”,针对一批历史数据集中进行近似。两类方法没有明显的界限,相互借鉴。
近似价值函数 Value Function Approximation
到目前为止,我们使用的是查表(Table Lookup)的方式,这意味着每一个状态或者每一个状态行为对对应一个价值数据。对于大规模问题,这么做需要太多的内存来存储,而且有的时候针对每一个状态学习得到价值也是一个很慢的过程。
对于大规模问题,解决思路可以是这样的:
- 通过函数近似来估计实际的价值函数:
V ^ ( s , w ) ≈ v π ( s ) q ^ ( s , a , w ) ≈ q π ( s , a ) \begin{array} { c } \hat { V } ( \boldsymbol { s } , \mathbf { w } ) \approx v _ { \pi } ( s ) \\ \hat { q } ( s , a , \mathbf { w } ) \approx q _ { \pi } ( s , a ) \end{array} V^(s,w)≈vπ(s)q^(s,a,w)≈qπ(s,a) - 把从已知的状态学到的函数通用化推广至那些未碰到的状态中。
- 使用MC或TD学习来更新函数参数。
针对强化学习,近似函数根据输入和输出的不同,可以有以下三种架构:
- 针对状态本身,输出这个状态的近似价值;
- 针对状态行为对,输出状态行为对的近似价值;
- 针对状态本身,输出一个向量,向量中的每一个元素是该状态下采取一种可能行为的价值。
所有和机器学习相关的一些算法都可以应用到强化学习中来,其中线性回归和神经网络在强化学习里应用得比较广泛,主要是考虑这两类方法是一个针对状态可导的近似函数。
强化学习应用的场景其数据通常是非静态、非独立均匀分布的,因为一个状态数据是可能是持续流入的,而且下一个状态通常与前一个状态是高度相关的。因此,我们需要一个适用于非静态、非独立均匀分布的数据的训练方法来得到近似函数。
递增方法(Incremental Methods)
梯度下降
假定J(w)是一个关于参数w的可微函数,定义J(w)的梯度如下:
∇
w
J
(
w
)
=
(
∂
J
(
w
)
∂
w
1
⋮
∂
J
(
w
)
∂
w
n
)
\nabla _ { \mathbf { w } } J ( \mathbf { w } ) = \left( \begin{array} { c } \frac { \partial J ( \mathbf { w } ) } { \partial w _ { 1 } } \\ \vdots \\ \frac { \partial J ( \mathbf { w } ) } { \partial \mathbf { w } _ { n } } \end{array} \right)
∇wJ(w)=⎝⎜⎜⎛∂w1∂J(w)⋮∂wn∂J(w)⎠⎟⎟⎞
调整参数超朝着负梯度的方向,寻找J(w)的局部最小值:
Δ
w
=
−
1
2
α
∇
w
J
(
w
)
\Delta \mathbf { w } = - \frac { 1 } { 2 } \alpha \nabla _ { \mathbf { w } } J ( \mathbf { w } )
Δw=−21α∇wJ(w)
目标:找到参数向量w,最小化近似函数
v
^
(
S
,
w
)
\hat{v}(S,w)
v^(S,w) 与实际函数
v
π
(
s
)
v_\pi({s})
vπ(s) 的均方差:
J
(
w
)
=
E
π
[
(
v
π
(
S
)
−
v
^
(
S
,
w
)
)
2
]
J ( \mathbf { w } ) = \mathbb { E } _ { \pi } \left[ \left( v _ { \pi } ( S ) - \hat { v } ( S , \mathbf { w } ) \right) ^ { 2 } \right]
J(w)=Eπ[(vπ(S)−v^(S,w))2]
使用随机梯度下降对梯度进行更新,来近似差的期望:
Δ
w
=
α
(
v
π
(
S
)
−
v
^
(
S
,
w
)
)
∇
w
v
^
(
S
,
w
)
\Delta \mathbf { w } = \alpha \left( v _ { \pi } ( S ) - \hat { v } ( S , \mathbf { w } ) \right) \nabla _ { \mathbf { w } } \hat { v } ( S , \mathbf { w } )
Δw=α(vπ(S)−v^(S,w))∇wv^(S,w)
即用
v
π
(
s
)
v_\pi(s)
vπ(s)来引导估计的价值函数
v
^
(
S
,
w
)
\hat{v}(S,w)
v^(S,w)的优化方向。
预测–递增算法
事实上,之前所列的公式都不能直接用于强化学习,因为公式里都有一个实际价值函数
v
π
(
s
)
v_\pi(s)
vπ(s)。或者是一个具体的数值,而强化学习没有监督数据,因此不能直接使用上述公式。强化学习里只有即时奖励,没有监督数据。我们要找到能替代
v
π
(
s
)
v_\pi(s)
vπ(s) 的目标值,以便来使用监督学习的算法学习到近似函数的参数。
对于MC算法,目标值就是收获:
Δ
w
=
α
(
G
t
−
v
^
(
S
t
,
w
)
)
∇
w
v
^
(
S
t
,
w
)
\Delta \mathbf { w } = \alpha \left( G _ { t } - \hat { v } \left( S _ { t } , \mathbf { w } \right) \right) \nabla _ { \mathbf { w } } \hat { v } \left( S _ { t } , \mathbf { w } \right)
Δw=α(Gt−v^(St,w))∇wv^(St,w)
对于TD(0),目标值就是TD目标:
Δ
w
=
α
(
R
t
+
1
+
γ
v
^
(
S
t
+
1
,
w
)
−
v
^
(
S
t
,
w
)
)
∇
w
v
^
(
S
t
,
w
)
\Delta \mathbf { w } = \alpha \left( R _ { t + 1 } + \gamma \hat { v } \left( S _ { t + 1 } , \mathbf { w } \right) - \hat { v } \left( S _ { t } , \mathbf { w } \right) \right) \nabla _ { \mathbf { w } } \hat { v } \left( S _ { t } , \mathbf { w } \right)
Δw=α(Rt+1+γv^(St+1,w)−v^(St,w))∇wv^(St,w)
对于TD(λ),目标值是λ收获:
Δ
w
=
α
(
G
t
λ
−
v
^
(
S
t
,
w
)
)
∇
w
v
^
(
S
t
,
w
)
\Delta \mathbf { w } = \alpha \left( G _ { t } ^ { \lambda } - \hat { v } \left( S _ { t } , \mathbf { w } \right) \right) \nabla _ { \mathbf { w } } \hat { v } \left( S _ { t } , \mathbf { w } \right)
Δw=α(Gtλ−v^(St,w))∇wv^(St,w)
MC应用于状态价值函数近似
收获
G
t
G_t
Gt是真实价值
v
π
(
s
)
v_\pi(s)
vπ(s)的有噪声、无偏采样,可以把它看成是监督学习的标签数据带入机器学习算法进行学习,这样训练数据集可以是:
⟨
S
1
,
G
1
⟩
,
⟨
S
2
,
G
2
⟩
,
…
,
⟨
S
T
,
G
T
⟩
\left\langle S _ { 1 } , G _ { 1 } \right\rangle , \left\langle S _ { 2 } , G _ { 2 } \right\rangle , \ldots , \left\langle S _ { T } , G _ { T } \right\rangle
⟨S1,G1⟩,⟨S2,G2⟩,…,⟨ST,GT⟩
如果使用线性蒙特卡洛策略迭代,那么每次参数的修正值则为:
Δ
w
=
α
(
G
t
−
v
^
(
S
t
,
w
)
)
∇
w
v
^
(
S
t
,
w
)
=
α
(
G
t
−
v
^
(
S
t
,
w
)
)
x
(
S
t
)
\begin{aligned} \Delta \mathbf { w } & = \alpha \left( G _ { t } - \hat { v } \left( S _ { t } , \mathbf { w } \right) \right) \nabla _ { \mathbf { w } } \hat { v } \left( S _ { t } , \mathbf { w } \right) \\ & = \alpha \left( G _ { t } - \hat { v } \left( S _ { t } , \mathbf { w } \right) \right) \mathbf { x } \left( S _ { t } \right) \end{aligned}
Δw=α(Gt−v^(St,w))∇wv^(St,w)=α(Gt−v^(St,w))x(St)
结论:蒙特卡洛策略迭代使用线性函数近似时也是收敛至一个局部最优解。
TD应用于状态价值函数近似
TD目标值是真实价值的有噪声、有偏采样。此时的训练数据集是:
⟨
S
1
,
R
2
+
γ
v
^
(
S
2
,
w
)
⟩
,
⟨
S
2
,
R
3
+
γ
v
^
(
S
3
,
w
)
⟩
,
…
,
⟨
S
T
−
1
,
R
T
⟩
\left\langle S _ { 1 } , R _ { 2 } + \gamma \hat { v } \left( S _ { 2 } , \mathbf { w } \right) \right\rangle , \left\langle S _ { 2 } , R _ { 3 } + \gamma \hat { v } \left( S _ { 3 } , \mathbf { w } \right) \right\rangle , \dots , \left\langle S _ { T - 1 } , R _ { T } \right\rangle
⟨S1,R2+γv^(S2,w)⟩,⟨S2,R3+γv^(S3,w)⟩,…,⟨ST−1,RT⟩
例如使用线性近似的TD(0)方法:
Δ
w
=
α
(
R
+
γ
v
^
(
S
′
,
w
)
−
v
^
(
S
,
w
)
)
∇
w
v
^
(
S
,
w
)
=
α
δ
x
(
S
)
\begin{aligned} \Delta \mathbf { w } & = \alpha \left( R + \gamma \hat { v } \left( S ^ { \prime } , \mathbf { w } \right) - \hat { v } ( S , \mathbf { w } ) \right) \nabla _ { \mathbf { w } } \hat { v } ( S , \mathbf { w } ) \\ & = \alpha \delta \mathbf { x } ( S ) \end{aligned}
Δw=α(R+γv^(S′,w)−v^(S,w))∇wv^(S,w)=αδx(S)
结论:线性的TD(0)方法将会收敛到全局最优。
注:这里梯度只作用于
v
^
(
S
,
w
)
\hat{v}(S,w)
v^(S,w)并不作用于
v
^
(
S
′
,
w
)
\hat{v}(S',w)
v^(S′,w)按照Silver的解释,如果作用于目标那就有点类似于时光倒流,与现实情况不符。
TD(λ)应用于状态价值函数近似
TD(λ)目标值是真实价值的有噪声、有偏采样。此时的训练数据集是:
⟨
S
1
,
G
1
λ
⟩
,
⟨
S
2
,
G
2
λ
⟩
,
…
,
⟨
S
T
−
1
,
G
T
−
1
λ
⟩
\left\langle S _ { 1 } , G _ { 1 } ^ { \lambda } \right\rangle , \left\langle S _ { 2 } , G _ { 2 } ^ { \lambda } \right\rangle , \ldots , \left\langle S _ { T - 1 } , G _ { T - 1 } ^ { \lambda } \right\rangle
⟨S1,G1λ⟩,⟨S2,G2λ⟩,…,⟨ST−1,GT−1λ⟩
如果使用线性TD(λ)学习,从前向认识看,有:
Δ
w
=
α
(
G
t
λ
−
v
^
(
S
t
,
w
)
)
∇
w
v
^
(
S
t
,
w
)
=
α
(
G
t
λ
−
v
^
(
S
t
,
w
)
)
x
(
S
t
)
\begin{aligned} \Delta \mathbf { w } & = \alpha \left( G _ { t } ^ { \lambda } - \hat { v } \left( S _ { t } , \mathbf { w } \right) \right) \nabla _ { \mathbf { w } } \hat { v } \left( S _ { t } , \mathbf { w } \right) \\ & = \alpha \left( G _ { t } ^ { \lambda } - \hat { v } \left( S _ { t } , \mathbf { w } \right) \right) \mathbf { x } \left( S _ { t } \right) \end{aligned}
Δw=α(Gtλ−v^(St,w))∇wv^(St,w)=α(Gtλ−v^(St,w))x(St)
从反向认识看,有:
δ
t
=
R
t
+
1
+
γ
v
^
(
S
t
+
1
,
w
)
−
v
^
(
S
t
,
w
)
E
t
=
γ
λ
E
t
−
1
+
x
(
S
t
)
Δ
w
=
α
δ
t
E
t
\begin{aligned} \delta _ { t } & = R _ { t + 1 } + \gamma \hat { v } \left( S _ { t + 1 } , \mathbf { w } \right) - \hat { v } \left( S _ { t } , \mathbf { w } \right) \\ E _ { t } & = \gamma \lambda E _ { t - 1 } + \mathbf { x } \left( S _ { t } \right) \\ \Delta \mathbf { w } & = \alpha \delta _ { t } E _ { t } \end{aligned}
δtEtΔw=Rt+1+γv^(St+1,w)−v^(St,w)=γλEt−1+x(St)=αδtEt
对于一个完整的Episode,TD(λ)的前向认识和反向认识对于w的改变是等效的。
控制–递增算法
使用强化学习进行不基于模型控制需要两个条件。如何把近似函数引入到控制过程中呢?我们需要能够近似状态行为对的价值函数近似而不是仅针对状态的价值函数近似。
从一系列参数开始,得到一个近似的状态行为对价值函数,在Ɛ-greedy执行策略下产生一个行为,执行该行为得到一个即时奖励,以此数据计算目标值,进行近似函数参数的更新。再应用这个策略得到后续的状态和对应的目标值,每经历一次状态就更新依次参数,如此反复进行策略的优化,同时逼近最优价值函数。
策略评估:是一个近似策略评估
q
^
(
⋅
,
⋅
,
w
)
≈
q
π
\hat{q}(·,·,w) \approx q_\pi
q^(⋅,⋅,w)≈qπ,特别是早期误差会较大,而且这种近似无法最终收敛于最优策略对应的行为价值函数,只能在其周围震荡,后文将讲述改进方法。
策略改善:使用Ɛ-greedy执行。
行为价值函数近似表示为:
q
^
(
S
,
A
,
w
)
≈
q
π
(
S
,
A
)
\hat { q } ( S , A , \mathbf { w } ) \approx q _ { \pi } ( S , A )
q^(S,A,w)≈qπ(S,A)
最小化均方差:
J
(
w
)
=
E
π
[
(
q
π
(
S
,
A
)
−
q
^
(
S
,
A
,
w
)
)
2
]
J ( \mathbf { w } ) = \mathbb { E } _ { \pi } \left[ \left( q _ { \pi } ( S , A ) - \hat { q } ( S , A , \mathbf { w } ) \right) ^ { 2 } \right]
J(w)=Eπ[(qπ(S,A)−q^(S,A,w))2]
使用随机梯度下降来寻找局部最优解:
−
1
2
∇
w
J
(
w
)
=
(
q
π
(
S
,
A
)
−
q
^
(
S
,
A
,
w
)
)
∇
w
q
^
(
S
,
A
,
w
)
Δ
w
=
α
(
q
π
(
S
,
A
)
−
q
^
(
S
,
A
,
w
)
)
∇
w
q
^
(
S
,
A
,
w
)
\begin{array} { c } - \frac { 1 } { 2 } \nabla _ { w } J ( \mathbf { w } ) = \left( q _ { \pi } ( S , A ) - \hat { q } ( S , A , \mathbf { w } ) \right) \nabla _ { w } \hat { q } ( S , A , \mathbf { w } ) \\ \Delta \mathbf { w } = \alpha \left( q _ { \pi } ( S , A ) - \hat { q } ( S , A , \mathbf { w } ) \right) \nabla _ { w } \hat { q } ( S , A , \mathbf { w } ) \end{array}
−21∇wJ(w)=(qπ(S,A)−q^(S,A,w))∇wq^(S,A,w)Δw=α(qπ(S,A)−q^(S,A,w))∇wq^(S,A,w)
收敛性分析
对于预测问题而言:
MC使用的是实际价值的有噪声无偏估计,虽然很多时候表现很差,但总能收敛至局部或全局最优解。TD性能通常更加优秀,是否意味着TD也是一直收敛的呢?答案是否定的。原讲义给出了一个TD学习不收敛的例子,这里不再详述,这里给出各种算法在使用不同近似函数进行预测学习时是否收敛的小结:
从表中可以看出,没有函数近似时,各种算法都收敛;线性函数近似时现时策略学习可以收敛,但离线策略时仅有MC收敛;非线性函数近似时无论采用现时策略还是离线策略只有MC收敛。而MC算法在实际中是很少使用的。这给强化学习的实际应用带来的挑战。好在我们有一些改善TD算法的办法。
对于控制问题而言的收敛性:
针对控制学习算法,大多数都能得到较好的策略,但是理论上只要存在函数近似,就都不是严格收敛的,比较常见的是在最优策略上下震荡,逐渐逼近然后突然来一次发散,再逐渐逼近等。使用非线性函数近似的效果要比近似函数要差很多,实际也是如此。
批方法 Batch Methods
前面所说的递增算法都是基于数据流的,经历一步,更新算法后,我们就不再使用这步的数据了,这种算法简单,但有时候不够高效。与之相反,批方法则是把一段时期内的数据集中起来,通过学习来使得参数能较好地符合这段时期内所有的数据。这里的训练数据集“块”相当于个体的一段经验。
最小二乘法预测
假设存在一个价值函数的近似:
v
^
(
s
,
w
)
≈
v
π
(
s
)
\hat { v } ( s , \mathbf { w } ) \approx v _ { \pi } ( s )
v^(s,w)≈vπ(s)
以及一段时期的、包含<状态、价值>的经历D:
D
=
{
⟨
s
1
,
v
1
π
⟩
,
⟨
s
2
,
v
2
π
⟩
,
…
,
⟨
s
T
,
v
T
π
⟩
}
\mathcal { D } = \left\{ \left\langle s _ { 1 } , v _ { 1 } ^ { \pi } \right\rangle , \left\langle s _ { 2 } , v _ { 2 } ^ { \pi } \right\rangle , \ldots , \left\langle s _ { T } , v _ { T } ^ { \pi } \right\rangle \right\}
D={⟨s1,v1π⟩,⟨s2,v2π⟩,…,⟨sT,vTπ⟩}
最小平方差算法要求找到参数w,使得下式值最小:
L
S
(
w
)
=
∑
t
=
1
T
(
v
t
π
−
v
^
(
s
t
,
w
)
)
2
=
E
D
[
(
v
π
−
v
^
(
s
,
w
)
)
2
]
\begin{aligned} L S ( \mathbf { w } ) & = \sum _ { t = 1 } ^ { T } \left( v _ { t } ^ { \pi } - \hat { v } \left( s _ { t } , \mathbf { w } \right) \right) ^ { 2 } \\ & = \mathbb { E } _ { \mathcal { D } } \left[ \left( v ^ { \pi } - \hat { v } ( s , \mathbf { w } ) \right) ^ { 2 } \right] \end{aligned}
LS(w)=t=1∑T(vtπ−v^(st,w))2=ED[(vπ−v^(s,w))2]
这就相当于经历重现(Experience Replay),把一段时期内的经历重新过一遍,更新参数。这种算法实现起来不是很难,只要重复:
- 从经历中取出一个<s,v>:
⟨ s , v π ⟩ ∼ D \left\langle s , v ^ { \pi } \right\rangle \sim \mathcal { D } ⟨s,vπ⟩∼D - 应用随机梯度下降来更新参数:
Δ w = α ( v π − v ^ ( s , w ) ) ∇ w v ^ ( s , w ) \Delta \mathbf { w } = \alpha \left( v ^ { \pi } - \hat { v } ( s , \mathbf { w } ) \right) \nabla _ { w } \hat { v } ( s , \mathbf { w } ) Δw=α(vπ−v^(s,w))∇wv^(s,w)
这将收敛至针对这段经历最小平方差的参数:
w π = argmin w L S ( w ) \mathbf { w } ^ { \pi } = \underset { \mathbf { w } } { \operatorname { argmin } } L S ( \mathbf { w } ) wπ=wargminLS(w)
批方法应用于DQN
先前说过TD方法结合非线性的神经网络函数近似可能不会收敛,但DQN使用experience replay和固定的Q目标值能做到收敛而且保持很好的鲁棒性。在解释其收敛之前先要介绍DQN算法的要点:
- 依据 ϵ − g r e e d y \epsilon-greedy ϵ−greedy执行策略产生t时刻的行为;
- 将大量经历数据(例如百万级的)以 ( 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)存储在内存里,作为D大块;
- 从D大块中随机抽取小块(例如64个样本数据)数据 ( s , a , r , s ′ ) (s,a,r,s') (s,a,r,s′);
- 维护两个神经网络DQN1,DQN2,一个网络固定参数专门用来产生目标值,目标值相当于标签数据。另一个网络专门用来评估策略,更新参数。
- 优化关于Q网络和Q目标值之间的最小平方差:
L i ( w i ) = E s , a , r , s ′ ∼ D i [ ( r + γ max a ′ Q ( s ′ , a ′ ; w i − ) − Q ( s , a ; w i ) ) 2 ] \mathcal { L } _ { i } \left( w _ { i } \right) = \mathbb { E } _ { s , a , r , s ^ { \prime } \sim \mathcal { D } _ { i } } \left[ \left( r + \gamma \max _ { a ^ { \prime } } Q \left( s ^ { \prime } , a ^ { \prime } ; w _ { i } ^ { - } \right) - Q \left( s , a ; w _ { i } \right) \right) ^ { 2 } \right] Li(wi)=Es,a,r,s′∼Di[(r+γa′maxQ(s′,a′;wi−)−Q(s,a;wi))2]
式中: w − w^- w−在batch的学习过程中是固定的, w i w_i wi则是动态更新的参数。 - 用随机梯度下降的方式更新参数。
首先,随机采样打破了状态之间的联系;第二个神经网络会暂时冻结参数,我们从冻结参数的网络而不是从正在更新参数的网络中获取目标值,这样增加了算法的稳定性。经过一次批计算后,把冻结参数的网络换成更新的参数再次冻结产生新一次迭代时要用的目标值。
最小平方差控制
使用最小平方差进行策略迭代的原理和结局如图所示:
策略评估使用 最小平方差Q学习,策略改善使用:Greedy 搜索策略。如果使用最小平方差方法进行策略控制,我们必须要设计针对行为价值函数的线性近似:
q
^
(
s
,
a
,
w
)
=
x
(
s
,
a
)
⊤
w
≈
q
π
(
s
,
a
)
\hat { q } ( s , a , \mathbf { w } ) = \mathbf { x } ( s , a ) ^ { \top } \mathbf { w } \approx q _ { \pi } ( s , a )
q^(s,a,w)=x(s,a)⊤w≈qπ(s,a)
使用下列经历,最小化
q
^
(
s
,
a
,
w
)
\hat{q}(s,a,w)
q^(s,a,w)和
q
π
(
s
,
a
)
q_\pi(s,a)
qπ(s,a)的平方差:
D
=
{
⟨
(
s
1
,
a
1
)
,
v
1
π
⟩
,
⟨
(
s
2
,
a
2
)
,
v
2
π
⟩
,
…
,
⟨
(
s
T
,
a
T
)
,
v
T
π
⟩
}
\mathcal { D } = \left\{ \left\langle \left( s _ { 1 } , a _ { 1 } \right) , v _ { 1 } ^ { \pi } \right\rangle , \left\langle \left( s _ { 2 } , a _ { 2 } \right) , v _ { 2 } ^ { \pi } \right\rangle , \ldots , \left\langle \left( s _ { T } , a _ { T } \right) , v _ { T } ^ { \pi } \right\rangle \right\}
D={⟨(s1,a1),v1π⟩,⟨(s2,a2),v2π⟩,…,⟨(sT,aT),vTπ⟩}
对于策略评估我们希望改善策略,使用类似Q学习的方法,进行离线策略学习。