强化学习之一二

856

文章目录

  1. 什么是强化学习
    1. 关键概念
      1. 模型:状态转移和奖励
      2. 策略
      3. 价值函数
      4. 最优价值和策略
    2. 马尔可夫决策过程
    3. 贝尔曼方程
      1. 贝尔曼期望方程
      2. 贝尔曼最优方程
  2. 常见方法
    1. 动态规划(Dynamic-Programming, DP)
      1. 策略评估
      2. 策略改进
      3. 策略迭代
    2. 蒙特卡洛(Monte-Carlo, MC)方法
    3. 时差(Temporal-Difference, TD)学习
      1. 提升法(Bootstrapping)
      2. 值预测
      3. SARSA: On-Policy TD 控制
      4. Q-learning: Off-Policy TD 控制
      5. Deep Q-Network
    4. 结合TD和MC学习
    5. 策略梯度
      1. 策略梯度理论
      2. REINFORCE
      3. Actor-Critic
      4. A3C
    6. 进化方法(Evolution Strategies, ES)
  3. 已知问题
    1. 探索 (exploration) vs 利用 (exploitation)
    2. 死亡三角问题
  4. 案例分析:AlphaGo Zero
  5. 引用

这是一篇译文,感谢原作者Lilian Weng的幸苦工作。原文链接为《A (Long) Peek into Reinforcement Learning》

 


 

在这篇文章中,我们从强化学习的基本概念开始,而后介绍一些经典的算法,带大家快速浏览强化学习世界。希望这篇文章帮助新手快速开始精彩的强化学习之旅。【注意】 这篇文章比较长哦。

近年来,许多AI相关的新闻都令人振奋,它们不断出现在大众面前。

"AlphaGo打败了世界最顶级的围棋选手。不久之后,其加强版AlphaGo Zero以100-0的比分碾压了AlphaGo。AlphaGo Zero的训练完全不需要拿专家对弈的棋局进行学习,它仅依赖自我博弈就可达到一个极高的水准。" "顶级的Dota2选手在1v1的solo中输给了OpenAI开发的机器人。"

知道这些之后,你肯定非常想要了解这些算法背后的魔法—强化学习。这篇文章的目的是快速带大家了解强化学习领域。首先,我们会介绍几个基础概念;然后,我们再深入了解一下经典的强化学习算法。希望这篇文章可以成为新手进入强化学习领域的一个非常好的起点。

什么是强化学习

假设我们有探索一个未知环境(environment)的执行代理(agent),这个代理可以通过与环境互动来获取一定奖励。代理应当对所执行的动作(action)有所偏好,以最大化累计收益。场景设定可以是一个自动化程序为了获取高分而去玩电子游戏,也可以是一个机器人使用一些工具完成某些特定的任务,当然强化学习的应用场景远不止这些。

强化学习示意图

强化学习的目标在于为执行代理学习一个好的策略,这个学习过程依赖于不断地与环境进行交互、尝试,环境会对代理的行为进行反馈。我们称一个策略为最优策略,则表示它可以根据环境的变化进行行为(action)的调整,并最终最大化累计收益。

关键概念

现在,我们正式定义一些强化学习中的基本概念。

代理(agent)在一个环境(environment)中执行动作/行为(action)。环境如何对代理的动作做出响应由一个已知或未知的模型(model)来定义。执行代理可以停留在环境中的某个状态(state) $s\in \mathcal{S}$,可以通过执行某个行为/动作(action) $a\in \mathcal{A}$来从一个状态$s$进入到另一个状态$s'$。代理会到达什么状态由状态转移概率$(P)$决定。代理执行了一个动作之后,环境会给出一定的奖励(reward) $r\in\mathcal{R}$作为反馈。

模型中定义了奖励函数和转移概率。模型的工作方式可以是已知的也可以是未知的:

  • 已知模型: 信息完备的规划。进行基于模型的强化学习。当我们拥有环境的全部信息时,我们可以通过动态规划(DP)来找到最优策略。还记得算法课上的"最长递增子序列""旅行商"问题吗?
  • 未知模型:仅通过部分信息进行学习。进行无模型强化学习,或先学习模型本身而后进行已知模型的强化学习。下面大多数场景中的模型都是未知的。

代理的策略(policy) $\pi(s)$以环境状态为输入,输出一个动作以指导代理获取最高的总收益。状态价值函数$V(s)$用于衡量在遵从某种策略的前提下,代理从状态$s$开始可以获取的累计收益的期望。换句话说,状态价值函数用于衡量某个状态好坏。在强化学习中,策略和价值函数都需要通过学习得到。

 

代理和环境之间的交互会生成一个行为、奖励的时间$t=1, 2, \ldots, T$序列数据。代理在策略执行过程中,不断积累环境知识、学习最优策略并决定下一步采取何种行为。我们将时刻$t$时的状态、行为和奖励分别标记为:$S_t, A_t, R_t$。每一轮(episode)的交互序列(trial/trajectory)表示为:

$$ S_1, A_1, R_2, S_2, A_2, \dots, S_T $$

算法分类(强化学习)常用术语:

  • 基于模型的: 依赖于环境模型;要么模型是已知的,要么可以通过算法来学习该模型
  • 无模型的: 训练过程中不依赖于模型
  • On-policy: 使用目标策略(target policy)采样得到的样本来进行训练
  • Off-policy: 使用行为策略(behavior policy)采样得到的样本进行训练

模型:状态转移和奖励

模型用于环境的描述。通过模型,我们可以学习或者推断环境如何与代理进行交互以及如何为代理提供反馈。模型有两个重要组成部分:状态转移函数$P$和奖励函数$R$。

假设我们当前在状态$s$,决定执行一个动作以进入下一个状态$s'$,并且获取相应的奖励$r$。我们称这一过程为一步转移,并使用元组$(s, a, s', r)$表示。

状态转移函数记录了在状态$s$下,执行动作$a$之后获取奖励$r$的概率。我们使用符号$\mathbb{P}$表示"概率"。

$$ P(s', r \vert s, a) = \mathbb{P} [S_{t+1} = s', R_{t+1} = r \vert S_t = s, A_t = a] $$

状态转移函数是$P(s', r|s, a)$的函数:

$$ P_{ss'}^a = P(s' \vert s, a) = \mathbb{P} [S_{t+1} = s' \vert S_t = s, A_t = a] = \sum_{r \in \mathcal{R}} P(s', r \vert s, a) $$

奖励函数给出执行某一个动作之后可以获得的奖励:

$$ R(s, a) = \mathbb{E} [R_{t+1} \vert S_t = s, A_t = a] = \sum_{r\in\mathcal{R}} r \sum_{s' \in \mathcal{S}} P(s', r \vert s, a) $$

策略

策略作为代理的行为函数(behavior function)$\pi$,告诉我们在状态$s$下采取何种行为。它是一个从状态$s$到一个动作$a$的映射,它可以是确定性的,也可以是随机的:

  • 确定性的:$\pi(s)=a$
  • 随机性的:$\pi(a|s)=\mathbb{P}_\pi [A=a|S=s]$

价值函数

价值函数用于衡量一个状态的好坏或定义如何奖励(状态,行为)对。未来的奖励(又称之为回报)定义为带衰减的后续奖励之和。从时刻$t$开始的回报计算公式为:

$$ G_t = R_{t+1} + \gamma R_{t+2} + \dots = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1} $$

衰减系数$\gamma \in [0, 1]$用来作为对于未来奖励的惩罚。因为:

  • 未来的奖励存在更多的不确定性;比如:股票市场
  • 未来的奖励不会提供直接的收益;(所以,现在很多年轻人提倡及时行乐)
  • 使用衰减系数有数学上的便利性;也就是,我们无需在乎太远将来的奖励(都被指数衰减掉了)
  • 使用了衰减系数,让我们无需担心状态转移图存在无限循环

某个状态$s$的状态价值是回报的期望值,设时刻$t$的状态$S_t=s$,那么状态价值函数表示为:

$$ V_\pi(s) = \mathbb{E}_\pi [G_t|S_t=s] $$

类似的,我们可以定义某个(状态,行为)对的行为价值函数("Q值";Q表示"Quality" ?)为:

$$ Q_{\pi}(s, a) = \mathbb{E}_{\pi}[G_t \vert S_t = s, A_t = a] $$

此外,由于我们遵循目标策略(target policy) $\pi$,我们可以使用行为的分布及行为价值函数$Q$来推得状态价值函数:

$$ V_{\pi}(s) = \sum_{a \in \mathcal{A}} Q_{\pi}(s, a) \pi(a \vert s) $$

行为价值函数和状态价值函数之差称为优势(advantage)函数 ($A$值):

$$ A_{\pi}(s, a) = Q_{\pi}(s, a) - V_{\pi}(s) $$

最优价值和策略

最优价值函数可以得到最大回报:

$$ V_{*}(s) = \max_{\pi} V_{\pi}(s), Q_{*}(s, a) = \max_{\pi} Q_{\pi}(s, a) $$

而采用最优策略可以得到最优价值函数:

$$ \pi_{*} = \arg\max_{\pi} V_{\pi}(s), \pi_{*} = \arg\max_{\pi} Q_{\pi}(s, a) $$

当然,我们就有$V_{\pi_{}}(s)=V_{}(s), Q_{\pi_{}}(s, a) = Q_{}(s, a)$。

马尔可夫决策过程

更正式地说,几乎所有的强化学习问题可以用马尔可夫决策过程(MDPs)来描述。MDP中所有的状态都具有“马尔可夫”性,也就是未来仅依赖于当前状态,而与历史状态无关:

$$ \mathbb{P}[ S_{t+1} \vert S_t ] = \mathbb{P} [S_{t+1} \vert S_1, \dots, S_t] $$

换句话说,在给定当前状态的条件下,未来与过去条件独立,也就是当前状态包含了决定未来所需的所有信息。

马尔可夫过程中代理与环境交互

马尔可夫过程由5个元素组成$\mathcal{M} = \langle \mathcal{S}, \mathcal{A}, P, R, \gamma \rangle$,其中符号含义与前一章节中介绍的概念一样:

  • $\mathcal{S}$ - 状态集合
  • $\mathcal{A}$ - 行为集合
  • $P$ - 转移概率函数
  • $R$ - 奖励函数
  • $\gamma$ - 未来奖励衰减系数。在一个未知的环境中,我们没有关于转移概率$P$和奖励$R$的全部信息

下图给出一个MDP的一个有趣的例子:一个典型的工作日(图片来源: [randomant.net/reinforcement-learning-concepts](https://randomant.net/reinforcement-learning-concepts/))。

一个典型的工作日

贝尔曼方程

贝尔曼方程指的是一系列的等式,它将价值函数分解为直接奖励加上衰减后的未来奖励。

$$ \begin{aligned} V(s) &= \mathbb{E}[G_t \vert S_t = s] \\ &= \mathbb{E} [R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \dots \vert S_t = s] \\ &= \mathbb{E} [R_{t+1} + \gamma (R_{t+2} + \gamma R_{t+3} + \dots) \vert S_t = s] \\ &= \mathbb{E} [R_{t+1} + \gamma G_{t+1} \vert S_t = s] \\ &= \mathbb{E} [R_{t+1} + \gamma V(S_{t+1}) \vert S_t = s] \end{aligned} $$

$Q$值的版本类似:

$$ \begin{aligned} Q(s, a) &= \mathbb{E} [R_{t+1} + \gamma V(S_{t+1}) \mid S_t = s, A_t = a] \\ &= \mathbb{E} [R_{t+1} + \gamma \mathbb{E}_{a\sim\pi} Q(S_{t+1}, a) \mid S_t = s, A_t = a] \end{aligned} $$

贝尔曼期望方程

迭代更新过程可以被进一步分解为基于状态和行为价值函数的一些等式。随着我们深入了解,我们可以使用策略$\pi$对$V, Q$进行扩展。

使用贝尔曼期望等式更新状态、行为价值函数

$$ \begin{aligned} V_{\pi}(s) &= \sum_{a \in \mathcal{A}} \pi(a \vert s) Q_{\pi}(s, a) \\ Q_{\pi}(s, a) &= R(s, a) + \gamma \sum_{s' \in \mathcal{S}} P_{ss'}^a V_{\pi} (s') \\ V_{\pi}(s) &= \sum_{a \in \mathcal{A}} \pi(a \vert s) \big( R(s, a) + \gamma \sum_{s' \in \mathcal{S}} P_{ss'}^a V_{\pi} (s') \big) \\ Q_{\pi}(s, a) &= R(s, a) + \gamma \sum_{s' \in \mathcal{S}} P_{ss'}^a \sum_{a' \in \mathcal{A}} \pi(a' \vert s') Q_{\pi} (s', a') \end{aligned} $$

贝尔曼最优方程

如果我们仅对最优值感兴趣,而不对某个策略的期望值感兴趣,那么我们可以在计算时仅选择价值函数的最大值。回顾一下:$V_$和$Q_$是我们能够获取的最高回报,在前面的章节有定义。

$$ \begin{aligned} V_*(s) &= \max_{a \in \mathcal{A}} Q_*(s,a)\\ Q_*(s, a) &= R(s, a) + \gamma \sum_{s' \in \mathcal{S}} P_{ss'}^a V_*(s') \\ V_*(s) &= \max_{a \in \mathcal{A}} \big( R(s, a) + \gamma \sum_{s' \in \mathcal{S}} P_{ss'}^a V_*(s') \big) \\ Q_*(s, a) &= R(s, a) + \gamma \sum_{s' \in \mathcal{S}} P_{ss'}^a \max_{a' \in \mathcal{A}} Q_*(s', a') \end{aligned} $$

不出所料,这些等式和贝尔曼期望方程看起来形式上很像。

如果我们有环境的完整信息,那么问题就会转变成一个可以使用DP解决的规划问题。不幸的是,在大多数情况下,我们并不知道$P_{ss'}^a$或$R(s, a)$。虽然我们无法直接使用贝尔曼方程来解决MDPs问题,但它是许多强化学习算法的理论基础。

常见方法

现在是时候看看解决强化学习问题的主要及经典的算法了。

动态规划(Dynamic-Programming, DP)

当模型是完全已知的时候,使用贝尔曼方程,我们可以直接应用动态规划来迭代计算价值函数、并进行策略改进。

策略评估

对于给定的策略$\pi$,策略评估 用于计算状态价值函数:

$$ V_{t+1}(s) = \mathbb{E}_\pi [r + \gamma V_t(s') | S_t = s] = \sum_a \pi(a \vert s) \sum_{s', r} P(s', r \vert s, a) (r + \gamma V_t(s')) $$

策略改进

基于价值函数,策略改进 通过更贪婪的行为生成更好的策略$\pi^\prime \ge \pi$。

$$ Q_\pi(s, a) = \mathbb{E} [R_{t+1} + \gamma V_\pi(S_{t+1}) \vert S_t=s, A_t=a] = \sum_{s', r} P(s', r \vert s, a) (r + \gamma V_\pi(s')) $$

策略迭代

一般策略迭代 (Generalized Policy Iteration, GPI)算法指的是一个改进策略的迭代过程,它将策略评估和策略改进相结合:

$$ \pi_0 \xrightarrow[]{\text{evaluation}} V_{\pi_0} \xrightarrow[]{\text{improve}} \pi_1 \xrightarrow[]{\text{evaluation}} V_{\pi_1} \xrightarrow[]{\text{improve}} \pi_2 \xrightarrow[]{\text{evaluation}} \dots \xrightarrow[]{\text{improve}} \pi_* \xrightarrow[]{\text{evaluation}} V_* $$

在GPI中,价值函数通过重复地迭代来不断接近当前策略的实际值。与此同时,策略也在此过程中不断接近最优策略。策略迭代可以很好地工作,并且总是可以收敛到最优,但为什么会这样呢?

假设我们有一个策略$\pi$,我们使用贪婪方式$\pi'(s) = \arg\max_{a \in \mathcal{A}} Q_\pi(s, a)$生成一个更优的策略$\pi'$。这个改进的策略$\pi'$可以确保更好,因为:

$$ \begin{aligned} Q_\pi(s, \pi'(s)) &= Q_\pi(s, \arg\max_{a \in \mathcal{A}} Q_\pi(s, a)) \\ &= \max_{a \in \mathcal{A}} Q_\pi(s, a) \geq Q_\pi(s, \pi(s)) = V_\pi(s) \end{aligned} $$

蒙特卡洛(Monte-Carlo, MC)方法

首先,我们回顾一下$V(s) = \mathbb{E}[ G_t \vert S_t=s]$。蒙特卡洛(MC)方法使用一个简单的思想:它从过往每轮的经验中学习而对环境中的动态变化不关心,此外,它还通过计算所观察到样本的平均值作为实际期望收益的近似。为了计算经验(empirical)回报$G_t$,MC方法需要从完整的一轮样本$S_1, A_1, R_2, \dots, S_T$来计算回报$G_t = \sum_{k=0}^{T-t-1} \gamma^k R_{t+k+1}$,并且所有轮数据的最终状态必须为终止态。

状态$s$的经验均值收益为:

$$ V(s) = \frac{\sum_{t=1}^T \mathbb{1}[S_t = s] G_t}{\sum_{t=1}^T \mathbb{1}[S_t = s]} $$

其中$\mathbb{1}[S_t=s]$是二值指示函数。我们可以对所有状态数据进行一轮遍历,计算状态$s$出现的次数 ("每次访问"模式);或者我们可以在一轮数据中只使用首次遍历到的状态$s$("首次访问模式")。这种近似方式很容易扩展到Q值函数中:

$$ Q(s, a) = \frac{\sum_{t=1}^T \mathbb{1}[S_t = s, A_t = a] G_t}{\sum_{t=1}^T \mathbb{1}[S_t = s, A_t = a]} $$

为了通过MC方法来学习最优策略,我们可以通过如下类似GPI的迭代方式进行计算。

MC迭代

  1. 使用当前价值函数,通过贪婪法改进策略:$\pi(s) = \arg\max_{a \in \mathcal{A}} Q(s, a)$
  2. 使用策略$\pi$生成新一轮数据(可以使用$\epsilon\text{-}greedy$方式平衡探索和利用)
  3. 使用新一轮数据预测$Q$值:$q_\pi(s, a) = \frac{\sum_{t=1}^T \big( \mathbb{1}[S_t = s, A_t = a] \sum_{k=0}^{T-t-1} \gamma^k R_{t+k+1} \big)}{\sum_{t=1}^T \mathbb{1}[S_t = s, A_t = a]}$

时差(Temporal-Difference, TD)学习

与蒙特卡洛方法类似,时差(TD)学习是一个无模型方法,它从每轮的经验数据中学习。不同的是,TD学习可以从不完整的一轮数据中学习,因此我们无需让代理一直执行到环境为终止态。TD学习是如此重要,以至于Sutton & Barto (2017)在他们的RL教材中有如下描述:

one idea ... central and novel to reinforcement learning.

提升法(Bootstrapping)

TD学习与MC方法不太一样,MC方法依赖于实际奖励和完整的回报来更新目标,而TD则根据现有估计更新目标。这种方法被称为提升法

值预测

TD学习中的核心思想就是更新价值函数$V(S_T)$来接近回报估计$R_{t+1} + \gamma V(S_{t+1})$ (广为人知的TD目标)。更新的幅度由学习率参数$\alpha$控制:

$$ \begin{aligned} V(S_t) &\leftarrow (1- \alpha) V(S_t) + \alpha G_t \\ V(S_t) &\leftarrow V(S_t) + \alpha (G_t - V(S_t)) \\ V(S_t) &\leftarrow V(S_t) + \alpha (R_{t+1} + \gamma V(S_{t+1}) - V(S_t)) \end{aligned} $$

类似地,对于行为价值函数估计:

$$ Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha (R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t)) $$

下面,我们深入探讨如何在TD学习(又叫TD控制 "TD control")中学习最优策略。做好准备,在本节中你会看到许多经典算法的名称。

SARSA: On-Policy TD 控制

"SARSA"指的是更新$Q$值过程中使用的一个序列$\dots, S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}, \dots$(首字母为 S, A, R, S, A)。该算法的思想与GPI差不多,在每一轮中,它的工作流程如下:

  1. 初始化$t=0$
  2. 从状态$S_0$开始,选择一个行为$A_0=\arg\max_{a\in A}Q(S_0, a)$,这里经常使用$\epsilon\text{-}greedy$方法
  3. 在时刻$t$,执行完行为$A_t$之后,我们可以得到奖励$R_{t+1}$,并且进入到下一个状态$S_{t+1}$
  4. 使用类似第二步中的方法选择下一个行为:$A_{t+1}=\arg\max_{a\in A}Q(S_{t+1}, a)$
  5. 更新Q值函数:$Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha (R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t))$
  6. 设置$t=t+1$,返回步骤 $3$

Q-learning: Off-Policy TD 控制

在强化学习的早期,Q-learning的发展是一个突破。在每轮中,Q-learning的工作流程如下:

  1. 初始化$t=0$
  2. 从初始状态$S_0$开始
  3. 在时刻$t$,我们根据Q值来选择一个行为:$A_t = \arg \max_{a\in A} Q(S_t, a)$,这里经常使用$\epsilon\text{-}greedy$方法
  4. 执行行为$A_t$后,进入下一个状态$S_{t+1}$,并且得到奖励$R_{t+1}$
  5. 更新Q值函数:$Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha (R_{t+1} + \gamma \max_{a \in \mathcal{A}} Q(S_{t+1}, a) - Q(S_t, A_t))$
  6. 设置$t=t+1$,返回步骤$3$

Q-learning和SARSA的关键不同是,Q-learning不使用当前策略来选择下一步的行为$A_{t+1}$。它使用当前$Q$函数的最优值来预测$Q^*$,哪一个行为($a^$)会带来这个最优$Q$值不重要,而且在Q-learning的下一步中$a^$也并不一定会被执行。

Q-learning 和 SARSA 对比

Deep Q-Network

理论上来说,在Q-learning中,我们可以将所有状态-行为对的$Q_*(\cdot)$保存起来,比如我们有一个非常大的表格。但是,当状态和行为空间非常大的时候,计算量就会迅速变得很大,使用表格来存储几乎不可行。在这种情况下,研究人员们提出使用函数(通常用一个机器学习模型)来近似$Q$值。这个方法被称作函数拟合,我们将$Q$值函数标记为$Q(s, a; \theta)$。

不幸的是,Q-learning非线性$Q$值函数拟合以及提升法 结合使用时,会出现不稳定和收敛性问题。

Deep Q-Network ("DQN"; Mnih 等人. 2015)的目的在于大幅改善和稳定Q-learning的训练,DQN中使用了两个创新机制:

  • 经验重放(Experience Replay):每轮轮中的每一步数据$e_t=(S_t, A_t, R_t, S_{t+1})$被存储在一个重放缓冲区$D_t={e_1, \dots, e_t}$中($D_t$中会包含许多轮数据)。在Q-learning的更新阶段,样本从回放缓冲区中随机采样出来,每个样本都可以被使用很多次。经验回放可以改善数据效率,消除所观察到序列间的相关性,并且平滑数据分布的变化。
  • 阶段目标更新(Periodically Update Target):$Q$值的优化目标是周期性更新的,$Q$网络每$C$步都会被复制并冻结作为优化目标。阶段目标更新克服了短期震荡问题,可以让训练更加稳定。

损失函数如下:

$$ \mathcal{L}(\theta) = \mathbb{E}_{(s, a, r, s') \sim U(D)} \Big[ \big( r + \gamma \max_{a'} Q(s', a'; \theta^{-}) - Q(s, a; \theta) \big)^2 \Big] $$

其中$U(D)$是回放缓冲$D$上的均匀分布。$\theta^{-}$是被冻结$Q$网络的参数。

此外,人们发现将误差截断到$[-1, 1]$之间会很有用(我对参数截断总是不太感冒,许多研究都表明从经验上看这个方法有用,但是它让数学变得不那么完美)。

DQN算法(结合经验回放和冻结优化目标)

现在已经有许多原版DQN的改进算法,比如对偶架构的DQN(Wang et al. 2016),它通过共享网络参数来估计状态价值函数$V(s)$和优势函数$A(s, a)$。

结合TD和MC学习

在先前章节TD学习的值估计中,我们计算TD目标值时仅跟踪了向前一步($t+1$)的动作。我们很容易可以将其扩展到使用向前多步($t+i, (i\gt 1)$)的数据来估计收益。

记向前$n$步的估计收益标记为$G_t^{(n)}, n=1, \dots, \infty$,则有:

n $G_t$ 说明
$ n=1 $ $G_t^{(1)} = R_{t+1} + \gamma V(S_{t+1})$ TD 学习
$ n=2 $ $G_t^{(2)} = R_{t+1} + \gamma R_{t+2} + \gamma^2 V(S_{t+2})$  
$\dots$    
$ n=n $ $G_t^{(n)} = R_{t+1} + \gamma R_{t+2} + \dots + \gamma^{n-1} R_{t+n} + \gamma^n V(S_{t+n})$  
$\dots$    
$n=\infty$ $G_t^{(\infty)} = R_{t+1} + \gamma R_{t+2} + \dots + \gamma^{T-t-1} R_T + \gamma^{T-t} V(S_T)$ MC估计

改进后的$n$步TD学习算法仍然具有同样形式的值函数更新规则:

$$ V(S_t) \leftarrow V(S_t) + \alpha (G_t^{(n)} - V(S_t)) $$

TD lambda

在TD学习中,我们可以自由选择$n$,问题是最优的$n$是什么?哪一个$G_t^{(n)}$能给出最优的近似收益?一个常见并且明智的解决方案是使用所有可能的$n$步TD值的加权平均而不是某个特定的$n$值。对于向前$n$步的收益,我们可以给其添加一个衰减系数$\lambda^{n-1}$。这和我们在计算期望收益时使用衰减系数一样:直觉上距离现在越远,不确定性越大。为了让所有权重之和为1,我们在每个权重前面乘上$(1-\lambda)$,因为:

$$ \begin{aligned} \text{设 } S &= 1 + \lambda + \lambda^2 + \dots \\ S &= 1 + \lambda(1 + \lambda + \lambda^2 + \dots) \\ S &= 1 + \lambda S \\ S &= 1 / (1-\lambda) \end{aligned} $$

我们称这个$n$步收益的加权求和为$\lambda$收益 $G_t^\lambda=(1-\lambda)\sum_{n=1}^\infty\lambda^{n-1}G_t^{(n)}$。如果我们使用$\lambda$收益作为TD学习中的值更新方法,我们称这个方法为$TD(\lambda)$。我们之前介绍TD学习的原始版本相当于$TD(0)$。

状态价值函数计算方式对比:MC vs TD vs DP

策略梯度

我们上面介绍的所有算法的目标都在于学习状态或行为价值函数,然后再根据价值函数来选择相应的行为。而策略梯度算法直接学习策略本身,一般策略会有一个参数$\theta$,策略表示为$\pi(a|s;\theta)$。我们定义奖励函数(与损失函数相反)为期望回报,算法的目标是最大化奖励函数。

在离散空间内:

$$ \mathcal{J}(\theta) = V_{\pi_\theta}(S_1) = \mathbb{E}_{\pi_\theta}[V_1] $$

其中$S_1$为初始状态。

在连续空间内:

$$ \mathcal{J}(\theta) = \sum_{s \in \mathcal{S}} d_{\pi_\theta}(s) V_{\pi_\theta}(s) = \sum_{s \in \mathcal{S}} \Big( d_{\pi_\theta}(s) \sum_{a \in \mathcal{A}} \pi(a \vert s, \theta) Q_\pi(s, a) \Big) $$

其中$d_{\pi_\theta}(s)$为$\pi_\theta$所决定的马尔可夫链的平稳分布。如果你对“平稳分布“不熟悉,可以参考这个

使用梯度提升算法,我们可以找到最优的参数$\theta$。由于连续空间有无限个状态和行为,基于值的方法计算量太大,我们自然会希望策略梯度算法会在连续空间内工作得更好。

策略梯度理论

从计算角度来讲,梯度的计算可以将参数扰动一个微小的值来计算,这个方法甚至可以在$J(\theta)$不可导的时候工作,但显然这个方法非常慢。

$$ \frac{\partial \mathcal{J}(\theta)}{\partial \theta_k} \approx \frac{\mathcal{J}(\theta + \epsilon u_k) - \mathcal{J}(\theta)}{\epsilon} $$

从分析的角度来说:

$$ \mathcal{J}(\theta) = \mathbb{E}_{\pi_\theta} [r] = \sum_{s \in \mathcal{S}} d_{\pi_\theta}(s) \sum_{a \in \mathcal{A}} \pi(a \vert s; \theta) R(s, a) $$

我们使用$d_\pi(.)$来替换$d(.)$有非常好的理论支撑:

$$ \mathcal{J}(\theta) = \sum_{s \in \mathcal{S}} d_{\pi_\theta}(s) \sum_{a \in \mathcal{A}} \pi(a \vert s; \theta) Q_\pi(s, a) \propto \sum_{s \in \mathcal{S}} d(s) \sum_{a \in \mathcal{A}} \pi(a \vert s; \theta) Q_\pi(s, a) $$

查看 Sutton & Barto (2017) 的13.1章查看原因。

这样,我们有:

$$ \begin{aligned} \mathcal{J}(\theta) &= \sum_{s \in \mathcal{S}} d(s) \sum_{a \in \mathcal{A}} \pi(a \vert s; \theta) Q_\pi(s, a) \\ \nabla \mathcal{J}(\theta) &= \sum_{s \in \mathcal{S}} d(s) \sum_{a \in \mathcal{A}} \nabla \pi(a \vert s; \theta) Q_\pi(s, a) \\ &= \sum_{s \in \mathcal{S}} d(s) \sum_{a \in \mathcal{A}} \pi(a \vert s; \theta) \frac{\nabla \pi(a \vert s; \theta)}{\pi(a \vert s; \theta)} Q_\pi(s, a) \\ & = \sum_{s \in \mathcal{S}} d(s) \sum_{a \in \mathcal{A}} \pi(a \vert s; \theta) \nabla \ln \pi(a \vert s; \theta) Q_\pi(s, a) \\ & = \mathbb{E}_{\pi_\theta} [\nabla \ln \pi(a \vert s; \theta) Q_\pi(s, a)] \end{aligned} $$

这个结果我们称之为"策略梯度定理",这个定理是各类策略梯度算法的理论基石:

$$ \nabla \mathcal{J}(\theta) = \mathbb{E}_{\pi_\theta} [\nabla \ln \pi(a \vert s, \theta) Q_\pi(s, a)] $$

REINFORCE

REINFORCE也被人们称为蒙特卡洛策略梯度,它依赖于使用MC方法得到的回报估计值$Q_\pi(s, a)$来更新梯度参数$\theta$。

一个常用的REINFORCE的变体是从收益$G_t$中减去一个基线值来降低梯度估计的方差(这个做法是无偏的)。比如:一个常用的基线值是状态价值函数,如果我们使用此基线值,那么在梯度提升算法中我们就可以使用$A(s, a)=Q(s, a)-V(s)$(来替换$Q$值)。

  1. 随机初始化参数$\theta$
  2. 生成一轮数据$S_1, A_1, R_2, S_2, A_2, \dots, S_T$
  3. 对于 t = 1, 2, ..., t:
    1. 计算由时刻$t$开始的回报估计$G_t$
    2. $\theta \leftarrow \theta + \alpha \gamma^t G_t \nabla \ln \pi(A_t \vert S_t, \theta)$

Actor-Critic

如果除了策略之外,在训练过程中还需要学习价值函数,那么我们就有了Actor-Critic 算法。

  • Critic: 用于更新价值函数参数$w$,根据不同的算法它可以是行为价值函数$Q(a|s;w)$,也可以是状态价值函数$V(s;w)$
  • Actor: 用于更新策略函数$\pi(a|s;\theta)$的参数$\theta$

我们看下基于行为价值函数的actor-critic算法是如何工作的。

  1. 随机初始化$s, \theta, w$;采样$a\sim \pi(a|s; \theta)$
  2. 对于 t = 1, ..., T:
    1. 采样奖励$r_t \sim R(s, a)$,采样下一个状态$s' \sim P(s' \vert s, a)$
    2. 采样下一个行为 $a' \sim \pi(s', a'; \theta)$
    3. 更新策略参数:$\theta \leftarrow \theta + \alpha_\theta Q(s, a; w) \nabla_\theta \ln \pi(a \vert s; \theta)$
    4. 计算时刻$t$时,行为价值函数的修正值:$G_{t:t+1} = r_t + \gamma Q(s', a'; w) - Q(s, a; w)$,并且用此更新价值函数参数:$w \leftarrow w + \alpha_w G_{t:t+1} \nabla_w Q(s, a; w)$
    5. 设置$a \leftarrow a', s \leftarrow s'$

$\alpha_\theta, \alpha_w$为策略函数和价值函数相应的学习率。

A3C

A3C (Asynchronous Advantage Actor-Critic) 是一个经典的策略梯度算法,它的关注点在于并行训练。

在A3C中,critics学习状态价值函数 $V(s;w)$,多个actors并行进行训练并且不断与全局参数进行同步。默认情况下,A3C可以很好地进行并行训练,比如在一个多核CPU上进行训练。

状态价值函数的损失函数使用的是均方误差损失 $\mathcal{J}_v (w) = (G_t - V(s; w))^2$,可以使用梯度下降算法来优化参数$w$。状态价值函数的值被用于策略梯度更新时的基线值。

算法大纲如下:

  1. 设定全局参数$\theta, w$,以及各个线程特定的参数:$\theta', w'$
  2. 初始化时间 $t=1$
  3. 当 $T \le T_{MAX}$:
    1. 重置梯度:$d\theta = 0, dw=0$
    2. 使用全局参数初始化线程参数:$\theta' = \theta, w'=w$
    3. 设置$t=t_{start}$,获取$s_t$
    4. 当 $s_t$为非终止态 且 $(t - t_{start} \le t_{max})$:
      1. 选择行为 $a_t \sim \pi(a_t|s_t; \theta')$,获得奖励$r_t$并进入下一个新状态$s_{t+1}$
      2. $t = t+1, T=T+1$
    5. 初始化收益估计变量:$R = \begin{cases} 0 & \text{如果} s_t \text{为终止态} \\ V(s_t; w') & \text{其它} \end{cases}$
    6. For $i=t-1, \dots, t_{start}$:
      1. $R \leftarrow r_i + \gamma R$;这里$R$是使用MC方法得到的$G_t$
      2. 计算累计梯度 $d\theta$:$d\theta \leftarrow d\theta + \nabla_{\theta'} \log \pi(a_i \vert s_i; \theta')(R - V(s_i; w'))$

计算累计梯度 $dw$:$dw \leftarrow dw + \nabla_{w'} (R - V(s_i; w'))^2$7. 使用$d\theta$更新$\theta$,使用$dw$更新$w$

A3C支持多代理并行训练,上面步骤6.2可以看作的基于mini-batch的随机梯度更新的一个变体:参数$w, \theta$在每个训练线程给出的梯度方向上更新一点点。

进化方法(Evolution Strategies, ES)

ES是一种模型无关的优化方法,它通过模仿达尔文进化论的自然选择来学习最优解。使用ES方法,我们无需知道环境的配置,但是需要满足两个条件:(1) 我们的解决方案可以自由地与环境交互,以观察它们是否能解决问题;(2) 我们能够为每个解决方案计算一个适应值(fitness score)。

假设我们以一组随机初始化的解决方案开始,所有的解决方案都可以与环境进行交互,但是仅有适应值比较高的候选方案才能进入下一轮。下一代的解决方案通过对候选方案进行重组(基因突变)来产生。这个过程不断重复直到找到足够好的解决方案。

和我们前面介绍的基于MDP方法非常不同的是,ES学习最优策略参数的过程中无需拟合价值函数。假设策略参数分布为$F(\theta)$,参数$\theta$服从均值为$\mu$,协方差为$\sigma^2I$的多变量联合高斯分布。$F(\theta)$的梯度计算方法为:

$$ \begin{aligned} & \nabla_\theta \mathbb{E}_{\theta \sim N(\mu, \sigma^2)} F(\theta) \\ =& \nabla_\theta \int_\theta F(\theta) \Pr(\theta) && \text{; Pr(.)为高斯概率密度函数} \\ =& \int_\theta F(\theta) \Pr(\theta) \frac{\nabla_\theta \Pr(\theta)}{\Pr(\theta)} \\ =& \int_\theta F(\theta) \Pr(\theta) \nabla_\theta \log \Pr(\theta) \\ =& \mathbb{E}_{\theta \sim N(\mu, \sigma^2)} [F(\theta) \nabla_\theta \log \Pr(\theta)] && \text{; 和策略梯度算法更新方法类似} \\ =& \mathbb{E}_{\theta \sim N(\mu, \sigma^2)} \Big[ F(\theta) \nabla_\theta \log \Big( \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(\theta - \mu)^2}{2 \sigma^2 }} \Big) \Big] \\ =& \mathbb{E}_{\theta \sim N(\mu, \sigma^2)} \Big[ F(\theta) \nabla_\theta \Big( -\log \sqrt{2\pi\sigma^2} - \frac{(\theta - \mu)^2}{2 \sigma^2} \Big) \Big] \\ =& \mathbb{E}_{\theta \sim N(\mu, \sigma^2)} \Big[ F(\theta) \frac{\theta - \mu}{\sigma^2} \Big] \end{aligned} $$

我们可以将上面的公式使用一个新的“平均”参数$\theta$(与上面的$\theta$不一样,这里的$\theta$用作后面基因突变的基础基因)以及一个扰动参数$\epsilon \sim N(0, I)$重写,这样我们有$\theta + \epsilon \sigma \sim N(\theta, \sigma^2)$。$\epsilon$控制了使用多少高斯噪声来创建下一代突变方案:

$$ \nabla_\theta \mathbb{E}_{\epsilon \sim N(0, I)} F(\theta + \sigma \epsilon) = \frac{1}{\sigma} \mathbb{E}_{\epsilon \sim N(0, I)} [F(\theta + \sigma \epsilon) \epsilon] $$

下图展示了一个简单的基于并行进化策略的强化学习算法。所有worker并行工作,并共享随机数种子,这样就可以使用极低的通信量来重建高斯噪声(图片来源: Slimans et al. 2017)。

并行ES算法

ES是解决RL问题的一类黑盒优化算法(在文章的初版中,我使用了“一个非常漂亮的可选方案”这种表述方法;Seita建议我看这个讨论,后来我修改了我的措辞)。这个方法有很多好的特性(Salimans et al., 2017),比如它训练快而且简单:

  • ES 无需进行价值函数拟合
  • ES 无需进行梯度反向传播
  • ES 不受延迟奖励或者长期奖励的影响
  • ES 可以进行大规模并行并且仅需极少的通信量

已知问题

探索 (exploration) vs 利用 (exploitation)

探索和利用之间的矛盾在我之前的文章中已经讨论过了。在我们面临一个未知环境的时候,处理好这个矛盾是我们找到一个好的解决方案的关键:没有足够的探索,我们无法对环境有一个足够的了解;没有足够的利用,我们无法完成优化任务。

不同的强化学习算法会使用不同的方式在探索与利用之间进行平衡。在MC、Q-learning以及许多on-policy的算法中,探索通常通过$\epsilon\text{-}greedy$方法来实现;在ES算法中,探索通过策略参数的扰动来控制。

我们在设计新的强化学习算法时,应该把这个问题考虑在内。

死亡三角问题

我们一直在寻求将bootstrapping融入到TD方法后可以保持高效性与灵活性的方法。但是,当我们将off-policy、非线性函数拟合以及bootstrapping方法组合在一个强化学习算法中使用时,训练会变得很不稳定并且很难收敛。这个问题被称为死亡三角 问题。许多使用深度学习模型的架构被提出来用于解决此问题,例如利用经验回放以及目标网络冻结来稳定训练的DQN。

案例分析:AlphaGo Zero

近几十年来围棋一直是人工智能领域里的一个棘手问题。AlphaGo和AlphaGo Zero是由DeepMind团队开发的两个程序。它们都使用了深度卷积神经网络和蒙特卡洛搜索树(MCTS),这两个程序都达到了专业围棋选手的水平。AlphaGo使用专家对弈的棋局进行监督学习训练,而AlphaGo Zero不依赖于人类对弈的棋谱,仅需基于围棋的基本规则来进行自我对弈来进行强化学习。

下图给出了一个围棋棋盘。对弈双方分别执黑子和白子在一个$19\times 19$的棋盘上交替落子。具体围棋规则大家可自行搜索。

围棋棋盘

使用我们上面介绍的所有强化学习知识,我们来看下AlphaGo Zero是如何工作的。AlphaGo Zero的一个主要的部分是一个基于棋盘表征的深度卷积神经网络(更精确地说,是一个使用batch normalization和ReLU的残差网络)。这个网络输出两个值:

$$ (p, v) = f_\theta(s) $$

其中:

  • $s$ : 棋盘的配置,$19\times 19 \times 17$堆叠的特征层;每个落子点有17个特征:己方的8个特征+对手的8个特征+1个表示棋子颜色的特征(1=黑,0=白)。(由于程序需要进行自我对弈,并且己方选手和对手间的位置会不断进行切换,因此我们需要对棋子颜色进行特定编码)
  • $p$ : 选择落子($19\times 19$个位置)或者认输的概率
  • $v$ : 当前选手的胜率

在自我对弈的过程中,MCTS不断改进行为概率分布$\pi \sim p(.)$,然后通过这个改进后的策略来对行为$a_t$进行采样。奖励$z_t$为$0, 1$,它用于指示当前选手最终是否会赢得对弈。每次落子会产生一个三元组$(s_t, \pi_t, z_t)$,该三元组会被保存在重放缓冲区中。由于这篇文章的长度限制,MCTS的细节这里就不再介绍了,感兴趣的同学可以阅读原始论文

AlphaGo Zero训练

神经网络使用回放缓冲区中的样本来训练,训练目标为最小化如下损失函数:

$$ \mathcal{L} = (z - v)^2 - \pi^\top \log p + c \| \theta \|^2 $$

其中$c$是一个控制L2惩罚项的超参数(用于防止过拟合)。

AlphaGo Zero简化了AlphaGo算法,删除了其中监督学习的部分,并且将原本分离的策略网络与价值网络合并。结果表明AlphaGo Zero的表现更佳,并且训练时间更短。我强烈推荐阅读这两篇论文来比较他们之间的差别,非常有意思。

我知道这篇文章很长,希望它值得这么长。如果你发现了一些错误,可以通过邮箱联系我 [lilian dot wengweng at gmail dot com]。下篇文章见!:)

引用

[1] Yuxi Li. Deep reinforcement learning: An overview. arXiv preprint arXiv:1701.07274. 2017.

[2] Richard S. Sutton and Andrew G. Barto. Reinforcement Learning: An Introduction; 2nd Edition. 2017.

[3] Volodymyr Mnih, et al. Asynchronous methods for deep reinforcement learning. ICML. 2016.

[4] Tim Salimans, et al. Evolution strategies as a scalable alternative to reinforcement learning. arXiv preprint arXiv:1703.03864 (2017).

[5] David Silver, et al. Mastering the game of go without human knowledge. Nature 550.7676 (2017): 354.

[6] David Silver, et al. Mastering the game of Go with deep neural networks and tree search. Nature 529.7587 (2016): 484-489.

[7] Volodymyr Mnih, et al. Human-level control through deep reinforcement learning. Nature 518.7540 (2015): 529.

[8] Ziyu Wang, et al. Dueling network architectures for deep reinforcement learning. ICML. 2016.

[9] Reinforcement Learning lectures by David Silver on YouTube.

[10] OpenAI Blog: Evolution Strategies as a Scalable Alternative to Reinforcement Learning

[11] Frank Sehnke, et al. Parameter-exploring policy gradients. Neural Networks 23.4 (2010): 551-559.

[12] Csaba Szepesvári. Algorithms for reinforcement learning. 1st Edition. Synthesis lectures on artificial intelligence and machine learning 4.1 (2010): 1-103.