之前我们分享了使用神经网络进行值函数逼近的计算框架以及基于梯度下降的优化方法。这次,我将值函数逼近的内容统一整理一下,并补充了线性方法和基于逼近函数的控制策略。
建模
在梯度下降中,参数向量是一个有固定长度的实数向量,\mathbf{w} = (w_1,w_2,\cdots,w_n)^T
,而近似值函数则是一个关于 \mathbf{w}
的平滑可微函数 \hat{v}(s,\mathbf{w}),\forall s \in \mathcal{S}
。因为我们会在每个离散的时间步 t = 1,2,3,\cdots
之后更新 \mathbf{w}
,因此我们使用 \mathbf{w}_t
来表示不同阶段的模型参数。假设在每个时间步,我们从环境中观测到一个新的样本 S_t\rightarrow v_\pi(S_t)
,其中 S_t
是某个状态表示,而 v_\pi(S_t)
是该状态在当前策略下的真实值函数。
当然,我们从环境中观测到的很有可能是一组连续的状态,但是我们并不做这样的假设,因为这样做尽管可以保证得到精确的值函数值,但是得到的训练样本所表征的状态空间会受限。于是,我们使用一种类似于随机采样的方法从很多备份的交互中获取某个状态的值函数。因此用于训练的样本的状态集应该服从某种共同的分布 d
。
从根本上来讲,这个问题并不能避免,因此我们应该让我们的模型能够从有限的样本中学习到更多的知识,这也是使用值函数逼近方法的意义之一。
梯度下降
前面我们已经定义了优化的目标是最小化RMSE,梯度下降法是通过每次更新时将参数向量朝着将误差缩小的方向移动一小步
\begin{aligned}
\mathbf{w}_{t+1} &=\mathbf{w}_{t}-\frac{1}{2} \alpha \nabla\left[v_{\pi}\left(S_{t}\right)-\hat{v}\left(S_{t}, \mathbf{w}_{t}\right)\right]^{2} \\
&=\mathbf{w}_{t}+\alpha\left[v_{\pi}\left(S_{t}\right)-\hat{v}\left(S_{t}, \mathbf{w}_{t}\right)\right] \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right),
\end{aligned}
其中,\alpha
是正的步长参数,\nabla f(\mathbf{w}_t)
是相对于参数 \mathbf{w}
的每一个分量的偏导数向量
\left(\frac{\partial f\left(\mathbf{w}_{t}\right)}{\partial w_{t, 1}}, \frac{\partial f\left(\mathbf{w}_{t}\right)}{\partial w_{t, 2}}, \ldots, \frac{\partial f\left(\mathbf{w}_{t}\right)}{\partial w_{t, n}}\right)^{\top}
负梯度指向的是目标函数下降最快的方向。
我们注意到,对于每个样本我们只朝着减小在该样本误差的方向上移动一小步,而不是直接消除这个样本上的误差,因为这样做会导致模型出现偏斜,对以往的样本会很快地遗忘而导致效果不佳。事实上,步长 \alpha
应该随着时间慢慢变小从而保证梯度下降可以使模型收敛到一个局部最优解。
当然,我们并不能保证在所有情况下都可以得到状态 S_t
的真实值函数,而是一个近似的观测值 V_t,\mathbb{E}[V_t]=v_\pi(S_t)
。这时,我们使用同样的方法,可以得到如下的迭代公式
\begin{aligned}
\mathbf{w}_{t+1} =\mathbf{w}_{t}+\alpha\left[V_t-\hat{v}\left(S_{t}, \mathbf{w}_{t}\right)\right] \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right),
\end{aligned}
同样,只要保证 \alpha
收敛约束条件随着时间逐渐衰减,基于 V_t
的更新也可以保证参数收敛到一个局部最优解。
线性方法
上述的梯度下降法中一种比较特殊的情况是:当逼近函数 \hat{v}
是参数向量 \mathbf{w}
的线性函数。对于每一个状态,都有一个特征向量 \mathrm{x}(s) = (x_1(s),x_2(s),\cdots,x_n(s))^\top
,特征的数量和 \mathbf{w}
的维度是一致的。这个特征可能是用不同方法从状态 s
变换得到的,注意,s
的维度不一定必须和参数向量一致。于是,值函数的逼近公式为
\hat{v}(s,\mathbf{w}) = \mathbf{w}^\top\mathrm{x}(s) = \sum_{i=1}^{n}w_ix_i(s).
使用这种模型逼近值函数的我们称之为线性方法。
很自然地,我们可以使用梯度下降方法对线性逼近函数进行更新,参数 \mathbf{w}
的梯度是
\nabla\hat{v}(s,\mathbf{w}) = \mathrm{x}(s).
梯度的形式就变得极为简洁了。
并且在这种线性的情况下参数的最优解 \mathbf{w}^*
是唯一的。因此,任何可以保证收敛到局部最优解的方法都可以保证全局最优解。
控制策略
先把更新方程扩展到动作值函数,然后分析基于动作值函数的策略优化和动作选择。
扩展到动作值函数事实上非常直观,我们使用 \hat{q}
来逼近 q_\pi
函数,\hat{q}
也是使用一个参数方程来表示的。类比于状态值函数的 S_t\rightarrow V_t
,这里我们需要考虑的是 (S_t,A_t)\rightarrow Q_t
。Q_t
可以是 q_\pi(S_t,A_t)
的任意近似,比如:蒙特卡洛中的 G_t
,或者是一步回报 G_{t+1} + \gamma\hat{q}(S_{t+1},A_{t+1},\mathbf{w}_t)
。
我们使用如下方程实施对参数的更新
\mathbf{w}_{t+1} =\mathbf{w}_{t}+\alpha\left[Q_t-\hat{q}\left(S_{t}, A_t,\mathbf{w}_{t}\right)\right] \nabla \hat{q}\left(S_{t},A_t,\mathbf{w}_{t}\right).
当然,我们也可以构建一个相应的反向视角的更新
\mathbf{w}_{t+1} = \mathbf{w}_{t} + \alpha \delta_t \mathbf{e}_t,
其中,\delta_t
是误差
\delta_t = R_{t+1} + \gamma \hat{q}(S_{t+1},A_{t+1},\mathbf{w}_t) - \hat{q}(S_{t},A_t,\mathbf{w}_t),
\mathbf{e}_t
是 eligibility traces,
\mathbf{e}_t = \gamma\lambda\mathbf{e}_{t-1} + \nabla\hat{q}(S_t,A_t,\mathbf{w}_t).
总结
线性模型是一种比较简单的实现,具有较为理想的最优点,我们也可以将模型实现为神经网络,使用现有的深度学习框架可以得到很好的实现。