6. 值函数近似(Value Function Approximation)

6. 值函数近似(Value Function Approximation)

本节需要解决的问题是:在实际场景中,我们的状态是非常大的,如果我们使用之前的建立一个个表格的方法,他的数据规模也会非常大,这显然不是一个很现实的解决方案。我们希望提出一种新的value function,他可以近似等于真正的value function,但是我们不再需要为每一个state建立一个映射。

Solution for large MDPs

我们希望建立一个如下所示的近似函数:

\hat{v}(s,w) \approx v_{\pi}(s)\\ or \\ \hat{q}(s,a,w) \approx q_{\pi}(s,a)

  • 其中就是这个函数的参数w,可以理解为神经网络的权重参数。
  • 这样一来,除了我们不再需要记录整个s,或者<s,a>的表格之外,她还有好处就是,我们可以以此来预测我们不曾遇到的状态。
  • 网络的更新:我们通过之前的学习算法(TD,MC,Q-Learning 等)来更新w

以上就是整个解决方案的大体过程

Which Function Approximator

让我们先回顾一下强化学习的特点:

强化学习的特点:

  • 非稳定的(non-stationary),我们的数据分布是动态变化的,他有时候可能只是微调,有时候会发生巨大的改变(比如你由一个房间进入了另外一个房间,状态可能看起来差不多,但是里面的东西发生了巨大的变化),我们需要适应这种变化
  • 数据非独立同分布(non-iid),agent目前所处状态对于预测的概率是有影响的,所以基于独立同分布假设的近似函数不可用

Incremental Methods

Incremental Methods 做的是增量的更新,每来一个数据,我们就更新一次模型的权重

下面介绍该方法的几个组成要素:

Gradient Descent

首先,我们来看一下梯度下降法在强化学习中是如何应用的,首先,我们想做的是什么呢?从值函数的角度说,我们希望找到一个最合理的网络权重,让他能够对每一个输入的s,或者<s,a>,可以给出合理的预估v(s),或者q(s,a),假设 \hat{v}(s,w) 是我们近似的函数模型, {v}(s,w) 是真正的value function,使用均方误差为error function 可以表示为: J(w) = E_{\pi}[(v_{\pi}(s)-\hat{v}(s,w))^2]

使用梯度下降法,以w为变量,梯度可以表示为:

\begin{align} \Delta w &= - \frac{1}{2} \alpha\nabla_w J(w)\\ &=\alpha E_{\pi}[(v_{\pi}(s)-\hat{v}(s,w)) \nabla_w \hat{v}(s,w)] \end{align}


第二行,可以直接使用链式法则推出来。

在随机梯度下降法中,我们直接对梯度进行采样,不使用policy在该状态s采样下的期望,而是直接使用某一个既定的状态来作为更新量,可以得到下面的式子

\Delta w=\alpha (v_{\pi}(s)-\hat{v}(s,w)) \nabla_w \hat{v}(s,w)

剩下的只要我们求出 v_\pi ,就可以求解这个式子了,如何求解,后面的部分会说,先把这个问题放着。

Feature Vectors

特征向量,是对当前环境所属的状态的抽象,特征向量提取自agent当前的状态State,得到当前状态中有用的信息,根据这些有用的信息,作为我们的特征值进行梯度下降,效果会更好一些。简单地说,他就是某个状态的summarize,我们可以公式化表示为

\begin{equation} X(S)=\begin{pmatrix} x_1(S)\\ x_2(S)\\ ...\\ x_n(S)\\ \end{pmatrix} \\ \end{equation}

Special Case: Linear Value Function Approximation

线性模型就是认为,value function来自 X(S) 线性组合: \hat{v}(S,w)=X(S)^{T} w = \sum_{j=1}^n x_j(S)w_j

他对于w的偏导项就是: \nabla_w \hat{v}(S,w) = X(S)

带入前面的随机梯度下降公式,得到结果便是: \Delta w = \alpha(v_{\pi}(S)-\hat{v}(S,w))X(S)

Incremental Prediction Algorithms: use MC or TD instead of v_\pi

到目前为止,有一个非常严重的问题,就是 v_\pi 是不可能提前得到的(我们不知道一个状态的准确value是多少)。所以实际上,到目前为止,我们做的还是一个类似监督学习的过程,现在,我们利用前面所讲到的TD和MC算法,将这个过程变成强化学习的过程。实际上很简单,我们使用 G_t 或者 R_{t+1} + \gamma \hat{v}(S_{t+1},w) 代替原来的确切的 v_\pi 就行了。

MC,TD(0) and TD(\lambda)

  • 对于MC算法,我们得到的是G_t,所以其对应的更新公式是: \Delta w = \alpha (G_t-\hat{v}(S_{t},w))\nabla_w \hat{v}(S_{t},w)
    • 我们将算法和监督学习联系,实际上,我们是将一对对的状态和从环境得到的反馈数据作为训练数据来进行监督学习训练的: (S_1,G_1),...(S_t,G_t) (对比SL的概念:G就是标签,S就是特征。)。这个样本是没有偏差,但是方差很比较大(累计效应)
  • 对于TD(0)算法,对应的更新公式为: \Delta w = \alpha (R_{t+1} + \gamma \hat{v}(S_{t+1},w)-\hat{v}(S_t,w))\nabla_w \hat{v}(S_t,w)
    • 同样的,我们把下面这个作为一对对数据来进行监督训练的: (S1,R2+\gamma \hat{v}(S2,w)),(S2,R3+\gamma \hat{v}(S3,w)),..,(S_{T-1},R_T)
    • 值得注意的事情是:
      • 这个过程,我们仍然是在线更新的,也就是说,每走一步,我就要更新一次
      • 直观理解, R_{t+1} + \gamma \hat{v}(S_{t+1},w)\hat{v}(S_t,w) 是存在时间差的, 前者是这一轮我们走到S_t 时得到的评估值。而后者是上一轮我们走到S_t的评估值。我们希望这两个值尽可能相近,当他相近的时候,我们的权重就更新完毕了
  • 对于TD( \lambda ),对应公式为: \Delta w = \alpha (G_t^{\lambda}-\hat{v}(S_t,w))\nabla_w \hat{v}(S_t,w)
  • 对于backward-view 的 TD( \lambda ),其公式表示为:

\begin{align} &\delta_t = R_{t+1} +\gamma \hat{v}(S_{t+1},w) - \hat{v}(S_t,w)\\ &E_t = \gamma E_{t-1}+\nabla_w \hat{v}(S_t,w)\\ & \Delta w =\alpha \delta_t E_t \end{align}

    • 其中,E是一个维度和w的个数相同的向量,代表每一个参数w应该有的eligibility traces。 实际上,我们之前没有使用函数拟合的方法时,其推导公式是: E_t(S_t) = \gamma E_{t-1}(S_t) + 1(S_t=s)
      • 他的效果是使用函数近似的特例,我们可以想象:一种状态占据独立一个维度的w,w的值就是让映射结果等于value,eg: f(S_t)=w=v(s_t) ,所以求导后恒为1 [在后面我会具体举例子说明]
      • 注意,backward-view 和forward-view 是等价的

Compare with Three Algorithms

首先,我们明确MC,TD(0),TD( \lambda )算法,以及梯度下降法的一些特点:

  • 首先,对于梯度下降法而言,通过迭代,他能够得到的是某一个损失函数的局部最优解.
  • MC算法和TD算法的一大不同在于,MC算法的到的样本的结果是没有偏差的返回值(是某个state 从头走到尾的真实的return),而TD算法是有偏差的,他的返回值是经过估计的。
  • 对于线性模型也就是: \hat{v}(S,w)=X(S)^{T} w = \sum_{j=1}^n x_j(S)w_j 而言,其局部最优解也就是全局最优解,当然你得考虑到线性模型表达能力不一定那么好
  • TD(0)是TD( \lambda )的特例

由上面,我们可以得出结论:

  • MC算法一定能够得到局部最优解,在线性模型的MC算法中,一定能够得到全局最优解
  • TD不管在什么模型中,由于其样本本身就存在估计的偏差,所以不能得到局部最优解

但是,对于使用梯度下降的TD( \lambda )算法中,应用于线性模型,虽然不能直接得到最优解,但是他被证明,只要满足其为Robbins-Monro序列,具体定义见本文(免模型预测.Monte-Carlo Learning.增量更新value function 章节),就能有如下的近似收敛结果:MSE(\theta_{\infty}) \le \frac{1-\gamma \lambda}{1-\gamma} MSE(\theta^{*}).

可以看到,当 \lambda=1 时,其能够收敛到MSE(Mean Squared Error),而此时,其对应的也就是MC算法了。这整套体系是相通的。这个结论,只能被适用于discounted continuing task 和 episodes tasks。并且,他对于features,reward等还有其他的技术条件要求,具体请看这篇论文:(Tsitsiklis and Van Roy, 1997a)。

Summary

目前,我们通过梯度下降,已经完成了使用approximation方法的value function预测过程,我们的Main Idea是:

  • 首先,得到能够代表当前policy的决策的经验数据,
  • 根据这些经验数据,我们调用我们的拟合器调整我们目前现有的value function,
  • 通过梯度下降法,使得这个value function 能够越来越适应当前经验数据分布。
  • 经过梯度下降得到的新的模型,便是我们对于当前经验数据所对应的policy的估计

Incremental Control Algorithms

Intuition

整个Evaluation 和improvement 的过程其实和之前的基本一样:

  • 我们首先初始化模型的参数w,并且用他作为的q_w 初始估计值,用他来做贪心策略,这个贪心策略就是我们下一轮要估计value的策略;
  • 使用该策略进行explore,我们就可以得到一个基于当前的 q_w\epsilon -policy(策略的经验数据;
  • 得到这些经验数据后,我们把他再次带入模型中,可能是一个线性拟合器,也可能是一个神经网络模型,总之,我们进行下一次拟合,得到该策略的估计值,以此估计值为基础再次进行贪心选择,作为我们下一次经验数据产生的策略。
  • 循环上述过程,我们最终就能得到近似最优的 q_w

需要强调的是:

在这个过程中,我们不希望每次得到大量的经验数据之后,才进行样本的训练,因为我们不需要一次性得到拟合得非常准确的当前策略的准确的评估: q_\pi 。只需要我们的 q_w 有了一定程度的改变,我们就能用他进一步产生新的样本,用最新鲜的数据进行迭代。

Action-Value Function Approximation

接下来,我们使用action-value function 来重新表述整个流程,其实这个流程和上面所说大同小异,我就不做赘述:

如何进行Action-Value 的Approximation:

Special case: 使用线性逼近器来作为估计模型:

NOTE: 在前面的policy evaluation 的过程中,我们使用的是TD error 进行直接的更新,他的表达形式和现在这个形式差不多,但是他们的来源是完全不一样的,这里的更新值来自损失函数的偏导.

如何替代 q_\pi(S,A)

这里要特别提及一点,就是为什么backward-view 的方法, E_t=\gamma \lambda E_{t-1} + \nabla_w \hat{q}(S_t,A_t,w) ,我们之前在 look-up table 的时候,用的是 E_t =\gamma \lambda E_{t-1} +1(S_t = s) ,实际上,look-up table 正好是 approximate 方法的特例,下面说明:

look-up table 的本质就是 每一个 S ,都对应一个 q value 的值,所以我们可以想象 q(s,a,w) 是一个分段函数,函数值就是权重w:

\begin{equation} q(s,a,w) = \begin{cases} w_1, s=[0,0,...0] \quad and \quad a=0,\\ w_2, s=[0,0,...0] \quad and \quad a=1,\\ ...\\ w_i, s=[0,0,...1] \quad and \quad a=0,\\ ...\\ w_n, s=[1,1,...1] \quad and \quad a=1,\\ \end{cases} \end{equation}

所以,求完梯度,便是 E_t =\gamma \lambda E_{t-1} +1(S_t = s, A_t = a)


Batch Methods

批处理方法和Incremental Methods 最大的区别在于,他的每一个数据不是只利用一次,而是反复的利用用一批数据进行更新,得到更高的数据信息获取。

From Incremental to Batch

最重要的一个问题就是他对数据的利用率低,在Incremental Prediction中,我们每得到一个经验数据,就以此为基础,只进行一次梯度更新,更新结束后,这个经验数据就不再使用了。我们并没有去做寻找这些经验数据所代表的统一的分布规律,所以直观看,我们并没有特别好的利用这些数据所能够提供的信息。

在Batch方法中,我们希望能够找到可以拟合某一批数据的拟合函数,以此来提高数据的利用率。

Experience Replay

经验回放方法所做的事情,就是有一个buffer,用来存储一些经验数据,每一次要开始更新的时候,从这个经验数据中抽调一些样本,进行更新,一直更新到我们的loss function 达到最小之后,停止更新,下面我们具体描述这个过程:

假设,我们需要做到拟合的是: \hat{v}(s,w) \approx v_{\pi}(s)

  • 我们使用Experience Replay Buffer,存储一定数量的样本数据,这是一个<state,value>的pairs: D=\{<s_1,v_1>,<s_2,v_2>,...,<s_T,v_T>\}
  • 使用最小均方误差作为损失函数,用于拟合当前的Experience Replay Buffer 里面的整个数据集的数据分布: LS(w)=\sum_{t=1}^{T}(v_t^{\pi}-\hat{v}(s_t,w))^2
  • 我们通过随机梯度下降法进行参数的更新,具体而言,重复以下步骤:
    • 从buffer中采样:sampling <s, v> from D
    • 进行参数更新: \Delta w = \alpha (v_{\pi}-\hat{v}(s,w))\nabla_w \hat{v}(s,w)

编者注: 实际使用replay buffer的时候,我们直接存储的一般是类似 (s_t, a_t,  r_t, s_{t+1}) 这样的结构(根据实际算法需求会由调整) 。 (在有拟合的值函数的时候),一般不直接存储value,value是通过state-action 或者state间接得到的。比如通过一个state-action pair我们可以得到 Q(s,a) 作为其value,通过state 可以得到 V(s) 作为其value

说了这么多,其实你也能发现,这只是在原来的Incremental Method中做了一点改进,我们保留了一个数据集,在训练的过程中,让拟合函数能够拟合这一整个数据集,而不是每拿到一个数据,迭代一次,然后扔掉,通过不断的获取数据,来直接得到正确的分布。虽然改进很少,但是我们可以直观的看到,利用这个buffer,我们可以大大减少训练所需的数据量!

Deep Q-Networks(DQN)

来自《Playing Atari with deep reinforcement learning》

DQN使用的Experience Replay 结合Q-Learning Approximation 进行端对端的强化学习,我们来分析一下这个过程:

初始化过后,对于每一次迭代,

  • 我们使用 \epsilon -policy 进行Explore ,获取训练数据: s_{t+1}=s_t,a_t,x_{t+1}
  • 并且,根据state信息,形成其对应的特征向量 \phi_{t+1}=\phi(s_{t+1})
  • 将这些经验数据存入buffer
  • 从buffer中随机获取minibatch 来进行训练
  • 使用Q-learning的Q更新策略,我们使用上一次训练完成的Q value function的模型,得到每一个样本的预估value,以此为true value y_j ,带入梯度下降法,进行迭代更新

Advantage of Experience Replay

结合DQN,我们可以发现,ER有以下的优点(比起之前的Incremental Learning)

  • 更高的数据利用率;
  • 监督学习是基于极大思然估计的,要求sample必须i.i.d,ER buffer采样避免了连续采样数据的连续性;
  • 直接使用online Learning 前面的数据会决定后面的数据,将导致训练容易陷入循环。

Linear Least Squares

在Batch Method的最后,我们介绍一下,在线性拟合函数中,使用batch method 和 Least Square loss function的时候,我们能够做的进一步优化。

前面的求 LS的函数的最小值的过程,我们需要不断的迭代来得到他的最小值,但我们知道,求最小值除了迭代的方法,还有直接解方程的方法可以做到最小值的直接求解,对于线性逼近器而言,这个方法更加的有效,具体如下:

首先,我们需要做到的是:E_{D}[\Delta w]=0

也就是: \alpha \sum_{t=1}^{T} x(s_t)(v_{\pi}-x(s_t)^{T}w)=0

进行一下方程组的求解:

\begin{align} &\sum_{t=1}^{T} x(s_t)v_{\pi}=\sum_{t=1}^{T}x(s_t)x(s_t)^Tw\\ \Rightarrow&w=(\sum_{t=1}^{T}x(s_t)x(s_t)^{T})^{-1}\sum_{t=1}^Tx(s_t)v_{\pi} \end{align}

  • 这实际上就是最小二乘法的数值求解过程,对于N个特征而言,其求解时间复杂度为O(N^3)
  • 在增量方案中,我们使用Shermann-Morrison 可以使得时间复杂度降到O(N^2)

有了这个w的表达式,接下来的过程如法炮制,我们把对应的v_\pi 值带入,就能得到对应的几种算法的表达式,不赘述,直接上图:


编辑于 2019-01-12

文章被以下专栏收录