强化学习的数学原理-09策略梯度

Basic idea of policy gradient

截至目前,所有的策略policy都是用表格表示的,如下图所示,每个状态对应一行动作。

1731378261773.png

现在由于策略梯度的方法是直接建立一个关于策略的函数,于是就要改变策略的形式。

现在需要引入一个参数\(\theta\),那么策略表示为一个关于参数的函数。

\[\pi(a \mid s,\theta), \quad where \; \theta \in \mathbb{R}^{m} \; is \; a \; parameter \; vector \]

  • 目前这个策略函数最广泛的形式就是神经网络,神经网络的输入是\(state \;\)输出是采用每个动作的概率,参数是\(\theta\)7c4cecf8b9f8bc241fd49cbc6164fa5.jpg
  • 引入函数的优点和之前的\(value \; function \; approximation\)是类似的,一方面是存储上\(function\)能在\(state \; space 、action \;space\)很大的时候节省很多空间,另一方面就是泛化能力会得到提升,主要是在\(storage和generalization\)两方面有较大的优点。

表格形式和函数形式上对于策略的几点区别

  1. 定义最优策略:表格形式最优策略定义是最优策略下的\(state \; value\)大于其他所有策略的,而函数形式下的最优策略引入了一个\(scalar \; metrics\)来衡量什么是最优策略
  2. 获取在s状态下,采取action的概率:表格形式直接查表即可,而函数形式需要通过神经网络进行一次推理得到。
  3. 改变策略:表格形式直接索引然后改变,函数形式通过改变参数\(\theta\)来改变策略

下面就看一下\(policy \; gradient\)最基本的思想

  1. 首先需要一个\(metrics\)或者\(objective \; function\)去定义最优策略\(J(\theta)\)
  2. 有了目标函数之后就可用梯度的算法做优化,去寻找最优策略\(\theta_{t+1}=\theta_{t}+\alpha \nabla_{\theta}J(\theta_t)\)

这就是策略梯度的思想,这个想法是很简单的,但是这其中会存在一些问题。

  1. 怎么选取目标函数
  2. 怎么去计算梯度?

Metrics to define optimal policies

主要有两大类\(metrics\)

average value

第一种:\(average \; state \; value\)或者被叫做\(average \; value\),于是就可以定义\(metrics\)

\[\bar{v_{\pi}}=\sum_{s \in S}d(s)v_{\pi}(s) \]

\(\bar{v_{\pi}}\)是策略的函数,不同策略对应的值不同,所以就可以去优化,找到一个最优的策略让这个值达到最大。

  • \(\bar{v_{\pi}}\)实际上是一个\(state \; value\)的加权平均
  • \(d(s) \ge 0\)是每个状态的权重
  • 因为\(\sum_{s \in S}d(s)=1\),我们可以把\(d(s)\)描述为概率分布。那么刚才的\(metrics\)就可以写成这个形式\(\bar{v_{\pi}}=\mathbb{E}[v_{\pi}(S)],S\)表示随机变量\(S \sim d\)

上面相乘再相加的形式可以写成一种更简洁的形式就是两个向量的内积

\[\bar{v_{\pi}}=\sum_{s \in S}d(s)v_{\pi}(s)=d^Tv_{\pi} \]

\(v_{\pi}=[...,v_{\pi}(s),...]^T\in \mathbb{R}^{\mathbb{S}}\)

\(d=[...,d(s),...]^T\in \mathbb{R}^{\mathbb{S}}\)


上面就结束了第一种\(metric\)总体思想,但是还有问题没有解决就是如何选择\(d\)

\(d\)的选择也有两种情况,一种是\(d\)是独立于\(\pi\)的,另一种就是依赖于\(\pi\)

第一种情况是简单的.

\[\bar{v_{\pi}}=\sum_{s \in S}d(s)v_{\pi}(s)=d^Tv_{\pi} \]

\[\nabla \bar{v_{\pi}} = d^T \nabla v_{\pi} \]

只需要对后面的\(v_{\pi}\)求梯度,为了表明\(d\)\(\pi\)没有关系就把\(d\)写成\(d_0\),\(\bar{v_{\pi}}\)就写成\(\bar{v_{\pi}^0}\)

\(d\)\(\pi\)没有关系那么如何选择\(d\)呢?

  • 最简单的就是把所有的状态认为是\(equally \; important\),所以\(d_0(s)=\frac{1}{|S|}\)
  • 如何我们关注某些特殊的状态,就可以给某些状态较大的\(d\)

第二种情况就是和策略有关系

一种选择\(d\)的方式是选择在\(\pi\)策略下的\(stationary \; distribution\)

然后这个概率可以直接计算出来

\[d^T_{\pi}P_{\pi}=d^T_{\pi} \]

\(P_{\pi}\)是状态转移概率矩阵


average reward

第二种就是\(average \; one-step \; reward\)

\[\bar{v_{\pi}}=\sum_{s \in S}d(s)r_{\pi}(s)=\mathbb{E}[r_{\pi}(S)] \]

\(where \; S \sim d_{\pi}\)

\[r_{\pi}(s)=\sum_{a \in A}\pi(s|a)r(s,a) \]

\[r(s,a)=\mathbb{E}[R|s,a]=\sum_r rp(r|s,a) \]

1731385397757.png

这部分还有一点数学形式待完善...

Gradient of the metrics

计算梯度是\(policy \; gradient \; methods\)最麻烦的部分

首先这里有很多不同的\(metrics(objective \; function) \; \bar{v_{\pi}}、\bar{r_{\pi}}、\bar{v^0_{\pi}}\)

还需要区分\(discounted \; case\)\(undiscounted \; case\)

这里只给出一个总结的情况

\[\nabla_{\theta}J(\theta) = \sum_{s \in S} \eta(s) \sum_{a \in A}\nabla_{\theta}\pi(a|s,\theta)q(s,a) \]

1731395302500.png

1731395385877.png


\[\begin{align}\nabla_{\theta}J(\theta) &= \sum_{s \in S} \eta(s) \sum_{a \in A}\nabla_{\theta}\pi(a|s,\theta)q(s,a) \\ &= \mathbb{E}[\nabla_{\theta} \ln\pi(A|S,\theta)q_{\pi}(S,A)] \end{align} \]

\(where \; S \sim \eta \; and \; A \sim \pi(A|S,\theta)\)

上面这个式子是有用的,因为有期望,所以可以通过采样的方式去近似。这个就是\(stochastic \; gradient \; descent\)的思路。

如何得到上面的等式呢?

\[\nabla_{\theta}\ln \pi(a|s,\theta) = \frac{\nabla_{\theta }\pi(a|s,\theta)}{\pi(a|s,\theta)} \]

上面这个式子实际就是复合函数求导的链式法则

然后把等式右边的分母乘到左边去

\[{\pi(a|s,\theta)}\nabla_{\theta}\ln \pi(a|s,\theta) = {\nabla_{\theta }\pi(a|s,\theta)} \]

把这个式子带入到

\[\begin{align}\nabla_{\theta}J&=\sum_sd(s)\sum_a\nabla_{\theta}\pi(a|s,\theta)q_{\pi}(s,a)\\ &=\sum_sd(s)\sum_a\pi(a|s,\theta) \nabla_{\theta}\ln\pi(a|s,\theta)q_{\pi}(s,a) \\ &=\mathbb{E}_{S \sim d}[\sum_a\pi(a|S,\theta) \nabla_{\theta}\ln\pi(a|S,\theta)q_{\pi}(S,a)] \\ &= \mathbb{E}_{s \sim d, A \sim\pi} [\nabla_{\theta} \ln\pi(A|S,\theta)q_{\pi}(S,A)] \\ &= \mathbb{E} [\nabla_{\theta} \ln\pi(A|S,\theta)q_{\pi}(S,A)]\end{align} \]

分析一下上面的一些点

因为需要计算\(\ln\pi(a|s,\theta)\),所以必须确保对于所有\(s,a,\theta\)

\[\pi(a|s,\theta) \mathbb{>} 0 \]

但是之前我们的\(gready \; policy\)和其他的\(demestic \; policy\)出现过\(\pi(a|s,\theta) \mathbb{=} 0\)的一些情况如何去避免的,这里可以使用\(softmax\)这个\(function\)去解决。

\(softmax \; function\)这个函数主要做的内容就是去归一化去把一个\((-\infty, +\infty)\)映射到\((0,1)\)

1731397121259.png

因为\(\pi(a|s,\theta) \mathbb{>} 0\)所以这个策略是\(stochastic\)\(exploratory\)

Gradient-ascent algorithm(REINFORCE)

\[\begin{align*} \theta_{t+1}&=\theta_t + \alpha \nabla_{\theta} J(\theta)\\ &= \theta_t + \alpha \mathbb{E}[\nabla_{\theta} \ln \pi(A|S, \theta_t)q_{\pi}(S,A)]\end{align*} \]

这个公式是没有办法应用的,因为公式中有期望,所以需要通过随机的梯度来代替真实梯度。

\[\begin{align*} \theta_{t+1}&=\theta_t+\alpha \nabla_{\theta} \ln\pi(a_t|s_t,\theta_t)q_{\pi}(s_t,a_t) \end{align*} \]

但是上面的式子仍然是无法应用的,因为上面的式子里面涉及了\(q_{\pi}(s_t,a_t)\)是真实的\(action \; value\)

为了解决上面的问题,这里是对这个\(q\)进行采样,用\(q_t(s_t,a_t)\)来代替

关于怎么采样于是又有两种方法。

  • 一种是\(Monte-Carlo \; based\),被称为\(REINFORCE\)
  • 还有就是其他算法,比如\(TD\),这就和后面\(Actor-Critic\)有关了

上面就是梯度上升算法,下面是一些关于其中细节的实操

\[\mathbb{E}_{S \sim d, A \sim \pi}[\nabla_{\theta} \ln \pi(A|S, \theta_t)q_{\pi}(S,A)] \rightarrow \nabla_{\theta} \ln\pi(a|s,\theta_t)q_{\pi}(s,a) \]

如何\(sample \; S\)

  • \(S \sim d\)\(d\)在按策略\(\pi\)下长期运行后得到的一个稳定的状态

如何\(sample \; A\)

  • \(A \sim \pi(A|S,\theta)\)因此\(a_t \; should \; be \; sampled \; following \; \pi(\theta_t) \; at \; s_t\)
  • 所以\(PG\)\(on-policy\)

如何从另一个角度去理解这个算法

因为

\[\nabla_{\theta}\ln\pi(a_t|s_t,\theta_t)=\frac{\nabla_{\theta}\pi(a_t|s_t,\theta_{t})}{\pi(a_t|s_t,\theta_{t})} \]

因此上面的梯度上升算法可以重写为

\[\begin{align} \theta_{t+1} &= \theta_t + \alpha \nabla_{\theta}\ln_{\pi}(a_t|s_t,\theta_t)q_t(s_t,a_t) \\ &= \theta_t + \alpha (\frac{q_t(s_t, a_t)}{\pi(a_t|s_t,\theta_t)}) \nabla_{\theta}\pi(a_t|s_t,\theta_t)\end{align} \]

然后可以把$ \beta_t = (\frac{q_t(s_t, a_t)}{\pi(a_t|s_t,\theta_t)}) $

于是上面的式子就可以化为

\[\theta_{t+1} = \theta_t + \alpha \beta_t \nabla_{\theta} \pi(a_t|s_t,\theta_t) \]

上面这个式子是在优化\(\pi(a_t,s_t)\)的值通过改变\(\theta\)

1731393875552.png


\[\begin{align} \theta_{t+1} &= \theta_t + \alpha \nabla_{\theta}\ln_{\pi}(a_t|s_t,\theta_t)q_{\pi}(s_t,a_t) \\ \end{align} \]

\(q\)通过采样的方法去替代真实的值

\[\begin{align} \theta_{t+1} &= \theta_t + \alpha \nabla_{\theta}\ln_{\pi}(a_t|s_t,\theta_t)q_t(s_t,a_t) \\ \end{align} \]

如何\(q_{\pi}(s_t,a_t)\)是通过蒙特卡洛方法得到的就把这个算法叫做\(REINFORCE\)


\(REINFORCE\)的伪代码

16c38323294a8f5d10168501dcbf466.png

posted @ 2024-11-12 15:55  cxy8  阅读(8)  评论(0编辑  收藏  举报