​ 之前我们介绍的是基于表格的方式,现在我们要介绍基于函数的方式。现在开始,我们要引入神经网络。此外,现在讲的都是基于值的,下次将介绍基于策略的。

​ 虽然我们没有明说,但我们目前为止确实是以表格方式存储数据的,比如:

image-20230819213910909

​ 显然当state space连续或者巨大无比的时候,这种方式就不能用了;同时泛化能力也不能得到保证。引入函数近似的话,这些问题就可以解决了。假如我们有好多好多状态s,每个都对应一个v,那能不能用一条曲线来拟合v-s关系呢?

​ 最简单的就是直线,可以写成: ​ 当然了不用想都知道这是不准确的。我们也可以用高阶曲线去近似: ​ 或者用神经网络去模拟。模拟的好处是,可以用比state space的大小更少的参数去存储,并且具有很好的泛化性(就是如果改变一些state value,可能相邻的state value也会改变,而不需要访问所有的state)。下面是正式的介绍。

state value estimation

​ 这节都讲的是重要的方法。

objective function

​ 我们的目的是找到最优的去让我们的去最好的近似我们的。这实际就是在policy evaluation。为了找到最优的,我们就要找到定义目标函数,并且去优化。

​ 目标函数的定义为: ​ 这里的S是个随机变量,它的概率分布是什么呢?第一种方式是把所有S看作是平等的,这样目标函数就是: ​ 但是这里有一个问题,因为目标状态和它相邻状态可能是更重要的,重要的状态应该有更大的权重,这样它们估计的误差就比较小。因此我们引入第二个概率分布:stationary distribution(平稳分布,可能是这么翻译的吧),它表述了一个马尔科夫过程的long-run behavior。

​ 我们用描述这个分布。因此我们有。这样,目标函数就可以写成: ​ 所谓平稳,就是从现在出发,执行某个策略跑了很多很多步后,达到的一种概率分布,这时候是达到平稳的状态了。这个分布在值函数近似和策略梯度中都很重要。

​ 例如,假设我们有如下探索性策略:

image-20230820215547357

​ 那么我们可以定义: ​ 如果我们执行很多很多步,做一个long run,那么这个概率分布最后就会趋向于如图所示:

image-20230820215657497

​ 我们注意,上图的后边末端有星号标注,这些是理论值。实际上,我们不需要跑很多次也能找到这个理论值,这个值怎么找呢?我们有这样的式子被满足: ​ 这个式子其实就是说明到平稳态了。其中,是我们的状态转移矩阵, 每一个元素代表了s到s'的概率。显然,是对应特征值为1的特征向量(这里注一下,我认为应该是P转置的特征向量),在本例中状态转移矩阵为: ​ 那么可以求出:

优化算法

​ 我们要优化这个目标函数。一般方法会想到梯度下降,那我们就求一下梯度: ​ 但是我们这里要计算一个期望,怎么去避免?我们很自然想到stochastic gradient来避免求期望,因此就有更新公式: ​ 学习率后面那一坨把原先的梯度近似替代的东西。其中,是对S的采样,被合并成了以保持简洁。但是呢,我们这里涉及了,但是我们是要求它,我们是不知道的,所以我们要用其他量代替它。代替的方法有两种:

​ 第一种便是MC方法:就是把从出发的episode的discounted return,即,近似当做。第二种是TD方法:就是用(也就是TD target)去代替。由此得到以下算法伪代码:

image-20230820222317517

​ 这里我们提到了linear case。这是特定的对的选择,虽然我们到现在还没讨论怎么选择它;我们可以选择线性的或者非线性的。

近似函数选择

​ 怎么选取?有两种方法,一是用线性模型,之前我们介绍过;二是现在广泛使用的,就是用神经网络去逼近这样一个函数,输入一个s就能输出一个

​ 如果是线性的,那么梯度就是: ​ 这就得到了我们刚刚展示给各位的伪代码中的公式(就不再复制过来了)。这种方式叫做TD-Linear。这种方式的缺点就是feature vectors太难选了,这也是为什么它逐渐被神经网络替代。当然它也有好处,第一是理论性更好去分析(神经网络的理论性很难分析);第二就是表征能力还是有的,而且tabular representation就是linear function approximation的一个特殊情况(就是把看作是第s个元素为1而其他都是0的列向量)。

举例

​ 先给出我们的例子、真实的状态值和曲线表示:

image-20230821112014596

​ 假设我们根据策略得到了500个episodes,每个episode有500steps。每一个episode的初始s,a是均匀随机的。使用TD-Linear,我们拟合曲面,选择如下特征向量: ​ 由此得到: ​ 这个显然是三维空间的一个平面。最后得到的结果如图:

image-20230821112428660

​ 可以看出虽然最后收敛了,但是误差也不是零。如果想更好的拟合,就要用更复杂的高阶曲面,需要更多的参数,比如,我们选择如下特征向量: ​ 当然我们还可以继续往上叠次方: ​ 在三次方的情况下,最后结果如图:

image-20230821112721589

值函数近似下的Sarsa和Q-leraning

​ 在值函数近似下,Sarsa算法公式为: ​ 其实就是v换成q了, 。这个算法还是在policy evaluation,我们需要和policy improvement结合,就有了如下伪代码:

image-20230821194931015

​ 和Q-learning结合也差不多,它的公式就是: ​ 区别就在于加了max,并且把max里面变成了。它的一个on-policy版本的伪代码为:

image-20230821195456590

DQN

​ Deep Q-learning ,也叫deep Q-network,是最早成功引入神经网络到RL的技术。神经网络在这里扮演的角色就是一个非线性函数:有一组参数w,输入s和a,输出。DQN要优化的目标函数(亦或者说损失函数)是: ​ 括号里的东西其实就是Q-learning的TD-target,对应了bellman optimal error,这是因为: ​ 优化的方式是梯度下降。问题在于,如何计算梯度?这也是DQN的一个重点贡献。我们要求对w的梯度,但是J(w)里有两个含w的式子。后面含w的那一项好算,但是前面那一项不好算(因为他是max函数,这是不可导的!但是N那种ReLU、maxpooling又怎么反向传播呢?可以看看这个:relupooling_argmax 求导_Jumi爱笑笑的博客-CSDN博客)。在DQN中,它把前面整个假设为了y: ​ 假设y里面的w是一个常数,这样J(w)就相当于只对后面的w求梯度了。为了实现,DQN引入了两个网络:一个是主网络,用来代表;另一个是目标网络(target network),为。主网络的w一直随着新采样进来而更新;而target work并不是在一直更新,而是每过一段时间就把主网络的w给赋值过来。此时目标函数就变成了: ​ 这样优化的时候,先假设不动,然后计算对w的梯度,然后再去优化J。这样w和都能收敛到最优值。这样一来,J的梯度就是:

Experience replay

​ 经验回放,RL专有名词,是DQN里出来的技巧。我们收集数据(即experience)时是有先后顺序的,但是用的时候不是谁先来就用谁。我们把他们数据储存到一个集合,定义为:。这个集合就叫replay buffer。每次训练神经网络时,就从这个集合里拿出一些samples,拿出来用的过程就叫experience replay;拿出来的过程应该均匀分布,保证每个数据拿出来的概率相同。

​ 我们为什么必须要用经验回放?为什么要均匀分布?关键就在与我们刚刚讲的目标函数J。我们的随机变量有R,S',S,A;我们把(S,A)看成一个随机变量(的索引),服从分布d,之后再说。R和S'服从于系统的模型,,不作过多讨论。回到(S,A),我们假设它们是均匀分布的。我们没有先验知识,所以不能看作高斯分布什么的,只能一视同仁。

​ 好了,现在我们要求它们均匀分布,但我们采集数据是按其他分布采集的,所以我们就要把数据放在一起打散,然后均匀采样,这样就打破了不同sample之间的correlation。为什么基于表格的算法就不要经验回放,换言之,不需要(S,A)均匀分布?因为DQN是在做一个值函数近似,在对一个标量目标函数做优化,涉及到(S,A)的期望,这就涉及到(S,A)的分布。而基于表格的方法是在求解BOE,这个期望和(S,A)无关,它们是内部的概率模型。

​ 再者,经验回放可以让样本更有效的被利用,因为会被重复利用。在确定性环境中(随机性不谈),我们只要保证所有(S,A) pair都被访问到,丢到经验缓冲池里用就行了,而不需要访问庞大的步数作为一个episode。

实现

​ DQN的off-policy伪代码如下。

image-20230823004611347

​ 其实这是简化版的,原文还用了更多的技巧,用了更高效的神经网络。看看这个max:在我们的例子中,我们输入s和a,神经网络只会输出一个q,这样我们每个s有五个a,我们求解就要经过五次神经网络;而原论文的神经网络时直接输出一堆q,然后这样max就显而易见了。

​ 不过捏显然DQN对于数据要求是很高的。加入数据不好,就会变成下面这样:

image-20230823005532629