【强化学习理论基础-通用】(41)从零开始白话给你讲[数学原理]:Actor-Critic 基础系列,最简强化学习之演员-评论算法(QAC)

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

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

回顾:通过前面一系列博客,对于策略梯度(Policy Gradient) 已经有了一定了解。且在上一篇博客中详细介绍了策略梯度(Policy Gradient)与蒙特卡洛(Monte Carlo)组合的算法,该算法也被称呼为强化(REINFORCE)学习算法,不过并不是所谓的深度强化学习(Deep Reinforcement Learning),因为并没有使用到深度学习或者说神经网络,从这篇博客开始,将会把神经网络与策略梯度结合到一起,即组合成真正意义上的深度强化学习(Deep Reinforcement Learning)算法。

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

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

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

一、前言

正式讲解 QAC 算法之前,个人觉得还有一个比较重要的疑问需要讨论一下,那就是 【强化学习理论基础-通用】(37)从零开始白话给你讲[数学原理]:策略梯度(Policy Gradient) -基础逻辑框架 Average state value 与 Average reward 这篇博客所提到的:

疑问: 相信有的朋友存在和我类似的疑问?那就是已经有了价值评估 (policy evaliation),为什么还需要一个动作决策策略?比如说知道某个状态下执行某个动作其能获得最高状态价值,那么直接执行这个动作即可,为还需要冗余的通过一个动作决策策略来获得具体执行动作呢?

若是只有价值评估没有动作决策策略,如果每次动作都只选择状态价值最高的动作执行,那么训练过程就没有办法探索到其他的状态-动作对。实际上就是执行一个贪婪策略。拿迷宫游戏来说,初始化一个价值评估算法后,因为每次都选择动作价值最高的路线,那显然经验数据也固化了,定然无法实现(value update(价值更新),即价值评估算法初始化之后,没有优化方向。若想收集到更多状态-动作对的数据,就需要一个动作决策策略与其进行配合,比如说 ε-贪婪策略(ε-greedy)。

总的来说,个人是这样理解的,训练过程中决策策略算法就是为了探索而存在的,探索到足够多的状态-动作对,价值评估算法才能利用这些数据得到足够的优化。部署过程中,其实利用优化之后的价值评估算法,选择价值最高动作执行,即转换为贪婪策略也是可行的。其与动作决策策略根据动作执行概率,转换为贪婪策略本质上是一样的。

训练阶段: 动作决策策略(如ε-贪婪策略)主要用于探索,从而收集更多的状态-动作对数据,为价值评估算法的优化提供更多的信息。
部署阶段: 可以利用优化后的价值评估算法,选择最优动作,转化为贪婪策略,这时策略不再需要探索,而是直接根据价值函数进行动作选择。

二、强化学习

知道由动作决策策略,同时还需要价值评估算法之后,心里可以说就比较有底了。那么就接着往下探索吧。上一篇博客介绍了 强化 ( R E I N F O R C E ) 学习 { \color{purple} 强化(REINFORCE)学习} 强化(REINFORCE)学习算法,注意不是所谓的 深度强化学习 ( D e e p   R e i n f o r c e m e n t   L e a r n i n g ) { \color{purple} 深度强化学习(Deep~Reinforcement ~Learning)} 深度强化学习(Deep Reinforcement Learning)算法。因为伪代码实现策略梯度(Policy Gradient)结合蒙特卡洛(Monte Carlo)的算法,并没有涉及到深度学习或者神经网络。

该篇博客要讲解的算法为 QAC,其属于 Actor-Critic。Q 表示行为价值;A(Actor)翻译过来为演员,其实际代表的就是动作决策策略,训练学习的过程就是策略更新(policy update);Critic 翻译过来为评论家,其就是去评断演员(Actor),或者说评估动作决策策略的优劣,即价值评估(policy evalution),也称呼为价值评估(value evalution)。

直白的说,类似于有一个演员(Actor),其做出一个动作与环境进行交互,然后有一些观众(评论家),对这个演员做出的动作进行评价,演员(Actor)根据这些评价改进个人的演出(动作执行)。其实上一篇博客中详细介绍了策略梯度(Policy Gradient)与蒙特卡洛(Monte Carlo)组合的算法,就是一个特殊的 Actor-Critic,因为其也包含策略更新(policy update)以及价值评估(value evalution)或者价值更新(value update)这两个过程,核心要点如下:

        步骤一: ~~~~~~~\color{blue} 步骤一:        步骤一: 构建以 Average reward 或者 Average reward 为衡量指标的目标函数 v ˉ π \bar v_{\pi} vˉπ 或者 r π r_{\pi} rπ

        步骤二: ~~~~~~~\color{blue} 步骤二:        步骤二: 求解期望形式目标函数的梯度,且利用该梯度进行参数更新: θ t + 1 = θ t + α ∇ θ J ( θ t ) = θ t + α E S ∼ η , A ∼ π [ ∇ θ ln ⁡ π ( A ∣ S , θ t ) q π ( S , A ) ] (01) \color{green} \tag{01}\begin{aligned} \theta_{t+1} & =\theta_{t}+\alpha \nabla_{\theta} J\left(\theta_{t}\right) \\ & =\theta_{t}+\alpha \mathbb{E}_{S \sim \eta, A \sim \pi}\left[\nabla_{\theta} \ln \pi\left(A \mid S, \theta_{t}\right) q_{\pi}(S, A)\right] \end{aligned} θt+1=θt+αθJ(θt)=θt+αESη,Aπ[θlnπ(AS,θt)qπ(S,A)](01)         步骤三: ~~~~~~~\color{blue} 步骤三:        步骤三:上式这种期望形式,没有办法直接,故大数定律即随机采样的形势完成对上式的近似:
θ t + 1 = θ t + α ∇ θ ln ⁡ π ( a t ∣ s t , θ t ) q t ( s t , a t ) (02) \color{green} \tag{02}\theta_{t+1}=\theta_{t}+\alpha \nabla_{\theta} \ln \pi\left(a_{t} \mid s_{t}, \theta_{t}\right) {\color{blue} q_{t}\left(s_{t}, a_{t}\right)} θt+1=θt+αθlnπ(atst,θt)qt(st,at)(02)上(02)式能够很好反应出策略更新(policy update)与价值评估(value evalution)两个部分,分别对应于 Actor 与 Critic,原始在代码看到其对动作决策参数 θ \theta θ 进行了更新,那么则属于 Actor,若是对价值进行评估,或者改善价值评估算法,如上式中蓝色 q t ( s t , a t ) {\color{blue} q_{t}\left(s_{t}, a_{t}\right)} qt(st,at) 其就属于 Critic。

无论是动作价值还是状态价值,其本质上来说都是一个期望值,通常是很难直接求解的,比如说(01)式中的 q π ( S , A ) q_{\pi}(S, A) qπ(S,A) 若不知道随机变量 S , A S,A S,A 概率分布,是没有办法直接计算的。所以通过大数定律,使用 q t ( s t , a t ) q_{t}(s_{t}, a_{t}) qt(st,at) 通过迭代优化的方式进行逼近。

逼近的方式有很多种,目前以及接触过 Sarsa、Expected Sarsa、 n-step Sarsa 以及 蒙特卡洛(Monte Carlo),且在上一篇博客中介绍了蒙特卡洛(Monte Carlo)逼近的方式,先回顾一下上一篇博客给出的逼近公式:
q ( s t , a t ) = r t + 1 + γ r t + 2 + ⋯ + γ N − 1 r t + N (03) \color{green} \tag{03} q(s_t,a_t)=r_{t+1}+\gamma r_{t+2}+\cdots+\gamma^{N-1} r_{t+N} q(st,at)=rt+1+γrt+2++γN1rt+N(03)上式有一个很多特别地方,若是已经收集到经验轨迹数据 τ = { s 0 , a 0 , r 1 , … , s T − 1 , a T − 1 , r T } \tau=\left\{s_{0}, a_{0}, r_{1}, \ldots, s_{T-1}, a_{T-1}, r_{T}\right\} τ={s0,a0,r1,,sT1,aT1,rT},那么上式是可以 直接求解 \color{red} 直接求解 直接求解。并不需要通过学习或者迭代的方式,根据某个状态 s t s_t st 执行动作 a t a_t at 后所有经验数据中的奖励可以求解出来。不过这种方式,距离实际方差太大了,所以通常还是会对 q ( s t , a t ) q(s_t,a_t) q(st,at) 进行迭代优化,关于蒙特卡洛(Monte Carlo)价值估算迭代优化的具体细节,还得参考前面的博客:【强化学习理论基础-通用】(26)从零开始白话给你讲[数学原理]:时序差分(Temporal-Difference) n-step Sarsa,极端体现(MC-蒙特卡洛),其 [六、MC-蒙特卡洛联系] 不分有比较深刻的讲解。

总的来说,使用蒙特卡洛(Monte Carlo)与策略梯度(Policy Gradient)结合的算法称呼为强化学习算法,接下来的博客,会将 q t ( s t , a t ) q_{t}(s_{t}, a_{t}) qt(st,at) 再进行一个推广,比如使用TD算法(Sarsa、Expected Sarsa 或者 n-step Sarsa)算法与策略更新(policy update)结合到一起,构建 Actor-Critic 算法,这一类算法若是使用深度学习(神经网络)实现,则也称呼为 深度强化学习 { \color{purple} 深度强化学习} 深度强化学习 ( D e e p   R e i n f o r c e m e n t   L e a r n i n g ) \color{purple} (Deep~Reinforcement~Learning) (Deep Reinforcement Learning)

三、Sarsa 实现 QAC

上一篇博客介绍的策略梯度(Policy Gradient)与蒙特卡洛(Monte Carlo)结合算法,其本质上来说是一种离线(offline)算法,这里这里的离线并不表示 off-policy 算法。因为其有明显的特征,那就是需要收集整条的经验轨迹数据: τ = { s 0 , a 0 , r 1 , … , s T − 1 , a T − 1 , r T } (04) \color{green} \tag{04} \tau=\left\{s_{0}, a_{0}, r_{1}, \ldots, s_{T-1}, a_{T-1}, r_{T}\right\} τ={s0,a0,r1,,sT1,aT1,rT}(04) 才能开始迭代优化,于 【强化学习理论基础-通用】(22)从零开始白话给你讲[数学原理]:时序差分(Temporal-Difference) - state values(基础版本) 之 公式推导 这篇博客有提到:

缺点: 蒙特卡洛算法最适合对 episode_length 有限的策略评估,对于 episode_length 无限或者特别长的策略,虽然可以采取截断的方式进行,但是终究不够完美,对策略的评估始终存在误差。

为解决蒙特卡洛(Monte Carlo)的局限性一系列TD(差分)算法(Sarsa、Expected Sarsa 或者 n-step Sarsa) 就应运而生了。其相对于蒙特卡洛最显著区别就是并不需要收集整条经验轨迹数据 π \pi π 让后再开始迭代学习优化,比如 Sarsa 其每次迭代只需要两个连续时刻相关的5个数据即可完成一次学习,如 【强化学习理论基础-通用】(34)从零开始白话给你讲[数学原理]:值函数近似,Sarsa 与 Q-learning 使用 function 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 ) (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)其完成一次价值函数 q q q 的迭代优化,只需要如下五个数据即可: { s t , a t , r t + 1 , s t + 1 , a t + 1 } t (06) \color{green} \tag{06}\{s_t,a_t, r_{t+1},s_{t+1},a_{t+1}\}_t {st,at,rt+1,st+1,at+1}t(06)策略梯度(Policy Gradient)与TD算法(Sarsa)结合而成的 Actor-Critic 算法如伪代码如下所示:
在这里插入图片描述
上面的伪代码,整理来说还是比较简单的,细节步骤如下:

步骤一: \color{blue} 步骤一: 步骤一: 初始化策略 π \pi π 参数为 θ 0 \theta_0 θ0,任意值即可,无特别需求;初始化价值评估函数 q q q 参数为 w 0 w_0 w0。另外需要保证迭代优化过程中的学习率 α θ , α w > 0 \alpha_{\theta},\alpha_{w} >0 αθ,αw>0,其实还有一些其他的要求,比如说不能快速收敛到 0等,这些在前面梯度下降相关系列博客有详细说明,就不再重复。最后确认迭代优化目的就是最大化目标函数 J ( θ ) J(\theta) J(θ)

步骤二: \color{blue} 步骤二: 步骤二: 与蒙特卡洛(Monte Carlo)实现离线(offline)形式的价值评估算法不同,Sarsa 实现的价值评估算法并不需要等待收集完一条轨迹再开始迭代学习或训练。其与策略梯度(Policy Gradient)算法结合之后,可谓是实实在在的 on-policy 算法,因为通过下面的步骤,可以知道与环境交互的策略 π \pi π 以及被迭代优化的车略 π \pi π 是通一个动作决策策略。

步骤三: \color{blue} 步骤三: 步骤三: 若目前所处于的状态为 s t s_t st,利用策略 π ( a ∣ s t , θ t ) \pi(a|s_t,\theta_t) π(ast,θt) 可生成动作 a t a_t at,把该动作输入到环境完成交互,则智能体将将切换到 s t + 1 s_{t+1} st+1 状态,且获得即时奖励 r t + 1 r_{t+1} rt+1,接着再使用相同的策略参数 θ \theta θ 结合结合状态 s t + 1 s_{t+1} st+1 获得来自 π ( a ∣ s t + 1 , θ t ) \pi(a|s_{t+1},\theta_t) π(ast+1,θt) 的动作 a t + 1 a_{t+1} at+1,则收集到 5 个数据 { s t , a t , r t + 1 , s t + 1 , a t + 1 } t \{s_t,a_t, r_{t+1},s_{t+1},a_{t+1}\}_t {st,at,rt+1,st+1,at+1}t。需要注意到的是, a t a_t at 动作被执行了,即与环境进行了交互。但是动作 a t + 1 a_{t+1} at+1 本没有与环境进行交互。

步骤四: \color{blue} 步骤四: 步骤四: 利用上一次迭代优化后的估函数 q ( w ) q(w) q(w) 对当前状态 s t s_t st 下执行的动作 a t a_t at 进行行为价值,即求得 q ( s t , a t , w t ) q(s_t,a_t,w_t) q(st,at,wt),则根据策略更新公式 θ t + 1 = θ t + α ∇ θ ln ⁡ π ( a t ∣ s t , θ t ) q t ( s t , a t ) \theta_{t+1}=\theta_{t}+\alpha \nabla_{\theta} \ln \pi\left(a_{t} \mid s_{t}, \theta_{t}\right) { q_{t}\left(s_{t}, a_{t}\right)} θt+1=θt+αθlnπ(atst,θt)qt(st,at) 对动作决策策略 π \pi π 的参数 θ t \theta_t θt 进行更新,获得新的参数 θ t \theta_{t} θt,下一次收集数据则会使用这个被优化后的策略( θ t + 1 \theta_{t+1} θt+1)。

步骤五: \color{blue} 步骤五: 步骤五: 利用收集到的 5 个数据 { s t , a t , r t + 1 , s t + 1 , a t + 1 } t \{s_t,a_t, r_{t+1},s_{t+1},a_{t+1}\}_t {st,at,rt+1,st+1,at+1}t 完成对价值评估函数 q q q 参数的更新。其更新公式为: 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{green} \tag{05} w_{t+1}=w_{t}+\alpha_{t}\left[r_{t+1}+\gamma {\color{blue} \underbrace{\hat{q}\left(s_{t+1}, a_{t+1}, w_{t}\right)}_{第一项}}-{\color{blue} \underbrace{\hat{q}\left(s_{t}, a_{t}, w_{t}\right)}_{第二项}}\right] \nabla_{w} {\color{blue} \underbrace{\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) w第三项 q^(st,at,wt)(05)这样就完成了一轮迭代优化,之后再回到 步骤三: \color{blue} 步骤三: 步骤三: 与环境交互收集数据循环迭代优化,直到收敛。

额外提及: \color{red} 额外提及: 额外提及: 对于价值评估函数 q q q 可以使用深度神经网络实现,若是调用深度学习框架(如 Pytorch 或 Tensorflow),与前面的博客:【强化学习理论基础-通用】(35)从零开始白话给你讲[数学原理]:值函数近似,Deep Q-learning(DQN),神经网络提梯度求解之巧妙设计(双网络) 可以知道,通过把(05)式中第一项 q ^ ( s t + 1 , a t + 1 , w t ) \hat{q}\left(s_{t+1}, a_{t+1}, w_{t}\right) q^(st+1,at+1,wt)与第二项 q ^ ( s t , a t , w t ) \hat{q}\left(s_{t}, a_{t}, w_{t}\right) q^(st,at,wt) 设计成两个孪生网络能够巧妙的完成深度学习框架的自动优化,具体细节这里就不再讨论,因为 Deep Q-learning(DQN) 这篇博客中有十分详细的介绍。

四、结语

上一篇博客中介绍蒙特卡洛(Monte Carlo)与策略梯度(Policy Gradient)结合的强化学习算法。该篇博客再其基础上进行推广,介绍TD(差分)中sarsa 算法与策略梯度(Policy Gradient)结合的Actor-Critic算法。两者主要的区别,就是在于前者需要收集整条经验轨迹数据: τ = { s 0 , a 0 , r 1 , … , s T − 1 , a T − 1 , r T } \tau=\left\{s_{0}, a_{0}, r_{1}, \ldots, s_{T-1}, a_{T-1}, r_{T}\right\} τ={s0,a0,r1,,sT1,aT1,rT} 才能开始迭代优化。然而后者每次迭代优化只需要 { s t , a t , r t + 1 , s t + 1 , a t + 1 } t \{s_t,a_t, r_{t+1},s_{t+1},a_{t+1}\}_t {st,at,rt+1,st+1,at+1}t 这五个数据即可。

TD算法中可以与策略梯度(Policy Gradient)结合成Actor-Critic的算法有很多种,除了该篇博客讲解的 Sarsa,还有 Expected Sarsa、n-step Sarsa) 以及 Q-learning 都是可以的,具体如何实现这里就不再进行介绍了,总的来说与 [三、Sarsa 实现 QAC] 中讲解的伪代码十分相近,主要区别在于 Critic (value update) 的具体实现不同而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

江南才尽,年少无知!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值