基于值函数逼近的强化学习方法

1、表格型强化学习方法

  状态值函数可以利用动态规划法,MC或者TD的方法计算得到。此时的值函数表达为一个表格。值函数迭代更新过程实际上就是对这张表格进行迭代更新。因此,以前的强化学习算法又称为表格型强化学习。若状态空间的维数很大,或者状态空间为连续空间,此时值函数无法用一张表格来表示。这时,需要采用函数逼近的方法表示值函数。

2、值函数逼近方法理论

在这里插入图片描述
  当采用值函数逼近方法表示后,就可以利用策略迭代和值迭代方法了。在值函数逼近方法中。值函数对应着一个逼近函数 v ^ ( s ) \hat v(s) .

2.1 值函数逼近方法的分类

在这里插入图片描述
  函数逼近方法可以分为线性(一般选定基函数)和非线性逼近(尤其是基于深度神经网络的方法),参数逼近和非参数逼近,一般使用参数逼近,本文主要介绍参数逼近方法(值函数可以由一组参数来近似),逼近的值函数写作 v ^ ( s , θ ) \hat v(s, \theta)

2.2、值函数逼近和表格型强化学习方法的比较

  1. 表格型强化学习在更新值函数时,只有当前状态 S t S_t 处的值函数改变,其他地方的值函数不改变。
  2. 值函数逼近方法更新值函数的时候,更新的是参数θ,而估计的值函数为 v ^ ( s , θ ) \hat v(s,\theta) ,所以当参数θ发生改变,任意状态处的值函数都会发生改变。

值函数逼近方法的优点:

  • 可以降低输入维度,减少计算量
  • 可以提高泛化能力,避免over-fitting。
  • 可以使目标函数对于参数可微,使用基于梯度的计算方法。

2.3、参数化逼近

  当逼近的值函数结构确定时,值函数的逼近等价于参数的逼近。值函数的更新也就等价于参数的更新。即,需要利用试验数据来更新参数值。值函数的更新过程是向着目标值函数靠近。
回顾一下表格型强化学习值函数的更新公式:
蒙特卡罗法: Q ( s , a ) Q ( s , a ) + α ( G t Q ( s , a ) ) Q(s,a) \leftarrow Q(s,a) + \alpha ({G_t} - 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)]
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)]
  从以上公式中看出,无论是蒙特卡罗方法,还是时间差分法,都是朝着一个目标值更新的,这个目标值在蒙特卡罗方法中是 G t G_t ,在时间差分法中是 r + γ Q ( s , a ) r+\gamma Q(s',a') ,在TD(λ)法中是 G t λ G_t^\lambda
  而值函数逼近 v ^ ( s , θ ) \hat v(s,\theta) 是一个监督学习过程,其数据和标签对为 ( S t , U t ) (S_t,U_t) ,其中 U t U_t 等价于蒙特卡罗方法中的 G t G_t ,TD方法中的 r + γ Q ( s , a ) r+\gamma Q(s',a') ,以及在TD(λ)法中的 G t λ G_t^\lambda
训练的目标函数为: arg min θ ( q ( s , a ) q ^ ( s , a , θ ) ) 2 \mathop {\arg \min }\limits_\theta {(q(s,a) - \hat q(s,a,\theta ))^2}

2.4、增量式学习方法

  值函数更新可分为增量式更新和批量式学习方法,其中增量式方法餐宿合更新过程随机性比较大,尽管计算简单,但样本数据的利用效率并不高。而批量方法尽管计算复杂,但计算效率高。本文主要介绍增量式学习方法,其中随机梯度下降法是最常用的增量式学习方法。
随机梯度下降法: 由训练的目标函数得到参数的随机梯度更新为: θ 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) ,其中 θ \theta 的增量由三部分组成,分别是学习率α,误差 U t v ^ ( S t , θ t ) U_t-\hat v(S_t,\theta_t) ,以及目标函数的梯度组成。

2.4.1、基于蒙特卡罗方法的函数逼近

  给定要评估的策略π,产生一次试验:
在这里插入图片描述
  值函数更新过程实际是一个监督学习过程,其中监督数据集从蒙特卡罗的试验中得到,数据集为 < s 1 , G 1 > , < s 2 , G 2 > , < s 3 , G 3 > , < s 4 , G 4 > , . . . , < s T , G T > <s_1,G_1>,<s_2,G_2>,<s_3,G_3>,<s_4,G_4>,...,<s_T,G_T>
值函数的更新为: Δ θ = α ( G t v ^ ( S t , θ ) ) θ v ^ ( S t , θ ) \Delta \theta = \alpha ({G_t} - \hat v({S_t},\theta )){\nabla _\theta }\hat v({S_t},\theta )
  其中α值比较小,在随机梯度下降法中,需要一个能平衡所有不同状态误差的值函数逼近。α值取得比较小可以维持这种平衡。
下面算法所示为基于梯度的蒙特卡罗值函数逼近更新过程。
在这里插入图片描述
注:在算法公式中的w就是本文提到的θ。

2.4.2、基于时间差分法的值函数逼近

  根据之前的方程,TD(0)方法中目标值函数为 U t = R t + 1 + γ v ^ ( S t + 1 ) U_t=R_{t+1}+\gamma \hat v(S_{t+1}) ,目标函数用到了bootstrapping的方法。参数更新公式为: Δ θ = α [ R t + 1 + γ v ^ ( S t + 1 ) v ^ ( S t , θ t ) ] v ^ ( S t , θ t ) \Delta \theta=\alpha[R_{t+1}+\gamma \hat v(S_{t+1})-\hat v(S_t,\theta_t)]\nabla\hat v(S_t,\theta_t) ,更新的参数θ不仅出现在要估计的值函数 v ^ ( S t , θ ) \hat v(S_t,\theta) 中,还出现在目标值函数 U t U_t 中。若只考虑参数 θ \theta 对估计值函数 v ^ ( S t , θ ) \hat v(S_t,\theta) 的影响,而忽略对目标值函数 U t U_t 的影响,这种方法就不是完全的梯度法(只有部分梯度),称为基于半梯度的TD(0)值函数评估算法,算法伪代码如下:
基于半梯度的TD(0)值函数评估法

2.4.3、值函数逼近的形式

  值函数既可以采用线性逼近也可以采用非线性逼近。非线性逼近常用的是神经网络。
线性逼近:
  公式: v ^ ( s , θ ) = θ T ϕ ( s ) \hat v(s,\theta)=\theta^T\phi(s) ,相比与非线性逼近,线性逼近的好处是只有一个最优值,因此可以收敛到全局最优。其中 ϕ ( s ) \phi(s) 为状态s处的特征函数,或称为基函数。常用的基函数类型有:

  • 多项式基函数,如: ( 1 , s 1 , s 2 , s 1 s 2 , s 1 2 , . . . ) (1,s_1,s_2,s_1s_2,s_1^2,...)
  • 傅里叶基函数: ϕ i ( s ) = c o s ( i π s ) , s [ 0 , 1 ] \phi_i(s)=cos(i\pi s),s\in[0,1]
  • 径向基函数: ϕ i ( s ) = e s c i 2 2 σ i 2 \phi_i(s)=e^{-\frac{||s-c_i||^2}{2\sigma_i^2}}

  将线性逼近值函数代入随机梯度下降法和半随机梯度下降法中,可以得到参数的更新公式:

  1. 蒙特卡罗法的参数更新公式: Δ θ = α ( G t v ^ ( S t , θ ) ) θ v ^ ( S t , θ ) = α [ G t θ T ϕ ] ϕ \Delta \theta = \alpha ({G_t} - \hat v({S_t},\theta )){\nabla _\theta }\hat v({S_t},\theta )=\alpha[G_t-\theta^T\phi]\phi
  2. TD(0)线性逼近值函数更新为: Δ θ = α ( R + γ θ T ϕ ( s ) θ T ϕ ( s ) ] ϕ ( s ) \Delta \theta = \alpha (R+\gamma\theta^T\phi(s')-\theta^T\phi(s)]\phi(s)
  3. 正向视角的TD(λ)更新为: Δ θ = α ( G t λ θ T ϕ ) ϕ \Delta \theta=\alpha(G_t^{\lambda}-\theta^T\phi)\phi
  4. 后向视角的TD(λ)更新为: Δ θ = α δ t E t , δ t = R t + 1 + γ θ T ϕ ( s ) θ T ϕ ( s ) , E t = γ λ E t 1 + ϕ ( s ) \Delta\theta=\alpha\delta_tE_t,\delta_t=R_{t+1}+\gamma\theta^T\phi(s')-\theta^T\phi(s),E_t=\gamma\lambda E_{t-1}+\phi(s)

2.5、批量式方法

  所谓批量式的方法是指给定经验数据集 D = { < s 1 , v 1 π > , < s 2 , v 2 π > , . . . , < s T , v T π > } D=\{<s_1,v_1^\pi>,<s_2,v_2^\pi>,...,<s_T,v_T^\pi>\} ,找到最好的拟合函数 v ^ ( s , θ ) \hat v(s,\theta) ,使得 L S ( θ ) = t = 1 T ( v t π v ^ t π ( s t , θ ) ) LS(\theta)=\sum\limits_{t=1}^T(v_t^\pi-\hat v_t^\pi(s_t,\theta)) 最小。
可以利用线性最小二乘逼近: Δ θ = t = 1 T ( v t π θ T ϕ ( s t ) ) ϕ ( s t ) = 0 \Delta\theta=\sum\limits_{t=1}^T(v_t^\pi-\theta^T\phi(s_t))\phi(s_t)=0
5. 最小二乘法蒙特卡罗方法参数为: θ = ( t = 1 T ϕ ( s t ) ϕ ( s t ) T ) 1 t = 1 T ϕ ( s t ) G t \theta=(\sum\limits_{t=1}^T\phi(s_t)\phi(s_t)^T)^{-1}\sum\limits_{t=1}^T\phi(s_t)G_t
6. 最小二乘差分方法: θ = ( t = 1 T ϕ ( s t ) ( ϕ ( s t ) γ ϕ ( s t + 1 ) ) T ) 1 t = 1 T ϕ ( s t ) R t + 1 \theta=(\sum\limits_{t=1}^T\phi(s_t)(\phi(s_t)-\gamma\phi(s_{t+1}))^T)^{-1}\sum\limits_{t=1}^T\phi(s_t)R_{t+1}
7. 最小二乘TD(λ)方法: θ = ( t = 1 T E t ( ϕ ( s t ) γ ϕ ( s t + 1 ) ) T ) 1 t = 1 T E t R t + 1 \theta=(\sum\limits_{t=1}^TE_t(\phi(s_t)-\gamma\phi(s_{t+1}))^T)^{-1}\sum\limits_{t=1}^TE_tR_{t+1}

3、DQN

  DQN是深度强化学习(DRL)的开山之作,它是将深度学习与强化学习结合起来从而实现从感知(Perception)到动作(Action)的端对端(End-to-end)学习的一种全新的算法。两篇Nature上的奠基性论文(DQN和AlphaGo)使得此交叉方向变得炙手可热,成功地开创了新的方向,既具有极大学术价值也具有很高的商业价值。
在这里插入图片描述

3.1、DQN的基本思路

  1. 深度学习的成果,比如CNN,极大地增强了DL处理raw pixel数据的信心。DQN中的输入采用的是原始图像数据,这是DQN最有意义的一步。
  2. DQN的算法对所有游戏是通用的(甚至超参数也是通用的),而这种通用性的重要基础之一就是它能使用raw pixels。
  3. 它的关键步骤在于experience replay。其主要作用是克服经验数据的相关性(correlated data)和非平稳分布(non-stationary distribution)问题。

对Q学习的修改:
  DQN中的CNN作用是对在高维且连续状态下的Q-Table做函数拟合。而对于函数优化问题,监督学习的一般方法是先确定Loss Function,然后求梯度,使用随机梯度下降等方法更新参数。DQN是基于Q-Learning来确定Loss Function。DQN对Q-learning的修改主要体现在三个方面:

  • DQN利用深度卷积神经网络逼近值函数
  • DQN利用了经验回放对强化学习的学习过程进行训练
  • DQN独立设置了目标网络来单独处理时间差分算法中的TD偏差。

3.2、DQN第一版本思路-构造目标函数

  1. DQN是基于Q-learning来确定Loss Function。
  2. Q-learning的更新公式: Q ( s , a ) = Q ( s , a ) + α ( r + γ m a x Q ( s , a ) Q ( s , a ) ) Q'(s,a)=Q(s,a)+\alpha(r+\gamma maxQ(s',a')-Q(s,a))
  3. DQN的Loss Function为 L ( θ ) = E [ ( T a r g e t Q Q ( s , a ; θ ) ) 2 ] L(\theta)=E[(TargetQ-Q(s,a;\theta))^2]
  4. 其中θ是网络参数,目标为 T a r g e t Q = r + γ m a x a Q ( s , a ; θ ) TargetQ=r+\gamma\mathop{max}\limits_{a'}Q(s',a';\theta)
  5. Loss Function是基于Q-learining更新公式的第二项确定的,都是使当前的Q值逼近Target Q值
  6. 然后求L(θ)关于θ的梯度,使用SGD等方法更新网络参数θ。

3.2.1、DQN思路—经验池

  经验池的功能主要是解决相关性及非静态分布的问题。及具体做法是把每个时间步agent与环境交互得到的转移样本存放在回放记忆单元,要训练时就随机拿出一些(minibatch)来训练。其实就是将游戏的过程打成碎片存储,训练时随机抽取就避免了相关性问题。这样至少有两个好处:

  • 数据利用率高,因为一个样本被多次使用。
  • 连续样本的相关性会使参数更新的方差(variance)比较大,该机制可减少这种相关性。

3.2.2、DQN网络模型

在这里插入图片描述

  输入的是被处理成灰度图的最近4帧84×84图像,经过几个卷积层(没有池化层)后接两个全连接层,输出是所有动作的Q值。

3.2.3、DQN算法描述

  1. 用一个深度神经网络来作为Q值的网络,参数为ω: Q ( s , a , ω ) Q π ( s , a ) Q(s,a,\omega)\approx Q^\pi(s,a)
  2. 在Q值中使用均方差来定义目标函数objective function: L ( ω ) = E [ ( r + γ × m a x a Q ( s , a , ω ) Q ( s , a , ω ) 2 ) ] L(\omega)=E[(r+\gamma\times\mathop{max}\limits_aQ(s',a',\omega)-Q(s,a,\omega)^2)]
  3. 计算参数ω关于loss function的梯度: L ( ω ) ω = E [ ( r + γ max a Q ( s , a , ω ) Q ( s , a , ω ) ) Q ( s , a , ω ) ω ] \frac{{\partial L(\omega )}}{{\partial \omega }} = E[(r + \gamma \mathop {\max }\limits_a Q(s',a',\omega ) - Q(s,a,\omega ))\frac{{\partial Q(s,a,\omega )}}{{\partial \omega }}]
  4. 使用SGD实现End-to-end的优化目标

网络的输入是4个84×84的灰度游戏屏幕。输出是每一个可能动作的Q值(Atari中有18个动作)。
DQN网络结构图如下:
在这里插入图片描述
DQN_V1的伪代码:
在这里插入图片描述
代码解读:

  1. 第一行,初始化回放记忆D,可容纳的数据条数为N;
  2. 第二行,利用随机权值θ初始化Q函数
  3. 第三行,循环每个episode
  4. 第四行,初始化episode的第一个状态s1通过预处理得到状态对应的特征输入(特征是状态的函数)
  5. 第五行,循环每个时间的每一步
  6. 第六行,利用概率ε选一个随机动作 a t a_t
  7. 第七行,若小概率时间没有发生则用贪婪策略选择当前值函数最大的那个动作(注:第六行和第七行用到的 ϵ g r e e d y \epsilon-greedy 策略)
  8. 第八行,在仿真器中执行动作 a t a_t ,观察回报 r t r_t 以及图像 x t + 1 x_{t+1}
  9. 第九行,设置 s t + 1 = s t , a t , x t + 1 s_{t+1}=s_t,a_t,x_{t+1} ,预处理 ϕ t + 1 = ϕ ( s t + 1 ) \phi_{t+1}=\phi(s_{t+1})
  10. 第十行,将转换 ( ϕ t , a t , r t , ϕ t + 1 ) (\phi_t,a_t,r_t,\phi_{t+1}) 存储在回放记忆D中;
  11. 第十一行,从回放记忆D中均匀随机采样一个转换样本数据,用 ( ϕ j , a j , r j , ϕ j + 1 ) (\phi_j,a_j,r_j,\phi_{j+1}) 表示;
  12. 第十二行,判断是否是一个事件的终止状态,若是则TD目标为 r j r_j ,否则利用TD目标网络 θ \theta^- 计算TD目标 r + γ m a x a Q ( s , a ; θ ) r+\gamma\mathop{max}\limits_{a'}Q(s',a';\theta^-)
  13. 第十三行,执行一次梯度下降算法: Δ θ = α [ r + γ m a x a Q ( s , a ; θ ) Q ( s , a ; θ ) ] Q ( s , a ; θ ) \Delta\theta=\alpha[r+\gamma\mathop{max}\limits_{a'}Q(s',a';\theta)-Q(s,a;\theta)]\nabla Q(s,a;\theta)
  14. 第十四行,结束每次事件内循环
  15. 第十五行,结束事件之间的循环

3.3、DQN第二版本

3.3.1、算法实现

  Nature2015文章,对DQN作了改进和完善,其中对于算法上的变化最主要是引入了单独的Q函数网络,用另一个网络(称为TargetNet)产生Target Q值。 Q ( s , a ; θ i ) Q(s,a;\theta_i) 表示当前网络MainNet的输出,用来评估当前状态动作对的值函数; Q ( s , a ; θ i ) Q(s,a;\theta_i^-) 表示TargetNet的输出,代入这里求TargetQ值的公式中得到目标Q值。 T a r g e t Q = r + γ m a x a Q ( s , a ; θ ) TargetQ=r+\gamma\mathop{max}\limits_{a'}Q(s',a';\theta) ,根据之前的Loss Function更新MainNet的参数,每经过N轮迭代,将MainNet的参数复制给Target。引入TargetNet后,再一段时间里目标Q值是保持不变的,一定程度降低了当前Q值和目标Q值的相关性,提高了算法稳定性。算法如下:
在这里插入图片描述
  与DQN_V1算法的区别是,在第一版本的基础上进行了改进,第三行有两个网络的初始权值一致即: θ = θ \theta^-=\theta ,在倒数第五行中梯度下降算法为 Δ θ = α [ r + γ m a x a Q ( s , a ; θ ) Q ( s , a ; θ ) ] Q ( s , a ; θ ) \Delta\theta=\alpha[r+\gamma\mathop{max}\limits_{a'}Q(s',a';\theta^-)-Q(s,a;\theta)]\nabla Q(s,a;\theta) ,倒数第三行中每隔C步更新一次TD目标权值,即 θ = θ \theta^-=\theta

3.3.2、Loss Function的构造

在这里插入图片描述

发布了19 篇原创文章 · 获赞 25 · 访问量 2418

猜你喜欢

转载自blog.csdn.net/fly975247003/article/details/101678913
今日推荐