TowardsDataScience 博客中文翻译 2020(七百五十八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

正则化技术及其在 TensorFlow(Keras)中的实现

原文:https://towardsdatascience.com/regularization-techniques-and-their-implementation-in-tensorflow-keras-c06e7551e709?source=collection_archive---------6-----------------------

技术(包括代码)

理解用于减轻深度神经网络中过拟合问题的传统技术。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上的 Clarisse Croset 拍摄的照片

正规化

深度神经网络(DNN)具有大量的架构内部权重参数,可以学习一系列值。这些数值范围是使神经网络能够解决巨大复杂函数的关键。

神经网络越深,其具有的代表能力就越强,但是,随着权参数数量的增加,会出现一个缺点。这个缺点是神经网络更容易过拟合训练数据集。

过拟合:这个问题涉及到算法预测呈现给它的模式的新实例,基于太接近于它在训练期间观察和学习的模式的实例。这可能导致机器学习算法无法准确地推广到看不见的数据。如果训练数据没有准确地表示测试数据的分布,则会发生过度拟合。可以通过减少训练数据中的特征数量以及通过各种技术降低网络的复杂性来修复过度拟合

正则化技术通过限制网络中权重值的范围来降低神经网络过拟合的可能性(稍后将详细介绍)。

本文介绍了两种正则化策略,对损失函数的结果施加约束条件。

损失函数是一种量化机器学习模型表现有多好的方法。量化是基于一组输入的输出(成本),这些输入被称为参数值。参数值用于估计预测,而“损失”是预测值和实际值之间的差异。

本文不会关注正则化的数学。相反,本文介绍了一些标准的正则化方法,以及如何使用 TensorFlow(Keras)在神经网络中实现它们。

关于数学的更多细节,这些由莱米·卡里姆雷努·汉德尔瓦尔撰写的文章合理地展示了 L1 和 L2 的正则化数学。

[## L1 L2 正则化

在这篇文章中,我们将了解为什么我们需要正规化,什么是正规化,什么是不同类型的…

medium.com](https://medium.com/datadriveninvestor/l1-l2-regularization-7f1b4fe948f2) [## 对 L1 和 L2 正则化的直觉

他们如何防止过度拟合?

towardsdatascience.com](/intuitions-on-l1-and-l2-regularisation-235f2db4c261)

正规化的类型

从上一节中,我们可以理解正则化技术作用于神经网络中的权重参数。更具体地说,它修改结果损失函数,进而修改产生的权重值。

l1 正则化

L1 正则化对神经网络权重值的影响在于,它通过使权重值等于 0 来惩罚接近 0 的权重值。负权重值也取值为 0;所以如果一个权值是-2,在 L1 正则化的作用下,它变成 0。

L1 正则化的一般直觉是,如果权重值接近 0 或非常小,那么它对于模型的整体性能来说是可以忽略的,因此使其为 0 不会影响模型的性能,并且可以减少模型的内存容量。

  • L1 对权重的绝对值之和(|weight|)进行惩罚

我知道我说过我不会涉足数学,但是下面的数学符号应该相对容易理解。

我们有损失函数,在这种情况下,均方差。

然后我们加上权重绝对值之和与正则化超参数值的乘积,用λ符号()表示。

数学符号中的 i 表示当前权值的索引, n 表示层内权值的总数。 W 代表重量值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

L1 正则化

l2 正则化

L2 正则化也惩罚权重值。对于较小的权重值和相对较大的权重值,L2 正则化将这些值转换为接近 0 但不完全 0 的数字。

  • l2 惩罚权重的平方和(权重)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

L2 正则化

如果你要结合 L1 和 L2 正则化技术的效果,那么你将得到‘弹性网正则化’。

正则化技术在训练过程中对神经网络产生影响,而不是进行推理。

现在我们对正则化有了一些基本的理解(随意探索两种方法的数学)和一些例子,让我们看看它们是如何实现的。

实施正规化

第一步是导入用于实现或支持神经网络实现的工具和库。

  • TensorFlow :机器学习模型实现、训练、部署的开源平台。
  • Keras :一个开源库,用于实现运行在 CPU 和 GPU 上的神经网络架构。
import tensorflow as tf
from tensorflow import keras

我们将利用的数据集是普通的时尚-MNIST 数据集

时尚-MNIST 数据集包含 70,000 幅服装图像。更具体地说,它包括 60,000 个训练样本和 10,000 个测试样本,这些样本都是尺寸为 28×28 的灰度图像,分为十类。

数据集的准备包括通过将每个像素值除以 255.0 来归一化训练图像和测试图像。这将像素值置于范围 0 和 1 之间。

数据集的验证部分也在此阶段创建。这组数据集在训练期间被用来评估网络在各种迭代中的性能。

(train_images, train_labels),(test_images, test_labels) = keras.datasets.fashion_mnist.load_data()
train_images = train_images / 255.0
test_images = test_images / 255.0validation_images = train_images[:5000]
validation_labels = train_labels[:5000]

接下来,我们使用 Keras Sequential API 实现一个简单的模型。我们模型中的隐藏层使用了多种正则化技术。

要添加一个正则化到一个层,你只需要把首选的正则化技术传递给层的关键字参数’ kernel _ regularizer '。

Keras 正则化实现方法可以提供代表正则化超参数值的参数。这显示在下面的一些层中。

Keras 提供了 l1 和 l2 正则化的实现,我们将在下面的代码片段中的一些隐藏层中使用它。此外,我们包括一个利用 l1 和 l2 正则化的层。

这就是在神经网络中实现各种正则化技术的全部内容。不太难。

model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28,28]),
    keras.layers.Dense(200, activation='relu', kernel_regularizer=keras.regularizers.l1()),
    keras.layers.Dense(100, activation='relu', kernel_regularizer=keras.regularizers.l2(0.001)),
    keras.layers.Dense(50, activation='relu', kernel_regularizer=keras.regularizers.l1_l2(0.01)),
    keras.layers.Dense(10, activation='softmax')
])

在下一段代码中,我们设置并指定用于训练已实现的神经网络的优化算法;以及损失函数和超参数,例如学习速率和时期数。

sgd = keras.optimizers.SGD(lr=0.01)
model.compile(loss="sparse_categorical_crossentropy", optimizer=sgd, metrics=["accuracy"])model.fit(train_images, train_labels, epochs=60, validation_data=(validation_images, validation_labels))

使用先前搁置的测试数据进行模型性能的评估。

通过评估结果,您可以在观察测试数据集评估的准确性后,决定微调网络超参数或继续生产。

model.evaluate(test_images, test_labels)

结论

如果损失函数上的正则化项被从层中排除并被训练相同数量的历元,则实现的模型可能在测试数据集上具有更好的性能。

正则化更常用于具有数百万个参数和更多特征的更深层次的神经网络中。

我希望读者现在对各种各样的正则化技术以及如何实现它们有一个直觉。

探索神经网络实现和训练中的其他正则化方法可能是令人感兴趣的,例如退出提前停止

下面是本文包含的代码的 GitHub 存储库。

[## Richmond alake/tensor flow _ 2 _ 教程

permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…

github.com](https://github.com/RichmondAlake/tensorflow_2_tutorials/blob/master/09_regularization.ipynb) [## 神经网络中的批量标准化(代码)

通过 TensorFlow (Keras)实施

towardsdatascience.com](/batch-normalization-in-neural-networks-code-d7c9b88da9f5) [## 作为机器学习工程师你需要的 5 个软技能(以及为什么)

包括成为任何劳动力的有用组成部分的提示

towardsdatascience.com](/5-soft-skills-you-need-as-a-machine-learning-engineer-and-why-41ef6854cef6)

正规化。什么,为什么,什么时候,怎么做?

原文:https://towardsdatascience.com/regularization-what-why-when-and-how-d4a329b6b27f?source=collection_archive---------14-----------------------

在这篇文章中,我想深入探讨一下正规化。

什么?

什么是正规化?

正则化是一种约束模型的方法,以准确地拟合我们的数据,而不是过度拟合。它也可以被认为是惩罚我们模型中不必要的复杂性。深度学习实践者主要使用 3 种类型的正则化技术。它们是:

  1. L1 正则化或拉索正则化
  2. L2 正则化或岭正则化
  3. 拒绝传统社会的人

侧栏:其他技术也可以对我们的模型产生正则化效果。你可以通过更多的数据来限制我们函数的搜索空间,从而防止过度拟合。这可以通过数据扩充等技术来实现,这些技术可以创建更多的数据来训练,从而减少过度拟合。
有许多其他解决过度拟合的方法,如集合和提前停止,它们可以帮助防止过度拟合,但不被视为正则化,因为它们不限制搜索空间或惩罚复杂性。尽管你应该记住这些,因为调整并不是解决过度拟合的唯一方法。

为什么?

我们为什么需要正规化?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:欠适与过适。图片由作者提供。灵感来自吴恩达

在图 1 中,我们看到 3 条曲线。左边的预测分数做得很差,右边的预测分数做得**【太好】**。我们可以直观地看出左边的图不对,但是为什么右边的不好呢?我们的模型准确预测点的位置,这不好吗?

答案是,原因如下。我们的数据包含一些噪音,我们不希望我们的模型预测噪音,因为噪音是随机的。所以右边的图也不理想,我们想要像中间的图一样的东西。

拟合不足是由于我们的模型过于简单,或者训练时间不够长造成的。过度拟合是一个更难的问题。
过度拟合可能是由于过于复杂的模型(学习噪音)造成的,或者是我们的模型函数的搜索空间太大,我们没有足够的数据来限制搜索。

所以正则化是一种停止过度拟合的方法。

什么时候?

我们什么时候使用正规化?

每当我们怀疑我们的模型过度拟合时,我们就使用正则化。过度拟合的最大迹象是验证指标的糟糕表现。验证集是模型尚未看到的数据集的一部分。

因为我们想检测我们的模型是仅从数据中学习,还是受到噪声的严重影响,所以我们使用噪声与训练集不同的验证集。因此,如果我们的模型过度拟合训练数据,它将在我们的验证集上预测不佳。

在培训期间,我们还会不断测量验证指标。如果我们看到验证指标没有显著提高,或者恶化,这是我们的模型过度拟合的警告信号。然后我们需要应用正则化技术。

注意:有些规则化技术没有缺点,应该一直使用**。这方面的一个例子是数据扩充。使用数据扩充没有坏处,无论模型是否过度拟合都应该使用。**

怎么会?

L1 正规化

L1 正则化通过添加基于由某个值 l(通常称为λ)缩放的参数的绝对值的惩罚来工作。

最初我们的损失函数是: Loss = f(preds,y) 其中 *y 是目标输出,preds 是预测preds = WX+b*,其中 W 是参数,X 是输入,b 是偏差。**

对于 L1 正则化,我们添加了 l|W|的额外项,其中 W 是权重矩阵(参数)。因此,L1 正则化后的损失函数为*

损失= f(preds,y) + l*abs(W)

L2 正规化

L2 正则化非常类似于 L1 正则化,除了罚项是由某个因子 l(λ)缩放的参数的平方

损失= f(preds,y) + l(W)*

L1 与 L2 正规化的区别

L1 正则化和 L2 正则化之间的区别在于,损失函数相对于 L1 正则化的参数的梯度与参数的无关,因此一些参数可以一直设置为零,因此完全被忽略。****

但是在 L2 正则化中,损失函数的梯度线性地依赖于参数**,因此参数不可能为零。它们只是渐近地接近零。这意味着没有一个参数被完全忽略,每个参数对预测的影响总是最小的。**

这种差异是选择正规化类型的关键,如果你知道你有无用的功能,L1 可能是一个更好的选择。如果你想考虑所有的功能,L2 可能是一个更好的选择。

细微差别:深度学习中有一个细微差别,通过使用 L1 和 L2 正则化,可以使用两全其美的方法。这被称为弹性网正则化。

辍学

Dropout 是一种神奇的正则化技术,只对神经网络有效(据我所知)。dropout 的惊人想法是以概率 p (p 是超参数)随机地将输入张量的一些元素归零。

这背后的直觉很简单,当我们的模型太复杂时会出现过度拟合,那么我们如何简化模型呢?只是不要用一些神经元然后嘭!!实现了一个更简单的模型。

我们发现辍学在实践中非常有效,并且易于实施。我绝对推荐试一试。

数据扩充

数据扩充是我们正规化的最终“方法”。数据扩充背后的想法非常简单,但极其优雅。

我们知道过度拟合是由于在我们的最优函数的搜索空间中缺乏约束而引起的。我们如何添加更多约束?更多数据。
但是为我们的问题收集更多的数据可能是一项耗时且艰巨的任务。这就是数据增强的用武之地。

数据扩充的想法是从我们已经拥有的数据中创造更多的数据。方法是对我们的图像进行一些变换,改变图像,使同一图像有不同的多个版本。神奇的是,我们有了更多的数据。

我最喜欢的深度学习库( fastai )提供的数据增强列表可以在这里看到

结论

检查你的模型是否过度拟合,使用上述正则化方法之一来避免过度拟合。始终使用数据增强!!鳍。

正则贪婪森林

原文:https://towardsdatascience.com/regularized-greedy-forest-a17cd0c85f06?source=collection_archive---------32-----------------------

梯度助推器

修改赢得许多卡格尔比赛的 GBM

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源: Unsplash

2011 年,Rie Johnson 和张彤提出了对梯度推进模型的修改。他们称之为正规化的贪婪森林。当他们进行修改时,GBDTs 已经在某种程度上统治了表格世界。他们测试了各种数据集的新修改,包括合成和真实世界,并发现他们的修改比标准 GBDTs 实现了更好的性能。他们还参加了一些 Kaggle 类型的比赛(债券价格挑战生物反应预测和遗产提供商网络健康奖),并在比赛中击败了其他 GBDT 模特。

他们建议的核心 GBDT 算法的关键修改如下:

完全正确的贪婪更新

根据 Friedman[1]的说法,标准梯度提升的缺点之一是收缩/学习率需要很小才能实现收敛。事实上,他主张无限小的步长。他们建议进行修改,使收缩参数变得不必要。

在标准梯度推进中,该算法在每次迭代中执行部分校正步骤。该算法仅在当前迭代中优化基础学习器,而忽略所有先前的学习器。它为当前时间步长创建最佳回归树,并将其添加到集合中。但是他们建议在每次迭代中,我们更新整个森林( m 基础学习者用于迭代 m )并且在每次迭代中重新调整比例因子。

结构化稀疏正则化

虽然完全校正的贪婪更新意味着算法将更快地收敛,但也意味着它过拟合得更快。因此,结构化稀疏正则化被用来解决这个问题。结构化稀疏性的一般思想是,在假设稀疏解的情况下,可以利用任务背后的稀疏结构。在这个特定的设置中,它被实现为在森林结构中对决策规则的稀疏搜索。

显式正则化

除了结构化稀疏正则化,他们还包括一个损失函数显式正则项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 l 是可微凸损失函数,ω是惩罚树结构复杂性的正则化项,ϕ是森林结构。

本文介绍了三种类型的正则化选项:

树叶的 L2 正则化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中ϕ是森林结构,λ是用于控制正则化强度的常数,αᵥ是节点 v 的权重(其被限制为叶节点),Lₜ是树 t 的叶,𝒯是森林中所有树的集合。

实现中超参数: l2

最小惩罚正则化

最小惩罚正则化惩罚树的深度。这是一种正则化,它作用于所有节点,而不仅仅是树叶。这使用了任何叶节点都可以根据其祖先节点来编写的原则。正则化背后的直觉是它惩罚深度,这在概念上是一个复杂的决策规则。

确切的公式超出了我们的范围,但是这里的关键超参数是 l2 ,它控制正则化的整体强度,以及 reg_depth ,它控制惩罚树的深度的严厉程度。 l2 的建议值为 1、0.1、0.01,而 reg_depth 应为大于 1 的值

兄弟和为零的最小惩罚正则化

这非常类似于最小惩罚正则化,但是增加了一个条件,即兄弟节点的权重总和应该为零。总和为零约束背后的直觉是,冗余较少的模型是优选的,并且当内部节点处的分支导致完全相反的动作时,模型是最不冗余的,例如将“x”加到输出值而不是从输出值中减去“x”。所以这不利于两件事——树的深度和树的冗余度。这里没有额外的超参数。

**注意:**这里要注意的一个有趣的花絮是,论文和竞赛中的所有 bechmarks 都只使用了简单的 L2 正则化。

算法

总的概念仍然类似于梯度推进,但是关键的区别在于每次迭代中的树更新。并且由于目标函数中的正则化项,简单方便的均值或中值导数或梯度不再起作用。

让我们看看新的算法,尽管是在一个高层次上。

  1. 重复

1.1 ϕ是通过对当前森林ϕ应用一步结构改变操作可获得的所有森林中最小化ℒ(ϕ的最佳森林)

1.2 优化ϕ的叶片重量以最小化损失(ℒ(ϕ)

2.直到满足一些退出标准

3.优化ϕ的叶子重量以最小化损失ℒ(ϕ)

4.返回ϕ

树构建策略

在规则贪婪森林中,树的建造方式有一个关键的不同。在经典的梯度推进中,在每个阶段都会建立一棵新树,并有一个特定的停止标准,比如深度或叶子的数量。一旦你通过了一个阶段,你不能碰那棵树或与之相关的重量。相反,在 RGF,在任何 m 次迭代中,更新任何先前创建的 m-1 树或开始一个新树的选项是开放的。对森林的确切更新由最小化损失函数的动作来确定。

让我们看一个例子来理解梯度增强和正则化贪婪森林在树构建上的根本区别

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

梯度推进的树构建过程(来源:自有图解)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正则化贪婪森林的树构建过程(来源:自己的插图灵感来自论文[2])

标准的梯度提升建立连续的树,并将这些树相加成为近似期望函数的加法函数。

RGF 采取了稍微不同的路线。对于树结构中的每一步变化,它评估在现有树中生长新叶与借助损失函数开始新树的可能性,然后采取贪婪的方法来选择损失最小的路线。所以在上图中,我们可以选择在 T1,T2 或 T3 种植树叶,或者我们可以开始一个新的 T4 树,这取决于哪一个给你最大程度的减少损失。

但实际上,这样做在计算上是有挑战性的,因为随着我们越来越深入森林,要评估的可能分裂呈指数增长。因此,在实现中有一个超参数, n_tree_search ,它将树的回溯更新限制为仅那些最近的树。默认值设置为 1,以便更新总是查看一个先前创建的树。在我们的例子中,这降低了在 T3 长出叶子或在 T4 长出新树的可能性。

从概念上讲,与森林中树木的加法函数相比,这变成了森林树叶的加法函数,因此,在 RGF 中没有 max_depth 参数,因为树的深度自动受到对树结构的增量更新的约束。

下一步是被选为最佳结构变化的新叶的权重。这是一个优化问题,可以使用多种方法中的任何一种来解决,如梯度下降法或牛顿-拉夫森法。因为我们正在寻找的优化更简单,所以本文使用了比梯度下降更精确的牛顿步来获得新叶的近似最优权重。如果你对我们如何以及为什么需要牛顿步来优化这些函数感兴趣,请参考附录 A。

重量优化

在基础学习器或基础函数固定的情况下,我们需要优化森林中所有叶子的权重。这又是一个优化问题,使用坐标下降法来解决,坐标下降法迭代遍历每片叶子,并以较小的步长通过牛顿步长来更新权重。

因为已经设置的初始权重是近似最优的,所以我们不需要每次迭代都重新优化权重。如果我们这样做,计算成本会很高。这是实现中的另一个超参数,称为 opt_interval 。根据经验,观察到除非 opt_interval 是极值,否则 opt_interval 的选择并不重要。对于他们赢得的所有比赛,他们只是简单地将值设置为 100。

关键超参数和调整

以下是论文作者建议的关键超参数列表。它几乎是直接取自他们的 Github 页面,但是被采用到 Python 包装器中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

附录 A

泰勒近似和牛顿-拉夫逊最优化方法

Youtube 频道 3Blue1Brown(如果你想要对数学有基本的直觉,我强烈推荐它)有另一个精彩的视频来解释泰勒展开/近似。请务必至少观看视频的前 6 分钟。

泰勒近似法让我们通过使用函数的导数来近似一个接近于一点的函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

假设我们进行二阶近似,并找到一个局部最小值,我们可以通过设置导数为零来实现

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将其设置为零,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这(x-a)是最小化该点函数的最佳步骤。所以,这个最小值更像是朝向最小值的步进方向而不是实际的最小值。

为了优化不可微函数,我们需要在步长方向上采取多步,直到我们对损失相对满意,或者从技术上来说,直到损失低于我们的容差。这被称为优化的牛顿-拉夫森方法

梯度助推器中的其他文章

参考

  1. 贪婪函数近似:一种梯度推进机器。安。统计学家。29 (2001 年),第 5 号,1189-1232。
  2. Johnson,Rie & Zhang,Tong,“利用正则化贪婪森林学习非线性函数”,《IEEE 模式分析与机器智能汇刊》 (卷:36, 期:5 ,2014 年 5 月

原载于 2020 年 2 月 9 日 http://deep-and-shallow.com

用 JavaScript 重新实现流行的 Python 功能

原文:https://towardsdatascience.com/reimplementing-popular-python-functionalities-in-javascript-b3cfe8e7849f?source=collection_archive---------20-----------------------

学习如何应对一个新的世界,并充分利用现有的工具。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由艾蒂安·德洛里欧Unsplash 上拍摄

我的第一语言是 Python。我喜欢 Python 的多功能性、易用性和精彩的社区。

几个月前,我开始冒险深入 JavaScript 丛林,因为我已经开始构建 ViTeach (目前只有德语版本)。ViTeach 是一个数学平台,旨在使用机器学习和自然语言处理来快速跟踪和个性化数学学习。但是这篇文章不是为了宣传我的项目。这篇文章是关于我在使用 JavaScript 时错过的一些基本的 Python 功能。但不要担心,经过一段时间的语言适应后,事情开始变得非常相似。

在本文中,我们将讨论三种常见的模式/功能,对于来自 Python 的人来说,它们在 JavaScript 中并不十分明显:

  • 范围
  • 列出理解
  • 字典理解(并使用结果来获得大型数组操作的性能提升)

①范围

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Ashkan Forouzani 在 Unsplash 拍摄的照片

让我感到惊讶的第一件事是 JavaScript 没有 Python 钟爱的range的实现。Python 中的 range 函数返回一个所谓的 sequence 对象,这就是为什么我们必须将它解析为一个列表(或者循环遍历它)来打印出值(例如,在 Jupyter 笔记本中)。但是大多数情况下,您无论如何都只是迭代这些值,因此很少需要 step。range为 0 索引,取:

  • 一个(最大),
  • 两个(最小和最大),
  • 或者三个参数(最小值、最大值和步长)。

请注意,range的参数是位置参数 (args),而不是关键字参数 (kwargs)。

计算机编程语言

**IN: (One Argument - only max value)** list(range(10))
**OUT:** [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]**IN: (Two Arguments - min and max value)** list(range(3,11))
**OUT:** [3, 4, 5, 6, 7, 8, 9, 10]**IN: (Three Arguments - min, max and step value)** list(range(7,34,3))
**OUT:** [7, 10, 13, 16, 19, 22, 25, 28, 31]

Java Script 语言

尤普,JavaScript 中没有range函数。对于第一种情况(仅 max ),我们可以得到最接近的结果如下:

**IN:** [...Array(5).keys()]
**OUT:** [0,1,2,3,4]

真的吗?!?这里到底发生了什么?让我们仔细分析一下。首先,我们实例化一个长度为 5 的数组(Array(5))。此时,数组的每个值都是undefined。然后我们通过.keys()得到每个元素的索引(即在数组中的位置),最后通过destructuring ( )操作符destructure将索引列表放到一个新的数组中,从而创建一个浅层副本。哇,那确实是一把。

第二种情况(min 和 max)和第三种情况(min、max 和 step)需要更多的自定义逻辑,这就是为什么我决定编写我的实现,并在此后的几乎每个项目中使用它。

const range = (min, max, steps = 1) => {**// Step 1)**
  const arr = Array.from(
    new Array(max - min), 
    (_, idx) => idx + min
  );**// Step 2)**
  return arr.filter((_, idx) => idx % steps === 0);
};**IN:** range(3,11)
**OUT:** [3, 4, 5, 6, 7, 8, 9, 10]**IN:** range(7,34,3)
**OUT:** [7, 10, 13, 16, 19, 22, 25, 28, 31]

让我们快速解释一下这是干什么的:

  1. Array.from()接受一个数组和一个映射函数,并将该函数应用于一个类似数组或可迭代对象的每个元素,想想 Python 中的[func(idx,val) for (idx,val) in enumerate(arr)]。我们给每个值加上最小值,现在有了一个从最小值到最大值的列表。注意,除了new Array(max-min),我们还可以使用之前使用的函数([...Array(max-min).keys()]),但是正如我提到的,我发现语法有点奇怪。
  2. arr.filter()过滤我们的数组,使得结果数组只包含符合过滤标准的元素。在我们的例子中,idx,即数组模步长中的位置必须是 0(即该数必须是没有余数的整除数)。因此只取每第 n 个元素(其中 n =步长)

②列表理解

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尼克·希利尔在 Unsplash 上拍摄的照片

对我来说,列表理解是 Python 的主要特征之一,也是 Python 编码方式的象征。它们允许去掉 for 循环,这通常会使代码更加易读和简洁。让我们看看一些常见的使用案例。

计算机编程语言

典型的情况是从数组中过滤元素,然后返回一个只包含满足条件的元素的数组(例如,类型检查)。

**IN:**
values = [1,2,3,5,"x",10]
[_ for _ in values if isinstance(_,int)]**OUT:** [1, 2, 3, 5, 10]

另一个主要用例是对列表中的每个元素应用一个函数,返回一个包含更新值的新列表,如下所示:

对列表中的每个元素应用一个函数

额外收获:你甚至可以像这样做嵌套列表理解:

**IN:**
matrix = [
  [1, 2], 
  [3, 4], 
  [5, 6], 
  [7, 8]
]multiply_by_two = [
  [cell * 2 for cell in row] for row in matrix
]**OUT:** [
  [2 , 4 ], 
  [6 , 8 ], 
  [10, 12], 
  [14, 16]
]

Java Script 语言

pythonic 列表理解语法确实存在于 JavaScript 中,尽管只是在实验版本中。ECMAScript 4 曾讨论过这个问题,但在 ECMAScript 6 中被永久放弃了。他们可能会在未来带回某种形式的一般理解(即适用于所有可重复的作品)。但是现在,箭头函数和**map, filter and find** 就可以了。让我们回顾一下前面的例子。我将使用_作为标记“丢弃变量”的一种方式(因为下划线不会占用太多空间)。让我们从过滤开始:

**IN:**
const values = [1,2,3,5,"x",10]
values.**filter**(_ => Number.isInteger(_))**OUT:** [1, 2, 3, 5, 10]

filter的一个特例是find,我发现它非常有用。Find 返回匹配条件的第一个元素。

**IN:**
const values = [1,2,3,5,"x",10]
values.**find**(_ => _ > 4)**OUT:** 5

**注意:**如果没有元素满足条件:

  • **find** 将返回**undefined**(falsyvalue)
  • **filter**将返回**[]**(truthy value)这在 Python 中尤其奇怪,在 Python 中空数组肯定是错误的——我提到过 JavaScript 有时很奇怪吗?)****

接下来是对列表中的每个元素应用函数。通过**map**可以轻松实现该功能。

对数组中的每个元素应用 JavaScript 函数

③词典理解

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由粘土堤Unsplash 拍摄

比列表理解稍微不常见的是字典理解,我发现它在构建映射对象时非常强大。假设有一个场景,在这个场景中,你有一个列表中的 lot 个对象,假设所有的对象都有个唯一的 id和其他一些数据,如下所示:

**{
  '_id': '850f200c0b8f4b0ea80513e71fad93a0',
  'name': 'qHvbtkRxrj',
  'net_worth': 32000
}**

假设您从数据库中获得了这个列表,并希望进行一些基于 id 的操作。然后你将不得不无数次地遍历这个列表。更简单的方法是将列表转换成哈希表,其中_id成为键,对象本身成为值。

**hash_table = {
...,
'**850f200c0b8f4b0ea80513e71fad93a0**': {
  '_id': '**850f200c0b8f4b0ea80513e71fad93a0**',
  'name': 'qHvbtkRxrj',
  'net_worth': 32000
},
...
}**

现在,当我们想要改变一个特定条目的净值时,我们可以通过它的 _id 快速查找,改变对象,因为对象的条目是通过引用存储的,因此改变了原始列表。

巨蟒

Python 中的字典理解

当然,您也可以使用新生成的 hash_table 来快速检索特定 _id 的net_worth。与一次又一次地查找 _ids 相比,使用散列表带来了巨大的性能提升 (10⁵)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过使用哈希表提高因子 1⁰⁵的性能

Java Script 语言

JavaScript 中的字典理解比 Python 中的稍微复杂一点,但实现起来仍然相当简单。我们将使用reduce来达到预期的结果。Reduce取一个初始值,然后遍历数组中的所有值,不断更新初始值。

JavaScript 中的字典理解

在这篇文章中,你学习了如何在冒险进入一个新的、看似可怕的世界时找回一些工具。

使用 TensorFlow2.x(加强)策略梯度

原文:https://towardsdatascience.com/reinforce-policy-gradient-with-tensorflow2-x-be1dea695f24?source=collection_archive---------14-----------------------

使用 TensorFlow 2.x 实施增强(PG)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在本文中,我们将尝试理解称为加强的策略梯度算法背后的概念。然后,我们将查看 TensorFlow 2.x 中算法的代码。让我们首先了解什么是策略梯度,然后我们将了解一种特定的策略梯度方法,也称为增强。

什么/为什么是政策梯度?

到目前为止,我们一直在学习状态-动作对的 Q 值。策略梯度算法不是先学习 Q 值再找一个策略,而是直接学习一个策略。但是为什么呢?让我们找出答案

  1. 学习策略导致更好的收敛,同时遵循梯度。而基于价值的方法在行动选择上可能会有很大的变化,即使在价值评估上有很小的变化。
  2. 这些算法对于像自动飞行无人机或自动驾驶汽车这样的大量动作非常有用。
  3. 可以学习随机政策。

算法和实现

加强是一种蒙特卡罗策略梯度方法,它在每一集之后进行更新。我们的神经网络将当前状态作为输入,输出所有动作的概率。我们可以通过调整代理网络的权重来优化我们的策略,以便在某个状态下选择更好的行动。通过对我们的目标函数执行梯度上升来调整这些权重。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们看看代码。

神经网络:

我们的模型实现如下。 注意最后一层包含 softmax 激活,输出每个动作的概率。

动作选择:

  1. 通过输入状态数组获得预测概率。
  2. 我们利用 TensorFlow 概率库将概率转化为分布。
  3. 然后我们从分布中抽取行动样本。
  4. 然后我们作为一个整体回到行动。

为了更好地理解,让我们先来看看主要的训练。

主训练循环:

  1. 我们维护了三个记录状态、奖励和行动的列表。
  2. 每集之后都要训练模型。

学习功能:

  1. 该函数将状态、动作和奖励列表作为参数。
  2. 我们将从奖励列表的最后一个元素开始循环。
  3. 然后,我们将计算每个州的预期累积奖励,就像我们在表格蒙特卡罗方法中所做的那样。
  4. 然后,我们计算损失的梯度和应用优化。

损失函数:

  1. 损失是所选行动的对数概率乘以该州的折现回报的负数。
  2. 请注意,这里的负号意味着我们正在执行梯度上升。

代码就这么多了,你可以在这里找到完整代码。让我们讨论一下政策梯度的一些弊端。

缺点:

  1. 很多时候,政策梯度收敛于局部极大值。
  2. 政策梯度法需要很长时间的训练。

所以,本文到此结束。谢谢你的阅读,希望你喜欢并且能够理解我想要解释的东西。希望你阅读我即将发表的文章。哈里奥姆…🙏

参考资料:

[## 强化学习

由阿尔伯塔大学提供。强化学习专业化包括 4 门课程探索权力…

www.coursera.org](https://www.coursera.org/specializations/reinforcement-learning) [## 强化学习,第二版

显着扩大和更新的广泛使用的文本强化学习的新版本,最…

mitpress.mit.edu](https://mitpress.mit.edu/books/reinforcement-learning-second-edition) [## 关于政策梯度的介绍

托马斯·西蒙尼尼对政策梯度的介绍

www.freecodecamp.org](https://www.freecodecamp.org/news/an-introduction-to-policy-gradients-with-cartpole-and-doom-495b5ef2207f/) [## 机器学习的冒险——学习和探索机器学习

由 admin |深度学习、策略梯度、强化学习、TensorFlow 2.0 在最近的一系列帖子中,我…

adventuresinmachinelearning.com](https://adventuresinmachinelearning.com)

强化吃豆人

原文:https://towardsdatascience.com/reinforced-pac-man-8e51409f4fc?source=collection_archive---------23-----------------------

趣味语境下的 AI 深度解析。

逃避 2020 年的严酷现实有多种形式。对一些人来说,2020 年已经充斥着阅读、听播客或深夜狂欢最新的网飞系列。对我来说,没有什么比建立一个人工智能代理来胜过阿朵的鬼谁是死心塌地吃它更好的背离现实了。是的,你猜对了,我说的是吃豆人,我说的是 AI。我们开始吧!

游戏设置

游戏将在包含我们的角色和物品的平铺游戏板上进行。在这种情况下,时间以离散的方式工作,而不是连续的,因此,下面的讨论将涉及时间步长(例如第 k 个时间步长)。在这个世界里,存在着:

  • 吃豆人——主角
  • 恩奇和克莱德——对立方
  • 颗粒——我们饥饿朋友的食物来源
  • 能量球——能让吃豆人的对手变得可食用的物体。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:吃豆人游戏板(图片由作者提供)。

这些角色和他们周围的世界之间的互动被封装在一个完整的游戏棋盘表示中,也就是所谓的状态。每个状态代表特定时间点的世界,吃豆人或幽灵的任何动作都会导致状态的改变。Pac-man 或 ghosts 可用的动作是基于移动的动作,指示实体是向上、向下、向左还是向右移动。此外,像任何好的游戏一样,存在一个与传统游戏略有不同的积分系统。

  • 每吞噬一个小球,分数增加 10。
  • 状态每改变一次,就会招致 1 的生存惩罚。这是专门为了防止人工智能代理发现自己处于一种永远逃避墨奇和克莱德的模式中,从而不可能完成游戏。
  • 如果 AI 代理能够完成游戏,那么将会增加 500。可观的增长激励代理人完成游戏。
  • 类似地,死刑是用来阻止代理人被幽灵吃掉而退出游戏。
  • 吞噬一颗能量丸后吃掉任一个幽灵,会得到 200 的奖励。

在这个版本的吃豆人中,Inky 和 Clyde 并不特别聪明,并以随机行为遍历游戏棋盘。虽然这确实让吃豆人更容易赢得游戏,但目的是双重的:

  1. 吃豆人的主要动机是不被因基或克莱德吃掉而赢得游戏。
  2. 随着时间的推移,吃豆人必须学会如何在活着的时候最大限度地增加点数。

下面的解决方案将在不运行单一搜索算法的情况下处理这两个目标。

马尔可夫决策过程

马尔可夫决策过程(MDP)是一种对存在一组状态和动作的场景进行建模的正式方式。提交一个动作会以某种特定的概率导致不同的状态。也就是说,在给定先前状态 s 和所选动作 a 的情况下,存在描述到达状态**s’**的概率的转移函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个状态也有与之相关联的奖励,因此有奖励功能。奖励值取决于先前的状态、动作和结果状态。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了能够描述这个过程的开始和结束,还有一个开始和结束状态。不需要总是有终止状态,但这是对不同上下文的构造。

顾名思义,MDP 具有马尔可夫性质,即未来状态的条件概率严格依赖于当前状态。在这个结构中,这可以写成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这类流程的目标是找到最佳策略。策略是 AI 代理在任何给定状态下遵循的一组指令。这是通过一种称为值迭代的迭代方法来完成的。该算法是搜索问题的一个非常好的解决方案,因为它保证收敛到一个最优策略。该算法取决于贝尔曼方程的计算:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对上述等式的解释比看起来要简单得多。正在计算的是在第 (k+1) 时间步的状态值 s 。状态的值是与到新状态的转变相关联的奖励,s’,以及将从新状态接收的随之而来的奖励。然而,由于这些奖励是未来的奖励,它们现在对吃豆人来说价值较低,因此它使用了一个贴现因子 𝛾 来表示收益递减。因为新状态**s’**是不确定的,所以该等式取每个可能的新状态的平均值,并基于转移概率对它们进行加权。最后,在每一个可能的行动中取最大值的原因是,存在一种乐观的观点,即不是通过最坏的结果,而是通过最好的结果来定义一个国家的价值。

数值迭代算法

该算法源于上述解释,给出如下:

  1. 从所有值为 0 的状态开始。
  2. 使用贝尔曼方程迭代并更新每个状态。
  3. 重复直到收敛。

随着时间的推移,行动的最优选择将收敛到确定每个国家的最优政策。

MDPs 和 Pac-man

所以你可能会问自己,这和吃豆人有什么关系?吃豆人游戏的设置类似于 MDP。在任何给定的时间点,存在封装游戏的状态,Pac-man 可以选择采取的行动,以及当代理到达新的状态时以点数形式的奖励。然而,上述迭代寻找最优策略的构造并不是真正的学习,而是一种模拟场景和寻找最佳计划的方法。从这个意义上来说,它与搜索算法并没有太大的不同,我也不会违背自己不进行搜索的承诺。所以,建筑需要多一点…

Q-学习

上面所描述的被称为“离线”解决方案,它在给定一个转移函数和奖励的情况下制定一个最优策略。通常,准确定义是不可能的或非常困难的,因此,代理需要了解真实的分布,而不是不切实际地提供它。因此,需要一种“在线”解决方案,除了它所处的状态和它可以采取的行动之外,它一无所知。

与上面的值迭代相反,优化 Q 函数是对所述问题的解决方案。为什么?价值迭代的等式是期望的成本和回报对等状态。另一方面,Q 函数是当你处于一个状态 s 并应用一个动作 a 时的预期成本和回报。通过这样做,当代理探索每个状态下可用的动作时,下一次将理解随之而来的回报。该实现采用其值符合贝尔曼方程的新样本,并将先前的 Q 值推向新的经验值。这在数学上描述如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在实现中,⍺是学习率,并且该值可以被解释为模型对新样本的存在有多敏感。学习速率越高,新信息的价值就越大,因为当观察到新样本时,新信息的价值会发生相当大的变化。

虽然这种方法在足够高的重复次数后确实能很好地逼近转移概率,但一个明显的问题是在勘探和开采之间的选择。如果主角在状态 s 决定了一个动作 a,并实现了一个积极的回报,那么什么会阻止 Pac-man 在稍后的时间点重复同样的动作。在目前的结构中,什么都没有。这就是引入勘探率的原因。它迫使吃豆人在每次ϵ的时候选择一个随机的移动。最初, ϵ=1 ,这意味着吃豆人将总是随机选择一个动作,因为它对游戏板一无所知,因此它将允许吃豆人做出相当数量的好和坏的决定。随着时间的推移, ϵ 将收敛到 0,以反映周围游戏知识的增长和探索新动作的需求的缺乏。重要的是要警惕ϵ收敛过快或过慢的影响。收敛太快将导致 Pac-man 在特定状态下不采取足够的行动,结果,估计的转移函数将是不准确的。另一方面,收敛太慢将导致次优决策,即使在多次学习迭代后也是如此,这是随机决策的结果。

Q-Learning 和 Pac-man

在一个典型的固定状态场景中,每个状态都有一个固定的奖励,并且终端状态也是固定的,上述结构将足以遍历棋盘并随着时间优化奖励。然而,吃豆人是一个更有活力的游戏。总共有 3 种终端情况:

  • 因基的好意,游戏结束
  • 克莱德的好意,游戏结束了
  • 吞噬最后一颗子弹

此外,一旦吃豆人吃了一个小球或能量球,并意识到这种行为的回报,它就不能再吞噬同样的小球或能量球。这些事实给了吃豆人一个更加动态的本质,因此要求我们将游戏的这些“特征”编码到学习模型中。这样做还可以降低从基于状态的学习模型到基于特征的学习模型的模型复杂度。

用于简化游戏的功能:

  • 一步之遥的幽灵数量(该特征赋予附近有 1 或 2 个敌人的状态以重要性)
  • 吃食物(强调吃食物行为的特征)
  • 最接近的食物(赋予最接近的颗粒重要性的特征)
  • 偏差(包含其他可能情况的偏差术语)

在这样做的时候,近似 Q 学习是近似的,并且将所有可能的情况总结为 4 个特征。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,对算法进行适当的修改,以学习每个特征的每个 β 权重。重量代表了吃豆人对每个功能的重视程度。结果,我们对算法进行了适当的修改,使得每个特征的重要性 β 被学习。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果呢

最后,我们现在有了一个主角,他穿越周围的世界,建立直觉来躲避对手,同时最大化其一生的回报。

假设我们用 1000 次迭代和以下参数训练这个模型:

  • 𝛾 = 0.7
  • ⍺ = 0.1

认可和改进

我希望我们的黄种朋友的上述示范对你和对我一样令人满意。如果没有加州大学伯克利分校的 Pac-man 游戏引擎,这一切都是不可能的,该引擎已经被修改为与 Python 3 兼容。构建和解释我的解决方案的过程是非常宝贵的,尽管还有很多后续步骤。其中包括:

  1. 通过为每个幽灵引入传统的目标逻辑使 Pac-man 变得困难。
  2. 从 Q-learning 开始,下一个增加的复杂性层可能是深度 Q-Learning 模型。
  3. 使用包来优化实现(Github 源代码将很快推出)。
  4. 能量球被吞噬而鬼魂可以食用的情况很少发生,因此吃豆人不知道如何瞄准鬼魂。

我希望读者已经被我的第一篇博客吸引住了,并且能够理解强化学习的整体思想和细节。请留下您的评论和反馈。谢谢大家!

Unity 中自动驾驶汽车人工智能的强化学习

原文:https://towardsdatascience.com/reinforcement-learning-a-self-driving-car-ai-in-unity-60b0e7a10d9e?source=collection_archive---------11-----------------------

自动驾驶汽车的时代几乎就要降临在我们身上,至少 据埃隆马斯克 。因此,大概是时候学习如何为自己做一个了。虽然这篇文章没有深入到这种深度,但它足以制作出精通任何赛道的模拟汽车。

编辑:本故事已于 2021 年 1 月 1 日更新,以匹配 ML-Agents 的发布(1.0)版本。

注:本文面向已经对使用Unity有基本概念,并且对神经网络和 强化学习 感兴趣的人。不需要神经网络和/或博士学位的经验!本文提供了获得以下结果所需的一切:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面三辆车都是用本文的代码训练出来的,一辆是作者控制的,你能猜到是哪一辆吗?

所有必要的代码都可以在 GitHub 的 资源库 中找到。

最基本的乘坐方式

我们首先构建一个赛车游戏的基本功能——为此你只需要一个 Unity 的功能版本(用 20 20.1 测试)。因为我们并不是要制造一场有趣或真实的比赛,这可以用几行代码来完成。

赛道

为了创建一个轨道,我创建了一组 3 块瓷砖(直行、左转、右转),我们可以以任何方式组合它们来创建一个轨道。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

直走,左转,右转。每个瓷砖都由三个网格组成—一个正方形地板(带箭头的黑色)和两个边界。每个对象都是静态的,在所有三个网格上都有一个碰撞器。边界块必须标记为“”。

如您所见,每个瓷砖都有一个箭头。这个箭头显示了瓦片的退出方向,并匹配每个瓦片的forward向量,我们将在后面使用。

通过将瓷砖放置在彼此相距 10 米的位置(我建议将捕捉设置设置为 10),我们可以构建任何自定义轨道。这是我们将用于培训的工具:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练跑道。注意,它与文章开头的赛道不同——在这条赛道上训练的 AI 可以很容易地在赛道瓷砖的任何组合上使用。

汽车

第二,我们制造汽车。我提供了一个 b̶e̶a̶u̶t̶i̶f̶u̶l 方便的三维模型作为这个项目的基础。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

汽车是一个单独的物体,带有一个箱式碰撞器和一个动态刚体。由于我们只对平面上的运动感兴趣,所以可以关闭围绕 Y(绿色)轴的运动以及围绕 X、Z(红色、蓝色)轴的旋转。

同样,汽车的前进矢量指向它的运动方向。我们现在可以让我们的汽车移动了,这是使用下面的脚本完成的。

public class Car : MonoBehaviour
{
    public float speed = 10f;
    public float torque = 10f;

    private void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        float dt = Time.deltaTime;
        MoveCar(horizontal, vertical, dt);
    }

    private void MoveCar(float horizontal, float vertical, float dt)
    {    
        // Translated in the direction the car is facing
        float moveDist = speed * vertical;
        transform.Translate(dt * moveDist * Vector3.forward);

        // Rotate alongside it up axis 
        float rotation = horizontal * torque * 90f;
        transform.Rotate(0f, rotation * dt, 0f);
    }
}

就是这样。如果你一直跟着,你可以开车去兜风。

请注意,该脚本仅基于向上或向下箭头键向前/向后移动,并向左或向右旋转。

我们完成了,我们的单人赛车游戏现在完成了!自己做一些测试,然后让我们看看人工智能在上面会有什么表现。

训练汽车

现在我们将转移到项目的 ML 代理部分。为此,如果您还没有安装 ML-agents 插件,您需要安装它。详情请参考 ML-Agents 安装说明

为了让代理进行自我培训,我们需要执行以下操作:

  1. 观察代理的状态(位置、方向等)。)
  2. 根据状态决定行动。
  3. 评估该行动的结果。

为此,我们创建了一个名为CarAgent.cs的新类,它扩展了Car.cs并赋予我们从环境中学习的能力。这个类需要从一个Agent而不是MonoBehaviour继承,以便连接到底层的 ML-Agents 机器。

通晓人情世故

首先我们将比较代理的方向和轨迹的方向。为此,我们将在一个全局变量_track中存储当前的轨迹。我们使用以下函数获得当前音轨:

private Transform GetTrackTile()
{
    var carCenter = transform.position + Vector3.up;Physics.Raycast(carCenter, Vector3.down, out var hit, 2f);
    return hit.transform;
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

带符号的角度是沿着当前图块的黄色箭头和定义汽车前进方向的蓝色箭头之间的向上(Y 轴)方向获得的。

然后我们可以比较瓷砖和汽车方向的差异,如上图所示。这给了我们最初的观察——从逻辑上来说,赛车会尽量减小这个角度,以便跟随赛道。我们还使用一个带符号的角度(在-180 度和 180 度之间)来告诉汽车是向左还是向右转向。

public override void CollectObservations(VectorSensor vectorSensor)
{
    _track = GetTrackTile();
    float angle = Vector3
         .SignedAngle(track.forward, transform.forward, Vector3.up);
    vectorSensor.AddObservation(angle / 180f); // Map to (-1,1)
}

注意,该方法扩展了Agent 类的CollectObservations()方法,确保观察结果得到正确解释。

其次,我们需要判断汽车离障碍物的距离。在真正的自动驾驶应用中,经常使用的技术是激光雷达——一种利用光线反弹测量距离的方法。这里我们用光线投射来观察周围固体物体的距离。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些射线被可视化为黄线。可以看到施法距离限制在 5m 以内。

为了投射光线,我们使用下面的辅助函数,它获取相对于汽车的位置和角度,并检查碰撞。如果有,我们将信息存储为[0,1]之间的正值,如果没有,我们返回-1

// Casts a ray from a point in a direction based on the car position
// z: offset of the ray origin from the car centre on the z axis
// x: as above but on the x
// angle: direction of the ray from its origin
private float ObserveRay(float z, float x, float angle)
{
    var tf = transform;

    // Get the start position of the ray
    var raySource = tf.position + Vector3.up / 2f; 
    const float **RAY_DIST** = 5f;
    var position = raySource + tf.forward * z + tf.right * x;

    // Get the angle of the ray
    var eulerAngle = Quaternion.Euler(0, angle, 0f);
    var dir = eulerAngle * tf.forward;

    // See if there is a hit in the given direction
    Physics.Raycast(position, dir, out var hit, **RAY_DIST**);
    return hit.distance >= 0 ? hit.distance / **RAY_DIST** : -1f;
}

要投射所有四条光线,我们只需向AddObservation()方法添加以下调用。

vectorSensor.AddObservation(ObserveRay(1.5f, .5f, 25f)); // FrontR
vectorSensor.AddObservation(ObserveRay(1.5f, 0f, 0f)); // Front
vectorSensor.AddObservation(ObserveRay(1.5f, -.5f, -25f)); // FrontL
vectorSensor.AddObservation(ObserveRay(-1.5f, 0, 180f)); // Back

艾掌握方向盘

这也是定义代理人大脑的时候。我们从BehaviourParameters开始,这将允许我们在培训前测试我们的代理:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们使用 a5 观察和 2 个连续动作。这些动作分别映射到水平轴和垂直轴,与我们在非自主汽车上测试的输入相匹配。

现在我们只缺少一个DescisionRequester——一个控制人工智能应该多久做一次决定的脚本:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将决策周期设置为 1,即每一步都做出决策。

我们现在将输入动作到我们的学院。现在我们只把Update函数替换为AgentAction,它为代理定义了基本的事件循环。

public override void OnActionReceived(float[] vectorAction)
{      
    float horizontal = vectorAction[0];
    float vertical = vectorAction[1];
    float dt = Time.fixedDeltaTime;
    MoveCar(horizontal, vertical, dt);
}

注意,由于AgentAction发生在固定时间,我们必须改变单个移动动作之间的时间差。

现在,您可以用Car.cs替换CarAgent.cs并继续使用键盘驾驶。

奖励时间到了

最后,为了让代理能够自学,我们需要添加什么是好结果和坏结果的概念。我们特别要做到以下两点:

  1. 奖励沿着轨道前进。
  2. 处罚碰撞。

第一个更复杂,所以我们从它开始。这将在我们的OnActionReceived方法中完成。我们首先通过比较移动前后的位置来获得移动矢量。这让我们知道我们“沿着”轨道移动了多少。然后,这从范围(180,0)映射到(-1,1)-角度越大,奖励越低,角度> 90 是一个惩罚。请注意,这是一个与CollectObservation不同的地图。为了促进高速运动,我们将运动方向与垂直速度结合起来

var moveVec = transform.position - lastPos;
float angle = Vector3.Angle(_track.forward, moveVec);
float dirReward = 1f - (angle / 90f);
AddReward((dirReward + vertical) * dt);

注意,我们乘以时间步长(通常是 1/60 ),这样我们每秒最多得到 1 的回报。这与我们移动一个方块的速度相匹配——最多每秒 1 个,并确保奖金和奖励值以类似的方式贡献。当与前面的代码结合使用时,我们

public override void OnActionReceived(float[] vectorAction)
{
    var lastPos = transform.position;float horizontal = vectorAction[0];
    float vertical = vectorAction[1];
    float dt = Time.fixedDeltaTime;
    MoveCar(horizontal, vertical, dt);

    var moveVec = transform.position - lastPos;
    float angle = Vector3.Angle(_track.forward, moveVec);
    float dirReward = 1f - (angle / 90f);
    AddReward((dirReward + vertical) * dt);
}

其次,我们希望避免与墙壁碰撞——这是通过将奖励设置为-1f并结束当前训练集来惩罚的。

private void OnCollisionEnter(Collision other)
{
    if (other.gameObject.CompareTag("wall"))
    {
        SetReward(-1f);
        EndEpisode();
    }
}

最后润色

为了完成我们的代码,我们只需要添加代码进行重置。当汽车撞到墙时,我们希望将汽车重置到它的起始位置——结合负面奖励,这有助于训练避墙行为(如果汽车沿着墙卡住,我们可能会以许多小插曲结束)。这是在从代理继承的最后一个函数中完成的:

public override void OnEpisodeBegin()
{
    if (resetOnCollision)
    {
        transform.localPosition = Vector3.zero;
        transform.localRotation = Quaternion.identity;
    }
}

请注意,我们使用了resetOnCollision参数,这意味着冲突并不总是以重置结束——事实上,在玩游戏时,代理应该处理冲突,而不是重新开始。

驾校

我们终于拥有了运行培训流程的所有组件。

由于 Unity 支持多代理强化学习,所以最好一次使用多个代理。为此,我们将复制粘贴曲目。这些需要简单地在 x-z 平面上隔开,以便它们不重叠:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们把轨道和汽车放在一个父对象中来创建一个训练实例。然后,15 个实例在两个方向上彼此等距 100 米。

最后,我们需要为培训过程设置参数。我们保留当前的默认参数,只是增加了报告频率。为此,我们在项目文件夹中创建以下名为trainer_config.yaml的配置文件:

behaviors:
    CarDrive:
        trainer_type: ppo    
        summary_freq: 10000

现在一切都准备好了。如果你遵循了 ML-Agents 安装说明,你应该有 python 和 mlagents 包。打开命令行,导航到放置trainer_config.yaml 的位置,然后运行以下命令:

mlagents-learn trainer_config.yaml --train --run-id=CarDrive

您应该得到一个响应,描述 ml-agents 版本并要求您按下 play 按钮。切换到 Unity,按 play,训练应该开始了。该过程需要几分钟时间,具体取决于您的 CPU(或 GPU,如果您安装了 TensorFlow 的 GPU 版本)。

你的训练现在完成了

强化学习——梯度时间差分学习算法介绍

原文:https://towardsdatascience.com/reinforcement-learning-an-introduction-to-gradient-temporal-difference-learning-algorithms-4a72ce5ab31e?source=collection_archive---------17-----------------------

对政策评估中一些最新算法的全面介绍,包括 GTD 和 GTD2。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Rafif Prawira 在 Unsplash 上拍摄的照片

目录:

  • 介绍
  • 线性函数逼近
  • 推导 GTD2 算法
  • 结论
  • 鸣谢和资源

介绍

强化学习是目前最热门的领域之一,具体的应用正在以令人难以置信的速度增长,从击败视频游戏到机器人。从本质上来说,强化学习(RL) 处理的是决策——也就是说,它试图回答一个主体在给定环境中应该如何行动的问题。

强化学习处理决策

不严格地说,所有的 RL 都归结为发现或评估一个策略,这只是一种行为方式。例如,策略可以是下棋的策略。

策略接受一个状态(在国际象棋的例子中,是棋盘上所有棋子的位置)并为其分配一个动作。

例如,给定你的棋盘的状态,你的策略可能要求你向前移动你的皇后。当你退出一个状态,你会得到一些奖励。这个很直观。例如,如果我们用快乐/痛苦来衡量我们作为人类的回报,那么把我们的手放在沸水中(退出之前手很冷的状态)会产生一些痛苦(因此,会有回报)。

在本文中,我们将关注一个叫做策略评估的东西,它可以归结为评估策略。这是什么意思?给定一个策略,我们希望找到其关联的值函数。这意味着如果我们遵循一些给定的策略,就能够给每个状态赋值。但是我们所说的是什么意思呢?如果我们处于某种状态,那种状态的值就是我们从这种状态中得到的预期回报。

TD 不一定在非政策环境下收敛

由 Richard Sutton 在 20 世纪 80 年代提出的 TD 学习的变体是一些最健壮和最常用的策略评估算法,尤其是在 on-policy 设置中,即当您遵循您正在评估的策略时。然而,在非策略设置中——当遵循不同于您正在评估的策略时——TD 学习算法的收敛性在某些情况下无法保证(例如,当使用线性近似时,我们将在下一节中讨论)。这使得萨顿等人在 2009 年引入了 GTD 和 GTD 2(GTD 的改进版本),以保证在非政策设置下的收敛性[1] [2]。

线性函数逼近

当你第一次开始学习 RL 时,你可能会开始学习马尔可夫链、马尔可夫奖励过程(MRP),最后是马尔可夫决策过程(MDP) 。然后,您通常会转到典型的策略评估算法,如蒙特卡罗(MC)和时间差异(TD)学习,然后是控制算法,如 SARSA 和 Q-learning。

对于大多数 RL 应用程序来说,表查找并不实用

在所有这些情况下,您可能一直在使用状态值和动作值函数的表格表示。这意味着您直接更新了每个状态的值。实际上,这对于具有大量状态的 MDP 或者在我们使用连续状态空间的情况下是非常不切实际的。例如,如果你试图在三维空间中引导一架直升机,你的状态可能是它的当前位置、速度、角速度、加速度等。正如您所猜测的,状态的数量是无限的,这意味着没有办法在一个表中存储所有的东西。

这个问题的解决方法是什么?我们将使用一个函数(由某个权重向量 θ 参数化)来逼近真实值函数,而不是直接更新每个状态。这个函数可以是任何东西(例如,您可以使用神经网络),但我们将重点关注线性函数逼近。数学上,我们在寻找一个函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 ϕ(s) 是包含给定状态信息(例如:速度、加速度等)的特征向量。)和 θ 是我们正在努力学习的权重向量。在某些状态下,价值函数的估计就是ϕ(sθ 之间的点积。上式中, **γ ∈ (0,1)**称为折现率;直觉上,这意味着我们更重视获得短期回报,而不是长期回报——这与我们人类的工作方式是一致的,除了数学上的便利。

我们的目标是找到权重向量 θ ,这将允许我们的价值函数逼近尽可能精确。

如果我们用s’表示下一个状态,我们可以用贝尔曼方程写出 TD 误差如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们记得,我们将在后面使用的贝尔曼算子被定义为 **TV = R + γ PV,**其中 P 是转移矩阵。任何给定值函数 V 必须满足贝尔曼方程,即 V = TV 。利用 TD 误差,我们可以获得传统的 TD 更新:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于某些学习率 α(k) 。如果这对你来说是新的,这可能看起来很复杂,但这并不新奇!的确,这只是一个简单的随机梯度下降!在线性近似器的情况下,我们注意到梯度减少到 ϕ(k) ,这使得一切都变得美好而简单。

目标函数

现在我们有了一个价值函数逼近器,问题就变成了:我们如何让这个逼近器尽可能好?为此,我们首先需要定义某种误差函数。

一个目标函数只是一个 θ 的函数,我们将努力使其相对于 θ 最小化。

在做 TD 学习的时候,最自然的测量误差的方式就是通过测量 V(θ) 符合贝尔曼方程的程度。这被称为均方贝尔曼误差(MSBE) ,其定义为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 D 是一个对角矩阵,包含衡量每种状态出现频率的权重

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于某些矢量 v

对于任何 θ ,TV(θ)通常不能表示为 V(θ)

这个目标函数在许多先前的研究中被使用,但是大多数 TD 算法不收敛到 MSBE 的最小值。这是由于贝尔曼算子遵循马尔可夫链的基本状态动力学,这意味着对于任何 θ ,通常不能用 V(θ) 来表示 TV(θ) (例如,如果我们考虑线性函数逼近器,我们不能精确地表示非线性函数是有意义的)。然后,通常所做的是将最优解投影到最近的可表示值函数,其中运算符π定义为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们考虑一个线性架构,其中对于某个矩阵φ,其行是 ϕ(s) ,我们可以独立于 θπ写成

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

到目前为止,所有的 TD 算法都收敛到值θ(TD 固定点),使得

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GTD2 的推导使用了不同的目标函数,即均方投影贝尔曼误差(MSPBE) ,它考虑了投影π

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MSBE 和 MSPE 之间有一种非常简洁的几何关系,我们可以在下图中看到(摘自萨顿关于 GTD2 的原始论文):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两个贝尔曼误差目标函数之间的几何关系[1]

有趣的是,对于 GTD 来说,使用的目标函数是预期 TD 更新(NEU)的标准,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们很快就会看到,这两个方程确实非常相似。

推导 GTD2 算法

我们现在将推导 GDT2 算法,这是由 Sutton 等人在 2009 年引入的算法,它在偏离策略的情况下收敛。我们首先承认下列重要的关系,这将有助于以后简化某些方程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,我们可以根据期望将 MSPBE 写成

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们应该在这里看到一些有趣的东西!

我们看到,MSPBE 与 NEU 的不同之处仅在于包含了特征协方差矩阵的逆。

为了避免需要两个独立的样本,我们可以使用一个可修改的参数 w ∈ Rⁿ 来形成目标函数梯度中除了一个期望之外的所有期望的准平稳估计

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

利用这一点,我们得到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其可以被直接采样。由此,我们得到 GTD2 算法:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GTD2 算法的θ更新

现在,我们想为 w 找到一个迭代更新。首先,我们意识到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们看到上面的右边是下面最小二乘问题的解决方案:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这可以通过具有以下更新的随机梯度下降来解决:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

w 为 GTD2 算法更新

θw 更新一起组成了 GTD2 算法,可以很容易地用你喜欢的编程语言实现。注意,为了让算法收敛,我们需要

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

谢谢你走了这么远!我希望您现在对策略评估有了更好的理解,更具体地说,对强化学习中的一些新算法有了更好的理解,比如梯度时间差异学习。此外,我希望你对算法背后的数学有所了解,并对它们是如何推导出来的有更多的直觉。

鸣谢和资源

这篇文章主要依赖于 Sutton 等人在 2009 年发表的 GTD2 论文,以及最初的 GTD 论文。艾尔。

[1] Sutton,R. S .,Maei,H. R .,Precup,d .,Bhatnagar,s .,Silver,d .,Szepesvari,Cs .和 Wiewiora,E. (2009 年)。线性函数逼近的时差学习快速梯度下降法。在第 26 届机器学习国际会议记录中,第 993–1000 页。全媒体。

[2]萨顿、塞佩瓦里、Cs。,Maei,H. R. (2009 年)。线性函数逼近的非策略时差学习收敛 O(n)算法。神经信息处理系统进展 21 。麻省理工出版社。

基于强化学习的工厂能源优化

原文:https://towardsdatascience.com/reinforcement-learning-based-energy-optimization-dea8fb687cda?source=collection_archive---------10-----------------------

面向可持续未来的工厂暖通空调优化

摘要。 供暖、通风和空调(HVAC)单位负责维持建筑物内的温度和湿度设置。研究表明,暖通空调占建筑能耗的近 50%,占全球用电量的 10%。因此,暖通空调优化有可能为我们的可持续发展目标做出重大贡献,减少能耗和二氧化碳排放。在这项工作中,我们探索优化工厂 HVAC 控制的方法。不幸的是,这是一个复杂的问题,因为它需要考虑多个可变因素来计算最佳状态,例如,占用、制造进度、运行机器的温度要求、建筑物内的气流动态、外部天气条件、节能等。我们提出了一种基于强化学习(RL)的能源优化模型,该模型已在我们的工厂中得到应用。我们表明 RL 是一个很好的选择,因为它能够实时学习和适应多参数系统动力学。它比以前使用的比例-积分-微分(PID)控制器节能约 25%。

这篇论文的发表版本如下,发表在 2020 年 6 月第 11 届美国计算机学会电子能源会议论文集(PPT)https://dl.acm.org/doi/10.1145/3396851.3402363

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。可持续发展的能源优化(来自 PexelsPixabay 摄影)

1 导言

供暖、通风和空调(HVAC)装置负责维持建筑物内的温度和湿度设置。在这项工作中,我们特别考虑了它们在工厂中的使用,其中 HVAC 装置的主要目标是将温度和(相对)湿度保持在规定的制造公差范围内。这需要与节能和减少二氧化碳排放相平衡,以抵消运行它们对环境的影响。

因为它们不仅普遍存在于工厂,而且存在于家庭和办公楼中;任何有效的控制逻辑都有可能对环境影响做出重大贡献。不幸的是,考虑到 HVAC 单元的复杂性,设计有效的控制逻辑是一个困难的优化问题。

控制逻辑需要考虑多个可变因素,例如,占用、制造进度、运行机器的温度要求、建筑物内的气流动态、外部天气条件、节能等。;以便决定该区域的加热、冷却或湿度。

HVAC 优化文献可以大致分为两类:(I)了解优化参数之间的循环模式,以更好地调度 HVAC 功能,以及(ii)建立 HVAC 单元的模拟模型,并评估模型上的不同控制策略,以确定最有效的策略。

第一类的例子包括[1,2],其采用建筑热力学模型来预测建筑的温度演变。不幸的是,这并不真正适用于我们的工厂,那里的制造工作量每天都在变化,而且没有可以预测的时间表。另外值得一提的是,大多数此类模型每次只考虑一个优化参数,即控制加热/冷却来调节温度;而在我们的情况下,我们需要同时调节温度和(相对)湿度,以保持最佳的制造条件。

第二类基于模型的方法适用于 PID 和 RL 控制器。PID(比例积分微分)控制器[3]使用控制回路反馈机制来控制过程变量。不幸的是,基于 PID 的控制器需要相对于基础 HVAC 单元进行大量的校准,以便能够有效地控制它们。[4]概述了一种基于模拟工具组合的 PID 校准方法。

基于强化学习(RL) [5]的方法[6,7]最近被提出来解决这些问题,因为它们能够实时学习和优化多参数系统。基于 RL 的方法需要初始(离线)训练阶段,因为在实时设置(在线)中训练 RL 算法可能需要时间来收敛,从而在 RL 代理探索其状态空间时导致潜在的危险违反。[6,7]根据基于暖通空调装置模拟模型的 EnergyPlus,概述执行该离线培训的解决方案。EnergyPlus [8]是美国能源部的一款开源 HVAC 模拟器,可用于模拟能耗(供暖、制冷、通风、照明、插头和过程负载)和建筑用水。不幸的是,开发 HVAC 单元的精确的基于能量+的仿真模型是一个重要的、耗时且昂贵的过程;因此是他们在离线训练中使用的一个障碍。

在这项工作中,我们提出了一个有效的基于 RL 的 HVAC 优化算法,它能够在几周内学习并适应一个实时 HVAC 系统。该算法可以独立部署,或作为“训练模块”来生成可用于执行 RL 模型离线训练的数据,以进一步优化 HVAC 控制逻辑。这使得所开发的 RL 模型的部署快速且具有成本效益。

此外,[6,7]中的模型输出是最佳温度和湿度设定值,这些设定值依赖于 HVAC 控制逻辑,以确保以有效的方式达到规定的设定值。在这项工作中,我们提出了一个更细粒度的 RL 模型,其输出是加热、冷却、再加热和加湿器单元的实际阀门打开百分比。这实现了一种更加自给自足的方法,RL 输出绕过任何内置的 HVAC 控制逻辑(消除任何依赖性并使其冗余),从而实现更加独立于供应商(平台)的解决方案。

文章的其余部分组织如下:第 2 节介绍了基础知识,提供了暖通空调优化问题的 RL 公式。第 3 节概述了 RL 逻辑,其最初被部署来生成用于离线训练的训练数据,从而导致第 4 节中的(训练的)RL 模型实时提供推荐的阀门打开百分比。在第 5 节中,我们提供了已开发的 RL 模型的一些基准测试结果,该模型已部署在我们的一个工厂区域中。初步研究表明,我们能够在现有 PID 控制器逻辑的基础上实现 25 %的能效。第 5 节对论文进行了总结,并为未来的工作提供了方向。

2 问题场景

2.1 暖通空调

图 2 显示了 HVAC 装置的能量平衡。简而言之,HVAC 装置必须使再循环空气和新鲜空气的混合达到将区域温度和(相对)湿度保持在所需水平所需的温度和湿度。通过计算流出空气和流入空气的能量之差,很容易监控所需的理论能量,将该量与机组所需的能量进行比较,即可得出 HVAC 机组的能效。

能量流可以根据介质(空气、热水、冷水、蒸汽)的流量以及介质供应和回流之间的温差来确定。和消耗的电能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。暖通空调控制(图片由作者提供)

2.2 强化学习

RL 指的是人工智能(AI)的一个分支,它能够通过实时最大化一个奖励函数来实现复杂的目标。奖励功能的工作原理类似于用糖果和打屁股来激励孩子,这样算法在做出错误决定时会受到惩罚,在做出正确决定时会受到奖励——这就是强化。有关 RL 框架的详细介绍,感兴趣的读者可以参考[5]。

2.3 RL 公式

我们现在将场景映射到我们的 HVAC 设置。在任何时间点,工厂区域都处于以区域内外观察到的温度和(相对)湿度值为特征的状态。

在这种情况下,游戏规则对应于温度和湿度的容许水平,其基本要求区域温度和湿度值应分别在:19–25度和45–55%的范围内。在这种情况下,可用的动作集是冷却、加热、再加热和加湿器阀门打开百分比(%)。

总的来说,根据(内部和外部)温度和湿度值给定区域状态,RL 模型需要决定将冷却、加热、再加热和加湿器阀门打开多少。为了在这种情况下做出明智的决定,RL 模型需要首先了解 HVAC 系统的行为,例如通过将冷却阀打开到 X %,可以预期区域温度下降多少?

一旦 RL 模型理解了 HVAC 系统的行为,最后一步是设计控制策略,或 RL 术语中的“策略”。例如,RL 模型现在必须选择是否在区域温度达到 23 度时将冷却阀打开至 25%,或者等到区域温度达到 24 度时再将冷却阀打开至 40 %。注意,在打开阀门之前等待的时间越长,对降低能耗有积极的作用;然而,由于外部天气条件总是不可预测的,这就有违反温度/湿度耐受水平的风险。因此,如果等待时间更长,它可能实际上不得不将冷却阀打开到更高的百分比,从而消耗更多的能量。上述概率由 RL 术语中的奖励函数(等式 1)量化,该函数基于以下三个参数为每个可能的行为分配奖励:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

控制策略是决定三个参数的权重:设定点接近度(SC)、能量成本(EC)、公差违反(TV)。能源成本体现在电力消耗和二氧化碳排放方面。例如,“安全”控制策略会为违反容差的行为分配非常高的负权重(惩罚),确保它们永远不会发生,尽管会付出更高的能源成本。同样,“能源优化政策”会将节能置于其他两个参数之上。设定值接近度鼓励“商业友好”政策,RL 模型试图将区域温度保持在尽可能接近温度/湿度设定值的水平,这无疑降低了违规风险,但能源成本较高。

我们选择“平衡”控制策略,最大化节能和设定值接近度,同时最小化违反公差的风险。

图 3 中示出了上述 RL 公式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3。暖通空调强化学习公式(图片由作者提供)

基于 3 RL 的暖通空调优化

我们概述了 RL 算法,该算法基于当前室内温度和湿度(在时间 t )以及先前的加热、冷却、加湿器、再加热阀打开百分比值、时间 t-1 的室内温度和湿度值,输出在时间 t 打开加热、冷却、加湿器和再加热阀的程度。

rl_hvac 功能运行,每隔 1 分钟实时计算新的阀门开度值。

**#input values:**
i_tl #Indoor Temp (previous, at time t-1)
i_hl #Indoor Humidity (previous)
i_t  #Indoor Temp (current, at time t)
i_h  #Indoor Humidity (current)
y_hl #Heating Valve Opening (previous, at time t-1)
y_ul #Humidifier Valve Opening (previous)
y_rl #Re-heating Valve Opening (previous)
y_cl #Cooling Valve Opening (previous)**#output values:** y_h  #Heating Valve Opening (current, at time t)
y_u  #Humidifier Valve Opening (current)
y_r  #Re-heating Valve Opening (current)
y_c  #Cooling Valve Opening (current)**#static variables:** hiW  #Heating step increment
uiW  #Humidifier step increment
riW  #Re-heating step increment
ciW  #Cooling step increment*#invoked every 1 min* ***rl_hvac*** *(i_tl, i_hl, i_t, i_h, y_hl, y_ul, y_rl, y_cl)***# Heat and Humidify**
if (i_t < 22.0) and (i_h < 50.0):    
    if (i_t < i_tl):
        inc = hiW + abs((i_t - i_tl) / 0.1)
        y_h += inc
    if (i_h < i_hl):
        inc = uiW + abs((i_h - i_hl) / 0.1)
        y_u += inc
    y_r = 0.0
    y_c = 0.0
**# Cool and Reheat**
if (i_t > 22.0) and (i_h > 50.0):
    if (i_t > i_tl):
        inc = ciW + abs((i_t - i_tl) / 0.1)
        y_c += inc
    if (i_h > i_hl):
        inc = riW + abs((i_h - i_hl) / 0.1)
        y_r += inc
    y_h = 0.0
    y_u = 0.0
**# Heat, Cool and Reheat**
if (i_t < 22.0) and (i_h > 50.0):
    if (i_t < i_tl):
        inc = hiW + abs((i_t - i_tl) / 0.1)
        y_h += inc
    if (i_h > i_hl):
        inc = ((ciW + riW) / 2.0) + abs((i_h - i_hl) / 0.1)
        y_c += inc
        y_r += inc
    y_u = 0.0
**# Cool and Humidify**
if (i_t > 22.0) and (i_h < 50.0):
    if (i_t > i_tl):
        inc = ciW + abs((i_t - i_tl) / 0.1)
        y_c += inc
    if (i_h < i_hl):
        inc = uiW + abs((i_h - i_hl) / 0.1)
        y_u += inc
    y_h = 0.0
    y_r = 0.0***return*** *(y_h, y_u, y_r, y_c)*

RL 逻辑可以解释如下:回想一下,我们希望保持的温度和(相对)湿度设定值是 22 度和 50 %;允许公差范围分别为 35 。在每次迭代( 1 分钟)时, rl-hvac 功能根据以下控制逻辑确定打开哪个阀门:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

知道打开哪个(些)阀,每个阀打开多少取决于奖励值,该奖励值作为先前(输出)阀打开的“有效性”的度量来计算。例如,假设室内温度目前为 20.5 度(低于温度设定值),这意味着需要打开供暖阀。在前一次迭代期间,室内温度也低于设定值,比如说 21.0 度,导致 rl_hvac 功能建议在比如说 15 %时打开加热阀。考虑到当前的室内温度甚至更低( 20.5 度),我们推断先前的加热阀打开不够有效——赋予其负奖励——并且加热更多,其量与当前和先前的室内温度之间的差成比例。其他阀门的行为可以类似地解释。这是一种强化,确保阀门能够有效地平衡奖励函数(等式 1)的“设定点接近度”和“能量成本”参数。

奖励函数的剩余参数是“公差违反”,其中如果室内温度/湿度违反了允许的公差范围,则需要施加惩罚。在我们的情况下,违规意味着相应的阀门需要更快地反应。这由步进增量常数调节: hiW,ciW,uiW,riW 。我们以离线方式调整它们,以便在给定时间段内,如果公差违反的数量超过某个阈值,则调整它们的值。

**# Check tolerance violations and adapt respective increment values**
if (count (i_t > 25.0) > n):    
    ciW += 1.0
if (count (i_t < 20.0) > n):    
    hiW += 1.0
if (count (i_h > 55.0) > n):    
    riW += 1.0
if (count (i_h < 45.0) > n):    
    uiW += 1.0

4 连续 RL 优化

在本节中,我们扩展了 RL 模型,以适应“长期回报”,用 RL 术语中的 Q 值来量化。(回想一下,上一节中概述的 RL 算法中的奖励函数是随机的,在某种意义上,它仅取决于最后的状态。)状态-动作对 (s,a) 的 Q 值被定义为从当前状态 s 开始的所有未来步骤的期望回报值的加权和,假设在状态 s 采取动作 a

为了适应“长期回报”,我们将原来的问题扩展到一个连续的空间设置。该设置中的每个事件对应于室内温度和(或)湿度开始偏离其各自设定值的时间,以及室内条件返回其各自设定值的时间——这是打开相关阀门的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4。阀门倾点计算(图片由作者提供)

现在让我们来关注一个这样的插曲(在一个连续的空间设置中)。假设随机 RL 算法(第 3 节)总是在 0.0% 开始打开阀门,温度和(或)湿度与设定值的偏差持续增加,直到阀门打开百分比达到临界点,之后偏差再次开始减小,直到变为 0 。这种阶段性行为如图 4 所示。为了简单起见,我们只显示了温度——冷却曲线,但是对于其他情况,包括那些涉及湿度的情况,可以预期类似的行为。图 4 中的能量成本对应于阴影区域。鉴于这种行为,很容易看出,如果我们事先知道冷却临界点是 22.3 度,我们可以更早地将冷却阀打开到临界点——导致更低的能量成本(由虚线阴影区域描绘)。这里需要注意的是,需要正确估计所有阀门的临界点,否则打开阀门超过临界点的百分比实际上可能会导致更高的能源成本。

接下来,我们将展示如何将第 3 节中 RL 算法生成的数据用作训练数据,以开发一个模型来预测工厂区域每个状态的阀门“临界点”。

对于每个时间点 t ,(第 3 部分)RL 算法数据可被认为由以下输入和值组成:(室内温度、室内湿度、加热阀开度%、冷却阀开度%、加湿器阀开度%、再加热阀开度%)。我们对该数据应用以下过滤标准(仅针对湿度)来提取训练数据:

**# Extraction filter (for humidity) — to extract the training data** # loop through rows of the generated data
for i in range(1, dataset.shape[0]):
   cRow = dataset.iloc[i] #current row
   pRow = dataset.iloc[i-1] #previous row

   if cRow['Indoor Humidity'] > 50.0 and cRow['Indoor Humidity'] < pRow['Indoor Humidity']:
       ctr = ctr + 1
       #write row to training data

   if cRow['Indoor Humidity'] < 50.0 and cRow['Indoor Humidity'] > pRow['Indoor Humidity']:
       ctr = ctr + 1
       #write row to training data

通过这一更新(粗体),RL 算法能够引导阀门开启百分比,因此每次事件将以训练模型提供的相应“临界点”值开始(而不是从 0.0% 开始),从而降低能源成本,如图 4 所示。

**# Heat and Humidify**
if (i_t < 22.0) and (i_h < 50.0):
    if (y_h == 0.0):
        y_h = **loaded_h_model.predict(Xnew)**
    elif (i_t < i_tl):
        inc = hiW + abs((i_t - i_tl) / 0.1)
        y_h += inc
    if (y_u == 0.0):
        y_u = **loaded_u_model.predict(Xnew)**
    elif (i_h < i_hl):
        inc = uiW + abs((i_h - i_hl) / 0.1)
        y_u += inc
    y_r = 0.0
    y_c = 0.0

5 基准测试 RL 与 PID

提出的 RL 模型已经部署在我们罗马尼亚工厂的一个区域中。指定区域有五个(类似的)HVAC 单元,其中 HVAC 单元的示意图如下图 5 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5。暖通空调示意图(图片由作者提供)

对于该区域,我们首先给出(图 6)一周内运行带 PID 控制器的 HVAC 的室内条件和 HVAC 阀门开启百分比(约 10,000 个读数,相当于每分钟一个读数)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6。基于 PID 的 HVAC 控制读数(图片由作者提供)

对于同一个区域,我们随后运行了由 RL 模型控制的 HVAC 单元的基准测试。我们确保两种情况下的制造工作负载相似。我们首先运行第 3 节中概述的 RL 算法一周。接下来,应用第 4 节中概述的过滤器来生成训练数据。然后使用 AWS Sagemaker Autopilot [9]训练四个模型: h_model、u_model、r_model、c _ model,以产生基于 XGBoost 的回归模型,其验证误差(来自超参数调整的 MSE)约为 25.0 。训练好模型后,我们又运行了一周第 4 节中介绍的 RL 算法(同样,使用类似的生产工作负载)。结果显示在图 7 中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7。基于 RL 的 HVAC 控制读数(图片由作者提供)

比较平均阀门开启百分比(由图 6 和图 7 中的红色边界框突出显示),我们可以看到所有基于 RL 的阀门开启百分比较低;从加热阀的 10 %节约到再加热阀的几乎 45 %节约—平均节约 25 %。

6 结论

在这项工作中,我们考虑了工厂中的暖通空调能源优化问题,这有可能在节能和减少二氧化碳排放方面产生重大的环境影响。为了解决问题的复杂性,我们概述了一种基于 RL 的 HVAC 控制器,它能够学习并适应现实生活中的工厂设置,而无需任何离线培训。据我们所知,这是在实际工厂中报告 RL-HVAC 模型现场部署的首批作品之一。我们提供的基准测试结果显示,在能效方面有可能节省高达 25 %。

请注意,我们认为节能与阀门开启百分比成正比(越低越好)。实际上,不同阀门的能量消耗和 CO2 排放可能不成比例,即根据基本机制,打开相同百分比的加热和冷却阀门可能消耗不同数量的能量。我们将此作为将来的工作来调整 RL 逻辑,以适应能耗和 CO2 排放方面。

参考

[1] F. Oldewurtel 等人使用随机模型预测控制和天气预测进行节能建筑气候控制。事故赔偿委员会,2010 年。

[2] Y. Ma 等建筑制冷系统运行的模型预测控制。IEEE 控制系统技术汇刊,20(3):796–803,2012。

[3] F .皮科克。PID 算法的白痴指南。https://www.pidcontrol.net/index.html

[4] C .布拉斯科等人根据能效和舒适度标准对暖通空调系统进行建模和 PID 控制。In:能源和建筑的可持续性。智能创新,系统和技术,第 12 卷(2012)。

[5] Harmon,m . e . Harmon,S.S.: 强化学习:教程http://www . cs . Toronto . edu/~ zemel/documents/411/rl tutorial . pdf

[6] T. Weiand 等人…"建筑暖通空调控制的深度强化学习 l "第 54 届年度设计自动化会议论文集,第 22 页,2017。

[7] T. Moriyama 等人用于功耗优化的强化学习试验台。《第 18 届亚洲模拟会议(AsiaSim)论文集》,第 45–59 页,2018 年。

[8] EnergyPlus,https://energyplus.net

[9]亚马逊 SageMaker 自动驾驶,https://aws.amazon.com/sagemaker/autopilot/

基于强化学习的推荐系统

原文:https://towardsdatascience.com/reinforcement-learning-based-recommender-systems-492a2674fcc?source=collection_archive---------25-----------------------

理解大数据

结合强化学习和 NLP/聊天机器人开发个性化应用

摘要。 我们提出了一种基于强化学习的方法来实现推荐系统。这些结果是基于一个现实生活中的健康应用程序,该应用程序能够以互动的方式向用户提供个性化的健康/活动相关内容。不幸的是,当前的推荐系统无法适应不断发展的特征,例如用户情绪,以及需要基于多个不可靠的反馈通道(例如传感器、可穿戴设备)来计算 RL 奖励的场景。为了克服这一点,我们提出了三个构造:(I)加权反馈通道,(ii)延迟奖励,和(iii)奖励提升,我们认为这对于 RL 用于推荐系统是必不可少的。

这篇论文发表在 AAI4H —医疗保健人工智能进展研讨会的会议录上,与第 24 届欧洲人工智能会议( ECAI 2020),2020 年 9 月 ( 论文 pdf)(PPT)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于强化学习的推荐系统:基于来自 PexelsAndrea Piacquadio 的 pic

1 导言

健康/保健应用程序的采用率一直很低。通过向用户提供越来越相关和及时的建议,个性化推荐有可能提高采用率。虽然推荐引擎(以及基于它们的应用程序)已经成熟,但它们仍然受到“冷启动”问题的困扰,事实上它基本上是一种基于推送的机制,缺乏使这种应用程序吸引千禧一代所需的交互性。

我们展示了一个健康应用案例研究,其中我们应用了强化学习(RL)和自然语言处理(NLP) /聊天机器人的组合,以向用户提供高度个性化的交互式体验。我们专注于应用程序的交互方面,应用程序能够实时描述用户并与用户交谈,提供适应用户当前情绪和过去偏好的相关内容。

这种聊天机器人的核心是一个意图识别自然语言理解(NLU)引擎,它通过问题变体的硬编码示例进行训练。当没有符合 30%以上置信度的意图时,聊天机器人会返回一个后备答案。基于(显式的)用户响应和(隐式的)环境方面来计算用户情绪,例如位置(住宅、办公室、市场……)、温度、照明、一天中的时间、天气、附近的其他家庭成员等等;来进一步适应聊天机器人的反应。

RL 指的是人工智能(AI)的一个分支,它能够通过实时最大化一个奖励函数来实现复杂的目标。奖励功能的工作原理类似于用糖果和打屁股来激励孩子,这样算法在做出错误决定时会受到惩罚,在做出正确决定时会受到奖励——这就是强化。强化方面还允许它更快地适应用户情绪的实时变化。有关 RL 框架的详细介绍,感兴趣的读者可以参考[1]。

以前的工作已经在推荐系统的背景下探索了 RL[2,3,4,5],并且随着云 API(例如 Azure Personalizer [6,7])和 Google 的 RecSim [8]的最近可用性,企业采用也似乎正在获得动力。然而,它们仍然像典型的推荐系统一样工作。给定用户简档和分类推荐,系统基于流行度、兴趣、人口统计、频率和其他特征来做出推荐。这些系统的主要新颖之处在于,它们能够识别推荐的特征(或特征的组合),从而为特定用户获得更高的回报;然后可以为该用户定制以提供更好的推荐[9]。

不幸的是,这对于现实生活中的系统来说仍然是低效的,这些系统需要适应不断发展的功能,例如用户情绪,并且需要根据多个不可靠的反馈渠道(例如传感器、可穿戴设备)来计算奖励。

本文的其余部分组织如下:第 2 节概述了问题场景,并将其表述为 RL 问题。在第 3 节中,我们建议

需要三种 RL 结构来克服上述限制:(I)加权反馈通道,(ii)延迟奖励,以及(iii)奖励提升,我们认为这是 RL 用于推荐系统的基本结构。

在这种情况下,“延迟回报”不同于延迟 RL [10]的概念,在延迟 RL 中,遥远未来的回报被认为不如即时回报有价值。这与我们的“延迟奖励”概念有很大不同,在延迟奖励中,只有在后续行动验证了奖励的一致性后,才会应用奖励。第四部分总结了本文,并提出了未来研究的方向。

2 问题场景

2.1 健康应用

该应用程序支持基于推送的通知,其中个性化的健康,健身,活动等。向用户推送相关推荐;以及应用程序响应用户查询的交互式聊天。我们假设存在一个知识库 KB 的文章、图片和视频,根据它们与不同用户简档/情感的相关性对工件进行排序。

图 1 中描述了健康应用架构,其示出了用户和环境条件(包括用户反馈)如何:

1.使用可用传感器收集以计算“当前”反馈,包括环境背景(例如,用户的网络摄像头 pic 可用于推断用户对聊天机器人响应/通知的情绪、房间照明条件和附近存在的其他用户),

2.其然后与用户对话历史相结合,以量化用户情感曲线,并排除由于不相关因素引起的情感的任何突然变化;

3.导致与提供给用户的最后聊天机器人响应/应用通知相对应的合计奖励值。

然后,该奖励值作为反馈提供给 RL 代理,以从知识库中选择下一个最佳聊天机器人响应/应用程序通知。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。健康应用架构(图片由作者提供)

2.2 互动聊天— RL 公式

我们将上述场景的 RL 引擎公式化如下:

动作 ( a ):在这种情况下,动作 a 对应于一篇知识库文章,该文章作为推送通知或者作为对用户查询的响应或者作为正在进行的对话的一部分被传递给用户。

Agent ( A ):是执行动作的一方。在这种情况下,代理是向用户交付操作的应用程序,其中操作是基于其策略选择的(如下所述)。

环境:指智能体与之交互的世界,它响应智能体的动作。在我们的例子中,环境对应于与应用程序交互的用户。 UA 的行为做出反应,提供不同类型的反馈,既有显性的(以聊天反应的形式),也有隐性的(如面部表情的变化)。

策略 (𝜋):是代理用来选择下一个基于动作的策略。给定一个用户简档 Up 、【当前】情绪 Us ,并查询Uq;策略功能计算分别由 NLP 和推荐引擎返回的文章分数的乘积,选择具有最高分数的文章作为下一个最佳动作:(a)NLP 引擎( NE )解析查询,并基于文章与用户查询的“文本相似性”输出每个知识库文章的分数。(b)类似地,推荐引擎( RE )基于与每篇文章相关联的奖励,针对用户简档和情感,为每篇文章提供分数。策略函数可以形式化为如下形式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

奖励 ( r ):是指我们用来衡量代理推荐行为的成败的反馈。反馈可以例如指用户阅读推荐文章所花费的时间量。我们考虑两步奖励函数计算,其中接收到的关于推荐动作的反馈 fa 首先被映射到情感分数,然后情感分数被映射到奖励。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 rs 分别指奖励和情感函数。图 2 中示出了上述 RL 公式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。RL 公式(图片由作者提供)

3 RL 奖励和政策扩展

3.1 加权(多个)反馈通道

如图 1 所示,我们考虑一个多反馈渠道,从用户(边缘)设备/传感器捕获反馈,例如网络摄像头、恒温器、智能手表,或者嵌入在托管应用的移动设备中的摄像头、麦克风、加速度计。例如,捕捉用户面部表情的网络摄像头帧、用户智能手表提供的心率,可以与用户提供的文本响应“谢谢你的好建议”一起考虑;在计算用户对推荐动作的情绪时。

{fa1,fa2,… fan} 表示行动 a 收到的反馈。回想一下 s(f) 表示基于各自的感官反馈 f 独立计算的用户情绪。用户情感计算可以被认为是输出在1–10之间的值的分类器。然后,可以将奖励计算为情感分数的加权平均值,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中权重 {wa1,wa2,… wan} 允许系统协调接收到的反馈,因为一些反馈信道可能遭受低可靠性问题。例如,如果 fi 对应于用户键入的响应, fj 对应于网络摄像头快照;则给予 fi 更高的权重。这里的理由是,用户可能在快照中“微笑”,然而“微笑”是由于他的孩子进入房间(也在帧中被捕捉),而不一定是对所接收的推荐/动作的响应。同时,如果基于用户文本响应计算的情感指示他“有压力”,那么在这种情况下,我们给予用户明确(文本响应)反馈更高的权重。

3.2 延迟奖励

在奖励不一致的情况下应用“延迟奖励”策略,其中(当前)计算的奖励对于已知用户积极响应的行为(对于历史上相同类型的行为)是“负面的”;反之亦然。给定这种不一致,延迟奖励策略缓冲在时间 t 的行动的计算的奖励比率;并且向 R1 代理策略(𝜋)提供指示,以在更新时间 t 和 t+1 的行为奖励之前尝试相同类型的另一个推荐,从而验证用户情绪。

为了适应“延迟奖励”策略,奖励功能扩展了一个内存缓冲区,允许从时间( t+m)到 t 的最后 m 个动作的奖励被聚集并在时间( t+m )追溯应用。延迟奖励功能 dr 表示如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中,|𝑡+𝑚暗示对行动的报酬从时间( t+m)到 t 行动,尽管是单独计算的;只能在时间( t+m )应用。如前所述,各自的权重允许我们协调不一致的反馈的影响,其中对𝑎t 时间𝑡𝑖的行为的奖励是基于在时间(𝑡+1)𝑖.

为了有效地执行“延迟奖励”策略,策略𝜋也被扩展为推荐与先前推荐的动作相同类型的动作;如果延迟标志 d 置位(d = 1);则“延迟”策略𝜋𝑑𝑡表示如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3 示出了用延迟奖励/策略扩展的 RL 公式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3。延迟奖励——基于政策的 RL 公式(图片由作者提供)

3.3 奖励提升

奖励增加,或者说奖励正常化,主要适用于持续的聊天互动。在这种情况下,如果用户对推荐动作的情绪是“负面的”;这可能不仅仅是上一个动作的错。可能对话情绪已经在下降,最后推荐的操作只是跟随下降趋势。另一方面,在对话情绪恶化的情况下,对推荐行为的“积极”情绪意味着它对用户产生了非常积极的影响;因此相应的回报应该增加。

对于在时间 t 的处的动作的提升的奖励𝑟𝑏𝑎𝑡计算如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们把它作为将来的工作来扩展‘boost’函数到最后的 n 动作(而不仅仅是上面的最后一个动作)。在这个扩展场景中,系统维护最后 n 个动作的情绪曲线,并且相对于曲线而不是离散值来计算偏差。这里预期的好处是,它应该允许系统对用户情绪趋势做出更好的反应。

4 结论

在这项工作中,我们考虑在现实生活中的健康应用程序的背景下实现基于 RL 的推荐系统。RL 是解决此类问题的强大原语,因为它允许应用程序实时学习和适应用户偏好/情绪。然而,在案例研究中,我们意识到当前的 RL 框架缺乏应用于这种推荐系统所需的某些结构。为了克服这个限制,我们引入了三个 RL 构造,我们必须为我们的 Wellness 应用程序实现它们。建议的 RL 结构在本质上是基本的,因为它们影响奖励和政策功能之间的相互作用;我们希望将它们添加到现有的 RL 框架中会增加企业的采用。

参考

[1]巴尔托,a .,萨顿,R.S.: 强化学习:导论。麻省理工学院出版社,麻省剑桥,2018 年,http://incompleteideas.net/book/RLbook2018.pdf

[2]崔顺实,哈,h,黄,U…Kim,c .,Ha,j .,Yoon,S.: 使用双聚类技术的基于强化学习的推荐系统。arXiv:1801.05532,2018。

[3]刘,李,李,叶,陈,郭,张,杨:基于深度强化学习的推荐与显式用户-项目交互建模。arXiv:1810.12027,2018

[4] Taghipour,n .,Kardan,a .,Ghidary,S.S.: 基于使用的网络推荐:强化学习方法。摘自:美国计算机学会推荐系统会议,第 113-120 页(2007)。

[5] Ricciardelli,e .,Biswas,D.: 基于强化学习的自我改进聊天机器人。In:第四届强化学习与决策制定多学科会议(2019)。

[6] 微软 Azure Personalizer
https://Azure . Microsoft . com/en-us/services/cognitive-services/Personalizer/

[7]李,李,朱,w,兰福德,J.C .,沙皮雷,R.E.: 一种语境强盗式的个性化新闻文章推荐方法。摘自:第 19 届万维网国际会议,第 661–670 页(2010 年)。

[8] 谷歌 RecSim
https://ai . Google blog . com/2019/11/rec sim-configurable-simulation-platform . html,最后访问时间 2019/02/03。

[9]用于更好的推荐系统的强化学习。https://analyticsindiamag . com/reinforcement-learning-recommender-system-recsim-Google-ai/

[10] 延迟强化学习。http://heim . ifi . uio . no/~ mes/INF 1400/COOL/REF/Standford/ch11 . pdf

强化学习、大脑和心理学:经典和工具性条件作用

原文:https://towardsdatascience.com/reinforcement-learning-brain-and-psychology-part-2-classical-and-instrumental-conditioning-217a4f0a989?source=collection_archive---------18-----------------------

强化学习、人工智能和人类

心理学研究如何启发强化学习中的主体训练?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“一个人相信事物是因为他已经习惯于相信它们。”—阿尔多斯·赫胥黎,美丽新世界。

在强化学习领域,有两大类算法:用于预测的算法和用于控制的算法
对于稍微熟悉题目的人来说,预测算法通常是基于值的算法,也就是说它们的目的是预测一种情况的结果(奖励)。而控制算法大多是基于策略的算法,应该引导你度过难关。

同样,这些类别对应着心理学的两项研究:经典(巴甫洛夫) 条件反射工具(操作)条件反射预测算法经典条件作用之间的对应关系取决于它们预测即将到来的刺激的共同特性,无论这些刺激是奖励还是惩罚。有了工具性条件作用,一个主体根据它所做的得到奖励或惩罚,因此它学会增加产生奖励行为的倾向,减少产生惩罚行为的倾向。当然,这种对应不是偶然的,因为心理学对 RL 的影响很大。

这是灵感来源系列的第二部分,所以让我们跳进兔子洞,看看如何让人们相信。

经典条件作用

我敢肯定,你们所有人都听说过伊凡·巴甫洛夫和他用狗做的实验,这是经典条件反射的最好例子,尽管在这个领域还有许多其他作品,让我们坚持到底。

巴甫洛夫博士正在研究一只狗对无条件刺激 (US)的无条件反应 (UR),分别是流涎和食物演示。当给狗一些食物时,它几乎立刻开始分泌唾液。这个过程对我们来说非常简单和直观,但这引发了一个想法,即是否可以训练狗对其他刺激做出类似的反应。

条件刺激 (CS)是狗以前不关心的东西,它可以是声音、光或基本上任何其他最初是中性刺激的东西。在巴甫洛夫的实验中,这是节拍器的声音。对 CS 的反应被称为条件反应 (CR),它有时类似于 UR,但通常开始得更早,通常更强烈。

回到巴甫洛夫的实验,在重复播放了几次节拍器的声音(CS)之后,就在展示食物(US)之前不久**,狗学会了对节拍器的声音(CR)分泌唾液,就像它对食物(UR)分泌唾液一样。美国被称为“强化者”,因为它强化了铬的产生以回应铯。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

巴甫洛夫实验管道

最初的中性刺激变成了条件刺激,因为狗知道它预测到了美国,所以开始产生条件刺激。

关于这个项目还有许多其他有趣的细节,但这对我们来说已经足够了。

强化学习和经典条件作用

狗的学习过程有点类似于我们如何训练一个 RL 代理。如我所说,经典条件对应于预测算法,该算法在给定的状态下预测奖励*。*这与狗身上发生的事情非常相似(一个代理)。

状态中,当食物出现时,狗开始分泌唾液,这意味着它期待奖励。所以我们以这样一种方式构建我们的训练循环,当我们在食物演示之前引入 CS 时,有另一个状态。经过几个训练时期后,狗学会了 CS 的状态和食物之间的依赖性,因此它开始分泌唾液(表明它期待 CS 的奖励)。

就强化学习而言,我们可以把这个问题写成如下。

吃的过程本身可以设定为 RL 奖励(食物美味营养),动作会流口水,或者不流口水,̶t̶h̶a̶t̶̶i̶s̶̶t̶h̶e̶̶q̶u̶e̶s̶t̶i̶o̶n̶,即使狗不是故意的,状态是食物演示过程和节拍器的声音。

现在你知道了,当状态包括节拍器的声音时,我们的代理将会预测(垂涎)奖励*。*

让我们引用这一领域之父的话来结束这一部分:

“很明显,在自然条件下,正常的动物不仅必须对自己带来直接利益或伤害的刺激做出反应,而且还必须对其他物理或化学机构——声波、光波等——做出反应,这些反应本身只标志着这些刺激的接近;虽然对小动物有害的不是猛兽的视觉和声音,而是它的牙齿和爪子。”——伊凡·巴甫洛夫博士。

工具性学习

与经典的条件反射实验不同,在 T2,仪器条件反射实验依赖于动物的具体行为。在经典条件反射中,无论动物的行为如何,它都会被呈现一个强化物(我们)。而这也是为什么乐器调理远比大家都知道的更接近 RL。

工具性条件反射*通常被认为与操作性条件反射**相同,后者是由 B. F .斯金纳引入的术语,但我们不打算深究差异,而是将它视为一个单一的事物。*

爱德华·桑戴克是这个领域的先驱,他用被放进*“拼图盒子”*的猫做实验。这些盒子有多种变化,但理念是相同的。猫要完成一系列动作才能从盒子里出来取食物。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

桑代克对猫的实验

看,又回到食物上了。这是我们的代理人 T21 的增强剂,对所有这些实验都至关重要。正所谓“没钱没蜜”。你必须为你的代理提供某种奖励*(积极的或消极的),因为没有它就无法工作。*

所有这一切真正有趣的是,在几次连续的经历后,猫学会了如何更快地逃离,它们不再凭直觉(随机)行动。桑代克是这样描述的:

“在她冲动的挣扎中在盒子里到处抓的猫可能会抓绳子、环或按钮来开门。逐渐地,所有其他不成功的冲动将被消除,导致成功行为的特定冲动将被由此产生的快乐所取代,直到经过多次尝试后,猫在被放入盒子后,会立即以确定的方式抓住按钮或环。”爱德华·桑戴克博士。

所以,简单地说,猫会想出一系列的动作,引导它们走出盒子,最终它们会得到食物。但对我们来说重要的是,他们是通过桑代克发现并称之为效果法则也就是试错法来学习的。

现在让我们更关注强化学习部分,因为它有一些令人兴奋的方面。

强化学习和仪器条件作用

效果法则 描述了反映在 RL 算法中的动物学习的两个基本特征。首先,一个算法必须是选择的,,这意味着它尝试不同的动作,并通过比较它们的结果在其中进行选择。第二,算法必须是关联的,这意味着它将特定情况(状态)与在选择阶段发现的动作相关联。

效果定律说,重要的是不仅要找到给予大量奖励动作,还要将那些动作状态联系起来。

选择过程最臭名昭著的例子是进化中的自然选择——最强的生命——但它不是相关的。关联方法的一个例子可以是监督学习,但它不是选择*,因为它需要直接指令来改变它的行为。*

对于 RL 算法来说,选择过程就是探索,有很多方法可以实现。例如,ε-贪婪策略,它声明一个代理以ε 的概率挑选一个随机的动作*,它以 1-ε的概率挑选贪婪(选择给予最大即时奖励动作)。通过在训练期间逐渐减少ε,我们试图解决*探索-开发困境,简单地说,就是什么时候应该停止探索,开始开发。

另一个好奇的事情是动机*。对于工具性条件反射来说,它影响行为的强度和方向。在桑代克的实验中,是放在盒子外面的食物。每当我们的猫逃出盒子,它就会得到食物,这加强了它逃跑的行动。*

当然,它并不直接对应于 RL,但奖励信号基本上就是我们所说的动机,整个技巧就是让代理人的体验获得奖励。尽管我们自己的动机是非常复杂和高度等级化的东西,我们可以得到一些想法。例如,当我们饿的时候,我们更有动力去获取食物,而当我们刚吃东西的时候,我们就没有动力了,也许我们可以把这种行为转移到强化学习中。然而,关于这一主题的作品却很少。至少据我所知,最近的一本是 Nathaniel D. Daw 和 Daphna Shohamy 的《动机和学习的认知神经科学》。

如你所见,工具性条件作用的抽象与强化学习非常相似,但它们在任何方面都不是等同的陈述。将动物行为这样复杂的东西映射到计算问题上,就像用棍子和石头解释弦理论一样。

结论

我希望这种相似性现在对你来说已经很清楚了,但是请记住 RL 方法只是受到心理学的启发,它们从来不应该严格地反映动物和人类的行为。

可能不清楚为什么所有的东西都是关于动物而不是人类的,首先,这是因为我们人类和我们的狗和猫一样都是动物。第二,我们的行为模式非常相似,但难度成倍增加,所以在我们的宠物身上做实验更容易。但是仍然有可能使用操作性条件反射来训练人,例如,谢尔顿在《生活大爆炸》中对佩妮所做的。

我们仍然有太多关于自己的探索,加入这项研究永远都不晚。也许我们,人类,真的在我们的生物学和心理学上有一些特别之处,这让我们成为了优势物种,或者也许我们只是运气好。重要的是我们学习的方式中有一个谜,我们试图用棍子和石头解释弦理论,这可能是解释我们为什么在这里的重要一步吗?

P.S. Pavlov 实际上是个好人,他养了所有的狗,并在实验后照顾它们。

TwitterLinkedIn 脸书 上与我连线并关注GitHub*!*

强化学习、大脑和心理学:延迟强化、认知地图和行为

原文:https://towardsdatascience.com/reinforcement-learning-brain-and-psychology-part-3-delayed-reinforcement-cognitive-maps-and-7d304747e62c?source=collection_archive---------29-----------------------

强化学习、人工智能和人类

延迟强化是如何工作的,通过认知地图进行知识优化,以及为什么我们的行为会随着时间而改变。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在强化学习中,以及在一般的机器学习中,特别是深度学习中,通常很难甚至不可能解释为什么事情会以这种方式发生。这被称为信用分配问题,研究人员正在努力解决这个问题,他们试图为算法开发某种推理,但到目前为止还没有运气。但是我们,人类,更好吗?我们真的知道为什么我们会做出这样的决定,为什么我们会这样做吗?

让我们设法解决它。这是 RL 灵感来源系列的第三部分,让我们深入探讨一下。

延迟强化

“拖延是不可避免的.”——埃斯库罗斯。

信用分配问题在 RL 领域大放异彩。简而言之,在训练期间,一名特工多次问自己*“我到底做了什么才来到这里?”。实际上,这就是他学习的方式,他捕捉到了什么样的行为会导致最高的奖励。但是当有上百个行为而你最后只得到奖励时,如何理解哪些行为是好的?而当有几十万而没人给你奖励的时候,就像发生在我们身上一样,人呢?*

在强化学习中,有一种叫做资格追踪的技术,你可能已经猜到了,它是受动物研究的启发。

巴甫洛夫指出,刺激必须在神经系统中留下痕迹,资格痕迹很像我们大脑中的刺激痕迹。很难想出一个好的例子,但是让我们想象一下你的一生。关于你的童年,你能说些什么?年纪越大,记忆越淡,对吗?

为了描绘它,让我们想象你生活在̶ ̶F̶l̶a̶t̶l̶a̶n̶d̶ ̶网格区。对你来说,整个人生就是从左下角的细胞,你出生的地方,移动到右上角,你将要死去的地方。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你的整个人生轨迹

当你接近终点时,对你早期生活的记忆正在消退,但你至少还能回忆起一些事情。这是你独特的经历,这是我们知识的积累,只有最重要的部分,这就是为什么你是特别的,这就是资格痕迹是什么。

在生物层面上,在完成一个动作并收到一个奖励后,突触,即我们大脑中神经元之间的连接,具有那些随着时间流逝而衰减的临时刺激痕迹。因此,当强化被引入时,例如,在一次精彩的演讲后鼓掌,我们的大脑会对最近的行为给予更多的信任,因为对于你演讲的当前成功来说,你小时候穿什么 t 恤并不重要。

我们将在本系列的稍后部分探索神经科学,敬请关注。

但是它和延迟强化有什么关系呢?人们可以为了一份薪水工作几天,为了升职工作几年,但是我们的记忆会告诉我们为了达到这个目标我们做了什么。RL 代理也是一样,资格痕迹是他的记忆,它们告诉他重复什么动作才能获得奖励

处理信用分配问题的方法还有很多,但这个方法是最“人性化”的。如果你感兴趣,我强烈推荐你阅读关于 AlphaZero 的论文。它展示了计算机如何利用它们完美的记忆来解决信用分配问题。

认知地图

“在磁盘世界里,地图制作从来就不是一门精确的艺术。人们倾向于以良好的意图开始,然后被喷出的鲸鱼、怪物、海浪和其他无聊的制图家具弄得晕头转向,以至于经常忘记把无聊的山脉和河流放进去。”—特里·普拉切特,电影

我们还没有谈到的是无模型基于模型的算法。这一次不是关于机器学习模型之类的模型而是关于环境 s 的模型,它们是状态之间的所有转换,所有奖励动作导致那些奖励。这是非常重要的,你不应该被这些术语所迷惑。

有了无模型的,你的代理其实对他所处的环境一无所知。他在训练过程中通过试错(或者通过效果定律如果你看过我之前的文章)获得世界的所有动态。

另一方面,利用基于模型的算法,智能体从一开始就拥有关于世界的所有信息,或者他可以在与世界的交互过程中学习这些信息。所以他有一张环境的地图,明白我要去哪里吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

向左走,你会变得富有,向右走,你会发现死亡

这种关于转场的知识和认知图谱非常相似,对于我们人类来说,是生活经验、教育等知识的积累。它们是在日常基础上下意识形成的,目的是减少记忆的使用,增强回忆和学习。但是,当然,你也可以利用思维导图、记忆宫殿等技术来有意应用它们。如果你对记忆术感兴趣的话,读一读吧。

心理学家爱德华·托尔曼在 20 世纪 40 年代对老鼠进行的实验表明,老鼠能够形成它们穿过的迷宫的潜在表征,这与 RL 特工非常相关。利用无模型算法,一个代理以及一只老鼠,必须弄清楚环境的转变,或者用我们的新术语来说,创建一个认知地图。抓住世界上发生的事情有助于他表现得更好。

所以再一次,一个环境的模型是在那个环境里面的所有转换。过渡被优化并服务于特定的目标,很像认知地图。那些过渡可以由代理自己学习(无模型算法)或者交给他(基于模型算法),他要么画地图,要么买地图。

行为

“她通常给自己很好的建议,尽管她很少遵循。”—刘易斯·卡罗尔,《爱丽丝漫游奇境记》

无模型基于模型的强化学习算法之间的区别对应于心理学家对习惯性目标导向行为模式之间的区别。习惯是由适当的刺激触发的行为模式,然后或多或少地自动执行。根据心理学家如何使用这个短语,行为是有目的的,因为它是由对目标的价值以及行动和结果之间的关系的了解所控制的。

让我们看看例子。这里我们有一个迷宫赛跑者,他正试图逃离迷宫,同时也变得富有。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

迷惑

无模型算法依赖于通过多次试验获得的经验。在几次尝试后,我们的跑步者利用他的额外生命猜出了迷宫,现在知道该做什么了。我们甚至可以说,他为这个迷宫学会了一种习惯。

正如我们现在所知,使用基于模型的算法,跑步者有一张迷宫地图。通过看着它,他计划他的行动去得到最大的宝藏,然后逃跑。这里我们要说的是,利用过渡的知识和应用逐步计划,跑步者的行为目标直接

现在让我们稍微改变一下迷宫。我们会交换最大的宝藏和死亡屋的位置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

改变迷宫

如果跑步者正在应用无模型算法,他会死,因为他是在不同的环境中训练的,并且在某种程度上过度适应了它。为了解决这个变化了的迷宫,他需要再花一些时间通过试错来学习,探索这个勇敢的新世界。

但是基于模型的算法却不是这样。跑步者将会得到一张改变后的迷宫地图,并很容易找到宝藏。那就是习惯性目标导向的行为与无模型基于模型的算法之间的关系。
然而,形象地说,我们人类并没有一个离散的世界地图,所以我们应用我们的认知地图(对周围发生的事情的理解)来规划和行动,但这并不重要,因为我们只直接针对目标行事

克里斯托弗·亚当斯(Christopher Adams)在 1982 年对老鼠进行的实验表明,将老鼠放在一个有杠杆的房间里,当按下杠杆时,会释放少量食物,可以过度训练,并学会按杠杆的习惯。

将大鼠分成两组,一组训练 100 次迭代,另一组训练 500 次迭代。在第二阶段,两组人每次得到食物时,都会被注射引起恶心的毒药,因为早期的实验表明,这应该会降低他们按下操纵杆的兴趣。

未过度训练的老鼠确实开始显示出杠杆按压率的下降,这意味着它们的行为目标是直接的。相比之下,过度训练的老鼠几乎没有效果,事实上,它使它们更有活力。就好像他们忘记了食物是善意的,而现在却要求得到它。

这就是这两种行为的联系。过了一会儿,有目标的行为变成了习惯性的行为。这让我想起了我们生活中类似的时刻,当我们开始认为事情是理所当然的:金钱,健康,食物,甚至我们爱的人。

结论

我们是地球上最聪明的生物,然而我们却无法评估自己的大部分行为。我们给别人建议和教训,却不知道自己该做什么。我们说我们专注于我们的目标,惩罚坏习惯的代理人,然而我们每天都在做蠢事。然而,我们在有史以来最复杂的环境中工作,而电脑只能玩游戏。怎么会?

联系我上 推特 领英 脸书 并关注GitHub

强化学习:动态编程

原文:https://towardsdatascience.com/reinforcement-learning-dynamic-programming-2b89da6ea1b?source=collection_archive---------14-----------------------

利用动态规划在网格世界中寻找最优策略

在之前的两篇文章中,我分解了大多数人在钻研强化学习时遇到的第一件事:多武装土匪问题马尔可夫决策过程。大多数游戏都满足马尔可夫决策过程的要求,特别是我们将要使用的游戏叫做网格世界。对于那些不熟悉的人来说,环境是一个二维网格,每个瓦片/节点要么有一个值(通常为 0,但有些变化有负值),一个死空间,或者一个结束游戏的奖励(称为终端状态)。代理能够向任何方向移动,它的目标是最大化它的报酬。我们用来估算这些回报的算法叫做动态规划。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们深入研究算法如何工作之前,我们首先需要构建我们的游戏(这是我的 Github 的链接,里面有我构建的所有其他算法)。要做到这一点,我们只需要 Python。我们可以使用一个类结构来创建网格世界,所以我们要做的第一件事就是建立我们需要的属性。要将一个变量实例化为网格类,我们需要给它传递三个参数,高度和重量都是控制网格大小的整数;start 是一个包含 2 个整数的元组,用于控制代理的起始位置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从这里开始,我们需要建立一些方法,允许我们为网格设置/更新奖励、动作和状态,这样我们就可以在游戏开始和中间都使用这些值。在这之后我们只需要五个方法,我们的类就完成了。我们使用三个来简单地返回信息,例如:当前状态、状态是否结束以及游戏是否结束。在这之后,剩下的就是给我们的代理移动的能力,并在我们的游戏中创建一组所有可能的状态。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面是我的网格布局。右角有两个终端瓷砖,中间有一个死角。您可以做的一些事情来个性化您的网格是改变大小,网格布局,或添加一个非终端的所有国家的负奖励,以激励代理人移动最少的步骤。你不应该让惩罚变得那么大,但是你可以用它来观察代理如何改变它的行为。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:走向数据科学

最后,我们创建了一个最终的函数网格,我们将在以后学习动态编程时导入它。这个函数简单地创建了我们的网格类对象,然后建立了哪些位置有奖励,以及如果我们不使用策略,而只是出于探索目的随机移动,可能会采取什么行动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

贝尔曼方程

正如我在之前关于马尔可夫决策过程的博客中所说,为了估计每个状态和行动的回报,我们需要求解贝尔曼方程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:萨顿和巴尔托

我们可以将上面的等式分成三部分:

  • 第一个片段π(a|s),实际上并不指任何值,而是指一个策略。策略仅仅是在状态下执行动作的概率,我们的目标是调整策略以最大化代理的回报。
  • P(s ',r|s,a)是指在给定当前状态和动作的情况下,以特定状态-奖励对结束的概率。例如,网格世界有一个变种叫做风网格世界,每次你做一个动作,有 50%的概率你会采取另一个随机动作。这在现实世界中的一个应用是在信息不完全的游戏中,我们并不总是在我们想要或期望的地方结束。
  • 最后一部分[r + GAMMA * Vπ(s’)]是当前奖励和给定策略π的未来状态 s '的指数衰减奖励的组合。

由于这是一个依赖于未来值的递归方程,我们需要使用动态规划来收敛到值函数的解。我们面临的另一个问题是优化我们的政策。如果 Vπ2 >Vπ1,一个策略比另一个策略“更好”,我们的最优策略标记为π*。

动态规划

动态编程实际上由两种不同的实现方式组成:

  • 策略迭代
  • 价值迭代

我将简要介绍策略迭代,然后展示如何在代码中实现值迭代。策略迭代由一个内部和外部循环组成,但在此之前,第一步是随机初始化策略,并将每个状态的值函数设置为 0。然后,我们执行被称为迭代策略评估的内部循环,在该循环中,我们遍历并迭代地更新价值函数,直到变化低于某个阈值,然后我们可以中断并继续前进。一旦发生这种情况,我们进入外部循环,在这里我们遍历每个状态,看看更新政策是否会增加我们的奖励。如果我们的策略改变,我们回到迭代策略评估,并重复这个过程,直到我们不再改变策略。

值迭代是策略迭代的替代技术,它运行起来更简单、更快,因为它只需要一个循环,而不是两个。此外,在策略迭代的前半部分,我们必须等待策略评估收敛,但在现实中,我们不需要等待这种情况发生,我们可以在策略评估步骤完成之前估计价值函数。值迭代将策略评估和迭代合并到一个步骤中,在所有可能的操作中取最大值,策略迭代使用 argmax。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

资料来源:萨顿和巴尔托

代码中的值迭代

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于值迭代,我们只需要 Python、我们之前的 Grid-World 文件和 Numpy。在下面的代码中,我们的游戏是确定性的,所以我们不用担心 P(s ',r|s,a)。我们首先需要设置一个打破循环的阈值,一个惩罚未来奖励的折扣因子 Gamma,以及一个我们可以采取的所有可能行动的元组。

接下来,我们进入要运行的主代码块,开始创建网格世界对象。然后为策略随机选择动作,并为所有可能的状态初始化 0 到 1 之间的值函数。唯一的例外是始终没有策略且值为 0 的终端状态。

重复下一个代码块,直到我们的值函数收敛。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如您所见,我们浏览了所有我们有政策的州,并为最大化奖励的行动设定了价值。与策略迭代一样,我们重复这一过程,直到值函数收敛,但是,没有我们必须满足的第二个循环,所以我们可以直接进入优化我们的策略。我们只需遍历所有状态,并将策略设置为使价值函数最大化的动作。

后续步骤

虽然动态编程比暴力要有效得多,但它仍然需要一个完整的环境模型才能使用。在现实世界的场景中,甚至在更复杂的游戏中,这并不总是能实现的。在这之后,我将转向一种被称为蒙特卡罗的无模型方法,看看它如何采用不同的方法来解决网格世界,以及代理如何更接近于真正“玩”游戏。

引用作品:

https://www . udemy . com/course/artificial-intelligence-reinforcement-learning-in-python/

可视化解释强化学习(第 3 部分):无模型解决方案,循序渐进

原文:https://towardsdatascience.com/reinforcement-learning-explained-visually-part-3-model-free-solutions-step-by-step-c4bbb2b72dcf?source=collection_archive---------1-----------------------

直观强化学习系列

用简单的英语为基于价值和基于政策的解决方案所使用的技术提供可视化指南。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由艾丹·豪Unsplash 上拍摄

这是我关于强化学习(RL)系列的第三篇文章。现在我们已经了解了什么是 RL 问题,以及可用的解决方案的类型,我们现在将了解所有解决方案使用的核心技术。使用迭代算法作为框架来逐步改进预测,我们将理解基于价值和基于策略的解决方案之间的基本相似性和差异。

这里是对本系列之前和之后文章的一个快速总结。我的目标是不仅要理解事物是如何工作的,还要理解它为什么会这样工作。

  1. 基本概念和术语介绍 (什么是 RL 问题,以及如何使用马尔可夫决策过程的技术和概念(如回报、价值和政策)将 RL 问题解决框架应用于该问题)
  2. 解决方案方法 (热门 RL 解决方案概述,并根据这些解决方案之间的关系进行分类。贝尔曼方程的重要提示,它是所有 RL 算法的基础。)
  3. 无模型算法 —本文 (基于价值和基于政策的解决方案的异同使用迭代算法来逐步提高预测。剥削、探索和贪婪的政策。)
  4. Q-Learning 发展直觉,了解为什么这个算法会收敛到最优值。)
  5. 深度 Q 网络 (我们的第一个深度学习算法。一步一步地演示它是如何工作的,以及为什么做出那些架构选择。)
  6. 策略梯度 (我们第一个基于策略的深度学习算法。)
  7. 演员评论家*(复杂的深度学习算法,结合了深度 Q 网络和政策梯度的最佳效果。)*
  8. 惊喜话题😄*(敬请期待!)*

无模型算法可以是基于策略或基于值的

使用值函数来比较两个策略

正如我们在第一篇文章中所讨论的,每个策略都有两个相应的价值函数,即状态价值(或 V 值)和状态动作价值(或 Q 值),我们可以使用一个策略的价值函数来比较两个策略。如果政策 Y 的价值函数比政策 X 的高,那么政策 Y 就比政策 X 好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过比较策略各自的价值函数来比较策略(图片由作者提供)

最优策略

我们还讨论过,如果我们不断寻找越来越好的政策,我们最终将能够找到比所有其他政策都更好的“最佳”政策。这是最佳策略。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最优策略优于所有其他策略(图片由作者提供)

最佳政策与最佳价值密切相关

最优策略有两个相应的价值函数。根据定义,这些价值函数优于所有其他价值函数。因此这些价值函数也是最优的。最佳状态值和最佳状态-动作值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对应于最优策略的价值函数是最优价值函数。(图片由作者提供)

这就告诉我们,找到一个最优的政策就相当于找到了最优的国家-行动值,反之亦然。通过找到一个,我们也得到了另一个,如下所示。

基于策略与基于值的算法

因此,无模型算法可以直接或间接地找到最优策略。它们是:

  • 基于状态-动作值(间接)。为了简单起见,我们将这些简单地称为“基于价值的”
  • 基于策略(直接)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

无模型解决方案直接或间接找到最优策略(图片由作者提供)

基于值的算法找到最佳状态-动作值。然后可以从中得出最优策略。基于策略的算法不需要最优值,直接找到最优策略。

从最佳状态-动作值导出最佳策略

一旦基于值的算法找到了最优的状态-动作值,它如何从中找到最优的策略呢?

一旦我们找到了最优的状态-动作值,我们就可以通过挑选具有最高状态-动作值的动作来容易地获得最优策略。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以从最优状态-行为值中获得最优策略(图片由作者提供)

考虑上面的例子。如果 Q1* > Q2*,那么最优策略将选择 S1 的行动 a1。

因此,π1* = 1,π2* = 0

这给了我们一个确定性的最优策略

一般来说,最优策略是确定性的,因为它总是选择最佳行动。

然而,如果两个 Q 值之间存在联系,那么最优策略可能是随机的。在这种情况下,最优策略以相等的概率选择两个相应动作中的任何一个。这通常是代理与对手进行博弈的问题。随机最优策略是必要的,因为确定性策略会导致代理人采取其对手可以轻易击败的可预测的行动。

基于状态值的预测问题算法

除了上面提到的用于解决控制问题的基于状态-动作值的算法之外,我们还有用于预测问题的基于状态-值的算法。换句话说:

  • 预测算法是基于状态值的
  • 控制算法要么基于状态-动作值,要么基于策略

无模型算法类别

查找表与函数

较简单的算法将策略或值实现为查找表,而更高级的算法使用函数逼近器(如神经网络)来实现策略或值函数。

因此,我们可以将无模型算法分为以下几类:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

无模型算法使用迭代解决方案

RL 问题不能用代数方法解决。我们需要使用迭代算法。

有几种这样的基于值和基于策略的算法。当我开始深入研究这些算法的细节时,一开始我觉得很困惑。然而,过了一段时间,我开始意识到所有这些算法都可以归结为它们都采用的一些基本原则。

因此,相反,如果我们专注于学习这些原则是什么,那么理解这些算法如何相互关联以及它们的相似之处和不同之处将变得非常容易。

然后,当我们在后面的文章中深入每个算法的细节时,您将能够很快地看到这些共同的原则是如何被应用的,而不会迷失方向。

在一个高层次上,所有算法,包括基于值和基于策略的算法,都有四个基本操作要执行。他们从对想要寻找的数量的任意估计开始,然后通过从环境中获取数据来逐步改进这些估计。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于值算法(以及基于策略的算法)执行这四个基本操作。(图片由作者提供)

让我们来看看这四种操作中的每一种,并比较基于价值和基于策略的方法。

1.初始化评估

第一步是初始化我们的估计。基于值的算法使用估计的最佳状态-动作值表,而基于策略的算法使用估计的最佳策略表,该表具有每个状态中每个动作的概率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

开始时,因为它不知道什么是正确的值,所以它简单地将所有值初始化为零。

2.采取行动

接下来,代理需要从当前状态中选择一个要执行的操作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

代理希望确保充分尝试所有可用路径,以便发现最佳路径,并且不会错过最佳选项。它是怎么做到的?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

为了解决这个问题,我们需要理解探索和开发的概念。

探索与开发

探索 —当我们刚开始学习时,我们不知道哪些行为是“好”的,哪些是“坏”的。因此,我们经历了一个发现的过程,在这个过程中,我们随机尝试不同的行动,并观察回报。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

探索:通过随机选择一个动作来发现新的路径(图片由作者提供)

开发 —另一方面,当模型被完全训练时,我们已经探索了所有可能的行动,因此我们可以选择将产生最大回报的最佳行动

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

剥削:选择最佳行动以获得最大回报(图片由作者提供)

代理需要在探索和开发之间找到正确的平衡。基于策略的代理和基于价值的代理使用不同的方法来实现这一点。

基于策略使用自己的估计来选择操作

基于策略的代理的策略表已经有了对最佳策略的持续估计,它告诉您在任何给定状态下可以采取的所有操作的期望概率。所以它只是根据估计的最优策略的概率来选择行动。行动的概率越高,就越有可能被选中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于政策的方法来选择最佳行动(图片由作者提供)

基于价值使用ε-贪婪策略来选择动作

基于价值的代理采用一种称为ε-贪婪的动态策略。它使用一个探索率ε,随着训练的进行而调整,以确保在训练的早期阶段进行更多的探索,并在后期阶段转向更多的开发。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于价值的方法使用ε贪婪策略(图片由作者提供)

我们最初将ε设为 1。然后,在每集的开始,我们以一定的速率衰减ε。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

现在,每当它在每个状态中选择一个动作时,它选择一个随机动作(即探索)与概率ε。由于ε在早期较高,代理人更有可能探索。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

同样,以概率‘1—ε’,它选择最佳行动(即 exploit)。随着ε下降,探索的可能性变小,代理人变得“贪婪”,越来越多地利用环境。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

3.从环境中获得反馈

代理采取它所选择的动作,并从环境中获得反馈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

代理以奖励的形式接收来自环境的反馈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

4.改进估计

代理如何使用奖励来更新它的估计,使它们变得更准确?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

基于策略的代理使用该反馈来改进基于该回报的估计最优策略。基于价值的代理使用该反馈来改进基于该回报的估计最优值。这样,下次他们必须决定从该状态采取何种行动时,该决定将基于更准确的估计。

基于策略更新动作的概率

代理说,“如果我得到了积极的奖励,那么我将更新我的策略表,以增加我刚才采取行动的概率。”。这样,下次我就更有可能采取行动

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

基于值根据贝尔曼方程更新其值

一位基于价值的经纪人说,我之前的估计告诉我,这次行动会带来这么大的价值。基于我刚刚得到的奖励,贝尔曼方程告诉我,我的价值应该更高(或更低)。我将更新我的价值表以缩小差距。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

我们将更深入地探讨基于价值的代理如何使用贝尔曼方程来改进它的估计。我们在第二篇文章中深入讨论了贝尔曼方程,所以最好回去复习一下。

该等式描述了计算 Q 值的递归关系。由此得出的第一个重要见解是,如果我们知道下一个状态-行动对的 Q 值,那么我们就可以利用它,而不必遍历除此之外的整个事件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

第二个重要的观点是,贝尔曼方程认为有两种方法可以计算状态-动作值:

  1. 一种方式是来自当前状态的状态-动作值
  2. 另一种方式是采取一个步骤的直接回报加上下一个状态的状态行动值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

这告诉我们,我们可以通过两种不同的方式获得状态值。如果这些都是非常精确的值,这两个量就会完全相等。

但是,由于算法使用的是估计值,我们可以通过比较这两个量来检查我们的估计是否正确。

如果它们不相等,“差异”告诉我们估计中的“误差”量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

第一项包含一个实际奖励加上一个估计,而第二项只是一个估计。

该算法以减少误差的方式递增地更新其 Q 值估计。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

把所有的放在一起

代理现在已经改进了估计。这就完成了四个操作的流程。该算法继续执行该流程,直到剧集结束。然后,它重新开始一个新的插曲,并重复。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

改进估算的不同方法

该算法的核心是如何改进它的估计。不同的算法使用的技术略有不同。这些变化主要与三个因素有关:

  • 频率 —更新前前进的步数。
  • 深度 —传播更新的后退步数。
  • 用于计算更新估算值的公式

让我们简要回顾一下这些因素,了解一下这些变化是什么。

频率

在更新我们的估计之前,代理可以采取的前进步骤数有三个选项:

  • 最简单的想法是,它采取一个行动,观察奖励,保存它们,然后采取另一个行动,观察这些奖励,保存它们,并一直这样做,直到这一集结束。最后,在这一集的结尾,算法会获取所有这些奖励,并使用它们来更新我们的估计。
  • 一步**——或者,我们可以只走一步,观察那些奖励,然后马上更新,而不是一直等到这一集结束。**
  • N 步 —以上两个选项是谱的两端。在这之间,我们可以在 N 步之后进行更新。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

在一般情况下,代理采取一些前进的步骤。这可能是一步,N 步,或者直到这集结束。

深度

在采取了一些前进的步骤之后,下一个问题是该算法应该在多远之前传播它的更新估计?同样,有三种选择:

  • 插曲 —如果代理向前迈出一步,直到插曲结束,算法可以更新它在此过程中采取的每个状态-动作对的估计。
  • 一步 —或者,它可以只更新当前状态-动作对的估计。
  • N 步 —以上两个选项是谱的两端。在这之间,我们可以一路更新 N 步

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

在采取一些向前的步骤之后,算法更新它所采取的状态和动作的估计。这可以是当前状态-动作对的单个步骤,N 个步骤,或者直到情节开始。

更新公式

用于更新估计值的公式有许多变化,例如:

  • 基于值的更新使用某种形式的贝尔曼方程来用“误差”值更新 Q 值。例如,这个公式用一个称为 TD 误差的误差值来递增地更新 Q 值估计。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

  • 基于策略的更新增加或减少了代理采取行动的可能性,这取决于我们是否收到了好的奖励。

无模型算法之间的关系

如果你研究不同的算法,每个算法看起来都非常不同。然而,正如我们刚刚看到的,它们都遵循一些相似的模式。

在本系列中,我们不会深入研究每一种算法,而是将重点放在深度强化学习中常用的几种算法上。

然而,为了完整起见,我整理了一个表格,总结了这些算法之间的关系。当我学习的时候,它帮助我把事情看得更清楚了。所以我希望它对你也有帮助。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

结论

在本文中,我们对 RL 问题的解决方案进行了概述,并探讨了一些流行算法使用的常见主题和技术。我们主要关注用于解决大多数现实问题的无模型控制算法。

我们现在准备深入研究基于神经网络的深度学习算法的细节。它们是最令人感兴趣的,因为在过去几年中,它们在解决复杂和以前难以解决的问题方面取得了巨大进展。

我们将在接下来的几篇文章中选择一种算法,从 Q 学习开始,Q 学习是深度学习算法的基础。

最后,如果你喜欢这篇文章,你可能也会喜欢我关于变形金刚和音频深度学习的其他系列。

** [## 直观解释的变压器(第 1 部分):功能概述

NLP 变形金刚的简明指南,以及为什么它们比 rnn 更好,用简单的英语。注意力如何帮助…

towardsdatascience.com](/transformers-explained-visually-part-1-overview-of-functionality-95a6dd460452) [## 音频深度学习变得简单(第一部分):最新技术

颠覆性深度学习音频应用和架构世界的温和指南。以及为什么我们都需要…

towardsdatascience.com](/audio-deep-learning-made-simple-part-1-state-of-the-art-techniques-da1d3dff2504)

让我们继续学习吧!**

每个人的强化学习

原文:https://towardsdatascience.com/reinforcement-learning-for-everyone-9c1163f61440?source=collection_archive---------36-----------------------

RL 已经在 AI 社区流行起来,但是大多数人还不知道它是关于什么的。来读吧,不管你是什么背景!

如果你在技术领域工作,尤其是在人工智能/机器学习领域,你可能已经习惯了人们不理解你的工作。这就是我的生活,我不得不说我为此感到有点自豪:因为这意味着我学到了许多大多数人不知道的东西,而且我对这个话题足够深入,能够理解对大多数人来说非常复杂的事情。然而,每当你想与你关心的人分享一项成就时,这也有点令人沮丧,因为他们无法理解所有这些模糊之处。

这就是我决定写这篇文章的原因,希望我能把我的观点传达给任何对 ML 特别是强化学习感兴趣的人,不管你的背景如何。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不,机器学习无法像电影中那样建造终结者——然而[图片来自 PublicDomainPictures 。]

巴甫洛夫条件反射

尽管当你想到人工智能时,你会想到未来,但我们的故事始于 100 多年前,19 世纪 90 年代,在伊凡·巴甫洛夫的实验室里。他在研究狗的唾液分泌,为此,他测量了狗看到食物时唾液分泌的多少,在吃食物之前是 T4。他已经对这些实验感到兴奋,但他意识到一些意想不到的事情:狗甚至会在看到任何食物之前分泌唾液。当他们注意到巴甫洛夫的助手向他们走来时,他们会开始垂涎三尺。注意到这一点后,他测试了如果在喂狗之前,他会按铃会发生什么(或者实际上是根据维基百科的节拍器),你可能猜到了:它们也开始垂涎三尺,因为它们已经知道铃响后,食物就会来了。这种铃声被称为条件刺激,因为狗不会因为铃声响而流口水,而是因为它知道食物会跟着铃声走。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最终,巴甫洛夫也受到了狗的影响。]

不错!但是我来这里是为了学习…

事实证明,RL 是基于心理学的基本原理。在 RL 中,一个智能体基于一个被称为奖励的“条件刺激”来学习如何行为。RL 的设置如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RL 的框架及其元素【自制。]

我们有一个代理,它位于一个环境中并与之交互,在这个环境中,它可以执行动作,同时观察环境的状态并接收对其动作的奖励。此外,我们在离散时间中解决我们的问题,所以我们的时间线是由步骤构成的;在每一步中,代理观察环境的状态,对环境执行改变环境状态的动作,并接收对其动作的奖励。

为了使它更简单,让我们考虑一个例子:我们的代理将是一个机器人,我们希望它学会走路,直到一个目标区域,所以当它到达这个区域时,我们会给它一些不错的奖励。为了到达这个目标区域,机器人可以使用不同的动作,例如:右转、左转、前进和后退。机器人将在每一步开始尝试随机的动作组合,直到它到达我们希望它到达的位置。一旦发生这种情况,我们改变它的位置并重新开始,这就像一个“的游戏”,因为机器人已经实现了它的目标,没有其他动作是可能的。这段时间从机器人处于随机位置开始,直到它到达目标区域,这被称为一个,我们将重复这些集,直到机器人知道它需要做什么才能获得好的奖励。在这之后,机器人会一直做同样的事情:导航到目标区域,因为它知道这样做,它会得到很好的回报。

但是,代理如何学习

你可能已经朝着正确的方向思考了:数学!代理的行为是由它的策略定义的,根据我们使用的方法,它可以用不同的方式来表示:一个表,一个函数,甚至是神经网络。

在 RL 最基本的情况下,称为表格 Q-learning,代理保存一个表,其中每个状态一行,每个动作一列,如图所示。该表告诉代理在给定状态下执行某个操作的预期结果,因此当环境状态发生变化时,代理会检查与给定状态对应的行,并可以选择过去回报最高的操作。每个动作和状态的值称为 Q 值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用表格 Q-learning 时的策略。

该表是表格 Q-learning 中的一个策略。每个 Q 值被初始化为 0,然后在每一步之后用更新规则更新其值,该更新规则基于采取行动之后收到的奖励和新状态的“有多好”。我在这篇文章中跳过了数学,以避免你们中的许多人可能不感兴趣的技术问题,但是如果你想看数学和这些值如何更新的所有细节,你可以在这里看到它们。

代理将重复情节几次,用它的新体验(状态、动作、新状态、奖励)更新它在每个步骤中的策略。一段时间后,代理人将学会一种策略,这种策略会在一集里产生很好的回报,就像一个人将学会如何玩视频游戏以获得高分一样。

事实上,视频游戏是尝试 RL 代理的非常好的环境,这就是为什么它们是 RL 最常见的用例之一。然而,视频游戏的状态通常被定义为游戏的每一帧,所以我们处理的状态空间太大,无法用表格 Q-learning 来管理,所以这是使用神经网络而不是 Q-table 的地方。这就是我们所说的深度 RL 或者深度 Q 学习,因为使用了深度神经网络。在接下来的视频中,从两分钟的论文中,你可以看到谷歌的 DeepMind 的 Deep Q-learning 的代理在玩雅达利游戏。

DeepMind 的深度 Q 学习

就是这样!

还不算太糟糕,对吧?我希望您现在对 RL 是什么以及它是如何工作的有一个(非常)宽泛的概念。如果您仍然对 RL 感兴趣,并且想要更深入地了解它,那么网上有一些令人惊奇的资料可以帮助您正确地理解它,并在代码中实现它!这些是我最喜欢的资源:

  • RL 圣经:《强化学习:导论》出自萨顿&巴尔托(在亚马逊 纸面上得到美国英国ITFR这本神奇的书包含了你需要理解和开始使用 RL 的所有信息,包括代码示例。********
  • 如何用 Python 和 OpenAI Gym 实现 RL 的教程 。如果你想实现你的第一个 RL 解决方案,这是一个很好的教程。
  • 你还在怀疑 RL 是不是适合你的方法吗?我也许能帮你解决问题。

感谢您的阅读!

一级方程式赛车策略的强化学习

原文:https://towardsdatascience.com/reinforcement-learning-for-formula-1-race-strategy-7f29c966472a?source=collection_archive---------19-----------------------

了解深度 Q-Networks 如何像 AlphaGo 学习下围棋一样学习决定进站。

本文介绍了我的实验原型一个深度强化学习代理,以帮助 f1 车队在比赛中实时优化他们的策略决策。神经网络被设计为从观察到的圈数据到控制动作和即时奖励信号的映射函数。这里介绍的概念框架是在摩纳哥大奖赛的背景下分析的,但同样的方法可以改进并推广到所有的大奖赛活动。

为什么重要?

f1 是一场没有子弹的战争,这场战争的主要武器是创新。决定比赛策略是这项运动中的黑暗艺术。车迷们通常喜欢在电视上看到的由优秀车手表演的高速机动。他们看不到的是,要获得更好的结果,需要事先做多少准备,包括使用数学模型和概率论。对于比赛策略,我们主要指以下两个关键决策:

  • 车手应该什么时候去维修站换轮胎?
  • 车队应该给赛车安装哪种轮胎?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

古斯塔沃·坎波斯在 Unsplash 上的照片

轮胎在比赛中会老化,这可能会导致圈速变慢。这个过程是不可避免的,根据化合物(软、中、硬等)可以更快或更平滑。)和举行比赛的赛道。
如果圈速慢到赛车在几圈后损失的时间比停站花费的时间还多,那么轮胎可能需要更换。

如今,f1 车队使用蒙特卡洛模拟,他们在比赛前运行数小时,以便为他们的两位车手确定策略。这些模拟的工作方式是通过在不同的配置(进站圈、轮胎配方、位置等)下逐圈数千次地对比赛事件进行采样。)对有问题的车手,也对所有其他对手。由于可能情景的空间很大,他们只能运行有限数量的模拟,并且他们在这些模拟中选择能够产生最佳平均结果的策略。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

国际汽联 2019 & 2020 干轮胎化合物(软、中、硬)

在赛事期间,可能会发生许多新的情况,比赛策略师有时会发现自己不得不根据人类的判断来调整他们的决策。有时这些决定很有效,并导致获得更多的冠军积分。在其他情况下,它会导致挫败感——将重要的职位让给其他做出更好决策的竞争者。

这种情况促使我思考如何教会人工智能系统玩种族策略游戏。我们的目标是帮助一级方程式车手跨越终点线,在与其他竞争团队的竞争中赢得名次(或不失去任何名次)。

RL 问题公式

强化学习(RL)是一种先进的机器学习(ML)技术,它采用了与其他机器学习方法非常不同的方法来训练模型。它的超能力在于,它可以学习非常复杂的行为,而不需要任何标记的训练数据,并且可以在为长期目标优化的同时做出短期决策。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一级方程式赛车背景下的 RL

在 RL 中,智能体通过直接与环境交互并最大化其获得的总回报来学习执行特定任务的最佳行为。在一级方程式赛车中,总奖励(回报)可以被认为是特定车手在比赛结束时获得或失去的名次。因此,如果代理认为车手在比赛结束时会获得更好的位置,它可以决定在某一圈进站并失去一些位置。

为简化起见,我们将考虑每一圈可能采取的行动如下:

  • 行动 0:软化合物的进站
  • 行动 1:中间化合物的进站
  • 行动 2:硬质化合物的进站
  • 行动 3:继续(没有中途停留)

预测与控制

将 RL 应用于 f1 比赛策略的第一个有趣想法是“控制”的概念。

强化学习中的预测任务是给出一个策略,目标是衡量它在任何给定状态下的表现。这在某种程度上类似于 F1 车队试图实现的模拟。在比赛前,他们想预测某个策略如果从第一圈就开始应用会有多好。

但是,当我们开始执行控制时,RL 中的事情变得非常有趣!控制任务是当策略不固定时,目标是找到最优行为。也就是说,在给定任何状态的情况下,寻找最优策略,总是提供使期望总回报最大化的最佳决策。在 f1 中,这将非常有趣,因为它提供了一种方法来学习如何利用非常复杂的模式,并提出实时适应每一圈的策略,并有望击败竞争中最好的策略专家。

MDP &无模型控制

让我们考虑一级方程式赛车环境中的一个状态对应于我们在下面的电视屏幕上获得的信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

F1 电视数据频道

一个状态主要由圈数、车手排名、车手之间的时间间隔和他们的速度(最后一圈时间)以及他们的轮胎成分(软、中或硬)和年龄(圈数)来表示。也可以考虑安全车标志。此外,有一条规则要求每辆车在比赛中至少使用两种不同的干化合物。因此,我们可以为每个司机设想一个标志,表明是否使用了第二种干化合物。

一级方程式赛车可以被公式化为马尔可夫决策过程(MDP ),其中从一个状态转移到另一个状态的概率仅取决于最后观察到的状态。在第 11 圈,我们需要为下一圈做的就是我们在第 11 圈观察到的情况(第 1 圈到第 10 圈变得不那么重要了)。

“鉴于现在,未来独立于过去.”

规划比赛中接下来几圈的策略可能需要一个完美的环境模型,其中我们确切地知道在状态 s 时采取行动 a 会得到什么回报,以及在行动 a 下从状态 s 转换到状态 s’的概率。但实际上,完美的环境模型很难获得,比赛期间发生的许多事件可能是随机的。想想奖励是如何依赖于其他赛车的行为,单圈时间和车手位置的不断变化。所以,我们不能使用像动态编程这样的方法。根据定义,状态值 V(s)是处于状态 s 并遵循向前发展的策略所估计的累积奖励。动态编程是一种迭代方法,依赖于这些状态值的全宽度备份。当可能状态的数量太大时,就像 f1 赛车的情况一样,成本太高。

出于这些原因,我们将依靠无模型强化学习,其主要思想是从一个状态中采样特定轨迹,通过与环境的交互来评估试错设置中的动作。

设计一级方程式赛车模拟器

最先进的强化学习通常在雅达利、国际象棋或围棋等经典游戏中演示。这些是完全可以观察到的环境,我们喜欢研究它们,因为它们可以用简单的规则来表达。它们还允许轻松地将人工智能性能与人类水平的性能进行对比。

然而,一级方程式赛车是一个现实世界的问题。这是一个不完全信息博弈,因为部分可观察。主要的挑战在于建立一个能尊重游戏逻辑和复杂规则的模拟器。

我们之前讨论了一系列可能的行动(进站和轮胎胶料)和环境状态(我们在电视上看到的信息)。这些信息可以通过 F1 转播中心和像 SBG 体育软件这样的平台提供给所有车队。我们将使用熊猫数据帧来表示环境中的每个状态。还包括进一步的信息,例如汽车的潜在步速[potential_pace]和指示第二干化合物是否已经被使用的标记[second_dry]。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

f1 比赛环境中的状态示例

潜在速度是对自由空气中未被其他汽车阻挡时汽车速度的估计。它是用一个特定的函数计算出来的,考虑到了燃油质量、轮胎成分和轮胎的使用年限。

每一圈都是环境中的一个新的步骤,引入了可观察到的测量(速度、轮胎年龄、间隔等)的变化。)并能导致新的驱动程序排名。代理决定一次只对一辆车的策略。在环境中的每一步之后,奖励被计算为特定汽车获得或失去的位置的数量。

计算步长所需的一些重要工具是超越模型。这个模型为每个驾驶员提供了超车的可能性。它考虑了与前方车手的间隔、前方车手的潜在速度、相关车手的潜在速度以及一个表示赛道超车难度的参数。另一个重要的工具是花在进站上的时间,这可以从过去的比赛中学到,也可以在周末估计,这对停站后赛车的最终位置有很大的影响。

Open AI Gym 是一个开源框架,为构建和实现定制环境提供了重要帮助。建立一个能够很好地模拟 f1 比赛动态的强化学习环境是非常重要和具有挑战性的。这需要对这项运动有深刻的理解,并在编码和测试实现方面付出很多努力。为了开发和评估这种方法,我们决定像摩纳哥大奖赛一样对模拟器进行参数化,这是一条众所周知超车困难的赛道。我们使用了摩纳哥 2019 的排位赛结果来初始化发车区,并为这场特殊的比赛训练系统。

设计代理(深度 Q 网络)

在实现了环境之后,我们需要设计一个负责在每一圈推荐进站决定的代理。当与一辆特定的汽车相关联时,代理人有一个最终目标,那就是最大化该汽车可以获得的总回报。请记住,总奖励是指在整个比赛中获得或失去的名次。

Q-learning 是强化学习中使用的技术之一,用于寻找代理应该根据其调整其行为的最佳策略。对于每个州来说,通过采取特定的行动并持续遵循该政策,可以估计出总的回报。从(状态,动作)对获得的总回报被称为 Q 值。如果我们可以估计每个(状态,动作)对的 Q 值,代理将在每个状态下通过决定具有最大估计 Q 值的动作来优化行为,从而最大化总回报。

因为 Formula1 race 中可能状态的空间是无限的,所以我们无法将所有状态存储在内存中,也无法计算每个(状态、动作)组合的 Q 值。我们需要一个神经网络来逼近 Q 值函数。通常,它被称为深度 Q 网络(DQN),这个想法首先由 DeepMind 用于建立一个人工智能系统,能够比最好的人类专家更好地玩雅达利游戏。如果没有这种方法,保持计算和内存效率将变得非常困难,特别是在像 f1 赛车这样的情况下,它具有连续和高基数的特征空间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

深度 Q 网络

我们在 TensorFlow 中实现了一个密集神经网络。它将环境状态的矢量化表示作为输入,并输出每个动作的估计 Q 值。下一步行动由该网络的最大输出决定。

与简单的 Q 学习相比,有两个主要的想法使这种方法稳定:经验重放和固定的 Q 目标。

**体验回放:**我们将代理的体验(状态、动作、奖励、下一个状态)存储在回放存储器中,以便我们可以随机抽样成批的转换,并将它们用作训练数据。应用这种技术的主要优点是它稳定了 Q 学习方法,因为它去相关轨迹并使用神经网络的有效更新。通常在文献中,建议使用大小约为 1M 跃迁的重放存储器。然而,这个用例的最佳结果是通过使用约 15000 个转换的重放存储器的缩减尺寸和 32 个转换的批量尺寸获得的。这迫使网络在短时间内频繁且更快地从每个转变中学习,直到它明确地从重放存储器中消失,并被通过遵循改进的策略采样的新的看不见的转变所取代。

**固定 Q 目标:**通过使用目标网络获得用于训练该模型的目标值,该目标网络是主要行为网络的过去版本。我们在小批量学习过程中的一定数量的步骤中保持这个目标网络冻结,并教导行为网络估计这些冻结目标的 Q 值。通过选择正确的步数,然后我们更新目标网络~760 步,我们可以实现稳定的训练。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

q-估计量 MSE 损失

优化的目标是最小化使用目标网络生成的目标值和使用行为网络生成的估计值之间的 MSE 损失。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可能认为网络将学习它自己的预测,但是因为回报 r 是无偏的真实回报,所以网络将使用反向传播来更新它的权重,以最终收敛到最优 Q 值。

在下面的例子中,我们可以观察应用于 Pierre Gasly 的汽车(气体)的 Q 网络的行为。它估计了给定状态(第 3 圈)和所有可能动作(动作 0:软坑,动作 1:中坑,动作 2:硬坑,动作 3:继续)的每个组合的总奖励。代理人估计,如果实施行动 3(继续),到比赛结束时,总奖励为+0.69 个名次。因为这个 Q 值是最高的结果,所以它将推荐动作 3 作为该特定状态的决定。根据下面估计的 Q 值列表,如果加斯利在那一圈为软化合物进站,这将使他在比赛结束时面临失去 3 个位置的风险。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

多代理设置中的培训

2017 年,DeepMind 推出了 AlphaGo Zero ,这是一种强化学习算法,它在没有看到任何先前人类下棋的情况下,学会了掌握围棋的游戏。该系统开始时不知道任何技术,只通过玩自己来学习提高能力。这个想法的本质是,为了击败人类水平的性能,人工智能系统不应该受到人类知识限制的约束。

以此类推,我们可以将一级方程式赛车视为一场涉及 20 辆汽车的多人游戏,其中每辆汽车都试图在比赛结束时最大化自己的排名,并击败其他对手。如果所有其他参与者都修正了他们的策略,那么最佳对策就是针对这些策略的最优策略。因此,朝着纳什均衡优化系统是有趣的,纳什均衡是所有参与者的联合策略,使得每个参与者的策略都是最佳对策。最佳对策是解决单个代理人的 RL 问题,其中其他参与者成为环境的一部分。我们通过生成 RL 体验来填充重放存储器,其中代理正在播放其自身的旧版本。除了行为网络和目标网络之外,我们决定使用第三个网络,负责在针对特定汽车进行优化时为其他汽车做出决策。就像目标网络一样,这个对手网络是行为网络的过去版本,但是更新频率比目标网络低 10 倍(每~7600 步)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

奖励 15000 集(纳什均衡)

当训练系统与自己进行 15000 场比赛时,我们可以注意到向纳什均衡的收敛,因为对于不同的赛车和比赛轨迹,每集获得的总奖励在零附近波动。在这个过程中,该系统正在学习设计一个比赛策略,并通过自我发挥来提高自己的能力!

该图显示了在学习过程的早期阶段,系统在每圈为每辆车做出的决定。我们可以看到,这是太频繁的点蚀,这不是一级方程式中的常识,因为浪费了太多的时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,下面的图表准确地显示了系统如何学习它应该更经常地继续和优化轮胎的使用。对于每一集,我们计算除了前两圈(用于环境初始化)之外的每一个动作的圈数。请注意,系统正在学习如何增加继续决策的频率(动作 3),以及与其他更快的复合(中复合和软复合)相比,如何更少地使用硬复合(动作 2)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在多智能体训练过程之外评估最终系统的一个好方法是将它用于一辆特定的汽车,并让它与应用于其他汽车的旧版本进行竞争。我们将使用训练了 15000 集的代理作为佩雷斯(PER)的控制代理,并使用只训练了 12000 集(80%)的同一代理来决定所有其他汽车的对手策略。知道佩雷斯在第 16 位开始了摩纳哥 2019 比赛,有趣的是看到他如何在比赛结束时按照最新的代理人行为政策获得+1 位。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于最优代理的 PER 竞争模拟

在这种情况下,我们将代理的性能与它自己的老版本进行比较,老版本看起来也是一个强大的战略家。注意对手策略系统是如何学会为许多没有先验知识的驾驶员决定一站式策略的。它根据自己控制的每辆赛车的具体情况来决定进站圈和轮胎的选择,并设法保持车手的位置,作为纳什均衡的一部分。

对于莱科宁(RAI)来说,它决定在最快的软胎上进行两次冲刺,然后在比赛结束时停在硬胎上。这最后一次进站的原因是为了遵守在同一场比赛中使用两种不同干化合物的规则。它清楚地展示了智能体在自主学习游戏规则的同时优化其决策的能力。

更有趣的是,在与真实的比赛事件进行交互时,将代理的性能与 f1 车队决定的预定义策略进行比较。

摘要

在这项工作中,我们引入了一种深度强化学习方法,这种方法具有在比赛期间实时优化 f1 比赛策略的优势。该解决方案与经典模拟方法有一些显著的不同:

  • 比赛前采样的蒙特卡洛模拟不适应比赛期间发生的事件的现实,并且它们不能保证找到最佳策略。介绍的方法收敛到一个最佳的政策,并可以在比赛中的每一个特定圈应用,以决定最佳的可能行动。
  • 通过神经网络和函数逼近,我们大大降低了估计环境中极大量可能(状态、动作)对的值所需的计算和存储复杂性。不像传统的蒙特卡罗方法只在小的和有限的 MDP 上工作,这种方法具有可伸缩性的优点。
  • 由神经网络组成的代理被训练成在没有预先假设的情况下跨越许多代表环境状态的特征。这可能有助于了解人类难以识别的非常复杂的种族动态模式。
  • 通过一个单一的神经网络,我们可以为网格上的任何驾驶员定义一个最佳策略。这提供了控制同一个车队的两位车手和评估由比赛决定的所有行动的可能性。

RL 令人兴奋的是,该系统并不主要依赖历史数据来改善决策。它通过与环境的互动直接学习。令人惊讶的是,对于许多现实世界的应用程序来说,与环境交互是可能的。我们定义了一组行动,观察空间,并集中精力设计最方便的回报函数。一级方程式赛车策略的人工智能框架可以通过考虑安全车的概率和可能改变比赛进程的天气条件来增强。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值