进入深度 RL 后,model free 方法开始变得愈发重要,因为对真实世界建模绝非易事。

价值函数

当动作,状态空间无限扩大后,没有了一个表格式的 model 后,最重要的问题是如何表达原来查表可得到的价值函数 来指导动作选取。可以使用函数来状态动作价值函数的估计,在训练中采用近似参考值的方法来训练。

这个目标函数期望是按照随机变量 来计算的, 的分布情况会影响期望的计算。有两种方法来规定 的分布:

第一种是平均分布,平等地对待每一个状态,赋予 的权重:

但是这种方法有一种平均主义的问题:把所有状态都等权计算,这让很少访问到的状态同经常访问到的状态一样重要。

第二种是这章的重点,是应用稳态分布(stationary distribution)。如果你记录 agent 在足够多步里分别待在每个状态的比例,这个比例就近似于 stationary distribution ,满足。形式上来说,策略 作用于 MDP 后,状态的转移构成一条马尔可夫链,其转移矩阵为:

如果一个分布 满足:

也就是说,用 作为当前分布,经过一步转移后分布不变,那它就是 stationary distribution。

有了目标函数即可利用梯度下降来求函数参数的最优值:

而这些公式中的 表示的是真实的奖励函数,我们无法获取这个值,只能通过对每个 episode 的值进行采样获得。从每个 episode 中采样获得价值函数的方式也有两个,一是 MC 方法,而是 TD 方法。这两个方法均可以从Model free 基础方法中找到。

而状态价值估计到动作价值估计的外推是相当直接的,如同上一章Model free 基础方法中 Sarsa 方法的提出,函数近似的 Sarsa 也是相当好得到的:

Q-learning 也是一样的思路:

Deep Q-learning

DQN 就是指使用了神经网络作为奖励函数的 Q-learning,整体上和上文中讲的 Q-learning with function approximation 相差不大。要求的目标函数:

这个方程可以被视为平方贝尔曼最优误差,因为下列方程可以被视为贝尔曼最优方程:

然后对 求梯度下降

在利用梯度下降求解的同时需要一些技巧来使得训练更加稳定。

第一:Experience Replay

Algorithm 8.3 每收集一个 就立刻拿来更新 ,用完就扔。问题是连续的样本之间高度相关—— 往往很像,这相当于给神经网络连续喂很相似的数据,容易导致训练不稳定。

DQN 把所有经验存进一个 replay buffer,更新时从中随机抽一个 mini-batch。这样一个 batch 里的样本来自不同时刻不同状态,相关性被打破,训练就稳定得多。

第二:Target Network

Algorithm 8.3 的更新目标是 ,注意这里的 和被更新的参数是同一个。也就是你每更新一步 ,target 也跟着变了,等于目标一直在动,优化器在追一个移动的靶子。

DQN 维护一个额外的 target network ,隔一段时间才从主网络复制参数过来。更新目标变成 ,这样 target 在一段时间内是固定的,优化更稳定。即对下列公式求梯度:

Policy Gradiant

本文前部分讲了如何把奖励函数由表格变为函数,此前讲解的策略也大部分是通过查表选最大值的表格形式,深度 RL 也需要将策略转为函数形式:。这个函数可能是接受一个 输出下一步策略,也可能是输入 输出动作空间中的全部策略。

随之而来的问题是如何权衡最优的策略?在表格中,最优策略可以找到:让每一个状态的 value 都最大。这可以做到,因为存在一个策略同时在所有状态上最优。但是在参数化的策略中,参数维度有限,你没法让每个状态的 value 都同时最大。这时候你需要一个 单一的数字来评价整个策略的好坏,然后对这个数字做梯度上升。这个数字就是 scalar metric 。更新策略也从直接修改表格值变为更新函数权重。

定义好 scalar metric ,就可以通过Model free 基础方法中讲到的随机近似方法来去最优参数:

定义这个 scalar metric 很重要,一般有几种定义方式:

第一种是平均状态价值

此处关于 的分布可以是平均分布,即 或者对一个特定的状态感兴趣的话,比如总是从一个状态出发则可以使

也可以是静态分布,即上文讲的,找到 ,后利用这个分布计算。静态分布会带来很多有利于推导的性质:

  • 即目标函数是关于奖励函数的加权平均,而奖励函数是回报的累计折扣回报期望;
  • 这是把求和写成向量内积的形式。它的用处是方便后面求梯度

第二种方法是平均回报值

这个式子可以化成:

可以注意到平均回报值是严格依赖策略的静态分布的,因为他就是沿着策略求平均回报,并且其不带衰减,这使得这种目标函数相比第一种更加远视,适用于无终止的任务。

metircs 的梯度

定义好了目标函数 ,下一步就是对其求梯度。这部分的核心结论是策略梯度定理(Policy Gradient Theorem)

其中 是状态分布, 是策略对参数的梯度。更实用的是它的紧凑期望形式:

期望形式更受偏爱,原因是它可以用随机梯度来近似——用采样代替精确期望,这正是本章要讨论的内容。

为什么可以这么变形? 关键在于一个对数求导技巧:

因此:

将这个代入原始的求和式, 就把对 的求和自然地转成了对策略的期望,从而得到上面的紧凑形式。

另一个需要注意的前提是: 对所有 必须严格为正,这样 才有意义。实现这一点的标准做法是用 softmax 函数:

其中 是神经网络输出的偏好值。Softmax 天然满足 且所有动作概率之和为 1,同时让策略保持随机性,这意味着策略会持续探索而不会提前坍缩成确定性选择——这是一个自带探索的好性质。

注意

书中从200页至210页左右推导不同的 metric 形式的导数,包括:

  • Average statue value :包括静态分布和与策略无关 两种分布
  • Average reward
  • 然后按照是否是 discount 分类:
    • undiscounted :Lemma 9.1 证明 ,所以两个 metric 等价,梯度方向一样。Theorem 9.2 给出 ​ 的梯度,Theorem 9.3 给出 的梯度。
    • Undiscounted():​ 会发散,必须重新定义 (每步减去 ​,即 Poisson equation),然后推出 Theorem 9.5。

三种情况推出来的梯度形式几乎一样,全部被 Theorem 9.1 统一,此处省略。

由于真正的梯度是不知道的,所以我们可以通过用采样的方式来随机近似逼近真实的最优参数:

来近似 。如果前者是通过蒙特卡洛方法得到的估计,这个算法就叫作 REINFORCE 或者 Monte Carlo policy gradient

因为 ,可以把上式重新写成:

则当 时,选择 的概率提升:

反之,当 时,选择 的概率下降:

同时包含了 exploit 和 explore 两个效果。

Exploit 来自分子 值越大, 越大,更新幅度越猛,这个动作的概率被提升得越多。所以算法倾向于强化高回报的动作,这就是 exploitation。

Explore 来自分母 :假设某个动作 但当前概率很低,那分母小, 就会被放大。也就是说,一个被冷落但实际不错的动作,反而会得到更强的概率提升。反过来,一个已经高概率的好动作,分母大, 被压小,提升幅度不会太大。

Actor-critic

现在所学的策略大致分为两种: policy-basedvalue based。前者比如 REINFORCE,Policy Gradiant 算法是直接更新模型参数,后者比如 DQN,Q-learning 直接更新价值函数。

现在的随机近似方法也大致分为两类:蒙特卡罗方法和 TD learning。上一章讲的 REINFORCE和 Policy Gradiant 都是蒙特卡洛方法,当把 TD 基础的近似方法用于 Policy gradiant 算法后可以得出 Actor-critic 算法。

这个算法就是将 TD base 近似方法代入了 Policy Gradiant 后加上了一个 Sarsa 算法来更新价值函数。也就是 QAC 使用 Sarsa 算法提供的 Q 值来更新策略神经网络,相比 REINFORCE 算法直接采样一个很长的 Q 值来更新,这个算法用 Sarsa 提供的期望 Q 值来更新策略神经网络,这极大减小了方差。

上式中的 Sarsa 和前几章讲解的表格式 Sarsa 更新方式不一样,因为这个 Sarsa 也是函数式的,采用减小平方误差的方式来优化:

优势 Actor-Critic

Advantage actor-critic(A2C) 的核心思想就是通过引入一个 baseline 来减小估计的方差,即:

在末尾加上一个参数不会改变期望值,因为:

但是可以有效改变方差,可以证明最优的 baseline 是:

但是这个基线计算太复杂了o,如果将 删掉,也可以得到一个次优的基线:

证明见书P.219。

引入基线后,更新方式变为了:

其中 ,这被称为优势函数,这个更新的随机方式为:

即 A2C 不再看一个动作的绝对回报,而是看这个动作相对这个状态平均回报的相对值,直觉上来讲降低了方差。当 是通过蒙特卡罗方法估计的时候,这个策略叫作 REINFORCE with baseline,当两者是由 TD learning 估计的时候,这个算法才被叫作 A2C。

同时可以注意到这里的优势函数是由 TD error 近似而来的:

这使得我们可以仅靠维持一个神经网络追踪优势值就可以运行算法,而不是同时运行两个神经网络。当基线使用的是 TD error 的时候算法也可以被叫作 TD actor-critic

off-policy policy gradient

Policy based 算法基本上天生就是 On policy 的算法,如果没有针对自己的 Policy 求梯度的话,就不是针对自己的策略优化,这使得一个 Policy 只能针对现在的参数生成的轨迹求梯度,变了点参数又不能用了,使得 on-policy 的策略利用率较低。

从直觉上来说,因为 AC 是利用下一个动作的 来优化动作的,所以只要两个策略对于同一个状态的动作状态价值函数 是一样的话,在一个状态的到的导数应该是一样的,只不过因为取到这个动作的概率和这个状态在静态分布中的概率不同,所以乘上不同概率的权重即可:

但是上述要求的 并不被 Sarsa 满足,有几种方法: 第一种,critic 改用 Q-learning()。这样 critic 估计的是 ​,不依赖任何策略,天然 off-policy。

第二种,critic 也加 importance sampling 修正。在 TD target 里对后续动作的采样也乘权重,让估计值收敛到 ​ 而非 ​。

第三种,也是实践中最主流的:让 不要差太远。PPO 就是这个思路—— 是上一轮的旧策略 ​,用 clipping 保证新旧策略差距小,这样 ​,误差可控。严格说不完全对,但实践中足够好。

此处还有 Deterministic Policy Gradients 部分,但是目前和方向关系较弱,看了看没记笔记。