【强化学习理论基础-通用】(34)从零开始白话给你讲[数学原理]:值函数近似,Sarsa 与 Q-learning 使用 function approximation 示例

若需观看机器人系列相关博客,请劳驾至:【足式机器人无死角系列之-【强化学习基础-通用】、【仿真及训练环境】、【强化学习】:isaac-gym 与 isaac-lab 从零开始

郑重声明:该系列博客为本人 ( W e n h a i Z h u ) 独家私有 , 禁止转载与抄袭 , 首次举报有谢 , 若有需请私信授权! \color{red}郑重声明:该系列博客为本人(WenhaiZhu)独家私有,禁止转载与抄袭,首次举报有谢,若有需请私信授权! 郑重声明:该系列博客为本人(WenhaiZhu)独家私有,禁止转载与抄袭,首次举报有谢,若有需请私信授权!

回顾:通过前面一系列博客的介绍,对于值函数近似的基本原理应当是比较熟悉了,且对深度学习没有流行之前,被广泛使用的 linear function approximation(线性函数拟合) 进行了详细的介绍,且在上一篇博客中通过平面与曲面拟合的示例,详细介绍如何选取合适的特征向量(feature vector)。

本系列博客链接为: {\color{blue}本系列博客链接为:} 本系列博客链接为:【强化学习理论基础-通用】(01)从零开始白话给你讲,简单推导公式,深刻理解,一眼万年!:https://blog.youkuaiyun.com/weixin_43013761/article/details/143168169

本博客编写于: 20250125 ,台式机为 u b u n t u 20.04 , 3090 G e F o r c e R T X 显存 24 G { \color{purple} 本博客编写于:20250125,台式机为 ubuntu 20.04,3090 GeForce RTX 显存24G} 本博客编写于:20250125,台式机为ubuntu20.043090GeForceRTX显存24G:与你现在的代码,或者环境等存在一定差异也在情理之中,故切勿认为该系列博客绝对正确,且百密必有一疏,若发现错误处,恳请各位读者直接指出,本人会尽快进行整改,尽量使得后面的读者少踩坑,评论部分我会进行记录与感谢,只有这样,该系列博客才能成为精品,这里先拜谢各位朋友了。

文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证,请备注 强化学习 。 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证,请备注\color{red} 强化学习}。 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX官方认证,请备注强化学习

一、前言

虽然通过前面一系列博客虽然已经了解值函数近似的原理,且熟悉 linear function approximation(线性函数拟合) 特征向量(feature vector) 应该如何选取。不过总的来说,前面的推导或者说示例过程,为了简单易懂使用一维的方式引入,即对状态价值进行估计。总的来说,是为了理解其核心实现。

该篇博客开始,将会开始通过值函数近似对 action(动作)价值评估进行拟合,相对于状态价值的拟合其要更加复杂一些,因为 action(动作) 价值评估需要考虑状态 s s s 的同时还需要考虑动作 a a a,类似于二维的感觉。在前面的学习过程中,接触到的动作价值评估算法有 TD-SV、Sarsa、Expected Sarsa、 n-step Sarsa 以及 Q-learning,不过前面介绍这些算法都是基于表格,或者说离散形式进行推导与应用的,接下来将使用连续函数去拟合这些离散算法。

二、迭代公式(Sarsa)

首先回顾一下值函数近似状态价值的博客:【强化学习理论基础-通用】(32)从零开始白话给你讲[数学原理]:值函数近似,目标函数 与 linear function approximation,其首先构建目标函数:: J ( w ) = 1 2 E [ ( v π ( S ) − v ^ ( S , w ) ) 2 ] (01) \color{green} \tag{01} J(w)=\frac{1}{2}\mathbb{E}\left[\left(v_{\pi}(S)-\hat{v}(S, w)\right)^{2}\right] J(w)=21E[(vπ(S)v^(S,w))2](01)该目标函数对 w w w 求梯度(因为优化的参数是 w w w): ∇ w J ( w ) = − E [ ( v π ( S ) − v ^ ( S , w ) ) ∇ w v ^ ( S , w ) ] (02) \color{green} \tag{02} \nabla_{w} J(w)=- \mathbb{E}\left[\left(v_{\pi}(S)-\hat{v}(S, w)\right) \nabla_{w} \hat{v}(S, w)\right] wJ(w)=E[(vπ(S)v^(S,w))wv^(S,w)](02)进一步根据梯度下降算法,或者说罗宾逊-蒙罗算法(Robbins-Monro algorithm):【强化学习理论基础-通用】(17)从零开始白话给你讲[数学原理]:随机近似(Stochastic Approximation),罗宾逊-蒙罗算法(Robbins-Monro algorithm),构建迭代优化等式如下:
w t + 1 = w t + α t ( v π ( s t ) − v ^ ( s t , w t ) ) ∇ w v ^ ( s t , w t ) (03) \color{green} \tag{03} w_{t+1}=w_{t}+\alpha_{t}\left(v_{\pi}\left(s_{t}\right)-\hat{v}\left(s_{t}, w_{t}\right)\right) \nabla_{w} \hat{v}\left(s_{t}, w_{t}\right) wt+1=wt+αt(vπ(st)v^(st,wt))wv^(st,wt)(03)虽然结果基本已经推导出来,但是其中 v π v_{\pi} vπ 是理想真值,属于未知量,故退而求其次采用蒙特卡洛(MC)算法,或者时序差分(TD)算法去代替 v π v_{\pi} vπ,这里采用后者,即 r k + 1 + γ v k ( s t + 1 ) r_{k+1}+\gamma v_{k}\left(s_{t+1}\right) rk+1+γvk(st+1) 代替 v π v_{\pi} vπ,那么可得: w t + 1 = w t + α t [ r t + 1 + γ v ^ ( s t + 1 , w t ) − v ^ ( s t , w t ) ] ∇ w v ^ ( s t , w t ) (04) \color{green} \tag{04} w_{t+1}=w_{t}+\alpha_{t}\left[r_{t+1}+\gamma \hat{v}\left(s_{t+1}, w_{t}\right)-\hat{v}\left(s_{t}, w_{t}\right)\right] \nabla_{w} \hat{v}\left(s_{t}, w_{t}\right) wt+1=wt+αt[rt+1+γv^(st+1,wt)v^(st,wt)]wv^(st,wt)(04)上述就是对时序差分(TD)状态价值估算的近似函数迭代公式,关于动作价值的函数近似,只需要把上式中的 v ^ ( s t + 1 , w t ) \hat{v}\left(s_{t+1}, w_{t}\right) v^(st+1,wt) 替换成 q ^ ( s t + 1 , a t , w t ) \hat{q}\left(s_{t+1}, a_t,w_{t}\right) q^(st+1,at,wt) v ^ ( s t , w t ) \hat{v}\left(s_{t}, w_{t}\right) v^(st,wt) 替换成 q ^ ( s t , a t , w t ) \hat{q}\left(s_{t},a_t, w_{t}\right) q^(st,at,wt) 即可,如下: 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 ) (05) \color{red} \tag{05} w_{t+1}=w_{t}+\alpha_{t}\left[r_{t+1}+\gamma {\color{blue} \hat{q}\left(s_{t+1}, a_{t+1}, w_{t}\right)}-{\color{blue} \hat{q}\left(s_{t}, a_{t}, w_{t}\right)}\right] \nabla_{w} {\color{blue} \hat{q}\left(s_{t}, a_{t}, w_{t}\right)} wt+1=wt+αt[rt+1+γq^(st+1,at+1,wt)q^(st,at,wt)]wq^(st,at,wt)(05) 具体的推导细节可以可以参考一下 【强化学习理论基础-通用】(24)从零开始白话给你讲[数学原理]:时序差分(Temporal-Difference) - action values(Sarsa),其是基于表格或者离散的方式,再结合(01)式构建关于动作价值的目标函数: J ( w ) = 1 2 E [ ( q π ( S , A ) − q ^ ( S , A , w ) ) 2 ] (06) \color{green} \tag{06} J(w)=\frac{1}{2}\mathbb{E}\left[\left(q_{\pi}(S,A)-\hat{q}(S, A,w)\right)^{2}\right] J(w)=21E[(qπ(S,A)q^(S,A,w))2](06)然后求导,再利用梯度下降或者 RM 算法即可,这里的目标函数是最小化动作价值误差。无论(04)式还是(05)式,其都是对价值评估策略进行优化,目的是为了让价值评估策略的评估结果更加准确,即两者都在优化  policy evaluation { \color{purple} \text{ policy evaluation}}  policy evaluation,而非优化动作决策策略。

三、Sarsa伪代码分析(on-policy)

1、基本概念

通过前面的知识积累可以知道强化学习可以划分为 on-policy 与 off-policy 两个类比,具体如何区别判断可以参考前面博客 【强化学习理论基础-通用】(28)从零开始白话给你讲[数学原理]:时序差分算法 --> Q-learning 伪代码(on-policy 与 off-policy),示例对比说明 ,且通过 Q-learning 算法同时实现 on-policy 与 off-policy,另外还有十分详细的图示与伪代码协助分析。

不过要注意的是,无论 Q-learning 还是 TD-SV、Sarsa、Expected Sarsa、 n-step Sarsa 他们都是  policy evaluation { \color{purple} \text{ policy evaluation}}  policy evaluation,故还需要结合  policy improvement { \color{purple} \text{ policy improvement}}  policy improvement 算法 π \pi π 才能组合成一个完整的策略优化算法。所以设动作决策策略 π \pi π 为 Epsilon Greedy,再结合值函数近似的 Sarsa 算法,也就是上面推导出来的(05)式,可得该组合的伪代码:

2、伪代码

在这里插入图片描述

3、代码分析

首先要知道该图示代码为 on-policy,因为其生成数据的策略 π \pi π 与被优化改善的策略 π \pi π 是同一个策略。熟悉前面博客 【强化学习理论基础-通用】(28)从零开始白话给你讲[数学原理]:时序差分算法 --> Q-learning 伪代码(on-policy 与 off-policy),示例对比说明 的朋友,应该是很容易看明白的。

另外需要注意的是,未讲解值函数近似之前的一系列时序差分(Temporal-Difference)算法,比如 TD-SV、Sarsa、Expected Sarsa、 n-step Sarsa 以及 Q-learning 其优化公式于博客 【强化学习理论基础-通用】(29)从零开始白话给你讲[数学原理]:时序差分(Temporal-Difference),回顾与总结,TD算法统一形式 中有介绍,且统一形式为其中(01)式,如下: q t + 1 ( s t , a t ) = q t ( s t , a t ) − α t ( s t , a t ) [ q t ( s t , a t ) − q ˉ t ] (07) \color{green} \tag{07} q_{t+1}\left(s_{t}, a_{t}\right)=q_{t}\left(s_{t}, a_{t}\right)-\alpha_{t}\left(s_{t}, a_{t}\right)\left[q_{t}\left(s_{t}, a_{t}\right)-{\color{red} \bar{q}_{t}}\right] qt+1(st,at)=qt(st,at)αt(st,at)[qt(st,at)qˉt](07) 上式 q ˉ t \color{red} \bar{q}_{t} qˉt 就是迭代优化过程中的目标,随着具体算法的实现有所改变,但是总的来说,其目标都是直接优化动作价值 q t + 1 ( s t , a t ) q_{t+1}\left(s_{t}, a_{t}\right) qt+1(st,at),而上面值函数近似的Sarsa算法,也就是(05)式优化的是参数 w \color{red} w w,而非直接优化动作价值 q \color{red} q q

经过前面一系列知识积累,现在来看上述伪代码,可以说是十分简单。总的来说每个回合(生命周期)内会进行多次迭代,若当前迭代时刻记为 t t t,那么先使用动作决策策略 π t \pi_t πt 与环境进行交互,凑足如下 5 个数据:
{ s t ,   a t ,   s t + 1 ,   r t + 1 , a t + 1 } (08) \color{green} \tag{08}\{s_{t},~a_t,~s_{t+1},~r_{t+1},a_{t+1}\} {st, at, st+1, rt+1,at+1}(08)即可完成一次对动作价值估算策略 q t q_t qt 的优化,且 s t s_t st a t a_t at 是上一时刻与环境交互的状态与动作,即该时刻只需要获取 s t + 1 ,   r t + 1 , a t + 1 s_{t+1},~r_{t+1},a_{t+1} st+1, rt+1,at+1 这三个数据即可,优化的之后的策略记录为 q t + 1 q_{t+1} qt+1。接着就是使用优化后的动作价值评估策略 q t + 1 q_{t+1} qt+1 对动作决策策略 π t \pi_t πt 的所有动作进行评估,找到最大动作价值对应的动作 a m a_m am,对策略 π t \pi_t πt 进行优化更新,得 π t + 1 \pi_{t+1} πt+1

另外还有一点与之前表格(离散)形式 Sarsa 算法有所区别的是,现在计算某个状态下某个动作的 q q q,需要把状态 s t s_t st 以及 a t a_t at 带入到关于 w t w_t wt 参数的近似函数,即通过 q t ( s t , a t , w t ) q_{t}\left(s_{t}, a_{t}, w_t\right) qt(st,at,wt) 求得具体近似动作价值。之前(离散)形式 Sarsa 算法本质上来说,是通过索引的方式直接获取存储的动作价值。

四、示例(Sarsa)

1.游戏规则

为深入体会到值函数近似 Sarsa 算法效果,这里再进行一个示例的讲解,游戏规则与参数如下:

动作: 共五个动作,上(a1)、下(a2)、左(a3)、右(a4)、保持原地不动(a5)。
奖励: 进入黄色(禁止forbidden区域)=-1、进入白色可通行(passable)区域=0、到达终点(target)蓝色区域=1。
特殊: 若触碰边界(boundary),奖励为=-1,如在最上边依旧往上走,不过机器人状态(位置保持不变)

初始: 初始状态, 每个回合开始只能从某个固定的状态(位置)出发

注意: 为了简单示例,转移为下一个状态时,只有一种奖励,且状态状态下执行某个动作,也只能达到下一种状态,而非概率,有多个选项。

上面是迷宫游戏的规则,相信大家已经很熟悉了,这里把奖励单独记录一下 r f o r b i d e n r_{forbiden} rforbiden有改变:
r b o u n d a r y = − 1 ,    r f o r b i d e n = − 1 ,    r p a s s a b l e = 0 ,    r t a r g e t = 1 ,    γ = 0.9 (09) \color{green} \tag{09} r_{boundary}=-1,~~~{\color{red}r_{forbiden}=-1},~~~r_{passable}=0 ,~~~r_{target}=1,~~~\gamma=0.9 rboundary=1   rforbiden=1   rpassable=0   rtarget=1   γ=0.9(09) 另外还需要增加一个Sarsa 算法迭代优化需要的学习率: α = 0.1 (10) \color{green} \tag{10} \alpha=0.1 α=0.1(10)

2.效果图示

智能体与环境共交互 500 个回合,每个回合初始状态都为 s ( 1 , 1 ) s_{(1,1)} s(1,1),根据前面的讲解可以知道,并不需要像蒙特卡洛(Monte Carlo)一样,收集整个回合的经验轨迹数据才能开始优化,只需要与环境进行一次交互,收到到数据 s t + 1 ,   r t + 1 , a t + 1 s_{t+1},~r_{t+1},a_{t+1} st+1, rt+1,at+1 再结合上一时刻的 s t , a t s_{t},a_t st,at,共计五个数据即可完成一次动作价值评估 q q q 以及动作决策策略 π \pi π 的优化,如下两幅图示:
在这里插入图片描述

图1

首先需要说明的是,上面的图示为 linear uncion approximation 版本的 Sarsa 算法,实现细节需参考 【强化学习理论基础-通用】(32)从零开始白话给你讲[数学原理]:值函数近似,目标函数 与 linear function approximation,大致的来说,若为 linear uncion approximation,则上(05)式: 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 ) (11) \color{green} \tag{11} w_{t+1}=w_{t}+\alpha_{t}\left[r_{t+1}+\gamma {\color{blue} \hat{q}\left(s_{t+1}, a_{t+1}, w_{t}\right)}-{\color{blue} \hat{q}\left(s_{t}, a_{t}, w_{t}\right)}\right] \nabla_{w} {\color{blue} \hat{q}\left(s_{t}, a_{t}, w_{t}\right)} wt+1=wt+αt[rt+1+γq^(st+1,at+1,wt)q^(st,at,wt)]wq^(st,at,wt)(11)中的: q ^ ( s , a , w ) = ϕ T ( s , a ) w (12) \color{green} \tag{12} \hat{q}(s, a, w)=\phi^{T}(s, a) w q^(s,a,w)=ϕT(s,a)w(12)需要知道 ϕ ( s t ) \phi\left(s_{t}\right) ϕ(st) 为特征向量,随着特征向量 ϕ ( s t ) \phi\left(s_{t}\right) ϕ(st) 的选取不同,(11)式的具体实现也会不同,至于 ϕ ( s t ) \phi\left(s_{t}\right) ϕ(st) 应当如何选取在前面的博客也有详细的介绍,这里线性特征向量被选择为5阶傅里叶函数,下面来对结果进行分析。

接着先看左边的两幅图示,左上图横轴表示回合(生命周期)索引, 纵轴表示每个回合(生命周期)获得奖励总和,容易看出随着收集的回合经验数据越多,进行优化迭代,每个回合获得奖励总和再持续增加。接着来看左边下面的图示,其横轴依旧表示回合(生命周期)索引,纵轴表示每个回合(生命)周期的长度,由曲线可以看到,随着索增加,即迭代次数增多,其对应的比较差生命周期逐渐减少。这是因为,初始策略比较差,智能体需要进行很多 step 的探索才能到达终点(蓝色区域),随着动作决策策略的优化,后续能够以较优的路径快速抵达终点,所以生命周期短。

右边的图示表示迭代优化完成之后的最终策略,容易看出部分决策非最优,不过这没有关系,因为我们的初始状态只能为 s ( 1 , 1 ) s_{(1,1)} s(1,1),所以只需要保证从该状态出发,到达终点的路径为最优路径即可。

五、迭代公式(Q-learning)

通过前面使用函数近似(funcion approximation)方式实现 Sarsa 的介绍,以及示例讲解,相信对于函数近似已经有了一定了解。现在使用函数近似的方式再来实现 Q-learning 算法,总的来说还是十分简单的,与函数近似(funcion approximation) 版的 Sarsa 算法十分相近,其参数迭代更新公式如下: w t + 1 = w t + α t [ r t + 1 + γ max ⁡ a ∈ A ( s t + 1 ) q ^ ( s t + 1 , a , w t ) − q ^ ( s t , a t , w t ) ] ∇ w q ^ ( s t , a t , w t ) (13) \color{red} \tag{13} w_{t+1}=w_{t}+\alpha_{t}\left[r_{t+1}+\gamma {\color{blue} \max _{ a \in \mathcal{A}\left(s_{t+1}\right)}} \hat{q}\left(s_{t+1}, a, w_{t}\right)-\hat{q}\left(s_{t}, a_{t}, w_{t}\right)\right] \nabla_{w} \hat{q}\left(s_{t}, a_{t}, w_{t}\right) wt+1=wt+αt[rt+1+γaA(st+1)maxq^(st+1,a,wt)q^(st,at,wt)]wq^(st,at,wt)(13)上式中 max \text{max} max 表示求参数为 w t w_t wt 时 处于 s t + 1 s_{t+1} st+1 状态下所有动作对应的最高价值,需要注意的一点,其并不需要知道 最大价值 \color{red}最大价值 最大价值 对应的动作  a m \color{red}对应的动作~a_m 对应的动作 am。可与 Sarsa 算法,即上(05)式进行比较,可以看出他们是十分相近的,唯一的区别就是 max ⁡ a ∈ A ( s t + 1 ) {\color{blue} \max _{ a \in \mathcal{A}\left(s_{t+1}\right)}} maxaA(st+1) 这个部分。

六、Q-learning伪代码分析(on-policy)

这里给出的代码依旧为 on-policy,不过通过前面的学习知道 Q-learning 算法即能实现 on-policy 也能实现 off-policy,所以后面讲解 Deep Q-learning 算法时会讲解 off-policy。与 Sarsa 一样,其本质仅是一个行为价值估计算法,同样与动作决策策略算法 Epsilon Greedy 结合,构建完整的 on-policy 算法,伪代码实现如下:
在这里插入图片描述
该伪代码就不解读了,因为有前面的只是积累太容易看明白。这里提要一下,那么就是更新参数 w w w 时使用 max \text{max} max 只需要知道参数为 w t w_t wt 时 处于 s t + 1 s_{t+1} st+1 状态下所有动作对应的最高价值即可,无需知道对应那个具体动作 a m a_m am。但是在对动作决策策略 π \pi π 更新时使用的是 arg max \text{arg max} arg max,其是需要知道最大动作价值对应具体动作 a m a_m am

另外需要注意的一点就是该实现方式为 on-policy,即与环境进行交互收集数据的策略 π \pi π 与 被优化的策略 π \pi π 是同一个动作决策策略,这是 on-policy 的核心标记。

七、示例(Q-learning)

这里同样给出一个 linear uncion approximation 版本的算法,游戏规则与设置不变,且线性特征向量被选择为5阶傅里叶函数,效果如下:
在这里插入图片描述

图2

若是与 Sarsa 算法的图一进行对比,可以看到迭代过程中 Q-learning 更加稳定,收敛较快。优化后的动作决策策略,即右图从状态 s ( 1 , 1 ) s_{(1,1)} s(1,1) 出发达到蓝色(终点)状态的路径同样为最有路径。

八、结语

通过该片博客,知道如何使用 linear uncion approximation 实现 Sarsa 与 Q-learning 算法,两者伪代码都是 on-policy 形式。这里还是要提要一点,无论 Sarsa 还是 Q-learning 算法,都是  policy evaluation { \color{purple} \text{ policy evaluation}}  policy evaluation,故还需要结合  policy improvement { \color{purple} \text{ policy improvement}}  policy improvement 算法 π \pi π 才能组合成一个完整的策略优化算法,上面的两个示例都是选择与 Epsilon Greedy 结合。

下一篇博客将讲解目前最主流的算法 Deep Q-learning,其将深度神经网络整合到Q(动作价值)学习中,从而得到一种称为深度Q学习或深度Q网络(DQN)的方法。深度Q学习是最早且最成功的深度强化学习算法之一。值得注意的是,神经网络不一定要很"深"。对于像我们的网格世界这样的简单任务,具有一到两个隐藏层的浅层网络可能就足够了。具体细节就得参考下一篇博客了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南才尽,年少无知!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值