若需观看机器人系列相关博客,请劳驾至:【足式机器人无死角系列之-【强化学习基础-通用】、【仿真及训练环境】、【强化学习】:isaac-gym 与 isaac-lab 从零开始
郑重声明:该系列博客为本人 ( W e n h a i Z h u ) 独家私有 , 禁止转载与抄袭 , 首次举报有谢 , 若有需请私信授权! \color{red}郑重声明:该系列博客为本人(WenhaiZhu)独家私有,禁止转载与抄袭,首次举报有谢,若有需请私信授权! 郑重声明:该系列博客为本人(WenhaiZhu)独家私有,禁止转载与抄袭,首次举报有谢,若有需请私信授权!
回顾: 上一篇博客中介绍了如何对应一个值函数近似的优化目标,原理比较简单,就是使得每个状态价值与真值的误差最小过。且介绍了两种优化目标,主要区别在于求期望的方式,可以选择均匀平均或者加权平均的方式。不过并没有推导或讲解目标函数的优化过程,当然,这也是该篇博客的目的。 |
本系列博客链接为: {\color{blue}本系列博客链接为:} 本系列博客链接为:【强化学习理论基础-通用】(01)从零开始白话给你讲,简单推导公式,深刻理解,一眼万年!:https://blog.youkuaiyun.com/weixin_43013761/article/details/143168169
本博客编写于: 20250112 ,台式机为 u b u n t u 20.04 , 3090 G e F o r c e R T X 显存 24 G { \color{purple} 本博客编写于:20250112,台式机为 ubuntu 20.04,3090 GeForce RTX 显存24G} 本博客编写于:20250112,台式机为ubuntu20.04,3090GeForceRTX显存24G:与你现在的代码,或者环境等存在一定差异也在情理之中,故切勿认为该系列博客绝对正确,且百密必有一疏,若发现错误处,恳请各位读者直接指出,本人会尽快进行整改,尽量使得后面的读者少踩坑,评论部分我会进行记录与感谢,只有这样,该系列博客才能成为精品,这里先拜谢各位朋友了。
文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证,请备注 强化学习 。 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证,请备注\color{red} 强化学习}。 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证,请备注强化学习。
一、前言
上一篇博客中详细介绍了如何定义值函数近似的优化目标,不过列举的例子比较简单,从一维的状态出发,使得其对应状态价值评估的误差最小化。后续会拓展到多维情况,从一维切入能够更好的领悟算法的要点。先不讨论目标函数具体采用一致分布(uniform distribution),还是稳定分布(stationary distribution),看其宏观上的统一形式:
J
(
w
)
=
1
2
E
[
(
v
π
(
S
)
−
v
^
(
S
,
w
)
)
2
]
(01)
\color{red} \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)其对应于上一篇博客(02)式,应该有一种熟悉的味道,在梯度下降相关系列博客中,有对这种二次型目标函数进行讲解,比如说:比如:【强化学习理论基础-通用】(20)从零开始白话给你讲[数学原理]:随机梯度下降系列:BGD、SGD、MBGD,深入探讨与对比。其中推导过程,以及上一篇博客通过 uniform distribution(一致分布) 建立的目标函数:
J
(
w
)
=
1
2
∗
1
∣
S
∣
∑
s
∈
S
(
v
π
(
s
)
−
v
^
(
s
,
w
)
)
2
(02)
\color{green} \tag{02} J(w)=\frac{1}{2}*\frac{1}{|\mathcal{S}|} \sum_{s \in \mathcal{S}}\left(v_{\pi}(s)-\hat{v}(s, w)\right)^{2}
J(w)=21∗∣S∣1s∈S∑(vπ(s)−v^(s,w))2(02) 以及 stationary distribution(稳态分布) 介绍的
J
(
w
)
=
1
2
∗
∑
s
∈
S
d
π
(
s
)
(
v
π
(
s
)
−
v
^
(
s
,
w
)
)
2
(03)
\color{green} \tag{03} J(w)=\frac{1}{2}*\sum_{s \in \mathcal{S}} d_{\pi}(s)\left(v_{\pi}(s)-\hat{v}(s, w)\right)^{2}
J(w)=21∗s∈S∑dπ(s)(vπ(s)−v^(s,w))2(03)其都是(01)式的具体化,下面的推导先不看这些具体细节,即从(01)式开始推导。总的来说接下来的目的就是最小化使得(01)式。
二、期望梯度
熟悉前面梯度下降系列博客的朋友,应该明确知道,最小化一个(01)式这样的目标函数,其等价于最优小化(趋近于0)其一阶梯度,需要注意的是,因为优化的参数为 w w w,所以该梯度也是相对于 w w w。推导过程如下: ∇ w J ( w ) = ∇ w 1 2 E [ ( v π ( S ) − v ^ ( S , w ) ) 2 ] = 1 2 E [ ∇ w ( v π ( S ) − v ^ ( S , w ) ) 2 ] = 1 2 E [ 2 ∗ ( v π ( S ) − v ^ ( S , w ) ) ( − ∇ w v ^ ( S , w ) ) ] = − E [ ( v π ( S ) − v ^ ( S , w ) ) ∇ w v ^ ( S , w ) ] (04) \color{green} \tag{04} \begin{aligned} \nabla_{w} J(w) & =\nabla_{w} \frac{1}{2}\mathbb{E}\left[\left(v_{\pi}(S)-\hat{v}(S, w)\right)^{2}\right] \\ & =\frac{1}{2}\mathbb{E}\left[\nabla_{w}\left(v_{\pi}(S)-\hat{v}(S, w)\right)^{2}\right] \\ & = \frac{1}{2}\mathbb{E}\left[2*\left(v_{\pi}(S)-\hat{v}(S, w)\right)\left(-\nabla_{w} \hat{v}(S, w)\right)\right] \\ & =- \mathbb{E}\left[\left(v_{\pi}(S)-\hat{v}(S, w)\right) \nabla_{w} \hat{v}(S, w)\right] \end{aligned} ∇wJ(w)=∇w21E[(vπ(S)−v^(S,w))2]=21E[∇w(vπ(S)−v^(S,w))2]=21E[2∗(vπ(S)−v^(S,w))(−∇wv^(S,w))]=−E[(vπ(S)−v^(S,w))∇wv^(S,w)](04)没有啥特别的,把期望看成一个累加形式,在根据梯度的加法运算,所以梯度符号 ∇ w \nabla_{w} ∇w 可以提到期望 E \mathbb{E} E 的内部。总来的说,把期望简单看成累加形式,符号与 2 2 2 同样可以提到期望 E \mathbb{E} E 的外边来。到这里为止,一阶梯度初步已经求解,接下来的目标就是如何最小化该梯度。
最小化上面的这种带随机变量期望的形式,根据梯度下降算法,或者说罗宾逊-蒙罗算法(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
)
(05)
\color{green} \tag{05} 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)(05)其中
s
t
s_t
st 来自于
S
S
S 的采样,
α
t
\alpha_{t}
αt 就是学习率,但是现在还有一个问题,那就是上式中
v
π
(
s
)
v_{\pi}(s)
vπ(s),其表示真值,或者说期望所求的结果, 即上式再实际过程中无法完成迭代,还需继续推导。
三、真值替换
1.蒙特卡洛(MC)
为使得(05)式再实际应用过程不受限于
v
π
(
s
)
v_{\pi}(s)
vπ(s),可以有多种方式来带着他。再说如何代替他之前,先来说一下
v
π
(
s
)
v_{\pi}(s)
vπ(s) 是什么,理想情况下应当如下所示:
v
π
(
s
)
=
E
[
G
t
∣
s
]
(06)
\color{green} \tag{06} v_{\pi}(s)=\mathbb{E}[G_t|s]
vπ(s)=E[Gt∣s](06)这就是状态价值的标准定义,但是显然,该期望同样是没有办法直接求得,但是可以退而求其次,使用一条轨迹的随机采样结果来代替,即:
v
π
(
s
)
=
g
t
=
r
t
+
1
+
γ
r
t
+
2
+
γ
2
r
t
+
3
+
⋯
(07)
\color{green} \tag{07} v_{\pi}(s)=g_t=r_{t+1}+\gamma r_{t+2}+\gamma^2 r_{t+3}+\cdots
vπ(s)=gt=rt+1+γrt+2+γ2rt+3+⋯(07) 其实这就蒙特卡洛(MC) 算法。 有的朋友可能会有疑问,这样使用随机采样代替期望行吗?当然是可以的,只要采集轨迹经验数据的条数够多即可,其实在前面的博客 【强化学习理论基础-通用】(26)从零开始白话给你讲[数学原理]:时序差分(Temporal-Difference) n-step Sarsa,极端体现(MC-蒙特卡洛) [六、MC-蒙特卡洛联系] 部分有详细说这个问题,有兴趣的朋友可以再认真回顾一下。把上式带入到(05)式可得:
w
t
+
1
=
w
t
+
α
t
(
g
t
−
v
^
(
s
t
,
w
t
)
)
∇
w
v
^
(
s
t
,
w
t
)
(08)
\color{red} \tag{08} w_{t+1}=w_{t}+\alpha_{t}\left(g_{t}-\hat{v}\left(s_{t}, w_{t}\right)\right) \nabla_{w} \hat{v}\left(s_{t}, w_{t}\right)
wt+1=wt+αt(gt−v^(st,wt))∇wv^(st,wt)(08)
2.时序差分(TD)
虽然通过上述方式,只要经验轨迹条数足够则可以代替 v π ( s ) v_{\pi}(s) vπ(s)。但是这个要求还是有点强,且在有些情况下是不适用的。本质上来说就是蒙特卡洛(MC)算法的缺点,比如:
目标: 如果生命周期 episode_length 无限长,但是每次收集到的轨迹(Tracking,Roollout)经验数据是有限的,这个时候应该如何评估每个状态的价值,或者说策略价值。 |
这个时候容易想到的就是时序差分(Temporal-Difference) 一系列算法,其很好解决了上述问题。因为目前主要以状态价值为主进行讲解,所以先忽略基于动作价值Sarsa 系列算法。总的来说差不多这么个意思:想求得理想状态下
v
π
(
s
)
v_{\pi}(s)
vπ(s),但是目前的数据是有限的,采样到的数据只有
s
t
s_{t}
st 以及
s
t
+
1
s_{t+1}
st+1。然后假设现有值函数近似功能的
v
^
(
s
t
,
w
t
)
\hat{v}\left(s_{t}, w_{t}\right)
v^(st,wt),其
w
w
w 已知,也就是只要给予
v
^
\hat{v}
v^ 任意状态
s
s
s 其都能估算出对应的状态价值(虽然不一定精确),那么可得:
v
^
(
s
t
)
=
v
^
(
s
t
,
w
t
)
v
^
(
s
t
+
1
)
=
v
^
(
s
t
+
1
,
w
t
)
(09)
\color{green} \tag{09}\hat{v}(s_t)=\hat{v}\left(s_{t}, w_{t}\right)~~~~~~~~~~~~~~~\hat{v}(s_{t+1})=\hat{v}\left(s_{t+1}, w_{t}\right)
v^(st)=v^(st,wt) v^(st+1)=v^(st+1,wt)(09)具体细节可以参考前面的博客:添加链接描述【强化学习理论基础-通用】(22)从零开始白话给你讲[数学原理]:时序差分(Temporal-Difference) - state values(基础版本) 之 公式推导,那么可以使用:
r
k
+
1
+
γ
v
k
(
s
t
+
1
)
(10)
\color{green} \tag{10}r_{k+1}+\gamma v_{k}\left(s_{t+1}\right)
rk+1+γvk(st+1)(10)代替
v
π
(
s
)
v_{\pi}(s)
vπ(s),把(9)(10)式带入到(05)是可得:
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
)
(11)
\color{red} \tag{11} 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)(11)
3.思路总结
上述两个方式都是为了最小化梯度
∇
w
J
(
w
)
=
−
E
[
(
v
π
(
S
)
−
v
^
(
S
,
w
)
)
∇
w
v
^
(
S
,
w
)
]
\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)],其等价于求解
v
π
(
S
)
v_{\pi}(S)
vπ(S),只不过因为期望的原因,通过随机采样的方式使其最小化。上(08)(11)可与博客 【强化学习理论基础-通用】(22)从零开始白话给你讲[数学原理]:时序差分(Temporal-Difference) - state values(基础版本) 之 公式推导 中(41)式进行对比,如下:
v
^
k
+
1
(
s
t
)
=
v
^
k
(
s
t
)
−
α
t
(
s
t
)
[
v
^
k
(
s
t
)
−
[
r
t
+
1
+
γ
v
^
k
(
s
t
+
1
)
]
]
(12)
\color{blue} \tag{12} \hat v_{k+1}\left(s_{t}\right) =\hat v_{k}\left(s_{t}\right) \color{blue} - \alpha_{t}\left(s_{t}\right)\left[\hat v_{k}\left(s_{t}\right){\color{red} -} \left[r_{t+1}+\gamma \hat v_{k}\left(s_{t+1}\right)\right]\right]
v^k+1(st)=v^k(st)−αt(st)[v^k(st)−[rt+1+γv^k(st+1)]](12)为方便对比,把原本
v
v
v 替换成
v
^
\hat v
v^,表预测或估计,另外上式中的符号可以提到外边,那么与(11)对比,两等式右边可以说只相差一个:
∇
w
v
^
(
s
t
,
w
t
)
(13)
\color{purple} \tag{13} \nabla_{w} \hat{v}\left(s_{t}, w_{t}\right)
∇wv^(st,wt)(13)这个也比较好理解,要从优化的目标参数来考虑。(11)式优化的是值函数的参数
w
w
w,而(12)类似于只接优化值函数的结果,如果是神经网络就等价于优化神经网络的输出结果。也就是说,他们的目标函数相同,但是前者是对
w
w
w 求梯度,而后者是对
v
^
\hat v
v^ 求梯度。在根据
w
w
w 与
v
^
\hat v
v^ 的关系表示为
∇
w
v
^
(
s
t
,
w
t
)
\nabla_{w} \hat{v}\left(s_{t}, w_{t}\right)
∇wv^(st,wt),结合梯度链式法则,易知(11)式比(12)式会多一个
∇
w
v
^
(
s
t
,
w
t
)
\nabla_{w} \hat{v}\left(s_{t}, w_{t}\right)
∇wv^(st,wt)。
直白的说,就是目标函数为
1
2
E
[
(
v
π
(
S
)
−
v
^
(
S
,
w
)
)
2
]
\frac{1}{2}\mathbb{E}\left[\left(v_{\pi}(S)-\hat{v}(S, w)\right)^{2}\right]
21E[(vπ(S)−v^(S,w))2],若是想优化
v
^
(
S
,
w
)
\hat{v}(S, w)
v^(S,w) 这个整体就对这个整体求导,若是想对
v
^
(
S
,
w
)
\hat{v}(S, w)
v^(S,w) 中
w
w
w 进行优化,则通过链式法则对
w
w
w 求导,求导节后就是后者多乘一个
∇
w
v
^
(
s
t
,
w
t
)
\color{purple} \nabla_{w} \hat{v}\left(s_{t}, w_{t}\right)
∇wv^(st,wt)。编程对应的伪代码如下,较为简单,这里就不做详细介绍了:
注意上图中的字样 In the general case \color{purple} \text{In the general case} In the general case,也就是说普遍情况下都是这样更新参数的,但是在一些特殊情况可以选择其他的形式。这也是接下来要谈论的。
四、额外拓展
通过上面的介绍,基本上来说关于 状态 \color{purple} \text{状态} 状态 价值估计相应的值函数近似优化过程可以说是完成了。按计划应该讲解 行为 \color{purple} \text{行为} 行为 价值估计相应的值函数近似优化。不过在这之前,还有其他的一些细节需要讨论,顺便加深对知识点的理解。
1.was widely used before
深度学习没有流行之前,被广泛使用的一种方式是,把 v ^ ( s , w ) \hat v(s,w) v^(s,w) 构建成一个线性形式,需要注意的是,这里所谓的线性是针对于需要优化的参数 w w w 而言,该算法称呼为 linear function approximation \color{purple} \text{linear function approximation} linear function approximation (线性函数近似) 是 linear function approximation(值函数近似)的一种特殊情况。
依据前面博客 【强化学习理论基础-通用】(30)从零开始白话给你讲[数学原理]:值函数近似,离散空间到连续空间的转换,曲线拟合 构建值函数的方式,可得:
v
^
(
s
,
w
)
=
ϕ
T
(
s
)
w
\hat{v}(s, w)=\phi^{T}(s) w
v^(s,w)=ϕT(s)w熟悉梯度或偏导的朋友应该知道,上式若是对
s
s
s 求导,则把
w
w
w 看做常数,若是对
w
w
w 求导数,则需要把
s
s
s 看做参数,因为迭代优化过程中只对参数
w
w
w 进行调整,所以只需要对
w
w
w 求导即可。
前面的博客中,把 ϕ T ( s ) \phi^{T}(s) ϕT(s) 称呼为特征向量( feature vector \color{purple} \text{feature vector} feature vector), w w w 称呼为参数向量( parameter vector \color{purple} \text{parameter vector} parameter vector)。若是 w w w 为一个线性(最高幂次项为 1 1 1)向量,那么上式的对 w w w 求梯度就等价 ϕ T ( s ) \phi^{T}(s) ϕT(s)。那么剩下的问题就是 ϕ T ( s ) \phi^{T}(s) ϕT(s) 应该如何去选取,常见的形式为多项式。且前面值函数近似,曲线拟合的博客中也给出了例子。
2.widely used nowadays
现在被广泛使用的方式,就是通过深度学习中的神经网络去拟合函数
v
(
s
,
w
)
{v}(s, w)
v(s,w),该神经网络j假设为
f
^
\hat f
f^,其参数为
w
w
w,那么该网络可以记为
f
^
(
w
)
\hat f(w)
f^(w),不过其与
v
^
\hat{v}
v^ 一样可以输入一个状态
s
s
s,获对该状态估算的状态价值,故:
v
^
(
s
,
w
)
=
f
^
(
s
,
w
)
\hat{v}(s, w)=\hat f(s, w)
v^(s,w)=f^(s,w)其实都是一回事,无论非线性的
v
^
(
s
,
w
)
\hat{v}(s, w)
v^(s,w) 或者非线性神经网络
f
^
(
s
,
w
)
\hat f(s, w)
f^(s,w) 都可以统一使用
v
^
(
s
,
w
)
\hat{v}(s, w)
v^(s,w) 表示,广义上都是对状态价值
v
(
s
,
w
)
{v}(s, w)
v(s,w) 的拟合。
五、线性更新
回到前面 [三、真值替换] 中 [3.思路总结] 部分给出的伪代码示例,有提到上述只是描述
In the general case
\color{purple} \text{In the general case}
In the general case 这一种情况,也就是说线性与非线性其都适用,即 was widely used before 与 widely used nowadays 都可以使用同样的迭代更新公式:
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
)
(14)
\color{green} \tag{14} 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)(14) 若为 linear function approximation(线性函数近似),即上式中:
v
^
(
s
,
w
)
=
ϕ
T
(
s
)
w
(15)
\color{green} \tag{15} \hat{v}(s, w)=\phi^{T}(s) w
v^(s,w)=ϕT(s)w(15)相对于
w
w
w 为线性(把
ϕ
T
(
s
)
\phi^{T}(s)
ϕT(s) 看做一个常数),那么可得:
∇
w
v
^
(
s
,
w
)
=
ϕ
(
s
)
(16)
\color{green} \tag{16} \nabla_{w} \hat{v}(s, w)=\phi(s)
∇wv^(s,w)=ϕ(s)(16)把上(15)(16)式带入到(14)式可得:
w
t
+
1
=
w
t
+
α
t
[
r
t
+
1
+
γ
ϕ
T
(
s
t
+
1
)
w
t
−
ϕ
T
(
s
t
)
w
t
]
ϕ
(
s
t
)
(17)
\color{red} \tag{17} w_{t+1}=w_{t}+\alpha_{t}\left[r_{t+1}+\gamma \phi^{T}\left(s_{t+1}\right) w_{t}-\phi^{T}\left(s_{t}\right) w_{t}\right] \phi\left(s_{t}\right)
wt+1=wt+αt[rt+1+γϕT(st+1)wt−ϕT(st)wt]ϕ(st)(17)故 图一 伪代码完整形式应当为:
该算法称呼为 TD-linear,或者 linear function approximation, 属于差分算法,只不过是线性的。当然这里所谓的线性说是相对于参数向量 w w w 而样,其特征向量 ϕ T ( s ) \phi^{T}(s) ϕT(s) 依旧可以是非线性的。该算法相对于神经网络最大的劣势,就是需要选取合适的特征向量( feature vector \color{purple} \text{feature vector} feature vector),而神经网络则没有这个需求。
六、总结:
总的来说,linear function approximation 虽然现在没有神经网络那样流行,但是曾经也是风靡一时,被普遍使用的算法,优劣势如下所示:
劣势: \color{red}劣势: 劣势: 特征向量( feature vector \color{purple} \text{feature vector} feature vector)选取会直接影响到 linear function approximation 算法的结果。导致需要对问题有很好的理解,才有可能选取到合适的特征向量,注意这里说的是有可能,也就是说有时会即使对问题有很好的理解,但是依旧无法选取或者设计出较好较鲁棒的特征向量,这也是其被神经网络取代的原因。
优点: \color{red}优点: 优点: linear function approximation 算法本身也有一些优点,首先来说其理论性质很好被分析,而不像神经网络类似一个黑盒,很难对其最理论分析。在过去无论工程界还是学术界,对于 linear function approximation 的研究非常多,也十分透彻。