深度强化学习基础-策略梯度,演员-评论家算法

531 阅读1分钟

基于策略梯度( policy-based )的算法,与前面介绍的基于价值( value-based )的算法(包括 DQN 等算法)不同,这类算法直接对策略本身进行近似优化。在这种情况下,我们可以将策略描述成一个带有参数θ\theta的连续函数,该函数将某个状态作为输入,输出的不再是某个确定性( deterministic )的离散动作,而是对应的动作概率分布,通常用 𝜋𝜃(𝑎|𝑠) 表示,称作随机性( stochastic )策略。

1.基于价值和基于策略的算法各有什么优缺点?

前者的优点有:简单易用:通常只需要学习一个值函数,往往收敛性也会更好。保守更新:更新策略通常是隐式的,通过更新价值函数来间接地改变策略,这使得学习可能更加稳定。缺点有:受限于离散动作可能存在多个等价最优策略:当存在多个等效的最优策略时,基于价值的方法可能会在它们之间不停地切换。后者的优点有:直接优化策略:由于这些算法直接操作在策略上,所以它们可能更容易找到更好的策略;适用于连续动作空间;更高效的探索:通过调整策略的随机性,基于策略的方法可能会有更高效的探索策略。缺点有:高方差:策略更新可能会带来高方差,这可能导致需要更多的样本来学习。可能会收敛到局部最优:基于策略的方法可能会收敛到策略的局部最优,而不是全局最优,且收敛较缓慢。在实践中,还存在结合了基于价值和基于策略方法的算法,即 Actor-Critic 算法,试图结合两者的优点来克服各自的缺点。选择哪种方法通常取决于具体的应用和其特点。

梯度策略算法

策略梯度算法是一类直接对策略进行优化的算法,但它的优化目标与基于价值的算法是一样的,都是累积的价值期望 𝑉∗(𝑠) 。我们通常用 𝜋𝜃(𝑎|𝑠) 来表示策略,即在状态 𝑠 下采取动作 𝑎 的概率分布 p(as) p(a|s),其中 𝜃 是我们要去求出来的模型参数。

 如图 1 所示,我们知道智能体在与环境交互的过程时,首先环境会产生一个初始状态 𝑠0𝑠_0,然后智能体相应地执行动作 𝑎0𝑎_0 , 然后环境会转移到下一个状态 𝑠1𝑠_1并反馈一个奖励 𝑟1𝑟_1,智能体再根据当前状态 𝑠1𝑠_1 选择动作 𝑎1𝑎_1,以此类推,直到环境转移到终止状态。

image.png

图1 轨迹的形成

 我们将这个过程称为一个回合( episode ),然后把所有的状态和动作按顺序组合起来,记作 𝜏 ,称为轨迹( trajectory ),如式 (1) 所示。

τ={s0,a0,s1,a1,,sT,aT}(1)\tag{1} \tau=\left\{s_{0}, a_{0}, s_{1}, a_{1}, \cdots, s_{T}, a_{T}\right\}

其中 𝑇 表示回合的终止时刻。由于环境初始化是随机的,我们假设产生初始状态 𝑠0𝑠_0 的概率为𝑝(𝑠0)𝑝(𝑠_0) ,那么给定策略函数𝜋𝜃(𝑎𝑠)𝜋_𝜃(𝑎|𝑠) 的情况下,其实是很容易计算出轨迹 𝜏 产生的概率的,用 𝑃𝜃(𝜏) 表示。为了方便读者理解,我们假设有一个很短的轨迹𝜏0=𝑠0,𝑎0,𝑠1𝜏_0=𝑠_0,𝑎_0,𝑠_1 ,即智能体执行一个动作之后就终止本回合了。

3.REINFORCE算法

\qquad 我们知道轨迹是由状态和动作组合而成的序列,实际上一方面环境的初始状态是随机的,另一方面智能体每次采取的动作是随机的,从而导致每条轨迹的长度都可能不一样,这样组合起来的轨迹几乎是无限多条的,这样一来求解目标函数的梯度就变得非常困难了。那么这个时候我们就需要利用蒙特卡洛的方法来近似求解了,即我们可以不必采样所有的轨迹,而是采样一部分且数量足够多的轨迹,然后利用这些轨迹的平均值来近似求解目标函数的梯度。这种方法就是蒙特卡洛策略梯度算法,也称作 REINFORCE\text{REINFORCE} 算法。

\qquad 其实这种方法在前面的章节中也已经使用过了,我们会发现蒙特卡洛方法虽然听起来很高级,但它实际上就是一种“省懒”的方法,即有时候理论上需要去找无限个数据来支撑我们去求解某个数据,但实际上我们可以只找有限个数据来近似求解。在生活中我们也经常用到这个方法,比如我们想要知道当代大学生都有哪些爱好,理论上我们需要去调查所有的大学生,但实际上我们只需要去抽查一部分大学生就可以了,只要抽查的大学生具有足够的代表性,比如覆盖的学历范围足够广泛等等,那么我们就可以认为这部分大学生的爱好代表了所有大学生的爱好了。

\qquad 回到我们的问题,我们现在需要求解的是目标函数的梯度,REINFORCE\text{REINFORCE} 算法的做法是每次采样 NN 条轨迹,然后对这 NN 条轨迹的梯度求平均,即式 (2)\text(2)

Jθ1Nn=1Nt=1TnGtnlogπθ(atnstn)(2)\tag{2} \nabla J_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} G_{t}^{n} \nabla \log \pi_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right)

\qquad 其中 NN 理论上越大越好,但实际上我们可能只采样几个回合的轨迹就能近似求解梯度了。此外,注意这里我们把奖励函数换成了带有折扣因子的回报 Gtn=k=tTnγktrknG_{t}^{n}=\sum_{k=t}^{T_{n}} \gamma^{k-t} r_{k}^{n},其中 TnT_n 表示第 nn 条轨迹的长度,γ\gamma 表示折扣因子,rknr_{k}^{n} 表示第 nn 条轨迹在第 kk 步的奖励。尽管回报计算起来麻烦,但可以结合前面章节讲到的贝尔曼公式将当前时刻和下一时刻的回报联系起来,从而在一定程度上简化计算,即式 (3)\text(3)

Gt=k=t+1Tγkt1rk=rt+1+γGt+1(3)\tag{3} \begin{aligned} G_{t} &=\sum_{k=t+1}^{T} \gamma^{k-t-1} r_{k} \\ &=r_{t+1}+\gamma G_{t+1} \end{aligned}

4. Actor-Critic 算法

\qquad 在策略梯度章节中,我们其实已经对 Actor-Critic\text{Actor-Critic} 算法的目标函数进行过推导了,这里就不详细展开,只是简单回顾一下目标函数,如式 (4)\text(4) 所示。

tag4θJ(θ)Eπθ[Qπ(s,a)θlogπθ(as)]tag{4} \begin{aligned} \nabla_\theta J(\theta) \propto \mathbb{E}_{\pi_{\theta}}\left[Q^\pi(s, a) \nabla_\theta \log \pi_\theta(a \mid s)\right] \end{aligned}

\qquadREINFORCE\text{REINFORCE} 算法中,我们使用蒙特卡洛估计来表示当前状态-动作对 (st,at)(s_t,a_t) 的价值。而这里其实可以类比于 QQ 函数,用 Qπ(st,at)Q^\pi(s_t, a_t) 来估计当前的价值,注意这里的输入是状态和动作,而不单单是状态,输出的是单个值,也可以用 Qϕ(st,at)Q_{\phi}(s_t, a_t) 表示,其中 ϕ\phi 表示 Critic\text{Critic} 网络的参数。这样我们就可以将目标函数写成如式 (5)\text(5) 所示的形式。

tag5θJ(θ)Eπθ[Qϕ(st,at)θlogπθ(atst)]tag{5} \begin{aligned} \nabla_\theta J(\theta) \propto \mathbb{E}_{\pi_{\theta}}\left[Q_{\phi}(s_t, a_t) \nabla_\theta \log \pi_\theta(a_t \mid s_t)\right] \end{aligned}

\qquad 这样的算法通常称之为 Q Actor-Critic\text{Q Actor-Critic} 算法,这也是最简单的 Actor-Critic\text{Actor-Critic} 算法,现在我们一般都不用这个算法了,但是这个算法的思想是很重要的,因为后面的算法都是在这个算法的基础上进行改进的。

\qquad 如图 2\text{2} 所示,我们通常将 Actor\text{Actor}Critic\text{Critic} 分别用两个模块来表示,即图中的 策略函数( Policy\text{Policy} )和价值函数( Value Function\text{Value Function} )。Actor\text{Actor} 与环境交互采样,然后将采样的轨迹输入 Critic\text{Critic} 网络,Critic\text{Critic} 网络估计出当前状态-动作对的价值,然后再将这个价值作为 Actor\text{Actor} 网络的梯度更新的依据,这也是所有 Actor-Critic\text{Actor-Critic} 算法的基本通用架构。

image.png

图 2 Actor-Critic 算法架构

引用参考

[1] datawhalechina.github.io/joyrl-book/…

[2] datawhalechina.github.io/easy-rl/#/

[3] speech.ee.ntu.edu.tw/~tlkagk/cou…