深度强化学习总结

0. 引言

最近跟着 OpenAI 的 Spinning Up 教学文档 学习了一遍 Deep RL,对这个领域有了一些更系统的理解。这篇博客文章是该文档的学习笔记,除了摘录了 Spinning Up 中的核心内容,还加入了一些自己的理解,希望能系统地、清晰地呈现各类常用算法的核心关联和区别。

近年来,各种深度强化学习算法层出不全,同一个算法可能有很多变种以及不同的实现细节。这里讨论的算法版本参照 OpenAI Spinning Up 文档。该文档对某些算法做了简化,去掉一些小 tricks,尽量把不同的算法统一到类似的框架中去系统性的对比,揭示它们之间的关联。所以,这里讨论的算法形式上可能与其他参考资料(包括原作者论文)不完全一致,但是核心思想是相同的。

0.1 RL 与 supervised / unsupervised learning 的区别

  • supervised learning: 正确的输出 (label / target) 是给定的,机器的目的是学习从输入到输出的潜在映射关系
  • unsupervised learning:不存在 label,机器的目的是学习输入数据的特征结构,例如最常见的聚类 (clustering) 算法。近年来流行的 GAN (generator 部分)也是一种 unsupervised learning,GAN 中的 generator 要学习的是真实数据的特征,进而依据该特征生成新的数据,尝试骗过 discriminator 。
  • reinforcement learning:介于两者之间,既不是完全给定了正确输出,也不是没有任何的指导。人类(或者更一般化的称呼:环境)只会通过一个 reward 告诉机器做的好或不好,而不是应该怎么做,可能人类也不知道最佳策略。RL 中机器会依照动作收益去探索到底应该怎么做才是最佳策略。

以 Alpha Go 下围棋为例。先从人类棋谱学习,这是 supervised learning,然后再让两个机器对弈,由输赢判断下的好坏,不断修正自己的策略,这是 reinforcement learning 。

一般来说,如果有条件做 supervised learning,还是首选它,因为我们有绝对正确的答案供机器参考,机器只需要按照我们给定的数据去学习输入和输出之间的映射就好了。只有当我们无法提供答案时,才需要借助 reinforcement learning,让机器自己去探索,寻找最佳答案。

0.2 RL 的困难所在

经常被提及的 RL 面对的困难至少有如下两个:

  • reward delay: 动作与收益之前的对应关系可能比较复杂,或者有明显延迟。例如在非常经典的"太空入侵者"游戏中,只有“开火”这个动作会消灭敌人,带来收益,但是“向左移动”或“向右移动”这些动作也是很关键的,尽管不会带来直接收益。在有些时候需要放弃短期收益,来获取更大的长期累计收益。
invader
  • balance between exploration and exploitation:是在现有的比较好的 policy 上继续深挖,还是跳转到全新的 policy 上去碰碰运气。现实生活中也存在类似的权衡:研究人员是进入一个全新的、更有前景的研究领域,还是坚守已有丰硕成果的熟悉的领域。

1. RL 相关的基本概念

强化学习中,agent (智能体)通过不断的试错来探索最佳的行动策略。所谓的“强化”(reinforcement)是指通过奖励(或惩罚) 让 agent 在给定状态下更加倾向于(或避免)做某一动作,这是一种反馈强化的过程。

下图简要描述了 agent 与外界环境之间的互动流程:agent 基于当前环境状态 选择某个动作 施加在外部环境上,环境反馈相应的奖励或惩罚 ,并进入新的状态 ,然后进入下一个互动循环。这里把单次互动的奖励称为 reward,把所有互动累计的奖励称为 return (回报)。agent 在选择动作时,考虑的目标是使 return 最大化。

下面具体讨论与 RL 相关的基本概念,以及相应的符号表示。

1.1 状态与观测(states and observations)

  • 状态 是对环境的完整描述

  • 观测 分为完全观测 fully observed (即知道全部状态信息)和 部分观测 partially observed(只知道部分状态信息)。

严格来讲,agent 只能利用观测到的信息。但在一般情况下,如果没有特别指明“部分状态不可观测”,我们可以不加区分的使用“状态”和“观测”这两个概念。

在 Atari(雅达利)电子游戏中,观测 / 状态可能是一幅 RGB 图片像素矩阵;机器人控制中,观测 / 状态可能是轮子的角度或机械臂的位置。

1.2 动作空间(action spaces)

给定环境中所有可能动作的集合,又分为离散动作空间(如围棋落子)和连续动作空间(如车辆转角控制)。

动作空间的离散或连续影响了 RL 算法的选择。有些算法只能用在特定动作空间中。

1.3 策略(policy)

策略是 agent “在给定状态下决定采用什么动作“的规则。

可以是确定性的,这里用 ​ 表示:

也可以是概率性的,用 ​ 表示:

由于策略是 agent 的“大脑”,我们经常不加区分的使用这两个概念,如“策略 / agent 的目标是最大化收益”。

在 deep RL 中,一般用神经网络学习出某个策略,因此可以说策略是参数化的,这些参数就是神经网络中的权重,通过调节这些参数可以寻找最优策略。

我们这里用 或 ​ 表示参数,因而参数化的策略可以表示为

1.4 路径 / 轨迹(trajectory)

路径 ​ 是状态和动作的序列

也经常被称为 episode.

第一个状态 ​ 可以是从某个分布中随机采样的

一般认为状态之间的转移具有马尔科夫性,即下一时刻的状态 仅与当前状态 和当前动作 相关,与更早的历史信息无关。这种转移可以是确定性的,表示为

也可以是随机的,即在给定状态 ​ 条件下,选择动作 ​ 之后,可能进入不同的状态 ​,其概率分布为

由于随机性的状态转移更具有一般性,涵盖了确定性的状态转移,因此本文后续只考虑这种情况。

1.5 收益(reward)与回报(return)

收益是针对单步的,例如可以表示为

而一整条路径 上的各步收益的累加称为回报 。
可以考虑有限时间内无折损的回报:

也可以考虑无限时间内有折损的回报:

这里的折损一方面符合直观理解,即 cash now is better than cash later,更重要的是满足数学上的要求,保证回报(这里是无穷多个 reward 的累加)是收敛的!

1.6 RL 问题描述

在以上概念的基础上,我们可以定义 RL 问题为:搜索一个策略,使得按照这个策略行动,得到的期望回报最大。这里说的是“期望回报”,因为策略和状态转移的随机性会导致路径的随机性,进而导致回报的随机性,我们需要的是期望回报的最大化。

假设状态转移和策略都具有随机性,那么在给定策略 的条件下出现某条 步路径 的概率为

某个策略 在所有可能路径上的期望回报 表示为

那么 RL 最终的优化问题表示为:寻找最优策略 使得

1.7 值函数(value function)

这里的 value 是给定状态(或者状态+动作)对应的后续期望回报值,也可以认为是对状态(或状态+动作)的评估,主要有 4 种常用形式:

  • On-policy value function :以 状态为起点,依照 策略动作,最后得到的期望回报,即

  • On-policy action-value function :以 状态为起点,选择动作 ,然后在后续状态中再依照 策略动作,最后得到的期望回报,即

  • Optimal value function :以 状态为起点,然后依照最优的策略动作,最后得到的期望回报,即

  • Optimal action-value function :以 状态为起点,选择动作 ,然后再依照最优的策略动作,最后得到的期望回报,即

上述 4 种值函数有如下关系:

和 的重要意义:

待求的最优策略 满足

即依照策略 得到的路径 是期望回报最大的。

又已知

表示的从 状态出发依照策略 得到路径的期望回报。

因此,最优策略 也可以表示为,对于任意状态 均满足

在具体的优化过程中,我们一般还是根据状态 寻找最优的动作 ,因此上式更加实用。

的重要意义体现在 Q-Learning 类型的算法中。已知在状态 固定的条件下,不同的 对应不同的 。当我们用某种方式(Q-Table 或者神经网络)估计出一个比较准确的 时,待求的最优策略指定的动作 就可以表示为

1.8 Bellman 方程(Bellman equation)

Bellman 方程的基本思想是:当前的 value = 当前的 reward + 后续的 value,等号右边的表示方式称为 Bellman backup.

在 RL 中经常需要估计 value function ,而估计的方法就是 value function 要满足 Bellman 方程这一约束。前述 4 种 value function 对应的 Bellman 方程如下:

\begin{align} V^\pi(s) &= \underset{a\sim \pi \\ s'\sim P}{E} [r(s,a) + \gamma V^\pi(s')] \\~\\ Q^\pi(s,a) &= \underset{s'\sim P}{E}[r(s,a) + \gamma \underset{a'\sim \pi}{E}[Q^\pi(s', a')]] \\~\\ V^*(s) &= \max_a \underset{ s'\sim P}{E} [r(s,a) + \gamma V^*(s')] \\~\\ Q^*(s,a) &= \underset{s'\sim P}{E}[r(s,a) + \gamma \max_{a'} Q^*(s', a')] \end{align}

其中

1.9 优势函数(advantage function)

有时我们不需要描述一个动作有多好,而是可以跟其他动作的平均收益相比较,得到该动作的相对优势。

优势函数 描述的是在状态 条件下选择某个动作 ,相比于依据策略 选择动作的优势,并且要求两种情况下后续都依照策略 动作:

由于其他条件完全相同,区别仅在当前步的动作,因此优势函数实际上反映了动作 相比于现有策略 指定动作的优势。 越大表明越应该采取新的动作 ,而抛弃旧策略对应的动作。

1.10 on-policy VS off-policy

我们还会经常听到一个算法是 on-policy 的还是 off-policy 的。简单的说,on-policy 的算法不会使用旧的数据,它的训练数据都是当前 policy 条件下产生的,因此数据(重复)利用率较低,也就是 sample inefficient. 这一类算法的优点是直接对 policy 做优化,这也是我们最关心的、最终的优化对象,相比于间接优化算法,on-policy 更加稳定。目前,比较先进的 on-policy 算法,例如 PPO 已经在 sample efficiency 方面做了改进。

off-policy 算法(以 DDPG 和 Q-learning 为代表)可以重复使用旧的数据,学习某个值函数(核心思想是让它满足 Bellman 方程),然后由该值函数间接的学习 policy. 由于学习值函数与学习 policy 是两个相对独立的过程,即使获得比较好的值函数估计,也不意味着学习到了好的 policy,因此 off-policy 算法的问题在于算法的不稳定性,相对比较脆弱。目前先进的 off-policy 算法,如 TD3 和 SAC 在稳定性方面有了一些改进。

1.11 Markov Decision Processes (MDPs)

RL 标准的数学描述是基于 MDP 的。
一个 MDP 是一个 5 元组 ,其中

  • 为所有可能状态的集合
  • 为所有可能动作的集合
  • 为收益函数,
  • 为状态转移函数,
  • 为初始状态分布

之所以称为马尔可夫决策过程,是因为状态变化具有马尔可夫性,即状态变换只与当前状态和动作有关,而与历史信息无关。

MDP 可以通过在最基本的马尔可夫过程中不断添加要素构造出来:Markov Processes (MP) 添加 reward 要素,得到 Markov Reward Processes (MRP),然后再添加 action 要素,得到 Markov Decision Processes (MDP).

2. RL 算法分类概述

2.1 分类图

现有参考资料中给出的 RL 算法分类不尽相同,有些算法可能涉及到多种特性,分类有些模糊。比较有代表性的分类例如(OpenAI):

https://spinningup.openai.com/en/latest/spinningup/rl_intro2.html

还有另一种分类也很流行(DeepMind):

由于这篇文章的框架参照 OpenAI 的教学文档,因此后边我们采用第一种分类方式和名称。

2.2 model-free VS model-based

先看一下 model 层面的分类。model-free 和 model-based 关键的不同就在于 agent 是否对环境进行建模(或者学习出来)。

理论上来说,有了环境模型,agent 可以超前规划,提前预测动作带了的收益,效果会更好。

model-based 的一个挑战是如何获得精确的 model. 一般来说,ground-truth model 是无法直接得到的,agent 只能基于过往经历不断学习 / 估计出 model,这其中就涉及到 model 估计是否精确的问题。很可能费了很多时间和大量计算,最后的 model 依然偏差很大。

目前来看,model-free 类型的算法更流行,发展势头更猛。本文后边只考虑 model-free 的算法。

2.3 各类 model-free 算法对比分析

从前述分类图上看,model-free 算法又可以分成两类:

2.3.1 Q-Learning 类型

这类方法中首先要学习一个值函数 ,一般是采用神经网络估计这个 Q 函数,因此可以写成带参数的形式 ,然后由学习出的 进一步推导出 policy。这类算法几乎总是 off-policy 的,即训练数据可以使用之前所有的数据,与 agent 产生数据时的 policy 无关。

待求的最优 policy 与 ​ 是有关联的,Q 反映了给定状态和动作的条件下的最优回报。当学到了 (即训练好了 ),一个自然的想法是通过下式进一步搜索给定状态下的最优动作,也就是最优的 policy :

引发了 deep RL 研究热潮的经典的 DQN 就属于此类算法。

2.3.2 policy optimization 类型

在 RL 中,我们最关心的是面对状态 ​ 应该怎么选择动作 ​,也就是所谓的 policy,在考虑策略随机性的环境中可以表示为 ​,即在状态 ​ 下各动作的概率分布 。相比于 Q learning 中确定性的 ​ 关系,这里得到的是具有随机性的 policy 。

Q-learning 方法是通过估计 Q function 来指导动作 ​ 的选择。这是一种间接的寻找 policy 的方式。典型的 Q-learning 算法,如 DQN 只能用在离散动作空间中,因为涉及到通过 ​ 搜索最优的 ​ ,在小规模、离散的动作空间中比较容易实现,但很难应对连续动作空间。

policy gradient 方式则不去管 Q function,直接显式描述 policy ​, 然后基于 ​ 得到优化目标函数 ,即该 policy 条件下的期望回报​,用梯度上升的方式更新参数 ​。另外,在常见的 policy optimization 算法中还经常用一个神经网络去学习 ,记作 ,用来指导 policy 更好的更新。

这类 RL 方法几乎总是 on-policy 的,即每次更新时只使用当前 policy 下得到的数据。所有 on-policy 的算法都面对一个问题: sample inefficiency。要成功训练,需要大量的采样,对于实体机器人来说,这很难实现或者成本太高。

属于此类的常用 RL 算法包括 A2C / A3C 和 PPO。PPO 是目前比较主流的,可以应对离散和连续动作空间,在 OpenAI Five (在 DOTA 2 中击败人类)上很成功。

2.3.3 两类算法的对比

policy optimization 的优点是,它直接优化我们希望得到的东西,即最优的 policy,算法比较稳定。

Q-learning 方法通过搜索 ​ 函数间接优化 policy,相对不稳定。Q-learning 的优点是 sample efficient,数据使用效率高。需要注意的是,数据使用效率高并不意味着学习更快,只是说数据可以重复利用,可能需要的计算量更大,时间更长。

两种算法并没有绝对的优劣,需要考虑实际的应用环境。而且,policy optimization 方法与 Q-learning 方法并不是对立的。不少算法是介于这两者之间的,既学习 Q function ,又学习 policy,兼顾了两者各自的优势。

  • DDPG: 同时学习确定性的 policy 和一个 Q-function,两者互相促进。DDPG 是 DeepMind 开发的面向连续控制的 off-policy 算法,因此比 on-policy 算法更 sample efficient。DDPG 训练的是一种确定性策略,即每一个状态 ​ 下都只考虑一个最优的动作 ​ 。

  • SAC:SAC 是基于最大熵的一种 off-policy 算法。与 DDPG 不同的是,SAC 采用随机策略,这相比于确定性策略有一定的优势。SAC 在公开的 benchmark 上取得了非常好的效果,并且很适用于真实机器人。

本文后续的内容安排如下:

  • 先讨论纯 Q-learning 算法—— Deep Q-learning,这是 Deep RL 领域的早期经典工作,引发了后续各类 Deep RL 算法的大爆发。

  • 再讨论纯 Policy optimization 算法(或以 Policy optimization 为主) —— Vanilla PG,PPO

  • 最后讨论混合型的算法—— DDPG,TD3,SAC

3. Deep Q - learning / Deep Q-Network (DQN)

3.1 传统的 Q - learning (Tabular learning,查表)

在传统的 Q-learning 中,需要估计一个表(Q-table),其中第 行第 列的值表示在某一状态 下采用动作 之后得到的最优累计收益(即回报) 。为了简化书写,后续只写 。

...
...

当有了 Q-table 之后,寻找给定状态 下的最佳动作就很简单了,查表寻找最大 值对应的动作即可。关键是如何得到 Q-table 中的值?这是一个不断学习、不断改进的过程。

算法伪码如下:

其中 Q 更新的式子整理之后也可以写成:

由于每次更新都融入一个真实的收益项 ,可以改善之前的估计。直观上理解,随着迭代次数增加,Q table 会越来越接近真实的 Q 值。

上图中 -greedy 是指以 的概率随机选动作,以 () 的概率选当前 Table 中指定的最优动作。这有利于扩大搜索范围,避免过早的陷入局部最优。

Q-learning 总结:

  • 根据 Q Table 选动作
  • 每次选完动作,得到相应收益之后,就更新一次 Table 中对应的值
  • 动作结束之后就进入新的状态,继续基于更新之后的 Q Table 重复上述步骤

3.2 Deep Q - learning

在传统的 Q-learning 中,如果状态+动作的组合非常多,比如下围棋,那么对应的 Table 会很大,搜索很费时间。

实际上,Q Table 本身反映的是一个输入输出的映射关系 ,而拟合映射关系正是神经网络擅长的。将深度神经网络引入 Q-learning 就产生了 Deep Q - Learning。

3.2.1 构造网络

Deep Q - learning 中用一个神经网络(称为 DQN, Deep Q network)去拟合 Q-Table,实际上是个 Q-value function,即给定了 和 输出相应的 ,可以是 2 输入 1 输出,也可以 1 输入 n 输出,即只输入当前状态,神经网络给出所有可能动作 及其对应的 Q-value,然后采用那个对应最大 Q-value 的动作。

如果将上图左侧中的神经网络展开,可能是如下结构(这里假设输入是图片,也可以采用其他结构):

上图中,输入的状态是最近的 4 帧图片,相比于单张图片可以更好的捕捉环境的动态变化,输出是所有 action 对应的 Q value. 选择 Q value 最大的那个 action 即可。

要使用神经网络就必须先训练它,DQN 中采用 supervised learning 方式(基于 Bellman 方程约束),其中 target 就是每步动作之后的当前单步收益+后续最优收益 ,其中 是下一步状态, 是神经网络预测的 Q 值。由于包含了一项实际收益 ,target 更接近真实的累计收益。训练的目的就是令网络输出的 时刻 Q-value 逼近 。可以通过误差反向传播训练网络。

3.2.2 DQN 遇到的问题与改进

与传统 supervised learning 相比,上述 Deep Q-learning 有两个问题:

  • 用神经网络进行函数拟合的时候,训练数据之间要求不相关。如果没有充分随机挑选训练样本,比如最后送进去的样本都是偏离真实函数很大的,那么学出来的效果就很差。

  • DQN 中 target 中第二项是基于神经网络的,每次更新参数,target 也在不断变化,这有可能导致学习不收敛,因为目标老是变来变去的。

为了解决上边两个问题,DQN 增加了两个机制:

  1. 缓存重播(Buffer replay / experience replay): 随机抽取之前的经历 进行学习,打破了训练样本之间的相关性。

  2. 固定学习目标(Fixed Q-targets): 添加一个 target 网络,与原本的 网络(称为主网络)相比,参数更新较慢。改进之后,用主网络计算当前预测值,而用 target 网络计算 中的 Q 值,然后每隔若干步同步一次两个网络的参数。目的是保证一个相对稳定的 target,而不是去拟合一个老是在改变的 target.

3.2.3 Deep Q-learning 伪码:

4. Policy optimization 基础

上述 Q-learning 算法是通过估计 Q value 间接的寻找最优 policy。
policy-based RL 算法是直接优化 policy 。

4.1 推导最基础的 policy gradient

考虑参数化的策略分布 ,我们的目标是最大化期望回报 . 这里设定 是有限时间无折损累计收益,不过后续推导过程完全可以推广到无限有折损情况。

整体来看,我们希望通过梯度上升的方式更新参数 使 增大,即

其中 称为 policy gradient,也就是期望回报关于参数 的梯度。通过policy gradient 方式优化 policy 的算法,称为 policy gradient 算法。

为了使用上述 policy gradient 算法,我们需要做两件事:

  1. 将 policy gradient 表达出来
  2. 考虑到 的表达式,相应的 policy gradient 应该是一个期望的形式,需要通过采样来估计这个期望值。

下边逐步推导出 policy gradient 的表达式:

  • 某一路径 (trajectory / episode) 出现的概率:在给定 的条件下,路径 出现的概率为

  • log-derivative trick ( log 求导技巧):函数本身关于参数的梯度 与 函数的对数关于参数的梯度 之间的关系,实际上就是对数函数和链式求导的简单应用

  • 路径概率的 log 函数:

  • 依赖于环境的函数与参数 无关,因此 关于 的梯度均为 0

  • 路径概率的 log 函数的梯度:
    \begin{align} \nabla_\theta\log P(\tau|\theta) &= \nabla_\theta\log \rho_0(s_0) + \sum_{t=0}^T\Big( \nabla_\theta\log P(s_{t+1}|s_t, a_t) + \nabla_\theta\log \pi_\theta(a_t|s_t) \Big) \\ &= \sum_{t=0}^T \nabla_\theta\log \pi_\theta(a_t|s_t) \end{align}

把上述所有式子整合在一起,可以得到 policy gradient 的表达式:
\begin{align} \nabla_\theta J(\pi_\theta) &= \nabla_\theta \underset{\tau\sim \pi_\theta}{E} [R(\tau)] \\ &= \nabla_\theta \int_\tau P(\tau|\theta) R(\tau) \\ &= \int_\tau \nabla_\theta P(\tau|\theta) R(\tau) \\ &= \int_\tau P(\tau|\theta) \nabla_\theta \log P(\tau|\theta) R(\tau) \\ &= \underset{\tau\sim \pi_\theta}{E} [\nabla_\theta \log P(\tau|\theta) R(\tau)] \\ &= \underset{\tau\sim \pi_\theta}{E} \Big[\sum_{t=0}^T \nabla_\theta\log \pi_\theta(a_t|s_t) R(\tau)\Big] \end{align}

为了求上述期望,我们可以通过采样取平均的方式,即在固定的 策略下多次实验获得路径集合 ,进而估计 如下:

至此,我们就获得了最基本的 policy gradient 的表达式,只要能够基于 policy 计算出 ,并且能够获得多次实验路径的回报,我们就可以计算出 policy gradient 的数值,进而更新参数 。

4.2 剔除动作发生之前的收益

回顾 policy gradient 的基础形式:

基于上述梯度的更新,从期望上来说可以提高 action 的 log-prob,而提高的程度取决于 action 所在的采样路径累计回报 。

在一条采样路径上,可能有好的 action,也有不好的 action,但是只要属于同一条采样路径, 相同,各个 action 对应的梯度分量所乘的系数相同,这显然不太合理。直观上来看,一个 action 的优劣仅体现在它之后的收益中,之前的收益与它无关。因此,一个合理的改进是各梯度分量乘上的系数与 action 本身的优劣相关,而不是与整条 trajectory 的回报相关。修改之后的 "reward-to-go" policy gradient 形式如下:
\begin{align} \nabla_\theta J(\pi_\theta) &= \underset{\tau\sim \pi_\theta}{E} \bigg[\sum_{t=0}^T \Big( \nabla_\theta\log \pi_\theta(a_t|s_t) \sum_{t'=t}^TR(s_{t'},a_{t'},s_{t'+1}) \Big) \bigg] \\ & \triangleq \underset{\tau\sim \pi_\theta}{E} \bigg[\sum_{t=0}^T \Big( \nabla_\theta\log \pi_\theta(a_t|s_t) \hat{R}_t \Big) \bigg] \end{align}

其中 称为自时刻 开始的 reward-to-go (剩余回报?)

采用 reward-to-go 形式,除了形式上更合理,还会提高学习效率。原本 时刻之前的 reward 对于 来说都是噪声,将 替换为 , policy gradient 采样估计的方差更小,需要的采样 trajectory 更少。

4.3 增加基线 (baseline)

首先介绍一个引理 Expected Grad-Log-Prob ( EGLP ) lemma,它可以指导我们构造 baseline.

假设 是关于 的参数化的概率分布,则有

证明:已知任意的概率分布积分均为 1,因此有

两边求关于 的梯度,得

应用 log-derivative trick 可得

证毕。

由上述 EGLP 引理可知,对于任意只依赖于状态 的函数 ,均有

这个特性允许我们任意改造前述的 policy gradient,只要添加的项仅与 相关:

在这里称为基线 baseline.

添加 baseline 虽然不会改变原本的期望值,但是有可能减小方差,使学习更稳定。可以想象一下,在引入 baseline 之前,不同的 trajectory 对应的回报可能差别很大,如果按照回报成比例的修改 policy,可能很快陷入某些随机出现的回报较高的 policy 附近,而且每次训练随机出现的高回报 policy 可能差别很大,因而学习不稳定。

引入 baseline 的另一个好处可以通过下边的例子说明。
在某些游戏中,reward 总是正的,因此,在更新网络参数时,哪个 action 被采样到了,它的概率就会相对增大,考虑到采样存在的偏差,有些 action 可能仅仅因为没有被采样到,它的概率就会降低。为了避免这种情况,可以从 reward 中减去一个 baseline,让某些 reward 成为负值。这样如果与它相关的 action 被更新,概率就会降低。这里可以取 baseline 约为所有 trajectory reward 的平均值。

在现有的算法中,最常用的基线是 on-policy value function ,这是从 出发,依照策略 动作得到的期望累计收益。由于已经取了期望, 不再依赖某条特定的采样路径 trajectory,而是在当前 policy 下所有采样路径上 的平均值。将 作为 baseline,可以最大程度地减小 policy gradient 的采样方差,另外从直观上理解, 也可以评价特定 action 带来的收益相比于现有 policy 下的平均值的优劣。

在实际中, 不能直接获得,一般是通过神经网络估计,表示为 。最简单的训练方式是通过梯度下降算法最小化如下目标函数

4.4 其他形式的 policy gradient

到目前未知,我们遇到的 policy gradient 可以统一写成如下形式:

其中

或者

或者

另外,还有两种常用的形式:

  • on-policy action-value function

可以证明(参考文献)

  • Advantage function. 优势函数的定义为 。可以令 。

之前的 反应的是在状态 条件下选择动作 在特定采样路径中带来的收益相比于依照策略 得到的收益均值的优劣,这里的 反映了在状态 条件下选择动作 在所有采样路径中(期望状态下)带来的收益相比于策略 收益均值的优劣。相对来说,后者更能客观反映动作 的优劣。

4.5 Vanilla Policy Gradient (VPG)

下边看一个具体的 policy gradient 算法例子 —— Vanilla Policy Gradient (VPG)。这里的 Vanilla 是从香草口味冰淇淋引申来的,这种口味是传统冰淇淋的标准、默认口味。因此,一个算法(或者其他东西)如果有很多个版本,那么 vanilla 版本就是指那个默认的标准版本。

policy gradient 的核心思想就是逐步提高高收益动作对应的概率,降低低收益动作的概率。在 4.4 节中 就是关于动作收益的度量,有很多种具体形式。

VPG 中 采用的具体形式是前述的优势函数 ,相应的 policy gradient 可以表示为:

policy 参数 通过梯度上升方式更新:

由于 VPG 是 on-policy 的算法,因此对于每个 policy 都要收集多条 trajectory 的数据,然后基于这些数据计算 policy gradient 并更新 policy,再收集新的 policy 条件下得到的数据,重复之前的步骤。

相应的算法伪码:

5. Proximal Policy Optimization (PPO)

John Schulman, et al. Proximal Policy Optimization Algorithms. 2017. https://arxiv.org/abs/1707.06347

5.1 核心理论

与 VPG 相比,PPO 有两个重要改变:

  1. PPO 中的优化目标不是 ,而是设计了新的函数
  2. 对 policy 更新幅度加了限制,避免参数更新幅度太大导致训练失败

PPO 有两个主要的版本:

  • PPO-Penalty: 通过新旧两个 policy 的 KL-divergence 限制 policy 的更新幅度
  • PPO-Clip:通过截断阈值,限制更新幅度

这里只讨论 Clip 版本。

与 VPG 相同,PPO 也是 on-policy 的。
PPO 中的优化目标采用了新的函数:

其中
L(s,a,\theta_k, \theta) = \min \Big(\frac{\pi_\theta(a|s)}{\pi_{\theta_k}(a|s)}, ~(1+\epsilon) \Big) A^{\pi_{\theta_k}}(s,a), ~~ \text{if} ~~ A^{\pi_{\theta_k}}(s,a) \ge 0 \\ L(s,a,\theta_k, \theta) = \min \Big(\frac{\pi_\theta(a|s)}{\pi_{\theta_k}(a|s)}, ~(1-\epsilon) \Big) A^{\pi_{\theta_k}}(s,a), ~~ \text{if} ~~ A^{\pi_{\theta_k}}(s,a) < 0

依然是之前定义的优势函数,当它大于 0 时,意味着动作 收益更大,应该增大它的概率。
通过截断保证了 policy 改变不会超过给定的阈值。

写成统一的式子:

其中

5.2 伪码

6. Deep Deterministic Policy Gradient (DDPG)

[1] David Silver, et al. Deterministic Policy Gradient Algorithms. 2014. http://proceedings.mlr.press/v32/silver14.pdf
[2] Timothy P. Lillicrap , et al. Continuous control with deep reinforcement learning. 2015. https://arxiv.org/abs/1509.02971

我们可以把 DDPG 看作连续动作空间版本的 DQN 算法。
与 DQN 相同,DDPG 也要基于 off-policy data 和 Bellman 方程学习出 Q function。
如果我们有了最优 Q-function ,那么最优的动作 可以通过 获得:

当动作空间离散时,很容易通过 得到最优的 ,直接比较所有的动作对应的 Q 值就可以了。
但是当动作空间连续时,我们没办法穷举所有的动作。

动作空间连续有一个好处,就是可以认为 关于 action 可导。DDPG 给出的解决方案就是用神经网络梯度上升的方式来调节 使 最大化,也就是学习一个 使得 。

与 DQN 类似,这种从 得到的最优 action 是确定性的,不像 VPG 和 PPO 那样得到的是随机的 policy 。这就是 DDPG 名字中 "Deterministic" 的由来。

从上边的描述中可以看出,DDPG 算法主要包含两部分:

  1. 学习 Q function (第一个神经网络)
  2. 由 Q function 学习最优 action (第二个神经网络)

6.1 学习 Q-function(Q-learning)

这一部分与 DQN 几乎完全相同,除了用 代替 。
下边具体看一下。

对 的估计是基于它的 Bellman 方程:

其中状态 服从分布 .

我们用一个神经网络 来估计 ,即我们希望这个神经网络尽量符合上边的 Bellman 方程,这里对应的优化目标函数为

该目标函数称为 mean squared Bellman error ( MSBE).

实际上,所有的 Q-learning 算法,不仅是 DDPG,还包括 DQN 和它的所有变种,核心思想都是最小化 MSBE 函数。

在训练过程中,所有 Q-learning 算法都会采用如下两个技巧:

  1. 缓存重播 (replay buffer):即之前的经历 保存到集合 中,学习的时候从里面随机选取。这些过往的经历并不依赖于特定 policy。

  2. 目标网络(target network):在 MSBE 中, 是网络 学习的目标。注意到这个目标也是跟参数 相关的。如果每次迭代更新 ,它跟踪的学习目标也变化,可能导致学习过程不稳定。解决方案是用一个参数延迟更新的网络 替代上式中的 , 这样可保证学习目标相对稳定些。 称为目标网络。

    • 在 DQN 中,目标网络在延迟某个固定步数之后直接复制主网络的参数,然后固定住,等待下次延迟更新。

    • 在 DDPG 中,每次主网络更新,目标网络就以加权平均的形式更新一次

      一般取 接近于 1.

与 DQN 最大的不同,DDPG 算法除了主网络和目标网络之外,还需要一个目标策略网络(target policy network) 计算满足 的最优 action

目标策略网络参数的更新也是需要一定的延迟性(因而也是需要两个网络),这同样还是为了保证目标网络 的稳定性,因为目标网络中用到了目标策略网络 ,因此要求目标策略网络不能随主网络一起更新。目标策略的主网络 与 主网络是同步更新的。

Q-learning 部分最终的 MSBE 为

前边提到过,用神经网络拟合 时有两种结构:输入 输出 和 ,或者输入 输出 。如下图所示:

  • 对于离散动作空间, 可以逐一列出,此时两种结构都可以,但首选第一种,只需一次前向计算就可以得到所有的 和 ;
  • 对于连续动作空间,只能用后者,因为无法在输出端对应列出所有的 和 , DDPG 中就是采用后一种结构。

6.2 学习 policy

DDPG 中,我们希望学习一个确定性的策略 ,输出动作 使得 最大化。

可以使用梯度上升的方法解决上述优化问题:

在训练 policy 网络的过程中,Q 网络的参数被当作常数处理。

将两部分结合起来,整体架构如下:

https://nervanasystems.github.io/coach/components/agents/policy_optimization/ddpg.html

由于 policy 是确定性的,如果 agent 严格按照 policy 去动作,探索的空间可能会比较狭窄,即在给定的 下严格按照学习到的最优策略行动,可能错过更好的策略。因此,在训练时 policy 网络的输出以 action 为均值,加入随机性;测试时去掉随机性。

6.3 伪码

7. Twin Delayed DDPG (TD3)

Scott Fujimoto et al. Addressing Function Approximation Error in Actor-Critic Methods. 2018. https://arxiv.org/abs/1802.09477

DDPG 有时效果会非常好,但是比较依赖超参数的选择。
DDPG 训练失败的一个常见原因是高估了 Q 值,导致 policy 过分集中在错误的 action 上。

TD3 在 DDPG 基础上做了 3 方面的改善:

  1. 学习两个 Q function ,这也是 “Twin” 名字的由来,然后只使用两者之中较小的那个 Q 作为目标网络
  2. 延迟 policy 更新:Q function 依然照常更新,但是降低 policy 的更新频率,以及目标网络和目标策略网络参数的更新频率,原文建议降为原来的 1/2
  3. 平滑目标 policy:一方面为 加上随机噪声,另外通过 clip 作阈值限制。

下边分别讨论这 3 个技巧。

7.1 目标策略平滑(target policy smoothing)

TD3 中策略平滑的方式为

即先为原本的 添加噪声,再对结果进行截断,最后才送入 Q 目标网络中。
上述平滑操作的好处是:在 Q-learning 的过程中,即使出现了错误的、很大的 Q 值,由错误 Q 学习出的 存在一定的随机扰动,将它带入目标网络 会减小之前的错误 Q 值。

7.2 双 Q 网络

两个 Q 采用与 DDPG 中类似的优化函数:

不过,目标 采用较小的 Q 值:

这可以在一定程度上缓解 Q 的高估问题。

7.3 延迟更新

与 DDPG 中相同,TD3 中 policy 训练也是采用如下优化函数,其中选择了第一个 网络:

但是 policy 主网络不再与 Q 主网络同步更新,而是每隔若干步更新一次,并且两个目标网络的参数也是隔若干步更新一次,这样目标网络 更稳定。

7.4 伪码

8. Soft Actor Critic (SAC)

Tuomas Haarnoja et al. Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor. 2018. https://arxiv.org/abs/1801.01290

DQN,DDPG 和 TD3 这些算法中,基于 Q-learning 学习到的是确定性的 policy。
VPG,PPO 这些算法中,基于 policy-gradient 学习到的是随机性的 policy。
SAC 在上述两类算法之间建起了一座桥梁,它是基于 Q-learning 的,但是可以学到随机性的 policy。同时还借鉴了已有算法(尤其是 TD3)中的训练技巧。

SAC 的最大特色是在优化目标函数中引入了熵正则化(entropy regularization),目标是最大化 “期望回报” 与 “熵” 的加权值。

前边我们提到,在 Q-learning 确定性的 policy 中加入 -greedy 可以扩展搜索范围。
类似的,SAC 中熵的引入可以自然的调节 exploration 和 exploitation。较大的熵会使 随机性更大,更广泛的探索 action space,避免过早陷入局部最优。

8.1 熵调节的强化学习

由于熵的引入,我们之前的那些 Q, V 函数需要相应的修改一下。

熵可以解释成随机变量的随机程度(或者不可预测的程度),例如一个完全公平的硬币,“抛硬币所得结果”这一随机变量的熵是最大的,而一个总是出现正面(或者总是反面)的硬币对应的熵最小。

令 为随机变量,对应的概率密度 / 质量函数为 .
的熵 定义为:

在具有熵调节的强化学习中,agent 在每一步除了获得原本的基础收益之外,还会获得与 policy 的熵成正比的额外收益,相应的优化目标为:

其中权重系数 。

带有熵调节的 函数定义如下:

带有熵调节的 函数定义如下:

注意,上述 中不包括初始 状态下的熵,因为此时的策略不是由 决定的,这一步的熵不能反映策略的随机程度。

上述 V, Q 的关系式如下:

Q 函数的 Bellman 方程表达式如下:
\begin{align} Q^\pi(s,a) &= \underset{s'\sim P \\ a'\sim \pi}{E}\bigg[ R(s,a,s') + \gamma \Big(Q^\pi(s',a')+\alpha H(\pi(\cdot|s'))\Big)\bigg] \\ &= \underset{s'\sim P}{E}\bigg[ R(s,a,s') + \gamma V^\pi(s') \bigg] \end{align}

SAC 也是包括学习 Q function 和 学习 policy 两个部分。

8.2 学习 Q function

与 TD3 的相同点:

  • 目标函数都是 MSBE
  • 都是用 target Q-network,并且都要延迟更新
  • 都采用了 double Q 方式

不同点:

  • MSBE 中包含了额外的熵调节
  • Q-learning 部分学习的是 而不是
  • 没有明显的加随机噪声 policy smooth 过程。TD3 学到的是确定性 policy,因此需要额外加随机噪声;SAC 本来就是学习的随机 policy

前述 Q 函数的 Bellman 方程还可以写成如下形式:
\begin{align} Q^\pi(s,a) &= \underset{s'\sim P \\ a'\sim \pi}{E}\bigg[ R(s,a,s') + \gamma \Big(Q^\pi(s',a')+\alpha H(\pi(\cdot|s'))\Big)\bigg] \\ &= \underset{s'\sim P \\ a'\sim \pi}{E}\bigg[ R(s,a,s') + \gamma \Big(Q^\pi(s',a')- \alpha \log\pi(a'|s')\Big)\bigg] \end{align}

需要注意的是,这里的 来自 replay buffer, 来自当前 policy .

在实际中,上述期望值可以通过采样近似:

考虑参数化的 函数,最终 Q-learning 部分采用的 loss function 为

其中 target 为

8.3 学习 policy

policy 的目标是最大化 ,即

具体训练过程中,需要从 中采样动作 ,而采样会破坏误差反向传播过程。可以通过重参数化技巧(reparameterization trick)解决这个问题。将 表示成如下复合形式:

这样构造之后,采样只发生在随机变量 的取值中, 的均值和方差依然可以通过误差反向传播进行训练。另外,可以进一步加上双曲正切函数 tanh,将采样输出放缩到 [-1, 1] 之间,最终的采样式子如下:

基于上述重参数化, 可以进一步表示为
\begin{align} V^{\pi}(s) &= \underset{a\sim\pi}{E} [Q^\pi(s,a) - \alpha \log \pi(a|s)] \\ &= \underset{\xi\sim\mathcal{N}}{E} [Q^\pi(s,\tilde{a}_\theta(s,\xi)) - \alpha \log \pi(\tilde{a}_\theta(s,\xi)|s)] \end{align}

下一步就是将我们上边训练出来的 带入上式。在 TD3 中,直接用了第一个 Q 网络 ,而在 SAC 中选择较小的那个 Q。
最终 policy 的优化目标函数为

在早期版本中,还要额外学习 ,后来去掉了。
完整的结构图如下所示,其中包含了那个额外的 V 网络,直接忽略即可:

8.4 伪码

你可能感兴趣的:(深度强化学习总结)