强化学习是关于智能体以及它们如何通过试错来学习的研究。它确定了通过奖励或惩罚智能体的动作从而使它未来更容易重复或者放弃某一动作的思想。

强化学习因为被用在复杂策略游戏创造出突破性的 AI 中而名声大噪,最著名的要数 围棋 、 Dota 、教电脑 玩Atari游戏 以及训练模拟机器人 听从人类的指令 。

核心概念

强化学习的主要角色是 智能体 和 环境,环境是智能体存在和互动的世界。智能体在每一步的交互中,都会获得对于所处环境状态 State 的观察(有可能只是一部分),然后决定下一步要执行的动作。环境会因为智能体对它的动作而改变,也可能自己改变。

智能体也会从环境中感知到 奖励 信号,一个表明当前状态好坏的数字。智能体的目标是最大化累计奖励,也就是 回报。强化学习就是智能体通过学习来完成目标的方法。

状态和观察

一个 状态 $S$ 是一个关于这个世界状态的完整描述。这个世界除了状态以外没有别的信息。观察 $O$ 是对于一个状态的部分描述,可能会漏掉一些信息。

在深度强化学习中,我们一般用 实数向量、矩阵或者更高阶的张量(tensor) 表示状态和观察。比如说,视觉上的 观察 可以用RGB矩阵的方式表示其像素值;机器人的 状态 可以通过关节角度和速度来表示。

如果智能体观察到环境的全部状态,我们通常说环境是被 全面观察 的。如果智能体只能观察到一部分,我们称之为 部分观察

动作空间

不同的环境有不同的动作。所有有效动作的集合称之为 动作空间。有些环境,比如说 Atari 游戏和围棋,属于 离散动作空间,这种情况下智能体只能采取有限的动作。其他的一些环境,比如智能体在物理世界中控制机器人,属于 连续动作空间。在连续动作空间中,动作是实数向量。

这种区别对于深度强化学习来说,影响深远。有些种类的算法只能直接用在某些案例上,如果需要用在别的地方,可能就需要大量重写代码。

策略

策略 是智能体用于决定下一步执行什么行动的规则。可以是确定性的,一般表示为 $\mu$:

$$ a_t = \mu(s_t)$$ 也可以是随机的,一般表示为 $\pi$:

$$ a_t \sim \pi(\cdot | s_t). $$

因为策略本质上就是智能体的大脑,所以很多时候“策略”和“智能体”这两个名词经常互换,例如我们会说:“策略的目的是最大化奖励”。

在深度强化学习中,我们处理的是参数化的策略,这些策略的输出,依赖于一系列计算函数,而这些函数又依赖于参数(例如神经网络的权重和误差),所以我们可以通过一些优化算法改变智能体的的行为。

我们经常把这些策略的参数写作 $\theta$ 或者 $\phi$ ,然后把它写在策略的下标上来强调两者的联系。

$$ a_t = \mu_{\theta}(s_t)$$

$$a_t \sim \pi_{\theta}(\cdot | s_t). $$

确定性策略

例子:确定性策略: 这是一个基于 TensorFlow 在连续动作空间上确定性策略的简单例子:

1
2
3
obs = tf.placeholder(shape=(None, obs_dim), dtype=tf.float32)
net = mlp(obs, hidden_dims=(64,64), activation=tf.tanh)
actions = tf.layers.dense(net, units=act_dim, activation=None)

其中,mlp 是把多个给定大小和激活函数的 密集层 (dense layer)相互堆积在一起的函数。

随机性策略

深度强化学习中最常见的两种随机策略是 绝对策略 (Categorical Policies) 和 对角高斯策略 (Diagonal Gaussian Policies)。

确定 策略适用于离散行动空间,而 高斯 策略一般用在连续行动空间

使用和训练随机策略的时候有两个重要的计算:

  • 从策略中采样行动
  • 计算特定行为的似然(likelihoods) $\log \pi_{\theta}(a|s)$

下面我们介绍一下这两种策略

绝对策略

确定策略就像是一个离散空间的分类器(classifier)。对于分类器和确定策略来说,建立神经网络的方式一模一样:输入是观察,接着是一些卷积、全连接层之类的,至于具体是哪些取决于输入的类型,最后一个线性层给出每个行动的 log 数值(logits),后面跟一个 softmax 层把 log 数值转换为可能性。

采样 给定每个行动的可能性,TensorFlow之类的框架有内置采样工。具体可查阅 tf.distributions.Categorical 或 tf.multinomial 的文档。

对数似然 :表示最后一层的可能性 $P_{\theta}(s)$。它是一个有很多值的向量,我们可以把行动当做向量的索引。所以向量的对数似然值 

a
a
 可以通过这样得到: $$\log \pi_{\theta}(a|s) = \log \left[P_{\theta}(s)\right]_a.$$

对角高斯策略

多元高斯分布(或者多元正态分布),可以用一个向量 $\mu$ 和协方差 $\Sigma$ 来描述。对角高斯分布就是协方差矩阵只有对角线上有值的特殊情况,所以我们可以用一个向量来表示它。

对角高斯策略总会有一个神经网络,表示观察到行动的映射。其中有两种协方差矩阵的经典表示方式:

第一种 : 有一个单独的关于对数标准差的向量: 

\log \sigma
\log \sigma
,它不是关于状态的函数,
\log \sigma
\log \sigma
 而是单独的参数(我们这个项目里,VPG, TRPO 和 PPO 都是用这种方式实现的)。

第二种 :有一个神经网络,从状态映射到对数标准差 

\log \sigma_{\theta}(s)
\log \sigma_{\theta}(s)
。这种方式可能会均值网络共享某些层的参数。

要注意这两种情况下我们都没有直接计算标准差而是对数标准差。这是因为对数标准差能够接受 

(-\infty, \infty)
(-\infty, \infty)
 的任何值,而标准差必须要求参数非负。要知道,限制条件越少,训练就越简单。而标准差可以通过取幂快速从对数标准差中计算得到,所以这种表示方法也不会丢失信息。

采样 :给定平均行动 

\mu_{\theta}(s)
\mu_{\theta}(s)
 和 标准差 
\sigma_{\theta}(s)
\sigma_{\theta}(s)
,以及一个服从球形高斯分布的噪声向量 
z
z
,行为的样本可以这样计算:

a = \mu_{\theta}(s) + \sigma_{\theta}(s) \odot z,
a = \mu_{\theta}(s) + \sigma_{\theta}(s) \odot z,

这里 

\odot
\odot
 表示两个向量按元素乘。标准框架都有内置噪声向量实现,例如 tf.random_normal 。你也可以直接用 tf.distributions.Normal 以均值和标准差的方式采样。

对数似然 一个 k 维行动 

a
a
 基于均值为 
\mu = \mu_{\theta}(s)
\mu = \mu_{\theta}(s)
,标准差为 
\sigma = \sigma_{\theta}(s)
\sigma = \sigma_{\theta}(s)
 的对角高斯的对数似然:

\log \pi_{\theta}(a|s) = -\frac{1}{2}\left(\sum_{i=1}^k \left(\frac{(a_i - \mu_i)^2}{\sigma_i^2} + 2 \log \sigma_i \right) + k \log 2\pi \right).
\log \pi_{\theta}(a|s) = -\frac{1}{2}\left(\sum_{i=1}^k \left(\frac{(a_i - \mu_i)^2}{\sigma_i^2} + 2 \log \sigma_i \right) + k \log 2\pi \right).

行动轨迹

运动轨迹 

\tau
\tau
 指的是状态和行动的序列。

\tau = (s_0, a_0, s_1, a_1, …).
\tau = (s_0, a_0, s_1, a_1, …).

第一个状态 

s_0
s_0
,是从 开始状态分布 中随机采样的,有时候表示为 
\rho_0
\rho_0
 :

s_0 \sim \rho_0(\cdot).
s_0 \sim \rho_0(\cdot).

转态转换(从某一状态时间 

t
t
 , 
s_t
s_t
 到另一状态时间 
t+1
t+1
 , 
s_{t+1}
s_{t+1}
 会发生什么),是由环境的自然法则确定的,并且只依赖于最近的行动 
a_t
a_t
。它们可以是确定性的:

s_{t+1} = f(s_t, a_t)
s_{t+1} = f(s_t, a_t)

而可以是随机的:

s_{t+1} \sim P(\cdot|s_t, a_t).
s_{t+1} \sim P(\cdot|s_t, a_t).

智能体的行为由策略确定。

不同的回报公式

强化学习中,奖励函数 

R
R
 非常重要。它由当前状态、已经执行的行动和下一步的状态共同决定。

r_t = R(s_t, a_t, s_{t+1})
r_t = R(s_t, a_t, s_{t+1})

有时候这个公式会被改成只依赖当前的状态 

r_t = R(s_t)
r_t = R(s_t)
,或者状态行动对 
r_t = R(s_t,a_t)
r_t = R(s_t,a_t)

智能体的目标是最大化行动轨迹的累计奖励,这意味着很多事情。我们会把所有的情况表示为 

R(\tau)
R(\tau)
,至于具体表示什么,要么可以很清楚的从上下文看出来,要么并不重要。(因为相同的方程式适用于所有情况。)

T
T
 步累计奖赏,指的是在一个固定窗口步数 
T
T
 内获得的累计奖励:

R(\tau) = \sum_{t=0}^T r_t.
R(\tau) = \sum_{t=0}^T r_t.

另一种叫做 

\gamma
\gamma
 折扣奖励,指的是智能体获得的全部奖励之和,但是奖励会因为获得的时间不同而衰减。这个公式包含衰减率 
\gamma \in (0,1)
\gamma \in (0,1)
:

R(\tau) = \sum_{t=0}^{\infty} \gamma^t r_t.
R(\tau) = \sum_{t=0}^{\infty} \gamma^t r_t.

这里为什么要加上一个衰减率呢?为什么不直接把所有的奖励加在一起?可以从两个角度来解释: 直观上讲,现在的奖励比外来的奖励要好,所以未来的奖励会衰减;数学角度上,无限多个奖励的和很可能 不收敛 ,有了衰减率和适当的约束条件,数值才会收敛。

强化学习优化问题

无论选择哪种方式衡量收益(

T
T
 步累计奖赏或者 
\gamma
\gamma
 折扣奖励),无论选择哪种策略,强化学习的目标都是选择一种策略从而最大化 预期收益

讨论预期收益之前,我们先讨论下行动轨迹的可能性分布。

我们假设环境转换和策略都是随机的。这种情况下, 

T
T
 步 行动轨迹是:

P(\tau|\pi) = \rho_0 (s_0) \prod_{t=0}^{T-1} P(s_{t+1} | s_t, a_t) \pi(a_t | s_t).
P(\tau|\pi) = \rho_0 (s_0) \prod_{t=0}^{T-1} P(s_{t+1} | s_t, a_t) \pi(a_t | s_t).

预期收益是 

J(\pi)
J(\pi)

J(\pi) = \int_{\tau} P(\tau|\pi) R(\tau) = \underE{\tau\sim \pi}{R(\tau)}.
J(\pi) = \int_{\tau} P(\tau|\pi) R(\tau) = \underE{\tau\sim \pi}{R(\tau)}.

强化学习中的核心优化问题可以表示为:

\pi^* = \arg \max_{\pi} J(\pi),
\pi^* = \arg \max_{\pi} J(\pi),

\pi^*
\pi^*
 是 最优策略

值函数

知道一个状态的  或者状态行动对(state-action pair)很有用。这里的值指的是,如果你从某一个状态或者状态行动对开始,一直按照某个策略运行下去最终获得的期望回报。几乎是所有的强化学习方法,都在用不同的形式使用着值函数。

这里介绍四种主要函数:

  1. 同策略值函数 : 

    V^{\pi}(s)
    V^{\pi}(s)
    ,从某一个状态 
    s
    s
     开始,之后每一步行动都按照策略 
    \pi
    \pi
     执行
    V^{\pi}(s) = \underE{\tau \sim \pi}{R(\tau)\left| s_0 = s\right.}
    V^{\pi}(s) = \underE{\tau \sim \pi}{R(\tau)\left| s_0 = s\right.}

  2. 同策略行动-值函数 : 

    Q^{\pi}(s,a)
    Q^{\pi}(s,a)
    ,从某一个状态 
    s
    s
     开始,先随便执行一个行动 
    a
    a
     (有可能不是按照策略走的),之后每一步都按照固定的策略执行 
    \pi
    \pi

    Q^{\pi}(s,a) = \underE{\tau \sim \pi}{R(\tau)\left| s_0 = s, a_0 = a\right.}
    Q^{\pi}(s,a) = \underE{\tau \sim \pi}{R(\tau)\left| s_0 = s, a_0 = a\right.}

  3. 最优值函数: 

    V^*(s)
    V^*(s)
    ,从某一个状态 
    s
    s
     开始,之后每一步都按照 最优策略 
    \pi
    \pi
     执行

    V^*(s) = \max_{\pi} \underE{\tau \sim \pi}{R(\tau)\left| s_0 = s\right.}
    V^*(s) = \max_{\pi} \underE{\tau \sim \pi}{R(\tau)\left| s_0 = s\right.}

  4. 最优行动-值函数 : 

    Q^*(s,a)
    Q^*(s,a)
     ,从某一个状态 
    s
    s
     开始,先随便执行一个行动 
    a
    a
     (有可能不是按照策略走的),之后每一步都按照 最优策略 执行 
    \pi
    \pi

    Q^*(s,a) = \max_{\pi} \underE{\tau \sim \pi}{R(\tau)\left| s_0 = s, a_0 = a\right.}
    Q^*(s,a) = \max_{\pi} \underE{\tau \sim \pi}{R(\tau)\left| s_0 = s, a_0 = a\right.}

算法分类

Policy Optimization

这个系列的方法将策略显示表示为: $\pi_{\theta}(a|s)$。它们直接对性能目标 $J(\pi_{\theta})$ 进行梯度下降进行优化,或者间接地,对性能目标的局部近似函数进行优化。优化基本都是基于 同策略 的,也就是说每一步更新只会用最新的策略执行时采集到的数据。策略优化通常还包括学习出 

V_{\phi}(s)
V_{\phi}(s)
 ,作为 
V^{\pi}(s)
V^{\pi}(s)
 的近似,该函数用于确定如何更新策略。

基于策略优化的方法举例:

  • A2C / A3C, 通过梯度下降直接最大化性能
  • PPO , 不直接通过最大化性能更新,而是最大化 目标估计 函数,这个函数是目标函数 $J(\pi_{\theta})$ 的近似估计。

Q-learning

这个系列的算法学习最优行动值函数 $Q^(s,a)$ 的近似函数: $Q_{\theta}(s,a)$ 。它们通常使用基于 贝尔曼方程 的目标函数。优化过程属于 异策略 系列,这意味着每次更新可以使用任意时间点的训练数据,不管获取数据时智能体选择如何探索环境。对应的策略是通过 $Q^$ and $\pi^*$ 之间的联系得到的。智能体的行动由下面的式子给出:

$a(s) = \arg \max_a Q_{\theta}(s,a).$

基于 Q-Learning 的方法

  • DQN, 一个让深度强化学习得到发展的经典方法
  • 以及 C51, 学习关于回报的分布函数,其期望是 $Q^*$

策略优化和 Q-Learning 的权衡 :策略优化的主要优势在于这类方法是原则性的,某种意义上讲,你是直接在优化你想要的东西。与此相反,Q-learning 方法通过训练 $Q_{\theta}$ 以满足自洽方程,间接地优化智能体的表现。这种方法有很多失败的情况,所以相对来说稳定性较差。 但是,Q-learning 有效的时候能获得更好的采样效率,因为它们能够比策略优化更加有效地重用历史数据。

策略优化和 Q-learning 的融合方法 :意外的是,策略优化和 Q-learning 并不是不能兼容的(在某些场景下,它们两者是 等价的 ),并且存在很多介于两种极端之间的算法。这个范围的算法能够很好的平衡好两者之间的优点和缺点,比如说:

  • DDPG 是一种同时学习确定性策略和 Q 函数的算法
  • SAC 是一种变体,它使用随机策略、熵正则化和一些其它技巧来稳定学习,同时在 benchmarks 上获得比 DDPG 更高的分数。

Deep Q Network

Actor Critic

Others

Reference