强化学习(8)--值函数近似

张开发
2026/4/13 14:50:38 15 分钟阅读

分享文章

强化学习(8)--值函数近似
说明本系列文章是我在学习了西湖大学赵世钰老师的《Mathematical Foundations of Reinforcement Learning》一书后的学习笔记在B站上有赵老师的完整课程视频。课程视频链接PDF教材链接本文代码链接一、从表格到函数之前我们都是用表格的方法来维护策略的s-value和q-value当状态空间有限且较小的时候表格的方式很好用但是当状态空间是连续的或者非常大的时候表格的方式将使得存储和计算的需求就爆炸式的增长。从现在开始我们介绍用函数的方式来位数s-value和q-value用有限的参数通过函数的方式来表达value。还是以gridworld为例在表格方法中在函数方法中用来近似是状态的一个函数其中是我们要优化的参数叫做状态的特征向量(feture vector)。对比在表格方法中我们通过查找对应单元格来获取v-value在函数方法中我们通过计算函数值来获取v-value。在表个方法中我们通过修改对应单元格来直接更新v-value在函数方法中我们通过更新参数来间接更新v-value。函数的表达方式具有更强的泛化能力因为在表格方法中我们更新某个v-value只会影响对应的状态s在函数方法中我们更新参数会影响其他状态s通过函数计算的输出值。从上图中我们可以看出函数的方式替代表格的方式本质上是一个用曲线拟合一个数据集合。上图是用一条直线来拟合所有v-value但是如果这些点的分布不是一条类直线呢世界上我们可以根据需要选用多种不同的函数来拟合比如用更复杂的高阶多项式。随着用来拟合的函数阶数的增高参数量增大拟合的精度会增加随之而来的是存储和计算的资源需求也增加。在上面的公式(8.1)和(8.2)中对参数都是线性的我们称之为线性方程近似。(虽然它对状态s不是线性的)近似函数的选择这取决于具体的任务但选择一个好的函数并不简单所以我们通常直接选用神经网络来作为非线性函数近似。目标函数既然我们要优化参数使得则显然目标函数应该是二、基于函数近似的TD Learning期望形式目标函数这里S是一个随机变量是随机变量就涉及到概率分布如果s是均匀分布如果s不是均匀分布(绝大多数情况下)这里的意义在策略下agent从任一初始状态s出发经过足够长的episode在这个过程中访问所有状态s概率分布称之为平稳分布。(Stationary distribution of a Markov decision process)然而并不容易获取因此我们采用梯度下降的方法来优化参数w计算梯度带入可得从GD的期望形式转为SGD的elementwise form:其中是在t时刻S的采样。等式中依赖一个我们并不知道的真实值有两种方法获得一是蒙特卡罗方法采样一个episode用从开始的discounted return来近似。另一种方法是时序差分的方法(TD)伪代码线性的方法较容易理解但是其近似能力有限对于复杂任务选择合适的特征向量也不容易较难收敛。通常情况下我们更多的使用神经网络来近似。这里是估计s-value无法更新策略原因还是Mode-free得方法只有数据没有模型因此我们下面要切换为估计q-value的方法。在线性估计中由于对是线性的所以其对的导数就是特征向量三、TD based on q-value approximation简单的将替换为得到伪代码如果是线性估计则由于对是线性的所以其对的导数就是特征向量四、Q-Learning with function approximation将q-value近似的公式中替换为得到伪代码这是一个on-policy的伪代码和上一章中的Q-Learning一样我们也可以将其改写为off-policy形式。五、Deep Q-Learning我们使用神经网络替代函数近似就是DQN。目标函数(损失函数)要求解则需要用到梯度下降算法在(8.37)中显然和中都是w的函数由于target中有max项计算梯度并不容易。因此我们假定target中的w是固定的不参与迭代则只需要计算estimate项的梯度。令则有双网络这样target和estimate中的神经网络就变成了两个不同的网络我们成estimate中的网络为main networktarget中的网络为target network。main network中的参数在每次迭代中都更新target network则每经过一定的迭代次数后将main network中的参数复制给target network经验重放从目标函数(8.27)我们可以看出计算中只依赖于和前后两个状态的q-value而q-value就是神经网络的输出。也就是说当我们采样一个episode后我们可以将其截断成一个个的而无需关心整个episode的链条关系每个就是一个sample。这样我们就只需要采样一个足够长的episode然后将其封装成一个数据集并将其打乱重复使用(使得每个(s,a)都变成了独立分布)。这不就是深度学习中的典型dataset吗每个训练epoch都使用相同的数据集每个batch从中随机选取部分sample训练迭代(MBGD)。这就是经验重放。经验重放的好处只需采样一次重复利用数据利用率高打乱的数据满足GD对采样独立分布的要求伪代码

更多文章