在开始这一篇内容之前,让我们先回顾一下前8篇所提及的内容。概括地说,前八篇所讲到的各种强化学习方法(DP、MC、TD等),有一个共同套路:即采用数据表存储每一个状态(state)的价值量(value),然后用不同的方式更新这些状态的value,直至收敛;最后根据每个状态下不同动作(action)对应的value,决定应该选择哪个状态,也就是确定了策略(policy)。尽管不同的方法之间有些小的差异,但是从本质上看是相似的。
但是从本篇开始提及的“函数近似”方法,却在本质上有了几个重大改变,也因此有了一些突出的特点。首先要说明的是:“函数近似”更像是一种思想,包含一类方法,从后面的章节就能看出来,基于这个思想,可以衍生出很多不同类型的方法。同时,该方法也正式把强化学习和机器学习联系起来,让我们可以互相借鉴两个领域的一些优势。
那么,函数近似这类方法,有什么改变?第一、对状态的价值量(value)的存储使用函数来表征,不再用数据表。第二、采用机器学习中流行的有监督训练方式来更新函数的固有参数,直至函数收敛。一旦函数训练完成,我们就自然得到了“状态x”--“状态价值量y”之间的映射关系,然后由状态价值决定策略就是顺理成章的事了。这两个改变也相应带来了显著的特点:第一、函数近似方法不需要大量的存储空间来存状态,因为函数的参数个数通常远远少于环境状态的数量(深度神经网络也许是个例外);第二、训练出来的函数具备一定的泛化特性(这也是机器学习方法的常见特性),可以应对部分可观测的环境,这对在实际问题中应用强化学习方法是个好事,因为很多时候我们是无法穷尽所有状态的。
下面开始正式介绍这一类方法。
1. 函数近似思想
1.1 什么是“函数近似”思想?
采用某种函数(线性函数或者非线性函数等等),基于小部分训练样本,来拟合价值函数的真值,比如 或
,使之在较大规模的测试样本上同样适用。这种思想的主要任务就是求该函数的最优参数。
1.2 为什么引进“函数近似”思想?
(1)数据表形式的价值函数有缺陷。
到目前为止,我们对强化学习问题的讨论,都局限于tabular的形式,也就是采用一张表来存储当前任务的价值函数。这张表,可以理解成python里面的字典结构,任务中所有的“状态/状态-动作”作为keys,每个“状态/状态-动作”的价值作为values。为什么这种数据表形式的强化学习会限制强化学习问题的规模呢?有如下两个原因:1、内存空间。当问题规模超大时,存储这么一张表需要的内存空间是巨大的。2、计算时间和所需数据量。当问题规模变大后,再想准确地计算这张表中的每个值,需要的时间开销是巨大的;同时,在很多实际任务中,有些状态和动作是永远不会出现的,这就导致价值函数很难准确计算。
上面这番文字提到的问题,简单总结后,就是四个字:泛化问题,即在小规模数据上获得的经验,怎么才能够在大规模的数据上也适用?
(2)参数方程形式的价值函数可以解决上述泛化问题
使用函数近似的思想,我们只需找到一组最优的参数,也就确定了最优的拟合函数。这个拟合函数既不需要存储大量的状态价值信息,也不要求看到整个状态-动作空间。只要它的参数包含了整个状态-动作空间背后的规律,那么它就可以在任何情况下都表现良好,也就是泛化能力好。
1.3 需要注意的问题
函数近似思想来源于传统的机器学习问题。将这种思想移植到强化学习问题中,自然会带来一些问题。这是因为强化学习中存在很多传统机器学习没有的特点,比如:非稳定性(包括状态分布和奖励分布的不稳定性),自举性(bootstrapping),目标的延后性。在将函数逼近思想融合到强化学习的过程中,这些问题都要考虑到并做出相应改进。
1.4 如何用函数近似思想解决on-policy prediction问题?
我们知道强化学习中存在on-policy和off-policy之分,也存在prediction和control问题之分。事实上,on-policy和off-policy的本质区别在于,更新某状态的价值量时,所使用的方法是沿用既定的策略(on-policy)还是使用新策略(off-policy)。而prediction和control问题的本质区别在于所估计的是状态价值函数 ,还是动作价值函数
。其实这就是几种相似但又有少许不同的问题,我们本篇就从on-policy的prediction问题入手,看看函数近似思想怎么应用。
既然函数近似思想来源于传统机器学习,那么其主要步骤也跑不了机器学习那一套。在函数近似思想的定义中我们提到“这种思想的主要任务就是求该函数的参数”,如何求?分为以下三个步骤:
- 确定价值函数的拟合模型
- 确定待优化的目标函数
- 确定参数的更新算法
这三个环节层层递进,初步给出我们解决on-policy prediction问题的框架,下面分别讨论。
2. 确定价值函数的拟合模型
2.1 价值函数的参数方程表示
在前面几章,价值函数都是采用数据表的形式存储,一个萝卜一个坑。从这一章开始,我们开始采用参数方程的形式表示价值函数,写法: 。该写法表示当权重向量为
时,状态s的价值近似值。比如:
可以是关于状态特征的线性函数,
的每个元素表示每个特征的权重;
还可以是通过神经网络建模得到的非线性函