TowardsDataScience 2023 博客中文翻译(四十二)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

拟人化 AI:人类在错误的地方寻找同理心

原文:towardsdatascience.com/anthropomorphizing-ai-humans-looking-for-empathy-in-all-the-wrong-places-a846021b5504

我们是否应该暂停通过图灵测试的竞赛?数据质量是否已经赶上了大型语言模型(LLMs)?我们是否被设计成容易受骗?

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

·发表于 Towards Data Science ·8 分钟阅读·2023 年 8 月 2 日

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

作者(非 MIT 员工)拍摄的照片,摄于 2023 年 7 月的 MIT 博物馆

对于那些不熟悉“图灵测试”的人来说,它是一个测试机器是否能够展示出与人类无差别的智能行为的测试。随着专家们认为 AI 技术现在距离达到这一目标只有十年或二十年,专家和非专家们已经开始担心技术是否已经超越了我们社会和人性的承受能力。

对某些人来说,智能行为可能意味着语言智能(语言、推理和问题解决),而对其他人来说,全面的人类智能还包括情感智能(感知、理解和管理情感)。强大的“算法智能”或“生成性 AI”可以模仿语言智能。然而,这些智能机器也会明确告诉你(如果你像我一样问它们)它们没有情感智能

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

GPT 回应的文字图像参考了上述链接。

过去几个世纪以来,人们一直给他们的工具起人类的名字,并赋予无生命的物体人类特征。这种行为被称为拟人化。我们把船只或汽车以配偶的名字命名,或者把游泳池清洁器叫做“鲨鱼”,把地板机器人叫做“吃豆人”。给物体起绰号可以为我们与工具的互动带来一些乐趣。在这种互动风格中,人们有意识地和有心地拟人化工具,而不是像对待人类一样真正地与物体或工具互动。作为社会动物,人类迅速尝试判断某人是“朋友还是敌人”、他们在等级中的位置,以及他们是否可能成为合适的伴侣。

挑战在于,当技术公司为了改善与其软件工具的互动而试图实现用户的***“无意识或机械的拟人化”***时,他们可能会通过添加人类名字或人脸图像、对话提示、非正式语言等手段来实现。作为人类,我们从聊天机器人那里感受到最大的“社会存在感”,当互动不仅仅是文字,还包括音频、视频或头像时。为了满足我们强烈的社会关系需求,我们人类还会将情感、道德、礼貌和可信赖等人类特质归于互动 AI 代理。在2021 年的一项研究中,学生们认为一个有名字的 AI 助手更值得信赖,仅仅因为他们被介绍为专家而非通才,而不是任何自然的技术工具信任倾向。如果不给机器人一个与性别相关的名字,我们会通过其使用更多脏话或攻击性语言来推测技术工具的性别。我们会看到“温暖”和“个性”,并推测机器人是快乐的即使它们只是在与其他机器人互动

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

作者提供的图片

作为一个深入技术堆栈的人,你可能会认为“我的代码并没有拟人化,我只是调用 API”或“我的模型在数据质量允许的情况下尽可能好地工作”,但这种信心水平是否会上升到类似“你希望我做个随意的猜测吗?”的回复?如果作为人类,我们中的许多人倾向于信任,当我们在 TikTok 上冲动购买那个迷你华夫饼机时风险可能较低,但当被要求分享私人、个人数据时呢?

作为个体,我们的看法从将语音助手视为信息来源,到娱乐提供者,再到行政助理或伙伴或朋友,当我们确实将 AI 工具视为朋友时,我们事后会坚持说我们没有。我们在不存在的地方寻求同情和情感,并可能受到影响去寻求这些及其他人类特征,只要有适当的提示。

尽管寻求与非人类建立社会关系可能是人类的天性,但并非所有人都喜欢与聊天机器人或机器人互动。我们欣赏人工智能带来的准确性提升和时间节省的好处,但当聊天机器人或机器人试图表现得像人类时,我们仍会感到疲惫。正如一位研究人员所言,“人类在与机器人在社交空间互动时,可能会觉得在机器人身上投射人类特质是认知上的负担”。

当涉及到我们的健康和教育时,我们可能会犹豫是否与聊天机器人或机器人分享或信任信息。

  • 在一项2019 年的研究中,作者得出结论:当涉及到健康问题时,人们对于人工智能的使用表现出更多抵触,原因是“独特性忽视”——人们需要感觉自己的健康与他人不同。即使人工智能驱动的提供者的建议比人类医疗提供者显著更好,人们也倾向于选择人际互动,而不是利用技术工具。人类被认为比机器算法更可能验证患者对独特性的自我认知。就像《小熊维尼》中的“Tigger”——我们喜欢认为自己是“唯一的”。

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

Tigger 看着镜中的自己(图片来自书籍——现已成为公有领域)

  • 在教育中,大学生们在一次商业沟通课程中参与了一个实验,其中的答案由一个远程呈现机器人提供。第一次实验中,“老师作为机器人”情况下,一个人类讲师的脸被投射在机器人屏幕上;第二次实验中,“机器人作为老师”情况下,一个动画虚拟机器人被展示在屏幕上。当有机会评估“老师作为机器人”与“机器人作为老师”的可信度时,学生们认为两者都可信,但他们更倾向于认为“老师作为机器人”更具可信度,并据此采取教师的指示。 聪明的学生们!去年(2022 年)发表的Truthful QA 文章发现,经过一系列问题测试,最好的 LLM 模型在 58%的时间内表现为“真实”,而人类在 94%的问题上表现为“诚实”。尽管最大模型在回答问题时更具能力,但它们“通常最不真实”。值得注意的是,被评判为“真实”的答案可以是“No comment”或“I don’t know”。

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

iRobot Ava 500,一款自主漫游的远程呈现机器人——远程呈现机器人 Z22 的一个例子,CC BY-SA 3.0 <creativecommons.org/licenses/by-sa/3.0>, 通过 Wikimedia Commons

虽然有些人可能觉得与“智能机器”的互动不尽如人意,但其他人更喜欢与拟人化聊天机器人互动:如社交恐惧症患者。在一项2021 年的研究中,具有各种社交恐惧症的个体比那些社交能力较强的同龄人更喜欢拟人化聊天机器人。

巧合的是,就在 GPT-4 发布两个月后,美国公共卫生总署发布了一份关于我们的“孤独和隔离流行病”的公告。推荐列表中的第四项是:

4. 改革数字环境: 我们必须批判性地评估我们与技术的关系,确保我们数字互动的方式不会影响与他人的有意义和疗愈性联系

我们应该如何确保我们的数字互动“不影响与他人的有意义和疗愈性联系”?我们如何能更好地帮助那些寻求同理心和联系的人,使他们更愿意与人类聊天,而不是与虚拟助手聊天?我们如何才能找到真正的朋友和联系,而不是将机器人视为朋友:那些没有情感、经常“毫不犹豫地撒谎”的朋友?

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

图片由作者提供(文本摘自 TruthfulQA)

我们确实需要仔细考虑将技术工具拟人化的努力。我们需要提供更明确的线索,以便区分某人是否在与人类互动。我们需要为我们的技术工具制定一致的伦理标准。我们需要对真实内容进行水印和指纹标记。最后,如果我们真的希望拥有更多“智能工具”,我们可能希望它们表现得更智能。一些研究人员认为,聊天机器人或机器人应告诉我们它们是否在思考,无论是明显地还是仅仅以沉默的方式。我们可能希望它们不仅在互动中“快速思考”和“迅速回应”,即图中的系统 1,还能“慢速思考”,即图中的系统 2。

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

从结合快速和慢速思维来实现类人且高效的约束环境导航

在这个人类认知理论中,系统 1 提供了不精确、快速且常常“无意识”的回复方法,其中决策仅基于过去的数据,错误可能源于内在的偏见。系统 1 中的决策是在没有推理的情况下做出的:采取反应性或冲动的行动。系统 2 激活了更合理且通常更准确的推理机制。系统 2 在响应时施加了“等待时间”。系统 2 的响应可能并不总是更准确或更细致(许多专家的回答也是如此),但它更经过深思熟虑。

将这一理论应用于“智能代理”时,这意味着一个等待回复的人将有更多时间思考和准备评估回复,并认识到他们不是在与像自己一样的人互动,而是与一台机器互动。这种“思考时间”将允许执行安全、准确性和偏见规则。系统 1 可以用于不重要的事情,而系统 2 则用于真正重要的事情。

如果聊天机器人通过等待回应显得不那么“温暖友好”,而更显得“有能力和准确”,这会有问题吗?也许会,但我们作为人类是否希望我们的机器人看起来像人类,还是更希望它们简单地有用、帮助我们解决问题,提供不需要同情或情感的解决方案,并且比人类更快或更准确?

当我们观察 AI 公司领导者、政府机构和学者辩论人类必须做些什么以区分人类和人工智能以及所需的护栏时,重要的是要记住我们天然的人际联系和关系的倾向,以及人工智能工具开发进展对我们人性的潜在影响。作为这些公司当前或潜在的客户,我们有责任明确表达我们的担忧,这些公司已经从类似于“不作恶”的口号转变为“公开报告模型或系统能力、限制及适当和不适当使用的领域,包括讨论社会风险,如对公平性和偏见的影响”。如果我们没有明确我们认为应该划定的界限,那么这个界限将会为我们划定。

随着人工智能技术的不断进步,我们需要思考是否继续沿着现在的路径前进会导致我们生活在一个“逆图灵测试”的世界中。在这样一个世界里,我们更关心的不是是否可以信任人工智能,而是人工智能是否可以信任我们。在这样的世界里,人工智能工具会问我们***“你确定你真的人类吗?”***,然后要求我们提供虹膜扫描作为潜在情感和同理心脆弱性的证明。我们这些在产品中应用人工智能,特别是自然语言处理或大型语言模型的工作者,需要问自己以及我们的同事和朋友一个问题:“我们正在做的事情是为了人类的利益,还是在操控人性中最好的部分?”

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

标题:照片由Victor Freitas提供,发布在Unsplash

Apache Spark MLlib 与 Scikit-learn:构建机器学习流水线

原文:towardsdatascience.com/apache-spark-mllib-vs-scikit-learn-building-machine-learning-pipelines-be49ecc69a82?source=collection_archive---------2-----------------------#2023-03-09

ML 流水线的代码实现:从原始数据到预测

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

·

关注 发布于 Towards Data Science · 8 分钟阅读 · 2023 年 3 月 9 日

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

图片由 Rodion Kutsaiev 提供,来源于 Unsplash

真实的机器学习涉及一系列准备数据的任务,然后才是神奇的预测。填充缺失值、对分类特征进行独热编码、对数值特征进行标准化和缩放、特征提取和模型拟合只是机器学习项目中进行预测之前的一些阶段。在处理 NLP 应用时,过程更加深入,包括词干提取、词形还原、停用词移除、分词、向量化和词性标注(POS 标注)等阶段。

完全可以使用像 Pandas 和 NumPy 或 NLTK 和 SpaCy 这样的库来执行这些步骤。问题在于,当模型投入生产时,团队成员之间的代码一致性可能会丧失,并且在没有操作特别设计的框架时,代码中的人为错误几率更高。这就是为什么 ML 团队倾向于使用称为Pipelines的高级 API,这些 API 特别设计用于将所有阶段链接为一个对象。

本文将介绍如何使用两大主要库:Apache Spark 的 MLLib 和 Scikit-learn,实现 ML Pipelines。由于智能的 NumPy 矢量化执行,Scikit-learn 在仅使用 CPU 时表现出色,这些执行方式对 CPU 缓存行友好,并且高效利用了 CPU 的可用核心。尽管在大数据背景下,Apache Spark 的 MLLib 由于其适合分布式计算,通常会优于 scikit-learn,因为它设计用于在 Spark 上运行。

包含10 个欧洲城市的 Airbnb 房源数据集¹将被用于在 scikit-learn 和 MLLib 中创建相同的 Pipeline。该 Pipeline 将在应用随机森林回归器生成房源价格预测之前,在预处理阶段操作数值和分类特征。这些特征及其各自的数据类型如下:

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

图 1 — 特征和数据类型。来源:作者。

首先,让我们加载数据集。由于价格在周末和工作日之间变化很大,因此有一个包含各城市工作日和周末房源数据的 csv 文件。因此,为了简化我们的工作,可以将所有数据集整合到一个数据框中,并创建“city”和“weekday_or_weekend”特征,这些特征对于模型来说肯定是必不可少的。

必须通过选择浮点数列并使用 pop 方法将第一个特征 realSum(即房源价格和我们的目标特征)排除,来将数值特征分组到一个列表中。multi 和 biz 特征采用 1/0 编码,scikit-learn 允许我们将它们作为布尔类型输入到模型中,因此我们将对它们进行转换。最后,我们通过选择布尔型和对象型数据列来创建分类特征列表。

然后我们可以导入 Scikit-learn 库中所有必要的类。有一个叫做 ColumnTransformer 的类,它会在数据框的列中应用变换器。数值变换器将是标准缩放器,而分类特征将使用传统的一热编码。在调用 Column Transformer 时,之前创建的列表将分配给每个变换器,可以将它们与随机森林回归器一起加入到管道中。就这样。当处理管道时,特征操作过程变得更加流畅和有序,如下面这段简单但操作密集的代码所示。

最后,我们可以将管道拟合到训练数据集,并预测测试数据集房源的价格,就像处理其他模型一样。管道的平均绝对误差为 67 欧元,考虑到我们没有应用任何异常值处理技术,只创建了两个新特征,并仅设置了随机森林回归器的最大深度和估算器数量参数,这还留有超参数调整的空间。

现在我们已经成功创建并应用了 scikit-learn 的管道,让我们用 Apache Spark 的 MLLib 库做同样的事情。为此,我使用了 Databricks,这是一个由 Spark 的创始人创建的云数据平台,用于部署先进的机器学习项目。显然,它运行在 Apache Spark 上,这使其成为处理大数据环境的正确选择,因为 Spark 具有大规模分布式计算的属性。Databricks 提供了一个 社区版,托管在 AWS 上,免费提供给用户访问一个微型集群,并使用 Python 或 Scala 在 Spark 上编写代码。我强烈推荐它来提高 Spark 和 Databricks 技能,尽管免费微型集群只有 15 GB 的可用内存,这限制了现实生活中的大数据应用。

在 Databricks 上做的第一件事是创建一个集群,这是一组计算资源和配置,我们将在其上运行我们的管道。可以通过点击左上角菜单中的 create -> cluster 来完成。集群已经启动了 Spark,并安装了所有必需的机器学习库,甚至可以导入其他必要的库。唯一的限制是有限的内存、2 个 CPU 核心以及集群在两小时空闲后自动终止。

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

图 2— 启动 Databricks 集群。来源:作者。

Databricks 还具有一个表上传的用户界面(UI),可以通过在左上菜单中选择 create -> table 来访问。在数据加载 UI 中,可以轻松将 csv 文件加载到 Delta Lake 表中,并操作一些表的属性,如推断模式、选择数据类型以及将第一行提升为表头。因此,让我们加载我们在 scikit-learn 管道中创建的数据框的 csv 文件。

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

图 3 — 使用 Databricks 数据加载 UI 加载 csv 文件。来源:作者。

现在集群已创建且数据已整理好,我们可以通过在用于集群和表设置的相同左上菜单中创建笔记本来开始使用。Spark 的 read.csv 函数还允许我们将第一行定义为表头并推断数据模式,我们只需使用表的目录来加载数据框并删除索引列。

现在是了解 MLLib 的时候了。为了重现第一部分中构建的管道,我们必须从 feature 类中加载 OneHotEncoder、StandardScaler、VectorAssembler 和 StringIndexer 函数,从回归类中加载 RandomForestRegressor,从同名类中加载 Pipeline。与 scikit-learn 不同,MLLib 不允许在操作中使用布尔列,因此我们必须先将其转换为整数。另一个不同之处是,对于类别列,我们必须在进行 one hot 编码之前添加字符串索引阶段,因为 MLLib 的 OHE 函数 仅使用类别索引作为输入,而不是字符串或布尔值。

在 MLLib 上构建管道时,一个好的实践是编写输入和输出列的名称,以跟踪特征,因为与 scikit-learn 的 Column Transformer 不同,变换不会发生在输入列本身,而是将新列添加到现有数据框中。

两个管道之间的最终差异是变换的顺序。在 scikit-learn 中,类别和数值变换在管道的预处理阶段并行进行,而在 MLLib 中,我们首先应用 one hot 编码器,然后使用 VectorAssembler 将所有特征合并到一个向量中,最后在随机森林回归之前应用 StandardScaler 函数。因此,与预处理阶段和回归阶段不同,所有的预处理步骤都按顺序添加到管道中,然后进行回归。

管道完成后,只需三行代码即可将数据拆分为训练集和测试集,将模型拟合到训练集上,并对测试集进行价格预测。在 MLlib 中,RegressionEvaluator 函数用于评估模型,并包含所有回归固有的评估指标(也有用于分类模型评估的函数)。与第一个管道一样,平均误差将被用作评估指标。

不出意料,平均误差与第一个管道几乎完全一致。

总结一下,我们展示了 ML 管道如何简化模型实现过程中的编码,使其更清晰、更快捷,通过在模型训练过程中改进代码的可读性,提供了逻辑流的变换。管道对于涉及大量数据和多位数据科学团队成员的 ML 项目至关重要。

在编码实现过程中,我们看到 Scikit-learn 在管道创建流程中相对于 Apache Spark 的 MLlib 有一些小优势。ColumnTransformer 函数能够在一行代码中转换分类和数值特征,这减少了与 MLlib 相比的 Pipeline 阶段。此外,有人可能会说,你无法在 MLlib 上复制一个复杂的 scikit-learn 管道,这可能是因为 scikit-learn 的函数相比 MLlib 更加深奥。

尽管如此,MLlib 通过使用 Spark 的分布式处理来处理大数据集,从而扩展项目的能力也非常宝贵。此外,选择哪个管道高度依赖于项目的上下文。例如,当在 Databricks 中工作时,可能通过平台内的 Delta Lake 访问数据,在这种情况下,使用 MLlib 运行管道可能是更好的选择。甚至可以将两个世界结合起来,仅将 MLlib 管道作为数据工程工具来准备数据,并考虑到大型数据集,这是明智的选择,然后使用 scikit-learn 进行建模、训练和评估。

希望你了解(或复习)机器学习项目中管道的重要性,以及 scikit-learn 和 MLlib 管道之间的差异。虽然构建它们可能需要一些时间,但从长远来看,良好的组织会带来多方面的回报。

[1] Gyódi, Kristóf, & Nawaro, Łukasz. (2021). 《欧洲城市 Airbnb 价格的决定因素:一种空间计量经济学方法》(补充材料)[数据集]。Zenodo. doi.org/10.5281/zenodo.4446043。CC BY 4.0 许可证。

Apache Spark 优化技术

原文:towardsdatascience.com/apache-spark-optimization-techniques-fa7f20a9a2cf

对一些最常见的 Spark 性能问题及其解决方案的回顾

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

·发表于数据科学之路 ·阅读时间 5 分钟·2023 年 1 月 11 日

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

图片由Manuel Nägeli提供,来源于Unsplash

介绍

Apache Spark 目前是业内最受欢迎的大数据技术之一,由 Databricks 和 Palantir 等公司支持。

数据工程师在使用 Spark 时的一个关键职责是编写高度优化的代码,以充分利用 Spark 的分布式计算能力(图 1)。

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

图 1:Apache Spark 架构(图片由作者提供)。

在本文中,你将了解在使用 Spark 时一些常见的性能问题(例如 5 Ss)以及如何解决这些问题。如果你对 Apache Spark 完全陌生,可以在我的上一篇文章中找到更多信息。

5 Ss

5 Ss(Spill、Skew、Shuffle、Storage、Serialization)是 Spark 中 5 个最常见的性能问题。提高 Spark 性能的两个关键通用方法是:

  • 减少摄取的数据量。

  • 减少 Spark 读取数据的时间(例如,使用磁盘分区/ Z Order 聚类的谓词下推)。

我们将深入探讨与 5 Ss 相关的每一个问题。

Spill

Spill 是由于内存不足时将临时文件写入磁盘造成的(一个分区过大无法容纳在 RAM 中)。在这种情况下,RDD 首先从 RAM 移动到磁盘,然后再移回 RAM,以避免内存溢出(OOM)错误。磁盘读写虽然可能很昂贵,因此应尽可能避免。

通过检查 Spark UI 中的 溢出(内存)溢出(磁盘) 值,可以更好地理解溢出问题。

  • 溢出(内存):溢出分区在内存中的数据大小。

  • 溢出(磁盘):溢出分区在磁盘上的数据大小。

为了缓解溢出,有两种可能的方法:一是为每个工作节点实例化更多内存的集群,二是增加分区数量(从而使现有分区变小)。

偏斜

使用 Spark 时,数据通常以 128 MB 的均匀分布分区进行读取。对数据应用不同的变换可能导致一些分区变得比平均值大得多或小得多。

偏斜是不同分区之间大小不均衡的结果。少量偏斜可能是可以接受的,但在某些情况下,偏斜可能导致溢出和内存溢出错误。

减少偏斜的两种可能方法是(见图 2):

  • 用随机数对偏斜的列进行盐化,以重新分配分区大小。

  • 使用自适应查询执行(Spark 3)。

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

图 2:偏斜前后分区大小分布(作者提供的图像)。

洗牌

洗牌是指在执行宽变换(例如连接、分组等)或某些动作(如计数)时在执行器之间移动数据(见图 3)。处理不当的洗牌问题可能导致偏斜。

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

图 3:洗牌过程(作者提供的图像)。

为了减少洗牌量,可以使用以下方法:

  • 实例化更少且更大的工作节点(从而减少网络 IO 开销)。

  • 在洗牌前对数据进行预筛选,以减少其大小。

  • 对涉及的数据集进行反规范化。

  • 优先使用固态硬盘而非硬盘驱动器,以实现更快的执行速度。

  • 在处理小表时,对较小的表进行广播哈希连接。对于大表,则使用排序合并连接(广播哈希连接在大表中可能导致内存溢出问题)。

存储

存储问题出现在数据以非最佳方式存储在磁盘上。与存储相关的问题可能会导致过度洗牌。与存储相关的三个主要问题是:小文件、扫描和模式。

  • 小文件: 处理小于 128 MB 的分区文件。

  • 扫描: 在扫描目录时,我们可能会遇到单个目录中有大量文件,或者在高度分区的数据集中有多个层级的文件夹。为了减少扫描量,我们可以将其注册为表。

  • 模式: 根据所使用的文件格式,可能会有不同的模式问题。例如,使用 JSON 和 CSV 时,需要读取全部数据以推断数据类型。对于 Parquet,只需读取一个文件,但如果需要处理可能的模式变化,必须读取所有 Parquet 文件。为了提高性能,提前提供模式定义可能会有所帮助。

序列化

序列化包括所有与代码在集群中分发相关的问题(代码被序列化,发送到执行器,然后反序列化)。

在 Python 的情况下,这个过程可能会更复杂,因为代码必须被 pickle 化,并且需要为每个执行器分配一个 Python 解释器实例。

在与遗留系统(例如 Hadoop)、第三方库和自定义框架集成时,可能会出现序列化问题。我们可以采取的一个关键方法是避免使用 UDF 或 Vectorized UDF(它们对于 Catalyst Optimizer 来说像一个黑匣子)。

结论

即使在最新的 Apache Spark 3 发布版中,Spark 优化仍然是从业人员的专业知识和领域知识至关重要的核心领域之一,以便成功地最大限度地利用 Spark 的能力。作为本文的一部分,涵盖了一些在 Spark 项目中可能遇到的关键问题,尽管这些问题在某些情况下可能高度相关,从而使得追踪主要根本原因变得困难。

联系方式

如果你想随时了解我的最新文章和项目,请 关注我在 Medium 上 并订阅我的 邮件列表。以下是我的一些联系方式:

API 101:后端的秘密通道

原文:towardsdatascience.com/api-101-backdoor-to-backend-8da989e1551c?source=collection_archive---------10-----------------------#2023-01-23

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

图片由 Lala Azizli 提供,来源于 Unsplash

快速深入 API 的世界,以及 API 如何驱动应用

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

·

关注 发布在 数据科学前沿 ·11 分钟阅读·2023 年 1 月 23 日

tl;dr — 这是对 API、应用开发以及后端开发理论的非常详细的介绍。可以作为这些主题的教育材料使用。

在这个数字时代,我们被各种应用包围,几乎依赖它们来满足我们几乎所有的日常需求。

你起床时最喜欢做的第一件事是阅读新闻,了解全球发生的事情吗?好吧,有像 Google NewsInshorts 这样的新闻应用程序。迟到了,想叫辆出租车去工作?你可以通过 Uber 应用程序快速在家门口叫到一辆!饿了但不想做饭?只需拿起手机,舒适地从家里订购食品,无需提着沉重的购物袋和在商店里徘徊。

那么,我们为什么要讨论这个?关键是今天我们有这些非常方便的应用程序,可以为我们做几乎所有事情。但这是从用户的角度来看。 对于软件开发者来说,情况要复杂得多。

虽然对于用户而言过于简化,但这样的应用程序对开发者来说可能相当复杂。因此,第一个出现的问题是—— 这些应用程序是如何制作的?

为了解答这个问题,我们可以看看 三层应用架构

三层应用架构

三层应用架构是一种成熟的软件开发架构,将软件分解为三个逻辑和物理计算层,即:

  • **展示层-**R 指的是客户端应用程序,即用户实际看到和交互的应用程序。

  • 应用层- 指的是处理所有业务逻辑的应用组件。

  • 数据层- 指的是存储和处理应用程序中所有数据的组件。

现在,这三个独立的组件协同工作,构成一个可用的应用程序。

  • 用户与客户端(也称为前端)应用程序进行交互,发出某种请求

  • 应用层 处理这个请求

  • 如果在处理此请求时 生成或更改了任何数据,这些数据将保存在数据层中。

  • 请求在后端处理后,会将响应发送到前端应用程序。

注意: 通常,应用层和数据层结合在一起被称为服务器端(或后端)应用程序。

但现在,另一个问题出现了。我们将在本指南中专门回答的问题是—— 不同应用层(更具体地说,前端和后端)是如何相互通信的?

嗯,这里就涉及到 API 的概念。

什么是 API?

API 是 应用程序编程接口 的缩写。顾名思义,它是一种接口。

更准确地说,API 允许跨平台和设备间的通信。

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

图片由作者提供

  • 软件到软件的通信: 之前我们讨论了应用程序如何被分解为客户端和服务器端组件。这些组件交换请求和数据响应。这种通信接口由 API 在后台提供支持。客户端向服务器发送 API 请求,服务器处理请求,然后将 API 响应返回给客户端。

  • 平台无关的通信: 由于 API 充当客户端和服务器之间的有效通信机制,这意味着客户端和服务器可以基于完全不同的技术栈,却能够协同工作。例如,你的前端应用程序可以用 JavaScript 编写,而你的后端可以用 Python 编写。API 通常具有一个标准化的请求和响应结构,几乎所有编程语言都支持。

  • 代码的重用性: API 促进了代码的重用。我们可以这样理解:Instagram 既有移动应用程序,也有网站。在 Instagram 的情况下,我们有两种客户端,但只有一个处理来自网页客户端和移动客户端请求的后端。这两个客户端都通过 API 向同一个后端服务器发送请求。因此,不需要为移动端和网页端分别实现后端。

现在我们对 API 有了初步了解,让我们深入探讨一下不同种类的 API。

API 的类型

基于提供的服务,API 主要有三种类型,分别如下:

  • 本地 API: 这些是操作系统(OS)API,提供诸如麦克风访问、相机访问或从数据库服务请求数据等服务。

  • 程序 API: 基于远程过程调用(RPC)技术,允许从另一服务器远程执行程序。简单来说,这些 API 只是允许在远程服务器或设备上执行脚本或程序。

  • Web API: Web API,也称为 Web 服务,允许应用程序或设备通过万维网进行通信,使用 HTTP 架构。

在构建涉及客户端-服务器架构的应用程序时,我们主要使用 Web API。

既然本文的重点是熟悉应用程序的构建方式,我们将专注于 Web API。

注意: Web API 还可以进一步细分为几个分类,如 SOAP(简单对象访问协议)、REST(表征状态转移)API 等。目前,世界上大多数应用程序主要使用 REST API 架构进行客户端-服务器交互,因为其实现简单。由于 REST 已成为行业标准,本文将讨论 REST API。

什么是 REST API?

REST 代表表现层状态转移,也称为 RESTful Web 服务。它是一种标准化的 API 架构,允许跨平台和设备间通过 HTTP 网络协议进行通信。

再简单一点,它允许两个应用程序组件互相交互。

典型的客户端-服务器交互主要包括四种操作:

  1. 创建:通过 API 请求执行的创建操作涉及在后端数据层上创建资源。例如,在 TODO 列表应用中,创建 API 请求可用于在数据库中创建一个 TODO 项。

  2. 读取:读取操作可用于从数据库中获取数据。根据客户端的请求和后端资源访问的实现,这些数据可以是某一类型的单个资源、一批单一类型的资源,或不同类型的资源集合。以同样的 TODO 应用为例,读取请求可以用于获取用户创建的所有 TODO。

  3. 更新:可以执行更新操作以更新数据层中特定资源相关的数据。在我们的 TODO 应用中,更新请求可用于更新 TODO 任务。

  4. 删除:顾名思义,删除操作用于删除资源。对于我们的 TODO 应用,删除请求可用于从 TODO 列表中删除 TODO 对象。

这些操作统称为CRUDCreate,Read,Update,Delete)操作。对于任何应用程序,这些都是用户可以执行的一些最基本的操作。

简单来说,当用户与应用程序交互时,他们要么在访问数据,要么数据正在被创建或操作。REST API 充当前端和后端之间的中介步骤,允许在应用程序中执行 CRUD 操作。

我们之前提到,由于 API 作为客户端和服务器之间的通信渠道实现,客户端和服务器可以使用完全不同的编程技术栈。然而,必须有一种标准化的,语言无关的机制,以便客户端和服务器可以通过 API 进行交互。为此,REST API 使用JSON基础的消息传递协议。

JSON 代表JavaScript 对象表示法。它是一种开放标准文件格式和数据交换格式,其具有可读性。数据通过 JSON 以键值对和数组格式传输。

下图演示了典型的客户端-服务器交互。

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

作者提供的图片

  • 客户端通过 HTTP 协议向服务器发送 API 请求。该请求采用 JSON 格式。

  • 服务器解析此 API 请求,处理请求,然后将 API 响应发送回客户端,该响应再次以 JSON 格式呈现。

  • 客户端可以解析 JSON 响应对象以进行呈现。

正如你所观察到的,由于中介通信通道是标准化的,因此客户端和服务器可以在平台和实现方面独立操作。也就是说,后端可以用一种编程语言(例如 Python)编写,前端可以用另一种(例如 JavaScript)编写,应用程序仍然可以正常工作。

另一个 REST API 的重要特征是它们是无状态的。这意味着从客户端到服务器的每个请求必须包含理解和完成请求所需的所有信息。后续请求不依赖于之前的请求。

至此,我们已经完成了关于 API 的一些理论概念以及 REST API 的特征。这一切将我们带到了最重要的部分。

API 请求是什么样的?

正如我们之前讨论的,REST API 调用是无状态的,这意味着每个 API 请求中,我们需要发送

  • 处理请求所需的所有数据。这些数据涉及要执行的操作类型,

  • 有关用户认证的信息,

  • 通过 API 访问的资源,

  • 以及可能需要处理请求的一些额外参数。

根据这些要求,REST API 请求可以分解为 4 个组件:

资源路径

这是通过 API 请求操作的资源路径。资源可以视为数据库中的对象或实体。资源路径是映射到数据库中的实体。继续以 TODO 应用为例。一个 API 端点可以用来获取用户所有 TODO 的列表。该端点的 URL 看起来像这样:https://mytodolist.com/todos/

这里,https://mytodolist.com 是网站的域名。/todos/ 是 TODO 对象的资源路径。

HTTP 动词

正如我们之前讨论的,API 请求必须指定打算执行的 CRUD 操作类型。为此,我们在 API 调用中指定一个 HTTP 动词。理解 HTTP 动词的最简单方法是它们是指示服务器对特定资源执行什么操作的“词”。

有许多预定义和标准化的 HTTP 动词,然而,最常用的如下所述。

  • POST: 用于创建资源对象

  • GET: 用于对资源执行读取操作

  • PUT: 用于执行更新操作

  • DELETE: 用于执行删除操作

请求体

请求体可以用来指定处理请求时可能需要的一些额外参数。例如,在我们的 TODO 应用中,为了创建一个 TODO 对象,我们必须指定任务。类似地,为了更新 TODO 对象,我们需要指定新的任务,这个任务将替换 TODO 列表中的原始任务,并提供要修改任务的 ID。在我们的 API 请求中,我们必须通过请求体发送这些信息。

一般来说,我们需要为 POST 和 PUT 请求指定请求体。GET 请求没有请求体。

注意: 请求体使用 JSON 格式将请求数据以键值对对象的形式发送。

请求头

虽然上述 3 个组件通常足以发出 REST API 请求,但有时我们需要在 API 请求中指定一些额外的细节。以用户认证为例。

在我们的 TODO 应用中,我们可能会有一堆用户,每个用户都有自己的 TODO 列表。我们必须确保首先,只有授权用户才能创建、读取、更新和删除 TODO。然后,我们还需要确保一个用户不能访问另一个用户的 TODO。为了保证这些要求,我们需要在 API 端点上实现某种形式的授权,以确定是否是授权用户在进行 API 请求,以及资源是否真正属于该用户。

尽管我们不会深入讨论认证策略,但仅为了信息传递,我们在请求头中发送认证信息,通常以唯一令牌的形式。

所有这些组件一起构成了一个 API 调用。

让我们看看一些使用 cURL 发出的示例 API 调用:

curl --request GET \
     --url https://realstonks.p.rapidapi.com/TSLA \
     --header 'X-RapidAPI-Host: realstonks.p.rapidapi.com' \
     --header 'X-RapidAPI-Key: 1ca406921amsh21f2341da9178c3p1a7dd9jsn5d319166bd10'

上述是一个 GET API 请求。我们使用 --request 标志来指定 HTTP 动词。--url 标志用于指定请求路径。然后使用 --header 标志来指定头部信息。

curl --request POST \
     --url https://hotel-price-aggregator.p.rapidapi.com/rates \
     --header 'X-RapidAPI-Host: hotel-price-aggregator.p.rapidapi.com' \
     --header 'X-RapidAPI-Key: 1ca406921amsh21f2341da9178c3p1a7dd9jsn5d319166bd10' \
     --header 'content-type: application/json' \
     --data '{
    "hotelId": "102061485",
    "checkIn": "2022-07-01",
    "checkOut": "2022-07-02"
}'

上述是一个 POST 请求,我们可以看到使用 --data 标志指定请求体的示例。

API 请求的实现可能因编程语言或工具而异。然而,API 请求的关键组件将保持不变,即 HTTP 动词、请求 URL 或请求路径、请求体和请求头部。

现在我们知道 API 请求是什么样的,API 请求-响应周期中仅剩下一个组件需要理解——API 响应。

API 响应是什么样的?

API 响应是后端在处理完 API 请求后返回给前端的响应。响应应告知客户端请求是否成功,如果成功,应返回请求的数据或适当的确认信息。如果请求不成功,客户端应接收到相关的错误信息。

根据这些要求,API 响应可以分为两个部分,如下所述。

响应体

响应体包含请求的数据(在 GET API 请求的情况下),或者在其他 API 请求类型中包含适当的确认消息。如果 API 请求失败,响应体将包含适当的失败消息,说明为什么 API 调用到服务器失败。

响应状态码

API 响应包含一个响应状态码,帮助客户端确定请求是成功还是失败。这些状态码已经为 HTTP 协议标准化,可以大致分为 5 类 — 1xx → 信息性,2xx → 成功,3xx → 重定向,4xx → 客户端错误,5xx → 服务器错误

一些常见的状态码如下所示。

  • 200 — 成功。请求成功。

  • 204 — 无内容。

  • 301 — 永久移动。

  • 400 — 错误请求。

  • 401 — 未经授权。

  • 403 — 禁止访问。

  • 404 — 未找到。

  • 500 — 内部服务器错误。

例如,我们之前发出的 GET API 请求的响应如下:

{
  "price": 141.98,
  "change_point": 8.56,
  "change_percentage": 6.42,
  "total_vol": "107.51M"
}

响应状态码是 200。

结论

随着这篇文章的结束,我们来总结一下。我们了解了什么是 API,以及它们如何在设备和应用程序之间实现通信。最后,我们深入研究了 REST API——API 请求响应周期是如何工作的。

显然,API 只是一个基础,或者说是进入广阔的软件开发(更准确地说是后端开发)世界的后门,正如标题所暗示的那样。

你可以关注我,以阅读更多有趣的概念。在本系列的后续博客中,我们将更深入地探讨后端开发。

Apple M2 Max GPU 对比 Nvidia V100、P100 和 T4

原文:towardsdatascience.com/apple-m2-max-gpu-vs-nvidia-v100-p100-and-t4-8b0d18d08894

比较 Apple Silicon M2 Max GPU 的性能与 Nvidia V100、P100 和 T4,在 TensorFlow 中训练 MLP、CNN 和 LSTM 模型。

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

·发布于 Towards Data Science ·阅读时长 6 分钟·2023 年 11 月 2 日

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

图片由作者提供

2020 年 11 月发布的 Apple M1 是在被 Intel 主导的计算机世界中的一场革命。这些新的 M1 Mac 在许多基准测试中表现出色,因为 M1 在能耗的极小部分下,比大多数高端台式计算机更快。

以下是我之前对 M1 的基准测试:

M1 与 Xeon®、Core i5、K80 和 T4 的基准测试

M1 在 TensorFlow 训练中与 20 核 Xeon® 竞争

2023 年 1 月,苹果宣布了新的 M2 Pro 和 M2 Max。它们的规格让我们期待性能的显著提升,特别是在 GPU 方面。

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

将 M2 Max 与 M1 规格进行比较

这个 M2 Max 具有 30 个 GPU 核心,因此我们根据 38 核 GPU 版本的 13.6 TFlops 估算了 10.7 TFLOPS。

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

GPU 比较

相比之下,M2 Max 38 核 GPU 达到 13.6 TFlops。我的测试将显示,仅凭 TFlops 无法估计这些 GPU 的实际性能。

为了获得可比较的结果,我在默认的 TensorFlow FP32 浮点精度下运行每个测试。

你可以通过运行来验证这一精确度:

tf.keras.backend.floatx()
'float32'

设置

在这篇文章中,我对M2 Max GPU 与 Nvidia 的V100P100T4在 MLP、CNN 和 LSTMTensorFlow模型上的表现进行了基准测试。

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

基准测试设置

在 M1 和 M2 Max 计算机上,环境是在miniforge下创建的。仅安装了以下软件包:

conda install python=3.10
pip install tensorflow-macos==2.12
pip install tensorflow-metal==0.8.0
conda install pandas

与我以前的文章不同,TensorFlow 现在可以直接与 Apple Silicon 兼容,无论是从 pip、anaconda 还是 miniforge 安装。

要启用 GPU 使用,请安装由苹果公司分发的tensorflow-metal包,并使用TensorFlow PluggableDevices。请注意,Metal加速也适用于PyTorchJAX

苹果表示

随着对 Metal 后端支持的更新,你可以利用新功能如自定义内核和混合精度训练,更快地训练更广泛的网络。

模型

这个基准测试包含一个运行MLPCNNLSTM模型的 Python 程序,这些模型在Fashion MNIST¹数据集上进行训练,批量大小为 32、128、512 和 1024 样本。

它还使用验证集以保持与实际应用中大多数模型训练方法的一致性。然后,使用测试集在训练后评估模型,以确保一切正常。所以,训练集、验证集和测试集的大小分别为 50000、10000 和 10000。

我使用与上一篇文章中描述的相同测试程序。提醒一下,这三个模型是简单的,下面总结了它们的特点。

MLP

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=X_train.shape[1:]),
    tf.keras.layers.Dense(512,activation='relu'),
    tf.keras.layers.Dropout(rate=0.2),
    tf.keras.layers.Dense(64,activation='relu'),  
    tf.keras.layers.Dense(10,activation='softmax')
])

CNN

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32,(3,3),activation = 'relu',input_shape=X_train.shape[1:]),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Conv2D(64,(3,3),activation = 'relu'),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Conv2D(64,(3,3),activation = 'relu'),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(64,activation='relu'),
    tf.keras.layers.Dense(10,activation='softmax')
])

LSTM

model = tf.keras.models.Sequential([
    tf.keras.layers.LSTM(128,input_shape=X_train.shape[1:]),
    tf.keras.layers.Dense(10,activation='softmax')
])

它们都使用以下优化器和损失函数。

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

请注意,与以前的基准测试文章不同,现在的急切模式对 GPU 有效。

结果

让我们首先比较 M2 Max 与 M1。

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

M2 Max 与 M1 的比较

正如预期的那样,M2 Max 始终比 M1 更快。以下显示了具体的倍数。

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

M2 Max 在 GPU 训练中的速度是 M1 的多少倍

下面是速度的平均、最小和最大增幅。我们发现使用 M2 Max 进行 Convnet 训练的速度可以比使用 M1 GPU 快多达 4.38 倍。

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

M2 Max 在 GPU 训练中比 M1 快多少倍

现在让我们比较一下 M2 Max 与 Google Cloud、AWS、Google Colaboratory 或 Kaggle 平台上其他 Nvidia 高端 GPU 的表现。

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

M2 Max 与 Nvidia T4、V100 和 P100 的比较

虽然在 batch size 为 32 和 128 时训练性能相似,但 M2 Max 在 batch size 为 512 和 1024 时显示出所有 GPU 中最好的性能。

P100 是其他 GPU 中速度最快的,而从规格来看 V100 是预期中的最优选择。这可能与实例本身有关,因为每张卡的三个不同版本的特性无法解释这一点。检查细节时,Kaggle P100 实例有 4 个 vCPU,而 Colab V100 只有 2 个 vCPU。也许这会影响整体性能,需要进一步检查。

在这里,我们比较 M2 Max 与 Nvidia P100 的速度差异。

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

M2 Max 在 GPU 训练中比 P100 快多少倍

下面是速度的平均、最小和最大增幅。我们发现,平均而言,M2 Max 与 P100 相同,并且虽然在 batch size 为 32 和 128 时较慢,但在 batch size 为 1024 时,MLP 的速度可以快达 1.77 倍,LSTM 快达 1.43 倍,CNN 快达 1.24 倍。

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

M2 Max 在 GPU 训练中比 P100 快多少倍

M2 Max 上 GPU 与 CPU 的好处

过去,使用旧版本的 TensorFlow 时,常常观察到 MLP 和 LSTM 在 CPU 上的训练效率高于 GPU。只有 CNN 受益于 GPU。但现在,随着 TensorFlow 的最新版本,LSTM 的情况发生了变化。

所以最后一个有趣的测试是检查模型训练在 GPU 与 CPU 的比较中是否有好处。

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

M2 Max GPU 的训练速度比 CPU 快多少倍

MLP 并未从 GPU 加速中受益。正如预期的那样,CNN 在每种情况下都受益,但从 batch size 为 128 开始,差异巨大,速度提高到约 5 倍。

但真正的惊喜来自 LSTM,其训练速度比 GPU 快多达 6.77 倍,尤其是在 batch size 为 1024 时。

结论

从这些测试来看,

  • M2 Max 比 M1 快得多,因此 Mac 用户可以从这一升级中受益。

  • 与 T4、P100 和 V100 相比,M2 Max 在 batch size 为 512 和 1024 时始终更快。

  • 性能差异不仅仅是 TFlops 的问题。M2 Max 理论上比 P100 快 15%,但在真实测试中,对于 batch size 为 1024 的情况,CNN 的性能提高了 24%,LSTM 提高了 43%,MLP 提高了 77%。

当然,这些指标只能用于与本测试中使用的神经网络类型和深度相似的情况。

需要对更大模型和数据集进行新的测试。

现在 TensorFlow 可以在 Apple Silicon 上轻松安装和高效运行。GPU 现在可以用于任何模型,大大提高了任何类型模型的训练性能,特别是 LSTM 模型。

我们可以得出结论,M2 Max 是一个非常好的机器学习工程师平台。它能够以非常好的性能在 GPU 上训练模型,甚至比常见的 T4、P100 或 V100 云实例更好。它还包含 12 个 CPU 核心,使其比这些 GPU 实例更灵活,且能耗仅为它们的一小部分。

更新 (2023 年 12 月 11 日):最新版本的 tensorflow-metal(> 0.8.0)存在一个错误,使得一些模型无法收敛。为避免此问题,我已通过设置 TensorFlow 和 tensorflow-metal 版本来更新了文章中的安装说明。随后,我使用这个新软件包组合重新进行了测试,以确保基准测试结果没有变化。我确认这不会改变性能结果。

参考资料

图像和代码:除非另有明确说明,否则本文中的所有图像和代码均由作者提供。

数据集许可Fashion-MNIST 按照 MIT 许可证 进行许可。

[1] Han Xiao 和 Kashif Rasul 和 Roland Vollgraf,Fashion-MNIST:用于基准测试机器学习算法的新型图像数据集(2017 年)

应用强化学习 III:深度 Q 网络(DQN)

原文:towardsdatascience.com/applied-reinforcement-learning-iii-deep-q-networks-dqn-8f0e38196ba9

逐步学习 DQN 算法的行为,以及它相比于以前的强化学习算法的改进

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 哈维尔·马丁内斯·奥赫达

·发表于 数据科学前沿 ·7 分钟阅读·2023 年 1 月 2 日

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

图片由 Андрей Сизов 提供,发布在 Unsplash

如果你想在没有 Premium Medium 帐户的情况下阅读这篇文章,可以通过这个朋友链接进行 😃

www.learnml.wiki/applied-reinforcement-learning-iii-deep-q-networks-dqn/

深度 Q 网络,首次由 Mnih 等人在 2013 年的论文中报告**[1]**,是迄今为止最知名的强化学习算法之一,因为自发布以来,它在无数 Atari 游戏中展示了超越人类的表现,如图 1所示。

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

图 1。对 57 款 Atari 游戏中每个智能体的中位人类标准化评分进行的绘图。图像摘自 deepmind/dqn_zoo GitHub 库

此外,除了看到 DQN 智能体像职业玩家一样玩这些 Atari 游戏的奇妙之处外,DQN 还解决了一个已知几十年的算法问题:Q-学习,该算法已经在本系列的第一篇文章中介绍和解释:

## 应用强化学习 I:Q-学习

逐步了解 Q-学习算法,以及任何基于 RL 的系统的主要组件

towardsdatascience.com

Q-Learning 旨在找到一个形式为状态-动作表的函数(Q-Function),该函数计算给定状态-动作对的期望总奖励,以便智能体能够通过执行 Q-Function 输出最高的动作来做出最佳决策。尽管 Watkins 和 Dayan 在 1992 年数学上证明了只要动作空间是离散的,并且每个可能的状态和动作都被反复探索,这个算法就会收敛到最佳的行动值 [2],但在实际环境中很难实现这种收敛。毕竟,在连续状态空间的环境中,不可能反复遍历所有可能的状态和动作,因为状态和动作是无限的,Q-Table 将会太大。

DQN 通过通过神经网络近似 Q-Function 并从之前的训练经验中学习来解决这个问题,以便智能体能够从已经经历过的经验中多次学习,而不必再次经历这些经验,同时避免计算和更新连续状态空间的 Q-Table 的过度计算成本。

DQN 组件

撇开智能体交互的环境不谈,DQN 算法的三个主要组件是主神经网络目标神经网络回放缓冲区

主神经网络

主神经网络尝试预测给定状态下采取每个动作的期望回报。因此,网络的输出将有尽可能多的值以匹配要采取的动作,而网络的输入将是状态。

神经网络通过执行梯度下降来最小化损失函数,但需要一个预测值和一个目标值来计算损失。预测值是主神经网络对当前状态和动作的输出,目标值是通过将获得的奖励加上目标神经网络对下一个状态的输出的最高值乘以折扣率γ来计算的。损失的计算可以通过图 2在数学上理解。

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

图 2。损失函数。图片由作者提供

至于为什么使用这两个值来计算损失,原因在于目标网络通过获取未来状态和动作的未来奖励预测,对当前动作在当前状态下的有用性有更多的信息。

目标神经网络

目标神经网络如上所述,用于获取计算损失和优化的目标值。这个神经网络不同于主神经网络,将每 N 个时间步更新一次,使用主网络的权重。

回放缓冲区

Replay Buffer 是一个列表,包含代理所经历的经验。与监督学习训练进行类比,这个缓冲区相当于用于训练的数据集,不同之处在于缓冲区必须逐步填充,随着代理与环境互动并收集信息。

对于 DQN 算法,该缓冲区中的每个经验(数据集中的行)由当前状态在当前状态下采取的动作采取该动作后的奖励、是否为终止状态以及采取动作后的下一个状态表示。

与 Q-Learning 算法中使用的方法不同,这种从经验中学习的方法允许从代理与环境的所有互动中学习,而不依赖于代理刚刚与环境的互动。

DQN 算法流程

DQN 算法的流程遵循**[1]**中的伪代码,如下所示。

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

DQN 伪代码。摘自**[1]**

对于每一集,代理执行以下步骤:

1. 从给定状态中选择一个动作

动作的选择遵循ε-贪心策略,这在**[3]**中已解释过。该策略将以概率 1-ε选择具有最佳 Q 值的动作,这个 Q 值是主神经网络的输出,而以概率ε选择一个随机动作(见图 3)。ε(epsilon)是算法的一个超参数。

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

图 3. ε-贪心策略。图片来源于作者

2. 在环境中执行动作

代理在环境中执行动作,获取到新的状态、获得的奖励以及是否达到终止状态。这些值通常由大多数健身环境**[4]在通过*step()***方法执行动作时返回。

3. 将经验存储在 Replay Buffer 中

如前所述,经验在 Replay Buffer 中保存为***{s, a, r, terminal, s’},其中sa分别是当前状态和动作,rs’***是执行动作后的奖励和新状态,terminal是一个布尔值,表示是否达到目标状态。

4. 从 Replay Buffer 中抽取一批随机经验

如果 Replay Buffer 中有足够的经验来填充一个批次(如果批次大小为 32,而 Replay Buffer 只有 5 个经验,则批次不能填充,此步骤将被跳过),将随机抽取一批经验作为训练数据。

5. 设置目标值

目标值的定义有两种不同的方式,取决于是否到达了终端状态。如果到达了终端状态,目标值将是收到的奖励;如果新状态不是终端状态,目标值将是如前所述的奖励与下一状态的目标神经网络输出(具有最高 Q-Value)乘以折扣因子γ的总和。

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

目标值定义。从**[1]**中的 DQN 伪代码提取

折扣因子 γ 是算法中需要设置的另一个超参数。

6. 执行梯度下降

梯度下降应用于从主神经网络的输出和之前计算的目标值计算的损失,遵循图 2中显示的方程式。可以看到,使用的损失函数是均方误差(MSE),因此损失将是主网络输出与目标值之间的差的平方。

7. 执行以下时间步

一旦完成了前面的步骤,这个过程会不断重复,直到达到每集的最大时间步数或智能体到达终端状态。当发生这种情况时,智能体将进入下一集。

结论

相较于 Q-Learning,DQN 算法在训练具有连续状态的环境中的智能体时代表了显著的改进,从而允许更大的使用灵活性。此外,使用神经网络(特别是卷积神经网络)而不是 Q-Learning 的 Q-Table,使得可以将图像(例如 Atari 游戏的帧)输入到智能体中,这进一步增加了 DQN 的多样性和可用性。

关于算法的弱点,需要指出的是,使用神经网络可能会导致每帧的执行时间比 Q-Learning 长,尤其是在使用大批量数据时,因为进行大量数据的前向传播和反向传播过程比使用Applied Reinforcement Learning I: Q-Learning中介绍的修改后的 Bellman 最优方程更新 Q-Table 的 Q-Values 要慢得多。此外,Replay Buffer 的使用可能会成为一个问题,因为算法处理的是存储在内存中的大量数据,这可能会超出某些计算机的 RAM 容量。

参考文献

[1] MNIH, Volodymyr, 等. 使用深度强化学习玩 Atari 游戏. arXiv 预印本 arXiv:1312.5602, 2013.

[2] WATKINS, Christopher JCH; DAYAN, Peter. Q 学习. 机器学习, 1992, 第 8 卷,第 3 期,第 279-292 页。

[3] Applied Reinforcement Learning I: Q-Learning

medium.com/towards-data-science/applied-reinforcement-learning-i-q-learning-d6086c1f437

[4] Gym 文档 www.gymlibrary.dev/

应用强化学习 IV:DQN 的实现

原文:towardsdatascience.com/applied-reinforcement-learning-iv-implementation-of-dqn-7a9cb2c12f97

DQN 算法的实现,以及将其应用于 OpenAI Gym 的 CartPole-v1 环境

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 哈维尔·马丁内斯·奥赫达

·发表于 Towards Data Science ·8 分钟阅读·2023 年 1 月 10 日

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

图片由 DeepMind 提供,来源于 Unsplash

如果你想阅读这篇文章而不使用高级 Medium 账户,可以通过这个朋友链接来阅读 😃

www.learnml.wiki/applied-reinforcement-learning-iv-implementation-of-dqn/

在本系列的上一篇文章中,应用强化学习 III: 深度 Q 网络 (DQN),介绍并解释了深度 Q 网络算法,以及与其前身 Q-Learning 相比的优缺点。在本文中,将把之前讲解的内容付诸实践,通过将 DQN 应用到实际用例中。如果你对 DQN 算法的基本概念或其原理不熟悉,我建议你在继续阅读本文之前先查看上一篇文章。

[## 应用强化学习 III: 深度 Q 网络 (DQN)

逐步学习 DQN 算法的行为,以及与之前的强化学习方法相比的改进…

medium.com](https://medium.com/@JavierMtz5/applied-reinforcement-learning-iii-deep-q-networks-dqn-8f0e38196ba9?source=post_page-----7a9cb2c12f97--------------------------------)

环境 — CartPole-v1

使用的仿真环境将是 gym CartPole 环境,它由一个沿水平导轨移动的推车和一个竖直安装在其上的杆子组成,如图 1所示。目标是通过推车在水平位移中产生的惯性,使杆子尽可能保持竖直。当杆子保持竖直超过 500 个时间步骤时,认为一集成功;如果推车在右侧或左侧偏离水平导轨,或者杆子相对于垂直轴倾斜超过 12 度(约 0.2095 弧度),则认为一集失败。

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

图 1. CartPole 环境的图像。图片摘自 gym 环境的渲染

环境具有离散动作空间,因为 DQN 算法不适用于具有连续动作空间的环境,而状态空间是连续的,因为 DQN 相对于 Q-Learning 的主要优势是能够处理连续或高维状态,这一点还需要证明。

动作

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

CartPole 环境的动作。作者提供的图像

状态

状态表示为一个包含 4 个元素的数组,每个元素的意义及其允许的值范围如下:

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

CartPole 环境的状态。作者提供的图像

应注意,尽管允许的值范围如表中所示,但如果发生以下情况,则一集将被终止:

  • Cart 在 x 轴上的位置离开了 (-2.4, 2.4) 范围

  • 杆子角度离开了 (-0.2095, 0.2095) 范围

奖励

代理在每个时间步骤中获得 +1 的奖励,旨在尽可能长时间保持杆子竖立。

DQN 实现

从 Mnih 等人**[1]** 提出的论文中提取的伪代码将作为参考以支持算法的实现。

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

DQN 伪代码。摘自**[1]**

1. 初始化 Replay Buffer

Replay Buffer 被实现为双端队列(deque),并创建了两个方法与之交互:save_experience()sample_experience_batch()save_experience() 允许将经验添加到重放缓冲区,而 sample_experience_batch() 随机挑选一批经验,这些经验将用于训练代理。经验批次作为一个***(states, actions, rewards, next_states, terminals)*** 的元组返回,其中元组中的每个元素对应一个 {batch_size} 项的数组。

双端队列(Deques),根据Python 的文档,支持线程安全、内存高效的从队列任一侧追加和弹出元素,性能在任一方向上大致为 O(1)。而 Python 列表 在从列表的左侧插入或弹出元素时,复杂度为 O(n),这使得双端队列在需要操作左侧元素时是一个更高效的选择。

2. 初始化主神经网络和目标神经网络

主神经网络和目标神经网络都通过create_nn() 方法初始化,该方法创建一个包含 64、64 和 2(CartPole 环境的动作大小)层的 keras 模型,每层神经元数量分别为 64、64 和 2,输入为环境的状态大小。使用的损失函数是均方误差(MSE),如算法伪代码中所述(如图 2所示),优化器为 Adam。

如果使用 DQN 算法来教代理如何玩 Atari 游戏,如上一篇文章所提到的,神经网络应为卷积神经网络,因为这种训练类型的状态是视频游戏的帧。

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

图 2。摘自 DQN 伪代码中的 [1]

3. 在每个时间步长中执行循环,每个回合内

以下步骤会在每个时间步长上重复,并形成 DQN 代理训练的主要循环。

3.1 按照 Epsilon-Greedy 策略选择动作

选择具有最佳 Q-值的动作,即主神经网络输出中值最高的动作,概率为 1-ε,其余情况下选择一个随机动作。

完整的算法实现可以在我的 GitHub 仓库中找到,它在每个回合中更新 epsilon 值,使其逐渐变小。这使得探索阶段主要发生在训练的开始阶段,而利用阶段则发生在剩余的回合中。训练过程中 epsilon 值的演变见图 3

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

图 3。训练中的 epsilon 衰减。图片作者提供

3.2 在环境中执行动作并将经验存储到回放缓冲区

从上一步提取的动作通过env.step() 方法应用到 gym 环境中,该方法接收要应用的动作作为参数。此方法返回一个元组 (next_state, reward, terminated, truncated, info),其中的下一个状态、奖励和终止字段与当前状态和选择的动作一起用于使用之前定义的***save_experience()***方法将经验保存到回放缓冲区。

3.3 训练代理

最终,智能体通过沿回合存储的经验进行训练。如上一篇文章所解释,主神经网络的输出被视为预测值,目标值则根据奖励和目标网络在下一个状态中具有最高 Q 值的动作的输出计算。然后,计算预测值与目标值之间的平方差作为损失,并在主神经网络上执行梯度下降。

4. 主循环

在定义了算法在前述步骤中的行为以及其代码实现之后,所有组件可以组合在一起,构建 DQN 算法,如下代码所示。

代码中有一些行为值得提及:

  • update_target_network() 方法,本文中未提及,将主神经网络的权重复制到目标神经网络。这个过程每{update_rate}时间步重复一次。

  • 只有当 Replay Buffer 中有足够的经验以填满一个批次时,才会进行主神经网络的训练。

  • 只要未达到最低值,epsilon 值在每个回合中会减少,通过将前一个值乘以小于 1 的减少因子。

  • 当在最后 10 个回合中的每一回合都达到了 499 以上的累积奖励时,训练停止,因为此时智能体被认为已经成功学会了执行任务。

测试 DQN 智能体

训练好的 DQN 智能体的表现通过绘制训练期间获得的奖励图来评估,并通过运行一个测试回合来进行。

奖励图用于查看智能体是否能够使奖励收敛到最大值,或者相反,如果智能体不能使奖励在每个训练回合中增加,这将意味着训练失败。至于测试回合的执行,这是评估智能体的一种现实方式,因为它以实际的方式展示了智能体是否真的学会了执行其训练的任务。

奖励图

图表清晰地显示了尽管在一些回合中智能体在若干时间步内失败,但奖励仍然收敛到最大值。这可能是因为在这些回合中,智能体初始化在一个不熟悉的位置,因为在训练过程中这种初始化并不多见。同样,奖励趋向最大值的趋势是智能体训练正确的一个指标。

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

奖励图。作者提供的图片

执行测试回合

智能体成功地以最高分 500 执行了测试回合,这无疑证明了他已经完美地学会了执行任务,正如奖励图所示。

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

代码和测试回合的执行。图像由作者提供。

结论

DQN 算法已经成功地完美地学习了任务,因此它在具有连续状态空间的环境中的应用可以被认为是有效的。同样,算法通过使用两个神经网络,在合理的时间内解决了处理连续和复杂状态空间的问题。由于只有两个网络中的一个被训练,计算时间大大减少,但值得注意的是,即使是简单任务,相比于 Q-Learning 算法,算法的执行时间仍然较长。

关于算法的执行时间,本文仅展示了在简单且易于学习的环境中使用密集神经网络实现 DQN,但需要考虑的是,DQN 在如 Atari 游戏这样的环境中的应用,这些环境通过游戏图像供给卷积神经网络,需要更长的时间来达到最佳 Q 值的收敛,以及进行前向和反向传播过程,因为环境和神经网络的复杂性更高。

最后,必须考虑使用 Replay Buffer 的限制,特别是内存成本。虽然可以指定队列(deque)的最大长度,从而避免过度的内存消耗,但仍然会消耗大量的 RAM。然而,这个问题可以通过将大部分 Replay Buffer 加载到磁盘上,同时将小部分保留在内存中,或者使用更高效的缓冲区来解决,而不是使用双端队列。

代码

完整实现的 DQN 算法,无论是 Jupyter Notebook 还是 Python 脚本,都可以在我的人工智能 GitHub 仓库中找到。

## GitHub - JavierMtz5/ArtificialIntelligence

目前无法执行该操作。您在另一个标签或窗口中登录。您在另一个标签中注销了…

github.com

参考文献

[1] MNIH, Volodymyr 等人。使用深度强化学习玩 Atari 游戏。arXiv 预印本 arXiv:1312.5602,2013。

应用强化学习 V:用于连续控制的归一化优势函数(NAF)

原文:towardsdatascience.com/applied-reinforcement-learning-v-normalized-advantage-function-naf-for-continuous-control-62ad143d3095

NAF 算法的介绍和解释,这是一种广泛用于连续控制任务的算法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 哈维尔·马丁内斯·奥赫达

·发表在 Towards Data Science ·9 分钟阅读·2023 年 1 月 19 日

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

图片由 Sufyan 提供,来源于 Unsplash

如果你想在没有 Premium Medium 账户的情况下阅读这篇文章,你可以通过这个朋友链接来查看 😃

www.learnml.wiki/applied-reinforcement-learning-v-normalized-advantage-function-naf-for-continuous-control/

本系列之前的文章介绍并解释了两种自其诞生以来广泛使用的强化学习算法:Q-LearningDQN

Q-Learning 将 Q 值存储在一个动作-状态矩阵中,因此,要在状态 s 中获得最大的 Q 值动作 a,必须找到 Q 值矩阵中第 s 行的最大元素,这使得其在连续状态或动作空间中的应用变得不可能,因为 Q 值矩阵将是无限的。

另一方面,DQN 通过利用神经网络来获取与状态 s 相关的 Q-值,从而部分解决了这个问题,使神经网络的输出为每个可能的动作的 Q-值(相当于 Q-Learning 的动作-状态矩阵中的一行)。该算法允许在具有连续状态空间的环境中进行训练,但仍然无法在具有连续动作空间的环境中进行训练,因为神经网络的输出(具有与可能动作一样多的元素)将会是无限长度的。

NAF 算法由 Shixiang Gu 等人提出于**[1]**,与 Q-Learning 或 DQN 不同,它允许在连续状态和动作空间环境中进行训练,增加了许多应用的灵活性。像 NAF 这样的连续环境中的强化学习算法通常在控制领域中使用,特别是在机器人技术中,因为它们能够在更贴近现实的环境中进行训练。

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

强化学习算法的类型及其可能的状态/动作空间。作者提供的图片

引言概念

优势函数

状态-价值函数 V动作-价值函数Q-函数Q,都在 本系列的第一篇文章 中进行了讲解,分别确定了在遵循某个策略时处于某状态的好处以及在遵循某个策略时从给定状态采取某个动作的好处。这两个函数,以及 V 相对于 Q 的定义,可以在下方查看。

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

Q-函数、价值函数和 Q-V 关系。作者提供的图片

由于 Q 返回在某状态下采取某个动作的好处,而 V 返回处于某状态的好处,因此两者之间的差异提供了关于在某状态下相对于其他动作采取特定动作的优势信息,或者代理通过采取该动作相对于其他动作所获得的额外奖励。这个差异称为 优势函数,其方程式如下所示。

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

优势函数。作者提供的图片

Ornstein-Uhlenbech 噪声过程(OU)

正如之前的文章所见,在离散环境下的强化学习算法如 Q-Learning 或 DQN 中,探索是通过随机选择一个动作并忽略最优策略来进行的,比如 epsilon 贪心策略。然而,在连续环境中,动作是根据最优策略选择的,并且在这个动作上添加噪声。

向选择的动作中添加噪声的问题在于,如果噪声与之前的噪声无关且具有零均值的分布,则动作会相互抵消,使得代理无法保持对任何点的连续运动,而是会陷入困境,从而无法探索。Ornstein-Uhlenbech 噪声过程获得与之前噪声值相关的噪声值,使得代理能够向某个方向进行连续运动,因此成功地进行探索。

关于 Ornstein-Uhlenbech 噪声过程的更深入信息可以在**[2]**中找到。

NAF 算法背后的逻辑

NAF 算法利用神经网络分别获得状态值函数 V优势函数 A的值。由于之前的解释,神经网络获得这些输出的原因是,动作值函数 Q的结果可以作为VA的总和。

像大多数强化学习算法一样,NAF 旨在优化 Q-函数,但在其应用案例中,特别复杂,因为它使用神经网络作为 Q-函数估计器。因此,NAF 算法利用了一个二次函数来表示优势函数,其解是封闭且已知的,从而使得关于动作的优化更加容易。

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

图 1。NAF 算法的 Q-函数和优势函数。图像摘自**[1]**。

更具体地说,Q-函数相对于动作总是二次的,因此动作的argmax Q(x, u)总是𝜇(x|𝜃) [3],如图 2所示。由于此原因,解决了由于在连续动作空间中工作而无法获得神经网络输出的 argmax 的问题,这在 DQN 中曾经存在。

通过查看构成 Q-函数的不同组件,可以看出神经网络将有三个不同的输出:一个用于估计价值函数,另一个用于获得最大化 Q-函数的动作(argmax Q(s, a)𝜇(x|𝜃)),还有一个用于计算矩阵 P(见图 1):

  • 神经网络的第一个输出是对状态值函数的估计。这个估计值随后用于获得 Q-函数的估计,即状态值函数和优势函数的总和。这个输出在图 1中表示为V(x|𝜃)

  • 神经网络的第二个输出是𝜇(x|𝜃),即在给定状态下最大化 Q-函数的动作,或argmax Q(s, a),因此作为代理应遵循的策略。

  • 第三个输出用于随后形成状态依赖的正定方阵P(x|𝜃)。这种神经网络的线性输出用作下三角矩阵L(x|𝜃)的输入,其中对角项经过指数化处理,从而构建出上述的矩阵P(x|𝜃),其计算公式如下。

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

构造 P 矩阵的公式。摘自**[1]**

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

图 2。作者提供的图像

神经网络的第二和第三个输出用于构造优势函数的估计,如图 1所示,然后将其加到第一个输出(状态值函数估计 V)中,以获得 Q 函数的估计。

关于 NAF 算法的其余部分,它包含与文章应用强化学习 III:深度 Q 网络(DQN)中解释的 DQN 算法相同的组件和步骤。这些共同的组件有重放缓冲区主神经网络目标神经网络。与 DQN 类似,重放缓冲区用于存储经验以训练主神经网络,目标神经网络用于计算目标值并与主网络的预测进行比较,然后执行反向传播过程。

NAF 算法流程

NAF 算法的流程将遵循下面的伪代码,摘自**[1]**。如前所述,NAF 算法遵循与 DQN 算法相同的步骤,只是 NAF 以不同的方式训练其主神经网络。

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

NAF 算法伪代码。摘自**[1]**

在每个时间步中,智能体执行以下步骤:

1. 从给定状态中选择一个动作

选择的动作是最大化 Q 函数估计值的动作,由**𝜇(x|𝜃)**表示,如图 2所示。

对于所选择的动作,添加从 Ornstein-Uhlenbech 噪声过程(之前介绍过)中提取的噪声,以增强智能体的探索。

2. 对环境执行动作

在环境中由智能体执行带噪声的动作。执行此动作后,智能体接收关于动作效果的信息(通过奖励),以及关于在环境中达到的新状态的信息(即下一个状态)。

3. 将经验存储在重放缓冲区中

重放缓冲区将经验存储为***{s, a, r, s’},其中sa是当前状态和动作,rs’***是奖励和执行当前状态动作后的新状态。

从步骤 4 到 7 的过程会根据算法超参数 I 在每个时间步上重复进行,如上述伪代码所示。

4. 从 Replay Buffer 中随机抽取一批经验

《DQN 文章》所述,仅当 Replay Buffer 中有足够的数据填充一批时,才会提取一批经验。一旦满足这一条件,{batch_size} 元素会从 Replay Buffer 中随机选取,从而可以利用以前的经验进行学习,而不需要最近经历这些经验。

5. 设置目标值

目标值定义为奖励与下一状态的目标神经网络的值函数估计值之和,乘以折扣因子γ,这是算法的一个超参数。目标值的公式如下所示,并且也在上述伪代码中提供。

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

目标值计算。摘自**[1]**中的伪代码

6. 执行梯度下降

对损失进行梯度下降,这些损失是通过主神经网络(预测值)和先前计算的目标值的 Q 函数估计得出的,按照下面的方程计算。如所示,使用的损失函数是均方误差(MSE),因此损失将是 Q 函数估计值和目标值之间的平方差。

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

损失函数。摘自**[1]**

应记住,Q 函数的估计是通过值函数 V(x**|𝜃**)的估计加上优势函数 A(x, u**|𝜃**)的估计得出的,其公式显示在图 1中。

7. 软更新目标神经网络

目标神经网络的权重以一种软方式更新为主神经网络的权重。这种软更新是主网络权重和目标网络旧权重的加权和,如下方程所示。

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

目标网络的软更新。摘自**[1]**

在加权和中,每个神经网络权重的重要性由超参数τ决定。如果τ为零,则目标网络不会更新其权重,因为它将加载自己的旧权重。如果τ设为 1,则目标神经网络将通过加载主网络的权重来更新,忽略目标网络的旧权重。

8. 时间步结束 — 执行下一个时间步

完成上述步骤后,将不断重复这一过程,直到达到每个回合的最大时间步数或代理到达终止状态。当发生这种情况时,将进入下一个回合。

结论

NAF 算法在连续环境中的实现中取得了非常好的结果,因此它圆满地完成了其目标。NAF 与 DDPG 算法 [4] 的比较结果如下,其中可以看到它在前期工作中有了显著的改进。此外,NAF 算法的美妙之处在于,它通过平方函数及其易于优化的特性解决了 DQN 在连续环境中的局限性,是一种聪明且富有创意的解决方案。

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

DDPG 和 NAF 在不同任务中的比较。摘自**[1]**

另一方面,尽管 NAF 被证明是一个高效且有用的算法,但它的逻辑和实现并不简单,尤其是与之前用于离散环境的算法相比,这使得它难以使用。

参考文献

[1] GU, Shixiang 等人。基于模型加速的连续深度 q 学习。在 国际机器学习大会 上。PMLR,2016 年。第 2829–2838 页

[2] 奥恩斯坦-乌伦贝克过程en.wikipedia.org/wiki/Ornstein%E2%80%93Uhlenbeck_process

[3] 二次型。伯克利数学math.berkeley.edu/~limath/Su14Math54/0722.pdf

[4] LILLICRAP, Timothy P. 等人。通过深度强化学习进行连续控制。arXiv 预印本 arXiv:1509.02971,2015 年

应用强化学习 VI:用于连续控制的深度确定性策略梯度(DDPG)

原文:towardsdatascience.com/applied-reinforcement-learning-vi-deep-deterministic-policy-gradients-ddpg-for-continuous-dad372f6cb1d

DDPG 算法的介绍和理论解释,这在连续控制领域有许多应用。

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

·发表于 Towards Data Science ·阅读时间 8 分钟·2023 年 3 月 7 日

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

图片来源:Eyosias GUnsplash

如果你想在没有 Premium Medium 账户的情况下阅读这篇文章,你可以通过这个朋友链接 😃

www.learnml.wiki/applied-reinforcement-learning-vi-deep-deterministic-policy-gradients-ddpg-for-continuous-control/

DDPG 算法,由 Lillicarp 等人在 ICLR 2016 首次提出 [1],在深度强化学习算法用于连续控制方面取得了重大突破,因为它比 DQN [2](仅适用于离散动作)有了改进,且其结果优异且易于实现(见**[1]**)。

关于NAF 算法 [3],该算法在上一篇文章中介绍,DDPG 适用于连续动作空间和连续状态空间,因此它也是适用于机器人技术或自动驾驶等领域的连续控制任务的有效选择。

## 应用强化学习 VI:用于连续控制的归一化优势函数(NAF)

NAF 算法的介绍和解释,该算法广泛用于连续控制任务

[towardsdatascience.com

DDPG 算法的逻辑

DDPG 算法是一种 Actor-Critic 算法,顾名思义,它由两个神经网络组成:ActorCritic。Actor 负责选择最佳动作,而 Critic 则必须评估所选动作的好坏,并告知 Actor 如何改进。

Actor 通过应用策略梯度进行训练,而 Critic 通过计算 Q 函数进行训练。因此,DDPG 算法试图同时学习最优 Q 函数的近似器(Critic)和最优策略的近似器(Actor)。

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

Actor-Critic 模式。图像摘自**[4]**

最优 Q 函数Q*(s, a)给出了在状态s下,采取动作a并随后按照最优策略行动的期望回报。另一方面,最优策略𝜇*(s)返回在状态s下最大化期望回报的动作。根据这两个定义,给定状态下的最优动作(即最优策略在给定状态下的回报)可以通过获取给定状态下**Q*(s, a)**的 argmax 来获得,如下所示。

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

Q 函数与策略的关系。作者提供的图像

问题在于,对于连续动作空间,获取最大化 Q 的动作a并不容易,因为计算每一个可能的a的 Q 值以检查哪个结果最高(这是离散动作空间的解决方案)几乎是不可能的,因为可能的值是无限的。

作为解决方案,并假设动作空间是连续的且 Q 函数对动作是可微的,DDPG 算法将maxQ(s, a)近似为Q(s, 𝜇(s)),其中𝜇(s)(一个确定性策略)可以通过执行梯度上升来优化。

简而言之,DDPG 学习最优 Q 函数的近似器,以获得最大化该函数的动作。由于动作空间是连续的,Q 函数的结果不能针对每一个可能的动作值来获得,DDPG 还学习最优策略的近似器,以直接获得最大化 Q 函数的动作。

接下来的部分解释了算法如何学习最优 Q 函数的近似器和最优策略的近似器。

Q 函数的学习

均方贝尔曼误差函数

Q-函数的学习是基于贝尔曼方程的,该方程在本系列的第一篇文章中已介绍。由于在 DDPG 算法中 Q-函数不是直接计算的,而是使用了一个神经网络 Qϕ(s, a) 作为 Q-函数的近似器,因此使用了一个称为 均方贝尔曼误差 (MSBE) 的损失函数。该函数如 图 1 所示,指示近似器 Qϕ(s, a) 如何满足贝尔曼方程。

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

图 1. 均方贝尔曼误差 (MSBE)。图像摘自 [5]

DDPG 的目标是最小化这个误差函数,这将使 Q-函数的近似器满足贝尔曼方程,这意味着近似器是最优的。

回放缓冲区

为了最小化 MSBE 函数(即训练神经网络以近似 Q*(s, a)),所需的数据是从 回放缓冲区 中提取的,该缓冲区存储了训练过程中经历的经验。这个回放缓冲区在 图 1 中表示为 D,从中获取计算损失所需的数据:状态 s,动作 a,奖励 r,下一个状态 s’ 和完成 d。如果你对回放缓冲区不熟悉,它在关于 DQN 算法NAF 算法 的文章中已有解释,并在关于 DQN 实现 的文章中进行了实现和应用。

目标神经网络

MSBE 函数的最小化包括使 Q-函数的近似器,Qϕ(s, a),尽可能接近函数的另一个项,即 目标,其原始形式如下:

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

图 2. 目标。摘自图 1 [5]

如图所示,目标依赖于待优化的相同参数,ϕ,这使得最小化变得不稳定。因此,作为解决方案,使用了另一个神经网络,其中包含主神经网络的参数,但有一定的延迟。这个第二个神经网络被称为 目标网络,Qϕtarg(s, a)(见图 3,其参数表示为 ϕtarg

然而,在图 2中可以看到,当将 Qϕ(s, a) 替换为 Qϕtarg(s, a) 时,必须获得最大化该目标网络输出的动作。正如上文所述,这对于连续动作空间环境来说是复杂的。这通过利用**目标策略网络,𝜇ϕtarg(s)(见图 3)**来解决,该网络逼近了最大化目标网络输出的动作。换句话说,创建了一个目标策略网络 𝜇ϕtarg(s) 来解决 Qϕtarg(s, a) 的连续动作问题,就像之前对 𝜇ϕ(s)Qϕ(s, a) 所做的那样。

最小化修改后的 MSBE 函数

通过这一切,DDPG 算法通过对图 3中的修改后的 MSBE 函数应用梯度下降来学习最优 Q-函数。

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

图 3. 修改后的均方贝尔曼误差。摘自**[5]**并由作者编辑

策略学习

由于动作空间是连续的,并且 Q-函数对动作是可微分的,DDPG 通过对以下函数应用梯度上升来学习最大化 Qϕ(s, a) 的确定性策略𝜇ϕ(s),该函数是关于确定性策略参数的:

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

图 4. 确定性策略学习的优化函数。摘自**[5]**

DDPG 算法流程

DDPG 算法的流程将按照以下伪代码展示,摘自**[1]**。DDPG 算法遵循与其他函数逼近 Q-Learning 算法相同的步骤,例如 DQN 或 NAF 算法。

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

DDPG 算法伪代码。摘自**[1]**

1. 初始化 Critic、Critic 目标、Actor 和 Actor 目标网络

初始化在训练过程中使用的 Actor 和 Critic 神经网络。

  • Critic 网络,Qϕ(s, a),作为 Q-函数的逼近器。

  • Actor 网络,𝜇ϕ(s),作为确定性策略的逼近器,用于获取最大化 Critic 网络输出的动作。

一旦初始化,目标网络将与其相应的主网络具有相同的架构,并且主网络的权重会被复制到目标网络中。

  • Critic 目标网络,Qϕtarg(s, a),作为一个延迟的 Critic 网络,以便目标不依赖于需要优化的相同参数,正如之前所解释的。

  • Actor 目标网络,𝜇ϕtarg(s),作为一个延迟的 Actor 网络,用于获取最大化 Critic 目标网络输出的动作。

2. 初始化 Replay Buffer

用于训练的 Replay Buffer 被初始化为空。

在一个时间步中,智能体执行以下步骤:

3. 选择动作并施加噪声

从 Actor 神经网络的输出中获得当前状态的最佳动作,该网络逼近确定性策略 𝜇ϕ(s).Ornstein Uhlenbeck 噪声过程**[6]无关的、均值为零的高斯分布** [7] 中提取的噪声然后被应用于选定的动作。

4. 执行动作并将观察结果存储在 Replay Buffer 中

在环境中执行有噪声的动作。之后,环境返回一个奖励,指示采取的行动的效果,执行该动作后达到的新状态,以及一个布尔值,指示是否已达到终止状态

这些信息连同当前状态采取的行动一起存储在 Replay Buffer 中,稍后用于优化 Critic 和 Actor 神经网络。

5. 采样经验批次,并训练 Actor 和 Critic 网络

只有当 Replay Buffer 中有足够的经验填满一个批次时,这一步骤才会执行。一旦满足此要求,就会从 Replay Buffer 中提取一个经验批次用于训练。

使用这一批经验:

  • 计算目标值,并获得 Critic 网络(Q-Function 的逼近器)的输出,然后在 MSBE 误差函数上应用梯度下降,如图 3所示。这一步骤训练/优化了 Q-Function 的逼近器,Qϕ(s, a)。

  • 图 4所示的函数执行梯度上升,从而优化/训练确定性策略的逼近器,𝜇ϕ(s)

6. 软更新目标网络

每次更新 Actor 和 Critic 网络时,Actor Target 和 Critic Target 网络都通过Polyak 平均进行更新,如下图所示。

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

图 5. Polyak 平均。摘自**[1]**

Tau τ,设置 Polyak 平均中每个元素权重的参数,是算法的一个超参数,通常取接近 1 的值。

结论

Lillicrap 等人提出的 DDPG 算法在 Gym 中大多数连续环境下取得了非常好的结果,如论文**[1]**所示,展示了它在连续环境中学习不同任务的能力,无论这些任务的复杂性如何。

因此,该算法至今仍用于使智能体在连续环境中学习复杂任务的最优策略,如操作机器人控制任务或自主车辆的避障任务。

参考文献

[1] LILLICRAP, Timothy P., 等人。使用深度强化学习进行连续控制。arXiv 预印本 arXiv:1509.02971,2015。

[2] MNIH, Volodymyr, 等人。使用深度强化学习玩 Atari 游戏。arXiv 预印本 arXiv:1312.5602,2013。

[3] GU, Shixiang 等人。《基于模型的加速连续深度 Q 学习》。发表于国际机器学习大会。PMLR,2016 年。第 2829–2838 页。

[4] SUTTON, Richard S.; BARTO, Andrew G. 《强化学习:导论》。MIT 出版社,2018 年。

[5] OpenAI Spinning Up — 深度确定性策略梯度spinningup.openai.com/en/latest/algorithms/ddpg.html

[6] 乌伦贝克-奥恩斯坦过程en.wikipedia.org/wiki/Ornstein%E2%80%93Uhlenbeck_process

[7] 正态 / 高斯分布

en.wikipedia.org/wiki/Normal_distribution

应用和使用正态分布进行数据科学

原文:towardsdatascience.com/applying-and-using-the-normal-distribution-for-data-science-98f910629ba1

数据科学步骤

回顾正态分布在数据科学中的各种应用

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

·发布于 Towards Data Science ·10 分钟阅读·2023 年 7 月 7 日

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

(作者提供的图片)

介绍

在开始数据科学时,可能极其困难的一点是确定这段旅程的确切起点和终点。关于数据科学旅程的终点,重要的是要记住这个领域每天都有进展,必定会有新的突破 —— 要准备好学习大量知识。数据科学不仅包括科学、统计和编程,还涉及多个其他学科。

为了减轻数据科学的复杂性,重要的是将信息分解为易于消化的小块。深入研究并了解领域中的特定方面 —— 无论是数据、编程、机器学习、分析还是科学,确实可以很有趣。虽然这让我感到兴奋,但有时也很有必要缩小重点,深入学习某一特定主题。对于初学者来说,这些交织的领域确实让人不知从何开始。我认为,统计学和正态分布是数据科学的一个很好的起点。我写了一篇文章,详细阐述了原因,并深入探讨了正态分布。我们将在这里简要总结这篇文章,但许多细节将被省略。

[## 数据科学统计的首要学习内容 — 正态分布

简单正态分布的概述和编程。

chifi.dev

上述描述的正态分布是一个简单的概率密度函数(PDF),我们可以在数据上应用此函数。这个函数,我们称之为f,计算标准差x在均值f(x)中的数量。考虑一下。我们需要从均值中获得标准差,我们怎么检查一个值离均值有多少个标准差?首先,我们需要看它离均值有多远,对吧?然后我们需要看这个差异有多少个标准差。这正是我们在公式中所做的。因此,对于每个 x,我们减去均值,然后将差异除以标准差。在统计学中,小写希腊字母 sigma (σ) 代表标准差,小写希腊字母 mu (µ) 代表均值。在下面的公式中,x bar (x̄) 代表观察值(即上面f(x)中的x)。

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

主要注意被突出显示的部分。

进入编程语言

在上一篇文章的结尾,我们将其引入了编程语言——Julia。语言的选择完全取决于数据科学家,但也需要考虑权衡,并且了解行业动态也很重要。例如,R 是一种相对较慢的语言,但其分析包已由优秀开发者和出色的仪表盘工具维护多年。如今最受欢迎的选择可能是 Python,因为它能够快速连接 C 库且易于使用。Julia 是一种相对较新的语言,但它是我最喜欢的编程语言,我认为大多数数据科学家应该了解它。虽然 Julia 的受欢迎程度迅速上升,但如果你同时掌握这两种语言,也总有更多的工作机会。幸运的是,大多数常用于数据科学的流行语言往往有很多共同之处,最终相互参考也相当容易。这是我们用 Python 和 Julia REPL 分别编写的正态分布。

python

>>> from numpy import mean, std
>>> x = [5, 10, 15]
>>> normed = [(mean(x) - i) / std(x) for i in x]
>>> print(normed)
[1.224744871391589, 0.0, -1.224744871391589]

julia

julia> using Statistics: std, mean

julia> x = [5, 10, 15]
3-element Vector{Int64}:
  5
 10
 15

julia> normed = [(mean(x) - i) / std(x) for i in x]
3-element Vector{Float64}:
  1.0
  0.0
 -1.0

这里是每种编程语言的笔记本。我将用三种语言编写笔记本,不仅使本教程对每个人都可用,还推广使用多种语言的理念。这些语言相似且相当容易阅读,因此很容易对比差异,了解你喜欢哪种语言,并深入探索每种语言的权衡。

notebooks

python

[## Emmetts-DS-NoteBooks/Python3/Applying the normal distribution (py).ipynb at master ·…

各种项目的随机笔记本。通过创建一个账户来为 emmettgb/Emmetts-DS-NoteBooks 开发贡献代码…

github.com](https://github.com/emmettgb/Emmetts-DS-NoteBooks/blob/master/Python3/Applying%20the%20normal%20distribution%20%28py%29.ipynb?source=post_page-----98f910629ba1--------------------------------)

julia

[## Emmetts-DS-NoteBooks/Julia/Applying the normal distribution.ipynb at master ·…

各种项目的随机笔记本。通过创建一个账户来为 emmettgb/Emmetts-DS-NoteBooks 开发贡献代码…

github.com](https://github.com/emmettgb/Emmetts-DS-NoteBooks/blob/master/Julia/Applying%20the%20normal%20distribution.ipynb?source=post_page-----98f910629ba1--------------------------------)

设置我们的函数

我们首先需要一个函数,它能为一个Vector的数字提供正态分布。这就像是在将均值和标准差代入公式之前获取均值和标准差一样简单。这个函数将接受一个参数,即我们的Vector,然后返回我们标准化后的Vector。为此,我们当然还需要均值和标准差——我们可以使用相关的依赖。在 Python 中,我们会使用 Numpy 的meanstd函数。在 Julia 中,我们会使用Statistics.meanStatistics.std。不过,今天我们将从头开始编写所有内容,这里是我在 Python 和 Julia 中的简单均值和标准差函数:

# python
import math as mt
def mean(x : int):
    return(sum(x) / len(x))

def std(arr : list):
    m = mean(arr)
    arr2 = [(i-m) ** 2 for i in arr]
    m = mean(arr2)
    m = mt.sqrt(m)
    return(m)
# julia
mean(x::Vector{<:Number}) = sum(x) / length(x)

function std(array3::Vector{<:Number})
    m = mean(array3)
    [i = (i-m) ^ 2 for i in array3]
    m = mean(array3)
    try
        m = sqrt(m)
    catch
        m = sqrt(Complex(m))
    end
    return(m)
end

现在我们有了一些获取函数所需值的功能,我们需要将这些功能封装成一个函数。这很简单,我只需使用上面的方法获取我们的总体均值和标准差,然后通过一个理解式来减去均值并将差异除以标准差。

# python
def norm(x : list):
    mu = mean(x)
    sigma = std(x)
    return([(xbar - mu) / sigma for xbar in x])
# julia
function norm(x::Vector{<:Number})
    mu::Number = mean(x)
    sigma::Number = std(x)
    [(xbar - mu) / sigma for xbar in x]::Vector{<:Number}
end

现在让我们尝试一下我们的标准化函数。这是一个容易测试的例子,我们只需提供一个我们知道均值的向量。这是因为我们向量的均值应该为零。因此,在[5, 10, 15]的情况下,0 将是 10——即[5, 10, 15]的均值。5 将大约是-1.5,即距离均值一个标准差(在这种情况下,我们的标准差等于 2.5)。

norm([5, 10, 15])

[-1.224744871391589, 0.0, 1.224744871391589]

在正态分布中,统计显著值通常在距离均值近 2 个标准差时开始被注意到。换句话说,如果大多数人的身高约为 10 英寸,而某人的身高为 20 英寸,这将是距离均值 3 个标准差的情况,并且在统计上非常显著。

mu = mean([5, 10, 15])
sigma = std([5, 10, 15])

(15 - mu) / sigma

1.5811388300841895

(20 - mu) / sigma

3.162277660168379

分析的正态分布

Z 分布或正态分布在数据分析中也有许多应用。这个分布可以用于测试,但不像 T 检验那样常用。原因是正态分布的尾部相对较短。因此,它通常用于样本量较大且方差已知的测试中。例如,将正态分布与 T 分布比较,我们会发现 T 分布的尾部更长。这意味着统计显著性的区域更长——因此更容易检测。

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

仅供参考 — 当自由度减少时,T 分布的尾部变长,均值的权重减小。上面的 t 分布大约有 8 个自由度,但 1 个自由度的 T 分布会更加平坦,尾部更宽。作者提供的图片

这种测试,即 Z 检验,将测试总体均值是否有足够的差异以达到统计显著性。公式也与之前 PDF 中看到的公式非常相似,所以这里没有太多新内容。我们将 xbar 更改为我们要测试的总体的均值,而不是使用每个观察值。该测试将返回一个叫做 Z 统计量的结果。与 T 统计量类似,它通过另一个函数得出概率值。让我们创建一个简单的一维观察集,并看看如何进行这样的测试。

pop = [5, 10, 15, 20, 25, 30]
mu = mean(pop)
sigma = std(pop)

我们将从中间获取一个随机样本并计算 Z 统计量:

xbar = mean(pop[3:5])

现在我们只需将其代入我们的公式中……

(xbar - mu) / sigma
0.5976143046671968

这个新数字是我们的 Z 统计量。将这些统计值转化为概率值的数学过程相当复杂。两种语言中都有可以帮助处理这些问题的库。对于 Julia,我推荐HypothesisTests,而对于 Python,我推荐scipy模块。对于本文,我们将使用一个在线 Z 统计量到概率值计算器。让我们将 Z 统计量代入其中:

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

作者提供的图片

正如我们预期的那样,一些离其他样本非常近的总体,其均值在统计上并不显著。话虽如此,我们当然可以尝试一些在统计上更显著的情况,并拒绝我们的零假设!

xbar = mean([50, 25, 38])
(xbar - mu) / sigma

4.820755390982054

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

作者提供的图片

正态分布在测试中的确表现良好。关键在于理解这种测试形式需要较大的样本量,并且并不适用于所有数据。在大多数情况下,对于初学者,我会建议从更容易测试的分布开始,例如 T 分布。对于 Z 检验,数据的重要性更大,初学者可能很难找到大规模的数据来源,而且即使数据在统计上显著,也可能更难获得统计显著结果。

正态分布在数据科学项目中的某些情况下也可以用于快速分析。将数据转化为其与总体的关系对于从数据可视化到确定给定总体的变异程度等所有方面都是非常有用的。通过研究我们观察值与均值的关系,我们可以学到很多关于总体的信息。如果你想了解更多关于这个过程的内容,我有一个适合初学者的概述,可能会在这种情况下对你有所帮助,你可以在这里阅读:

## 面向初学者的应用科学介绍

学习特征和统计分析的基础知识

面向数据科学的初学者友好介绍

归一化数据

正态分布的另一个极佳应用是利用分布来进行数据归一化。连续特征可能会出现一些问题,其中最重要的问题之一是离群值。我们需要将离群值从数据中剔除,这样我们的数据才能成为一种概括。记住,构建优质数据的关键是构建一个良好的总体。我所指的是,我们希望数据的总体——例如均值——能够代表数据在一定变异水平下的正常状态。这样,当某些东西不同的时候,就会变得非常明显。

由于正态分布告诉我们一个值离均值有多少个标准差,因此很容易理解我们如何利用它来进行数据归一化。如前所述,2.0 大致是事情开始变得显著的地方。也就是说,我们可以制作一个掩码,并利用它来筛选不良值!

# julia
function drop_outls(vec::Vector{<:Number})
    normed = norm(vec)
    mask = [~(x <= -2 || x >= 2) for x in normed]
    normed[mask]
end

通过这种简单的掩码过滤,我们增加了辨别值是否远离均值的能力,并基于此将其剔除。在大多数情况下,我们可能还想用均值替换这些离群值,以免丢失其他特征或目标的观察值。

# python
def drop_outls(vec : list):
    mu = mean(vec)
    normed = norm(vec)
    mask = [x <= -2 or x >= 2 for x in normed]
    ret = []
    for e in range(1, len(mask)):
        if mask[e] == False:
            ret.append(vec[e])
        else:
            ret.append(mu)
    return(ret)

归一化的常态

在数据科学中,正态分布的最终应用之一是标准化(Standard Scaler)。标准化就是将正态分布应用到你的数据上。这种标准化方法非常有用,因为它有助于将数据转化为更贴近其所在特征的数据。这对于机器学习来说极其重要,可以非常容易地提高模型的准确性,前提是你有一个连续特征。使用标准化非常简单;只需像之前一样使用我们的 PDF,就能获得归一化特征。

myX = [1, 2, 3, 4, 5]
normedx = norm(x)

这用于提供给机器学习的数据。正态分布通常用于处理许多机器学习模型中的连续特征,这些模型每天都会被部署。

总结一下

总结一下,正态分布是统计学和数据科学的基本构建块,广泛应用于数据科学的各种应用中。这个领域有很多不同的主题通常会以这种方式展开:开始时相对简单,最终发展成相当复杂的内容。深入研究一个主题肯定是很好的,正态分布也不例外,因为它的本质和简单性使得它具备了令人惊叹的能力。感谢大家的阅读,希望这个概述对你们有帮助!

应用大型语言模型于表格数据以识别漂移

原文:towardsdatascience.com/applying-large-language-models-to-tabular-data-to-identify-drift-54c9fa59255f?source=collection_archive---------2-----------------------#2023-04-25

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

图片由作者使用 Dall-E 2 创建

大型语言模型(LLMs)是否能够减少异常检测中的工作量,避免参数化或专门的模型训练?

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

·

关注 发布于 Towards Data Science ·9 分钟阅读·2023 年 4 月 25 日

跟随本博客的 配套 Colab.

本博客由 Arize AI 的首席执行官兼联合创始人 Jason Lopatecki 和 Decision Patterns 的首席执行官兼创始人 Christopher Brown 合作撰写

最近,大语言模型(LLM)的进展正在许多领域证明其破坏性力量(参见:人工通用智能的火花:对 GPT-4 的早期实验*)。像许多人一样,我们对这些进展充满浓厚的兴趣,并探索 LLMs 影响数据科学和机器学习领域工作流程和常见实践的潜力。

在我们的之前的文章中,我们展示了 LLMs 使用 Kaggle 竞赛中常见的表格数据提供预测的潜力。几乎不需要任何努力(即数据清理和/或特征开发),我们的基于 LLM 的模型能够在多个竞赛条目中获得八十多百分位的分数。虽然这与最佳模型相比并不具有竞争力,但所需的少量工作使其成为一个有趣的附加预测工具和一个优秀的起点。

本文解决了数据科学和机器学习工作流程中的另一个常见挑战:漂移和异常检测。机器学习模型是用历史数据和已知结果进行训练的。存在一个隐含的假设,即未来的数据将保持静态(例如,关于其分布特征不变)。在实践中,这往往是一个脆弱的假设。复杂系统因各种原因随时间发生变化。数据可能自然地转变为新模式(通过漂移),或者可能由于训练数据之后出现的新异常而发生变化。负责模型的数据科学家通常需要监控数据,检测漂移或异常,并作出与重新训练模型相关的决策。这不是一项简单的任务。许多文献、方法论和最佳实践已经被开发出来以检测漂移和异常。许多解决方案采用了昂贵且耗时的努力,旨在检测和减轻生产系统中异常的存在。

我们想知道:LLMs 是否可以减少漂移和异常检测所需的工作量?

方法

本文提出了一种使用大语言模型(LLM)嵌入、UMAP 降维、非参数聚类和数据可视化来进行异常和漂移检测的新方法。异常检测(有时也称为离群点检测或稀有事件检测)是使用统计学、分析和机器学习技术来识别感兴趣的数据观测值。

为了说明这种方法,我们使用了 加州中等住宅价值数据集,该数据集可在 SciKit learn 包中获得(© 2007–2023,scikit-learn 开发者,BSD 许可证;原始数据来源是 Pace, R. Kelley 和 Ronald Barry,“稀疏空间自回归”,“统计与概率通讯”,第 33 卷,第 3 期,1997 年 5 月 5 日,第 291–297 页)。我们通过采样和置换数据合成小区域的异常数据。合成数据然后很好地隐藏在原始(即“生产”)数据中。实验通过改变异常点的比例以及“异常度”——基本上是我们预计发现异常的难度,来进行。然后该过程试图识别这些异常值。通常,这种内点检测具有挑战性,需要选择比较集、模型训练和/或启发式定义。

我们证明了 LLM 模型方法可以以 96.7%的准确率(假阳性和假阴性大致相等)检测到包含仅 2%数据的异常区域。这种检测能够发现隐藏在现有分布内部的异常数据。这种方法可以应用于生产数据,无需标记、手动分布比较,甚至无需过多思考。该过程完全不依赖参数和模型,是进行异常检测的一个有吸引力的第一步。

背景

模型可观察性的一个常见挑战是快速且直观地识别异常数据。这些异常值可能由于数据漂移(数据分布随时间的自然变化)或异常(意外的数据子集覆盖预期分布)而出现。异常可能来自许多来源,但有两个非常常见。第一个是对上游数据源的(通常是)未通知的更改。越来越多的数据消费者与数据生产者的接触较少。计划中的(和未计划的)更改没有传达给数据消费者。第二个问题则更为隐蔽:对流程和系统中执行不良操作的对手。这些行为通常引起数据科学家的关注。

一般来说,查看多变量数据的漂移方法存在一些挑战,这些挑战限制了它们的使用。一种典型的方法是使用变分自编码器(VAEs)、降维,或者将原始未编码的数据组合成一个向量。这通常涉及到建模过去的异常、创建特征以及检查内部(不)一致性。这些技术的缺陷在于需要不断(重新)训练模型并适应每个数据集。此外,团队通常需要手动识别、设置和调整许多参数。这种方法可能很慢、耗时且昂贵。

在这里,我们将 LLMs 应用于表格数据中的异常检测任务。展示的方法具有优点,因为它易于使用。无需额外的模型训练,降维使问题空间在视觉上可表示,聚类生成异常簇的候选项。使用预训练的 LLM 可以绕过参数化、特征工程和专门模型训练的需求。其插件化意味着 LLM 可以直接为数据科学团队工作。

数据

在这个例子中,我们使用的是 1990 年美国人口普查中的加利福尼亚州房屋价值数据(Pace et al, 1997),该数据可以在在线找到,并且被纳入了SciKit-Learn Python 包中。选择这个数据集是因为它的清洁度、使用了连续/数值特征以及其普遍可用性。我们已经在类似的数据上进行了实验。

方法论

注:有关该过程的更完整示例,请参阅配套笔记本

合成异常

与之前的研究一致,我们发现检测异常的能力受三个因素的影响:异常观察的数量、异常值或这些观察值在参考分布中突出的程度,以及定义异常的维度数量。

第一个因素应该很明显。更多的异常信息导致检测更快更容易。确定一个单独的观察是否异常是一个挑战。随着异常数量的增加,识别变得更容易。

第二个因素,即异常值程度,至关重要。在极端情况下,异常可能超出一个或多个变量的允许范围。在这种情况下,异常检测是显而易见的。更困难的是那些隐藏在分布中间的异常(即“内部点”)。内部点检测往往具有挑战性,许多建模方法对任何形式的系统检测感到无能为力。

最后一个因素是定义异常所使用的维度数量。换句话说,就是有多少变量参与了观察的异常特性。在高维空间中,观察通常变得稀疏。一组在多个维度上变化很小的异常,可能突然变得与参考分布中的观察值非常遥远。几何推理(以及各种多维距离计算)表明,受影响的维度数量越多,检测越容易,检测限制越低。

在合成我们的异常数据时,我们影响了这三个变量。我们进行了一个实验设计,其中:异常观测的数量从总观测的 1% 到 10% 不等,异常值集中在 0.50–0.75 分位数周围,变量数量从 1 到 4 受影响。

利用 LLM 进行异常和漂移检测

我们的方法使用提示让 LLM 提供关于数据每一行的信息。提示很简单。对于每一行/观测,一个提示包括以下内容:

“<列名> 的值是 <单元格值>。<列名> 的值是 <单元格值>。…”

对每一列进行这样的操作,为每一行创建一个连续的提示。有两点需要注意:

  1. 对训练数据生成提示不是必要的,只需对进行异常检测的数据生成提示即可。

  2. 询问观测是否异常并非严格必要(尽管这是一个额外调查的热点领域)。

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

从表格数据创建的提示示例。每行数据被编码为一个单独的提示,并通过连接每个单元格中的简单语句生成。(图片由作者提供)

一旦提供给 LLM,模型的文本响应会被 忽略。我们只关心每个观测的嵌入(例如嵌入向量)。嵌入向量至关重要,因为每个嵌入向量提供了观测在 LLM 训练参考下的位置。尽管实际机制由于神经网络模型的性质和复杂性而被掩盖,但我们将 LLM 视为构建一个潜在响应表面。该表面已包含互联网规模的来源,包括对房价的学习。真实观测——例如那些与学习结果匹配的——位于或接近响应表面;异常值则位于响应表面之外。虽然响应表面大体上是一个隐藏的产物,但确定异常并不是学习表面的问题,而是单纯地识别类似值的簇。真实观测彼此接近。异常观测也彼此接近,但这些集合是不同的。确定异常只是分析这些嵌入向量的问题。

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

LLM 捕捉了数字特征和分类特征的结构。上图展示了表格数据框的每一行以及映射到 LLM 生成的嵌入的模型预测。LLM 以一种方式映射这些提示,从特征创建拓扑表面,这些特征基于 LLM 之前训练的内容。在上述示例中,你可以看到数值字段 X/Y/Z 在左侧为低值,在右侧为高值。(图片由作者提供)

可视化:维度缩减、聚类和异常识别

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

这个欧几里得距离图提供了一个粗略的指示,说明数据中是否存在异常。图表右侧的凸起与引入的数据中的合成异常是一致的。

UMAP 算法是一项重要创新,它旨在保持几何结构,以便优化使得紧密观察仍然保持紧密,而远离的观察保持远离。在进行维度减少后,我们应用聚类方法来查找密集的、相似的簇。这些簇随后与参考分布进行比较,这可以用来突出异常或漂移的簇。这些步骤大多数是无参数的。最终目标是识别出作为离群点的数据点簇。

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

嵌入漂移:通过 UMAP 降维、聚类和与参考分布比较的自动(异常)簇检测。漂移或异常点会自动用红色标出,并可排队进行进一步分析,包括带有人类反馈的强化学习。

实验结果

我们探讨了多种条件下的异常检测方法,包括异常变量的数量、异常的比例以及离群程度。在这些实验中,即使在值接近分布的中位数(中位数上下 +/- 5 个百分位)的情况下,我们也能够检测到异常区域,其占数据的比例达到了或超过了 2%。在实验的五次重复中,该方法都能自动找到并识别异常区域,并且如上节所示,使其明显可见。在将单个点识别为异常簇成员时,该方法的准确率为 97.6%,精确度为 84%,召回率为 89.4%。

结果总结

  • 异常比例:2%

  • 异常分位数:0.55

  • 异常列数:4

  • 准确率:97.6%

  • 精确度:84.0%

  • 召回率:89.4%

混淆矩阵

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

作者提供的图像

结论

这部分展示了使用预训练的 LLM 帮助从业者识别表格数据中的漂移和异常。在对不同异常比例、异常位置和异常列进行测试期间,该方法在大多数情况下能够检测到占数据 2%以内的异常区域,且这些区域位于变量值中位数的五个百分位以内。我们并不声称这种分辨率适合于稀有事件检测,但检测异常内点的能力令人印象深刻。更令人印象深刻的是,这种检测方法是无参数的,快速且易于实现,并且基于视觉。

该方法的实用性源自于呈现给 LLMs 的基于表格的数据提示。在训练过程中,LLMs 在高维空间中绘制拓扑表面,这些表面可以通过潜在的嵌入表示。通过预测映射出的高维表面代表了真实(训练)数据中的特征组合。如果 LLMs 接收到漂移或异常的数据,这些数据会出现在距离真实/真数据更远的流形上的不同位置。

这篇博客中描述的方法在模型可观测性和数据治理方面具有直接应用,允许数据组织与组织制定服务级别协议|理解(SLA)。例如,通过少量工作,组织可以声明将在固定时间内检测到所有异常,这些异常占数据的 2%体积。虽然这可能看起来不是什么重大好处,但它限制了漂移/异常造成的损害,并且可能比许多组织目前取得的结果更好。这可以安装在任何新的表格数据集上。随后,如有需要,组织可以努力提高灵敏度(降低检测限度)并改善 SLA。

将 LLM 应用于企业数据:概念、关注点和热点观点

原文:towardsdatascience.com/applying-llms-to-enterprise-data-concepts-concerns-and-hot-takes-e19ded4bde88?source=collection_archive---------0-----------------------#2023-05-28

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

·

关注 发表在 Towards Data Science ·11 分钟阅读·2023 年 5 月 28 日

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

来源:DreamStudio(由作者生成)

让 GPT-4 证明有无限个素数——而且要押韵——它可以做到。但让它回答你的团队上季度的表现如何,它将惨败。这说明了大型语言模型(“LLMs”)的一个根本性挑战:它们对一般的、公开的知识(如素数理论)有很好的理解,但对专有的、非公开的信息(例如你团队上季度的表现)完全不了解。[1] 专有信息对于绝大多数企业使用工作流至关重要。一个理解公共互联网的模型虽然有趣,但对于大多数组织在原始形式下作用不大。

在过去的一年里,我有幸与多个组织合作,将大型语言模型(LLMs)应用于企业案例。本文详细介绍了任何开始此类旅程的人应该了解的关键概念和关注点,以及对 LLMs 如何演变及其对机器学习产品策略的影响的一些见解。它面向产品经理、设计师、工程师以及其他对 LLMs“底层”工作原理了解有限或没有了解,但有兴趣学习这些概念而无需深入技术细节的读者。

四个概念

检索增强生成(RAG):上下文窗口和嵌入

让 LLM 对专有数据进行推理的最简单方法是将专有数据提供给模型的提示。大多数 LLM 可以正确回答以下问题:“我们有 2 个客户,A 和 B,分别花费了$100K 和$200K。谁是我们最大的客户,他们花了多少钱?”我们只是通过将查询(第二句话)与上下文(第一句话)预先添加来进行了基本的提示工程。

但在现实世界中,我们可能有成千上万或数百万的客户。我们如何决定哪些信息应该进入上下文——考虑到每个包含在上下文中的单词都需要付费?这就是嵌入的作用。嵌入是一种将文本转换为数值向量的方法,相似的文本生成相似的向量(在 N 维空间中“接近”的向量)。[2] 我们可能会嵌入网站文本、文档,甚至是来自 SharePoint、Google Docs 或 Notion 的整个语料库。然后,对于每个用户提示,我们将其嵌入,并找到与我们的提示向量最相似的文本语料库中的向量。

例如,如果我们嵌入了有关动物的维基百科页面,当用户询问有关野生动物园的问题时,我们的搜索将高度排名有关狮子、斑马和长颈鹿的维基百科文章。这使我们能够识别与提示最相似的文本块——因此最有可能回答问题的文本块。[3] 我们将这些最相似的文本块包含在预先添加到提示中的上下文中,以便提示中包含 LLM 回答问题所需的所有信息。

微调

嵌入的一个缺点是每次调用 LLM 都需要将所有上下文与提示一起传递。LLM 没有对最基本的企业特定概念的“记忆”。而且由于大多数基于云的 LLM 提供商按提示令牌收费,这可能会很快变得昂贵。[4]

微调使 LLM 能够理解特定企业的概念,而无需在每个提示中包含这些概念。我们取一个基础模型,该模型已经通过数十亿个学习参数编码了一般知识,并调整这些参数以反映特定企业知识,同时仍保留底层的一般知识。[5] 当我们使用新的微调模型生成推断时,我们可以“免费”获得这些企业知识。

与嵌入/提示工程不同,后者的底层模型是第三方黑箱,微调更接近经典机器学习,机器学习团队从零开始创建自己的模型。微调需要一个带有标记观察的数据集;微调后的模型对训练数据的质量和数量非常敏感。我们还需要做出配置决策(如轮次、学习率等),协调长期训练任务,并跟踪模型版本。一些基础模型提供商提供了抽象化这种复杂性的 API,但有些则没有。

尽管微调模型的推断可能更便宜,但这可能会被昂贵的训练任务所抵消。[6] 一些基础模型提供商(如 OpenAI)仅支持落后模型的微调(所以不包括 ChatGPT 或 GPT-4)。

Evals

LLMs 带来了一个新颖且重要的挑战,即衡量复杂输出的质量。经典的机器学习团队有经过验证的方法来衡量简单输出的准确性,如数值预测或分类。但大多数企业使用 LLM 的场景涉及生成数十到数千个单词的响应。概念复杂到需要超过十个单词时,通常可以用多种方式表达。因此,即使我们有一个经过人工验证的“专家”响应,对模型响应与专家响应进行精确字符串匹配也是过于严格的测试,会低估模型响应的质量。

Evals框架,由 OpenAI 开源,是应对这一问题的一种方法。该框架需要一个标记的测试集(其中提示与“专家”响应匹配),但它允许对模型和专家响应进行广泛的比较。例如,模型生成的答案是否是专家答案的子集或超集;是否在事实上一致;比专家答案更简洁或不如专家答案简洁?警告是 Evals 使用 LLM 来进行这些检查。如果“检查者”LLM 存在缺陷,评估结果本身可能也会不准确。

对抗样本

如果你在生产环境中使用 LLM,你需要确信它能够安全地处理误导性或恶意的用户输入。对于大多数企业来说,起点是确保模型不会传播虚假信息。这意味着系统需要知道自己的局限性以及何时说“不知道”。这里有许多战术方法。可以通过提示工程来实现,例如使用提示语言“如果无法用上述上下文回答问题,请回答‘我不知道’”。也可以通过微调来实现,提供超出范围的训练示例,其中专家的回答是“我不知道”。

企业还需要防范恶意用户输入,例如提示黑客攻击。限制系统可接受的输入和输出的格式及长度可以是一个简单而有效的起点。如果你只是为内部用户服务,采取预防措施是一个好主意;如果你为外部用户服务,这些预防措施则是必不可少的。

三个关注点

偏见延续

最受欢迎的 LLM(OpenAI / GPT-4、Google / Bard)的开发者们已经费尽心力地将他们的模型与人类偏好对齐,并部署了复杂的调节层。如果你让 GPT-4 或 Bard 讲一个种族歧视或厌女的笑话,它们会礼貌地拒绝。[7]

这是个好消息。不过坏消息是,这种针对社会偏见的调节措施,并不一定能防止机构偏见。设想我们的客户支持团队对某一特定类型的客户有粗鲁的历史。如果历史的客户支持对话被天真地用于构建一个新的 AI 系统(例如,通过微调),这个系统可能会复制这种偏见。

如果你使用过去的数据来训练一个 AI 模型(无论是经典模型还是生成模型),需要仔细审视你希望将哪些过去的情况延续到未来,哪些则不希望。 有时,制定原则并以此为基础工作(例如,通过提示工程),而不是直接使用过去的数据,会更为简便。

模型锁定

除非你一直生活在石头下,否则你应该知道生成型 AI 模型正在迅速进步。考虑到企业使用场景,今天最好的 LLM 可能在六个月后就不是最佳解决方案,六年后几乎肯定不会是最佳解决方案。聪明的机器学习团队知道,他们会在某个时候需要更换模型。

但还有另外两个主要原因需要轻松“替换” LLMs。首先,许多基础模型提供者在支持指数增长的用户量方面遇到了困难,导致了停机和服务质量下降。在你的系统中构建一个备份基础模型是一个好主意。其次,在你的系统中测试多个基础模型(“赛马”)来了解哪个表现最好是非常有用的。根据上面的评估部分,分析地衡量模型质量通常很困难,因此有时你只想运行两个模型并进行定性比较。

数据泄露

阅读你考虑使用的任何基础模型的条款和条件。如果模型提供者有权使用用户输入进行未来的模型训练,那是令人担忧的。LLMs 体积如此庞大,以至于特定用户的查询/响应可能会直接编码到未来的模型版本中,并可能对该版本的任何用户开放。想象一下你组织中的用户查询“我如何清理这段做 XYZ 的代码? [你的专有机密代码在这里]”。如果这个查询被模型提供者用来重新训练他们的 LLM,那么新版本的 LLM 可能会学习到你的专有代码是解决 XYZ 用例的好方法。如果一个竞争对手询问如何做 XYZ,这个 LLM 可能会“泄露”你的源代码,或者类似的内容。

OpenAI 现在允许用户选择不让他们的数据用于训练模型,这设立了一个良好的先例,但并不是所有模型提供者都遵循了他们的例子。一些组织也在探索在自己的虚拟私有云中运行 LLMs;这也是对开源 LLMs 感兴趣的一个主要原因。

两个热点问题

提示工程将主导微调

当我首次开始为企业使用调整大型语言模型(LLMs)时,我对微调(fine tuning)的兴趣远大于提示工程(prompt engineering)。微调感觉更符合我所熟悉的经典机器学习系统的原则:处理一些数据,生成训练/测试数据集,启动训练任务,等待一段时间,评估结果与某些指标。

但我逐渐相信,对于大多数企业用例来说,提示工程(配合嵌入)是一种更好的方法。首先,提示工程的迭代周期比微调要快得多,因为没有模型训练,而模型训练可能需要数小时或数天。改变提示并生成新的响应可以在几分钟内完成。相反,微调在模型训练方面是不可逆的;如果使用了不正确的训练数据或出现了更好的基础模型,你需要重新开始微调任务。其次,提示工程需要的 ML 概念知识远少于神经网络超参数优化、训练任务协调或数据整理等。微调通常需要经验丰富的 ML 工程师,而提示工程通常可以由没有 ML 经验的软件工程师完成。第三,提示工程对于快速增长的模型链策略效果更佳,在这种策略中,复杂的请求被分解为更小的组成请求,每个请求可以分配给不同的 LLM。有时,最好的“组成模型”是经过微调的模型。[8] 但对企业而言,大多数增值工作在于(i)找出如何拆解问题,(ii)为每个组成部分编写提示,以及(iii)为每个部分确定最佳的现成模型;而不是创建自己的微调模型。

随着时间的推移,提示工程的优势可能会不断扩大。如今,提示工程需要长而昂贵的提示(因为每个提示必须包含上下文)。但我敢打赌,随着模型提供商领域的竞争加剧以及提供商们找到更便宜的 LLM 训练方法,每个 token 的成本会迅速下降。提示工程目前也受限于最大提示大小——不过,OpenAI 已经接受 GPT-4 每个提示 32K tokens(约 40 页的平均英文文本),而Anthropic 的 Claude 接受 100K tokens(约 15 页)。我也敢打赌,未来会出现更大的上下文窗口。

[2023 年 8 月更新] 这篇文章很棒 解释了你可能不需要微调的原因。

数据不会像以前那样成为护城河

随着 LLMs 在生成可人类解释的推理方面变得越来越好,考虑人类如何使用数据进行推理以及这对 LLMs 意味着什么是很有用的。[9] 人类实际上并不使用很多数据!大多数时候,我们做的是“零样本学习”,这意味着我们回答问题时不需要提供一组示例问答对。提问者只提供问题,我们根据逻辑、原则、启发式、偏见等来回答。

这与几年前的 LLMs 有所不同,当时它们只能进行少量学习,你需要在提示中包含少量示例问答对。这与经典的机器学习有很大不同,后者需要对数百、数千或数百万个问答对进行训练。

我坚信,LLM 使用案例中占主导地位的将会是“零样本”使用。LLMs 将能够在没有任何用户提供示例的情况下回答大多数问题。它们将需要提示工程,以指令、政策、假设等形式存在。例如,这篇文章使用 GPT-4 审查代码中的安全漏洞;这种方法不需要关于过去易受攻击代码的数据。清晰的指令、政策和假设将变得越来越重要——但拥有大量高质量、标记好的专有数据将变得不那么重要。

如果你正在积极地将 LLMs 应用于你的企业数据中,我很想听听你发现了什么有效,什么无效。请留下评论!

脚注

[1] 直到最近,LLMs 对最新的公开知识也不了解——例如,GPT-4 是在 2021 年 9 月之前收集的信息上进行训练的。然而,现在 GPT-4 和 Bard 的消费者接口可以查询开放互联网,并收集有关近期事件的信息。因此,时效性正迅速消退,成为 LLMs 的知识限制。

[2] 嵌入可以处理各种数据结构,而不仅仅是文本。

[3] 整个嵌入工作流程发生在调用 LLM 之前。例如,OpenAI 推荐使用其 ada-002 模型进行嵌入,这比任何前沿的 GPT 模型都更便宜、更快。

[4] 令牌是词语或词语的一部分。这是一个很好的解释,说明为什么语言模型使用令牌而不是词语。

[5] 学习到的参数数量可以从百万到万亿不等。目前大多数广泛使用的 LLM 具有数十亿个参数。

[6] 更便宜的推理并非理所当然;OpenAI 收费 每 1 千个令牌$0.03–0.06,适用于具有 8K 上下文窗口的 GPT-4(具体取决于令牌是输入还是输出)。针对经过微调的 Davinci 模型,它的收费为每 1 千个令牌$0.12,该模型已相对滞后。

[7] 当然,这些人类是由 OpenAI 和 Google 雇佣的。由于许多人不同意这些组织的价值观,他们也不同意这些审查政策。

[8] 例如,GOAT 是一个针对算术进行了微调的开源模型 LLaMA 的版本。它在许多算术基准测试中超越了 GPT-4。大多数企业的工作流程都需要进行算术运算;在链式处理方法下,涉及算术的工作流程部分会被识别并路由到 GOAT。对于这样的企业来说,投资于良好的路由和与 GOAT 的集成是有意义的,但在我看来,不值得自己微调算术 LLM。

[9] 关于今天的语言模型(LLMs)是否能够真正进行推理,以及真正的推理到底意味着什么(是否需要意识?自我意识?主动性?)存在很多争论。绕过这个哲学上的而非实证性的争论,值得注意的是,LLMs 在产生符合广泛认同的良好推理观念的解释方面确实在不断进步;这篇论文中有许多很好的例子。

“近似预测”使特征选择极大地加快

原文:towardsdatascience.com/approximate-predictions-make-feature-selection-radically-faster-0f9664877687

特征选择之所以如此缓慢,是因为它需要创建许多模型。了解如何利用近似预测让其速度极快。

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

·发表于 Towards Data Science ·10 分钟阅读·2023 年 11 月 17 日

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

[作者提供的图片]

在开发机器学习模型时,我们通常从一大堆特征开始,这些特征是我们特征工程工作结果。

特征选择是选择对我们的机器学习模型最优的小子集特征的过程

为什么这样做而不是保持所有特征?

  • 内存。大数据占用大空间。丢弃特征意味着你需要更少的内存来处理数据。有时也会有外部约束。

  • 时间。在较少的数据上重新训练模型可以节省大量时间。

  • 准确性。少即是多:这对于机器学习也是如此。包含冗余或无关的特征意味着包含不必要的噪音。经常发生的情况是,使用较少数据训练的模型表现更好。

  • 可解释性。较小的模型更容易解释。

  • 调试。较小的模型更容易维护和排查故障。

现在,特征选择的主要问题是非常慢,因为它需要训练许多模型

在这篇文章中,我们将看到一个技巧,它通过“近似预测”使特征选择极其快速。

一个非常困难的问题

让我们尝试可视化特征选择的问题。我们从N个特征开始,其中N通常是数百或数千个。

因此,特征选择的输出可以看作是一个长度为N的由“是”/“否”组成的数组,其中数组的每个元素告诉我们相应的特征是否被选择。

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

特征选择的输出。[作者提供的图片]

特征选择的过程包括尝试不同的“候选”,最后选择最佳的一个(根据我们的性能指标)。

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

每个候选都是一组不同的特征。 [作者提供的图像]

由于我们有N个特征,且每个特征可以被选择或不被选择,这意味着我们有 2^N 个可能的候选

这个数字很快会变得巨大。例如,仅有 50 个特征,并假设评估一个候选平均需要 1 秒,那么尝试所有可能的候选将需要 3500 万年!

因此,应该清楚为什么在大多数实际情况下,评估的候选数量只是所有可能候选的一个微小部分。

候选方案提议与评估。

存在许多特征选择方法,但所有这些方法都可以被框架为由两个步骤组成的迭代过程:

  1. 提议一个新的候选。

  2. 评估候选。

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

一个非常通用的特征选择框架。 [作者提供的图像]

通常,所有注意力都集中在第一步。第一步的目的是基于我们目前的学习,找到可能表现良好的候选。

然而,在本文中,我们将完全忽略第 1 步,专注于第 2 步:候选评估。为此,我们将完全随机地提出新的候选。特别是,我们将使用以下函数来提出新的候选:

def get_random_candidate(features):
   """Get a random set of features."""

  candidate_size = np.random.randint(1, len(features)+1)
  candidate = np.random.choice(features, replace=False, size=candidate_size)

  return candidate

关于第 2 步,我们将基于不同类型的预测比较两种评估策略:

  • 精确预测。

  • 近似预测。

如果你现在对这些术语不熟悉也不用担心,接下来的段落会让事情变得更清晰。

基于“精确预测”的特征选择。

给定一个新的候选,你到目前为止看到的所有特征选择方法可能都遵循这种结构:

  1. 在由训练观察和候选特征组成的数据框上训练模型。

  2. 使用模型对验证集进行预测。

  3. 在验证集上计算性能指标。

从图形上来看,这相当于:

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

基于精确预测的特征选择。 [作者提供的图像]

这种方法基于**“精确预测”,因为我们获得的是仅在候选特征上训练的模型所做的实际预测**。

这个过程,用 Python 表示,大致如下:

for iteration in n_iterations:
  # Step 1: Propose a candidate (i.e. a list of features).
  candidate = get_random_candidate(X_train.columns)

  # Step 2: Train a model on those features
  model = model.fit(X_train.loc[:, candidate], y_train)

  # Step 3: Get the predictions made by the model on the validation set.
  preds_valid = model.predict_proba(X_valid.loc[:, candidate])

  # Step 3: Compute the performance metric on the validation set.
  ap_valid = average_precision_score(y_valid, preds_valid)

正如你所见,每次迭代都会训练一个新的模型,使得这个过程非常缓慢。

那么,有没有办法在不必在每次迭代时训练新模型的情况下利用我们对特征的了解呢?

这就是“近似预测”发挥作用的地方。

近似预测的直觉。

为了帮助我们理解“近似预测”,我们使用Pycaret(一个遵循MIT 许可的 Python 库)中的示例数据集。数据集名为“Concrete”,任务是根据一些特征预测混凝土的强度。

我们从将观察数据分成训练集和验证集开始。

from pycaret.datasets import get_data
from sklearn.model_selection import train_test_split

df = get_data("concrete", verbose=False)
X, y = df.drop("strength", axis=1), df["strength"]
X_train, X_valid, y_train , y_valid = train_test_split(X, y)

我们可以在训练数据集上训练一个模型(我将使用 LightGBM,但任何模型都可以):

from lightgbm import LGBMRegressor

model = LGBMRegressor(verbose=-1).fit(X_train, y_train)

由于我们已经有了训练好的模型,我们可以计算 SHAP 值(如果你对这个主题不熟悉,可以阅读我的 SHAP 值介绍):

from shap import TreeExplainer

shap_explainer = TreeExplainer(model)
shap_expected_value = shap_explainer.expected_value
shap_valid = shap_explainer.shap_values(X_valid)

我们可以轻松显示 SHAP 值:

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

混凝土数据集验证集的 SHAP 值。[图片来自作者]

每个 SHAP 值代表了某个特征对该观察的最终预测的贡献。例如,如果我们取第一行的第一个特征(-14.708),这意味着该特征将最终预测值降低了-14.708。

SHAP 值最重要的特性是它们是加性的。这意味着如果我们对第一行的 SHAP 值(-14.708185 +7.572576 -0.366994 +…)进行求和,我们可以准确得到模型对该行的预测。

这对所有行都适用。不相信我?你可以用下面的代码自己检查:

import numpy as np

pred_valid = model.predict(X_valid)
pred_valid_proxy = shap_expected_value + shap_valid.sum(axis=1)

assert (np.abs(approx_pred_valid - pred_valid) < 1e-10).all()

这证明了通过求和任何个体的 SHAP 值,我们可以准确得到该个体的模型预测(实际上在第十位小数处有一个小的四舍五入差异,但可以忽略)。

我们可以利用 SHAP 值的加性属性来模拟训练于特定特征子集的模型所产生的预测

假设我们想回答以下问题:“如果模型只使用特征Fly AshWaterAge,它会做出什么预测?”

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

从 SHAP 值中选择特征子集。[图片来自作者]

SHAP 值允许我们回答这个问题。实际上,由于它们是加性的,并且考虑了特征间的交互,只需对那些特征的 SHAP 值进行求和,我们就能估计出一个仅在这些特征上训练的模型所做的预测

candidate_features = [...]

approx_pred_valid = shap_expected_value + shap_valid[candidate_features].sum(axis=1)

当然,这只是一个近似!如果我们想要准确的预测,我们需要训练一个仅专注于候选特征的新模型。这就是为什么我称这种方式获得的预测为“近似预测”

但是,近似预测对特征选择有什么用呢?

基于“近似预测”的特征选择

近似预测允许我们模拟任何可能的特征候选,而不必训练一个新模型。我们只需要训练所有特征的模型的 SHAP 值。

你能看到这为什么是一个改变游戏规则的因素吗?使用精确预测时,我们需要在每次迭代时训练一个新模型。相反,为了获得近似预测,我们只需对数据框的某些列进行求和! 这使得过程快得多。

从图形上看,这就是近似预测发生的情况:

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

基于近似预测的特征选择。[作者提供的图片]

在 Python 中的翻译:

# Step 0: Train a model on the dataset with all the features and compute the
# SHAP values on the validation set.
shap_valid = model.fit(X_train, y_train).get_shap_values(X_valid)

for iteration in n_iterations:
  # Step 1: Propose a candidate (i.e. a list of features).
  candidate = get_random_candidate(X_train.columns)

  # Step 2: Get the predictions on the validation set 
  # (by summing the SHAP values of the respective features).
  pred_valid = shap_valid.loc[:, candidate].sum(axis=1)

  # Step 3: Compute the performance metric on the validation set.
  ap_valid = average_precision_score(y_valid, pred_valid) 

如你所见,在这种情况下,一开始只训练了一个模型。然后,在每次迭代中,我们只是执行简单的列求和,这显然比训练一个全新的模型要快得多。

这看起来很惊人,但我们必须记住,求和一些特征的 SHAP 值就像是获得一个代理,这个代理接近于如果我们只用这些特征训练模型时的实际预测。

所以,就像任何近似一样,问题变成了:这个近似对我们的目的足够好吗?

代理是否足够好?

为了回答这个问题,让我们从Pycaret(一个MIT 许可证下的 Python 库)中获取一个示例数据集。

数据集称为“心脏”,包含 15 个特征:

  • AGE_50

  • MD_50

  • SBP_50

  • DBP_50

  • HT_50

  • WT_50

  • CHOL_50

  • SES

  • CL_STATUS

  • MD_62

  • SBP_62

  • DBP_62

  • CHOL_62

  • WT_62

  • IHD_DX

使用这些特征,我随机生成了 50 个不同的候选(即 50 组不同的特征)。作为性能指标,我使用了平均精度。对于每个候选,我尝试了精确预测和近似预测方法,并且对于这两种方法,我计算了:

  • 实际 AP:这是使用精确预测计算的平均精度。

  • 预测的 AP:这是使用近似预测计算的平均精度。

如果预测的 AP 与实际的 AP 非常相似,我们可以说代理是好的。

让我们可视化 50 个候选的预测 AP 和实际 AP。

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

心脏数据集。每个点表示一组候选特征。[作者提供的图片]

作为例子,我添加了一些标签,显示了该候选特征中包含的特征。

出于好奇,我们还来可视化每个候选特征包含的特征数量。

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

心脏数据集。每个点表示一组候选特征。标签表示该候选特征的数量。[作者提供的图片]

预测的 AP 与实际的 AP 似乎非常相关,这是好消息!

让我们来测量一下。我将使用斯皮尔曼相关系数而不是皮尔逊相关系数,因为在这种情况下,我们更关注候选的相对顺序,而不是它们的线性关系。

在这种情况下,相关性为 89%,非常高。这对我们来说是好消息,因为这意味着如果我们使用近似预测选择最佳候选特征,这个候选特征也很可能是准确预测中的最佳(或最佳之一)候选特征。

我们也可以对 Pycaret 中的一些其他数据集重复相同的程序。对于每个数据集,我随机抽取 50 个特征集候选项,并测量预测 AP 和实际 AP。

这些是结果:

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

13 个数据集,每个数据集 50 个候选特征。每个点代表一个候选特征。[作者提供的图片]

一看之下,似乎所有数据集都有很强的相关性。这再次证实了我们的直觉。

但让我们更严谨地进行计算,分别计算每个数据集的预测 AP 与实际 AP 之间的斯皮尔曼相关性:

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

数据集之间预测 AP 和实际 AP 的相关性。[作者提供的图片]

这些数字证实了我们之前的印象:相关系数始终很高,介于 87%和 100%之间。

因此,我们可以得出结论:近似预测实际上是准确预测的良好代理, 我们可以利用它们使特征选择变得更快,同时保持可靠性。

结论

任何特征选择方法至少包括两个步骤:提出一组新的候选特征和评估这些候选特征。

在这篇文章中,我们专注于第二步(评估),展示了如何利用 SHAP 值来获得“近似预测”。这种方法允许我们获得“准确预测”的估计值,即如果我们训练一个专注于每组特征的不同模型,我们将会得到的预测结果。

好处在于近似预测通过简单的加法获得,从而使评估步骤大大加快,并允许评估更多候选特征。

我们还展示了近似预测足够可靠,因为我们使用这种方法获得的性能指标与我们使用准确预测所获得的性能指标高度相关。

你可以通过 这个笔记本复制本文中使用的所有代码。

感谢你的阅读!

如果你觉得我的工作有用,你可以订阅 每次我发布新文章时接收电子邮件 (通常每月一次)。

想要支持我的工作?你可以 请我喝一杯卡布奇诺

如果你愿意, 加我 Linkedin

2024 年 4 月特刊:人工智能能否被治理?

原文:towardsdatascience.com/april-edition-can-ai-be-governed-ee08b20b6e9f?source=collection_archive---------16-----------------------#2023-04-05

月度特刊

负责创新的利害关系和挑战

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

·

关注 发表在 Towards Data Science · 4 分钟阅读 · 2023 年 4 月 5 日

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

图片由 Marnee Wohlfert 提供,发布在 Unsplash

在人工智能研究领域,区分真正的进展与炒作从未如此困难,但最近几周我们似乎达到了一个转折点。之前需要深厚技术专长的工具已经进入主流,而整个行业似乎在随着强大且易于获取的人工智能应用的出现,质疑自身的生存机会。

上个月底,数百位知名研究人员和科技领袖发布了一份广泛传播的请愿书,呼吁暂时停止所有超越 GPT-4 能力的人工智能系统的开发。许多批评性的回应随之而来,其中包括由“随机鹦鹉”作者 Timnit Gebru、Emily M. Bender、Angelina McMillan-Major 和 Margaret Mitchell 提出的犀利异议,他们旨在重新审视围绕人工智能发展所带来的实际伦理和社会风险的辩论。

关于人工智能未来的更广泛讨论是复杂的、常常令人困惑的,并且不断变化。为了帮助我们的社区了解这个话题的广泛观点,我们选择了几篇突出的文章,从多个角度对其进行了覆盖。这些文章的作者避免了简单的“人工智能:好还是坏?”辩论,为那些没有简单答案的问题增添了急需的细微差别。

在我们深入探讨之前,我们想像往常一样感谢你对我们发布的工作的支持。对于那些想要做出有意义贡献的你们,考虑成为 Medium 会员;如果你是符合条件国家的学生,你现在可以以大幅折扣注册

TDS 编辑

TDS 编辑亮点

  • 我为何签署了“暂停巨型人工智能实验”请愿书(2023 年 3 月,8 分钟)

    尽管他是上述请愿书的签署者,Rafe Brena 博士 对于请愿书处理人工智能相关风险的方式有一些保留意见。他的最新文章解开了促使他最终决定在公开信上签名的思考过程,并描述了他希望看到的行业发展方向。

  • 机器学习项目中的伦理考量(2023 年 2 月,7 分钟)

    如果你对人工智能伦理话题还比较陌生,Hennie de Harder的概述是一个有用的、适合初学者的入门指南,涵盖了一些关键概念和挑战,包括可解释性和隐私。

  • 欧盟的人工智能法案是什么,它将带来什么变化?(2022 年 8 月,16 分钟)

    对于调节 AI 工具的创建和实施,欧洲联盟的人工智能法案是最雄心勃勃的尝试之一。Sara Tähtinen带我们了解了这部提案法的关键细节,并对其优缺点进行了批判性评估。

  • 关于 AI 治理:如何开始(2022 年 10 月,8 分钟)

    AI 的负责任使用在超本地层面同样至关重要。Albert Suryadi认为,每个组织都需要考虑 AI 治理,以建立和维护信任,并分享了创建强大内部结构以实现这一目标的路线图。

  • 算法责任的参与性方法(2022 年 5 月,11 分钟)

    Maya Murad说,‘在审议民主制中,公民应对他们的数据使用拥有主动权,’包括在私人实体部署的算法决策系统(ADS)的背景下。如何实现这一点是棘手的,但 Maya 建议采用一种参与性框架,使人们和组织能够成为过程中的积极合作伙伴。”

  • 我们不知道如何让 AGI 安全(2022 年 7 月,21 分钟)

    关于人工通用智能的讨论——AI 研究人员是否在玩火?它可能就在拐角处吗?——总有可能沦为平庸的科幻小说(机器会杀死我们吗?)。Kyle O’Brien的反思恰恰因为承认了这一风险,并主张在 AI 进入未知领域时保持冷静和好奇而脱颖而出。

原创专题

探索我们最新的资源和阅读推荐。

  • 我们不断变化的全球村本特别专题汇集了 30 篇顶尖文章(以及一些推荐的公共数据集),涵盖数据科学、人口分析和可持续性等交汇点。

  • **让我们谈谈数学(面向数据科学家)**通过我们精心策划的总结,探索数学的美丽和复杂性——它涵盖了适合初学者的话题(例如:逻辑回归)以及更高级的主题。

  • 自然语言处理不仅仅是聊天机器人我们挑选了一些关于 NLP 主题的最新激动人心的项目讲解和教程,超越了 ChatGPT 和类似工具。

热门 文章

如果你错过了,以下是上个月 TDS 上一些最受欢迎的文章。

  • 帮助我获得数据科学家职位的作品集Matt Chapman 撰写

  • GPT-4 与 ChatGPT:训练、性能、能力与局限性探讨Mary Newhauser 撰写

  • 我在几乎所有数据科学项目中使用的 5 个 Python 装饰器Thuwarakesh Murallie 撰写

  • 三步学习机器学习:如何高效学习Angela Shi 撰写

  • 通过向这些专业人士学习来提升你的 Python 技能Tomer Gabay 撰写

  • 忘掉 SQLite,改用 DuckDB——感谢我吧Pol Marin 撰写

我们很高兴在三月份欢迎一批新的 TDS 作者——他们包括 João PereiraDorian DrostDiogo LeitãoLeonardo CastorinaJae KimHang YUMatt ChapmanRobert Elmes 等人。如果你有有趣的项目或想法想要分享,我们很想听听你的意见!

下个月见。

Araucana XAI:利用决策树在医疗保健中的局部解释性

原文:towardsdatascience.com/araucana-xai-why-did-ai-get-this-one-wrong-8ee79dabdb1a

引入一种基于 CART 的模型无关、后期 XAI 方法,以提供局部解释,提升医疗保健中 AI 辅助决策的透明度

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

·发表于 Towards Data Science ·阅读时间 7 分钟·2023 年 7 月 14 日

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

“Araucana”一词来源于智利的猴面包树松,但也是一种美丽的家禽鸡的名字。© MelaniMarfeld 来源于 Pixabay

为什么 AI 会在这一点上出错?

在人工智能领域,对复杂 AI 系统缺乏透明度和可理解性的担忧日益增加。近期研究致力于通过开发解释性模型来解决这个问题,这些模型揭示了像提升、集成和深度学习技术等不透明系统的内部工作原理。

局部和全球解释性

解释性模型可以以两种不同的方式揭示 AI 系统的行为:

  • 全球解释性。全球解释器提供对 AI 分类器整体行为的全面理解。他们旨在揭示在各种输入和场景中保持一致的宏观模式、趋势、偏差和其他特征。

  • 局部解释性。另一方面,局部解释器专注于提供对 AI 系统在单个实例中的决策过程的见解。通过突出对模型预测有重大影响的特征或输入,局部解释器提供了对特定决策如何得出的一个 glimpse。然而,需要注意的是,这些解释可能不适用于其他实例,也不能全面理解模型的整体行为。

可信且透明的 AI 系统的需求不断增加,这不仅受到以准确性著称但解释性有限的复杂黑箱模型广泛采用的推动,也受到遵守新法规的需求的激励,这些法规旨在保护个人免受数据及数据驱动应用滥用的影响,如人工智能法案、通用数据保护条例(GDPR)或美国国防部的人工智能伦理原则。

通过深入了解 AI 系统的内部工作机制并提供输出解释,研究人员努力揭开黑箱的神秘面纱,促进对重新塑造我们世界的技术的更大理解和信任。

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

黑箱模型与白箱可解释模型。在第一个流程中,蝴蝶被正确分类为昆虫,但模型没有提供其预测的解释。在第二个流程中,模型的内部机制是透明的,我们可以解释为什么蝴蝶被分类为昆虫。对于本质上不透明的模型,一种常见策略是通过训练来模仿黑箱模型的代理白箱模型提供解释。在我们的例子中,这可以表述为:“一个可解释的模型,表现得与黑箱模型完全一致,认为蝴蝶是昆虫,因为它有六条腿。”

模型不可知、事后、局部解释器

在这篇博客文章中,我们将主要关注局部可解释性,特别是模型不可知事后局部解释器。模型不可知解释器可以应用于任何机器学习模型,无论其底层算法或架构如何。术语“事后”指的是解释在模型对特定实例做出预测后生成的。简而言之,具有这些属性的解释器可以分析任何模型在特定实例上的决策过程,突出对预测影响最大的特征或输入,而无需修改或重新训练模型。

在撰写时,SHAP [1] 和 LIME [2] 可以说是解释机器学习模型预测的两种最广泛采用的模型不可知技术。

  • SHAP(SHapley Additive exPlanations)基于博弈论和 Shapley 值的概念。它通过为每个预测中的特征分配重要性分数来提供解释,考虑所有可能的特征组合及其对预测的贡献。SHAP 值捕捉了特征在所有可能特征组合中的平均边际贡献,从而提供更准确和一致的解释。

  • LIME(局部可解释模型无关解释)通过在实例的局部邻域创建一个更简单的可解释模型,如线性模型,来近似基础模型在感兴趣预测周围的行为。LIME 通过基于每个特征对局部模型输出的影响来加权特征的重要性,从而解释模型的预测。

SHAP 和 LIME 都有各自的优点和局限性,但两者共有的一个主要局限性是它们通过特征重要性和特征排名来提供解释。特征的重要性只是可解释 AI 这一更广泛和复杂概念的一个方面。例如,在临床领域,处理 AI 驱动工具的医生常常抱怨无法检查和导航模型得出特定决策的推理过程,就像他们处理医疗指南一样。

AraucanaXAI

AraucanaXAI [3] 诞生于解决临床医生对传统 XAI 方法的投诉,但也可以扩展到任何其他需要决策规则的场景。AraucanaXAI 框架提出了一种新颖的方法论,用于生成通用 ML 模型对单个实例的预测解释,使用决策树提供决策过程形式的解释。所提出的 XAI 方法的优点包括对原始模型的改进忠实度、处理非线性决策边界的能力,以及对分类和回归问题的原生支持。

至于 SHAP 和 LIME,AraucanaXAI 同样可以作为一个Python 包轻松通过 PyPI 安装。

## GitHub - detsutut/AraucanaXAI: 基于树的机器学习模型预测的局部解释

日益复杂的学习方法,如提升(boosting)、集成(bagging)和深度学习,已经使 ML 模型更加准确……

github.com

它是如何工作的?

算法相对简单。给定单个实例 x:

  1. 计算 D = dist(x,z) 对于训练集的每个元素 z。默认的距离度量是 Gower 距离,兼容混合类型变量。

  2. 定义子集 T_n 为最接近 xN 个元素(即 x 的邻域)。

  3. 使用 SMOTE 过采样(可选)来扩展邻域 T_n。这使得我们要检查的局部区域更加密集和平衡。

  4. 用黑箱分类器的预测函数f预测的类别y_hat重新标记T_n(或T_nS,即通过过采样生成的样本)的样本。将解释集E定义为T_nSx。请记住,代理模型的目标不是最大化预测性能,而是具有与原始模型相同的预测行为。这就是我们关注y_hat而非y的原因。

  5. E上训练决策树e。可选地,进行剪枝。

  6. 从根节点到对应于x的叶节点导航e以获取规则集。

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

AraucanaXAI 算法的逐步可视化。(注:重新标记步骤未显示)

用例示例:ALS 死亡率预测

现在我们对这种新的 XAI 方法了解更多了,我们什么时候使用它?正如本文开头所述,AraucanaXAI 旨在满足临床医生的需求,以可导航的树或一组与指南和既定医学知识易于比较的层次化规则的形式提供解释。

AraucanaXAI 最近被用来提升复杂预测模型,这些模型旨在基于 6 个月的观察预测肌萎缩侧索硬化症(ALS)患者的死亡率。预测 ALS 进展是一个具有挑战性的问题,需要复杂的模型和许多特征,包括通过问卷来分层 ALS 的严重程度。AraucanaXAI 可以帮助临床医生将模型的推理分解为更简单但真实的规则,通常是为了更好地理解模型为何与他们的观点不一致。

例如,在下面的例子中,实际情况表明 ALS 患者将在六个月内死亡,而神经网络则预测相反。AraucanaXAI 突出的规则集可以帮助理解模型的观点:发病日期发生在第一次 ALSFRS-R 问卷提交(T0)前 3 年,进展斜率小于 0.35(即,根据问卷,患者恶化缓慢),诊断日期在 T0 之前超过 8 个月,“翻身和调整床单” 的归一化评分较低。总体而言,这一临床图景并没有那么糟糕,这使得模型认为患者在六个月后仍然会活着。

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

针对特定 ALS 患者的死亡预测解释,由 SHAP(左)、LIME(中)、和 AraucanaXAI(右)提供

结论与未来工作

尽管同样的策略可以推广到其他领域,但 AraucanaXAI 已经被证明是在医疗保健中针对个体患者的 XAI 的有前途的方法,其中将解释分解为层次化规则为决策者提供了额外的价值。

  • 然而,仍然存在一些未解决的局限性。首先,医疗领域产生了越来越多的非结构化数据,但 AraucanaXAI 目前仅处理表格数据。为了在临床实践中使用,AraucanaXAI 需要升级以处理文本和图像,这对医疗机构至关重要。其次,什么构成对用户的“良好”解释目前没有明确的度量标准(这是目前 XAI 文献中已知的空白)以及医生用户本身的直接参与,这需要在设计良好的评估研究中进行。此类研究构成了未来值得追求的工作,具有潜在的好处可以造福可解释的 AI 社区。最后,AraucanaXAI 展示生成的解释的方式依赖于 scikit-learn 的决策树可视化功能,该功能有限,需要改进。

  • 如果你有兴趣帮助 AraucanaXAI,查看[GitHub 仓库成为贡献者!扩展/改进将得到适当的认可。

参考文献

[1] S. M. Lundberg 和 S.-I. Lee — 统一模型预测解释方法

[2] M. T. Ribeiro, S. Singh 和 C. Guestrin — “我为什么要相信你?”:解释任何分类器的预测

[3] E. Parimbelli, T.M. Buonocore, G. Nicora, W. Michalowski, S. Wilk, R. Bellazzi — 为什么人工智能在这个问题上出错了?基于树的机器学习模型预测解释

[4] T.M. Buonocore, G. Nicora, A. Dagliati, E. Parimbelli— XAI 在 ALS 6 个月死亡率预测中的评估

如果未另有说明,图片均为作者原创贡献。

  • 请在评论区留下你的想法,并分享如果你觉得这有帮助!如果你喜欢我的工作,你现在可以通过为我买杯咖啡来表示支持,几小时的自主时间

[## Tommaso Buonocore — 博士生 — 大数据与生物医学信息学 — ICS Maugeri SpA Società…

- 生物医学工程师和人工智能爱好者,目前正在研究自然语言处理解决方案,以改善基于医疗的预测任务…

www.linkedin.com](https://www.linkedin.com/in/tbuonocore?source=post_page-----8ee79dabdb1a--------------------------------)

数据科学家角色的原型

原文:towardsdatascience.com/archetypes-of-the-data-scientist-role-1b078966fb2?source=collection_archive---------2-----------------------#2023-08-23

数据科学的角色可以非常不同,而职位描述并不总是清晰的。你想戴上什么帽子?

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

·

关注 发表在 Towards Data Science ·9 min read·2023 年 8 月 23 日

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

图片由 Clem Onojeghuo 提供,发布在 Unsplash

在对我在 Towards Data Science 上关于机器学习工程师的 最近一篇文章 收到积极反馈后,我想写一点我认为数据科学从业者在就业市场中的真实角色分类。虽然我之前讨论的是候选人,比如他们的资格预期和现实情况,今天我想讨论的是实际工作中的日常。

也就是说,这些是我认为招聘数据科学专业人士时实际需要做的工作,不管他们是否承认这一点。我将解释工作的实际内容,与职位描述中的宣称相对比,并大致描述你可能在业务组织图中的位置。

为什么这很重要?

无论我们处于职业生涯的哪个阶段,寻找工作的数据科学家在审阅职位发布和职位描述时都必须看穿表象。职位描述中会有大量的空话和委婉说法,很难判断角色的实际日常工作是什么样的,以及你需要哪些技能才能成功。

了解任务的具体内容也很重要,这样你才能判断这是否是你愿意投入时间做的工作!你可能会发现数据科学这个广泛领域中你更喜欢某些部分,或是想更深入地学习和探讨的内容。如果你最终进入了不适合的角色,你的职业生涯可能会朝着你不希望的方向发展。

我希望这篇文章能帮助你看穿那些职位发布的表象,了解工作实际内容,以便在申请和面试前知道工作真正是什么样的。阅读职位描述时,也要判断所宣传的角色是否真正适合一个人成功完成。如我稍后所述,有时公司会尝试招聘一个数据科学家去做很多工作,这对被聘用的人来说并不可持续或令人愉快。

无论我们处于职业生涯的哪个阶段,寻找工作的数据科学家在审阅职位发布和职位描述时都必须看穿表象。……如果你最终进入了不适合的角色,你的职业生涯可能会朝着你不希望的方向发展。

警告事项

在我们深入讨论之前,我有一些警告/说明要给读者。

  • 我的大部分职业生涯都在中型到非常小的科技公司度过,并没有在大科技公司中的个人经验。我咨询了有这种经验的朋友,以获取他们的反馈,所以我希望我的概括在某种程度上适用于任何地方。我可能会有错误。

  • 所有这些都是概括性的。我认为这些观点是正确的,但其中有玩笑。请不要对所有内容过于认真,但要认识到我在以我们这个奇怪领域为笑料。

  • 我稍后会再提到这一点,但请记住,这些只是原型,而不是“某人职位描述的确切文本。”原型对我们分组事物很有用,但现实生活中会有例外、混合情况和其他边缘案例。

现在,让我们开始讨论数据科学家的原型吧!

数据分析大师

我从最被低估和不被欣赏的角色——分析开始。你在那里帮助公司弄清楚他们是否达到了目标,以及事情是否按照预期运作。这是非常重要的,也极其模糊和难以实际执行。你可能每天要做很多事情,比如构建仪表板,分析销售和产品成功等,也可能还要查看内部表现(比如员工流失等)。有些人会认为你的工作只是“给我做一个仪表板”,但即使你在做仪表板,你也会花大量时间考虑仪表板中应该测量什么,它是否应该存在,以及如何计算实际与目标对齐的指标。

在前一个十年,你可能被称为运营分析师或 BI 专家(或者现在有时你也可能被这样称呼)。你需要处理大量来自奇怪来源的数据,并且你会使用大量的 SQL。除非涉及到像反馈回应中的 NLP 这样的内容,否则你不会做太多机器学习。如果你在分析产品效果,你将进行大量的 A/B 测试。你可能在市场部门或独立的分析部门,但来自公司各个部门的人可能都会向你索要“数字”。

功能构建者

你则是在这里让产品变得更好,理想情况下,通过某种 DS/ML 魔法。你的高管们可能希望能够说你的产品包含 AI,即使你只是有一个推荐引擎在产品中显示建议,或者对搜索结果进行排序。如果你运气好,你可能会有机会构建创新功能和为产品添加酷炫的东西——但如果你在从空白页和模糊任务开始时表现不好,这可能不是适合你的地方。

你需要了解客户和行业,以便你可以构建有用的东西,而不仅仅是酷炫的东西。你应该倾听客户的声音,与面向客户的部门交流,但很多时候这个角色的人不会这样做。(这是个不好的选择。)你可能会进行自己的 A/B 测试,或者这可能会交给分析专家。你绝对需要分析专家(或者与他们重叠)来评估你构建的东西是否有价值。你使用 Python 工作。你可能在产品部门,但你会经常与工程部门沟通。

基础设施构建者

稍微相关一些,我认为这个角色更适合称为 ML 工程师——你会被要求制作将新模型接入产品的管道,以便搜索结果按相关性排序,或新的小部件为合适的人群呈现,或者其他类似的功能。有时你会参与模型本身的工作,但不是很频繁(除非模型出现问题并且你接到通知——你是最有可能有待命轮班的那种数据科学家)。扩展和并行化对你来说很重要,你需要对延迟和滞后产生深厚的兴趣,所以要习惯这一点。

你的日常工具包括 Docker、产品编写所用的任何语言以及 Python,因为你需要将特征构建者所做的东西集成到产品中。某种观察工具在你的书签中也很高。你可能是在工程部门,或者可能是开发运维部门。

仅限内部

在你进入大公司之前,这种情况并不常见,但你是一个为公司内部其他部门构建 ML 工具的人。这和特征构建者并没有太大不同,只不过你制作的模型仅供公司内部使用,以使事情运作得更好。你的客户是公司内部的其他员工,而不是为公司支付商品/服务费用的外部客户。因此,你不需要对外部客户了解太多,但你会对公司组织结构非常了解。

要成功,找出你同事们需要做的那些烦人的重复工作,并将其自动化/训练模型来代替他们完成。如果你这样做了,你会非常受欢迎。有时候,你创建的东西可能会开源,并最终变成像 Airflow 或 H3 这样的产品。你可能是在工程领域工作。

研究员

你是一个罕见的角色,被雇佣来进行纯粹的研究。也许你会撰写学术文章,提高公司知名度,或者类似的事情,但他们并不期望这个角色自负盈亏。这个角色可能属于 CEO 的特别项目或类似的范畴。你会收到一些网上看到的看起来很酷的想法,并被要求搞清楚这些想法的内容,以及公司如何在这个领域做出一些事情。你会被标记在所有关于 LLM 的 Slack 对话中。这是整个帖子中唯一一个可能需要博士学位的角色。

解决方案工程师

与其为你的公司建立数据科学功能,不如为你的客户建立这些功能。这包括数据科学咨询工作,虽然涉及数据科学的软件开发和销售公司也是这个角色常见的场所。如果你的客户需要专门的 DS/ML 人才来充分利用你的产品,那么公司很可能会有这些角色。

你可能会被要求参加客户电话会议,当他们试图向某人推销你产品或服务中的 AI 高科技元素时,因为销售团队不太擅长回答技术问题。你拥有一个相当多样化的技术栈技能,因为你的客户可能会带来各种奇怪的东西让你协助解决/构建,这实际上可能很有趣。你需要了解行业,像功能构建者一样,同时还要能够在与客户互动时表现得得体和耐心。因为你花时间与客户互动,你可能会在客户成功或销售部门。

最后我们来到了…

面面俱到的角色

这个角色似乎将这些工作的各种部分混合在一起,往往以杂乱的方式进行,招聘经理可能没有意识到这实际上是三或四个工作,或者他们希望能说服某人用一个薪水做所有这些事情。薪水可能低于你需要完成的工作。这在没有现有数据科学职能的组织中很常见,他们正在招聘首位数据科学人员。这可能是通过实际操作学习大量知识的机会,但可能不会有技术能力更强的人在身边教你,所以你的 Google/StackOverflow/其他搜索技能需要非常出色。如果你不喜欢自学新东西,这个角色可能会很困难且孤立。正如我的一个朋友所说,“你会是公司中在你擅长领域最优秀的人,但这并不意味着你擅长这些事情。”由于缺乏指导/帮助,倦怠是一个真实的风险。

但实际上…

明确来说,大多数 DS/ML 职位将包含这几种角色的部分内容,或者更多。记住,我之前告诉你这些是原型,而不是“我的职位描述”。(实际上,我自己的工作并不完全符合这些类别中的任何一个。)

明确来说,大多数 DS/ML 职位将包含这几种角色的部分内容,或者更多。

两种角色分割的例子:

  • 产品分析数据科学家:分析大师与功能构建者的结合体。构建功能,进行所有自己的分析,并且还要分析其他功能/人们正在构建的东西。

  • 全栈机器学习数据科学家:功能构建者和基础设施构建者。你不仅要建立模型,还要建立为模型服务的管道。

如果你在一个角色中涉及到三种或更多不同的原型,我认为这就太分散了。例如,一个人不能成功地扮演分析专家、功能构建者和基础设施构建者,这样的角色实在是太多了,难以兼顾。公司越小,你就越可能需要承担额外的职责,但要认识到这些是不同的职能,过多的职责可能会让你分身乏术。

一些额外的注意事项

我认为,随着你在 DS/ML 职业生涯中的资历上升,你会承担更多的角色,“我的工作是什么”的界限也会变得模糊。你会发展出在业务不同部分都有用的专业知识和经验,人们会来寻求你的意见。

此外,我在这里没有真正讨论战略或规划,但随着你的资历增加,你也会更多地参与这些事务。即使作为个人贡献者,你的经验也是有价值的——你可能以前见过类似的想法或问题。你应该对如何解决这些问题提出意见,即使负责的人选择了不同的方式。这只是高级职位工作的一部分。

我在这里没有真正讨论战略或规划,但随着你的资历增加,你也会更多地参与这些事务。

我希望这能帮助那些在找工作的人或刚刚进入这个领域的学生,更清楚地了解你们将要面对的情况。如果你在招聘网站上发现一个极端的“全能型”角色的例子,可以发给我或在评论中贴上链接。也许我可以在未来做一个关于最糟糕例子的帖子,并对其进行剖析,为大家提供一些娱乐!

你可以在 www.stephaniekirmer.com 上找到我的更多作品。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值