若需观看机器人系列相关博客,请劳驾至:【足式机器人无死角系列之-【强化学习基础-通用】、【仿真及训练环境】、【强化学习】:isaac-gym 与 isaac-lab 从零开始
郑重声明:该系列博客为本人 ( W e n h a i Z h u ) 独家私有 , 禁止转载与抄袭 , 首次举报有谢 , 若有需请私信授权! \color{red}郑重声明:该系列博客为本人(WenhaiZhu)独家私有,禁止转载与抄袭,首次举报有谢,若有需请私信授权! 郑重声明:该系列博客为本人(WenhaiZhu)独家私有,禁止转载与抄袭,首次举报有谢,若有需请私信授权!
回顾: 到目前为止,对于时序差分(Temporal-Difference) 已经有了较深的理解,但是前面的一系列算法如 TD-SV、Sarsa、Expected Sarsa、 n-step Sarsa 以及 Q-learning 都是基于离散系统进行推导的,该篇博客开始将开始新的旅程,切入到连续系统的分析。 |
本系列博客链接为: {\color{blue}本系列博客链接为:} 本系列博客链接为:【强化学习理论基础-通用】(01)从零开始白话给你讲,简单推导公式,深刻理解,一眼万年!:https://blog.youkuaiyun.com/weixin_43013761/article/details/143168169
本博客编写于: 20250111 ,台式机为 u b u n t u 20.04 , 3090 G e F o r c e R T X 显存 24 G { \color{purple} 本博客编写于:20250111,台式机为 ubuntu 20.04,3090 GeForce RTX 显存24G} 本博客编写于:20250111,台式机为ubuntu20.04,3090GeForceRTX显存24G:与你现在的代码,或者环境等存在一定差异也在情理之中,故切勿认为该系列博客绝对正确,且百密必有一疏,若发现错误处,恳请各位读者直接指出,本人会尽快进行整改,尽量使得后面的读者少踩坑,评论部分我会进行记录与感谢,只有这样,该系列博客才能成为精品,这里先拜谢各位朋友了。
文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证,请备注 强化学习 。 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证,请备注\color{red} 强化学习}。 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证,请备注强化学习。
一、前言
通过前面一系列博客,已经对 TD-SV、Sarsa、Expected Sarsa、 n-step Sarsa 以及 Q-learning 进行了比较详细的分析与推导,他们除了都是策略价值评估( p o l i c y \color{purple}policy policy e v a l i a t i o n \color{purple}evaliation evaliation)之外,还有另外一个共同点,那就是整个推导与应用都是建立在离散系统基础上。这里所谓的离散,主要指的是状态 s s s,与动作 a a a,比如前面的迷宫游戏,规则定义如下:
动作: 共五个动作,上(a1)、下(a2)、左(a3)、右(a4)、保持原地不动(a5)。 奖励: 进入黄色(禁止forbidden区域)=-10、进入白色可通行(passable)区域=0、到达终点(target)蓝色区域=1。 特殊: 若触碰边界(boundary),奖励为=-1,如在最上边依旧往上走,不过机器人状态(位置保持不变) |
首先来说只有 5 5 5 个动作可选,动作并不是连续的,比如说动作 a 1 a_1 a1 与 a 2 a_2 a2 之间并没有 a 1.1 a_{1.1} a1.1, a 1.119 a_{1.119} a1.119 这样的过度动作。状态也是类似,比如说共 5 x 5 = 25 5\text{x}5=25 5x5=25 个位置状态,可以处于 S = { s 1 , s 2 , ⋯ , s 25 } S=\{s_1,~s_2,~\cdots,~s_{25}\} S={s1, s2, ⋯, s25} 中任意一个状态,但是不能处于任意两者的中间状态,比如说 s 5.5 s_{5.5} s5.5。总的来说,就是观测(状态)空间 与 动作空间都是离散的,这种情况其实可以使用表格方式来表示一个价值评估策略 q π q_{\pi} qπ:
列表示状态,行表示动作,任意 状态-动作 对都存在与之对应的价值
q
π
(
s
i
,
a
j
)
q_{\pi}(s_i,a_j)
qπ(si,aj),
i
,
j
i,j
i,j 分别为具体的行列。容易想到的是,为了能够获取每个状态下每个动作对应的价值
q
π
(
s
i
,
a
j
)
q_{\pi}(s_i,a_j)
qπ(si,aj),在编程的时候需要构建一个与上类似的表格存储每个 状态-动作 对的价值。前面讲解分析的价值评估算法,每次迭代优化时,都是对上表中一个格子对应的
q
π
(
s
i
,
a
j
)
q_{\pi}(s_i,a_j)
qπ(si,aj) 进行优化。
对于这种离散空间首先面临的一个问题是,离散维度或离散数量较多时,需要大量数据存储空间。这里的维度指类似于 s , a s,a s,a,如上表格为是一个二维表格,则说明数据空间的维度是 2 2 2 维的。离散数量指单个维度数据下,有多少数量量,比如上表格一行共 5 5 5 个动作,则表示动作空间中的动作数量为 5 5 5。
问题1: 前面的迷宫例子中,首先只有状态与动作这两个维度,另外每个维度下数据量也不大。但是在某些情况或者工况下,维度与各个维度的数据量可能都非常多,要知道 2 维以平方增加数据量,3 维则以立方增加数量,依次类推。总而言之,在维度或维度数据数量较大时,硬件可能无法进行存储 问题2: 以这种表格的方式进行存储,通常来说,只适用于离散空间,而不适用于连续空间。就拿四足机器狗来说,假设其状态包含3维位置,3为姿态,这两个状态量都是连续的,另外真实世界时间线也是连续的, 没有办法把每时每刻的数据都存储起来 |
二、直线拟合
上述两个问题其实可以转换为一个问题:如何使用较小的存储空间,存储大量或者无限的数据。值得确认的一点是,有得必有失去,竟然想用较小的存储空间,存储大量或者无限的数据,那么总得舍弃点什么,毕竟鱼与熊掌不可兼得,这里舍弃的就是精度。具体是怎么回事,下面是一个曲线拟合的例子。
为简单理解核心概念,这里使用状态价值评估,隐藏动作这个维度,即一维的表格即可存储所有状态价值。状态与状态价值的关系可以使用散点图表示出来:
上图横轴表示状态,纵轴表示转态对应的价值,描述这样一个散点图,有多少个状态则有多少个数据。这里假设状态空间数量量为 ∣ S ∣ |S| ∣S∣,则需要存储 ∣ S ∣ |S| ∣S∣ 个数据。为了减少数据存储量,可以使用一条直线去代替上面的离散点,如下所示:

对于上面的直线 k s + b ks+b ks+b 暂时先忽略这条直线(红色)是怎么来的,后面会有相关内容对其进行讲解。不用多说,直线 k s + b ks+b ks+b 中的 k k k 表示斜率, s s s 为自变量状态, b b b 表示 s = 0 s=0 s=0 状态价值。那么显然,描述这样的一条直线,只需要存储 k k k、 b b b 两个值即可。但是在强化学习中,描述这样的直线以及曲线会有一个相对统一的形式,就拿直线来说: v ^ ( s , w ) = a s + b = [ s , 1 ] ⏟ ϕ T ( s ) [ a b ] ⏟ w = ϕ T ( s ) w (01) \color{blue} \tag{01} \hat{v}(s, w)=a s+b=\underbrace{[s, 1]}_{\phi^{T}(s)} \underbrace{\left[\begin{array}{l} a \\ b \end{array}\right]}_{w}=\phi^{T}(s) w v^(s,w)=as+b=ϕT(s) [s,1]w [ab]=ϕT(s)w(01)上式主要通过向量的方式来描述直线,首先使用 v ^ \hat{v} v^ 表示对价值的估计,其与真值 v v v 是不一样的。其把输入数据 s s s 与 参数 a , b a,b a,b 分开来看待,故转换成了两个限量: ϕ T ( s ) = [ s , 1 ] w T = [ a , b ] (02) \color{green} \tag{02} \phi^{T}(s)=[s,~1]~~~~~~~~~~~~w^T=[a,~b] ϕT(s)=[s, 1] wT=[a, b](02) 实际编程或者应用过程中,只需要存储数据 w w w 即可,称呼其为参数向量( parameter vector \color{purple} \text{parameter vector} parameter vector),有了 parameter vector 之后,任意转态与之集合都能够计算出其对应的状态价值 v ^ \hat{v} v^,对于状态来说其也会表示成向量的形式,称呼为特征向量( feature vector \color{purple} \text{feature vector} feature vector),符号为 ϕ \phi ϕ,如 ϕ ( s ) \phi(s) ϕ(s) 表示关于 s s s 的 feature vector。该示例比较简单, v ^ \hat{v} v^ 与 w w w 是一个线性关系。实用这种拟合的方式,主要有如下优点:
优点 1 : \color{blue} 优点1: 优点1: 使用较小的存储空间,存储大量或者无限的信息。
优点 2 : \color{blue} 优点2: 优点2: 且适用于连续空间,特别是观测与连续时间序列相关时。
缺点: \color{red} 缺点: 缺点: 显然,通过上诉方式,使用一条直线代替散点图大大降低了需要存储的数据量,但是这样随着而来的问题就是精度不够。就拿上图来说,已经是比较理想的示例,离散点基本在直线的周围波动,但是实际情况多数为曲线,若在多维情况下则为曲面。哪怕上图这种理想情况都存在误差,就拿 s 1 s_1 s1 状态来说,其价值 k s 1 + b ks_1+b ks1+b 并不完全等于 v ( s 1 ) v(s_1) v(s1)。
三、曲线拟合
有的朋友可能想到,既然直线拟合效果不好,那么可以考虑曲线拟合,参数会多一些,但是相对于大量的状态价值存储来说应该还是要好上很多的。下面再来看看多项式曲线拟合的例子,比如说构建下面这样一个二阶曲线:
v
^
(
s
,
w
)
=
a
s
2
+
b
s
+
c
=
[
s
2
,
s
,
1
]
⏟
ϕ
T
(
s
)
[
a
b
c
]
⏟
w
=
ϕ
T
(
s
)
w
(03)
\color{blue} \tag{03} \hat{v}(s, w)=a s^{2}+b s+c=\underbrace{\left[s^{2}, s, 1\right]}_{\phi^{T}(s)} \underbrace{\left[\begin{array}{l} a \\ b \\ c \end{array}\right]}_{w}=\phi^{T}(s) w
v^(s,w)=as2+bs+c=ϕT(s)
[s2,s,1]w
abc
=ϕT(s)w(03)其实就是构建一个
a
x
2
+
b
x
+
c
ax^2+bx+c
ax2+bx+c 这样一个二次曲线,自变量
x
x
x 替换成状态
s
s
s 即可,上式构建的参数向量(
parameter vector
\color{purple} \text{parameter vector}
parameter vector) 与 特征向量(
feature vector
\color{purple} \text{feature vector}
feature vector) 如下所示:
ϕ
T
(
s
)
=
[
s
2
,
s
,
1
]
w
T
=
[
a
,
b
,
c
]
(04)
\color{green} \tag{04} \phi^{T}(s)=[s^2,~s,~1]~~~~~~~~~~~~w^T=[~a,~b,~c]
ϕT(s)=[s2, s, 1] wT=[ a, b, c](04) 此时可以提看到两个向量的维数都增加了。
w
w
w 的增加要意味着需要存储更多的值,相应其拟合的精度会得到提高。主函数
v
^
(
s
,
w
)
\hat{v}(s, w)
v^(s,w) 相对
w
w
w 来说依旧为一线性函数吗,现对于
s
s
s 来说,其是一个非线性函数,也就是说非线性都被归纳到 feature vector 之中。若是使用神经网络,主函数
v
^
(
s
,
w
)
\hat{v}(s, w)
v^(s,w) 相对
w
w
w 来说则是一个非线性函数。
当然,可以继续增加
w
w
w 的维度,使得
v
^
(
s
,
w
)
\hat{v}(s, w)
v^(s,w) 为更加高阶的多项式。总的来说这种拟合方式称呼为
值函数近似
\color{purple} \text{值函数近似}
值函数近似
(value function
\color{purple} \text{(value function }
(value function
approximate)
\color{purple} \text{approximate)}
approximate) ,有一个函数的值
v
^
(
s
,
w
)
\hat{v}(s, w)
v^(s,w) 去近似
v
(
s
)
{v}(s)
v(s),目的为:
v
^
(
s
,
w
)
≈
v
π
(
s
)
,
w
∈
R
m
(05)
\color{green} \tag{05} \hat{v}(s, w) \approx v_{\pi}(s),~~~~~~~w \in \mathbb{R}^{m}
v^(s,w)≈vπ(s), w∈Rm(05)其中
m
m
m 表示参数
w
w
w 的维度,该值越大,通常来说拟合效果越好,不过需要存储的参数也越多,该值与实际情况以及算法的设计相关,并不可一概而论。但是一般来说
m
<
∣
S
∣
m < |S|
m<∣S∣,都则就失去了值函数近似的意义,因为并不能节省存储(内存)空间。
四、泛化能力
除 [使用较小的存储空间,存储大量或者无限的信息,以及适用于连续空间,特别是观测与连续时间序列相关时] 这两个有点,还有一个比较特别的实用的有点是,值函数近似具备一定泛化能力,比如说存在如下近似曲线
v
^
(
s
,
w
)
\hat{v}(s, w)
v^(s,w):
红色曲线就是 v ^ ( s , w ) \hat{v}(s, w) v^(s,w),可以看出该拟合效果还是有点差强人意,不过这是拟合迭代中间过程,而非最终拟合效果。其中紫色的散点表示最优值,也就是说曲线与散点之间的差值越小越好。假设此时收集到的轨迹数据中对 s 3 s_3 s3 状态进行了访问,那么曲线拟合过程中会调整 s 3 s_3 s3 状态对应的价值,大致如下所示:
其中蓝色曲线表示相关状态调整后的结果, v ^ ( s , w ) \hat{v}(s, w) v^(s,w) 对于 s 3 s_3 s3 状态的拟合效果更加好好了,这是意料之内的情况。但是认真观察上图,状态 s 2 , s 3 , s 4 , s 5 s_2,s_3,s_4,s_5 s2,s3,s4,s5 相应近似价值 v ^ ( s , w ) \hat{v}(s, w) v^(s,w) 都得到了调整。
这就是 值函数近似 \color{purple} \text{值函数近似} 值函数近似 (value function \color{purple} \text{(value function } (value function approximate) \color{purple} \text{approximate)} approximate) 泛化能力的体现,即时没有被范围到的状态也能被优化的到,值得一提的是,这种泛化能提并非百分百都是朝着正确的方向。比如减少 s 3 s_3 s3 状态价值近似误差,可能会导致 s 6 s_6 s6 状态价值近似误差增大,不过总的来说总体误差是减少的。且后续访问到, s 6 s_6 s6 状态时,必然使其朝正确方向改进。
有的朋友可能还担心,若是一个状态量从来没有被访问过,然后被附近被访问过的状态量带偏了怎么办?首先来说,通常情况下相近状态的状态价值不会相差很离谱,即时有也属于个别情况。另外就是,尽然重来没有访问过,实际应用过程中,是无法判断其是否被带偏出现负优化。
总的来说,这种泛化能力就是在对被访问的状态拟度进行优化时,会传播到其附近的状态,也得到一定的优化,不过距离该状态越远被影响概率越低,甚至没有影响。且能够对从来没有访问过的状态价值进行一定程度上的优化与改善。
五、总结
通过上面的分析,了解到 值函数近似 \color{purple} \text{值函数近似} 值函数近似 (value function \color{purple} \text{(value function } (value function approximate) \color{purple} \text{approximate)} approximate)代替表格方式进行存储的优势,虽然在一定程度上会降低精确度,但依旧利大于弊,主要有如下两个有点:
优点1: 使用较小的存储空间,存储大量或者无限的信息,以及适用于连续空间,特别是观测与连续时间序列相关时。 优点2: 具备一定泛化能力,在对被访问的状态拟度进行优化时,会传播到其附近的状态,也得到一定的优化。 |