若需观看机器人系列相关博客,请劳驾至:【足式机器人无死角系列之-【强化学习基础-通用】、【仿真及训练环境】、【强化学习】: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→官方认证,请备注强化学习。
一、前言
同通过上一篇博客,了解到 值函数近似 \color{purple} \text{值函数近似} 值函数近似 (value function \color{purple} \text{(value function } (value function approximate) \color{purple} \text{approximate)} approximate)其引入的主要目的,是处理以下两个问题:
问题1: 如何使用较少的存储空间(内存),记录大量(或无限)的状态价值或者行为价值。 问题2: 观测空间与动作空间连续情况应该如何处理,特别是与连续时间序列相关时。 |
虽然值函数近似能够解决上诉问题,但是会带来精度下降这个缺点。总的来说,值函数近似就是空间与精度之间进行衡量取舍的算法,参数存储越多,占用内存空间越大,精度越高;参数存储越少,占用内存空间越少,但是精度可能不达标。具体如何取舍还得根据实际情况而定。其还有一个 额外优点: \color{purple} 额外优点: 额外优点:对被访问的状态拟度进行优化时,会传播到其附近的状态,也得到一定的优化,不过距离该状态越远被影响概率越低,甚至没有影响。且能够对从来没有访问过的状态价值进行一定程度上的优化与改善
了解为什么要使用值函数近似之后,就不会那么困惑了,毕竟学习这些算法的目的就是要知道其解决什么问题,而不是仅仅知道其推导过程。下面就来看看,值函数近似是如何进行拟合近似的。
二、目标讨论
推导之前,来讨论一下值函数近似的目标是什么,其实在上一篇博客已经有所提及,不过为了该篇博客的完整性,同时加深印象,这里再进行一次梳理。
拟合的目标,或者说过程就是希望通过对参数
w
w
w 的调整,使得一个函数
v
^
(
s
,
w
)
\hat{v}(s, w)
v^(s,w) 去代替或者说逼近
v
(
s
)
v(s)
v(s),若是该函数对于任意状态
s
s
s 都有
v
^
(
s
,
w
)
=
v
(
s
)
\hat{v}(s, w)=v(s)
v^(s,w)=v(s),通常情况下无法做到,毕竟鱼与熊掌不可兼得。一般来说,是一个近似关系,如下所示:
v
^
(
s
,
w
)
≈
v
(
s
)
,
s
∈
S
(01)
\color{green} \tag{01} \hat{v}(s, w)\approx v(s),~~~~~~~~~~s\in S
v^(s,w)≈v(s), s∈S(01)值得注意的是,当算法建模或者实现方式确定时,只有通过调增参数
w
w
w 使得拟合效果更优。本质上来说,这就是一个价值评估(
policy evaluation
\color{purple}\text{policy evaluation}
policy evaluation) 问题,因为这里拟合的目标是状态价值。不过后续会对其进行拓展,应用到策略改善 (
policy improvement
\color{purple}\text{policy improvement}
policy improvement),对动作决策策略进行拟合。
与前面学习 时序差分(Temporal-Difference) 算法系列类似,下面的推导从最简单的状态价值开始,因为该拟合属于一维情况,较为简单。然后再拓展到动作价值,动作价值属于二情况,稍微复杂一下。然后再把 值函数近似 应用到前面学习到的 Sarsa、Expected Sarsa、 n-step Sarsa 以及 Q-learning 算法,最后还会讨论个一个万众瞩目的算法 DQN(Deep Q-learning),该处会正式引入深度学习,不过这些都是后话了。
回到该篇博客需要讲解的内容,核心目标就是如何找到合适的 w w w,使得值函数 v ^ ( s , w ) \hat{v}(s, w) v^(s,w) 对 v ( s ) v(s) v(s) 的拟合效果最好。首先来说需要定义一个 目标函数 \color{red} 目标函数 目标函数,接着就是去优化这个目标函数。
三、目标函定义
首先来说,目标函数就是希望希望拟合效果最好,即对于任意
s
∈
S
s\in S
s∈S,尽量满足
v
^
(
s
,
w
)
=
v
(
s
)
\hat{v}(s, w)=v(s)
v^(s,w)=v(s),所以优化的目标函数定义如下所示:
J
(
w
)
=
1
2
E
[
(
v
π
(
S
)
−
v
^
(
S
,
w
)
)
2
]
(02)
\color{green} \tag{02} 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](02)若是熟悉前面梯度下降系列博客博客,比如:【强化学习理论基础-通用】(20)从零开始白话给你讲[数学原理]:随机梯度下降系列:BGD、SGD、MBGD,深入探讨与对比,那么应该很容易理解上式的目的。总的来说,就是期望所有状态下拟合的状态价值都趋近于真值。上式中大写的
S
S
S 表示随机变量,目的也是求解与这个随机变量对应状态价值相关的期望。另外,上式还有一个
1
2
\frac{1}{2}
21,其主要是为了后续求导方便。
1.uniform distribution
目标函数
J
(
w
)
J(w)
J(w) 宏观上来理解就是一个关于
w
w
w 的误差函数,优化的目标就是希望找到合适的参数
w
w
w,使得该误差值越小越好。上式为期望的形式,根据大数定律,其等价于采样大量的
s
s
s 样本数据,然后求所有样本数据
(
v
π
(
s
)
−
v
^
(
s
,
w
)
)
2
\left(v_{\pi}(s)-\hat{v}(s, w)\right)^{2}
(vπ(s)−v^(s,w))2 的均值。通常来说这里的平均,指的是均匀分配:
J
(
w
)
=
1
2
∗
E
[
(
v
π
(
S
)
−
v
^
(
S
,
w
)
)
2
]
=
1
2
∗
1
∣
S
∣
∑
s
∈
S
(
v
π
(
s
)
−
v
^
(
s
,
w
)
)
2
(03)
\color{green} \tag{03} J(w)=\frac{1}{2}*\mathbb{E}\left[\left(v_{\pi}(S)-\hat{v}(S, w)\right)^{2}\right]=\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∗E[(vπ(S)−v^(S,w))2]=21∗∣S∣1s∈S∑(vπ(s)−v^(s,w))2(03)
∣
S
∣
|S|
∣S∣ 表示采样数据
S
S
S 的总数,若使用上式求期望,隐式包含了这样一个信息,认为所以采样到的状态
s
s
s 其重要性都是一致的,或者说状态分布时均匀的,并不侧重于某些状态。该类求期望的方式,归类为 uniform distribution(一致分布)。虽然这种假设虽然直观,但是未必最切合实际。
2.stationary distribution
比如说有的状态离终点状态比较近,那么这些状态有很高的概率被访问到,而有的状态距离终点比较远,可能很少被访问到。显然,前者这些状态更为重要,其价值估算越准确,实际运行过程中误差才会真正意义上的越小。就好比如修路,通常来主干道比较宽敞,而其他的分支则比较窄小,这是因为主干道车流量大,重要性强。先设这样一个变量:
{
d
π
(
s
)
}
s
∈
S
(04)
\color{green} \tag{04} \left\{d_{\pi}(s)\right\}_{s \in \mathcal{S}}
{dπ(s)}s∈S(04)上式总的来说就是表示状态的概率分比,其中
d
π
(
s
)
d_{\pi}(s)
dπ(s) 表示具体状态
s
s
s 的概率,虽然其满足:
d
π
(
s
)
≥
0
and
∑
s
∈
S
d
π
(
s
)
=
1
(05)
\color{green} \tag{05} d_{\pi}(s) \geq 0 \text { and } \sum_{s \in \mathcal{S}} d_{\pi}(s)=1
dπ(s)≥0 and s∈S∑dπ(s)=1(05) 给予上述理论与思想,求得(02)式期望,还可以采用如下大数定律方式:
J
(
w
)
=
1
2
∗
E
[
(
v
π
(
S
)
−
v
^
(
S
,
w
)
)
2
]
=
1
2
∗
∑
s
∈
S
d
π
(
s
)
(
v
π
(
s
)
−
v
^
(
s
,
w
)
)
2
(06)
\color{green} \tag{06} J(w)=\frac{1}{2}*\mathbb{E}\left[\left(v_{\pi}(S)-\hat{v}(S, w)\right)^{2}\right]=\frac{1}{2}*\sum_{s \in \mathcal{S}} d_{\pi}(s)\left(v_{\pi}(s)-\hat{v}(s, w)\right)^{2}
J(w)=21∗E[(vπ(S)−v^(S,w))2]=21∗s∈S∑dπ(s)(vπ(s)−v^(s,w))2(06)其
d
π
(
s
)
d_{\pi}(s)
dπ(s) 扮演了一个权重的角色。所以说,为在实际应用过程中,这些被经常访问到的状态价值误差更加小,在求期望的时候,应该给予其更大的权重才更加合理。虽然这样会使得概率较小被访问到的状态价值误差可能会较大,但是这没有关系,因为很少访问到。
这里称呼为 stationary distribution,翻译过来叫做稳定分布,貌似合上面的带权重的期望还联系不到一块。这是因为因为 d π ( s ) d_{\pi}(s) dπ(s) 概率分布初始是未知的,采用大数定律统计参数来求其分布,则需要足够多的数据,等状态分布趋向于平稳之后,所谓的概率分布才有意义,前期无法收敛,波动较大,并不能很好的估计出各个状态的概率分布。之所称呼其为稳定分布,表明该分布只有采样足够多,趋向于稳定时,才能确定随机变量的分布。
四、探讨 stationary distribution
因为 stationary distribution 相对来说比较重要,所以这里还需要对其进行更加深入的一些探讨,从(06)式也很容易看出其就是一个加权平均,其核心点就在权重 d π ( s ) d_{\pi}(s) dπ(s)。其还有另外两个称呼,分别为稳态分布( steady-state distribution \color{purple} \text{steady-state distribution} steady-state distribution),或者极限分布 ( limiting distribution ) (\color{purple} \text{limiting distribution}) (limiting distribution)。前者表达的含义与 stationary distribution \color{purple} \text{stationary distribution} stationary distribution 比较类似,就是稳定状态的概率分布,后者表示 limiting \text{limiting} limiting 翻译过来叫极限,就是迭代很多次之后,价值评估趋向于稳定极限时。
下面举个例子来深入体会一下,假设存在一个探索性的
ϵ
\epsilon
ϵ-greedy 策略
π
\pi
π,参数
ϵ
=
0.5
\epsilon=0.5
ϵ=0.5 , 那么每个 动作(action) 都有一定几率被选中,如下图所示,方格中为十字箭头,箭头越长表示该方向动作被执行的概率越大:
总的来说,上面的这个策略还是不错的,因为处于任何状态其大概率指向最优的动作方向,处于蓝色方格(终点)时,其指向四周以及原点的概率是一致的。
进一步,采用一个非常长的 episode,也就是说机器人循环与环境进行交互,即时到达终点该回合也不结束,那么显然这个 episode 经验轨迹数据会访问上面四个状态的每个状态很多次,通过如下公式来计算每个状态被访问概率: d π ( s ) ≈ n π ( s ) ∑ s ′ ∈ S n π ( s ′ ) (07) \color{green} \tag{07}d_{\pi}(s) \approx \frac{n_{\pi}(s)}{\sum_{s^{\prime} \in \mathcal{S}} n_{\pi}\left(s^{\prime}\right)} dπ(s)≈∑s′∈Snπ(s′)nπ(s)(07)其中 n π n_{\pi} nπ 表示策略 π \pi π 决策下,状态 s s s 在 episode 内其被访问的次数,分母 ∑ s ′ ∈ S n π ( s ′ ) \sum_{s^{\prime} \in \mathcal{S}} n_{\pi}\left(s^{\prime}\right) ∑s′∈Snπ(s′) 表示 episode 经验数据长度,也等价于每个状态被访问次数。概率分布随着与环境交互的 step 数变化如下:
由横轴可以看出,该实验共与环境交互 1000 1000 1000 个 step,随着 step 数增加各状态被访问的概率都趋向于稳定。但是初始交互(step)较小时,波动比较剧烈。其中被访问概率最大状态 s 4 s_4 s4,上图使用紫色曲线表示。其对应于 图一 中蓝色终点区域,该为终点位置,无论现在所处于何状态,都有较大概率转移至该状态。
另外值得注意的一点是, s 3 s_3 s3 被访问的概率比 s 2 s_2 s2 略高,这是因为处于 s 1 s_1 s1 转态时,其接下来会以较大概率转移至 s 3 s_3 s3 状态,较少概率转移至 s 2 s_2 s2 状态。
五、状态转移矩阵
接着要讲解一个有意思的点,其与状态转移矩阵相关,有的朋友或许可能对该部分的记忆不是很深刻,那么可以回顾前面博客:【强化学习理论基础-通用】(06)从零开始白话给你讲[数学原理]:贝尔曼(BellmanEquation)升级,向量矩阵方程式,深入浅出状态转移矩阵,其中(04)式有介绍一个矩阵:
P
π
=
[
p
(
s
0
∣
s
0
)
p
(
s
1
∣
s
0
)
⋯
p
(
s
n
∣
s
0
)
p
(
s
0
∣
s
1
)
p
(
s
1
∣
s
1
)
⋯
p
(
s
n
∣
s
1
)
⋮
⋮
⋱
⋮
p
(
s
0
∣
s
n
)
p
(
s
1
∣
s
n
)
⋯
p
(
s
n
∣
s
n
)
]
(08)
\color{red} \tag{08} \mathrm P_{\pi}= \begin{bmatrix} \mathrm p(s_0 \mid s_0) & \mathrm p(s_1 \mid s_0) & \cdots& \mathrm p(s_n \mid s_0) \\ \mathrm p(s_0 \mid s_1) & \mathrm p(s_1 \mid s_1) & \cdots& \mathrm p(s_n \mid s_1) \\ \vdots & \vdots & \ddots& \vdots\\ \mathrm p(s_0 \mid s_n) & \mathrm p(s_1 \mid s_n) & \cdots& \mathrm p(s_n \mid s_n) \end{bmatrix}
Pπ=
p(s0∣s0)p(s0∣s1)⋮p(s0∣sn)p(s1∣s0)p(s1∣s1)⋮p(s1∣sn)⋯⋯⋱⋯p(sn∣s0)p(sn∣s1)⋮p(sn∣sn)
(08)其存储每个状态转移到其他状态的概率,且有贝尔曼向量矩阵方程式
v
π
=
r
π
+
γ
P
v
π
(09)
\color{purple} \tag{09} v_\pi=r_{\pi}+\gamma \mathrm P v_\pi
vπ=rπ+γPvπ(09)若已知状态转移矩阵,则可通过下式快速计算出各个状态被访问几率对应的概率分布,注意
d
π
d_{\pi}
dπ 是由
d
π
(
s
)
构成的向量
d_{\pi}(s) 构成的向量
dπ(s)构成的向量:
d
π
T
=
d
π
T
P
π
(10)
\color{blue} \tag{10} d_{\pi}^{T}=d_{\pi}^{T} P_{\pi}
dπT=dπTPπ(10)原理比较好理解,对其展开即可,直白的说,这就是一个全概率公式矩阵形式,比如说
s
0
s_0
s0 发生的
P
(
s
0
)
\mathrm P(s_0)
P(s0) 概率,等于所有情况:
s
0
s
1
s
3
⋯
s
n
(11)
\color{green} \tag{11} s_0~~~~s_1~~~~s_3~~~~\cdots~~~~s_n
s0 s1 s3 ⋯ sn(11) 发生
s
0
s_0
s0 概率的总和。还是以 [探讨 stationary distribution] 为例,如果已知状态转移矩阵如下:
P
π
=
[
0.3
0.1
0.6
0
0.1
0.3
0
0.6
0.1
0
0.3
0.6
0
0.1
0.1
0.8
]
(12)
\color{green} \tag{12} P_{\pi}=\left[\begin{array}{cccc} 0.3 & 0.1 & 0.6 & 0 \\ 0.1 & 0.3 & 0 & 0.6 \\ 0.1 & 0 & 0.3 & 0.6 \\ 0 & 0.1 & 0.1 & 0.8 \end{array}\right]
Pπ=
0.30.10.100.10.300.10.600.30.100.60.60.8
(12)那么可以求得:
d
π
=
[
0.0345
,
0.1084
,
0.1330
,
0.7241
]
T
(13)
\color{green} \tag{13} d_{\pi}=[0.0345,0.1084,0.1330,0.7241]^{T}
dπ=[0.0345,0.1084,0.1330,0.7241]T(13)上述结果可以前面 图二 进行比较,可以得知他们的结果是比较相近的。
六、总结
该篇博客,首先讨论如何定义值函数近似过程的目标函数,主要目的是使得状态价值评估误差最小化。接着讨论了 stationary distribution,其本上上来说就是稳态下的加权平均。最后又回顾了 态转移矩阵。
不过需要注意的是,通过大数定律介绍如何求得概率分布,其为 mode-free,需通过大量数据进行求解。而后者属于 mode-base,需要知道每个状态转移到其他状态的概率,也就是数学模型。不能说即没有数据,也没有模型,毕竟巧妇难为无米之炊。