精通 Python 强化学习(五)

原文:annas-archive.org/md5/39faf67615f2d59edcd86792ee1fcf06

译者:飞龙

协议:CC BY-NC-SA 4.0

第十六章:第十六章:营销、个性化和金融

本章中,我们讨论了强化学习(RL)在三个领域中获得显著关注的情况。首先,我们描述了它如何用于个性化和推荐系统。通过这一点,我们超越了之前章节中介绍的单步强盗方法。一个相关领域也可以从 RL 中受益匪浅,那就是营销。除了个性化营销应用,RL 还可以帮助管理活动预算和减少客户流失等领域。最后,我们讨论了 RL 在金融领域的前景和相关挑战。在这个过程中,我们介绍了 TensorTrade,这是一个用于开发和测试基于 RL 的交易算法的 Python 框架。

因此,在本章中,我们将涵盖以下内容:

  • 超越强盗模型进行个性化

  • 使用强化学习(RL)开发有效的营销策略

  • 将 RL 应用于金融

超越强盗模型进行个性化

当我们在本书的早期章节中讨论多臂强盗和上下文强盗问题时,我们提出了一个案例研究,旨在最大化**点击率(CTR)**的在线广告。这只是一个例子,展示了强盗模型如何用于为用户提供个性化内容和体验,这是几乎所有在线(和离线)内容提供商面临的共同挑战,从电子零售商到社交媒体平台。在这一部分,我们将超越强盗模型,描述一个多步强化学习方法来进行个性化。让我们首先讨论强盗模型的不足之处,然后再看看多步 RL 如何解决这些问题。

强盗模型的缺点

强盗问题的目标是最大化即时(单步)回报。在一个在线广告点击率(CTR)最大化问题中,这通常是一个很好的思考目标:展示在线广告,用户点击,然后完成!如果没有点击,那就是错失。

用户与平台之间的关系,比方说,YouTube 或 Amazon,远比这更复杂。在这些平台上的用户体验是一个过程,而不是一个事件。平台推荐一些内容,如果用户没有点击,也不完全是失败。可能用户发现了推荐的内容有趣且吸引人,只是继续浏览。即使该用户会话没有产生点击或转化,用户也可能很快回来,因为他们知道平台会推荐一些与其兴趣相关的内容。相反,如果会话中有太多的点击,很可能意味着用户没有找到他们想要的内容,从而导致了不好的体验。这种“过程性”的问题特性——即平台(代理)的决策对客户满意度和商业价值(奖励)有下游影响——正是使得多步强化学习成为这里吸引人的方法。

提示

虽然从赌博模型转向多步强化学习是诱人的,但在这么做之前要三思而后行。赌博算法更容易使用,并且具有公认的理论特性,而在多步强化学习的设定中成功训练代理人可能会非常具有挑战性。需要注意的是,许多多步问题可以通过为代理人包含记忆并在当前奖励中考虑动作的期望未来价值,将其转化为单步问题,这样我们就可以留在赌博框架中。

深度强化学习在个性化方面的一个成功实现与新闻推荐相关,由郑等人(2018)提出。在下一节中,我们将描述一种类似的解决方法,灵感来自这项工作,尽管我们的讨论会比论文中的内容更高层次和更广泛。

深度强化学习在新闻推荐中的应用

当我们打开最喜欢的新闻应用时,我们期待阅读一些有趣且可能重要的内容。当然,什么内容是有趣或重要的对每个人来说都不同,因此我们面临个性化问题。正如郑等人(2018)提到的,新闻推荐中有一些额外的挑战:

  • 动作空间并非固定的。实际上,情况恰恰相反:每天涌入大量新闻,每条新闻都有一些独特的特征,这使得很难将问题看作一个传统的 Gym 环境。

  • 用户偏好也是相当动态的:它们随着时间变化而改变和演变。本周对政治感兴趣的用户,下周可能会感到厌倦,转而阅读关于艺术的内容,郑等人(2018)通过数据证明了这一点。

  • 正如我们所提到的,这是一个真正的多步问题。如果有两条新闻可以展示,一条是关于灾难的,另一条是关于体育比赛的,展示前者可能因为其轰动效应而更容易被点击。然而,这也可能导致用户因情绪低落而提前离开平台,从而减少更多平台上的互动。

  • 代理人对用户的观察相对于可能影响用户行为的所有因素来说是非常有限的。因此,环境是部分可观察的。

因此,问题在于从动态库存中选择哪些新闻展示给用户,用户的兴趣一方面随着时间变化,另一方面受到许多代理人未完全观察到的因素的影响。

接下来我们描述一下强化学习问题的组成部分。

观察和动作空间

借鉴郑等人(2018)的研究,关于特定用户和新闻内容的观察和动作空间包括以下信息:

  • 用户特征,与用户在该会话中、当天、过去一周点击的所有新闻的特征相关,用户在不同时间段内访问平台的次数等等。

  • 上下文特征与一天中的时间、星期几、是否是节假日、选举日等信息相关。

  • 用户-新闻特征,例如这篇特定新闻在过去一小时内出现在特定用户的新闻流中的次数,以及与新闻中的实体、主题和类别相关的类似统计数据。

  • 这篇新闻的新闻特征,如主题、类别、提供者、实体名称、过去一小时、过去 6 小时、过去一天的点击次数等。

现在,这构成了一个与我们通常使用的观察-动作空间不同的空间:

  • 前两组特征更像是一种观察:用户出现,请求新闻内容,代理观察用户和与上下文相关的特征。

  • 然后,代理需要选择一个新闻条目进行展示(或者如论文所示,选择一组新闻条目)。因此,新闻相关的特征和用户-新闻特征对应着一个动作。

  • 有趣的是,可用的动作集是动态的,并且它包含了与用户/观察相关的元素(在用户-新闻特征中)。

尽管这不是一种传统的设置,但不要让它吓到你。我们仍然可以估算,例如,给定观察-动作对的 Q 值:我们只需要将所有这些特征输入到一个神经网络中,该网络估算 Q 值。具体来说,论文使用了两个神经网络,一个估算状态值,另一个估算优势,以计算 Q 值,尽管也可以使用一个单独的网络。这个过程在图 16.1 中有说明:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/B14160_16_01.jpg

图 16.1 – 新闻推荐代理的 Q 网络

现在,比较一下传统的 Q 网络:

  • 一个常规的 Q 网络会有多个头,每个头对应一个动作(如果动作头估算的是优势而不是 Q 值,还会有一个额外的头用于价值估算)。这样的网络在一次前向传播中输出给定观察的所有固定动作集的 Q 值估算。

  • 在这种设置下,我们需要对每个可用的新闻条目进行单独的前向传播,基于用户的输入,然后选择具有最高 Q 值的新闻条目。

这种方法实际上类似于我们在第三章中使用的,上下文型强盗

接下来,我们来讨论在这种设置中可以使用的另一种建模方法。

使用动作嵌入

当动作空间非常大和/或在每个时间步骤中有所变化时,就像这个问题中那样,动作嵌入可以用来根据观察选择一个动作。动作嵌入是一个表示动作的固定大小数组,通常通过神经网络的输出得到。

其工作原理如下:

  • 我们使用一个策略网络,它输出的不是动作值,而是意图向量,这是一个固定大小的数字数组。

  • 意图向量携带关于在给定观察情况下理想动作的相关信息。

  • 在新闻推荐问题中,这样的意图向量可能意味着:“根据这些用户和上下文特征,该用户想阅读来自国际联赛、正在进行决赛的团队运动新闻。”

  • 然后,将这个意图向量与可用的动作进行比较。选择与“意图”最“接近”的动作。例如,一篇关于外国联赛团队运动的新闻,但不是正在进行决赛的新闻。

  • 相似度的衡量标准是余弦相似度,它是意图和动作嵌入的点积。

这个设置如图 16.2 所示:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/B14160_16_02.jpg

](https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/B14160_16_02.jpg)

图 16.2 – 使用动作嵌入进行新闻推荐

信息

这种使用嵌入的方法是 OpenAI 为了应对 Dota 2 中巨大的动作空间而引入的。一篇很好的博客解释了他们的方法,链接在这里:neuro.cs.ut.ee/the-use-of-embeddings-in-openai-five/。这种方法也可以很容易地在 RLlib 中实现,具体内容请见:bit.ly/2HQRkfx

接下来,我们来讨论在新闻推荐问题中,奖励函数是什么样的。

奖励函数

在我们在书本开始部分解决的在线广告问题中,最大化点击率(CTR)是唯一目标。而在新闻推荐问题中,我们希望最大化与用户的长期互动,同时也提高即时点击的可能性。这就需要一个衡量用户活跃度的标准,论文中使用了生存模型。

使用对抗式乐队梯度下降进行探索

探索是强化学习(RL)的一个基本组成部分。当我们在模拟中训练 RL 智能体时,尽管我们不介意为了学习而采取不好的行动,只是这会浪费一些计算资源。但如果 RL 智能体是在真实环境中训练的,例如新闻推荐这种场景,那么探索的后果不仅仅是计算效率低下,它可能还会损害用户满意度。

如果你考虑常见的ε-greedy 方法,在探索过程中,它会从整个动作空间中随机选择一个动作,尽管我们知道有些动作其实是很糟糕的。例如,尽管智能体知道读者主要对政治感兴趣,它仍会随机显示一些关于美妆、体育、名人等的新闻,这些对读者来说可能完全没有关联。

克服这个问题的一种方法是逐步偏离贪心策略进行探索,并在智能体通过探索性行动获得好奖励时更新策略。以下是我们可以如何操作:

最后,让我们讨论一下如何训练和部署该模型以获得有效的结果。

模型训练与部署

我们已经提到用户行为和偏好的动态特性。Zheng 等人(2018 年)通过全天频繁训练和更新模型来克服这一问题,从而使得模型能够捕捉到环境中的最新动态。

这结束了我们关于 RL 个性化应用的讨论,特别是在新闻推荐环境中的应用。接下来,我们转向一个相关领域——市场营销,它也可以通过个性化受益,并通过 RL 做得更多。

使用 RL 制定有效的市场营销策略

RL 可以显著改善多个领域的市场营销策略。现在我们来谈谈其中的一些。

个性化营销内容

与上一节相关,市场营销中总是有更多个性化的空间。与其向所有客户发送相同的电子邮件或传单,或进行粗略的客户细分,不如利用 RL 来帮助确定向客户传达个性化营销内容的最佳顺序。

客户获取的市场营销资源分配

市场营销部门通常根据主观判断和/或简单模型来决定如何分配预算。RL 实际上能够提出非常动态的政策来分配市场营销资源,同时利用有关产品的信息、来自不同营销渠道的反馈,以及季节性等上下文信息。

降低客户流失率

零售商长期以来一直研究预测模型,以识别即将流失的客户。在识别后,通常会向客户发送折扣券、促销商品等。但考虑到客户类型及先前行动的反应,采取这些行动的顺序还没有得到充分探讨。强化学习可以有效评估这些行动的价值,减少客户流失。

重新赢回流失的客户

如果你曾经订阅过《经济学人》杂志,然后做了取消订阅的错误决定,你可能收到了很多电话、邮件、通知等等。人们不禁会想,这种垃圾邮件式的做法真的是最佳方法吗?可能不是。而基于强化学习的方法,则可以帮助确定使用哪些渠道、何时使用,并通过最大化客户回流的机会,同时最小化这些努力的成本,来获得相应的好处。

这个列表还可以继续下去。我建议你花一两分钟思考一下,作为某公司的客户,你觉得哪些营销行为令人不安、无效或无关紧要,并思考强化学习如何能够帮助改进这些行为。

接下来,我们本章的最后一个领域:金融。

在金融中应用强化学习

如果我们需要重申强化学习的优势,那就是通过获取用于顺序决策的策略,在不确定性下最大化回报。金融领域岂不是与这种工具的最佳匹配?在金融中,以下几项是成立的:

  • 目标确实是最大化某种货币奖励。

  • 当前做出的决策必定会在未来产生影响。

  • 不确定性是一个决定性因素。

因此,强化学习在金融社区中变得越来越受欢迎。

为了明确,这一部分将不会包含任何成功的交易策略示例,嗯,显然有两个原因:首先,作者并不知晓任何成功策略;其次,即使知道,也不会在书中提及(也没有人会这么做)。此外,在金融中使用强化学习也存在一些挑战。因此,我们将从讨论这些挑战开始。一旦我们站稳脚跟,就会继续定义一些应用领域,并介绍一些可以在该领域使用的工具。

在金融中使用强化学习(RL)面临的挑战

当你第一次玩一款视频游戏时,花了多长时间才能获得不错的成绩?一个小时?两个小时?无论如何,这只是强化学习智能体所需经验的微不足道一部分,如果不是数亿次游戏帧的话,可能需要数百万次。因为强化学习智能体在这样的环境中获得的梯度噪声太大,导致我们所使用的算法无法快速学习。而且,毕竟视频游戏并不那么难。

你是否曾想过,成为股市成功交易员需要具备什么条件?多年金融经验,或许还有物理学或数学的博士学位?即便如此,交易员也很难击败市场表现。

这可能是一个过于冗长的声明,旨在让你相信通过股市交易赚钱很困难,原因如下:

  • 金融市场是高度高效的(尽管不是完美的),并且预测市场是非常困难的,甚至几乎不可能。换句话说,信号在金融数据中非常微弱,几乎完全是噪声

  • 金融市场是动态的。今天有利可图的交易策略可能不会持续太久,因为其他人可能会发现相同的策略并进行交易。例如,如果人们知道比特币会在第一次日全食时交易到 10 万美元,那么价格现在就会跳到那个水平,因为人们不会等到那天才购买它。

  • 与视频游戏不同,金融市场是现实世界中的过程。因此,我们需要创建一个模拟环境,以便能够收集大量数据,训练一个比视频游戏环境更嘈杂的 RL 代理。记住,所有模拟都是不完美的,代理学到的内容很可能是模拟模型的独特性,而不是实际信号,这些内容在模拟之外不会有用。

  • 现实世界的数据足够大,可以轻松地检测到其中微弱的信号。

所以,这是一个冗长的、令人沮丧但必要的免责声明,我们需要告诉你,训练一个交易代理远不是轻而易举的事。话虽如此,RL 是一种工具,一种强大的工具,它的有效使用取决于用户的能力。

现在,是时候引发一些乐观情绪了。市面上有一些很酷的开源库,供你创建交易代理,而 TensorTrade 是其中之一。它可能对教育用途有所帮助,并且可以在进入更定制的工具之前,帮助你策划一些交易思路。

介绍 TensorTrade

TensorTrade 旨在轻松构建类似 Gym 的股市交易环境。它允许用户定义并连接各种数据流、观察特征提取、动作空间、奖励结构以及训练交易代理所需的其他便捷工具。由于环境遵循 Gym API,它可以轻松地与 RL 库(如 RLlib)连接。

在本节中,我们将简要介绍 TensorTrade,并将其详细用途留给文档进行说明。

信息

你可以在 www.tensortrade.org/ 找到 TensorTrade 的文档。

让我们从安装开始,然后将一些 TensorTrade 组件组合起来创建一个环境。

安装 TensorTrade

TensorTrade 可以通过以下简单的 pip 命令进行安装:

pip install tensortrade

如果你想创建一个虚拟环境来安装 TensorTrade,请别忘了也安装 Ray RLlib。

TensorTrade 的概念和组件

正如我们提到的,TensorTrade 环境可以由高度模块化的组件组成。让我们在这里搭建一个基本环境。

工具

金融中的工具是可以交易的资产。我们可以如下定义美元TensorTrade Coin工具:

USD = Instrument("USD", 2, "U.S. Dollar")
TTC = Instrument("TTC", 8, "TensorTrade Coin")

前面的整数参数表示这些工具的数量精度。

流指的是一个传输数据的对象,例如来自市场模拟的价格数据。例如,我们可以创建一个简单的正弦波 USD-TTC 价格流,如下所示:

x = np.arange(0, 2*np.pi, 2*np.pi / 1000)
p = Stream.source(50*np.sin(3*x) + 100,
                  dtype="float").rename("USD-TTC")
交易所和数据流

接下来,我们需要创建一个交易所来交易这些工具。我们将刚刚创建的价格流放入交易所:

coinbase = Exchange("coinbase", service=execute_order)(p)

现在我们已经定义了价格流,我们还可以为其定义转换,并提取一些特征和指标。所有这些特征也将是流,它们将全部打包成数据流:

feed = DataFeed([
    p,
    p.rolling(window=10).mean().rename("fast"),
    p.rolling(window=50).mean().rename("medium"),
    p.rolling(window=100).mean().rename("slow"),
    p.log().diff().fillna(0).rename("lr")])

如果你在想最后一行在做什么,它是两个连续时间步价格的对数比,用于评估相对变化。

钱包和投资组合

现在,是时候为自己创造一些财富并把它放进我们的钱包了。随意对自己慷慨一些:

cash = Wallet(coinbase, 100000 * USD)
asset = Wallet(coinbase, 0 * TTC)
portfolio = Portfolio(USD, [cash, asset])

我们的钱包共同构成了我们的投资组合。

奖励方案

奖励方案就是我们希望用来激励代理的奖励函数。如果你在想“目标只有一个,赚取利润!”,其实还有更多内容。你可以使用类似风险调整回报的东西,或者定义你自己的目标。现在,让我们保持简单,使用利润作为奖励:

reward_scheme = default.rewards.SimpleProfit()
动作方案

动作方案定义了你希望代理能够执行的动作类型,例如简单的买入/卖出/持有所有资产(BSH),或者是分数买入/卖出等。我们还将现金和资产放入其中:

action_scheme = default.actions.BSH(cash=cash, asset=asset)
将它们全部放在一个环境中

最后,这些可以全部组合起来,形成一个具有一些附加参数的环境:

env = default.create(
    feed=feed,
    portfolio=portfolio,
    action_scheme=action_scheme,
    reward_scheme=reward_scheme,
    window_size=25,
    max_allowed_loss=0.6)

这就是在 TensorTrade 中创建环境的基本知识。你当然可以做得远不止这些,但你已经明白了大致的思路。完成这一步后,它可以轻松地插入 RLlib,或者几乎任何与 Gym API 兼容的库。

在 TensorTrade 中训练 RLlib 代理

正如你从前几章记得的那样,使用 Gym 中的自定义环境的一种方式是将它们放入一个返回环境的函数中并注册它们。所以,它看起来像这样:

def create_env(config):
    ...
    return env
register_env("TradingEnv", create_env)

环境名称可以在 RLlib 的训练配置中引用。你可以在 GitHub 仓库的Chapter16/tt_example.py中找到完整的代码。

信息

这个示例主要遵循 TensorTrade 文档中的内容。要获取更详细的 Ray/RLlib 教程,你可以访问www.tensortrade.org/en/latest/tutorials/ray.html

这就是我们关于 TensorTrade 的讨论总结。现在你可以继续尝试一些交易想法。当你回来时,我们简要谈谈如何开发基于机器学习的交易策略,并结束这一章。

开发股票交易策略

几乎与市场本身一样嘈杂的是关于如何交易它们的信息。如何制定有效的交易策略远超本书的范围。然而,下面有一篇博客文章,可以让你对在为交易开发机器学习模型时需要注意的事项有一个现实的了解。像往常一样,使用你的判断力和尽职调查来决定相信什么:www.tradientblog.com/2019/11/lessons-learned-building-an-ml-trading-system-that-turned-5k-into-200k/

这样,我们就可以结束本章的内容。

总结

在本章中,我们介绍了三个重要的强化学习(RL)应用领域:个性化、营销和金融。对于个性化和营销,本章不仅讨论了这些领域中常用的赌博算法应用,还讨论了多步骤强化学习的优点。我们还介绍了如对抗赌博梯度下降(dueling bandit gradient descent)等方法,这帮助我们实现了更保守的探索,以避免过度的奖励损失,以及行动嵌入(action embeddings),它有助于处理大型动作空间。最后,我们讨论了强化学习在金融中的应用及其面临的挑战,并介绍了 TensorTrade 库。

下一章是本书的最后一个应用章节,我们将重点讨论智能城市和网络安全。

参考文献

Zheng, G. et al. (2018). DRN: A Deep RL Framework for News Recommendation. WWW '18: 2018 年全球互联网大会论文集,2018 年 4 月,第 167–176 页, doi.org/10.1145/3178876.3185994

第十七章:第十七章:智能城市与网络安全

智能城市预计将在未来几十年成为定义性体验之一。智能城市通过位于城市各个区域的传感器收集大量数据,如道路、公共设施基础设施和水资源。然后,这些数据用于做出基于数据和自动化的决策,如如何分配城市资源、实时管理交通以及识别和减轻基础设施问题。这个前景带来了两个挑战:如何编程自动化以及如何保护高度互联的城市资产免受网络攻击。幸运的是,强化学习RL)可以帮助解决这两个问题。

在本章中,我们将探讨与智能城市和网络安全相关的三个问题,并描述如何将其建模为强化学习(RL)问题。在这个过程中,我们将向你介绍 Flow 库,这是一个将交通仿真软件与 RL 库连接的框架,并使用它解决一个交通信号灯控制问题。

具体来说,我们将在本章中解决以下问题:

  • 通过交通信号灯控制优化车辆流量

  • 为电网提供辅助服务

  • 检测智能电网中的网络攻击

这将是一次有趣的旅程,让我们开始吧!

通过交通信号灯控制优化车辆流量

智能城市的一个关键挑战是优化道路网络上的交通流量。减少交通拥堵有许多好处,如下所示:

  • 减少交通中浪费的时间和能源

  • 节省燃油和减少排放

  • 延长车辆和道路使用寿命

  • 降低事故发生率

在这个领域已经进行了大量研究;但最近,强化学习(RL)已成为与传统控制方法竞争的替代方案。因此,在本节中,我们将通过使用多智能体强化学习(RL)控制交通信号灯行为来优化道路网络上的交通流量。为此,我们将使用 Flow 框架,它是一个开源的强化学习(RL)库,并在现实交通微观仿真中进行实验。

介绍 Flow

交通研究在很大程度上依赖于仿真软件,如SUMO城市交通模拟)和 Aimsun,用于交通信号灯控制、车辆路线选择、交通监控和交通预测等领域,这些都涉及到这些智能体的最优控制。另一方面,深度强化学习作为传统控制方法的替代方案的兴起,催生了许多库,如 RLlib 和 OpenAI Baselines。Flow 是一个开源框架,连接了交通仿真器和强化学习库这两个领域。

在本节中,与之前的章节一样,我们将使用 RLlib 作为强化学习后端。对于交通仿真,我们将使用 SUMO,这是一个强大的开源库,自 2000 年代初期以来一直在开发。

信息

在这里,我们将仅简单介绍如何将强化学习应用于交通问题。详细的文档和教程(我们在这里严格遵循的)可以在 Flow 网站上找到:flow-project.github.io/。SUMO 的文档和库可以在 www.eclipse.org/sumo/ 获得。

让我们从安装 Flow 和 SUMO 开始。

安装 Flow 和 SUMO

为了安装 Flow,我们需要创建一个新的虚拟环境,因为它依赖的库版本与我们在前面章节中使用的不同:

$ sudo apt-get install python3-pip 
$ virtualenv flowenv
$ source flowenv/bin/activate

要安装 Flow,我们需要下载仓库并运行以下命令:

$ git clone https://github.com/flow-project/flow.git
$ cd flow
$ pip3 install -e .
$ pip3 install ipykernel
$ python -m ipykernel install --user --name=flowenv

这些命令安装了必要的依赖项,包括 TensorFlow 和 RLlib。最后两个命令用于在 Jupyter Notebook 上运行 Flow,这也是 Flow 教程以及我们的示例代码所依赖的环境。要在 Ubuntu 18.04 上安装 SUMO,请使用以下命令:

$ scripts/setup_sumo_ubuntu1804.sh
$ source ~/.bashrc

针对早期 Ubuntu 版本和 macOS 的设置脚本也可以在同一文件夹中找到。

你可以通过运行以下命令来查看 Flow 和 SUMO 的实际操作(在 Flow 文件夹中,并且虚拟环境已激活):

$ python examples/simulate.py ring

应该会出现一个类似于图 17.1中所示的窗口:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/B14160_17_01.jpg

图 17.1 – 一个示例的 SUMO 窗口,模拟环路上的交通情况

如果在设置过程中遇到问题,Flow 文档可以帮助你进行故障排除。

现在我们已经设置好环境,接下来让我们深入了解如何使用 Flow 构建交通环境。

在 Flow 中创建实验

现在我们已经完成了设置,可以在 Flow 中创建环境和实验。接下来,我们将它们与 RLlib 连接,以训练 RL 代理。

一个 Flow 实验中有几个关键元素:

  • 一个道路网络,比如一个环形道路(如图 17.1所示),或类似曼哈顿的网格网络。Flow 提供了一套预定义的网络。对于高级用户,它还允许创建自定义网络。交通信号灯与道路网络一起定义。

  • 一个仿真后端,这不是我们关注的重点,我们将使用默认设置。

  • 一个 RL 环境,它配置了实验中控制、观察和奖励的内容,类似于 Gym 环境。

  • 车辆是整个实验的核心,它们的行为和特征是单独定义的。

所有这些组件都是参数化的,并且会单独传递给 Flow。然后,我们将它们打包在一起,创建一个 Flow 参数对象。

使用自下而上的方法可能会很困难,从每个组件的单独参数开始,来拼凑出整体的情况。此外,这些细节超出了本章的范围。相反,解包一个预构建的 Flow 参数对象会更容易。接下来我们就做这个。

分析 Flow 参数对象

Flow 定义了一些用于网格网络上交通信号灯优化的基准实验。请查看 Grid-0 实验的 Flow 参数对象:

Chapter17/Traffic Lights on a Grid Network.ipynb

from flow.benchmarks.grid0 import flow_params
flow_params
{'exp_tag': 'grid_0',
 'env_name': flow.envs.traffic_light_grid.TrafficLightGridBenchmarkEnv,
 'network': flow.networks.traffic_light_grid.TrafficLightGridNetwork,
 'simulator': 'traci',
 'sim': <flow.core.params.SumoParams at 0x7f25102d1350>,
 'env': <flow.core.params.EnvParams at 0x7f25102d1390>,
 'net': <flow.core.params.NetParams at 0x7f25102d13d0>,
 'veh': <flow.core.params.VehicleParams at 0x7f267c1c9650>,
 'initial': <flow.core.params.InitialConfig at 0x7f25102d6810>}

我们可以举个例子,检查网络参数中的内容:

print(dir(flow_params['net']))
flow_params['net'].additional_params
...
{'speed_limit': 35,
 'grid_array': {'short_length': 300,
  'inner_length': 300,
  'long_length': 100,
  'row_num': 3,
...

当然,理解它们如何工作的一个好方法是通过视觉化实验来进行:

from flow.core.experiment import Experiment
sim_params = flow_params['sim']
sim_params.render = True
exp = Experiment(flow_params)
results = exp.run(1)

这将弹出一个与图 17.2中类似的 SUMO 屏幕:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/B14160_17_02.jpg

图 17.2 – 网格网络的 SUMO 渲染

有了这些,我们现在有了一个正在运行的示例。在进入 RL 建模和训练之前,让我们讨论一下如何为这个实验获取基准奖励。

获取基准奖励

我们 GitHub 仓库中的 Jupyter notebook 包括一个从 Flow 代码库中提取的代码片段,用于获取该环境的基准奖励。它包含一些经过精心优化的交通信号灯阶段定义,平均奖励为 -204。我们将使用这个奖励来作为 RL 结果的基准。同样,随时可以修改阶段设置,看看它们对网络中交通模式的影响。

有了这些,我们现在准备好定义 RL 环境了。

建模交通信号灯控制问题

和往常一样,我们需要为 RL 问题定义动作、观察和奖励。我们将在接下来的章节中进行定义。

定义动作

我们希望为给定交叉口的所有信号灯训练一个单一控制器,如图 17.2中所示,例子b。在图中,信号灯处于绿-红-绿-红状态。我们定义一个二进制动作,0:继续,1:切换。当指示切换时,图中的信号灯状态将变为黄-红-黄-红,几秒钟后将变为红-绿-红-绿。

默认环境接受每个交叉口的连续动作,https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_001.png,并且按照之前描述的方法将其四舍五入以离散化。

单一智能体与多智能体建模

我们接下来的设计决策是,是否使用一个集中式智能体控制所有交通信号灯,或者采用多智能体方法。如果选择后者,无论是为所有交叉口训练一个单一策略,还是训练多个策略,我们需要注意以下几点:

  • 集中式方法的优势在于,理论上我们可以完美协调所有交叉口,从而获得更好的奖励。另一方面,训练好的智能体可能不容易应用于不同的道路网络。此外,对于更大的网络,集中式方法不容易扩展。

  • 如果我们决定使用多智能体方法,我们没有太多理由区分交叉口和它们使用的策略。因此,训练一个单一策略更有意义。

  • 为所有交叉口训练一个单一的通用策略,其中智能体(交叉口的信号灯)协同尝试最大化奖励,这是一个可扩展且高效的方法。当然,这缺乏集中的单智能体方法的完全协调能力。实际上,这是一个需要你评估的权衡。

因此,我们将采用多智能体设置,其中策略将使用来自所有智能体的数据进行训练。智能体将根据其本地观察从策略中获取动作。

有了这些,让我们定义观察。

定义观察

默认的多智能体网格环境使用以下内容作为观察:

有关更多详细信息,您可以查看 Flow 仓库中的flow.envs.multiagent.traffic_light_grid模块。

最后,让我们定义奖励。

定义奖励

环境对于给定时间步长有一个简单直观的成本定义,衡量的是与允许的最高速度相比,车辆的平均延迟:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_005.jpg

这里,! 是总车辆数为 https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_008.png 的车辆的速度,而 https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_009.png 是允许的最高速度。然后,奖励可以定义为此成本项的负值。

现在我们已经有了所有的公式,是时候解决问题了。

使用 RLlib 解决交通控制问题

由于我们将使用 RLlib 的多智能体接口,我们需要做以下操作:

  1. 在 RLlib 中注册环境,并提供一个名称和环境创建函数。

  2. 定义我们将训练的策略的名称,我们只有一个策略,tlight

  3. 定义一个生成 RLlib 训练器所需参数的函数,以便为策略提供支持。

  4. 定义一个函数,将智能体映射到策略,在我们的情况下这很简单,因为所有智能体都映射到相同的策略。

因此,这些可以通过以下代码实现:

create_env, env_name = make_create_env(params=flow_params, 
                                       version=0)
register_env(env_name, create_env)
test_env = create_env()
obs_space = test_env.observation_space
act_space = test_env.action_space
def gen_policy():
    return PPOTFPolicy, obs_space, act_space, {}
def policy_mapping_fn(_):
    return 'tlight'
policy_graphs = {'tlight': gen_policy()}
policies_to_train = ['tlight']

一旦定义完毕,我们需要将这些函数和列表传递给 RLlib 配置:

config['multiagent'].update({'policies': policy_graphs})
config['multiagent'].update({'policy_mapping_fn': 
                             policy_mapping_fn})
config['multiagent'].update({'policies_to_train': 
                             policies_to_train})

其余部分是常规的 RLlib 训练循环。我们使用在 Flow 基准测试中使用的超参数进行 PPO 训练。所有代码的完整内容可以在Chapter17/Traffic Lights on a Grid Network.ipynb中找到。

获取并观察结果

在经过几百万次训练步骤后,奖励收敛到约-243,略低于手工制作的基准。训练进度可以在 TensorBoard 中观察到:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/B14160_17_03.jpg

图 17.3 – Flow 中多智能体交通信号灯环境的训练进度

你还可以通过在 Jupyter Notebook 中运行以下格式的命令,来可视化训练后智能体的表现:

!python /path/to/your/flow/visualize/visualizer_rllib.py /path/to/your/ray_results/your_exp_tag/your_run_id 100

这里,末尾的参数指的是检查点编号,该编号在训练过程中定期生成。

接下来,我们还将讨论为什么强化学习的表现稍微逊色于手工设计的策略。

进一步改进

有几个原因可能导致强化学习未能达到基准性能:

  • 缺乏更多的超参数调优和训练。这一因素始终存在。我们无法知道是否通过更多调整模型架构和训练可以提升性能,直到你尝试为止,我们鼓励你去尝试。

  • 基准策略对黄灯持续时间进行了更精细的控制,而强化学习模型则没有对这一点进行控制。

  • 基准策略协调网络中的所有交叉口,而每个强化学习智能体则做出局部决策。因此,我们可能会遇到去中心化控制的缺点。

  • 通过增加一些观察,可以缓解这一问题,这些观察将有助于智能体与邻居之间的协调。

  • 强化学习(RL)算法在优化的最后阶段,尤其是在达到奖励曲线的顶峰时,遇到困难并不罕见。这可能需要通过减少学习率和调整批量大小来精细控制训练过程。

因此,尽管仍有改进空间,我们的智能体已经成功学会如何控制交通信号灯,这比手动设计策略更具可扩展性。

在我们结束这个话题之前,来讨论一些资源,帮助更深入了解问题和我们使用的库。

进一步阅读

我们已经提供了 Flow 和 SUMO 文档的链接。Flow 库及其获得的基准测试在 Wu et al., 2019Vinitsky et al., 2018 中有所解释。在这些资源中,你将发现其他你可以用各种强化学习库建模和解决的问题。

恭喜!我们在如此短的时间和篇幅内,成功利用强化学习解决了交通控制问题。接下来,我们将探讨另一个有趣的问题,那就是调节电力需求以稳定电网。

为电网提供辅助服务

在这一部分中,我们将描述强化学习如何通过管理家居和办公大楼中的智能设备,帮助将清洁能源资源集成到电网中。

电网操作与辅助服务

从发电机到消费者的电力传输与分配是一项庞大的操作,需持续监控和控制系统。特别是,发电与消耗必须在一个地区几乎保持平衡,以使电流频率保持在标准频率(美国为 60 Hz),防止停电和损坏。这是一个具有挑战性的任务,原因如下:

  • 电力供应在能源市场中提前规划,与该地区的发电机一起匹配需求。

  • 尽管有这些规划,未来的电力供应仍然不确定,尤其是当电力来源于可再生能源时。风能和太阳能的供给可能低于或超过预期,导致供给过剩或不足。

  • 未来的需求也不确定,因为消费者通常可以自由决定何时以及消费多少。

  • 电网故障,如发电机或输电线路出现问题,可能导致供需发生突然变化,从而危及系统的可靠性。

供需平衡由称为独立系统操作员ISO)的主管部门维持。传统上,ISO 根据电网的变化要求发电机增加或减少供应,这是发电机为 ISO 提供的附加服务,ISO 会支付费用。然而,关于发电机提供这种服务存在一些问题:

  • 发电机通常对电网平衡的突变反应较慢。例如,可能需要数小时才能投入新的发电机组来应对电网中的供应不足。

  • 近年来,可再生能源供应显著增加,进一步加剧了电网的不稳定性。

因此,已有一条研究路线开始,旨在使消费者也能向电网提供这些附加服务。换句话说,目标是调节需求,而不仅仅是供应,以更好地维持平衡。这需要更复杂的控制机制,这就是我们引入强化学习(RL)来协助的地方。

在这段介绍之后,让我们更具体地定义这里的控制问题。

描述环境与决策问题

重申一下,我们的目标是动态地增加或减少一个区域内的总电力消费。首先,我们来描述在这种情境下的各方及其角色。

独立系统操作员

该地区的 ISO 持续监控供需平衡,并向该地区的所有附加服务提供商广播自动信号,要求他们调整需求。我们将这个信号称为 https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_010.png,它只是一个在 https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_011.png 范围内的数字。稍后我们会详细解释这个数字的确切含义。目前,我们只需要说明,ISO 每 4 秒更新一次这个信号(这是一种叫做调节服务的附加服务)。

智能建筑操作员

我们假设有一个智能建筑操作员SBO),负责调节(一栋或多栋)建筑的总需求,以跟随 ISO 信号。SBO 将作为我们的强化学习(RL)代理,按照以下方式操作:

SBO 控制着一群智能家电/设备,例如供暖、通风和空调HVAC)设备和电动 汽车EVs),以遵循信号。在这里我们将利用强化学习(RL)。

我们在图 17.4中展示了这一设置:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/B14160_17_04.jpg

图 17.4 – 智能建筑运营商提供调节服务

接下来,让我们更详细地了解一下智能家电是如何运作的。

智能家电

你可能会对某些算法干预你的家电并导致它们开关感到不舒服。毕竟,谁会希望在看超级碗的时候,电视为了省电而自动关掉,或者仅仅因为外面的风力比预期强,导致半夜电视突然打开呢?这显然没有意义。另一方面,如果空调比平时晚一分钟或早一分钟启动,你可能就会觉得没问题。或者你并不介意你的电动汽车在早上 4 点或 5 点充满电,只要它能在你离家前准备好。总之,重点是一些家电在运行时间上有更多的灵活性,这在本案例中是我们关注的焦点。

我们还假设这些家电是智能的,并且具备以下能力:

  • 它们可以与 SBO 进行通信,以接收指令。

  • 它们可以评估“效用”,即衡量家电在某一时刻需要消耗电力的程度。

定义效用

让我们举两个例子,说明不同情况下效用的变化。考虑一个需要在早上 7 点之前充满电的电动汽车(EV):

  • 如果是早上 6 点,且电池电量仍然较低,那么效用就会很高。

  • 相反,如果离出发时间还很远和/或电池已经接近充满,那么效用就会很低。

同样地,当房间温度即将超过用户的舒适区时,空调的效用会很高;当房间温度接近底部时,效用则很低。

请参见图 17.5以了解这些情况的示意图:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/B14160_17_05.jpg

图 17.5 – 不同条件下电动汽车(a)和空调(b)的效用水平

接下来,让我们讨论为什么这是一个顺序决策问题。

定义顺序决策问题

到现在为止,你可能已经注意到,现在采取的 SBO 动作将会对以后产生影响。过早地为系统中的电动汽车(EV)充满电,可能会限制将来在需要时消费量的增加。相反,如果保持过多房间的室温过高,可能会导致所有空调在之后一起开启,以使房间温度恢复到正常水平。

在下一节中,让我们将其视为一个强化学习问题。

强化学习模型

和往常一样,我们需要定义动作、观察和奖励来创建一个强化学习模型。

定义动作

关于如何定义 SBO 控制,有不同的方法:

  • 首先,更明显的方法是通过观察电器的效用来直接控制系统中的每个电器。另一方面,这会使模型变得不灵活,且可能无法处理:每当添加新电器时,我们必须修改并重新训练智能体。此外,当电器数量众多时,动作和观察空间会变得过于庞大。

  • 另一种方法是为每个电器类别(空调、加热设备和电动汽车)在多智能体设置中训练一个策略。这将引入多智能体强化学习的固有复杂性。例如,我们必须设计一个机制来协调各个电器。

  • 一个折衷的方法是应用间接控制。在这种方法中,SBO 会广播其动作,让每个电器自行决定该怎么做。

让我们更详细地描述这种间接控制可能是什么样子的。

电器的间接控制

这里是我们如何定义间接控制/动作:

通过这种机制,SBO 能够间接影响需求。它对环境的控制不如直接控制或多代理控制精确,但相比之下复杂度大大降低。

接下来,让我们定义观察空间。

定义观察

SBO 可以利用以下观察来做出有根据的决策:

除了在每个时间步进行这些观察之外,还需要保持对观察的记忆。这是一个部分可观察的环境,其中家电的能量需求和电网状态对代理是隐藏的。因此,保持记忆将帮助代理揭示这些隐藏状态。

最后,让我们描述奖励函数。

定义奖励函数

在此模型中,奖励函数由两部分组成:跟踪成本和效用。

我们提到过,SBO 有义务跟踪 ISO 信号,因为它为此项服务获得报酬。

因此,我们为偏离信号所暗示的目标时间https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_039.png分配了惩罚:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_040.jpg

这里,https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_041.png是目标,而https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_042.png是时间https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_043.png时的实际消费率。

奖励函数的第二部分是由家电实现的总效用。我们希望家电能够开启并消耗能源,但要在它们真正需要的时候进行。以下是这一点为何有益的一个例子:当空调将室内温度保持在舒适区的上限(图 17.3中的 76°F)时,它的能耗要低于当温度保持在下限而外部温度高于舒适区时。因此,在时间https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_044.png时实现的总效用如下:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_045.jpg

这里,https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_046.png是那些在离散时间步https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_047.png内开启的家电集合。然后,RL 目标变为以下形式:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_048.jpg

这里,https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_049.png是一个系数,用于控制效用和跟踪成本之间的权衡,https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_050.png是折扣因子。

终端条件

最后,我们来谈谈这个问题的终止条件。通常,这是一个没有自然终止状态的连续任务。然而,我们可以引入终止条件,例如,如果跟踪误差过大,则停止任务。除此之外,我们还可以将其转化为一个阶段性任务,将每个阶段的长度设定为一天。

就是这样!我们没有详细介绍该模型的具体实现,但你现在已经对如何处理这个问题有了清晰的思路。如果需要更多细节,可以查看本章末尾由 Bilgin 和 Caramanis 提供的参考文献。

最后但同样重要的是,让我们转变思路,建模电网中网络攻击的早期检测。

在智能电网中检测网络攻击

智慧城市在定义上依赖于资产之间的强大数字通信。尽管这一点带来了好处,但也使得智慧城市容易受到网络攻击。随着强化学习(RL)逐步应用于网络安全,本节将描述它如何应用于检测智能电网基础设施中的攻击。在本节中,我们将遵循Kurt et al., 2019提出的模型,具体细节请参见该论文。

让我们从描述电网环境开始。

电网中网络攻击的早期检测问题

电力网由称为总线的节点组成,这些节点对应于发电、需求或电力线路的交叉点。电网管理者从这些总线收集测量数据,以做出某些决策,例如调入额外的发电单元。为此,关键的测量量是每个总线的相位角(参考总线除外),这使得它成为网络攻击者的潜在目标,因此我们对其感兴趣:

  • 不出所料,来自仪表的测量数据是嘈杂的,且容易出错。

  • 对这些仪表及其测量结果进行网络攻击,可能会误导电网管理者的决策,并导致系统崩溃。

  • 因此,检测系统是否遭受攻击是非常重要的。

  • 然而,要区分噪声和由攻击引起的异常与真实系统变化并不容易。通常,等待并收集更多的测量数据有助于解决这个问题。

  • 另一方面,迟迟不宣布攻击可能会导致此期间做出错误的决策。因此,我们的目标是尽快识别这些攻击,但又不能产生过多的误报。

因此,我们的网络安全代理可以采取的可能行动集合很简单:宣布攻击或不宣布攻击。一个关于错误和真实(但延迟的)警报的示例时间线如图 17.6所示:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/B14160_17_06.jpg

图 17.6 – (a) 错误警报和 (b) 真实但延迟的警报的示例时间线

以下是任务生命周期和奖励的详细信息:

由此,智能体的目标是最小化以下代价函数(或最大化其负值):

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_054.jpg

这里,第一个项是误报的概率,第二个项是宣布攻击的预期(正向)延迟,https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_055.png是用于管理两者之间折衷的成本系数。

一个缺失的部分是观测值,我们将在接下来的内容中讨论。

电网状态的部分可观测性

系统的真实状态,即是否发生攻击,智能体无法直接观测到。相反,它收集相位角的测量值,https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_056.pngKurt 等人,2019的一个关键贡献是以以下方式使用相位角的测量值:

  1. 使用卡尔曼滤波器根据先前的观测值预测真实的相位角。

  2. 基于此预测,估计预期的测量值,https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_057.png

  3. 定义https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_058.png作为https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_059.pnghttps://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_060.png之间差异的度量,接着成为智能体使用的观测值。

  4. 观察https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_061.png并保留过去观测的记忆供智能体使用。

本文使用表格化的 SARSA 方法通过离散化https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/Formula_17_062.png来解决此问题,并展示了该方法的有效性。一个有趣的扩展是使用深度强化学习方法,在没有离散化的情况下,适应不同的电网拓扑和攻击特征。

由此,我们结束了这一主题的讨论以及本章内容。做得好,我们已经完成了很多!让我们总结一下本章的内容。

总结

强化学习将在自动化领域发挥重要作用。智慧城市是利用强化学习力量的一个重要领域。在本章中,我们讨论了三个示例应用:交通信号控制、电力消耗设备提供辅助服务以及检测电网中的网络攻击。第一个问题使我们能够展示一个多智能体环境,我们使用了一种类似价格的间接控制机制来解决第二个问题,最后一个问题是部分观测环境中先进输入预处理的一个很好的例子。

在下一章也是最后一章,我们将总结本书内容,并讨论现实生活中强化学习的挑战及未来的方向。

参考文献

  • Wu, C., et al. (2019). 流动:一种面向交通自主性的模块化学习框架。ArXiv:1710.05465 [Cs]。arXiv.org,arxiv.org/abs/1710.05465

  • Vinitsky, E., Kreidieh, A., Flem, L.L., Kheterpal, N., Jang, K., Wu, C., Wu, F., Liaw, R., Liang, E., & Bayen, A.M. (2018). 混合自主交通中的强化学习基准. 第二届机器人学习会议论文集,PMLR 87:399-409,proceedings.mlr.press/v87/vinitsky18a.html

  • Bilgin, E., Caramanis, M. C., Paschalidis, I. C., & Cassandras, C. G. (2016). 智能建筑提供调节服务. IEEE 智能电网学报, 第 7 卷,第 3 期,1683-1693 页,DOI: 10.1109/TSG.2015.2501428

  • Bilgin, E., Caramanis, M. C., & Paschalidis, I. C. (2013). 智能建筑实时定价以提供负荷端调节服务储备. 第 52 届 IEEE 决策与控制会议,佛罗伦萨,4341-4348 页,DOI: 10.1109/CDC.2013.6760557

  • Caramanis, M., Paschalidis, I. C., Cassandras, C., Bilgin, E., & Ntakou, E. (2012). 通过灵活的分布式负荷提供调节服务储备. 第 51 届 IEEE 决策与控制会议(CDC),毛伊岛,HI,3694-3700 页,DOI: 10.1109/CDC.2012.6426025

  • Bilgin, E. (2014). 分布式负荷参与同时优化能源和备用的电力市场. 论文,波士顿大学

  • Kurt, M. N., Ogundijo, O., Li C., & Wang, X. (2019). 智能电网中的在线网络攻击检测:一种强化学习方法. IEEE 智能电网学报, 第 10 卷,第 5 期,5174-5185 页,DOI: 10.1109/TSG.2018.2878570

第十八章:第十八章:强化学习中的挑战与未来方向

在最后一章中,我们将总结我们在本书中的旅程:你已经做了很多,所以把它当作一次庆祝,也是对你成就的全景回顾。另一方面,当你将所学应用于解决实际问题时,你可能会遇到许多挑战。毕竟,深度 RL 仍然是一个快速发展的领域,正在取得大量进展以解决这些挑战。我们在书中已经提到了大部分挑战,并提出了解决方法。接下来,我们将简要回顾这些内容,并讨论 RL 的其他未来方向。最后,我们将介绍一些资源和策略,帮助你成为 RL 专家,你已经在这条道路上走得非常远。

那么,这一章我们将讨论的内容如下:

  • 你在本书中取得的成就

  • 挑战与未来方向

  • 对有志成为 RL 专家的建议

  • 结束语

你在本书中取得的成就

首先,恭喜你!你已经远远超越了基础,掌握了在现实世界中应用强化学习(RL)所需的技能和心态。至此,我们已经共同完成了以下内容:

  • 我们花费了相当多的时间讨论赌博问题,这些问题不仅在工业界有着广泛的应用,而且在学术界也作为辅助工具来解决其他问题。

  • 我们比一般的应用书籍更深入地探讨了理论,以加强你在 RL 方面的基础。

  • 我们涵盖了很多 RL 最成功应用背后的算法和架构。

  • 我们讨论了先进的训练策略,以最大化地发挥高级 RL 算法的效果。

  • 我们通过现实案例进行过实际操作。

  • 在整个过程中,我们不仅实现了我们各自版本的一些算法,还利用了如 Ray 和 RLlib 等库,这些库为顶尖科技公司中的许多团队和平台提供了 RL 应用的技术支持。

你完全值得花点时间庆祝你的成功!

现在,一旦你回过神来,是时候讨论一下你面前的道路了。RL 正处于崛起的初期阶段。这意味着多方面的含义:

  • 首先,这也是一个机会。通过做出这一投资并走到今天,你已经走在了前沿。

  • 其次,由于这是前沿技术,RL 在成为成熟、易用的技术之前,还面临着许多需要解决的挑战。

在接下来的章节中,我们将讨论这些挑战是什么。这样,当你遇到它们时,你就能识别出来,知道自己并不孤单,并且能够根据解决问题所需的资源(数据、时间、计算资源等)设定合理的期望。但你不必担心!RL 是一个非常活跃且快速发展的研究领域,因此我们应对这些挑战的工具和方法日渐丰富。看看 Katja Hofmann,这位著名的 RL 研究员,在 2019 年 NeurIPS 会议上整理并展示的关于 RL 在 NeurIPS 会议上提交的论文数量:

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/B14160_18_01.jpg

图 18.1 – RL 贡献者在 NeurIPS 会议上的数量,由 Katja Hofmann 整理并展示(来源:Hofmann,2019)

因此,在我们讨论这些挑战的同时,我们也会讨论相关的研究方向,这样你就能知道应该在哪里寻找答案。

挑战与未来方向

你可能会想,为什么在完成一本高级强化学习书籍后,我们又回到讨论 RL 挑战的问题。确实,在全书中,我们提出了许多缓解这些挑战的方法。另一方面,我们不能声称这些挑战已经被解决。因此,指出这些挑战并讨论每个挑战的未来发展方向是非常重要的,这样可以为你提供一把指南针,帮助你应对这些问题。让我们从其中一个最重要的挑战开始讨论:样本效率。

样本效率

正如你现在已经清楚地知道,训练一个强化学习(RL)模型需要大量的数据。OpenAI Five,这个在战略游戏《Dota 2》中成为世界级玩家的 AI,训练过程中使用了 128,000 个 CPU 和 GPU,持续了好几个月,每天收集相当于 900 年的游戏经验每一天(OpenAI,2018)。RL 算法的性能通常是在它们已经训练过超过 100 亿帧 Atari 游戏画面后进行基准测试的(Kapturowski,2019)。这无疑需要大量的计算和资源,仅仅是为了玩游戏。所以,样本效率是现实世界 RL 应用中面临的最大挑战之一。

让我们讨论一下缓解这个问题的总体方向。

样本高效算法

一个显而易见的方向是尝试创建更加样本高效的算法。实际上,研究界对此方向有很大的推动。我们将越来越多地比较算法,不仅仅是基于它们的最佳性能,还会评估它们在达到这些性能水平时的速度和效率。

为此,我们将可能越来越多地讨论以下几种算法类别:

  • 脱策略方法,不要求数据必须是在最新策略下收集的,这使它们在样本效率上相较于策略方法具有优势。

  • 基于模型的方法,通过利用它们对环境动态的了解,比起无模型方法能在效率上高出几个数量级。

  • 具有先验知识的模型,这些模型将假设空间限制为一个合理的集合。这类模型的例子包括使用神经常微分方程和拉格朗日神经网络的 RL 模型(Du, 2020;Shen, 2020)。

用于分布式训练的专用硬件和软件架构

我们可以预期,算法前沿的进展将是渐进且缓慢的。对于那些充满激情、迫不及待的爱好者来说,更快速的解决方案是向 RL 项目投入更多的计算资源,充分利用现有资源,训练越来越大的模型。因此,完全合理地预期,在自然语言处理NLP)领域发生的事情也会发生在 RL 中:NLP 模型的规模从 80 亿参数增加到 170 亿参数,再到 1750 亿参数,OpenAI 的 GPT-3 在不到一年的时间内达到了这一规模,这要归功于训练架构的优化,当然还有专门用于此任务的超级计算机。

https://github.com/OpenDocCN/freelearn-dl-pt5-zh/raw/master/docs/ms-rl-py/img/B14160_18_02.jpg

图 18.2 – 最大的 NLP 模型规模的增长。纵轴是参数的数量。图像修改自 Rosset, 2020

此外,RL 训练架构的创新,如 Ape-X 和 SEED RL 中的创新(Espeholt, 2019),帮助现有的 RL 算法运行得更加高效,这是一个我们可以期待看到更多进展的方向。

机器教学

机器教学方法,如课程学习、奖励塑形和示范学习,旨在将上下文和专业知识融入到 RL 训练中。这些方法通常在训练过程中显著提高样本效率,在某些情况下,它们是让学习变得更加可行所必需的。机器教学方法将在不久的将来变得越来越流行,以提高 RL 中的样本效率。

多任务/元学习/迁移学习

由于从头开始训练一个 RL 模型可能非常昂贵,因此复用在其他相关任务上训练过的模型才是明智的做法。例如,当我们想开发一个涉及图像分类的应用时,现在很少有情况下我们从头开始训练模型。相反,我们会使用一个预训练的模型,并根据我们的应用需求进行微调。

信息

ONNX 模型库是一个预训练的、先进的模型集合,采用开放标准格式,适用于图像分类和机器翻译等流行任务,我强烈建议你查看一下:github.com/onnx/models

我们可以预期在 RL 任务中也会看到类似的资源库。在相关的背景下,像多任务学习(训练多个任务的模型)和元学习(训练能够高效转移到新任务的模型)等方法,将在 RL 研究人员和实践者中获得更多的关注和更广泛的应用。

RL 即服务

如果你需要在应用程序中以编程方式翻译文本,正如我们之前提到的,一种方法是使用预训练模型。但是,如果你不想投入精力去维护这些模型呢?答案通常是从微软、谷歌、亚马逊等公司购买该服务。这些公司拥有大量的数据和计算资源,并且他们通过尖端的机器学习方法不断升级自己的模型。对于其他没有相同资源和聚焦的企业来说,做到同样的事情可能是一个艰巨的任务,甚至是不可行的,或者根本就是不实际的。我们可以预见到,RL 即服务(RL-as-a-service)将成为行业中的一种趋势。

样本效率(sample efficiency)是一个难题,但在多个领域已经有了进展,正如我们所总结的那样。接下来,我们将讨论另一个主要挑战:对良好仿真模型的需求。

对高精度和快速仿真模型的需求

强化学习在工业中广泛应用的最大障碍之一是缺乏能够有效仿真公司希望优化的过程的模型,或者这些模型的逼真度不足以达到要求。创建这些仿真模型通常需要大量投资,在一些复杂任务中,仿真模型的逼真度可能不足以支撑典型的强化学习方法。为了克服这些挑战,我们可以预见到在以下几个领域会有更多的进展。

离线强化学习从数据中直接学习

尽管工业中的大多数过程没有仿真模型,但更常见的是会有日志记录描述过程中的发生事件。离线强化学习(Offline RL)方法旨在直接从数据中学习策略,随着强化学习逐渐进入现实世界应用,这种方法的重要性将变得越来越大。

处理泛化、部分可观测性和非平稳性的方法

即使在存在过程仿真模型的情况下,这种模型通常也很难达到足够的逼真度,无法直接训练一个可以在现实世界中工作的强化学习模型,而不需要额外的考虑。这个“仿真到现实”的差距可以看作是部分可观测性的一种形式,通常通过强化学习模型架构中的记忆机制来处理。结合领域随机化和正则化等泛化技术,我们已经看到了一些非常成功的应用场景,其中在仿真中训练的策略被转移到现实世界。处理非平稳性(non-stationarity)问题也与强化学习算法的泛化能力密切相关。

在线学习和边缘设备上的微调

使强化学习方法成功应用的一个重要能力是,在将模型部署到边缘设备后仍能继续进行训练。这样,我们将能够用实际数据对在仿真中训练的模型进行微调。此外,这一能力将帮助强化学习策略适应环境中变化的条件。

总结来说,我们将看到强化学习(RL)从视频游戏中的工具转变为传统控制和决策方法的替代方案,这一转变将通过去除对高保真模拟的依赖的方式得到促进。

高维动作空间

CartPole,作为 RL 的标志性测试平台,其动作空间只有少数几个元素,就像大多数用于 RL 研究的 RL 环境一样。然而,现实问题通常在可用动作数量上非常复杂,这也常常取决于智能体所处的状态。在这种现实场景中,像动作嵌入、动作屏蔽和动作淘汰等方法将帮助应对这一挑战。

奖励函数的保真度

制定正确的奖励函数,使智能体实现期望行为,是 RL 中公认的困难任务。逆向 RL 方法(通过示范学习奖励)和基于好奇心的学习(依赖内在奖励)是有前景的减少手工设计奖励函数依赖性的方法。

奖励函数工程的挑战在目标多样且具有定性时更加复杂。关于多目标 RL 方法的文献越来越多,这些方法要么分别处理每个子问题,要么为给定的目标组合生成策略。

关于 RL 环境中奖励信号的另一个挑战是奖励的延迟和稀疏性。例如,一个由 RL 智能体控制的营销策略可能会在行动后几天、几周甚至几个月才观察到奖励。解决因果关系和信用分配问题的 RL 方法在这些环境中至关重要,能够让 RL 在这些环境中得以有效应用。

这些都是值得关注的重要分支,因为现实世界中的 RL 问题很少具有明确、密集且标量的目标。

安全性、行为保证和可解释性

在计算机仿真中训练 RL 智能体时,尝试随机和疯狂的动作以找到更好的策略是完全可以接受的,事实上,这是必须的。对于与世界级选手在棋盘游戏中竞争的 RL 模型来说,最糟糕的情况就是输掉比赛,或许是有些尴尬。当 RL 智能体负责化学过程或自动驾驶汽车时,风险则是完全不同的类别。这些都是安全关键系统,容错空间几乎为零。事实上,这是 RL 方法相比于传统控制理论方法的一大劣势,后者通常伴随着理论保证和对预期行为的深刻理解。因此,约束 RL 和安全探索的研究对于在此类系统中使用 RL 至关重要。

即便系统并非安全至关重要的场景,例如在库存补充问题中,相关的挑战仍然是 RL 智能体所建议的行动的可解释性。在这些过程中,监督决策的专家往往需要解释,尤其是当建议的行动违背直觉时。人们往往会为了可解释性而牺牲准确性,这使得黑箱方法处于不利地位。深度学习在可解释性方面已经取得了长足的进展,而 RL 无疑会从中受益。另一方面,这将是机器学习面临的持续挑战。

再现性和对超参数选择的敏感性

对于一个特定任务,通过众多专家的密切监督和指导训练一个 RL 模型,经过多次迭代,这是一回事;而在多个生产环境中部署多个 RL 模型,并定期进行再训练,同时在新数据到来时不需人工干预,这又是另一回事。在各种条件下,RL 算法生成成功策略的一致性和韧性将成为评估这些算法时越来越重要的因素,既适用于研究社区,也适用于实际操作中需要处理这些模型及其维护的从业者。

鲁棒性与对抗性智能体

深度学习在其表示方面是脆弱的。这种缺乏鲁棒性使得对抗性智能体能够操控依赖深度学习的系统。这是一个重大问题,也是机器学习社区中非常活跃的研究领域。强化学习(RL)肯定会借助广泛的机器学习研究成果,解决该领域的鲁棒性问题。

这些 RL 挑战对于希望使用这些工具解决现实世界问题的从业者来说非常重要,且这一总结希望能够帮助到你。我们在书中覆盖了许多解决方案方法,并在本节中也提到了整体的方向,所以你知道该从哪里寻找解决方案。所有这些都是活跃的研究领域,因此,每当你遇到这些挑战时,回顾文献是一个很好的做法。

在结束之前,我想对有志成为 RL 专家的人提供一些个人看法。

对有志成为 RL 专家的建议

本书面向的读者群体是那些已经掌握了强化学习基础的人。既然你已经读完了这本书,你已经具备了成为 RL 专家的基础条件。话虽如此,RL 是一个庞大的话题,本书的真正目的是为你提供一份指南和启动器。如果你决定深入研究,成为一名 RL 专家,我有一些建议。

深入了解理论

在机器学习中,模型往往无法在一开始就产生预期的结果。有一个重要因素可以帮助你克服这些障碍,那就是为你用来解决问题的算法背后的数学打下坚实的基础。这将帮助你更好地理解这些算法的局限性和假设,并能识别它们是否与当前问题的实际情况冲突。为此,以下是一些建议:

  • 深入理解概率论和统计学永远不是坏主意。别忘了,所有这些算法本质上都是统计模型。

  • 对强化学习的基本概念有扎实的理解,如 Q-learning 和贝尔曼方程,对于构建现代强化学习是至关重要的。本书在某种程度上服务于这个目的。然而,我强烈推荐你多次阅读 Rich Sutton 和 Andrew Barto 的书籍 Reinforcement Learning: An Introduction,这本书基本上是传统强化学习的圣经。

  • 赛尔吉·莱文教授的 UC Berkeley 深度强化学习课程,是本书在此领域受益匪浅的一个重要资源。这个课程可以通过 rail.eecs.berkeley.edu/deeprlcourse/ 访问。

  • 另一个很棒的资源,专门涉及多任务学习和元学习,是切尔西·芬恩教授的斯坦福课程,网址是 cs330.stanford.edu/

  • 由该领域专家教授的 Deep RL Bootcamp 是另一个优秀的资源:sites.google.com/view/deep-rl-bootcamp/home

当你浏览这些资源,并不时参考它们时,你会发现自己对该主题的理解变得更加深入。

关注优秀的从业者和研究实验室

有一些优秀的研究实验室专注于强化学习(RL),并且他们也通过详细的博客文章发布他们的研究成果,这些文章包含了很多理论和实践的见解。以下是一些例子:

即使你不阅读每一篇帖子,定期查看它们也是个好主意,这样可以保持与强化学习研究趋势同步。

从论文和它们的优秀解释中学习

在人工智能(AI)研究中,一年就像是狗年:发生了很多事。所以,保持最新的最好的方式就是关注该领域的研究。这也会让你接触到方法的理论和严格的解释。现在,这样做有两个挑战:

  • 每年发布的论文数量庞大,几乎不可能阅读所有论文。

  • 阅读公式和证明可能会让人感到望而生畏。

为了解决前者,我建议你关注像 NeurIPS、ICLR、ICML 和 AAAI 等会议上接收的论文。这仍然会是一大堆论文,因此你需要制定自己的筛选标准,决定哪些论文值得阅读。

为了解决后者,你可以查看是否有优秀的博客文章解释你想更好理解的论文。以下是一些高质量的博客(不限于 RL):

我个人从这些博客中学到了很多,并且仍然在持续学习。

关注深度学习其他领域的趋势

深度学习的许多重大进展,如 Transformer 架构,仅需几个月时间就能进入强化学习(RL)领域。因此,保持对广泛的机器学习和深度学习研究中的主要趋势的关注,将帮助你预测 RL 领域即将到来的发展。我们在前一部分列出的博客是跟踪这些趋势的好方法。

阅读开源代码库

到目前为止,强化学习中的算法实在是太多了,无法在书中逐行解释。因此,你需要在某个阶段培养这种素养,直接阅读这些算法的优质实现。以下是我的建议:

除了这些,许多论文现在也有自己的代码库,就像我们在本书的某些章节中使用过的那样。有一个非常好的网站,paperswithcode.com/,你可以用来查找这类论文。

实践!

无论你读了多少内容,真正的学习只有通过实践才能实现。所以,尽可能亲自动手去做。你可以通过复现强化学习论文和算法,或者更好的是,进行自己的强化学习项目。深入理解实现的内部细节所带来的益处是任何其他方式都无法替代的。

我希望这套资源对你有帮助。需要明确的是,这些内容量很大,消化这些信息需要时间,因此请设定实际的目标。此外,你还需要在阅读和跟随内容时有所选择,这个习惯会随着时间的推移而逐步养成。

最后的话

好了,是时候总结了。感谢你投入时间和精力阅读这本书。希望它对你有所帮助。最后我想强调的是,掌握一项技能需要很长时间,而且你能达到的水平是没有限制的。没有人是所有领域的专家,即使是强化学习或计算机视觉这样的小领域也是如此。你需要不断实践。无论你的目标是什么,持续性和一致性将决定你的成功。祝你在这条路上一路顺利。

参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值