《强化学习》学习笔记3——策略学习

目标函数

        策略学习的目的是获得一个尽可能优的策略函数,使得的这个策略函数在能够取得尽可能大的未来累计回报。我们需要构建一个模型去描述这个策略函数,在训练模型的过程中,需要有一个评价函数来量化评价策略函数的好坏,同时评价结果的反馈可以用于策略函数模型的参数修正。

策略函数

我们可以用\pi(a|s;\theta)模型来近似策略函数\pi(a|s), 其中\theta为模型参数。

状态价值函数

V_{\pi}(s_{t})=E_{A}[Q_{\pi}(s_{t},A)]

其中Q_{\pi}在上篇笔记中有介绍,Q_{\pi}(s_{t},a_{t})表示在当前策略函数\pi下能够获得的未来累计回报的期望。

状态价值用于评价在当前策略函数和当前状态下,能够获得的未来累计回报的期望,为什么是期望?因为这里策略的函数\pi是一个概率分布函数。这样的话,因为当前状态是可以确定的,策略函数越优化,状态价值函数就会越大。所以模型的学习目标可以转化为:求一个尽可能大的V_{\pi}

用神经网络近似状态价值函数

V(s;\theta)=E_{A}[Q_{\pi}(s,A)] = \int _{A} \pi(a|s;\theta) \cdot Q_{\pi}(s,a)

其中\theta是网络参数。

V(s;\theta)和当前状态s有关,s的值是具有随机性的,所以我们可以对V(s;\theta)关于S求期望,得到:

J(\theta)=E_{S}[V(S;\theta)]

我们期望J(\theta)的值最大,所以策略网络的目标就是\max_{\theta}(J(\theta))

策略梯度算法

        有了策略网络的目标函数,我们就需要对网络进行训练,以期获得一个表现较佳的模型。训练神经网络一般都是采用梯度下降算法,因为一般神经网络的优化目标都是一个凹函数,而这里恰恰相反,这里的目标函数J(\theta)是一个凸函数,我们期望获得尽可能大的目标值。所以这里采用梯度上升算法:

\theta\leftarrow \theta+\beta\cdot \frac{\partial V(s;\theta)}{\partial \theta}

这里有两个问题:

(1)为什么是加上梯度?

        这个和梯度的定义有关,梯度代表的是函数值增加的方向,所以梯度下降的时候,加的是梯度的负值,即梯度的反方向;梯度上升的时候,为了使得目标值变大,所以取的是梯度的正方向,所以加上梯度。

(2)为什么不是对前面提到的目标函数J(\theta)求导 ?

        我的理解是,因为在真实环境中随机变量S的分布也可能是未知的,需要网络从数据中去学习,所以V(S;\theta)关于S求积分可能是不具备可操作性。这里对V(s;\theta)求导,因为s是一个观测值,在经过尽可能多次观测之后,最终多次梯度的累计也会近似于期望的梯度。 

梯度公式推导

        因为状态价值函数的定义如下:

V(s;\theta)= \int _{A} \pi(a|s;\theta) \cdot Q_{\pi}(s,a)

这里做了一个近似假设,假设Q_{\pi}\theta无关,同时由于a和\theta无关,可以先求导再做积分,则有:

\begin{align} \frac{\partial V(s;\theta)}{\partial \theta}&=\int_{a} \frac{\partial \pi(a|s;\theta)}{\partial \theta} \cdot Q_{\pi}(s, a) \\ &=\int_{a} \pi(a|s;\theta) \cdot \frac{1}{\pi(a|s;\theta)} \cdot \frac{\partial \pi(a|s;\theta)}{\partial \theta} \cdot Q_{\pi}(s, a)\\ &=\int_{a} \pi(a|s;\theta)\cdot\frac{\partial log(\pi(a|s;\theta))}{\partial \theta} \cdot Q_{\pi}(s, a) \\ &=E_{A}[\frac{\partial log(\pi(a|s;\theta))}{\partial \theta} \cdot Q_{\pi}(s, a)] \end{align}

实际上根据定义这里Q_{\pi}\pi有关,而\pi是关于\theta的函数,所以上面的推导在数学上并不严谨。为什么能做这样的近似假设呢?因为在实际网络模式构建的时候,\piQ_{\pi}可以是两个不同的网络,即两套不同的参数,所以在这情况下假设Q_{\pi}\theta无关是没问题的,这里是对问题进行的一个简化。

策略梯度的计算

(1)离散的动作

        当动作是离散的时候,我们就可以把所有动作穷举所有的动作,每一个动作具有一个梯度,将所有动作的梯度累加起来。

\frac{\partial V(s;\theta)}{\partial \theta}=\sum_{a} [\frac{\partial \pi(a|s;\theta)}{\partial \theta} \cdot Q_{\pi}(s, a)]

(2) 动作是一个连续量

        当动作是一个连续量,我们就无法穷举出所有的动作了。这时候就需要关于动作做积分。这时就需要用到上面公式推导中第(4)个公式了。

\frac{\partial V(s;\theta)}{\partial \theta}=E_{A}[\frac{\partial log(\pi(a|s;\theta))}{\partial \theta} \cdot Q_{\pi}(s, a)]

需要求得梯度值,需要关于A求期望,A和\pi有关,但是实际上由于\pi函数很复杂,很难求得一个推导出一个期望的具体公式。所以我们退而求其次,去求解公式的数值解。由于这里涉及到很多随机变量,所以采用蒙特卡洛方法求解数值解。

  1. 根据\pi(\cdot|s,\theta)函数对A进行随机抽样,抽样结果记为\hat{a};
  2. g(\hat{a},\theta)=\frac{\partial log(\hat{a}|s;\theta))}{\partial \theta} \cdot Q_{\pi}(s,\hat{a}), 很明显,E_{A}[g(A,\theta)]=\frac{\partial V(s; \theta)}{\partial \theta},所以g(\hat{a},\theta)\frac{\partial V(s;\theta)}{\partial \theta}的无偏估计,所以计算出g(\hat{a},\theta)的值就得到了策略梯度,这里的梯度是统计近似梯度。

算法步骤

  1. 观测当前状态s_{t};
  2. 根据\pi函数对下一步动作a_{t}做随机抽样;
  3. 计算q_{t} \approx Q_{\pi}(s_{t},a_{t});
  4. a_{t}带入计算当前\frac{\partial log(a_{t}|s;\theta))}{\partial \theta}的值,记为d;
  5. 近似梯度g(a_{t},\theta_{t})=q_{t} \cdot d
  6. 最后用近似梯度去更新神经网络参数:\theta_{t+1}=\theta_{t}+\beta \cdot g(a_{t}, \theta_{t}).

如何计算Q_{\pi}(s_{t},a_{t})

        前面算法步骤中步骤3需要计算Q_{\pi}(s_{t},a_{t}),但是到目前为止我们并不知道这个函数的具体形式。有两种方法可以计算Q_{\pi}(s_{t},a_{t}).

(1)方法1

        因为Q_{\pi}(s_t,a_{t}) = E[U_{t}], 所以我们可以等游戏结束之后,用U_{t}的观测值来代替Q_{\pi}。这种情况下需要游戏结束之后才能对网络参数进行调整。

(2)方法2

        用另外一个神经网络来近似Q_{\pi}, 用Q_{\pi}神经网络的预测值来计算策略网络的梯度。

注意:这里是Q_{\pi}, 而价值学习中的学习目标是Q^{*}

策略学习和价值学习的差异

         个人觉得,价值学习需要动作是可穷举的,而策略学习中动作却可以是一个连续量。其他差异点的话,得等后续再深入理解之后再补充了。

参考

深度强化学习基础:策略学习_哔哩哔哩_bilibili

基于策略和基于价值的强化学习方法有什么区别? - 知乎

梯度算法之梯度上升和梯度下降_搜索与推荐Wiki的博客-CSDN博客_梯度上升

 

 

 

 

你可能感兴趣的:(学习,人工智能,深度学习,机器学习,算法)