本分类专栏博客系列是学习《深入浅出强化学习原理入门》的学习总结。
书籍链接:链接:https://pan.baidu.com/s/1p0qQ68pzTb7_GK4Brcm4sw 提取码:opjy
文章目录
基于值函数逼近的强化学习方法
一、理论讲解
1.1 表格型强化学习与值函数逼近强化学习
在此之前,我们前面博客介绍了有模型的基于动态规划方法和模型未知时的蒙特卡洛和时间差分的方法。这些⽅法:
- 有⼀个基本的前提条件: 状态空间和动作空间是离散的,⽽且状态空间和动作空间不能太⼤。
- 基本步骤是先评估值函数,再利⽤值函数改善当前的策略。其中值函数的评估是关键。
注意,这时的值函数其实是⼀个表格。对于状态值函数,其索引是状态;对于⾏为值函数,其索引是状态-⾏为对。值函数的迭代更新实际上就是这张表的迭代更新。因此,之前讲的强化学习算法⼜称为表格型强化学习。
- 对于状态值函数,其表格的维数为状态的个数 ∣ S ∣ |S| ∣S∣ ,其中 S S S 为状态空 间。
若状态空间的维数很⼤,或者状态空间为连续空间,此时值函数⽆法⽤⼀张表格来表⽰。这时,我们需要利⽤函数逼近的⽅法表⽰值函数。
总的来说:
- 表格型强化学习中,值函数对应着⼀张表
- 值函数逼近⽅法中,值函数对应着⼀个逼近函数 v ^ ( s ) \hat v(s) v^(s)
从数学角度看,函数逼近的分类可以是:
本节主要介绍参数化逼近。所谓参数化逼近,是指值函数可以由 ⼀组参数
θ
θ
θ 来近似。我们将逼近的值函数写为
v
^
(
s
,
θ
)
\hat v(s,θ)
v^(s,θ)。
当逼近的值函数结构确定时(如线性逼近时选定了基函数,⾮线性逼 近时选定了神经⽹络的结构),那么值函数的逼近就等价于参数的逼近。 值函数的更新也就等价于参数的更新。也就是说,我们需要利⽤试验数据来更新参数值。那么,如何利⽤数据更新参数值呢,也就是说如何从数据中学到参数值呢?
回顾一下表格型强化学习值函数更新的公式:
- 蒙特卡罗⽅法,值函数更新公式为: Q ( s , a ) ← Q ( s , a ) + α ( G t − Q ( s , a ) ) Q(s,a) \leftarrow Q(s,a) + \alpha ({G_t} - Q(s,a)) Q(s,a)←Q(s,a)+α(Gt−Q(s,a))
- TD⽅法值函数更新公式为: Q ( s , a ) ← Q ( s , a ) + α ( r + γ Q ( s ′ , a ′ ) − Q ( s , a ) ) Q(s,a) \leftarrow Q(s,a) + \alpha (r+\gamma Q(s',a') - Q(s,a)) Q(s,a)←Q(s,a)+α(r+γQ(s′,a′)−Q(s,a))
- T D ( λ ) TD(\lambda) TD(λ) ⽅法值函数更新公式为: Q ( s , a ) ← Q ( s , a ) + α ( G t λ − Q ( s , a ) ) Q(s,a) \leftarrow Q(s,a) + \alpha ({G_t^{\lambda}} - Q(s,a)) Q(s,a)←Q(s,a)+α(Gtλ−Q(s,a))
从上面值函数的更新过程可以看出,值函数更新过程是向着⽬标值函数靠近。如图6.2所⽰为 TD ⽅法更新值函数的过程。
从表格型值函数的更新过程,可以看出⽆论是蒙特卡罗⽅法还是时间差分⽅法,都是朝着⼀个⽬标值更新的,这个⽬标值是:
- 蒙特卡罗⽅法中是 G t G_t Gt
- 时间差分方法中是 r + γ Q ( s ′ , a ′ ) r+\gamma Q(s',a') r+γQ(s′,a′)
- T D ( λ ) TD(\lambda) TD(λ) 中是 G t λ G_t^{\lambda} Gtλ
将表格型强化学习值函数的更新过程 推⼴ 到值函数逼近过程,有如下形式。
函数逼近 v ^ ( s , θ ) \hat v(s,θ) v^(s,θ) 的过程是⼀个监督学习的过程,其数据和标签对为 ( S t , U t ) (S_t,U_t) (St,Ut),其中 U t U_t Ut 等价于蒙特卡罗⽅法中的 G t G_t Gt,时间差分⽅法中的 r + γ Q ( s ′ , a ′ ) r+\gamma Q(s',a') r+γQ(s′,a′),以及 T D ( λ ) TD(\lambda) TD(λ) 中的 G t λ G_t^{\lambda} Gtλ。
训练的目标函数是: arg min θ ( q ( s , a ) − q ^ ( s , a , θ ) ) 2 \mathop {\arg \min }\limits_\theta {(q(s,a) - \hat q(s,a,\theta ))^2} θargmin(q(s,a)−q^(s,a,θ))2
下⾯我们⽐较总结⼀下表格型强化学习和函数逼近⽅法的强化学习值函数更新时的异同点。
- 表格型强化学习在更新值函数时,只有当前状态处的值函数改变,其他地⽅的值函数不改变。
- 值函数逼近⽅法更新值函数时,更新的是参数 θ \theta θ ,⽽估计的值函数为 v ^ ( s , θ ) \hat v(s,\theta) v^(s,θ),所以当参数 θ \theta θ 发⽣改变,任意状态处的值函数都会发⽣改变。
1.2 值函数更新方法
值函数更新可分为增量式学习⽅法和批学习⽅法。
(1).增量式学习⽅法:随机梯度下降法
由训练的目标函数 arg min θ ( q ( s , a ) − q ^ ( s , a , θ ) ) 2 \mathop {\arg \min }\limits_\theta {(q(s,a) - \hat q(s,a,\theta ))^2} θargmin(q(s,a)−q^(s,a,θ))2 ,以及 θ \theta θ的调整标准: Δ θ = − 1 2 α ∇ θ J ( θ ) \Delta \theta = - \frac{1}{2}\alpha {\nabla _\theta }J(\theta ) Δθ=−21α∇θJ(θ),其中 α \alpha α是步长, J ( θ ) = E π [ ( q π ( s , a ) − q ^ π ( s , a , θ ) ) 2 ] J(\theta ) = {E_\pi }[{({q_\pi }(s,a) - {\hat q_\pi }(s,a,\theta ))^2}] J(θ)=Eπ[(qπ(s,a)−q^π(s,a,θ))2];对其进行链式法则,代入上面 Δ θ \Delta \theta Δθ 式,可以得到公式:
Δ θ = − 1 2 α ∇ θ J ( θ ) = α [ U t − v ^ ( S t , θ t ) ] ∇ θ v ^ ( S t , θ ) \Delta \theta = - \frac{1}{2}\alpha {\nabla _\theta }J(\theta ) = \alpha[U_t-\hat v(S_t,\theta_t)]{\nabla _\theta }\hat v({S_t},\theta ) Δθ=−21α∇θJ(θ)=α[Ut−v^(St,θt)]∇θv^(St,θ)
(由于真实值为常数,所以梯度可以转换为估计值的梯度)并且在应用中,我们采用随机梯度下降,对某些状态进行抽样,用 步长×误差×梯度,可以就得到调整梯度参数的数值和方向。
那么,得到参数的随机梯度更新为:
θ t + 1 = θ t + α [ U t − v ^ ( S t , θ t ) ] ∇ θ v ^ ( S t , θ ) \theta_{t+1}=\theta_t + \alpha[U_t-\hat v(S_t,\theta_t)]{\nabla _\theta }\hat v({S_t},\theta ) θt+1=θt+α[Ut−v^(St,θt)]∇θv^(St,θ)
基于蒙特卡罗⽅法的函数逼近
基于蒙特卡罗⽅法的函数逼近,具体过程如下。
给定要评估的策略
π
\pi
π,产⽣⼀次试验:
值函数的更新过程实际是⼀个监督学习的过程,其中监督数据集从蒙特卡罗的试验中得到,其数据集为:
⟨
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 ,...,\left\langle {{s_T},{G_T}} \right\rangle
⟨s1,G1⟩,⟨s2,G2⟩,...,⟨sT,GT⟩
值函数的更新是:
Δ
θ
=
−
1
2
α
∇
θ
J
(
θ
)
=
α
[
G
t
−
v
^
(
S
t
,
θ
t
)
]
∇
θ
v
^
(
S
t
,
θ
)
\Delta \theta = - \frac{1}{2}\alpha {\nabla _\theta }J(\theta ) = \alpha[G_t-\hat v(S_t,\theta_t)]{\nabla _\theta }\hat v({S_t},\theta )
Δθ=−21α∇θJ(θ)=α[Gt−v^(St,θt)]∇θv^(St,θ)
【PS:蒙特卡洛中的
G
t
G_t
Gt 相当于 函数逼近中的
U
t
U_t
Ut】
其中 α \alpha α 值⽐较⼩。在随机梯度下降法中,似乎并不清楚为什么每⼀步采⽤很⼩的更新。难道我们不能在梯度的⽅向上移动很⼤的距离甚⾄完全 消除误差吗?在很多情况下确实可以这样做,但是通常这并不是我们想要的。请记住,我们的⽬的并不是在所有的状态找到精确的值函数,⽽是⼀ 个能平衡所有不同状态误差的值函数逼近。如果我们在⼀步中完全纠正了偏差,那么我们就⽆法找到这样的⼀个平衡了。因此较⼩的 α \alpha α 值可以维持这种平衡。
如图6.3所⽰为基于梯度的蒙特卡罗值函数逼近更新过程。蒙特卡罗⽅法的⽬标值函数使⽤⼀次试验的整个回报返回值:
基于时间差分法的函数逼近
我们再看时间差分⽅法。根据⽅程 θ t + 1 = θ t + α [ U t − v ^ ( S t , θ t ) ] ∇ θ v ^ ( S t , θ ) \theta_{t+1}=\theta_t + \alpha[U_t-\hat v(S_t,\theta_t)]{\nabla _\theta }\hat v({S_t},\theta ) θt+1=θt+α[Ut−v^(St,θt)]∇θv^(St,θ), T D ( 0 ) TD(0) TD(0) ⽅法中⽬标值函数为 U t = R t + 1 + γ v ^ ( S t + 1 , θ ) U_t=R_{t+1}+\gamma \hat v(S_{t+1},\theta) Ut=Rt+1+γv^(St+1,θ),即⽬标值函数⽤到了bootstrapping的⽅法。
基于半梯度的TD(0)值函数评估算法
我们注意到此时要更新的参数
θ
\theta
θ 不仅出现在要估计的值函数
v
^
(
S
t
,
θ
)
\hat v(S_t,\theta)
v^(St,θ) 中,还出现在⽬标值函数 $ U_t$ 中。若只考虑参数
θ
\theta
θ 对估计值函数
v
^
(
S
t
,
θ
)
\hat v(S_t,\theta)
v^(St,θ) 的影响⽽忽略对⽬标值函数
U
t
U_t
Ut 的影响,这种⽅法就不是完全的梯度法(只有部分梯度),因此也称为基于半梯度的TD(0)值函数评估算法,如图6.4 所⽰。
θ
t
+
1
=
θ
t
+
α
[
R
+
γ
v
^
(
S
′
,
θ
)
−
v
^
(
S
t
,
θ
t
)
]
∇
v
^
(
S
t
,
θ
t
)
{\theta _{t + 1}} = {\theta _t} + \alpha [R + \gamma \hat v(S',\theta ) - \hat v({S_t},{\theta _t})]\nabla \hat v({S_t},{\theta _t})
θt+1=θt+α[R+γv^(S′,θ)−v^(St,θt)]∇v^(St,θt)
基于半梯度的 Sarsa 算法
Sarsa 算法,简而言之就是:采样+bootrapping
与表格型强化学习相⽐,值函数逼近⽅法中把对值函数的更新换成了对参数的更新,参数的学习过程为监督学习。
到⽬前为⽌,我们还没有讨论要逼近的值函数的形式。值函数可以采⽤线性逼近也可采⽤⾮线性逼近。⾮线性逼近常⽤的是神经⽹络。
见下面 1.3 小节中讨论 要逼近的值函数的形式。
(2).批学习⽅法
前⾯讨论的是增量式⽅法更新。增量式⽅法参数更新过程随机性⽐较⼤,尽管计算简单,但样本数据的利⽤效率并不⾼。
我们再来看下批的⽅法,尽管它计算复杂,但计算效率⾼。 所谓批的⽅法是指给定经验数据集 D = { ⟨ s 1 , v 1 π ⟩ , ⟨ s 2 , v 2 π ⟩ , . . . , ⟨ s T , v T π ⟩ } D = \left\{ {\left\langle {{s_1},v_1^\pi } \right\rangle ,\left\langle {{s_2},v_2^\pi } \right\rangle ,...,\left\langle {{s_T},v_T^\pi } \right\rangle } \right\} D={⟨s1,v1π⟩,⟨s2,v2π⟩,...,⟨sT,vTπ⟩},找到最好的拟合函数: v ^ ( s , θ ) \hat v(s,\theta) v^(s,θ),使得 L S ( θ ) = ∑ t = 1 T ( v t π − v ^ t π ( s t , θ ) ) 2 LS(\theta ) = \sum\limits_{t = 1}^T {{{(v_t^\pi - \hat v_t^\pi ({s_t},\theta ))}^2}} LS(θ)=t=1∑T(vtπ−v^tπ(st,θ))2最小。
- 可用线性最小二乘逼近:
- 最⼩⼆乘蒙特卡罗⽅法参数为:
- 最⼩⼆乘差分⽅法为:
- 最⼩⼆乘
T
D
(
λ
)
TD(\lambda)
TD(λ) ⽅法为:
1.3 要逼近的值函数的形式
值函数可以采⽤线性逼近也可采⽤⾮线性逼近。⾮线性逼近常⽤的是神经⽹络。
下⾯我们仅讨论线性逼近: v ^ ( s , θ ) = θ T Φ ( s ) \hat v(s,\theta ) = {\theta ^T}\Phi (s) v^(s,θ)=θTΦ(s)
相⽐于⾮线性逼近,线性逼近的好处是只有⼀个最优值,因此可以收 敛到全局最优。其中 Φ ( s ) \Phi (s) Φ(s) 为状态 s s s 处的特征函数,或者称为基函数。
常⽤的基函数的类型如下。
- 多项式基函数,如 ( 1 , s 1 , s 2 , s 1 , s 2 , s 1 2 , s 2 2 , . . . ) (1,s_1,s_2,s_1,s_2,s_1^2,s_2^2,...) (1,s1,s2,s1,s2,s12,s22,...)
- 傅⾥叶基函数: Φ i ( s ) = c o s ( i π s ) , s ∈ [ 0 , 1 ] \Phi_i(s)=cos(i\pi s),s \in [0,1] Φi(s)=cos(iπs),s∈[0,1]
- 径向基函数: Φ i ( s ) = exp ( − ∣ ∣ s − c i ∣ ∣ 2 2 σ i 2 ) {\Phi _i}(s) = \exp ( - \frac{{||s - {c_i}|{|^2}}}{{2\sigma _i^2}}) Φi(s)=exp(−2σi2∣∣s−ci∣∣2)
将线性逼近值函数代⼊随机梯度下降法和半梯度下降法中,可以得到 参数的更新公式,不同强化学习⽅法更新公式如下。
- 蒙特卡罗⽅法值函数更新公式:
- TD(0)线性逼近值函数更新公式:
- 正向视⾓的
T
D
(
λ
)
TD(\lambda)
TD(λ) 更新公式:
- 后向视⾓的
T
D
(
λ
)
TD(\lambda)
TD(λ) 更新公式:
二、DQN及其变种
2.1 DQN⽅法
强化学习逐渐引起公众的注意要归功于⾕歌的DeepMind公司。 DeepMind公司最初是由Demis Hassabis,Shane Legg和Mustafa Suleyman于2010年创⽴的。创始⼈Hassabis 有三重⾝份:游戏开发者,神经科学家以及⼈⼯智能创业者。Hassabis 游戏开发者的⾝份使⼈不难理解DeepMind在 Nature上发表的第⼀篇论⽂是以雅达利(atari)游戏为背景的。同时, Hassabis⼜是国际象棋⾼⼿,他在挑战完简单的雅达利游戏后再挑战深奥的围棋游戏也就不难理解了。这就有了AlphaGo和李世⽯的2016之战,以 及他在Nature发表的第⼆篇论⽂。⼀战成名之后,深度强化学习再次博得 世⼈的眼球。当然,DeepMind 的成功离不开近⼏年取得突破进展的深度学习技术。本节主要讲解 DQN,也就是 DeepMind 发表在 Nature 上的第⼀ 篇论⽂,名字是 Human-level Control through Deep Reinforcement Learning。
平⼼⽽论,这篇论⽂只有两个创新点,即经验回放和设⽴单独的⽬标 ⽹络,后⾯我们会详细介绍。算法的⼤体框架是传统强化学习中的 Qlearning。我们已经在前面时间差分⽅法中阐述了。为了前后理解⽅便,我们再重新梳理下。
Qlearning⽅法是异策略时间差分⽅法。其伪代码如图6.6所⽰。
掌握 Qlearning ⽅法⼀定要明⽩两个概念——异策略和时间差分,以及 这两个概念在Qlearning算法是中如何体现的。下⾯我们⼀⼀介绍。
- 异策略,是指⾏动策略(产⽣数据的策略)和要评估的策略不是⼀个策略。在图6.6 的Qlearning 伪代码中,⾏动策略(产⽣数据的策略)是第5⾏的ε-greedy策略,⽽要评估和改进的策略是第6⾏的贪婪策略(每个状态取值函数最⼤的那个动作)。
- 时间差分⽅法,是指利⽤时间差分⽬标来更新当前⾏为值函数。在图 6.6 的Qlearning伪代码中,时间差分⽬标为 r t + γ max a Q ( s t + 1 , a ) r_t+\gamma\mathop {\max }\limits_a Q({s_{t + 1}},a) rt+γamaxQ(st+1,a)
Qlearning算法是1989年由Watkins提出来的,2015年Nature论⽂提到的DQN就是在Qlearning的基础上修改得到的。
DQN对Qlearning的修改主要体现在以下三个⽅⾯。
- DQN利⽤深度卷积神经⽹络逼近值函数;
- DQN利⽤了经验回放训练强化学习的学习过程;
- QN独⽴设置了⽬标⽹络来单独处理时间差分算法中的TD偏差
下⾯,我们对这三个⽅⾯做简要介绍。
-
DQN利⽤卷积神经⽹络逼近⾏为值函数。
如图6.7所⽰为DQN的⾏为值函数逼近⽹络。我们在6.1节已经介绍了值函数的逼近。只不过6.1节中讲的是线性逼近,即值函数由⼀组基函数和 ⼀组与之对应的参数相乘得到,值函数是参数的线性函数。⽽DQN的⾏为值函数利⽤神经⽹络逼近,属于⾮线性逼近。虽然逼近⽅法不同,但都属于参数逼近。请记住,此处的值函数对应着⼀组参数,在神经⽹络⾥参数 是每层⽹络的权重,我们⽤ θ \theta θ 表⽰。⽤公式表⽰的话值函数为 Q ( s , a ; θ ) Q(s,a;\theta) Q(s,a;θ)。 请留意,此时更新值函数时其实是更新参数 θ \theta θ ,当⽹络结构确定时, θ \theta θ 就代表值函数。DQN所⽤的⽹络结构是三个卷积层加两个全连接层,整体框 架如图6.7所⽰
利⽤神经⽹络逼近值函数的做法在强化学习领域早就存在了,可以追 溯到上个世纪 90 年代。当时学者们发现利⽤神经⽹络,尤其是深度神经⽹ 络逼近值函数不太靠谱,因为常常出现不稳定不收敛的情况,所以在这个 ⽅向上⼀直没有突破,直到DeepMind的出现。
我们要问,DeepMind到底做了什么?
别忘了DeepMind的创始⼈Hassabis是神经科学的博⼠。早在2005年, Hassabis就开始琢磨如何利⽤⼈的学习过程提升游戏的智能⽔平,为此他去伦敦⼤学开始攻读认知神经科学⽅向的博⼠,并很快有了突出成就,在 Science、Nature等顶级期刊狂发论⽂。他当时的研究⽅向是海⻢体——那么,什么是海⻢体?为什么要选海⻢体?
海⻢体是⼈类⼤脑中负责记忆和学习的主要部分,从Hassabis学习认知神经科学的⽬的来看,他选海⻢体作为研究⽅向就是⽔到渠成的事⼉了。
现在我们就可以回答,DeepMind到底做了什么?
他们将认识神经科学的成果应⽤到了深度神经⽹络的训练之中! -
DQN利⽤经验回放训练强化学习过程。
我们睡觉的时候,海⻢体会把⼀天的记忆重放给⼤脑⽪层。利⽤这个启发机制,DeepMind团队的研究⼈员构造了⼀种神经⽹络的训练⽅法:经验回放。
通过经验回放为什么可以令神经⽹络的训练收敛且稳定?
原因是:训练神经⽹络时,存在的假设是训练数据是独⽴同分布的, 但是通过强化学习采集的数据之间存在着关联性,利⽤这些数据进⾏顺序训练,神经⽹络当然不稳定。经验回放可以打破数据间的关联,如图6.8所⽰。
在强化学习过程中,智能体将数据存储到⼀个数据库中,再利⽤均匀随机采样的⽅法从数据库中抽取数据,然后利⽤抽取的数据训练神经⽹络。
这种经验回放的技巧可以打破数据之间的关联性,该技巧在2013年的 NIPS已经发布了,2015 年的 Nature 论⽂则进⼀步提出了⽬标⽹络的概念,以进⼀步降低数据间的关联性。 -
DQN设置了⽬标⽹络来单独处理时间差分算法中的TD偏差。
与表格型的Qlearning算法(图6.6)不同的是,利⽤神经⽹络对值函数进⾏逼近时,值函数的更新步更新的是参数 (如图 6.9 所⽰),DQN 利⽤了卷积神经⽹络。其更新⽅法是梯度下降法。因此图6.6中第6⾏值函数更新实际上变成了监督学习的⼀次更新过程,其梯度下降法为
θ t + 1 = θ t + α [ r + γ max a ′ Q ( s ′ , a ′ ; θ ) − Q ( s , a ; θ ) ] ∇ Q ( s , a ; θ ) {\theta _{t + 1}} = {\theta _t} + \alpha [r + \gamma \mathop {\max }\limits_{a'} Q(s',a';\theta ) - Q(s,a;\theta )]\nabla Q(s,a;\theta ) θt+1=θt+α[r+γa′maxQ(s′,a′;θ)−Q(s,a;θ)]∇Q(s,a;θ)
其中, r + γ max a ′ Q ( s ′ , a ′ ; θ ) r + \gamma \mathop {\max }\limits_{a'} Q(s',a';\theta ) r+γa′maxQ(s′,a′;θ) 是TD目标,在计算 max a ′ Q ( s ′ , a ′ ; θ ) \mathop {\max }\limits_{a'} Q(s',a';\theta ) a′maxQ(s′,a′;θ) 的时候用到的网络参数为:
我们称计算TD⽬标时所⽤的⽹络为TD⽹络。在DQN算法出现之前, 利⽤神经⽹络逼近值函数时,计算 TD ⽬标的动作值函数所⽤的⽹络参数,与梯度计算中要逼近的值函数所⽤的⽹络参数相同,这样就容易导致数据间存在关联性,从⽽使训练不稳定。为了解决此问题,DeepMind提出 计算TD⽬标的⽹络表⽰为 θ − \theta^- θ−;计算值函数逼近的⽹络表⽰为 θ \theta θ;⽤于动作值函数逼近的⽹络每⼀步都更新,⽽⽤于计算 TD⽬标的⽹络则是每个固定的步数更新⼀次。
最后我们给出DQN的伪代码,如图6.10a所⽰。
下⾯我们对DQN的伪代码逐⾏说明。
- 第[1]⾏,初始化回放记忆 D D D,可容纳的数据条数为 N N N;
- 第[2]⾏,利⽤随机权值 θ \theta θ 初始化动作-⾏为值函数 Q Q Q;
- 第[3]⾏,令 θ − = θ \theta^-=\theta θ−=θ 初始化,计算TD⽬标的动作⾏为值 Q Q Q;
- 第[4]⾏,循环每次事件;
- 第[5]⾏,初始化事件的第⼀个状态 s 1 s_1 s1 ,通过预处理得到状态对应的特征输⼊;
- 第[6]⾏,循环每个事件的每⼀步;
- 第[7]⾏,利⽤概率 ε \varepsilon ε选⼀个随机动作 a t a_t at ;
- 第[8]⾏,若⼩概率事件没发⽣,则⽤贪婪策略选择当前值函数最⼤的那个动作 a t = arg max a Q ( Φ ( s t ) , a ; θ ) {a_t} = \mathop {\arg \max }\limits_a Q(\Phi ({s_t}),a;\theta ) at=aargmaxQ(Φ(st),a;θ) ;
注意:这⾥选最⼤动作时⽤到的值函数⽹络与逼近值函数所⽤的⽹络是⼀个⽹络,都对应。
注意:第[7]⾏和第[8]⾏是⾏动策略,即ε-greedy策略。
- 第[9]⾏,在仿真器中执⾏动作 a t a_t at ,观测回报 r t r_t rt 以及图像 x t + 1 x_{t+1} xt+1 ;
- 第[10]⾏,设置 s t + 1 = s t , a t , x t + 1 s_{t+1}=s_t,a_t,x_{t+1} st+1=st,at,xt+1,预处理 Φ t + 1 = Φ ( s t + 1 ) \Phi_{t+1}=\Phi(s_{t+1}) Φt+1=Φ(st+1) ;
- 第[11]⾏,将转换 ( Φ t , a t , r t , Φ t + 1 ) (\Phi_t,a_t,r_t,\Phi_{t+1}) (Φt,at,rt,Φt+1) 储存在回放记忆 D D D 中;
- 第[12]⾏,从回放记忆 D D D 中均匀随机采样⼀个转换样本数据,⽤ ( Φ j , a j , r j , Φ j + 1 ) (\Phi_j,a_j,r_j,\Phi_{j+1}) (Φj,aj,rj,Φj+1) 表⽰;
- 第[13]⾏,判断是否是⼀个事件的终⽌状态,若是则TD⽬标为 r j r_j rj,否则 利⽤TD⽬标⽹络 θ − \theta^- θ− 计算TD⽬标 r + γ max a ′ Q ( s ′ , a ′ ; θ ) r + \gamma \mathop {\max }\limits_{a'} Q(s',a';\theta ) r+γa′maxQ(s′,a′;θ) ;
- 第[14]⾏,执⾏⼀次梯度下降算法
- 第[15]⾏,更新动作值函数逼近的⽹络参数 θ = θ + Δ θ \theta=\theta+\Delta \theta θ=θ+Δθ;
- 第[16]⾏,每隔 C C C 步更新⼀次TD⽬标⽹络权值,即令 θ − = θ \theta^-=\theta θ−=θ ;
- 第[17]⾏,结束每次事件内循环;
- 第[18]⾏,结束事件间循环。
我们可以看到,在第[12]⾏利⽤了经验回放;在第[13]⾏利⽤了独⽴的⽬标⽹络 θ − \theta^- θ−;第[15]⾏更新动作值函数逼近⽹络参数;第[17]⾏更新⽬标⽹络参数。
2.2 Double DQN
上⼀节我们讲了第⼀个深度强化学习⽅法DQN,DQN的框架仍然是 Qlearning。DQN 只是利⽤了卷积神经⽹络表⽰动作值函数,并利⽤了经验回放和单独设⽴⽬标⽹络这两个技巧。DQN⽆法克服Qlearning 本⾝所固有 的缺点——过估计。
那么什么是过估计?Qlearning为何具有过估计的缺点呢?
过估计是指估计的值函数⽐真实值函数要⼤。⼀般来说,Qlearning之 所以存在过估计的问题,根源在于Qlearning中的最⼤化操作。
Qlearning评估值函数的数学公式如下有两类:
- 对于表格型,值函数评估的更新公式为
Q ( s t , a t ) ← Q ( s t , a t ) + α [ r t + γ max a Q ( s t + 1 , a ) − Q ( s t , a t ) ] Q({s_t},{a_t}) \leftarrow Q({s_t},{a_t}) + \alpha [{r_t} + \gamma \mathop {\max }\limits_a Q({s_{t + 1}},a) - Q({s_t},{a_t})] Q(st,at)←Q(st,at)+α[rt+γamaxQ(st+1,a)−Q(st,at)] - 对于基于函数逼近的⽅法的值函数更新公式为
θ t + 1 ← θ t + α [ R t + 1 + γ max a Q ( S t + 1 , a ; θ t ) − Q ( S t , A t ; θ t ) ] ∇ θ Q ( S t , A t ; θ t ) {\theta _{t + 1}} \leftarrow {\theta _t} + \alpha [{R_{t + 1}} + \gamma \mathop {\max }\limits_a Q({S_{t + 1}},a;\theta_t ) - Q({S_t},{A_t};{\theta _t})]{\nabla _\theta }Q({S_t},{A_t};{\theta _t}) θt+1←θt+α[Rt+1+γamaxQ(St+1,a;θt)−Q(St,At;θt)]∇θQ(St,At;θt)
从以上两个式⼦我们知道,不管是表格型还是基于函数逼近的⽅法, 值函数的更新公式中都有max操作。
max操作使得估计的值函数⽐值函数的真实值⼤。如果值函数每⼀点 的值都被过估计了相同的幅度,即过估计量是均匀的,那么由于最优策略是贪婪策略,即找到最⼤的值函数所对应的动作,这时候最优策略是保持不变的。也就是说,在这种情况下,即使值函数被过估计了,也不影响最优的策略。强化学习的⽬标是找到最优的策略,⽽不是要得到值函数,所以这时候就算是值函数被过估计了,最终也不影响我们解决问题。然⽽, 在实际情况中,过估计量并⾮是均匀的,因此值函数的过估计会影响最终 的策略决策,从⽽导致最终的策略并⾮最优,⽽只是次优。
为了解决值函数过估计的问题,Hasselt 提出了 Double Qlearning 的⽅法。所谓Double Qlearning 是将动作的选择和动作的评估分别⽤不同的值函数来实现。
那么,什么是动作的选择?什么是动作的评估?我们做些简要的说明。
-
动作选择
在Qlearning的值函数更新中,TD⽬标为: Y t Q = R t + 1 + γ max a Q ( S t + 1 , a ; θ ) Y_t^Q = {R_{t + 1}} + \gamma \mathop {\max }\limits_a Q({S_{t + 1}},a;\theta ) YtQ=Rt+1+γamaxQ(St+1,a;θ)
在求TD⽬标 Y t Q Y_t^Q YtQ 的时候,我们⾸先需要选择⼀个动作即 a ∗ a^* a∗ ,该动作 a ∗ a^* a∗ 应该满⾜在状态 S t + 1 S_{t+1} St+1 处 Q ( S t + 1 , a ) Q(S_{t+1},a) Q(St+1,a) 最⼤,这就是动作选择。 -
动作评估
动作评估是指选出 a ∗ a^* a∗ 后,利⽤ a ∗ a^* a∗ 处的动作值函数构造TD⽬标。
⼀般Qlearning利⽤同⼀个参数 θ t \theta_t θt 来选择和评估动作。
Double Qlearning分别⽤不同的⾏为值函数选择和评估动作。
Double Qlearning的TD⽬标公式为
Y t D o u b l e Q = R t + 1 + γ Q ( S t + 1 , arg max a Q ( S t + 1 , a ; θ t ) ; θ t ′ ) Y_t^{DoubleQ} = {R_{t + 1}} + \gamma Q({S_{t + 1}},\mathop {\argmax}\limits_aQ(S_{t+1},a;\theta_t);\theta_t^{'} ) YtDoubleQ=Rt+1+γQ(St+1,aargmaxQ(St+1,a;θt);θt′)
从该公式我们看到,动作的选择所⽤的动作值函数为
arg max
a
Q
(
S
t
+
1
,
a
;
θ
t
)
\mathop {\argmax}\limits_aQ(S_{t+1},a;\theta_t)
aargmaxQ(St+1,a;θt)–> 这时动作值函数⽹络的参数为
θ
t
\theta_t
θt 。
当选出最⼤的动作
a
∗
a^*
a∗ 后,动作评估的公式为:
Y
t
D
o
u
b
l
e
Q
=
R
t
+
1
+
γ
Q
(
S
t
+
1
,
a
∗
;
θ
t
′
)
Y_t^{DoubleQ} = {R_{t + 1}} + \gamma Q({S_{t + 1}},a^*;\theta_t^{'} )
YtDoubleQ=Rt+1+γQ(St+1,a∗;θt′) --> 动作评估所⽤的动作值函数⽹络参数为
θ
t
′
\theta_t^{'}
θt′ 。
将Double Qlearning的思想应⽤到DQN中,则得到Double DQN即 DDQN,其TD⽬标为
Y t D o u b l e = R t + 1 + γ Q ( S t + 1 , arg max a Q ( S t + 1 , a ; θ t − ) ; θ t ′ ) Y_t^{Double} = {R_{t + 1}} + \gamma Q({S_{t + 1}},\mathop {\argmax}\limits_aQ(S_{t+1},a;\theta_t^{-});\theta_t^{'}) YtDouble=Rt+1+γQ(St+1,aargmaxQ(St+1,a;θt−);θt′)
2.3 优先回放(Prioritized Replay)
DQN 的成功归因于经验回放和独⽴的⽬标⽹络。Double DQN 改进了 Qlearning中的max操作,经验回放仍然采⽤均匀分布。经验回放时利⽤均匀分布采样并不是⾼效利⽤数据的⽅法。因为,智能体的经验即经历过的数据,对于智能体的学习并⾮具有同等重要的意义。智能体在某些状态的 学习效率⽐其他状态的学习效率⾼。优先回放的基本思想就是打破均匀采样,赋予学习效率⾼的状态以更⼤的采样权重。
如何选择权重?⼀个理想的标准是智能体学习的效率越⾼,权重越⼤。符合该标准的⼀个选择是TD偏差 δ \delta δ 。TD偏差越⼤,说明该状态处的值函数与TD⽬标的差距越⼤,智能体的更新量越⼤,因此该处的学习效率越⾼。
我们设样本 i i i 处的TD偏差为 δ i \delta_i δi,则该样本处的采样概率为:
P ( i ) = p i α ∑ k p k α P(i)=\frac{{p_i^\alpha }}{{\sum\nolimits_k {p_k^\alpha } }} P(i)=∑kpkαpiα
其中 p i α p_i^{\alpha} piα 由 TD 偏差 决定。⼀般有两种⽅法:
- 第⼀种⽅法是 p i = ∣ δ i ∣ + ε p_i=|\delta_i|+\varepsilon pi=∣δi∣+ε ;
- 第⼆种⽅法是 p i = 1 r a n k ( i ) p_i=\frac{1}{rank(i)} pi=rank(i)1,其中 r a n k ( i ) rank(i) rank(i) 根据 ∣ δ i ∣ |\delta_i| ∣δi∣ 的排序得到。
当我们采⽤优先回放的概率分布采样时,动作值函数的估计值是⼀个 有偏估计。因为采样分布与动作值函数的分布是两个完全不同的分布,为 了矫正这个偏差,我们需要乘以⼀个重要性采样系数 : w i = ( 1 N ⋅ 1 P ( i ) ) β w_i=(\frac{1}{N}·\frac{1}{P(i)})^\beta wi=(N1⋅P(i)1)β
带有优先回放的Double DQN的伪代码如图6.10b所⽰。
下⾯我们逐⾏说明该伪代码。
- 第[1]⾏,输⼊:确定minibatch的⼤⼩ k k k ,步⻓ η \eta η ,回放周期 K K K ,存储数据的总⼤⼩ N N N,常数 α , β \alpha,\beta α,β,总时间 T T T;
- 第[2]⾏,初始化回放记忆库 H = ∅ , Δ = 0 , p 1 = 0 {\rm H} = \emptyset ,\Delta = 0,{p_1} = 0 H=∅,Δ=0,p1=0;
- 第[3]⾏,观测初试状态 S 0 S_0 S0,选择动作 A 0 ∼ π θ ( S 0 ) A_0 \sim \pi_{\theta}(S_0) A0∼πθ(S0);
- 第[4]⾏,时间从 t = 1 t=1 t=1 到总时间 T T T,进⼊循环;
- 第[5]⾏,利⽤动作 A A A 作⽤于环境,环境返回观测 S t , R t , γ t S_t,R_t,\gamma_t St,Rt,γt ;
- 第[6]⾏,将数据 ( S t − 1 , A t − 1 , R t , γ t , S t ) (S_{t-1},A_{t-1},R_t,\gamma_t,S_t) (St−1,At−1,Rt,γt,St) 存储到记忆库 H {\rm H} H 中,且令其优先级为 p t = max i < t p i {p_t} = {\max _{i < t}}{p_i} pt=maxi<tpi ,采⽤该优先级初始化的⽬的是保证每个样本⾄少被利⽤⼀次;
- 第[7]⾏,每隔 K K K 步回放⼀次;
- 第[8]⾏:依次采集 k k k 个样本;
- 第[9]⾏,根据概率分布 j ∼ P ( j ) = p j α ∑ i p i α j \sim P(j) = \frac{{p_j^\alpha }}{{\sum\nolimits_i {p_i^\alpha } }} j∼P(j)=∑ipiαpjα 采样⼀个样本点;
- 第[10]⾏,计算样本点的重要性权重 w j = ( N ⋅ P ( j ) ) − β / max i w i {w_j} = {(N \cdot P(j))^{ - \beta }}/{\max _i}{w_i} wj=(N⋅P(j))−β/maxiwi ;
- 第[11]⾏,计算该样本点处的TD偏差 δ j = R j + γ j Q t arg e t ( S j , arg max a Q ( S j , a ) − Q ( S j − 1 , A j − 1 ) ) {\delta _j} = {R_j} + {\gamma _j}{Q_{t\arg et}}({S_j},\mathop {\arg \max }\limits_a Q({S_j},a) - Q({S_{j - 1}},{A_{j - 1}})) δj=Rj+γjQtarget(Sj,aargmaxQ(Sj,a)−Q(Sj−1,Aj−1))
- 第[12]⾏,更新该样本的优先级 p j ← ∣ δ j ∣ {p_j} \leftarrow |{\delta _j}| pj←∣δj∣;
- 第[13]⾏,累积权重的改变量 Δ ← Δ + w j ⋅ δ j ⋅ ∇ θ Q ( S j − 1 , A j − 1 ) \Delta \leftarrow \Delta + {w_j} \cdot {\delta _j} \cdot {\nabla _\theta }Q({S_{j - 1}},{A_{j - 1}}) Δ←Δ+wj⋅δj⋅∇θQ(Sj−1,Aj−1);
- 第[14]⾏,结束本样本的处理,采样下⼀个样本;
- 第[15]⾏,采样并处理完 k k k 个样本后更新权重值 θ ← θ + η ⋅ Δ \theta \leftarrow \theta + \eta \cdot \Delta θ←θ+η⋅Δ,重新设置 Δ = 0 \Delta=0 Δ=0;
- 第[16]⾏,偶尔地复制新权重到⽬标⽹络中,即 θ t arg e t ← θ {\theta _{t\arg et}} \leftarrow \theta θtarget←θ;
- 第[17]⾏,结束⼀次更新;
- 第[18]⾏,根据新的策略 A t ∼ π θ ( S t ) {A_t} \sim {\pi _\theta }({S_t}) At∼πθ(St) 选择下⼀个动作;
- 第[19]⾏,利⽤新的动作作⽤于环境,得到新数据,进⼊新循环。
需要注意的是第[9]⾏的采样⽅法需要对 P P P 的所有样本排序,这⾮常消耗计算能⼒,为了更好地采样,可以利⽤更⾼级的算法,如SumTree的⽅ 法,具体可参看相关论⽂。
2.4 Dueling DQN
不管是最初的DQN,还是由DQN演化出的Double DQN、经验优先回 放DQN在值函数逼近时所⽤的神经⽹络都是卷积神经⽹络。Dueling DQN 则从⽹络结构上改进了 DQN。动作值函数可以分解为状态值函数和优势函 数(本书第 8 章有形象的解释),即
Q π ( s , a ) = V π ( s ) + A π ( s , a ) {Q^\pi }(s,a) = {V^\pi }(s) + {A^\pi }(s,a) Qπ(s,a)=Vπ(s)+Aπ(s,a)
前⾯介绍的各类DQN⽅法,直接利⽤神经⽹络逼近 KaTeX parse error: Expected 'EOF', got '}' at position 7: Q^\pi }̲(s,a) ,Dueling DQN则对
V
π
(
s
)
{V^\pi }(s)
Vπ(s)和
A
π
(
s
,
a
)
{A^\pi }(s,a)
Aπ(s,a) 分别利⽤神经⽹络逼近,其⽹络结构如图6.10c 所⽰。
三、函数逼近方法
本章第⼀节介绍了基于值函数逼近的强化学习算法。这⼀节我们扩展视野,从数学的⾓度去全⾯了解函数逼近⽅法。函数逼近⽅法可以分为基于参数的函数逼近⽅法和基于⾮参数的函数逼近⽅法。下⾯我们详细介绍。
3.1 基于非参数的函数逼近
基于⾮参数的函数逼近,并⾮指没有任何参数的函数逼近,⽽是指参数的个数和基底的形式并⾮固定、由样本决定的逼近⽅法。
我们举个例⼦。⽐如已知训练样本为 N 个的数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
…
,
(
x
N
,
y
N
)
}
T=\{(x_1 ,y_1), (x_2 ,y_2 ),…,(x_N ,y_N)\}
T={(x1,y1),(x2,y2),…,(xN,yN)},求逼近这些样本点的函数。
我们先看看基于参数的⽅法是怎么做的。
正如前⾯所说,基于参数的⽅法是先选⼀组基函数
ϕ
i
(
x
)
\phi_i(x)
ϕi(x) ,然后设函数的形式为
f
(
x
)
=
∑
i
=
1
m
θ
i
ϕ
i
(
x
)
f(x) = \sum\limits_{i = 1}^m {{\theta _i}\phi_i(x)}
f(x)=i=1∑mθiϕi(x),利⽤训练数据集和优化⽅法得到参数
θ
1
,
.
.
.
,
θ
m
\theta_1,...,\theta_m
θ1,...,θm 。这种基于参数的⽅法,不管训练集数据量的多少,基函数的形 式、参数的个数都是事先给定的。
基于⾮参数的函数逼近⽅法则不同,在⾮参数的函数逼近中,每个样本都会成为函数逼近的⼀部分。如基于核的函数逼近,最终逼近的函数形式为:
f ( x ) = ∑ i = 1 N α i y i K ( x , x i ) + b f(x) = \sum\limits_{i = 1}^N {{\alpha_i y_i} K(x,x_i)+b} f(x)=i=1∑NαiyiK(x,xi)+b
从上式中我们看到,最后的函数逼近形式 由 N N N 个基函数组成,这⾥的 N N N 为样本的数⽬,每个基函数 y i K ( x , x i ) y_iK(x,x_i) yiK(x,xi) 对应着训练数据集中的⼀个样本点 ( x i , y i ) (x_i,y_i) (xi,yi) ,因此样本数越多,函数项越多。⾮参数的函数逼近是基于样 本数据推测未知数据的⼀种⽅法。常⽤的⾮参数的函数逼近⽅法包括基于 核函数的⽅法和基于⾼斯过程的⽅法。下⾯我们⼀⼀介绍。
3.1.1 基于核函数的方法
利⽤核函数法逼近函数的关键是将问 题构造成⼀个带有核函数的优化问题。
核函数的提出与⽀持向量机(SVM)有密切的联系。所以,我们先了 解⽀持向量机求解问题的推导过程。
【可以借鉴之前总结的支持向量机的推导过程:SVM原理介绍】
下面是书中给出的步骤:
3.1.2 基于⾼斯过程的⽅法
3.2 基于参数的函数逼近
3.3 卷积神经网络