强化学习读书笔记 -- 第九章基于函数拟合的在线策略控制

本书第一部分主要讲述利用列表法实现策略评估和学习,从第九章开始进入的全书的第二部分近似求解方法。对于大型状态空间的强化学习问题,列表法难以避免维数灾难,因此在有限计算资源下采用近似求解方法,例如基于参数的函数近似方法,可以更有效的解决强化学习问题。函数近似的本质就是学习状态和价值之间的映射关系。给定策略\(\pi\)和近似函数的参数向量\(w\),可以用近似方法去估计状态价值,即\(\hat{v}(s,w)\approx v_\pi(s)\)。近似函数的选择多种多样,可以是线性函数、非线性函数或者决策树等等,视实际问题的泛化要求选择相应的近似方法。采用近似函数的好处在于,函数的参数维度会远小于状态空间的大小,在计算方面会更加高效。但与此同时,不同于列表法,每一个状态价值将不再是独立的,当更改参数\(w\)会影响到所有的状态价值,因此,对近似函数的泛化能力有很高要求。

1.价值函数近似

本书中状态价值函数的所有更新方法都是通过状态价值估计向目标(target)状态价值逼近来进行的。将一次更新可以记作\(s\mapsto u\)。例如,采用蒙特卡洛更新方法\(S_t\mapsto G_t\);采用单步时序差分(TD(0))更新方法\(S_t\mapsto R_{t+1}+\gamma \hat{v}(S_{t+1},w_t)\);采用\(n\)步时序差分(TD(n))更新方法\(S_t\mapsto G_{t:t+n}\);采用动态规划更新方法\(S_t\mapsto E[R_{t+1}+\gamma \hat{v}(S_{t+1},w_t)|S_t=s]\)。这里利用函数近似方法实现的就是状态空间与目标状态价值的映射。在机器学习中,监督学习算法可以用于函数拟合。每一次的交互都可以得到状态\(s\)与目标状态价值\(u\),由此得到输入输出的训练样本,通过监督学习获得近似函数,与此同时,利用函数插值获得给定状态的价值估计。

但是并非所有的函数逼近方法都适用于强化学习。在强化学习中,有一个很重要的要求,智能体应当在与环境交互的过程中不断进行学习。因此,这要求函数逼近方法应当具备在线更新的能力。另外,强化学习还要求能解决非静态的问题,即随着环境的变化而逐渐调整最优策略。这也决定了无法较好处理动态问题的近似方法难以应用在强化学习中。

2. 价值预测准则函数

为了能够准确评价近似函数的准确性,首先定义一个状态分布函数\(\mu(s)\geq0,\sum_s\mu(s)=1\),这也表示了对不同状态产生误差的关注程度。通过计算估计状态价值与真实状态价值的均方值误差(mean squared value error),得到准则函数:

\[\overline{\text{VE}}(w):=\sum_{s\in\mathcal{S}}\mu(s)[v_\pi(s)-\hat{v}(s,w)]^2\tag{9.1} \]

在实际应用中,\(\mu(s)\)采用状态\(s\)出现的比例。目前为止,准则函数\(\bar{\text{VE}}(w)\)是否是正确的评判标准还存在争议,其原因在于学习状态价值函数的本质是为了获得最优策略,而基于这个目标,最小化准则函数\(\bar{\text{VE}}(w)\)并不是必须的。目前并没有非常合适的评判准则。在许多函数近似方法中,寻找全局最优的参数\(w^*\)往往是不可能的,只能获得局部最优解。

3. 随机梯度和半随机梯度方法

随机梯度算法非常经典,详细的概念和应用可以参考算法优化方面的书籍。这里不再详述。

假设采样得到的状态都来自同一个分布\(\mu(s)\),根据\(t\)时刻样本\(S_t\)利用随机梯度下降(Stochastic Gradient Descent,SGD)算法优化准则函数(9.1):

\[\begin{eqnarray} w_{t+1}&=&w_t-\frac{1}{2}\alpha\nabla[v_\pi(S_t)-\hat{v}(S_t,w_t)]^2\\ &=&w_t+\alpha[v_\pi(S_t)-\hat{v}(S_t,w_t)]\nabla\hat{v}(S_t,w_t) \end{eqnarray} \]

当然真实的状态价值是无法得知的。可以根据采样得到的目标状态价值进行更新,即

\[w_{t+1}=w_t+\alpha[U_t-\hat{v}(S_t,w_t)]\nabla\hat{v}(S_t,w_t)\tag{9.2} \]

\(U_t=R_{t+1}+\gamma\hat{v}(S_{t+1},w)\),其半梯度算法的伪代码如下图所示。

image-20240108163143408

状态聚集(state aggregation)是一种函数近似的泛化形式,它将状态空间聚集成多个组别,对每个组使用相同的状态价值估计。SGD算法是状态聚集的一种特殊形式,每个状态各为一组。具体效果可以参考实验2。

4. 线性近似方法

每个状态都有对应的特征向量\(x\)

\[x(s)=[x_1(s),x_2(s),\ldots,x_d(s)]^\Tau \]

线性近似方法即用参数向量\(w\in\R^d\)\(x\)的内积来估计状态价值,

\[\hat{v}(s,w)=w^\Tau x(s)=\sum_{i=1}^dw_ix_i(s) \]

对线性近似方法来说,特征向量是由一组基函数构成的。根据随机梯度算法更新式的一般表达(9.2),线性近似方法的更新公式为

\[w_{t+1}=w_t+\alpha[U_t-\hat{v}(S_t,w_t)]x(S_t) \]

线性方法的优点在于具有良好的收敛性,可以得到全局最优解。但缺点也很明显,其近似能力有限。线性近似方法对于TD(0)的半梯度算法而言,仍然只能收敛到局部最优。其更新公式为

\[\begin{eqnarray} w_{t+1}&=&w_t+\alpha(R_{t+1}+\gamma w_t^\Tau x_{t+1}-w_t^\Tau x_t)x_t\\ &=&w_t+\alpha(R_{t+1}x_t - x_t(x_t-\gamma x_{t+1})^\Tau w_t) \end{eqnarray} \]

当算法达到稳定时,给定\(w_t\)可得下一时刻参数向量的期望

\[\mathbb{E}[w_{t+1}|w_t]=w_t+\alpha(b-Aw_t), \]

其中,

\[b = \mathbb{E}[R_{t+1}x_t]\in\R^d\\ A = \mathbb{E}[x_t(x_t-\gamma x_{t+1})^\Tau]\in\R^{d\times d} \]

当算法收敛时,满足\(b-Aw_{\text{TD}}=0\),可得局部最优解w

\[w_{\text{TD}}=A^{-1}b, \]

称为TD定点(TD fixed point)。所有线性半梯度算法都会收敛到这个点。在TD定点,误差由最小可能误差决定上界:

\[\bar{\text{VE}}(w_{\text{TD}})\leq\frac{1}{1-\gamma}\min_w\bar{\text{VE}}(w) \]

在实际应用中\(\gamma\)往往趋向于1,所以误差浮动范围会很大。需要注意的是收敛性的分析都是建立在同分布的情况。当分布发生变化时,误差可能无法收敛。TD(n)的半梯度算法的伪代码如下图所示。

image-20240109205404482

值得注意的是,其核心更新公式的不同之处在于目标价值\(U_t=G_{t:t+n}\),即

\[G_{t:t+n}:=R_{t+1}+\gamma R_{t+2}+\cdots+\gamma^{n-1}R_{t+n}+\gamma^n\hat{v}(S_{t+n},w_{t+n-1}). \]

5. 线性方法中的特征函数

本节主要介绍了几种常用的状态特征的构建方式。选择特征是一种引入先验知识的重要方式,合适的特征对于强化学习非常重要。传统的线性近似方法中,特征之间的关系被忽视了,特征之间按照独立的方式进行拟合。基于这样的问题有大量的学者提出了改进方法,主要包括多项式法(polynomials)、傅里叶基函数(Fourier basis function)、粗编码(coarse coding)、瓦片编码(tile coding)和径向基函数(Radial Basis Functions, RBF)几种方法。

  • 多项式法

利用多项式构建状态特征是一种较为直观简便的特征构建方式。任何可以解决回归问题的算法都能用来解决基于多项式的状态价值函数拟合问题。在强化学习中,多项式方法效果并不理想,但作为构建特征的引入方法还是值得介绍一下的。例如,某个状态\(s\)可以表示为两个维度的特征\(x(s)=[s_1,s_2]\)。但是如前面所述,这样的表示方式忽视了特征之间的关系,因此可以采用多项式的方式将其扩展为\(x'(s)=[1,s_1,s_2,s_1s_2]\),或者将其扩展到更高维空间中\(x''(s)=[1,s_1,s_2,s_1s_2,s_1^2,s_2^2,s_1s_2^2,s_1^2s_2,s_1^2s_2^2]\)。从而可以将特征及其之间的信息纳入考虑之中。这里给出多项式法更一般的表现形式。假设存在\(k\)个特征\(s_1,s_2,\cdots,s_k\),利用\(n\)阶多项式将其扩展为

\[x_i(s)=\prod_{j=1}^ks_j^{c_{i,j}},\ c_{i,j}\in\{0,1,2,\cdots,n\} \]

可以简单计算一下存在\((n+1)^k\)个不同特征。显然,多项式方法会面临维数灾难的问题。当然,利用特征选择方法去降低特征空间的维度也是不错的选择。

  • 傅里叶基函数法

傅里叶基函数法就是利用傅里叶变换和傅里叶级数,将状态价值函数表示成为正弦或余弦等基函数的线性组合。从数学上而言,只要给定足够多的基函数,傅里叶基函数可以拟合任意形式的函数。在一些强化学习问题中,傅里叶基函数法能够发挥很好的作用,本质而言是其拟合能力更强。当然,傅里叶特征有其自身的局限性,在处理不连续函数的拟合问题是,在不连续点会出现震荡(ringing)。另外,与多项式法一样存在维数灾难问题,在处理较小的特征空间(\(k\leq5\))时,还是有效的。

具体效果可以参考实验3。

  • 粗编码

粗编码方法一种更加自然的表示方式,将状态特征空间看作是多个子空间的组合。下图所展示的一个二维状态特征空间可以看作多个圆形子状态特征空间的组合,每个状态生成的特征是一个13维的二值向量。例如,状态\(s\)处于对应圆形子状态内则对应的特征值为1, 反之则为0。同理,状态\(s'\)的特征也是一个13维的二值向量。粗编码方式在某种程度上也反映了两个状态之间的关系。状态聚集在粗编码也有体现,例如下图的黑色区域内的所有状态共享相同的特征向量。

image-20240109213422328

在利用粗编码进行状态价值函数近似时,需要考虑子状态特征空间的数量、大小、形状和稠密程度,如下图所示。左图展示的是利用较小的子状态空间生成特征向量,中间图展示的是利用较大子状态空间生成特征向量,而右图展示的是非对称得到子状态空间。采集样本并利用梯度方法去学习子状态特征空间的参数,例如可以固定子状态特征空间的数量、大小和形状,学习子状态空间的分布。

image-20240110104456063

具体粗编码的实现可以参考实验1。

  • 瓦片编码

瓦片编码也是粗编码的一种形式,是研究人员找到的一种更灵活计算更高效的编码方式。下图展示针对二维连续状态空间的瓦片编码方式。采用4个瓦片(tiling)分别将状态特征的感受野分组到对应的瓦片中,每个瓦片又被分成了\(4\times 4\)个均匀网格(tile)。例如图中的白点为一个状态,那么根据白点位于不同瓦片的对应网格位置构成特征向量,特征向量依然是一个二值向量,白点对应位置的特征为1,反之为0。值得注意的是,单个瓦片对状态空间并非粗编码,而只是状态聚集。图中的瓦片编码共有\(4\times4\times4=64\)种状态特征。瓦片编码相对于前面所提到的粗编码形式的改进之处在于①子特征空间采用矩形而非圆形,计算边界更加方便。②瓦片编码形式使得特征长度都是一致的,更便于计算机进行处理。③计算复杂度大大降低,利用二值向量计算\(w^\Tau x(s)\),只需要将状态所处的对应位置的权值累加起来就是状态价值估计,而运算次数为瓦片数量而非特征向量的维数。

瓦片的铺设方式即不同瓦片之间的偏移量设置与泛化能力是有很大关系的。采用非对称偏移的铺设方式往往比采用均匀偏移更有效。下图展示了两者不同铺设方式。Miller和Glanz(1996)建议的非对称偏移铺设方式为对于一个\(k\)维的连续状态空间,采用\(n\)块瓦片进行铺设,\(n\)是关于2的指数次幂且\(n\geq4k\),偏移值采用基数\((1,3,\ldots,2k-1)\)。例如图中2维空间铺设8块瓦片,初始偏移值采用\((1,3)\)

image-20240110125803881

瓦片编码的应用中,会选择瓦片的数量和网格的形状去满足不同状态空间的特征,如下图所示。在实际应用过程中,由于不清楚环境的动态信息,很难将瓦片布置的很合理,例如不清楚状态空间某一维度的上下界,那么瓦片的覆盖范围会设置的很大,而实际交互过程中,只有小部分的状态会被访问到,造成资源的浪费。这时采用哈希编码将遇到的状态进行处理,即将状态映射到一系列的哈希值中,这些哈希值不再像传统的瓦片编码那样具有空间特征,但是可以有效节省存储空间,因为哈希编码只需要满足实际任务需求(只对遇到的状态进行哈希编码)。哈希编码下的瓦片编码实现原理可以参考http://incompleteideas.net/tiles/tiles3.html.

image-20240110134059154

具体效果参考实验4。

  • RBF

径向基函数也是一种粗编码方式。不同于前面提到的粗编码采用二值化,径向基函数可以实现连续域的特征值。其一般形式为

\[x_i(s)=\exp\left(-\frac{\|s-c_i\|^2}{2\sigma_i^2}\right) \]

在训练过程中,根据样本学习得到每个特征所对应的中心点\(c_i\)和辐射范围\(\sigma_i\)。RBF最大的好处在于可以提供更加平滑的可微分的状态价值函数估计。但是在高维状态空间中,RBF的性能却难以满足要求,因为RBF本身无法提供明确的边界划分,而边界在高维空间中是非常重要的。

6.学习步长的选择

大多数的随机梯度算法都需要设定步长,书中提供了一个经验公式,

\[\alpha=(\tau\mathbb{E}[x^\Tau x])^{-1} \]

其中,\(\tau\)表示进行学习的样本数量;\(x\)表示随机样本向量。

7. 非线性函数近似:人工神经网络

人工神经网络在强化学习中的应用非常广泛。目前,卷积神经网络对强化学习研究有非常大的促进作用,称为深度强化学习。人工神经网络有一个重要特性,对于包含一个足够大的隐含层采用sigmoid激活函数的人工神经网络可以近似任何连续函数至任意精度(Cybenko,1989)。但是,深度人工神经网络的表现往往不佳,其原因主要在于第一神经网络规模越大,参数越多就越难避免过学习,导致其泛化能力不佳;第二误差传递随着层数的增加而急剧减小,导致输入层的权重学习速度过慢。

8. 最小二乘TD(LSTD)

TD(0)算法的更新方式是逐步更新的,当计算资源充足时,可以直接计算TD定点:

\[w_{\text{TD}}=A^{-1}b \]

正如前面所讲述的,TD(0)的半梯度算法最终收敛于\(w_{\text{TD}}\)。当然,计算高维矩阵的逆是非常消耗运算资源的,可以采用递推最小二乘算法进行求解,假设时刻\(t\)得到

\[\hat{A}_t=\sum_{k=0}^{t-1}x_k(x_k-\gamma x_{k+1})^\Tau+\epsilon I\\ \hat{b}_t=\sum_{k=0}^{t-1}R_{t+1}x_k \]

利用求逆的递推形式,可得

\[\begin{eqnarray} \hat{A}_t^{-1}&=&\left(\hat{A}_{t-1}+x_{t-1}(x_{t-1}-\gamma x_t)^\Tau\right)^{-1}\\ &=&\hat{A}_{t-1}^{-1}-\frac{\hat{A}_{t-1}^{-1}x_{t-1}(x_{t-1}-\gamma x_t)^\Tau\hat{A}_{t-1}^{-1}}{1+(x_{t-1}-\gamma x_t)^\Tau\hat{A}_{t-1}^{-1}x_{t-1}} \end{eqnarray} \]

其中,\(\hat{A}_0=\epsilon I\)。下面给出LSTD算法的伪代码。

image-20240110144416836

9. 基于存储的函数近似方法

上面提到的近似方法都是参数化方法。基于存储的近似方法是非参数化的,它将训练集的数据都储存起来,当某一状态被查询时会取出与之相似或相近的样本进行学习,这也被称为懒惰学习(lazy learning),因为训练过程是延迟的,仅当状态被查询时才开始。相比于参数化方法,非参数化方法不需要预先定义近似函数的形式,也不需要假设样本满足什么样的分布形式。最直接的基于存储的近似方法是紧邻(nearest neighbor)方法。当然,它的缺点也很明显,对于大型数据集的查询会比较耗费时间,响应速度慢。基于此许多研究人员提出了加速查询的算法,例如k-d tree、剪枝法等等。

10. 基于核方法的函数近似

核方法的概念具体可以参考机器学习中的支持向量机的实现,这里就不再赘述。核方法最大的好处在于可以将低维特征映射到高维,而不需要知道其具体的映射形式。在实际运算过程中,通过核函数计算高维空间中的两个特征向量之间的内积。

11. 兴趣和重要性(interest and emphasis)

在前面所论述的所有函数近似方法是等价看待所有的状态,但在实际应用中,在一轮带折扣系数的交互过程中,往往早期的状态对起始状态的价值估计影响最大;又或是在动作价值估计过程中,往往更关注动作价值高的状态。实现函数近似的资源是有限的,如果能更有目的进行计算,那么训练效果会更好。

引入两个新的概念。首先引入一个非负标量,随机变量\(I_t\),称为兴趣(interest),表示对\(t\)时刻的状态的感兴趣程度,当\(I_t=0\)则表示对该状态没有兴趣。例如准则函数(9.1)中的\(\mu(s)\)就可以看作是对状态\(s\)的兴趣程度。

引入第二非负标量,随机变量\(M_t\),称为重要性。这个标量与学习率相乘,用来强化或削弱\(t\)时刻的学习。那么可以得到TD(n)的参数更新一般表达为

\[w_{t+n}=w_{t+n-1}+\alpha M_{t+n}[G_{t:t+n}-\hat{v}(S_t,w_{t+n-1})]\nabla\hat{v}(S_t,w_{t+n-1}),\ 0\leq t<T \]

其中,重要性更新方式为

\[M_t=I_t+\gamma^nM_{t-n} \]

可以看出\(t\)时刻参数更新的重要性由两部分组成,一个是对当前状态的感兴趣程度,另一个是前\(n\)个时刻的重要性(打折后)。

12.实验

实验1:粗编码的精度

这个实验主要测试粗编码的近似性能与感知域的大小的关系。考虑一个一维方波函数,区间\([0.5,1]\)的值为1,分别采用三种区间大小的一维线段进行近似。实验设计中,采用固定数量的区间函数,如50、100和200。采集不同数量的样本,如10、40、160、640、2560和10240。在实验过程中,学习率为\(\alpha=0.2/n\),其中\(n\)为当前时刻激活的感知域的数量。感知域的布置方式采用均匀分布在目标区间范围内。在代码实现过程中,采用了面向对象的编程理念,分别定义了Interval类和ValueFunction类用来封装感知域和价值函数,具体代码参照随书代码第九章square_wave.py

当采用50个区间函数进行近似,实验结果如下图所示。

image-20240112182906733

​ 图1.1 50个感知域下的不同样本数量不同区间大小的仿真结果

根据图1.1可以看出随着样本数量的增加粗编码近似方法逐渐逼近方波函数。但在实验过程中,样本数量大量增加(\(>10240\))之后,近似效果并没有进一步改善,调小学习率也无法改善。其原因可能在于方波是非连续函数,出现了“ringing”现象。感知域越宽初期的泛化能力越好,后期的平滑度也很好;粗编码的近似效果并非随着感知域的宽度逐渐增加而近似效果越来越好,多次实验后发现感知域宽度为1是效果最好的。

当采用200个区间函数进行近似,实验结果如下图所示。

figure_9_8_200

​ 图1.2 200个感知域下的不同样本数量不同区间大小的仿真结果

对比图1.1和图1.2可以看出,随着感知域的数量增加,相同样本数量下近似效果会更好;从图1.2中可以明显看出,感知域的宽度0.2的近似效果要优于感知域的宽度0.4的近似效果。当然,从极端的角度看,当感知域的宽度无线趋近于0且数量无限趋近于无穷,那么近似效果应该无限逼近真实值,但感知域的宽度1的效果依然是最好的,这让我不禁怀疑是否与方波的宽度有关。于是,将方波宽度改为0.4之后,发现感知域的宽度0.4的效果是最好的。

至此明白其原因所在,在方波的近似过程中,若感知域宽度与方波宽度一致,那么与方波重叠最多的感知域的权重也会最大,从而保证其近似效果。那么通用的规律应该是感知域的数量越多越好,相应的感知域的大小越小越好。

粗编码与傅里叶近似的理念很接近。但是傅里叶采用的是连续周期性函数,傅里叶系数的运算也很直接。而粗编码采用的是非连续的函数,其权重需要采用学习方式。

实验2:基于状态聚集的随机行走价值函数近似

考虑一个马尔可夫奖励过程(Markov reward process, MRP),例如下图所示。本实验采用包含1000个状态的随机游走任务,状态从左到右依次记为1到1000。每次从中心位置出发,即状态500,向左或向右移动\(n\in[1,100]\)个状态,\(n\)采用均匀分布。当到达左端终止状态,获得奖励\(R=-1\),到达右端终止状态,获得奖励\(R=+1\),其他状态转移的奖励均为\(R=0\)。若当前状态已经靠近边缘,移动超过边缘都是为到达终止状态。

现采用基于蒙特卡洛的随机梯度算法估计状态价值,同时采用状态聚集策略每100个状态为一组,例如状态1到100为第一组,状态101到200为第二组,依此类推。实验过程中,超参数选择\(\gamma=1\)\(\alpha=2\times 10^{-5}\)。具体代码参照随书代码第九章random_walk.py。实现结果如下。

image-20240113102332849

第一张图展示了状态聚集后的状态价值估计和真实状态价值的对比曲线。从实验结果可以看出状态聚集的策略同样可以逼近真实状态价值,只是精度上会有所降低。将两张图对比起来看,状态500到左右两边的概率分布都是相同的,所以状态集的价值线的中点位于真实价值线上,而状态集1(左端第一条横线)的价值估计与真实价值的交点偏右,其原因在于状态分布\(\mu\)也是右端高于左端,这一点也说明准则函数\(\bar{\text{VE}}\)的确是最小化的。

现采用基于TD(0)的半梯度算法估计状态价值。同样采用状态聚集策略每100个状态为一组,超参数选择\(\gamma=1\)\(\alpha=2\times 10^{-4}\)。实验结果如下图所示。

image-20240113110628755

与蒙特卡洛(MC)方法相比较可以看出,半梯度算法收敛于局部最优解。虽然效果比MC方法差,但是它有可以在线学习的能力。下面考察一下半梯度算法在不同步数(TD(n))和学习率情况下的初期性能(进行10轮交互)。为了保证实验的一般性,进行100轮重复实验。实验结果如下图所示。

image-20240113111221925

实验结果与前面基于列表法的TD算法的实验一致,即步数越大要求学习率越小。

实验3:基于傅里叶基函数和多项式的价值函数近似

本实验采用实现2中的随机行走环境进行模拟。首先将所有状态根据序号映射到\([0,1]\)的区间内,采用state_id/1000的计算方式。当采用多项式近似方法时,将状态特征扩展为

\[x(s) = [1,s,s^2,\cdots,s^n], \]

其中,\(n\)为多项式阶数。因为是一维状态空间,所以不用考虑状态之间的关系。同理采用傅里叶基函数近似方法时,将状态特征扩展为

\[x(s) = [1,\cos(\pi s),\cos(2\pi s),\cdots,\cos(n\pi s)]。 \]

其核心更新方式,依然是线性优化,即

\[\begin{eqnarray} w_{t+1}&=&w_t+\alpha[v_\pi(S_t)-\hat{v}(S_t,w_t)]\nabla\hat{v}(S_t,w_t),\\ \nabla\hat{v}(S_t,w_t) &=& x(S_t) \end{eqnarray} \]

实验过程中,分别采用5、10、20阶次的函数近似,多项式近似的超参数\(\alpha=10^{-4}\),傅里叶近似的超参数\(\alpha=5\times 10^{-5}\)。采用蒙特卡洛方式估计状态价值。为了保证实验的一般性,进行100轮重复实验。实验结果下图所示。

figure_9_5

从图中可以看出,傅里叶近似的效果比多项式的效果好很多。傅里叶近似并非阶次越高越好,5阶就能满足近似的需求。只是高阶的傅里叶近似方法学习过程更加平稳。

实验4:基于瓦片编码的价值函数近似

本实验采用实现2中的随机行走环境进行模拟。在实验过程中,使用50片瓦片,每片瓦片的子区间(因为是一维的)覆盖200个状态。瓦片放置方式采用均匀放置,每次偏移4个状态,每个瓦片有6个子区间(\(1000/200+1\))。采用蒙特卡洛方式估计状态价值,超参数\(\alpha = 0.0001/瓦片数量\)。比较1片瓦片(即状态聚集)和50片瓦片的估计性能。为了保证实验的一般性,进行30轮重复实验(时间实在太长了)。

值得一提的是,随书代码的编码方式非常有技巧,值得好好体会。作者将价值函数TilingsValueFunction类、算法gradient_monte_carlo方法和实验figure_9_10方法剥离开来,使得代码的可扩展性大大提高。每当采用不同的近似方法时,只需要自行实现价值函数类及其内部的value方法(根据给定状态计算其状态价值估计),update方法(根据给定的状态和更新值更新相应权重)。最让我觉得巧妙的是,将学习率的设置,放置在算法中而非价值函数类的update方法中。

实验结果如下图所示。

image-20240114143302093

从图中可以看到状态聚集的学习速度明显较快且完成收敛,原因在于,贴片数量增加需要学习的参数也大大增加,在当前学习率下,5000轮交互是远远不够的。因此,改变学习率为\(\alpha = 1/(\text{episodes}+1)\),进行60次实验的结果如下图所示。

从图中可以看出,瓦片数量多的近似效果好。

13.小结

本章主要学习了利用函数近似方法拟合状态价值函数。从本质上来讲,就是在给定策略下,对该策略进行评估。拟合状态价值函数的准则函数采用在在线策略分布\(\mu\)下的均方误差。基于时序差分算法的随机梯度下降方法,由于未将目标价值的随机性考虑在内,因此,只能称之为半梯度方法。本章主要介绍了一系列的线性近似方法,其中效果比较好的方法是瓦片编码和傅里叶基函数。

posted @ 2024-06-25 13:49  不秃头的程序员不秃头  阅读(174)  评论(0)    收藏  举报