本章起我们开始讨论用函数来拟合估计值函数,我们用参数
来将值函数参数化,记作
。这类方法泛化性强,非常强大且易于理解。同时,这种方法也适用于部分可见的问题。
1.值函数逼近
本书中所有值函数的更新都是通过目标(target)来进行的,当我们使用函数逼近时,直接将目标公式中的值函数替换为拟合的函数即可。机器学习中的监督学习算法都可以用于函数拟合,它的本质就是利用已有信息来预测未知的值函数。但是不是所有的还函数逼近方法都等价适用于强化学习。比如,复杂的神经网络和统计学方法是静态的训练集合,但是在强化学习中则要求在线的学习。此外,强化学习还要求能解决非静态的问题。
2. 预测目标
首先我们定义一个状态分布
,这代表我们对不同状态产生误差的关注程度。通过
来对整个状态空间加权,我们就可以得到一个自然的目标方程,我们称为均方值误差(mean squared value error):
虽然
不一定是最好的目标函数,但是它可以在某种程度上解决问题。一个理想的目标是找到全局最优点(global optimum),即
。对于线性拟合来说这个目标是比较好达到的,而对于复杂一些的拟合函数来说,函数可能收敛到局部最优点。
3. 随机梯度和半随机梯度
现在我们假设每一步我们观察到的状态值都是真实值,但是我们还是无法保证能准确拟合所有状态。假设我们采样到的状态都来自同一个状态分布,为了最小化
,一个好的策略是利用随机梯度下降SGD算法:
SGD能确保收敛到一个局部最优点。现在我们假设目标输出为
,它不是真实的值函数,但是逼近于真实值,则权重的更新公式为:
以MC算法为例,其梯度下降法的伪代码为:
但是对于像DP这样的自展公式来说,目标内也包含了拟合参数,这样就无法进行有效地梯度下降。因此,自展方法实际上不能进行真正的梯度下降,在这些方法里,只考虑了改变参数在估计值上的影响,而忽视了它在目标上的影响。我们称这样的方法为半梯度方法(semi-gradient)。
半梯度方法虽然不如梯度法稳定,但是它学习的速度快,且可以处理连续和在线问题。
状态聚集(state aggregation)是一种泛化函数拟合的形式,它将状态分组处理,对每个组使用相同的值。它是SGD的一种特殊形式。
4. 线性方法
对应每个状态,都有个特征向量x:
则用线性方法来拟合值函数就是将w和x作内积:
对线性方法来说,特征是基函数,因为它们形成了一组线性基。
当使用SGD时,值函数的梯度和更新公式为:
基本上对所有的线性方法都具有良好的收敛性,并且只有一个最优解。
对于TD(0)来说,它使用的是半梯度法,与SGD不同,其更新公式为:
当系统达到稳定时,有
因此如果系统收敛,我们可以得到:
这个式子被称为TD定点(fixed point)。实际上所有线性半梯度TD(0)都会收敛到这个点。书上给出了详细证明。
在TD定点,误差由最小可能误差决定上界:
在实际中
可能趋向于1,所以误差可能会很大。一个重要的一点是这些收敛性都是建立在同步分布的基础上的,对异步分布,误差可能无法收敛。
半梯度n步TD算法如下图所示:
算法中的关键公式即为:
与第七章的类似。
5. 线性方法的特征建立
本节主要介绍了几种常用的线性特征建立方式,此处不展开讲解,主要包括了多项式法(polynomials)、傅里叶基(Fourier basis)、科斯编码(coarse coding)、瓦片编码(tile coding)和径向基函数(RBF)几种方法,各有优劣。
6. 人为选择步长
大部分SGD算法需要人为设计步长,但是理论知识又无法提供帮助。书中建议了一个经验公式,设使用了
个经验来进行学习,那么步长公式为:
7. 非线性拟合:ANN
本节主要介绍了神经网络的基本概念与在RL中的应用,并举了一些例子,如DQN中的用CNN来提取游戏画面的特征等等。
8. 最小二乘TD
之前介绍的方式都是每一步计算一次,但当我们有更多的计算资源时,我们可以做的更好。回忆一下我们在第四节介绍的TD定点:
实际上我们不需要一步一步计算A和b,可以用TD最小二乘算法直接求解(LSTD):
这样计算的数据利用率更高,但是也更加消耗计算资源,其计算复杂度为
。
但是求逆过程可以有更简单的表现形式,使其复杂度减少为
:
9. 基于记忆的函数逼近
前面提到的方法都是更新参数来减小误差的,在更新后训练样本都会被丢弃。基于记忆的函数法很不同,它将训练集的数据都储存起来,当某一状态被查询时会取出相关的样本进行训练,这也被称为懒惰学习(lazy learning),因为训练的过程时被延迟的,当系统查询并给出结果后才进行。
基于记忆的学习是无参数方法,它不受限于一类固定的拟合函数,而是由训练样本决定,当训练数据足够多时,就能保证拟合函数更好的准确性。基于记忆的方法根据储存与查询方式的不同而不同。在此我们关注于本地学习方法(local-learning),它根据查询值的临近值来拟合函数。类似于传统机器学习中的KNN算法。在查询后,本地估计值被丢弃。
基于记忆的方法有很多有点,它不受参数化模型的限制,同时学习速度很快,还可以解决维度诅咒的问题。但是对于大型数据集,查询会比较耗费时间。
10. 基于核的函数逼近
这一节主要是利用核函数来进行函数拟合,与SVM的原理一样。核函数在数值上表达了不同状态的相关性。核回归是一种基于记忆的方法,通过计算核加权平均来得到结果,它拟合了目标函数(target function):
11. 兴趣和重要性(interest and emphasis)
在有些情况下我们只关注部分状态,函数拟合的资源是有限的,如果能更有目标性地计算,那么训练效果会更好。现在我们假设根据一个MDP有多个同步的状态分布,所有的分布都公式跟随着目标策略产生的周期而产生,但是会因为周期的初始化状态不同而不同。
现在我们介绍一些新的概念。首先我们介绍一个非负标量,随机变量
,称为兴趣(interest),表示了在时间t我们对状态的感兴趣程度,那么状态分布就被定义为在目标策略下由兴趣加权后的状态分布。第二个概念是非负标量随机变量重要性
。这个标量与学习量相乘,用来强调时间t学习的重要性。
其中重要性计算为:
12. 小结
本节我们学习了利用值函数拟合来进行同步预测。传统的方法还是基于线性拟合的梯度下降与半梯度下降法,其是利用参数化拟合来最小化均方值误差来实现的。此外,我们还介绍了非线性与非参数拟合的方式,如现在很热门的深度强化学习。