九、综合规划和学习
本书中反复出现的一个主题是,分别研究不同的主题,然后一起学习。我们首先在第三章看了基于模型的算法。使用这种设置,我们知道代理在其中操作的世界的模型动态。代理使用模型动力学知识和贝尔曼方程首先执行评估/预测任务,以学习状态或状态-动作值。然后,它通过改进策略来获得最佳行为,这被称为策略改进/策略迭代。一旦我们知道了模型,我们就可以提前计划执行评估/改进步骤。这被称为计划阶段。
在第四章中,我们从探索无模型机制开始。无模型意味着我们不知道模型。我们通过与模型互动来学习模型。我们称之为学习。在无模型设置中,我们分别研究了蒙特卡罗(MC)和时间差分(TD)方法。我们比较了使用这两种方法的优缺点。接下来,我们使用 n 步和资格追踪将 MC 和 TD 合并成一个统一的方法。
在第六章中,我们使用函数近似和深度学习将第四章的方法扩展到非表格连续空间大规模问题。第 3 至 6 章中涵盖的所有方法被称为基于值的方法,其中状态或状态动作值被学习,然后使用这些学习的状态/状态动作值进行策略改进。
第七章关注的是另一种方法,即基于政策的方法。这种方法意味着直接学习最优策略,而不经过学习状态/动作值的中间步骤。最初,它给人一种基于价值和基于政策的方法截然不同的印象。然而,就像在资格追踪下将 MC 和 TD 结合成一个一样,在第八章中,我们结合了基于价值的 Q 学习和政策学习,以在行动者-批评家(AC)方法下获得两个世界的最佳效果,如 DDPG、TD3 和 SAC。
在这一章中,我们将结合基于模型的方法和无模型的方法,通过利用两者的优点,使我们的算法更强大,样本效率更高。这是本章的重点。
我们还将更详细地研究探索-开发的困境,而不仅仅是盲目地遵循贪婪的政策。我们将着眼于更简单的设置,以更好地理解探索-开发的困境。接下来将深入探讨一种“引导式前瞻树搜索方法”,称为蒙特卡罗树搜索 (MCTS)。
基于模型的强化学习
什么是无模型 RL?在无模型 RL 中,我们不知道模型。相反,我们通过让代理与环境交互来学习价值函数和/或策略,即通过经验学习。这就是我们在本书第 4 到 8 章中看到的。相比之下,我们现在谈论的基于模型的 RL 是通过让代理与环境交互来学习模型的 RL,即,再次通过经验学习。学习到的模型被用来计划价值函数和政策——类似于我们在第三章中看到的内容。在第三章中,我们假设了模型的先验知识,我们也假设它是完美的。然而,在基于模型的 RL 中,我们学习模型,然后使用该知识。但是,知识可能是不完整的;换句话说,我们可能不知道确切的转移概率或奖励的完全分布。当代理人与环境互动时,我们学习我们所经历的系统动力学的一部分。我们的知识是基于有限的相互作用,因此没有涵盖所有可能性的详尽的相互作用,我们对模型的知识是不完整的。
我们这里的模型是什么意思?这意味着要有转移概率的估计P(st, a t )和报酬R(st, a t )。主体与世界/环境相互作用,形成对世界的印象。形象地说,可如图 9-1 所示。
图 9-1
基于模型的强化学习。代理根据其与环境的交互来学习模型,然后将该模型用于规划
优点是学习变得高效。与无模型方法相比,我们可以使用学习到的模型来有效地进行计划。此外,模型交互就是在状态 s t 时采取一个动作 a t ,并观察下一个状态st+1的结果和奖励rt+1。我们可以使用监督学习机器从与现实世界的交互中学习,其中给定( s t , a t )是样本输入,st+1和/或rt+1
)
-
)
- : :
)
像任何其他常规的监督机器学习设置一样,我们可以从代理从其与环境的交互中收集的先前样本中学习。
-
学习 s t ,at→rt+1是一个损失类似均方损失的回归问题。
-
学习跃迁动力学st,at→st+1是一个密度估计问题。我们可以学习离散的分类分布、高斯分布或高斯模型参数的混合。该损失可能是 KL-divergence 损失。
如果我们将学习扩展到贝叶斯学习,那么我们也可以对模型不确定性进行推理,即,我们对所学习的模型转换和奖励函数有多确定或不确定。贝叶斯学习方法产生的不仅仅是点估计,而是估计的整体分布,这使我们有能力对估计的强度进行推理。估计值的窄概率分布意味着大部分概率以峰值为中心;也就是说,我们对估计有很强的信心。相反,估计值的广泛分布反映了估计值的较高不确定性。
然而,生活中没有免费的东西。首先学习模型的不完美表示,然后使用该不完美表示来计划或寻找最优策略的这种两步方法引入了两个误差源。首先,我们对模型动力学的了解可能是不准确的。第二,从不完善的模型中学习一个价值函数可能有其自身的不准确性。
学习到的模型可以表示为“查表”(类似于我们在第 2 和 3 章中看到的)、线性期望模型或线性高斯模型。甚至可以有更复杂的模型表示,如高斯过程模型或深度信任网络模型。这取决于问题的性质、数据收集的难易程度等。决定正确的表示需要领域专业知识。让我们看一个学习表查找模型的简单例子。
首先,我们看一下我们将用来学习奖励和转换动态的表达式。这是一个简单的平均方法,我们将在这里使用。为了估计转移概率,我们取转移次数的平均值( s t ,at)→st+1)并除以代理人在( s t ,中看到自己的总次数
9.1
这里,是一个指标函数。当括号内的条件为真时,指示符函数取值 1,否则取值 0。总之,该指示器功能是计数( s , a )导致转换到下一个状态的次数,St+1=S’。
同样,我们也可以将奖励学习定义为平均值。
(9.2)
让我们看一个简单的环境,其中只有两种状态,我们观察一组(八个)代理与环境的交互。我们假设不贴现,即 γ = 1。
假设我们看到( A ,0, B ,0)。这意味着代理从状态 A 开始,观察到奖励为零,并看到自己处于状态 B,然后奖励再次为 0,最后转换到终止状态。
假设代理收集的八个转换/交互如下:
a,0,B,0
b,1
b,1
b,1
b,1
b,1
b,1
b,0
我们应用方程( 9.1 )和( 9.2 )构建模型如下:
-
我们只看到一个从 A 到 B 的转变,我们得到的回报是 0。于是,我们得出结论: P ( B | A )为 1, R ( 状态 = A ) = 0。请注意,在前面的例子中,为了简单起见,我们没有明确显示动作。你可以认为这是在每个州采取随机行动,也可以认为这是马尔可夫奖励过程(MRP ),而不是全面的 MDP。
-
我们看到了从 B 开始的八个转变,它们都通向终态。在两种情况下,奖励是零,而在其余六种情况下,奖励是 1。这可以建模为说 P ( 终端 | B ) = 1。奖励 R ( B ) = 1 有 0.75 (6/8)的概率 R ( B ) = 0 有 0.25 的概率。
图 9-2 显示了我们从这八个交互中学习到的模型。
图 9-2
从环境交互中学习的表查找模型
这是许多参数化模型表示中的一个,在这里我们明确地学习了模型动态,然后丢弃了与真实世界的示例交互。然而,在 DQN 还有另外一种方法:非参数化模型。在非参数化模型中,我们将交互存储在缓冲区中,然后从缓冲区中进行采样。前面八个交互的一个例子是在一个列表中存储(state, reward, next_state)
的元组(记住在这个例子中我们没有动作,因为它是一个 MRP)。
D = [(A,0,B),(B,0,T),(B,1,T),(B,1,T),(B,1,T),(B,1,T),(B,1,T),(B,1,T),(B,1,T),(B,1,T),(B,0,T)]
缓冲器 D 中的前两个值来自一个转换,即 A ,0, B ,0。缓冲区中剩余的七个条目是前一个示例中剩余的七个转换。
模型学习的大致分类如下:
-
参数化:
-
表格查找模型
-
线性期望模型
-
线性高斯模型
-
高斯过程模型
-
深度信念网络模型
-
-
非参数化:将所有交互( s , a , r , s ' )存储在一个缓冲区中,然后从这个缓冲区中进行采样,以生成示例转换。
使用已学习的模型进行规划
一旦我们知道了模型,我们就可以用它来执行计划,使用我们在第三章中看到的价值或策略迭代。在这些方法中,我们使用贝尔曼方程进行一步部署。
然而,有另一种方法可以使用学习的模型。我们可以从中抽取样本,并在 MC 或 TD 学习方法下使用这些样本。在这种情况下,当执行 MC 或 TD 学习风格时,代理不与真实环境交互。更确切地说,它与环境的模型相互作用,而环境是它从过去的经验中近似得到的。在某种程度上,它仍然被称为计划。我们使用从与现实世界的直接互动中学到的模型来计划,而不是计划。
请记住,我们学习的模型是一个近似值。它是基于我们的代理人与环境的部分相互作用。它通常不完整或详尽。我们在前一节中讨论了这一点。学习模型中的不准确性会限制学习的质量。算法优化了关于我们已经形成的模型而不是真实世界模型的学习。这可能会限制学习质量。如果我们对学习模型的信心不是太高,我们可以回到之前看到的无模型 RL 方法。或者我们可以使用贝叶斯方法来推理模型的不确定性。贝叶斯方法不是我们将在本书中进一步探讨的东西。感兴趣的读者可以查看各种高级 RL 文本和论文来进一步探索这一点。
到目前为止,我们已经看到,基于模型的 RL 提供了学习模型的优势,从而使学习更加有效。然而,这是以模型估计不准确为代价的,这反过来限制了学习的质量。有没有一种方法可以将基于模型的学习和无模型学习结合到一个统一的框架中,并利用这两种方法的优点*?*这就是我们现在要探讨的。
整合学习和计划(Dyna)
我们看到了两种类型的体验:一种是代理人与真实环境交互以获得下一个状态和奖励的真实体验, s t + 1 ,rt+1;以及模拟体验,其中代理使用所学习的模型来生成额外的模拟体验。
模拟体验更便宜,也更容易产生,尤其是在机器人领域。我们有快速机器人模拟器来生成样本,这些样本在现实世界中可能不是 100%准确,但与机器人的现实世界交互相比,它们可以帮助我们以更快的速度生成和模拟代理行为。然而,模拟可能不准确,这正是从真实世界的经验中学习会有所帮助的地方。我们可以修改图 9-1 的图来引入这一步,如图 9-3 所示。
图 9-3
Dyna 架构
在 Dyna 中,主体与环境交互(表演)以产生真实的体验。这些真实的经验被用来学习世界的模型,并像无模型 RL 设置一样直接改进价值/策略。这和我们在第 4 到 8 章看到的是一样的。从真实世界交互中学习到的模型用于生成模拟转换。这些模拟转换用于进一步改进价值/策略。我们称这一步为计划,因为我们使用世界模型来产生体验。我们可以通过对“表演”的每一步多次使用模拟体验来执行规划步骤,以从现实世界中生成新的样本。
让我们来看看 Dyna 的具体实现,即表格式 Dyna Q。在这种情况下,我们假设状态和动作是离散的,并形成一个小集合,以便我们可以使用表格式表示 Q ( s , a ),即 Q 值。我们使用 TD 下的 q-learning 方法来学习和改进政策。这类似于我们在 Q-learning 的图 4-14 中看到的方法,即偏离策略的 TD 控制。我们还将从模拟体验中学习一些额外的步骤。在图 4-14 中,我们仅使用真实体验来学习 q 值,但我们现在将学习模型,并使用该模型来生成额外的模拟体验以供学习。图 9-4 给出了完整的算法。
TABULAR DYNA Q
图 9-4
表格动态 Q
从图 9-4 中的伪代码可以看出,表格式 Dyna Q 类似于图 4-14 中的表格式 Q-learning,除了在 Dyna Q 中,对于真实环境中的每一步,我们还使用模拟体验执行额外的 n 步骤,也就是说,在这种情况下,从真实世界中看到的先前过渡中采样。随着我们增加 n ,收敛和学习一个最佳值所需的片段数将会减少。
考虑这样一种情况,除了奖励值为 1 的最后一个终端/目标状态转换之外,迷宫对每个转换的奖励为零。这种迷宫的一个例子是图 9-5 左侧的迷宫。我们还假设每个( s , a )对的初始 q 值为零。在常规 Q-learning 中,我们会学习第一集终止时的目标值 1。则值 1 将缓慢传播——每集一个单元/级别,最终从开始状态到达。在此之后,q 值和最优策略将在其他事件中开始收敛。然而,在 Dyna Q 的情况下,我们将为环境中的每个真实步骤生成 n 个附加示例。这将加速收敛。在普通 q-learning 方法之前,我们将会看到政策趋同。有关这种更快收敛的更多理论和详细解释,请参考《强化学习:简介》一书的第八章。
图 9-5
在代理人学会通过右侧的开口后,带网格的 Dyna Q 在中途变得更加困难。代理学习通过砖墙左侧的新开口来导航网格
让我们将前面的表格 Dyna Q 伪代码应用到我们在第四章中看到的相同环境中。我们将修改清单 4-4 来合并模型学习和 n 个计划步骤(从模拟经验中学习),用于从实际经验中直接学习基于 RL 的每一步。完整代码见listing9_1_dynaQ.ipynb
。在演练中,我们将强调第四章中 Dyna Q 代码和 Q-learning 代码之间的主要区别。
首先,我们将代理从QLearningAgent
重命名为DynaQAgent
。这只是一个名称的变化,代码保持不变,只是增加了一个字典来存储所看到的真实世界的转换。我们将下面两行代码添加到__init__
函数中:
self.buffer = {}
self.n = n # the number of planning steps to be taken from simulated exp
其次,我们添加逻辑以遵循图 9-4 中伪代码的规划部分,如下所示:
循环重复 n 次:
S ←一个随机的先前看到的状态
一个 ←先前在 S 采取的随机行动
R , S ,,型号 ( S , A )
)
这被添加到我们训练代理的函数train_agent
中。清单 9-1 显示了修改后的函数实现。
#training algorithm
def train_agent(env, agent, episode_cnt = 10000, tmax=10000, anneal_eps=True):
episode_rewards = []
for i in range(episode_cnt):
G = 0
state = env.reset()
for t in range(tmax):
action = agent.get_action(state)
next_state, reward, done, _ = env.step(action)
agent.update(state, action, reward, next_state, done)
G += reward
if done:
episode_rewards.append(G)
# to reduce the exploration probability epsilon over the
# training period.
if anneal_eps:
agent.epsilon = agent.epsilon * 0.99
break
# add the experience to agent's buffer (i.e. agent's model estimate)
agent.buffer[(state,action)] = (next_state, reward, done)
state = next_state
# plan n steps through simulated experience
for j in range(agent.n):
state_v, action_v = random.choice(list(agent.buffer))
next_state_v, reward_v, done_v = agent.buffer[(state_v,action_v)]
agent.update(state_v, action_v, reward_v, next_state_v, done_v)
return np.array(episode_rewards)
Listing 9-1Train_agent Using Dyna Q
接下来,我们在迷宫和 OpenAI Gym 的出租车世界环境中运行 Dyna Q。查看 Python 笔记本中的训练曲线,我们注意到,与普通 Q-learning 相比,Dyna Q 下收敛花费的时间更少。这证明了 Dyna Q(或任何 Dyna 架构)是样本高效的。
Dyna Q 和不断变化的环境
现在让我们考虑这样一种情况,我们首先使用 Dyna Q 学习迷宫的最优策略。经过一些步骤后,我们改变环境并使其变得更难,如图 9-5 所示。左图是原始网格,代理学习通过灰色砖墙右侧的开口从起点 S 导航到目标 G。在代理学习了最佳行为之后,网格被改变。右侧的开口被关闭,左侧开了一个新的开口。当代理试图通过先前学习的路径导航到目标时,现在看到原始路径被阻塞,即在原始迷宫的右侧打开。这是因为我们刚刚做的改变。
萨顿和巴尔托在他们的书强化学习:介绍中指出,Dyna Q 需要一段时间来学习变化的环境。一旦环境中途改变,在许多场景中,代理继续向右走,但发现路径被阻塞,因此在ε-贪婪策略下,它需要许多额外的步骤来学习从左侧的开口到达目标的替代路径。
让我们考虑他们在书中展示的第二种情况。第二种情况,中途改变环境,变得更简单;即,新的开口被引入到右侧,而不关闭左侧的原始开口。图 9-6 显示了变化前后的迷宫。
图 9-6
代理学习了左侧网格的最佳策略后,Dyna Q 的网格变得更加简单。Dyna Q 代理未能发现通过新右侧缺口的较短路径
通过在该设置上运行 Dyna Q 学习算法,我们可以显示 Dyna Q 没有学习砖墙右侧的新开口。如果遵循通过砖墙右侧的新路径,将提供到达目标状态的更短路径。Dyna Q 已经学会了最优策略,它没有动力去探索变化的环境。新开放的随机/偶然探索取决于探索政策,而探索政策又取决于 ε 探索。
有一个名为 Dyna Q+的修正算法可以解决这个问题,如下一节所述。
Dyna Q+
Dyna Q+是探索/利用困境的典型例子,需要在所有强化学习设置中仔细考虑。我们之前谈过了。如果我们过早地开始利用知识(即模型或策略),我们就有可能不知道更好的途径。代理贪婪地变得对它设法学到的任何东西感到高兴。另一方面,如果代理探索得太多,即使它已经得到了最优解,也是在浪费时间寻找次优路径/选项。不幸的是,代理没有直接的方法知道它已经达到了最优策略,因此它需要使用其他试探法/方法来平衡探索-开发困境。
在 Dyna Q+中,我们通过在我们观察到的状态之外增加奖励来鼓励探索未知的状态。这个额外的奖励条款鼓励探索现实世界中有一段时间没有被访问过的州。
在模拟规划部分,我们在奖励中加入);即,奖励 r 变成),其中 κ 是一个小常数,而 τ 是自从在现实世界探索中看到所讨论的转变以来的时间。它鼓励代理尝试这些转换,从而有效地捕捉环境中的变化,并有一些由 κ 控制的滞后。在图 9-6 中,代理最初学习通过左侧开口。它按照修改后的术语进行探索,但发现到达目标的唯一途径是通过左侧开口。然而,在通过在右侧制造一个新的开口来改变环境之后,代理人在随后对迷宫的这一部分的探索中将发现新的开口,并最终发现这是一条通向目标的更短路径的事实。代理将修改其最佳行为,以遵循右侧的开口。随着最后一次访问网格部分的时间增加,奖励中的)项会增加,在某个阶段可能会增加太多,以至于盖过了当前最佳行为的奖励,迫使代理再次探索未访问的部分。
预期更新与示例更新
我们已经看到了将学习和计划结合起来的各种方法。我们可以看到,学习和规划都是关于价值函数更新的方式。第一维是关于更新什么,是状态值( v )还是动作值( q )。另一个维度是更新的宽度。换句话说,更新是基于看到的单个样本发生的(样本更新),还是基于使用给定当前状态和动作的下一个状态的转移概率的所有可能的转移(预期更新),即,p(st, a t )?第三个也是最后一个维度是是否对任意策略 v π , q π 或最优策略v∫,q∫进行更新。让我们看看各种组合,并把它们映射回我们在书中迄今为止所看到的内容。
-
vπ(s)使用预期更新进行更新。更新是针对值函数的。它是使用转移概率分布 p ( s ' , r | s , a )覆盖来自给定状态的所有可能转移的预期更新。该操作是使用当前策略代理执行的。
This is policy evaluation using dynamic programming, as shown in equation (3.6).
)
-
vπ(s)使用样本更新进行更新。更新是针对值函数的,并且基于代理看到的遵循策略 π 的样本。
This is policy evaluation under TD(0), as shown in equation (4.4). The value of state (s) is updated based on the action taken by the agent as per policy π, the subsequent reward (r), and the next state (s’) seen by the agent.
)
-
v∫(s)在所有可能的动作上使用 max 更新。state ( s )的值基于所有可能的下一个状态和奖励的期望来更新。通过在所有可能的动作中取最大值来完成更新,即在给定时间点的最优动作,而不是基于代理正在遵循的当前策略。
这是根据方程式( 3)使用动态编程的值迭代。8 。
)
-
qπ(s, a )使用预期更新进行更新。被更新的值是 q 值,并且在基于来自给定状态-动作对的所有可能的下一个状态和回报的期望中被更新。该更新基于代理遵循的当前策略。
This is q-policy evaluation using dynamic programming, i.e., equation (3.2) expressed in iterative form.
)
-
qπ(s, a )使用样本更新。q 值的更新基于样本和代理遵循的当前策略,即基于策略的更新。
This is q-value iteration using dynamic programming. Here is the iterative version of equation (3.4):
)
-
q∫(s, a )使用所有可能的状态进行更新,并在下一个状态下对所有可能的动作进行 max。这是对 q 值的更新,并且基于所有可能的后续状态和动作对的期望。它通过采取最大限度的动作进行更新,从而更新最佳策略,而不是代理当前遵循的策略。
This is SARSA using a model-free setup, as shown in equation (4.6). It has been rewritten to match the notations in this section.
)
-
q∫(s, a )使用样本动作更新,然后从下一个状态取所有可能动作的最大值。这是使用样本更新 q 值。该更新基于所有可能操作的最大值*,即不符合策略的更新,而不是代理遵循的当前策略的更新。*
*This is the Q-learning that we studied in Chapter 4 and then extended to deep networks under DQN. This is equation (4.10) rewritten to match the notations in this chapter.
)*
前面的解释说明了动态规划和无模型世界是如何联系在一起的。在 DP 中,既然我们知道了模型动力学,我们就对所有可能的跃迁p*(st, a t )进行大范围的扫描。在无模型的世界中,我们不知道模型,因此我们进行基于样本的 MC 或 TD 更新。动态规划和无模型之间的区别在于更新是基于期望值还是基于样本。
它还表明,一旦我们开始学习模型动力学,我们可以在 Dyna 设置下混合和匹配任何以前的方法。就像前面一样,我们将无模型和基于模型的方法结合在一个统一的设置中。这类似于我们通过将基于价值的 DQN 和政策梯度结合到 actor critic 下的统一方法中所做的,以及我们使用资格跟踪将一步样本(TD)和多步样本(MC)结合到单个框架中所做的。
组织 RL 算法的另一种方式是查看二维世界,其中纵轴是更新的长度/深度,TD(0)在一端,MC 在另一端。第二个/水平维度可以看作是更新的宽度,在一端是动态编程预期更新,在另一端是基于样本的 MC/TD 更新。图 9-7 显示了这种区别。
图 9-7
简而言之,强化学习方法
我们可以通过添加更多的维度来进一步完善这种统一。与更新的宽度和深度正交的第三个可能的维度是不符合策略的更新与符合策略的更新。我们还可以增加第四个维度,即纯粹基于价值的方法或纯粹的政策学习方法或两者的混合,即行为者批评。
到目前为止,我们已经在所谓的后向视角中看到了学习和计划的结合。我们使用规划(例如 Dyna Q)来更新值函数,但是在现实世界中选择动作时不涉及规划。这是一种被动的计划方法,其中计划用于生成额外的步骤/合成示例来训练和改进模型/策略/价值功能。在接下来的部分中,我们将看一下提前计划,其中我们在决策时间执行计划。换句话说,我们使用模型知识(学习到的或给定的)来预测未来,然后根据我们认为的最佳行动采取行动。我们将在蒙特卡罗树搜索算法(MCTS)的背景下研究这种方法。然而,在此之前,让我们在下一节回顾一下探索与利用的问题。
探索与开发
在强化学习中,我们总是需要在使用现有知识和探索更多知识以获得新知识之间进行平衡。最初,我们对世界(环境)一无所知或知之甚少。我们可以探索更多,并开始改善我们对世界的信念。随着我们的信念得到改善和加强,代理人开始利用这个信念,同时逐渐减少对它的探索。
到目前为止,我们已经研究了不同形式的探索。
-
ε-贪婪策略是代理基于其当前信念以概率(1-ε)采取最佳行动,并以概率ε随机探索。随着步骤的进行,ε逐渐减小。我们在所有的 DQN 方法中都看到了这一点。如果您查看第六章的笔记本,您会看到以下功能:
-
我们总是从ε= 1.0 开始,经过一段时间后降至 0.05。前一个函数实现了 epsilon 缩减计划。
-
我们还看到了在策略梯度方法中以学习随机策略的形式进行的探索,其中我们总是学习策略分布π θ ( a | s )。我们没有采取任何超过最大值的行动来学习单一的最优行动,这是在 DQN 的情况。这确保了我们不是在学习确定性动作。所有行为的不同非零概率确保了探索。
-
我们还看到了熵正则化在策略梯度和行动者批评方法中的使用,这些方法强制进行足够的探索,以确保代理不会在没有对策略/行动空间的未知部分进行足够探索的情况下过早地承诺利用。请参考第七章的列表 7-1 获取该方法的快速示例。
def epsilon_schedule(start_eps, end_eps, step, final_step):
return start_eps + (end_eps-start_eps)*min(step, final_step)/ final_step
在本节中,我们将通过一个简单的设置来更正式地研究勘探与开发之间的权衡,以及有效勘探的各种策略。
多臂强盗
我们将基于多个赌场老虎机堆叠在一起的概念,考虑一个被称为多臂土匪的环境。代理不知道每个老虎机的成功率的单独奖励金额。代理人的工作是选择一台机器,拉动吃角子老虎机控制杆,以获得奖励。只要我们愿意,这个循环就会一直重复下去。代理需要探索尝试所有机器,并形成对每台机器的个人奖励分配的信念。随着它的信念越来越强,它必须开始更多地利用它的知识/信念来拉动最佳机器的杠杆,减少探索。图 9-8 显示了设置。
图 9-8
非文本多臂强盗
我们研究多臂 bandit 的原因是它是一个简单的设置。此外,它可以扩展到上下文多臂强盗,其中每个老虎机的奖励分配是不固定的。相反,它取决于给定时间点的上下文,例如代理的“当前状态”。上下文多臂 bandit 有许多实际的用例。我们将在这里考虑一个这样的例子。
假设您有 10 个广告,并且您想要基于页面的上下文(例如,内容)在浏览器窗口中向用户显示一个广告。当前页面是上下文,显示 10 个广告中的一个是动作。当用户点击广告时,用户获得 1 的奖励;否则,奖励为 0。代理具有用户在相同的上下文中点击显示的广告的次数的历史,即,点击具有相似内容的网页上的显示的广告。代理想要采取一系列行动,目的是增加/最大化用户点击所显示广告的机会。这是一个上下文多臂土匪的例子。
另一个例子是一个在线商店,根据用户当前查看的内容显示其他产品推荐。在线商店希望用户会发现一些有趣的推荐并点击它们。另一个例子是从 K 个可能的选项中选择一种药物,给病人服用该药物以选择最好的一个,并在最多 T 次尝试后得出结论。
我们可以进一步扩展 bandit 框架来考虑全面的 MDP。但是每一次扩展都使得形式分析变得更加费力和麻烦。因此,我们将在这里研究非文本 bandit 的最简单的设置,以帮助您理解基础知识。感兴趣的读者可以利用网上的许多好资源进一步研究这个问题。
遗憾:探索质量的衡量标准
接下来,我们定义探索的质量。考虑系统处于状态 S 。在非上下文 bandit 中,它是一个冻结的初始状态,不变,每次都保持不变。对于上下文相关的 bandit,状态 S 可能会随着时间而改变。进一步,假设我们遵循一个策略πt(s)在时间 t 选择一个动作。同样,考虑你知道最优策略π∫(s)。
在时间 t 的后悔,即从非最优策略中选择一个动作的后悔,定义如下:
)
(9.3)
它是遵循最优政策的预期回报减去遵循特定政策的回报。
我们可以对所有时间步进行求和,以获得 T 步的总遗憾,如下所示:
) (9,4)
因为我们在看非上下文 bandit,其中状态( s )在每个时间步保持不变,即保持固定为初始状态。我们可以简化( 9.4 )如下所示:
)
(9.5)
我们将使用( 9.5 )来比较各种采样策略。在接下来的几节中,我们将研究三种常用的探索策略。我们将在代码示例的帮助下这样做。你可以在listing9_2_exploration_exploitation.ipynb
中找到完整的代码。
让我们首先描述一下我们将使用的设置。考虑多臂土匪有K
动作。每个行动都有一个固定的概率θk产生奖励 1,以及一个(1-??)θk产生奖励 0 的概率。最优动作是k
(小写 k )的值,成功概率最大。
)
清单 9-2 显示了强盗的代码。我们将k
存储为self.n_actions
,将所有 θ k 存储为self._probs.
函数pull
将动作k
作为输入,根据动作的概率分布返回奖励 1 或 0,即θ k 。函数optimal_reward
返回self._probs.
的max
class Bandit:
def __init__(self, n_actions=5):
self._probs = np.random.random(n_actions)
self.n_actions = n_actions
def pull(self, action):
if np.random.random() > self._probs[action]:
return 0.0
return 1.0
def optimal_reward(self):
return np.max(self._probs)
Listing 9-2Bandit Environment
接下来,我们将从ε-贪婪探索策略开始来看三种探索策略。
ε贪婪探索
这类似于我们在前几章看到的ϵ-贪婪策略。代理人尝试不同的行动,并针对土匪环境的不同行动形成未知实际成功概率 θ k 的估计)。它以(1-??)ϵ的概率采取动作 k 和)。换句话说,它利用到目前为止获得的知识,根据)估计采取它认为最好的行动。此外,它以概率 ϵ 采取随机行动进行探索。
我们将保持 ϵ = 0.01 作为探索概率,并在整个实验中保持不变。清单 9-3 显示了实现这个策略的代码。首先,我们将RandomAgent
定义为基类。我们有两个数组来存储每个操作的成功和失败结果的累积计数。我们将这些计数存储在数组中:self.success_cnt
和self.failure_cnt
。
函数update(self, action, reward)
根据采取的行动和结果更新这些计数。功能reset(self)
重置这些计数。我们这样做是为了多次运行相同的实验,并绘制平均值以消除随机性。职能get_action(self)
是实施勘探战略的地方。它将根据策略类型使用不同的方法来平衡探索和利用。对于RandomAgent
,动作总是从一组可能的动作中随机选择。
接下来,我们在类EGreedyAgent
中实现ε-探索代理。这是通过扩展RandomAgent
和覆盖函数get_action(self)
来实现的。如上所述,以概率(1ϵ)选择概率最高的动作,以概率 ϵ 选择随机动作。
class RandomAgent:
def __init__(self, n_actions=5):
self.success_cnt = np.zeros(n_actions)
self.failure_cnt = np.zeros(n_actions)
self.total_pulls = 0
self.n_actions = n_actions
def reset(self):
self.success_cnt = np.zeros(n_actions)
self.failure_cnt = np.zeros(n_actions)
self.total_pulls = 0
def get_action(self):
return np.random.randint(0, self.n_actions)
def update(self, action, reward):
self.total_pulls += 1
self.success_cnt[action] += reward
self.failure_cnt[action] += 1 – reward
class EGreedyAgent(RandomAgent):
def __init__(self, n_actions=5, epsilon=0.01):
super().__init__(n_actions)
self.epsilon = epsilon
def get_action(self):
estimates = self.success_cnt / (self.success_cnt+self.failure_cnt+1e-12)
if np.random.random() < self.epsilon:
return np.random.randint(0, self.n_actions)
else:
return np.argmax(estimates)
Listing 9-3Epsilon Greedy Exploration Agent
在我们的设置中,我们没有改变ε值,因此代理永远不会学习执行一个完美的最优策略。它永远以ε概率继续探索。因此,遗憾永远不会降到零,我们期望由( 9.5 )给出的累积遗憾随着由ε的值定义的增长斜率线性增长。ε值越大,增长的斜率越陡。
置信上限探索
我们现在来看看称为置信上限 (UCB)的策略。在这种方法中,代理尝试不同的动作并记录成功的次数( α k )或失败的次数( β k )。
它计算成功概率的估计值,这些值将用于查看哪个操作具有最高的成功估计值。
)
它还会计算偏好最少访问操作的浏览需求,如下所示:
)
其中 t 是到目前为止采取的步骤总数。
然后,代理选择得分最高(浏览+利用)的操作,如下所示:
)
(9.6)
其中 λ 控制探索与利用的相对重要性。我们将在代码中使用 λ = 1。
UCB 的方法是计算置信上限(置信区间上限),以确保我们有 0.95(或任何其他置信水平)的概率,即实际估计值在 UCB 值之内。随着试验次数的增加,随着我们一次又一次地采取特定的行动,我们估计中的不确定性会减少。( 9.6 中的分数将接近预估值)。那些根本没有被访问过的动作,会因为方程(αk+βk)= 0 而得分=∞(9.6)。UCB 显示出接近最佳增长界限。我们不会深入研究这一点的数学证明。可以参考土匪问题的进阶课文。
让我们看一下 UCB 代理的实现。清单 9-4 给出了代码。如前所述,我们再次扩展了清单 9-3 中所示的RandomAgent
类,并覆盖了get_action
函数,以根据 UCB 方程( 9.6 )选择动作。请注意,为了避免被零除,我们在出现self.success_cnt+self.failure_cnt
的分母中添加了一个小常数1e-12
。
class UCBAgent(RandomAgent):
def get_action(self):
exploit = self.success_cnt / (self.success_cnt+self.failure_cnt+1e-12)
explore = np.sqrt(2*np.log(np.maximum(self.total_pulls,1))/(self.success_cnt+self.failure_cnt+1e-12))
estimates = exploit + explore
return np.argmax(estimates)
Listing 9-4UCB Exploration Agent
汤普森取样勘探
接下来,我们看看我们的最终策略,即汤普森抽样。这是基于这样一种想法,即选择一个行动的基础是它是最大化预期回报的行动的概率。虽然 UCB 是基于概率的频率概念,汤普森抽样是基于贝叶斯思想。
最初,我们不知道哪一个动作更好,即哪一个动作具有最高的成功概率 θ k 。相应地,我们形成一个初始信念,所有的 θ k 值都均匀分布在范围(0,1)内。这在贝叶斯术语中称为先验。我们用)的一个贝塔分布 2 来表示。代理为每个动作采样一个值 k 并选择采样值最大的动作)
接下来,它播放该动作(即调用函数pull
来执行所选择的动作)并观察结果。基于结果,它更新)的后验分布。随着每一步中成功和失败计数的更新,代理更新其对)的信念。
)
(9.7)
循环往复。随着我们经历多个步骤, α k 和 β k 增加。β分布变窄,峰值在)的平均值附近。
让我们看看代码中 Thompson 采样的实现,如清单 9-5 所示。像以前一样,我们扩展了RandomAgent
类并覆盖了get_action
方法来实现等式( 9.7 )。
class ThompsonAgent(RandomAgent):
def get_action(self):
estimates = np.random.beta(self.success_cnt+1, self.failure_cnt+1)
return np.argmax(estimates)
Listing 9-5Thompson Sampling Exploration
比较不同的勘探策略
我们实现了一个函数get_regret
来使用 bandit 环境和一个选择的探索策略采取n_steps=10000
步骤。我们进行了n_trials=10
次实验,并将平均累积遗憾存储为步数的函数。清单 9-6 给出了实现get_regret
的代码。
清单 9-6。 获取 _ 后悔功能
def get_regret(env, agent, n_steps=10000, n_trials=10):
score = np.zeros(n_steps)
optimal_r = env.optimal_reward()
for trial in range(n_trials):
agent.reset()
for t in range(n_steps):
action = agent.get_action()
reward = env.pull(action)
agent.update(action, reward)
score[t] += optimal_r - reward
score = score / n_trials
score = np.cumsum(score)
return score
我们对三个代理人进行了实验:ε-贪婪、UCB 和汤姆森探索。我们绘制了累积奖励,如图 9-9 所示。
图 9-9
不同探索策略的后悔曲线
我们可以看到,UCB 和汤普森有次线性增长,而ε-贪婪后悔继续以更快的速度增长(实际上是线性增长,增长率由ε的值决定)。
现在让我们回到蒙特卡罗树搜索的讨论,我们将使用 UCB 作为一种方式来执行探索与利用决策。选择 MCTS 的 UCB 是基于流行的 MCTS 实现中显示的当前趋势。
决策时的计划和蒙特卡罗树搜索
Dyna 使用规划的方式叫做后台规划。学习到的模型用于生成模拟样本,然后将模拟样本馈送给算法,就像真实样本一样。这些额外的模拟样本有助于在使用真实世界交互所做的估计之上进一步改进价值估计。当一个动作必须在比如说州St中被选择时,在这个决策时间没有计划。
计划的另一种方式是在状态 S t 时开始和结束计划,以展望未来,有点像使用迄今为止学习的模型在你的头脑中播放各种场景,并使用该计划来决定在时间 t 要采取的动作 A t 。一旦采取了动作 A t ,代理发现自己处于新的状态代理人再次向前看,计划,并采取步骤。如此循环下去。这被称为决策时间规划。根据可用的时间,代理从当前状态计划的越远/越深入,该计划在决定在时间 t 采取什么行动时就越有力和有帮助。因此,在不需要快速响应的情况下,决策时间规划最有帮助。在像国际象棋和围棋这样的棋盘游戏中,决策时间计划可以在决定采取什么行动之前预测十几步棋。但是,如果需要快速响应,那么后台规划是最合适的。
这些向前搜索算法通过向前看来选择最佳的可能动作。他们从代理所处的当前状态 S t 开始构建可能选项的搜索树。给定状态-动作对中的可能选项可能取决于代理从先前的交互中学习到的 MDP 模型,或者它可能基于开始时给代理的 MDP 模型。例如,在像国际象棋和围棋这样的棋盘游戏中,我们已经清楚地定义了游戏规则,因此我们对环境了如指掌。图 9-10 显示了一个搜索树的例子。
图 9-10
从当前状态 S t 开始搜索树
然而,如果分支因子很高,我们就不能构建一个穷举搜索树。在围棋比赛中,平均分支因子在 250 左右。即使构建三级深度穷举树,第三级也会有 250 个3= 1562.5 万个节点,即 1500 万个节点。为了尽可能利用向前看的优势,我们想比两三个层次更深入。这就是形成基于模拟的搜索树而不是穷举搜索树的原因。我们使用一种叫做展示策略的策略来模拟多个轨迹,并形成行动值的 MC 估计。这些估计用于选择根状态 S t 的最佳动作。这有助于改进政策。在采取最佳行动后,代理发现自己处于一个新的状态,并从头开始从新的状态展开模拟树。如此循环下去。尝试的卷展轨迹的数量取决于代理需要决定动作的时间限制。
MCTS 是决策时间规划的一个例子。MCTS 与前面描述的完全一样,只是增加了一些额外的增强,以累积价值评估,并将搜索导向树中最有回报的部分。MCTS 的基本版本由四个步骤组成。
-
选择/树遍历:从根节点开始,用一个树策略遍历树,到达一个叶节点。
-
展开:给叶子节点添加子节点(动作),选择其中一个。
-
模拟/展示:从先前选择的子节点开始,玩游戏直到终止。我们使用固定的展示策略来完成这一过程,也可以使用随机的展示策略。
-
反向传播:使用播放的结果,通过跟随(回溯)所遍历的路径,更新从终点到根节点的所有节点。
这个循环重复多次,总是从当前根节点开始,直到我们用完分配给搜索的时间,或者我们运行它一个固定的迭代次数。此时,基于累积的统计数据,选择具有最高值的动作。图 9-11 显示了 MCTS 的示意图。
图 9-11
由四个步骤组成的一次 MCTS 迭代
接下来,代理在真实环境中执行选择的动作。这将代理移动到新的状态,并且先前的 MCTS 循环再次开始,这一次新的状态是根状态,从该根状态构建模拟的基于树。
让我们看一个简单的虚构的例子。我们将使用以下 UCB 衡量标准:
)
UCB 1 将用于决定在扩展阶段选择哪个节点。我们从根节点 S 0 开始,对于每个节点,我们保留两个统计数据,总分和对该节点的访问次数。初始设置如下:
我们通过添加从 S 0 开始的所有可用动作,比如说 a 1 和 a 2 来扩展根节点处的树。这些动作将我们带到两个新的状态,分别是S1 和S2。我们初始化这两个节点的分数和计数统计。此时的树看起来像这样:
这是初始树。我们现在开始执行 MCTS 的步骤。第一步是使用 UCB 1 值遍历树。我们在 S 0,并且我们需要选择具有最高 UCB 1 值的子节点。让我们为S1 计算 UCB 1。当 n = 0 时, UCB 1,即)中的探索项是无限的。S?? 2 就是这种情况。作为我们的树策略的一部分,让我们在 ties 的情况下选择具有较小子索引的节点,这导致选择S1。由于 S 1 之前从未被访问过,即对于 S 1 来说 n = 0,我们不展开,而是转到展示的步骤 3。我们使用展示策略来模拟从SS1直到终止的随机动作。假设我们观察到终止时的值为 20,如下所示:
下一步是第四步,即将值从终端状态一直反向传播到根节点。我们更新从终端状态到根节点的路径中所有节点的访问计数和总分。然后我们从 S 1 中擦除了卷展栏部分。此时,树看起来就像图中所示的那样。请注意节点S1 和S0 的更新统计。
这使我们结束了 MCTS 步骤的第一次迭代。我们现在将再运行一次 MCTS 步骤的迭代,再次从 S 0 开始。第一步是从S0 开始的树遍历。我们需要选择两个节点中的一个,即 S 1 或 S 2 ,基于哪个具有更高的 UCB 1 值。对于S1, UCB 1 的值由下式给出:
)
ln 1 中的 1 来自根节点的 n 的值,它告诉我们到目前为止的总尝试次数。而平方根里面的分母中的 1 来自于节点S1 的 n 的值。UCB(SS2)继续为∞,因为S2 的 n 仍然为 0。所以,我们选择节点S2。这结束了树遍历步骤,因为S2 是叶节点。我们从S2 开始进行首次展示。让我们假设从S2 的卷展产生的终端值为 10。这就完成了推广阶段。此时的树看起来像这样:
下一步是将终端值 10 一路反向传播回根状态,并且在该过程中更新路径中所有节点的统计,即,在这种情况下的 S 2 和 S 0 。然后我们删除卷展栏部分。在反向传播步骤结束时,更新后的树如下所示:
让我们对 MCTS 再进行一次迭代,这将是最后一次迭代。我们再次从 S 0 开始,重新计算子节点的 UCB 1 值。
)
)
由于 S 1 的 UCB 值较高,我们选择该值。我们已经到达了一个叶节点,这结束了 MCTS 的树遍历部分步骤。我们在 S 1 处,它之前已经被访问过,所以我们现在通过模拟 S 1 的所有可能动作以及我们最终所处的结果状态来扩展 S 1 。此时的树看起来像这样:
我们需要在 S 3 和 S 4 之间选择一个叶节点,然后从选择的节点开始展示。和前面一样,对于两个S3 和S4 的 UCB 1 为∞。按照我们的树策略,在出现平局的情况下,我们选择子索引较低的节点。这意味着我们选择S3 并从S3 中进行一次展示。假设卷展栏结束时的终端状态产生的终端值为 0。这就完成了 MCTS 的推广步骤。这棵树看起来像这样:
最后一步是将零值一路反向传播回根节点。我们更新路径中节点的统计,即节点 S 3 、 S 1 、 S 0 。这棵树看起来像这样:
此时,假设我们已经没有时间了。该算法现在需要选择在 S 0 的最佳行动,并在现实世界中采取这一步。此时,我们将只比较平均值,对于S1 和S2 这两个平均值都是 10。这是一条领带。我们可以有额外的规则来打破平局。然而,假设我们总是选择一个随机的行动来打破平局,同时做出最佳行动的最终选择。假设我们随机选择了S1。代理采取行动 a 1 并在S1 着陆,假设确定性设置。我们现在使 S 1 成为新的根节点,并从 S 1 开始执行 MCTS 的多次迭代,最终选择在 S 1 采取最佳行动。通过这种方式,我们步入了真实的世界。
这是 MCTS 的精髓。MCTS 有许多变体,我们就不一一赘述了。主要目的是帮助您熟悉简单和基本的 MCTS 设置,并引导您完成计算以巩固您的理解。
在结束本章之前,我们将简要谈谈 MCTS 最近的一个著名用例,即 AlphaGo 和 AlphaGo Zero,它们帮助设计了一种算法,让计算机在围棋比赛中击败人类专家。
AlphaGo 演练
AlphaGo 由 Deep Mind 在 2016 年设计的 3 在围棋比赛中击败人类专家。一个标准的搜索树将从一个给定的位置测试所有可能的东西。但是分支因子高的游戏不能用这种方式。如果一个游戏的分支因子为 b (即任意位置的合法移动次数为 b ),游戏总长度(即深度或直到结束的连续移动次数)为 d ,那么就有 b d 种可能的移动顺序。评估所有选项对于任何一款中等的棋盘游戏来说都是不可行的。考虑到和( b ≈ 35, d ≈ 50)下棋或者和( b ≈ 250, d ≈ 150)下围棋,穷举搜索是不可能的。但是有效的搜索空间可以用两种通用的方法来减少。
-
您可以通过位置评估来减少深度。在将搜索树扩展到一定深度后,用一个近似的评价函数v(s)≈v∫(s)替换一个叶节点处的状态。这种方法适用于棋盘游戏,如国际象棋、跳棋和奥赛罗,但不适用于围棋,因为围棋很复杂。
-
第二种方法是通过来自策略 p ( s )的采样动作,从节点处的完全扩展减小树的宽度。蒙特卡洛展开根本不分支;他们从一个叶节点播放一集,然后使用平均回报作为对 v ( s )的估计。我们在 MCTS 看到了这种方法,其中部署值用于估计叶节点的 v(s),并且通过使用修订的估计值 v ( s )来进一步改进策略。
在之前的学术论文中,作者将 MCTS 与深度神经网络相结合,实现了超人的表现。他们将棋盘图像作为 19×19 像素的图像传递给卷积神经网络(CNN),并使用它来构建棋盘位置的表示,即状态。
他们使用专家人类移动进行监督学习,学习两个策略,即 p ( s )。
-
SL 策略网络(pσ):作者使用了监督策略学习网络 p σ 。这是使用 CNN 风格的网络进行训练的,该网络以 19×19 个棋盘位置作为输入状态( s ),棋盘位置基于专业人员的移动。
-
Rollout policy(pπT7):同样的数据也被用于训练另一个名为fast policy pπ的网络,该网络在 MCTS 的“Rollout”阶段充当了 Rollout policy。
接下来,作者训练了一个强化学习(RL)网络 p ρ ,其从 SL 策略网络初始化,试图改进 SL 策略网络以具有更多获胜,即,使用策略优化来改进以具有更多获胜的目标。它类似于我们在第七章中看到的。
最后,另一个网络 v θ 被训练来预测 RL 策略网络 p ρ 用于自演的状态 v ( s )的值。图 9-12 显示了神经网络训练的高级图。
图 9-12
神经网络训练流水线。转载自 AlphaGo 论文图 14
最后,将政策网络和价值网络结合起来实现 MCTS,并进行向前搜索。作者使用了一种类似 UCB 的方法来遍历树的扩展部分。一旦到达叶节点( S L ),他们使用来自 SL 策略网络 p σ 的一个样本来扩展叶节点(MCTS 的步骤 2)。以两种方式评估叶节点:一种是通过使用值网络vθ(SL)另一种是通过快速卷展直到终止使用卷展网络 p π 获得结果 z L 。使用混合参数 λ 组合这两个值。
)
MCTS 的第四步是更新每个节点的得分和访问次数,正如我们在上一节的示例中看到的那样。
一旦搜索完成,算法从根节点选择最佳动作,然后 MCTS 循环从新的状态继续。
随后,一年后,在 2017 年,作者们又推出了一项名为“在没有人类知识的情况下掌握围棋游戏”的进一步改进, 5 训练在没有任何人类专家棋盘位置的情况下进行游戏,从随机游戏开始,并在此基础上进行改进。更多细节请参考论文。
这就把我们带到了本章的结尾。这是本书的最后一章,我们深入探讨了强化学习的某些特定方面。Alpha Go 的解释是在概念层面上的。感兴趣的读者不妨参考原文。
摘要
在这一章中,我们进行了最后的统一,即将基于模型的规划与无模型学习相结合。首先,我们研究了基于模型的 RL,我们学习模型并使用它来进行规划。接下来,我们研究了在 Dyna 下将规划和学习集成到一个架构中。然后,我们查看了 Dyna Q 中带 Q-learning 的 Dyna 的特定版本。我们还简要介绍了 Dyna Q+对长期未访问的州的工程探索。这有助于我们在不断变化的环境中管理学习。接下来,我们详细探讨了状态或动作值在期望中或通过基于样本的更新进行更新的各种方式。
然后,我们讨论了在一个简化的多臂强盗环境中探索与开发的两难境地。我们研究了各种探索策略,如ϵ-贪婪探索、置信上限探索和汤姆森抽样探索。在实验的帮助下,我们看到了他们在累积后悔上的相对表现。
在本章的最后一部分,我们学习了前瞻性和基于树的搜索。我们深入研究了蒙特卡罗树搜索,并演示了它在解决围棋游戏中的应用。
下一章,也是最后一章,将对本书中没有涉及的话题进行广泛的探讨。
http://incompleteideas.net/book/the-book.html
2
https://en.wikipedia.org/wiki/Beta_distribution
3
https://deepmind.com/research/case-studies/alphago-the-story-so-far
4
https://deepmind.com/research/case-studies/alphago-the-story-so-far
5
https://deepmind.com/research/case-studies/alphago-the-story-so-far
*
十、进一步探索和后续步骤
这是这本书的最后一章。在整本书中,我们深入探讨了强化学习(RL)的许多基础方面。我们用动态规划法研究了 MDP 和 MDP 的规划。我们研究了无模型价值方法。我们讨论了使用函数近似的放大解决方案技术,特别是通过使用基于深度学习的方法,如 DQN。我们研究了基于政策的方法,如强化、TRPO、PPO 等。我们在行动者-批评家(AC)方法中统一了价值和政策优化方法。最后,我们在前一章看了如何结合基于模型和无模型的方法。
这些方法中的大多数都是掌握强化学习的基础。然而,强化学习是一个快速扩展的领域,在自动驾驶汽车、机器人和类似的其他领域有许多专门的用例。这些超越了我们在本书中用来解释概念的问题设置。作为核心主题的一部分,我们不可能涵盖所有新出现的方面。那会使这本书变得非常笨重;此外,许多地区几乎每天都有新的方法出现。
在最后一章中,我们将介绍一些我们认为您应该高度关注的话题。我们将把讨论保持在一个概念性的水平,并在适当的地方提供一些流行的研究/学术论文的链接。你可以根据你在 RL 领域的个人兴趣,使用这些参考资料来扩展你的知识范围。与前几章不同,你不会总能找到详细的伪代码或实际的代码实现。这样做是为了提供一些新兴领域和新进展的旋风之旅。你应该利用这一章对不同的主题有一个 30,000 英尺的了解。基于您的特定兴趣,您应该使用这里给出的参考资料作为起点,深入研究特定的主题。
我们还会谈到一些流行的图书馆和继续学习的方法。
基于模型的 RL:其他方法
在前一章中,我们看了基于模型的 RL,其中我们通过让代理与环境交互来学习模型。然后,所学习的模型被用于生成额外的转换,即,通过与真实世界的实际交互来增加由代理收集的数据。这是 Dyna 算法采用的方法。
虽然 Dyna 有助于加快学习过程,并解决无模型 RL 中出现的一些样本低效问题,但它主要用于简单函数近似器的问题。在需要大量样本来训练的深度学习函数近似器中,它还没有成功;由于模拟器精确模拟世界的能力不完善,来自模拟器的太多训练样本会降低学习质量。在这一节中,我们将看看最近在深度学习的背景下将学习模型与无模型方法相结合的一些方法。
世界模特
在 2018 年题为“世界模型”的论文中, 1 作者提出了一种建立生成神经网络模型的方法,这是环境的空间和时间方面的压缩表示,并使用它来训练代理。
我们人类发展了一种对周围世界的心理模型。我们不会存储环境中所有最小的细节。相反,我们存储世界的抽象高级表示,它压缩了世界的空间方面和时间方面以及世界的不同实体之间的关系。我们只存储我们接触过的或与我们相关的世界的一部分。
我们着眼于当前的状态或手头任务的背景,思考我们想要采取的行动,并预测行动将把我们带入的状态。基于这种预测思维,我们选择最佳行动。想想棒球击球手。他有几毫秒的时间来行动,在正确的时间和正确的方向挥动球棒来接球。你认为他是怎么做到的?经过多年的练习,击球手已经开发了一个强大的内部模型,在这个模型中,他可以预测球的未来轨迹,并可以从现在开始挥动球棒,几毫秒后到达轨迹中的准确点。一个好的玩家和一个坏的玩家之间的区别很大程度上归结于玩家基于其内部模型的预测能力。多年的实践使整个事情变得直观,而无需在头脑中进行大量有意识的规划。
在论文中,作者展示了他们如何使用一个大型/强大的循环神经网络(RNN)模型(他们称之为世界模型)和一个小型控制器模型来实现这种预测内部模型。小控制器模型的原因是将信用分配问题保持在界限内,并且在训练期间使策略迭代得更快。同时,大的“世界模型”允许它保留拥有环境的良好模型所需的所有空间和时间表达性,并拥有小的控制器模型以在训练期间将策略搜索集中在快速迭代上。
作者探索了在生成的世界模型上训练代理的能力,完全取代了与真实世界的交互。一旦代理在内部模型表示上训练有素,学习到的策略就被转移到现实世界。他们还展示了在内部世界模型中添加一个小的随机噪声的好处,以确保代理不会过度利用学习模型的缺陷。
接下来让我们来看一下所用模型的细分。图 10-1 给出了流水线的高级概述。在每一个瞬间,代理接收到来自环境的观察。
图 10-1
“世界观”中使用的代理模型概述转载自 Ha 和 Schmidhuber《循环世界模型促进政策演进》2018 2
世界模型由两个模块组成。
-
视觉模型(V)使用来自深度学习的变分自编码器(VAE)将高维图像(观察向量)编码成低维潜在向量。潜向量 z ,模块 V 的输出,将观测的空间信息压缩成更小的向量。
-
潜在向量 z 被馈送到记忆 RNN (M)模块中,以捕捉环境的时间方面。作为一个 RNN 网络,M 模型压缩了一段时间内发生的事情,并作为一个预测模型。因为许多复杂的环境是随机的,也因为我们学习中的不完善,M 模型被训练来预测下一个状态P(Zt+1)的分布,而不是预测确定性的值Zt+1。它通过基于当前和过去(RNN 部分)预测下一个潜在向量Zt+1的分布,作为高斯分布P(Zt+1|at, z 的混合这就是为什么它被称为基于循环神经网络 (MDM-RNN)的混合密度模型。
控制器模型负责获取空间信息( z t )和时间信息( h t ),将它们连接在一起,并馈入单层线性模型。信息的总体流程如下:
-
代理在时间 t 得到一个观察值。观察结果被输入到 V 模型中,V 模型将其编码成一个更小的潜在向量zt。
-
接下来,潜在向量被馈入预测 z t + 1 ,即 h t 的 M 模型。
-
V 和 M 模型的输出被连接并馈入 C 控制器,C 控制器产生动作 a t 。换句话说,用 z t 和zt+1,预测 a t 。
-
该动作被反馈到现实世界中,并且被 M 模型用来更新其隐藏状态。
-
现实世界中的动作产生下一个状态/观察,下一个循环开始。
关于伪代码、所用网络的实现细节以及训练中使用的损耗等其他细节,请参考前面引用的论文。在论文中,作者还谈到了他们如何使用预测能力,通过反馈预测 z t + 1 作为下一个真实世界的观察,来提出假设场景。他们进一步展示了他们如何能够在“梦幻世界”中训练一个智能体,然后将所学知识转移到现实世界中。
想象力增强代理(I2A)
如前所述,Dyna 提出了一种结合无模型和基于模型方法的方法。无模型方法在复杂环境中具有更高的可扩展性,并且已经被认为在深度学习中工作良好。然而,这些不是样本有效的,因为深度学习需要大量的训练样本才能有效。即使是一个简单的雅达利游戏策略培训也可能需要数百万个例子才能得到培训。另一方面,基于模型的是样本高效的。Dyna 提供了一种结合两种优势的方法。除了使用真实世界的过渡来训练代理之外,真实世界的过渡还用于学习用于生成/模拟附加训练示例的模型。然而,问题是模型学习可能并不完美,除非考虑到这一事实,否则在复杂的深度学习结合强化学习中直接使用 Dyna 并不能给出好的结果。缺乏模型知识会导致过度乐观和代理人表现不佳。
与之前使用世界模型的方法一样,想象力增强代理 (I2A)方法结合了基于模型和无模型的方法,使这种结合的方法能够很好地适用于复杂的环境。I2A 形成一个近似的环境模型,并通过“学习解释”学习到的模型缺陷来利用它。它提供了一种端到端的学习方法来提取从模型模拟中收集的有用信息,而不仅仅依赖于模拟的回报。代理人使用内部模型,也称为想象,寻求积极的结果,同时避免不利的结果。来自 DeepMind 的作者在其 2018 年题为想象力增强的深度强化学习代理3的论文中表明,这种方法可以在更少的数据和不完善的模型下更好地学习。**
**图 10-2 详细描述了参考文件中解释的 I2A 架构。
-
图 10-2(a) 中的环境模型,在给定当前信息的情况下,对未来做出预测。想象核心(IC)有一个策略网络),它将当前观察)(真实的或想象的)作为输入,并产生一个展示动作)。观察)和首次展示行动)被输入到环境模型,一个基于 RNN 的网络,以预测下一次观察)和奖励)。
-
许多这样的集成电路串在一起,将前一个集成电路的输出馈送到下一个集成电路,并产生一个长度为 τ 的图像展示轨迹,如图 10-2(b) 所示。 n 产生这样的轨迹)。由于学习模型不能被认为是完美的,仅仅依赖于预测的回报可能不是一个好主意。此外,轨迹可以包含奖励序列之外的信息。因此,每个卷展栏通过顺序处理输出进行编码,以在每个轨迹上获得嵌入,如图 10-2(b) 右侧所示。
-
最后,图 10-2© 中的聚合器将这些单独的 n 个展开组合起来,并作为一个额外的上下文提供给策略网络,以及直接提供观察的无模型路径。
图 10-2
I2A 架构。它描述了(a)中的 IC、(b)中的单个想象力展示以及©中的完整 I2A 架构。转载自论文《深度强化学习的想象力-增强代理》,2018 4
该论文的作者表明,在步骤(b)中学习卷展编码器在能够很好地处理不完美模型学习中起着重要作用。
具有无模型微调的基于模型的 RL(MBMF)
在 2017 年题为基于模型的深度强化学习的神经网络动力学与无模型微调的论文中,作者展示了另一种结合无模型和基于模型的 RL 的方法。他们研究了运动任务的领域。训练机器人运动的无模型方法具有高样本复杂性,这是我们在所有基于深度学习的模型中看到的。作者将无模型和基于模型的方法结合起来,提出了样本高效模型,以使用中等复杂性的神经网络来学习具有不同任务目标的运动动力学。**
**问题假设奖励函数rt=r(st, a t )给定。本文给出了前进和轨迹跟随的奖励函数的例子。轨迹由稀疏的路点显示,这些路点定义了机器人需要遵循的路径。航路点是给定轨迹上的点,当用线连接时,接近给定轨迹,如图 10-3 所示。有关如何将航路点用于轨迹规划的更多详细信息,请参考任何关于自动驾驶汽车和机器人的文本。
图 10-3
轨迹和航路点
在任何一点上,机器人计划的行动顺序都要考虑。对于每个动作,连接当前状态)和估计的下一状态)的线段被投影到连接轨迹的两个连续航路点的最近线段上。如果机器人沿着航路点线段移动,奖励为正,垂直于航路点线段移动,奖励为负。类似地,他们对前进的目标有另一套奖励函数。
神经网络正在学习动力学)。但是,网络不是预测 s * t * + 1 ,而是取( s * t , a t )并预测差值s*t+1-st。预测差异而不是整个新状态会放大变化,并允许捕捉微小的变化。
奖励函数和动态模型被馈送到模型预测控制器 (MPC)。MPC 接受奖励和下一个状态,使用预测的 s t + 1 作为预测st+2的新输入,提前计划 H 步骤,以此类推。 K 个随机生成的动作序列,每个长度为 H 步,进行评估,根据 K 个序列中最高的累积奖励,找到初始时间步 t 的最佳动作。然后机器人采取动作at。此时,样本序列被丢弃,并且在时间 t + 1 完成下一个 K 序列的完全重新计划,每个序列的长度为 H 。使用该模型的预测控制器(而不是开环方法)确保误差不会向前传播。每一步都有重新计划。图 10-4 给出了完整算法。
MODEL-BASED REINFORCEMENT LEARNING
图 10-4
MBMF 算法
一旦模型被训练,为了进一步改进模型,作者通过初始化一个无模型代理来微调它,该代理具有如前面所示训练的基于模型的学习者。无模型训练可以用我们以前学过的任何一种方法来完成。这就是将其命名为基于模型,无模型微调 (MBMF)的原因。
基于模型的价值扩展(MBVE)
在 2018 年题为“基于模型的价值扩展,用于高效的无模型强化学习”的论文中, 5 作者采用了将基于模型和无模型的方法与已知的奖励函数相结合的方法,以获得更有纪律的价值估计方法。
该算法通过学习系统动力学)来模拟轨迹的短期视界,通过 Q 学习来估计长期值。这通过为训练提供更高质量的目标值来改进 Q 学习。
作者显示了将 MBVE 与 DDPG 组合与普通 DDPG 相比的性能,并证明了通过将 MBVE 与 DDPG 组合的显著改善。
模仿学习和逆向强化学习
还有一个学习分支叫做模仿学习。通过它,我们可以记录专家的互动,然后使用监督设置来学习可以模仿专家的行为。
如图 10-5 所示,我们有一个专家查看状态st并产生动作 a t 。我们在监督设置中使用该数据,其中状态 s t 作为模型的输入,动作 a t 作为学习策略πθ(at|st的目标这是学习一种行为最简单的方法,叫做行为克隆。它甚至比强化学习的整个学科还要简单。系统/学习者不分析或推理任何事情;它只是盲目地学习模仿专家的行为。
图 10-5
专家论证
然而,学习并不完美。假设你学习了一个近乎完美的政策,但有一些小错误,假设你从状态 s 1 开始。你遵循学到的策略采取行动a1,这与专家会采取的行动有一点小偏差。你不断地按顺序采取这些行动,有些与专家的行动一致,有些则与专家的行动稍有偏差。这些多次动作的偏差会累积起来,将您的车辆(图 10-5 )带到道路边缘。现在,最有可能的是,这位专家不会把车开得那么糟糕,开到路的边缘。专家训练数据从未看到专家在这种情况下会做什么。这项政策没有受过这种情况的训练。学习到的策略将最有可能采取随机的行动,并且绝对不是为了纠正错误以将车辆带回到道路中心而设计的。
这是一个开环问题。每一个动作的误差都在增加,使得实际轨迹偏离专家轨迹,如图 10-6 所示。
图 10-6
轨迹随时间漂移
这也被称为分布转移。换句话说,策略训练中的状态分布不同于代理在没有纠正反馈的开放循环中执行策略时看到的状态分布。
在这种情况下,有附加误差,有一种替代算法称为 DAgger (用于“数据集聚合”),其中通过首先根据专家演示的数据训练代理来迭代训练代理。经过训练的策略用于生成附加状态。然后,专家为这些生成的状态提供正确的操作。增加的数据与原始数据一起再次用于微调策略。如此循环下去,代理人在跟随行为方面越来越接近专家。这可以归类为直接政策学习。图 10-7 给出了匕首的伪代码。
DAGGER
图 10-7
行为克隆匕首
DAgger 有一个人类专家标记看不见的状态,因为 Figure 10-7 策略被执行,它训练代理从错误/漂移中恢复。匕首简单高效。然而,它只是行为克隆而不是强化学习。除了试图学习一种行为来跟随专家的动作之外,它不考虑任何事情。如果专家覆盖了代理可能看到的状态空间的很大一部分,这个算法可以帮助代理学习一个好的行为。然而,任何需要长期规划的事情都不适合 DAgger。
如果不是强化学习,为什么在这里说?事实证明,在许多情况下,让专家进行演示是理解代理试图实现的目标的好方法。当与其他增强相结合时,模仿学习是一种有用的方法。我们将讨论这样一个问题。
到目前为止,在本书中我们已经研究了各种算法来训练代理。对于一些算法,我们知道动态和转换,如基于模型的设置,在其他算法中,我们在无模型设置中学习,而没有显式学习模型,最后在其他算法中,我们从与世界的交互中学习模型,以增强无模型学习。然而,在所有这些情况下,我们认为奖励是简单的,直观的,众所周知的。在其他一些情况下,我们可以手工制作一个简单的奖励函数,例如,学习使用 MBMF 跟踪一个轨迹。但所有现实世界的案例都没有这么简单。奖励有时是不明确的和/或稀疏的。在没有明确奖励的情况下,以前的算法都不起作用。
考虑这样一种情况,你正试图训练一个机器人拿起一壶水,把水倒在一个玻璃杯里。整个序列中每个动作的回报是什么?当机器人能够将水倒入玻璃杯,而不会将水洒在桌子上或打碎/掉落水壶/玻璃杯时,它会是 1 吗?还是会根据洒了多少水来定义一个奖励范围?你将如何诱导一种行为让机器人像人类一样学习流畅的动作?你能想出一种奖励,能够给机器人提供正确的反馈,告诉它什么是好的一步,什么是坏的一步吗?
现在看看另一种情况。机器人可以看到人类完成倒水的任务。它不是学习一种行为,而是首先学习一种奖励功能,将所有与人类行为匹配的行为记录为好,其他行为为坏,好的程度取决于与它看到的人类行为的偏离程度。然后,作为下一步,它可以使用所学习的奖励函数来学习执行类似动作的策略/动作序列。这是逆强化学习 再加上模仿学习的领域。
表 10-1 比较了行为克隆、直接策略学习和反向 RL。
表 10-1
模仿学习的类型
| |直接政策学习
|
奖励学习
|
接触环境
|
交互式演示者/专家
|
预先收集的演示
|
| — | — | — | — | — | — |
| 行为克隆 | 是 | 不 | 不 | 不 | 是 |
| 直接政策学习 | 是 | 不 | 是 | 是 | 可选择的 |
| 逆向强化学习 | 不 | 是 | 是 | 不 | 是 |
反向强化学习是 MDP 设置,其中我们知道模型动态,但我们不知道奖励函数。数学上,我们可以表达如下:
)
)
)
图 10-8 显示了逆 RL 的高级伪代码。我们从专家那里收集样本轨迹,并用它们来学习奖励函数。接下来,使用学习到的奖励函数,我们学习一个使奖励最大化的策略。将学习到的策略与专家进行比较,并使用差异来调整学习到的奖励。如此循环下去。
INVERSE RL
图 10-8
逆向强化学习
请注意,内部 do 循环有一个迭代学习策略的步骤(步骤 2,“学习策略给定奖励函数”)。它实际上是一个抽象成单行伪代码的循环。当状态空间是连续的和高维的,以及当系统动力学未知时,我们需要调整以使之前的方法工作。在 2016 年题为“引导成本学习:通过政策优化进行深度逆最优控制”的论文中, 6 作者使用了最大熵逆 RL 7 的基于样本的近似。您可以查看之前引用的论文以了解更多详细信息。图 10-9 显示了该方法的高级示意图。
图 10-9
引导成本学习:通过政策优化的深度逆最优控制
该架构可以比作来自深度学习的生成对抗网络 (GANs)。在 GAN 中,发生器网络试图产生合成样本,鉴别器网络试图给实际样本打高分,而给合成样本打低分。生成器试图更好地生成越来越难以从“真实世界的例子”中区分的例子,而鉴别器在区分合成和真实世界的例子方面变得越来越好。
同样,图 10-9 中给出的引导成本学习可以被认为是一个 GAN 设置,其中鉴别器在给予人类观察高回报的同时给予政策网络生成的行动/轨迹低回报。政策网络在产生类似人类专家的行动方面变得越来越好。
结合模仿学习的逆向学习有很多用途。
-
制作动画电影中的角色:可以随着角色说的话同步移动面部和嘴唇。人类专家的面部/嘴唇运动首先被记录下来(除了演示),一个策略被训练成使角色的面部/嘴唇像人类一样运动。
-
词性标注:这是基于一些专家/人工标注。
-
平滑模仿学习:让一个自主摄像机跟随篮球这样的比赛,类似于人类操作会做的事情,跟随球穿过球场,根据某些事件缩放和平移。
-
协调的多智能体模仿学习:观看足球比赛(人类专家示范)的录像,然后学习一个策略,根据序列预测球员的下一个位置。
模仿学习是一个迅速扩展的领域。我们只是简单地介绍了一下这个话题。有很多好地方可以开始探索这些主题。关于模仿学习的 ICML2018 教程是一个很好的起点。这是一个两小时的视频教程,由加州理工学院的两位专家提供幻灯片。
无导数方法
让我们回到我们在本书主要部分看到的常规无模型 RL。在这一节中,我们将简要地谈一谈允许我们改进政策的方法,而不用对政策参数θ求导π θ ( a | s )。
我们将看看进化的方法。它们为什么会进化?因为它们像自然进化一样运作。更好/更适合的东西生存下来,更弱的东西逐渐消失。
我们看到的第一种方法叫做交叉熵方法。这简单得令人尴尬。
-
选择一个随机政策。
-
展开几个会话。
-
选择一定比例的奖励较高的会议。
-
改进策略以增加选择这些操作的概率。
图 10-10 给出了训练一个连续动作策略的交叉熵方法的伪代码,假设该策略是一个具有 d 维动作空间的正态分布。也可以使用任何其他分布,但是对于许多领域,已经表明正态分布在平衡分布的可表达性和分布的参数数量方面是最好的。
CROSS-ENTROPY METHOD
图 10-10
交叉熵方法
一种叫做协方差矩阵自适应进化策略 (CMA-ES)的类似方法在图形世界中很流行,用于优化角色的步态。在交叉熵方法中,我们将对角线高斯拟合到前 k%的展开。然而,在 CMA-ES 中,我们优化了协方差矩阵,与通常的导数方法中的一阶模型学习相比,它相当于二阶模型学习。
交叉熵方法的一个主要缺点是,它们对于相对低维的动作空间,如CartPole
、LunarLander
等,工作得很好。进化策略可以为具有高维行动空间的深度网络策略服务吗?在 2017 年题为“进化策略作为强化学习的可扩展替代方案”的论文中, 9 作者表明,es 可以可靠地训练神经网络策略,这种方式非常适合于扩大到现代分布式计算机系统,用于在 MuJoCo 物理模拟器中控制机器人。
让我们从概念上介绍一下本文中采用的方法。考虑一个政策参数的概率分布:θ∽Pμ(θ)。这里θ表示策略的参数,这些参数遵循μ参数化的某种概率分布Pμ(θ)。
我们的目标是找到政策参数 θ ,使其生成最大化累积回报的轨迹。这类似于我们对政策梯度方法的目标。
)
与政策梯度一样,我们做随机梯度上升,但与政策梯度不同,我们不在θ中这样做,而是在μ空间中这样做。
)
(10.1)
前面的表达式类似于我们在政策梯度中看到的。然而,有一个微妙的区别。我们不是在θ上做梯度步长。因此,我们不用担心π θ ( a | s )。我们忽略了关于轨迹的大部分信息,即状态、动作和奖励。我们只担心政策参数θ和总轨迹报酬 R (τ)。这反过来支持非常可扩展的分布式培训,类似于运行多个工作人员的 A3C 方法,如图 7-10 所示。
我们来举一个具体的例子。假设θ∾Pμ(θ)是均值为μ的高斯分布,协方差矩阵为σ 2 。我。那么( 10.1 )中“期望”内部给出的logPμ(θ)可以表示如下:
)
取上一表达式相对于μ的梯度,我们得到:
)
假设我们绘制两个参数样本θ 1 和θ 2 ,得到两个轨迹:τ 1 和τ 2 。
)
(10.2)
这仅仅是将( 10.1 中的期望值转换为基于两个样本的估计值。你能解释方程式( 10.2 )吗?这个分析类似于我们在第七章中所做的。如果轨迹的回报是+ve,我们调整均值μ以接近θ。如果轨迹回报是-ve,我们将μ从采样的θ移开。换句话说,就像政策梯度一样,我们调整μ来增加好轨迹的概率,减少坏轨迹的概率。然而,我们这样做是通过直接调整参数来源的分布,而不是调整政策所依赖的θ。这允许我们忽略状态和动作等的细节。
之前引用的论文使用了对立采样。换句话说,它采样一对带有镜像噪声的策略(θ+=μ+σϵ,θ-=μ-σϵ),然后采样两个轨迹τ + 和τ-以评估(10.2 将这些代入( 10.2 ,表达式可简化如下:
)
前面的操作允许在工人和参数服务器之间有效地传递参数。开始的时候,μ是已知的,只需要沟通ϵ,减少了需要来回传递的参数数量。它在使方法并行化方面带来了显著的可伸缩性。
图 10-11 显示了并行化的进化策略伪代码。
PARALLELIZED EVOLUTION STRATEGIES
图 10-11
并行化进化策略算法 2 10
论文作者报告了以下内容:
-
他们发现,使用虚拟批量标准化和神经网络策略的其他重新参数化大大提高了进化策略的可靠性。
-
他们发现进化策略方法是高度并行的(如前所述)。特别是,使用 1,440 名工人,它能够在不到 10 分钟的时间内解决 MuJoCo 3D 人形任务。
-
进化策略的数据效率出奇的好。一个小时的 ES 结果需要的计算量与公布的异步优势因素评论家(A3C)一天的结果大致相同。在 MuJoCo 任务上,我们能够匹配 TRPO 学习到的政策表现。
-
ES 表现出比 TRPO 等策略梯度方法更好的探索行为。在 MuJoCo 人形任务上,ES 已经能够学习各种各样的步态(比如侧着走或者倒着走)。TRPO 从未观察到这些不寻常的步态,这表明了一种性质不同的探索行为。
-
他们发现进化策略方法是稳健的。
如果你有兴趣,你应该通读参考文件,深入了解细节,看看它与其他方法相比如何。
迁移学习和多任务学习
在前几章中,我们研究了如何使用 DQN 和策略梯度算法来训练代理人玩 Atari 游戏。如果你查阅展示这些实验的论文,你会注意到一些 Atari 游戏更容易训练,而一些则更难训练。如果你看看 Atari 游戏《突围》与《蒙特祖马的复仇》,如图 10-12 所示,你会注意到,与训练蒙特祖马相比,《突围》更容易训练。这是为什么呢?
图 10-12
雅达利游戏简单易学
突围有简单的规则。但是,图 10-12 右侧蒙特祖马的复仇有一些复杂的规则。它们不容易学。作为一个人,即使我们是第一次玩这个游戏,并且事先不知道确切的规则,我们知道“钥匙”是我们通常用来打开新东西和/或获得大奖励的东西。我们知道“梯子”可以用来爬上爬下,而“头骨”是要避免的。换句话说,我们过去玩过其他游戏或读过寻宝游戏或看过一些电影的经验给了我们背景,或以前的学习,让我们快速执行我们可能从未见过的新任务。
事先了解问题结构可以帮助我们快速解决新的复杂任务。当代理解决先前的任务时,它获得有用的知识,可以帮助代理解决新的任务。但是这些知识储存在哪里呢?以下是一些可能的选项:
-
Q 函数:它们告诉我们什么是好的状态和行为。
-
政策:它们告诉我们哪些行为是有用的,哪些是无用的。
-
模型:它们编纂了关于世界如何运转的知识,比如牛顿定律、摩擦、重力、动量等物理定律。
-
特征/隐藏状态:神经网络的隐藏层抽象出更高层次的结构和知识,这些结构和知识可以在不同的领域/任务中推广。我们在监督学习的计算机视觉中看到了这一点。
利用从一组任务中获得的经验来更快、更有效地完成新任务的能力称为迁移学习,即将从过去经验中获得的知识转移到新任务中。我们看到这在监督学习中有着重要的应用,特别是在计算机视觉领域,在 ImageNet 数据集上训练的 ResNet 等流行的卷积网络架构被用作预训练网络来训练新的视觉任务。我们将简要地看一下这项技术如何应用于强化学习领域。让我们定义一些迁移学习文献中常见的术语。
-
任务:在 RL 中,我们试图训练代理解决的 MDP 问题。
-
源域:首先训练代理的问题。
-
目标领域:我们希望通过利用来自“源领域”的知识来更快解决的 MDP
-
Shot :目标域的尝试次数。
-
0-shot :直接在目标域上运行在源域上训练的策略。
-
1-shot :在目标域上只重新培训一次经过源域培训的代理。
-
少量:在目标域上对源域的训练有素的代理进行几次再培训。
接下来,让我们看看如何在强化学习的背景下将从源领域获得的知识转移到目标领域。在这一点上,已经尝试了三大类方法。
-
前转:训练一个任务,转到新任务。
-
多任务转移:多任务训练,转移到新任务。
-
传送型号和值 功能。
我们将简要讨论每一种方法。正向迁移是监督学习中,尤其是计算机视觉中最常见的知识迁移方式之一。一个模型,如流行的架构 ResNet,被训练来对 ImageNet 数据集上的图像进行分类。这叫做预训练。然后通过替换最后一层或最后几层来改变训练的模型。该网络接受了一项名为微调的新任务的再培训。然而,强化学习中的正向迁移会面临一些领域转换的问题。换句话说,在源域中学习的表征在目标域中可能不太适用。此外,MDP 也有所不同。换句话说,某些事情在源域中是可能的,而在目标域中是不可能的。还有微调的问题。例如,在源域上训练的策略可能在概率分布上具有尖锐的峰值,几乎接近确定性。这种 pekad 分布可能会妨碍对目标域进行微调时的探索。
监督学习中的迁移学习似乎工作得很好,这可能是因为 ImageNet 数据集中的大量不同图像有助于网络学习非常好的通用表示,然后可以针对特定任务进行微调。然而,在强化学习中,任务通常很少多样化,这使得代理更难学习高级概括。此外,还存在策略过于确定的问题,这阻碍了在微调期间探索更好的收敛。这个问题可以通过使策略在具有熵正则项的目标的源域上学习来处理,这是我们在前面章节的几个示例中看到的,例如第八章中的软行为者批评(SAC)。熵正则化确保在源系统上学习的策略保留足够的随机性,以允许在微调期间进行探索。
还有另一种方法可以使源领域的学习更加通用。我们可以给源域添加一些随机化。比方说,我们正在训练一个机器人去完成某项任务;我们可以用机器人每个手臂的不同质量或摩擦系数来实例化源域的许多版本。这将诱导代理学习底层物理,而不是记忆在特定配置中做得好。在另一个涉及图像的真实世界设置中,我们可以再次借鉴计算机视觉的“图像增强”实践,其中我们用一些随机旋转、缩放等来增强训练图像。
接下来,我们来看看多任务迁移,这是迁移学习的第二种方法。这里有两个关键的想法:加速一起执行的所有任务的学习,并解决多个任务,以便为目标领域提供更好的预训练。
一种在多任务上训练代理的简单方法是用表示特定任务的代码/指示符来扩充状态,例如,将状态 S 扩展为( S + 指示符)。当一集开始时,系统随机选择一个 MDP(任务),然后根据初始状态分布选择初始状态。然后像其他 MDP 一样进行训练。图 10-13 显示了这种方法的示意图。这种方法有时会很困难。想象一下,一项政策在解决特定的 MDP 方面变得越来越好;优化将开始以牺牲他人为代价优先学习那个 MDP。
图 10-13
一起解决多项任务
我们也可以训练代理分别解决不同的任务,然后结合这些学习来解决一个新的任务。我们需要以某种方式将从不同任务中学到的策略组合/提炼成一个单一的策略。有多种方法可以实现这一点,我们在这里就不赘述了。
让我们看看多任务转移的另一种变化:单个代理在同一环境中学习两个不同的任务。一个例子是一个机器人学习洗衣服以及清洗餐具。在这种方法中,我们增加状态来添加任务的上下文并训练代理。这就是所谓的背景政策。使用这种方法,状态表示如下:
)
我们学习的政策如下:
)
这里,ω是上下文,即任务。
最后,还有第三种迁移学习方法,即迁移模型或价值函数。在这个设置中,我们假设源域和目标域中的动态p(st+1|st, a t )是相同的。但是,奖励函数是不同的;例如,自动驾驶汽车学习驾驶到一小组地方(源域)。然后,它必须导航到新的目的地(目标域)。我们可以转移三者中的任何一个:模型、价值函数或策略。模型是一个合乎逻辑的选择并且简单的转移,因为模型p(st+1|s|t, a t )原则上是独立于奖励函数的。转移策略通常是通过上下文策略来完成的,但是由于策略πθ(a|s)包含的关于动态函数的信息最少,因此转移策略并不容易。价值函数传递也不是那么简单。价值函数耦合了动力、回报和政策。
我们可以使用后继特征和表征进行价值转移,其细节可以在详述迁移学习的文本中找到。
元学习
我们已经研究了让代理从经验中学习的各种方法。但这是人类学习的方式吗?当前的人工智能系统擅长掌握一项技能。我们有像 AlphaGo 这样的代理人,他们打败了最好的人类围棋选手。IBM Watson 击败了最佳人类危险游戏选手。但是 AlphaGo 会玩桥牌这种卡牌游戏吗?危险代理可以进行智能聊天吗?特技飞行的专家直升机操控员可以用来执行救援任务吗?相比之下,人类学会在许多新的情况下聪明地行动,利用他们过去的经验或当前的专业知识。
如果我们希望代理能够获得跨不同领域的许多技能,我们不能以数据低效的方式为每个特定任务训练代理——当前 RL 代理的方式。为了获得真正的人工智能,我们需要代理能够通过利用他们过去的经验来快速学习新任务。这种学习的方法被称为元学习。这是使 RL 智能体像人一样,根据经验不断学习和提高,有效地完成各种任务的关键一步。
元学习系统在许多不同的任务(元训练集)上被训练,然后在新的任务上被测试。术语元学习和迁移学习可能会混淆。这些是不断发展的学科,术语的使用并不一致。然而,区分它们的一个简单方法是将元学习视为学习优化模型的超参数(例如,节点数量、架构),将迁移学习视为微调已经调好的网络。
在元学习期间,有两种优化在起作用:学习者,它学习(优化)任务;以及元学习者,它训练(优化)代理。元学习方法有三大类。
-
循环模型(Recurrent models):这种方法通过元训练集中的任务片段来训练一种循环模型,如长短期记忆(LSTM)。
-
度量学习:在这种方法中,代理学习一个新的度量空间,在这个空间中学习是有效的。
-
学习优化者:在这种方法中,有两个网络:元学习和学习者。元学习者学习更新学习者网络。元学习者可以被认为是学习优化模型的超参数,而学习者网络可以被认为是用于预测动作的规则网络。
这是一个很有潜力的有趣的研究领域。感兴趣的读者可以参考机器学习国际会议(ICML-2019)的一篇精彩教程。 11
流行的 RL 图书馆
我们将简要地看一下用于强化学习的流行库。有典型的三类:实现一些流行环境的库,负责深度学习的库,以及实现我们在本书中看到的许多流行 RL 算法的库。
就增强现实环境而言,开放体育馆 12 是迄今为止最受欢迎的图书馆。有不同类型的环境,从简单的经典控制到雅达利游戏到机器人。如果你想使用雅达利游戏,你将需要额外的安装。有一个流行的库,使用一个叫做 MuJoCo 的物理模拟器来执行连续控制任务。MuJoCo 13 需要付费许可。然而,它提供了一个免费的试用许可证以及一个免费的学生许可证。雅达利的游戏也需要额外安装,但都是免费的。
我们已经尝试了健身房的一些环境。作为下一步的一部分,你应该看看许多其他环境,尝试各种学习算法,无论是手工制作的还是流行的 RL 库中的实现。
接下来是深度学习库。有很多,但最受欢迎的是谷歌的 TensorFlow 和脸书的 PyTorch。另一个库,来自深层思想的十四行诗, 14 建立在 TensorFlow 之上,抽象常见模式。Apache MXNet 是另一个流行的库。还有一些,但提到的是目前最受欢迎的。我们建议您掌握其中一个流行的库,然后分支学习其他流行的深度学习库。目前,PyTorch 正在获得超过 TensorFlow 的巨大牵引力。你可以选择这两个中的任何一个作为你的第一个深度学习库,并在扩展到其他库之前先掌握它。
最后一类是实现通用 RL 算法的流行库。我们在这里列出了受欢迎的几个:
-
open ai Spinning Up15:这是进一步扩展您的知识并深入了解实现基础的理想选择。本书中的一些代码演练是 Spinning Up 实现的修改版本。
-
OpenAI 基线 16 : OpenAI 基线是一套强化学习算法的高质量实现。这些算法使研究界更容易复制、提炼和识别新想法,然后创建良好的基线来进行研究。
-
稳定基线 17 :稳定基线是基于 OpenAI 基线的 RL 算法的一组改进实现。
-
Garage18:Garage 是一个开发和评估强化学习算法的工具包。它附带了一个使用该工具包构建的最新实现库。
-
Keras RL19:Keras RL 用 Python 实现了一些最先进的深度强化学习算法,并与深度学习库 Keras 无缝集成。此外,Keras RL 与 OpenAI 健身房合作。这意味着评估和试验不同的算法很容易。
-
tensor force20:tensor force 是一个开源的深度强化学习框架,强调模块化的灵活库设计和在研究和实践中应用的简单易用性。TensorForce 建立在 Google 的 TensorFlow 框架之上,需要 Python 3。
可能还有很多,新的总是会出现。然而,前面的列表已经很大了。正如我们所说,您应该选择一个深度学习库、一个环境框架和一个 RL 实现。首先,我们推荐 TensorFlow 的 PyTorch 和 Gym and Spinning Up。
如何继续学习
深度强化学习有了很大的发展,这是今天让代理从经验中学习智能行为的最受欢迎的方法。我们希望这本书只是你的一个开始。我们希望你能继续了解这个令人兴奋的领域。您可以使用以下资源继续学习:
-
寻找课程和在线视频来扩展知识。麻省理工学院、斯坦福大学和加州大学伯克利分校有许多在线课程,这些课程是深入研究这一学科的合理选择。有一些来自 Deep Mind 和该领域其他专家的 YouTube 视频。
-
养成定期访问 OpenAI 和 Deep Mind 网站的习惯。他们有大量补充研究论文的材料,并且是我们在本书中看到的许多算法的基础。
-
为强化学习领域的新论文设置一个谷歌提醒,并尝试跟踪这些论文。阅读研究论文是一门艺术,斯坦福大学的吴恩达教授就如何掌握一门学科给出了一些有用的建议;参见
https://www.youtube.com/watch?v=733m6qBH-jI
.
最后,不言而喻:请跟随我们在本书中谈到的算法。深入研究构成这些算法基础的论文。尝试自己重新实现代码,或者按照本书附带的笔记本中给出的代码,或者查看实现,特别是在开放的人工智能旋转库中。
摘要
这一章是围绕强化学习的各种新兴主题的旋风之旅,我们无法在本书的核心章节中深入探讨。
我们在前面的章节里讲了很多。然而,还有同样多的主题是我们在前面的章节中无法涵盖的。这一章的目的是通过谈论这些被忽略的话题,让读者对强化学习有一个快速的 360 度的了解。因为我们有很多内容要介绍,所以重点是提供一个高层次的概述,并提供进一步深入研究的指针。
https://worldmodels.github.io/
;https://arxiv.org/pdf/1803.10122.pdf
2
https://worldmodels.github.io/
3
https://arxiv.org/pdf/1707.06203.pdf
4
https://arxiv.org/pdf/1707.06203.pdf
5
https://arxiv.org/pdf/1803.00101.pdf
6
https://arxiv.org/pdf/1603.00448.pdf
7
https://www.aaai.org/Papers/AAAI/2008/AAAI08-227.pdf
8
https://sites.google.com/view/icml2018-imitation-learning/
9
https://arxiv.org/pdf/1703.03864.pdf
10
https://arxiv.org/pdf/1703.03864.pdf
11
https://sites.google.com/view/icml19metalearning
12
13
http://www.mujoco.org/index.html
14
https://github.com/deepmind/sonnet
15
https://spinningup.openai.com/en/latest/
16
https://github.com/openai/baselines
17
https://stable-baselines.readthedocs.io/en/master/
18
https://github.com/rlworkgroup/garage
19
https://github.com/keras-rl/keras-rl
20
https://github.com/tensorforce/tensorforce
****