TowardsDataScience 2023 博客中文翻译(八十)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

意识解耦:存储、计算和现代数据架构的“远”有多远?

原文:towardsdatascience.com/conscious-decoupling-how-far-is-too-far-for-storage-compute-and-the-modern-data-stack-ce2d9c61ccd3?source=collection_archive---------13-----------------------#2023-07-24

虽然没有绝对正确的答案,但大多数组织的数据平台可能会有一个最佳的“甜蜜点”。继续阅读,看看这个“甜蜜点”可能在哪里。

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

·

关注 发表在 Towards Data Science ·9 分钟阅读·2023 年 7 月 24 日

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

图片由 Kelly Sikkema 提供,来源于 Unsplash

数据工程师在 2014 年发现了有意识解耦的好处,正好与格温妮斯·帕特洛和克里斯·马丁的情况一致。

当然,与生活伴侣不同,工程师们开始高兴地通过新兴技术如 Snowflake(2012)、Databricks(2013)和 BigQuery(2010)来解耦存储和计算。

与本地数据库相比,这在成本和规模方面具有惊人的优势。一个财富 500 强公司的数据工程经理向我表达了对本地限制的痛苦,他说:

“我们的分析师无法在他们想要的时候运行他们想运行的查询。我们的数据仓库每天会停机 12 小时,因为我们通常需要将其离线以进行数据转换和加载……我能用来形容这个过程的唯一词汇就是痛苦。”

十年后,数据管理行业中相当多的创新围绕着不同的数据平台如何解耦或耦合存储和计算(别担心,我会在下一部分中提供示例)。与此密切相关的是,这些平台如何将相关的数据服务从数据摄取和转换到数据治理和监控进行捆绑或拆分。

这些事物为什么相关,更重要的是,为什么数据领导者应该关心?

好吧,驱动和集成这些服务的连接组织通常存在于表格格式(存储)和查询/作业日志(计算)的元数据中。你如何管理这些方面将在性能、成本、易用性、合作伙伴生态系统和未来的可行性中发挥过大的作用。

询问哪种类型的数据平台和哪种解耦级别是正确的,就像问如何正确格式化你的 SQL 代码一样:这在很大程度上取决于个人偏好和专业需求,但有一个小范围的可能性能够满足大多数人。

我相信——在当前时刻——数据平台的范围遵循了亚里士多德的中庸之道。大多数人将最适合光谱中间的选项,而在任一极端操作将是非常专门用途的少数人。

在更深入地了解为什么会这样之前,我们先来看看当前的格局和最近的发展。

存储与计算数据平台光谱

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

图片由作者提供。

一些大肆宣传的例子已经成为头条新闻,他们提出了“云计算很贵,我们回到服务器机架”的运动。虽然这对于某些人来说可能是一个合法的策略,但这正迅速成为一个逐渐减少的少数。

就在上周,Pragmatic Engineer 在 Twitter 上聚焦于 Twitter 的速率限制 和显著的用户体验问题,这些问题可能是由于他们将机器学习模型从 GCP 移除并完全依赖他们的三个数据中心造成的。

独立扩展和消费存储及计算的能力要更加具备成本效益和性能,但在同一数据平台内具有这些分离功能也有其优势。

平均而言,作为即席分析请求的一部分执行的未优化 SQL 查询通常在这些已经调整好以便开箱即用的平台上运行速度会快得多。一种更为分离的架构,在平台层面上分离计算和存储,可能 在处理重型工作负载时非常具备成本效益,但这需要一个高度训练的团队花时间来优化这些工作负载。

具有组合但分离的存储和计算的数据平台还提供了跨多个关键数据操作任务的更强大、集成的用户体验。以数据治理为例。这些平台提供了一个集中机制来进行访问控制,而分离的架构则需要在多个查询引擎之间进行角色联邦化——这是一项非平凡的任务。

分离但组合的方式是让 Snowflake 的常见评价之一变成了“所有东西都运作良好”的魔法。难怪 Snowflake 最近进一步推动了 Unistore 用于事务性工作负载,并开放了 Snowpark 以支持 Python 和更多的数据科学(计算)工作负载。

Databricks 在专注于其 Spark 处理框架时取得了惊人的增长,但它也并非偶然,在 Delta 表中添加元数据和类似 ACID 的事务以及在 Unity Catalog 中的治理功能之后,它解锁了一个新的增长水平。他们最近还进一步推动了,使得当你写入 Delta 表(存储)时,该表中的元数据以 Delta、Apache 和 Hudi 可读的格式写入

挑战者平台

这就是为什么看到许多最新的前沿数据工程技术开始在供应商层面上分离存储和计算会很有趣。例如,Tabular 将自己描述为一个 “无头数据仓库” 或者 “你在数据仓库中需要的一切,除了计算”。

更进一步,一些组织正在迁移到数据湖中的 Apache Iceberg 表,进行“自我管理”后台基础设施,并使用像 Trino 这样的独立查询引擎。这通常是由于客户面对的用例需要高性能且具有成本效益的互动查询。

DuckDB 结合了存储和计算,但牺牲了现代数据堆栈几乎无限的计算能力,以追求开发人员的简单性和降低成本。

所以问题仍然存在,这些创新是否有可能取代现有的云原生数据平台?

再次强调,这个答案将取决于你是谁。DuckDB 是一个非常受欢迎的工具,许多数据分析师喜欢它,但它可能不会成为你构建数据平台的基石。最终,我们正在看到,并且我相信将继续看到这样的分布:

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

图片由作者提供。

我将通过查看现代数据堆栈和数据平台类型的几个关键维度来解释原因。

整合的程度和目的

B2B 供应商恭敬地提到“单一视图”这个概念。将多个服务纳入一个统一的框架是否有价值?这取决于每项服务的质量及其如何符合你的需求。

单一视图的真正价值在于将本来会被孤立的信息统一成一个完整的故事,或者将分开的动作整合成一个单一的工作流程。让我们以 Microsoft 365 为这个概念的例子。

将视频和电子邮件整合到他们的 Teams 协作应用中非常有价值,因为这些是会议安排和视频会议过程中的核心方面。将 Sway 纳入他们的应用套件是否同样重要?这要回到你对互动报告的需求上。

回到数据宇宙,计算和存储对于这个单一的故事(数据操作的谁、什么、何时、哪里、为什么、如何)以及诸如成本、质量和访问管理等关键工作流程至关重要。因此,这些平台将拥有最强大的合作伙伴生态系统和更无缝的集成。这可能是你的一个关键标准,除非你是那种使用 Windows 和 Fire 手机而不是 iPhone 和 Android 的人。

Choozle 的首席执行官 Adam Woods,去年向我们的团队介绍了他对拥有一个强大而紧密集成的合作伙伴生态系统的重视。

“我喜欢这一点……我的数据堆栈始终保持最新,我不需要应用补丁。我们能够将开发人员和数据库分析师本来会花在更新和基础设施上的时间重新投入到构建卓越的客户体验中,”他说。

当然,总有例外情况。如果你有大规模的边缘案例,那么真正的数据湖、无头仓库或其他更复杂的平台可能是理想的选择。

你的语义层、数据质量、访问控制、目录、BI、转换、数据摄取等工具是否都应该打包在同一个平台内?我认为这一领域存在有效的观点,但像其他部门一样,大多数数据团队会拥有一套最适合他们需求的工具。

要点:

  • 大多数数据负责人会优先选择一个既具备计算服务又具备存储服务的数据平台,以便实现“单一故事”,并支持多样化的合作伙伴生态系统。

性能 vs 易用性

一般而言,平台越可定制,能够适应各种使用场景的性能就越好,但使用起来也越复杂。这是一种几乎不可避免的权衡,尤其是在你将存储和计算服务分开到不同供应商时。

在考虑数据平台的“易用性”时,除了考虑平台的日常使用情况,还需要考虑其管理和自定义的简便性。

根据我的经验,许多团队过于关注平台性能。我们的技术背景会立即开始将平台与汽车进行比较:“这个工作负载的马力是多少?那个工作负载呢?”

别误会,优化的数据平台可以转化为每年数百万的节省。这是重要的。但是,如果你要聘请额外的工程师来管理 S3 配置,或者每季度都需要启动一个为期数月的项目来将业务的新方面整合到你的数据平台上,那也是一个高昂的成本。

你会看到同样的决策范式在开源解决方案中发挥作用。前期成本微乎其微,但维护基础设施的时间成本可能很高。

解决方案成本和工程师薪资成本是不一样的,这种错误的等同关系可能会在未来造成问题。原因有两个:

  • 假设你的使用情况保持不变(这是一个重要的前提),你的解决方案成本通常保持不变,而效率会提高。这是因为 SaaS 供应商不断推出新功能。另一方面,手动实施的效率会随着时间的推移而下降,因为关键成员离开,新团队成员需要培训。

  • 当你花费大部分时间来维护基础设施时,你的数据团队开始失去方向。目标会从最大化商业价值逐渐转向在峰值性能下维护基础设施。更多的会议变成了讨论基础设施。专业的基础设施技能变得极其重要,这些专家在组织中变得更加突出。组织文化也很重要,它通常由团队解决的主要任务和问题所塑造。

这一点是 Michael Sheldon,Swimply 的数据负责人,特别强调的。

“因为作为一个数据团队,我们有这个任务来支持整个公司,我们需要一个可以解决两个核心问题的数据堆栈,”Michael 说。 “一是将公司各个不同部分的数据集中在一个稳定的地方,大家都可以使用并作为可信来源。二是让我们有足够的时间真正专注于洞察,而不仅仅是数据基础设施本身。”

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

他们是在谈论基础设施还是业务价值?照片来自Desola Lanre-OlogunUnsplash

当然,也会有一些时候你的业务用例需要高性能。

高延迟的信用卡欺诈数据产品只是浪费时间。一个面对客户的应用程序如果不断出现加载失败的情况将是不可接受的,可能需要你部署一个高性能的查询引擎。然而,在大多数情况下,你的数据仓库或托管数据湖会很好地扩展。请仔细检查任何要求,确保没有遗漏。

要点:

  • 尽管易用性和性能是必须平衡的相关变量,但大多数数据领导者会倾向于易用性,因为维护和文化成本相对隐藏。你的竞争优势更常见于丰富和应用第一方数据,而不是维护复杂的基础设施。

为 MDS 辩护

我知道抨击现代数据堆栈很流行(你可能不需要它来完成任务),但尽管有缺陷,它仍然是大多数数据团队的最佳选择。它是快速生成价值和为长期投资提供未来保障的理想结合。

许多新兴技术虽然使用场景较窄,但依然具有显著价值。看到它们如何发展并塑造数据工程实践将会令人兴奋。

然而,虽然计算和存储需要分别操作和扩展,但将这些服务及其相应的元数据集中在同一平台内是过于强大且具有无法忽视的优势。

关注我 在 Medium 上获取更多关于数据领导力、数据科学应用和相关主题的故事。订阅以将我的故事直接送到你的邮箱。

约束优化与 KKT 条件

原文:towardsdatascience.com/constrained-optimization-and-the-kkt-conditions-a3541d57a994?source=collection_archive---------2-----------------------#2023-10-28

对拉格朗日函数的见解

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

·

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

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

(作者提供的图片,使用 math3d.org)

优化在计算机科学、物理学、数学和经济学领域中无处不在。它是人工智能和机器学习(ML)专业人员的基本工具,适用于决策、路线规划以及 ML 模型中的学习参数,如支持向量机(SVM)和神经网络。优化的最一般形式是求函数关于其独立变量的最小值/最大值,这可以通过应用微积分的基本概念来实现。从数学上讲,在这些极值点上,函数的斜率(第一导数)为零,称为驻点。通过评估曲率(第二导数)来确定这些点是最大值还是最小值。

更进一步,我们可以为优化问题添加约束,以定义一个在空间中需要优化的特定域。因此,优化不再是确定整个实数(或复数)空间中函数的最大值和最小值,而是限定在这个特定的域中。传统的计算驻点的方法不再适用,因为这些点可能落在约束设定的边界之外。在接下来的章节中,我们将分析约束优化问题的复杂性,并探索解决这些问题的策略。

等式约束

带有等式约束的优化问题的形式为

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

(图片由作者提供)

其中f(x)是我们要最小化的函数,约束条件g(x) = 0定义了最小化应进行的域。在这些情况下,最小化的重点本质上限于由约束定义的特定域。然而,如前所述,传统的微积分应用于确定驻点的方法没有考虑约束,因此需要一种替代方法。

拉格朗日函数

鉴于这是一个最小化问题,一种适应传统方法的方法是将函数在指定域外的值设为无穷大。为此,我们引入一个新的函数f’(x),其特征如下:

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

这种修改消除了在域外出现最小值的可能性,从而确保最优点发生在域内。因此,我们现在可以将约束优化问题重新表述为无约束优化问题。

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

然而,这种方法存在挑战。由于f’(x)在领域边界的突然间断,使用微分计算来优化上述问题是不可能的。在这里,拉格朗日方法发挥了作用。我们不是像(2)中那样定义函数f’(x),而是将其表述为一个最大化问题。

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

RHS 上的表达式称为拉格朗日函数,新变量𝞴是拉格朗日乘子。从(4)可以明显看出,在**{g(x)<0, g(x)>0}区域,𝞴可以取{-∞, ∞}的值,以最大化该表达式至∞**。

因此,方程(3)中的优化问题呈现如下形式。

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

值得注意的是,非可微性问题仍然存在,因为内部最大化会导致相同的间断函数。然而,通过拉格朗日表示法,我们可以利用极大极小不等式将极大极小问题转换为极小极大问题,从而解决这个问题。

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

在这里,我们首先相对于独立变量x进行优化,然后相对于拉格朗日乘子𝞴进行优化。

不等式约束

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

(作者提供的图片)

我们现在将分析约束不是方程而是不等式时的情形。这类优化问题的形式为:

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

我们可以使用类似的方法来解决:我们将***f’(x)定义为在由约束定义的领域内与f(x)***相同,而在其他地方为无限:

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

相应地,拉格朗日函数定义为:

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

与不等式约束对应的拉格朗日乘子用𝝻表示。方程(9)与(4)不同,因为它还对拉格朗日乘子有约束。现在,方程(7)中的优化问题呈现如下形式

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

应用极小极大不等式,

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

拉格朗日乘子𝝻的解释

当计算(11)的驻点时,相对于x,我们得到如下结果:

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

拉格朗日乘子 𝝻f(x) 的斜率与约束 g(x) 之间的比率。这本质上表示了 f(x) 最优值对约束 g(x) 的敏感性。换句话说,拉格朗日乘子的值量化了约束对 f(x) 最优性的影响;如果 𝝻 = 0,则表示约束对最优性没有影响。对此概念的进一步阐述将在后续对 KKT 条件的讨论中进行。

KKT(Karush-Kuhn-Tucker)条件

(10)中的优化问题称为原始版本,而(11)是其对偶版本。根据极小极大不等式,对偶版本对原始版本进行下界估计,表明这两个版本不一定相等。然而,在某些条件下,原始版本和对偶版本是相等的,这被称为正则性条件。在假设正则性的情况下,为了使(x,* 𝝻*******)成为解点,它必须满足以下 KKT 条件

  1. 原始可行性

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

这从问题定义中得出。

2. 对偶可行性

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

对偶可行性从(9)中得出。

3. 平稳性

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

这是一个有趣的性质。由于 𝝻 是零或正数,平稳性条件意味着在最优点上,f(x)g(x) 的梯度必须朝相反方向排列。其原理如下:如果在点 x = x* 上,f(x)g(x) 的梯度方向相同,那么 f(x)g(x) 会在与其梯度方向相反的方向上同时减少。这种情况会允许 f(x) 继续减小超出值 f(x)* 而不违反约束,此时 x* 不再符合最优点。因此,为了使一个点成为最优点,必须满足平稳性属性。

4. 互补松弛性

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

这是另一个直接来自方程(9)的有趣性质。当约束g(x) < 0时,拉格朗日乘子𝝻必须等于零。由于拉格朗日乘子还表示我们的解决方案对相关约束的敏感度,𝝻* = 0 表示相关约束对确定解决方案没有影响。换句话说,无论我们是否考虑约束,结果保持不变。一个简单的例子是当f(x)g(x) ≤ 0的范围内有全局最小值。另一个例子是考虑在两个约束下最小化函数f(x)g¹(x) < 5g²(x) < -1。在这种情况下,拉格朗日乘子𝝻¹对应于约束是零,因为已经隐含了的条件,使得*作为约束不重要。

应用:支持向量机(SVM)

机器学习中带有不等式约束的优化问题的一个例子是支持向量机(SVM)。给定数据点**{(x¹, y¹), (x², y²), …}的一个数据集,其中y ∈ {-1, 1}**表示两个类别,目标是识别一个最大化类别之间间隔的分类器。具体来说,我们将 SVM 形式化为以下最小化问题:

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

(作者提供的图片)

方程中的***||w||表示间隔的倒数。显然,有大量的不等式约束:实际上,我们对每个数据点都有一个约束。然而,实际上,解决方案只受到少数接近分类边界的数据点的指导;这些点称为支持向量*。正如我们在互补松弛条件中讨论的,只有与支持向量相关的约束的拉格朗日乘子具有非零值。对于所有其他数据点,其相关约束的拉格朗日乘子值为零,使得它们在确定分类边界时无关紧要。

结论

总结一下文章中的内容,我们从对无约束优化问题的简要介绍开始,逐渐扩展到包含等式和不等式约束。此外,我们讨论了拉格朗日函数如何解决约束引入的挑战。深入探讨拉格朗日函数的最优性,我们获得了对 KKT 条件的见解。最后,我们简要概述了如何将 SVM 形式化为一个约束优化问题,并简要讨论了其解决方案。

约束编程解释

原文:towardsdatascience.com/constraint-programming-explained-2882dc3ad9df

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

图着色问题解释,由 Dall-E 2 画出。

约束编程求解器的核心及其与混合整数编程的关系

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

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

定义和解决优化问题的方法有很多种。你可以使用贪心算法、约束编程、混合整数编程、遗传算法或局部搜索等。在这篇文章中,我们将深入探讨约束编程。作为例子,图着色问题被用来说明约束编程的工作原理。

如果你需要优化问题和搜索启发式的介绍,可以阅读下面的帖子。

## 每个数据科学家都应该知道的数学优化启发式

本地搜索、遗传算法等。

towardsdatascience.com

图着色

让我们从图着色问题开始。这个问题在帖子中用于说明约束编程的概念。

对于给定的地图,你想给每个国家上色。你有无限多的颜色。相邻的国家不允许使用相同的颜色。你需要多少种颜色才能填满地图?

变量 是你给国家的颜色。约束 是不允许给相邻的国家相同的颜色。目标 是最小化使用的颜色数量。

听起来很简单?实际上可能很难!这是非洲部分解决方案:

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

图片来自作者。

另一种可视化这个问题的方法是使用顶点和边。相邻的国家通过边连接。顶点对应于国家。这是之前用这种方式说明的示例:

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

从地图到顶点和边。这使得检测错误和查看相邻国家变得更容易。图片由作者提供。

什么是约束编程?

约束编程(CP)的关键思想是,它使用约束来减少每个变量可以取的值的集合。在 CP 中,程序(或求解器)跟踪可以出现的值。在每次移动后,搜索空间会被剪枝。这意味着不能再发生的值会被移除。可能会出现求解器尚未找到可行解决方案时没有更多可能的移动。在这种情况下,求解器会从做出决策的早期点开始,并重新考虑。

基础知识

CP 的重点是可行性,而不是最优性。在做出决策后,求解器检查可行性并剪枝搜索空间。在下面的图片中,你可以看到一个基本的 CP 求解器。大部分是搜索和约束存储,稍后我会详细解释。简而言之:搜索是做出决策的地方,约束存储包含域存储中所有可能的变量值并保持约束。做出一个移动(例如,你把一个国家涂成红色),在约束存储中根据这个移动剪枝域存储。还有可行性检查,这意味着当移动不可行因为它违反了一个或多个约束时,需要回滚(失败)。

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

约束编程。图片由作者提供。

在下面的示例中,你可以看到,当你把一个国家涂成红色时,所有与这个红色国家相连的国家的红色必须从域存储中移除,因为这些操作不再可能进行。

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

剪枝:这两个相邻的国家不能再被涂成红色。图片由作者提供。

你可能会想:约束编程如何找到一个最优解?尤其是在图着色问题中,找到一个可行解是很容易的。最简单的方式是给每个国家不同的颜色。这是一个可行解,但远非最优。有不同的方法来解决这个问题。例如,可以不断解决问题,并添加一个约束,要求新的解决方案使用的颜色比之前的少。

搜索

在搜索中,有一些有效的规则可以遵循,这些规则可以显著改善搜索。第一个是首次失败原则。这意味着你首先尝试最可能失败的地方。这使得最后的事情更容易,并最大程度地减少搜索树。在图着色中,从一个与许多其他国家相连的国家开始,比从一个没有很多连接的国家开始要好:

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

首次失败原则:从连接数最多的国家开始。图像作者提供。

这有助于,因为如果你已经为周围的国家上色,为这个国家上色会更困难。如果你不从这个国家开始,可能需要为它选择一个新的颜色,这是你想要避免的。

你可以实现不同类型的搜索。根据问题的不同,你可以选择最佳的一种(或尝试所有):

  • 变量/值标记 使用这种搜索方法,你从变量开始。在图着色中,国家是变量,颜色是值。你以聪明的方式选择下一个要分配的变量(国家)。例如,你可以选择可能值最少的那个。然后,你选择这个变量将获得的值(颜色)。通常,选择的值是给其他变量留出尽可能多的选项。下面是一个简单的例子。

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

变量/值标记的示例。图像作者提供。

  • 值/变量标记

    处理搜索的另一种方法是从值开始。你有一个颜色,然后选择一个国家来赋予这个颜色。这与变量/值标记正好相反。在图着色问题中,你可以将所有可以拥有相同颜色的国家组成一个集合。

  • 域划分

    使用域划分,你不会直接为变量分配一个值。相反,你将变量的域(可能值)划分为两个或更多集合。这比直接指定:这个国家应该具有这个值的承诺要弱,因为你仍然有对国家的选择,即集合中的一个值。

  • 搜索中的对称性破除 对称性破除可以显著改善搜索效果。你需要防止对称解被探索,因为这是一种时间浪费。从理论上讲,对称解是完全相同的。开始破除图着色中的对称性的一种方法是为某些国家固定颜色。更好的破除对称性的方法是通过对变量(国家)进行排序,或者只考虑当前值(颜色)和一个新值(颜色)。

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

对称解。不同的颜色,但解决方案完全相同。图像作者提供。

  • 随机化和重启 也可以尝试以随机顺序寻找不同的解决方案。你可以随机选择变量的值,然后检查解决方案是否可行。如果经过一段时间或若干尝试后没有找到解决方案,你就重新开始搜索。

上述方法是处理约束编程中的搜索部分的不同方式。可以将它们中的一些结合使用。

约束存储

在约束存储中可以实现不同类型的约束。约束用于可行性检查和域存储的修剪。在图着色的情况下,‘正常’约束是一个国家与另一个国家相连时不能有相同的颜色。但根据问题,你可以创建其他有趣的约束。添加约束的目标是收紧问题。如果你做出更紧密的定义,最终解决方案可以更快地找到。

这里是你可以添加到约束存储中的不同类型的约束:

  • 全局约束 你可以添加的最重要的约束是全局约束。全局约束有助于修剪搜索空间,并且可以更早地检测到不可行性。全局约束有助于直接向求解器传达问题结构。一个全局约束的例子是 alldifferent 约束。这个约束意味着所有变量应该具有不同的值。在图着色问题中,当四个国家全部相连时,它们应该都有不同的颜色。如果我们仅剩下三种颜色用于这些国家,解决方案是不可行的:我们可以回滚并报告失败。

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

这些国家都相连,因此它们应该都有不同的颜色。图片作者提供。

  • 冗余约束 冗余约束是不会增加排除解决方案价值的约束。但冗余约束在计算上是重要的,因为它们减少了搜索空间。冗余约束捕捉到某些不可能但未被其他约束捕获的内容。图着色中的一个例子是:颜色的数量不能超过国家的数量。

  • 替代约束 通过结合现有约束,你会得到替代约束。替代约束很有帮助,因为它们提供了更全面的视角。一个例子是合并现有约束或对它们进行线性组合。

  • 隐含约束 你可以添加的另一种约束是隐含约束。通过从多个现有约束中推导出一个属性,可以得到隐含约束。

在创建约束时,你可以发挥创造力!对于某个问题,尝试完全理解它,以便向约束存储中添加有用的约束。这可以大幅提高求解器的速度。

CP 和 MIP 之间的关系是什么?

你可能听说过混合整数规划。这是另一种建模离散优化问题的技术。MIP 使用不同的方法来寻找问题的最佳解决方案。下面,你可以阅读 CP 和 MIP 之间的相似性和差异。

什么是混合整数规划?

混合整数规划(MIP)是一种数学优化技术,通过求解包含整数和连续变量的线性方程和不等式系统来找到问题的最优解。MIP 关注于最优性。要正确理解 MIP 及其背后的数学,了解线性规划和单纯形算法的工作原理很重要。如果你想复习这些内容,可以阅读下面的文章:

## 初学者线性规划和单纯形算法指南

处理广泛的优化问题。

towardsdatascience.com

MIP 求解器通过允许整数变量的连续值来放松约束。这使得使用单纯形算法成为可能。之后,使用其他技术找到有效的解决方案(整数变量的整数值)。这些技术超出了本帖的范围,但如果你感兴趣,可以搜索诸如分支限界、分支剪切和切割平面(例如,戈莫里剪切和平面剪切)等术语。

CP 和 MIP 的关系

从数学上讲,可以将任何 MIP 问题表述为 CP 问题(或将 CP 问题表述为 MIP 问题)。从这个角度看,它们是相同的。但由于它们达到最优解的方法不同,你可能需要考虑哪一种方法最适合你的特定问题。MIP 使用线性松弛,而 CP 使用逻辑推理。对于具有许多‘或’约束的问题,CP 通常更快,而 MIP 可以更快地处理‘和’约束。如果你使用的是商业 MIP 求解器,它们可能已经在其中实现了 CP 技术,如创建高层次约束和逻辑推理。MIP 通常更灵活、更可靠。如果你有时间,测试不同的技术来查看哪种对你的问题最有效总是好的。

结论

希望你喜欢这次关于约束编程的介绍。它是一种关注可行性的技术。约束存储和寻找解决方案的方式是 CP 的关键组成部分。如果你将不同类型的约束添加到约束存储中,可以极大地改善模型的表述。CP 求解器的核心通过约束进行传播,检查解决方案是否仍然可行以及是否可以进行剪枝。剪枝意味着从变量域中删除值。CP 求解器可以找到最优解,只要你给它们足够的时间。

混合整数规划是另一种表述离散优化问题的方法。它使用代数技术来找到最优解。根据问题的不同,你可以选择 CP 或 MIP 哪个更合适。

以下是更多关于数学优化的帖子。

相关

## 如何处理优化问题?

简单的示例和解决方案及代码。

## 五种将数学优化与机器学习相结合的方法

实际示例展示了如何结合两种力量。

## 为什么每个数据科学家都应该学习数学优化

数据科学课程专注于数据可视化、特征工程、数据处理、(非)监督学习……

如何处理优化问题?

为 AI 代理启用市场:发现和匹配

原文:towardsdatascience.com/constraints-composition-for-autogpt-240a3fa00ab4

发现能够执行给定用户任务的 AI 代理

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

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

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

图:Soma Biswas 探索未知 (Flickr,经许可转载)

1. 介绍

关于 ChatGPT 的讨论现在已经演变为 AutoGPT。虽然 ChatGPT [1] 主要是一个可以生成文本回应的聊天机器人,但 AutoGPT 是一个更强大的 AI 代理,可以执行复杂任务,例如,进行销售、规划旅行、预订航班、聘请承包商做房屋工作、订购披萨。

AutoGPT 继承了关于自主代理的长期研究,特别是以目标为导向的代理 [2, 3]。

针对用户任务,AutoGPT 旨在识别(组合)一个(或多个)能够执行给定任务的代理。

解决此类复杂任务的高级方法包括:(a) 将给定的复杂任务分解为(一个层级或工作流的)简单任务,然后 (b) 组合 [4] 能够执行简单(或更简单)任务的代理。

这可以通过动态静态方式实现。在动态方法中,给定一个复杂的用户任务,系统根据运行时可用代理的能力来制定满足请求的计划。在静态方法中,给定一组代理,组合代理在设计时手动定义,结合其能力。

本文的主要焦点是代理的发现方面,即识别能够执行给定任务的代理。这意味着存在一个代理市场/注册表,具备明确定义的代理能力和约束。

我们在第2节中概述了一个约束模型,以捕获/指定 AI 代理提供的服务的约束。我们之前在 Web 服务——通用描述、发现与集成(UDDI)注册表和 API 市场中看到过类似的努力。然而,用 XML 或 JSON 捕获的描述过于静态,缺乏在发现过程中进行能力/任务要求“协商”的必要语义信息。

例如,我们考虑一个可以在线预订的房屋粉刷代理 C(通过信用卡)。鉴于此,用户需要有效的信用卡这一事实就是一个约束,而用户的房屋将在特定时间范围内完成粉刷则是其能力。此外,我们还需要考虑 C 在实际执行阶段的任何约束,例如,C 只能在工作日提供服务(而不是在周末)。如果用户指定的任务需要在周末完成工作,那么上述限制可能会成为一个问题。一般来说,约束指的是启动执行所需满足的条件,而能力则反映了执行终止后的预期结果。

2. 代理约束模型

2.1 约束规范

一个代理 P 提供了一组服务 {S_1, S_2, . . . , S_n}。每项服务 S 又有一组相关的约束 {C_1, C_2, . . . , C_m}。这些约束作为逻辑谓词被指定在其代理发布的相应服务的服务描述中。对于服务 S 的每个约束 C,约束值可以是

  • 单个值(例如,服务的价格),

  • 值的列表(例如,航空公司服务的目的地列表),或

  • 值的范围(例如,最小值和最大值)。

约束值被指定为包含适用值的事实。更准确地说,由 P 提供的服务 S 具有约束 {C_1, C_2, . . . , C_m} 的规范如下:

*S(Y, X_1, X_2, . . . , X_m):-

C_1(Y, X_1),

C_2(Y, list_2), member(X_2, list_2),

. . .,

C_m(Y, minVal_m, maxVal_m), X_m ≥ minVal_m, X_m ≤ maxVal_m.

C_1(P, value(C_1)).

C_2(P, list(C_2)).

. . .

C_m(P, min(C_m), max(C_m)).*

例如,航空公司 ABC 仅在部分航班(前往特定目的地)上提供素食餐和残疾人设施的事实可以表示如下:

*flight(Airlines, X, Y):-

veg_meals(Airlines, Destination_List), member(X, Destination_List),

hnd_facilities(Airlines, Destination_List), member(Y, Destination_List).

veg_meals(‘ABC’, [‘巴黎’, ‘雷恩’]).

hnd_facilities(‘ABC’, [‘巴黎’, ‘格勒诺布尔’]).*

在上述片段中,‘member(X,Y)’是一个系统定义的谓词,当 X 是集合 Y 的元素时成立。现在,让我们考虑“相关”的约束或约束之间存在关系的情景。默认情况下,上述示例假设约束之间存在 AND 关系(veg_meals 和 hnd_facilities 谓词都必须满足)。文献中研究的逻辑程序组合操作符包括:AND、OR、ONE-OR-MORE、ZERO-OR-MORE 以及以上操作符的任何嵌套。

我们仅考虑 AND、OR 及其任何嵌套层级,以保持框架简单(ONE-OR-MORE 和 ZERO-OR-MORE 可以用 OR 来表示)。

约束之间的 OR 关系示例如下:航空公司 ABC 仅在乘客持有商务舱票或是其常旅客计划的会员时,允许在中途停留时使用机场贵宾室。上述情景可以表示为:

*lounge_access(Airlines, X):-

ticket_type(‘ABC’, X, ’Business’).

lounge_access(Airlines, Y):-

frequent_flier(Airlines, FF_List), member(Y, FF_List).*

我们简要考虑以下可能与约束一起指定的限定词:

  • 有效期:约束有效的时间段。有效期限定词可用于优化匹配。基本上,不需要对每一个请求重复整个匹配过程。一旦找到适合的代理/服务提供者,它将保持有效,直到其至少一个“相关”约束的有效期过期。

  • 问责性:代理人提供特定服务的承诺(承诺级别)。例如,代理人可能愿意在任何情况下承担其广告服务的责任;或者代理人能够提供服务,但不愿意承担出现问题时的责任。

  • 非功能性:与非功能性方面相关的限定词,例如事务、安全、监控(性能)等。

2.2 约束组合

复合代理人聚合了不同代理人提供的服务,并为其提供唯一的接口(在服务能力本身没有任何修改的情况下)。换句话说,复合代理人充当了聚合服务集的中介。

聚合的服务可能具有不同的能力,或具有相同的能力但约束不同(如下例所示)。

场景:代理人 XYZ 整合了航空公司 ABC 和 DEF 提供的航班服务。

航空公司 ABC:

*flight(Airlines, X):-

hnd_facilities(Airlines, Destination_List), member(X, Destination_List).

hnd_facilities(‘ABC’, [‘马赛’, ‘格勒诺布尔’]).*

航空公司 DEF:

*flight(Airlines, X):-

hnd_facilities(Airlines, Destination_List), member(X, Destination_List).

hnd_facilities(‘DEF’, [‘雷恩’, ‘巴黎’]).*

复合代理人 XYZ:

*flight(Airlines, X):-

hnd_facilities(Airlines, Destination_List), member(X, Destination_List),

航空公司:= ‘XYZ’。

hnd_facilities(‘ABC’, [‘马赛’, ‘格勒诺布尔’]).

flight(Airlines, X):-

hnd_facilities(Airlines, Destination_List), member(X, Destination_List),

航空公司:= ‘XYZ’。

hnd_facilities(‘DEF’, [‘雷恩’, ‘巴黎’]).*

在上述代码片段中添加语句 Airlines:= ‘XYZ’ 确保返回给外部世界的绑定是代理 XYZ,而代理 XYZ 在内部将实际处理委托给代理 ABC/DEF。上述示例还突出了另一个点。

组合可能会导致约束的放松,例如,复合代理 XYZ 可以提供更多目的地(马赛、格勒诺布尔、雷恩和巴黎)的无障碍设施航班,而这些目的地比单独的组件代理 ABC(马赛、格勒诺布尔)/DEF(雷恩、巴黎)提供的更多。

3. 代理服务发现

3.1 配对匹配

对于用户任务 G,匹配包括找到能够执行 G 的(子)任务的代理。G 的(子)任务可能有自己的约束。鉴于此,

所需的 G 配对匹配可以通过逻辑程序执行引擎来实现,将 G 的约束作为目标提出,并与相应代理的服务约束逻辑程序进行比对。

逻辑程序执行引擎不仅指定目标是否可以满足,还指定所有可能的绑定,对于目标的任何无界变量。如果存在多个可能的绑定(多个能够执行相同任务的代理),可以使用用户定义的偏好标准对这些代理进行排序,或者直接咨询用户以选择其中最优的一个。

3.2 近似匹配

在本节中,我们考虑匹配不成功的情况,即不存在能够执行给定任务 G 的代理集。

鉴于此,允许在选择代理时存在一定的不一致性是合理的。请注意,现实生活中的系统通常允许不一致性,例如航班预订系统允许航班超售,但仅限于一定数量的座位。因此,关键在于有限的不一致性

基本上,对于一个目标 G = {T_1, T_2, . . . , T_n},只要累计的不一致性在指定限制范围内,选择的代理在某一任务 T_i 上不必完全匹配。请注意,代理引起的不一致性也可能对另一个任务 T_j 引起的不一致性产生对抗作用(减少)。

对于给定的目标 G = {T_1, T_2, . . . , T_n},可以通过以下方式实现近似匹配:

  1. 确定通用约束:如果 G 中的多个任务都基于 C 有约束,则 C 是与 G 相关的通用约束。例如,如果任务 T_1T_2 需要分别在 3 天和 4 天内完成,则它们有一个共同的时间约束。研究表明,现实生活中大多数约束都基于以下约束:位置、价格、数量或时间。

  2. 对于每个通用约束 C,定义一个临时变量 q_C(用于跟踪相对于 C 的不一致性)。最初,q_C = 0

  3. 对于每个任务 T_i 和一个通用约束 C:令 vC_i 表示 T_i 相对于 C 的约束值。例如,vTime_1 = 3 表示 T_1 的完成时间约束值。将 T_iC 约束从 G 的约束规范中删除。

  4. 基于减少后的目标(删除了上述步骤中的通用约束谓词)执行配对。

  5. 如果配对成功:[请注意,如果在减少的目标下配对不成功,那么在原始目标下也一定会不成功。] 令 P(T_i) 表示选择执行 T_i 的代理。对于每个删除的 T_i 的通用约束 C(步骤 3),获取 P(T_i) 的最佳约束值 vBestC_i,并计算 q_C = q_C + (vC_i − vBestC_i)

    例如,假设 P(T_1)P(T_2) 分别需要至少 5 天和 1 天来完成他们的工作。基于此,q_t = 0 + (vC_1 − vBestC_1) + (vC_2 − vBestC_2) = (3 − 5) + (4 − 1) = 1

  6. 配对结果有效当且仅当对于每个通用约束 Cq_C > 0。例如,P(T_1)P(T_2) 是任务 T_1T_2 的有效匹配,因为 q_t > 0

请注意,如果没有(近似)扩展,配对将不会成功,因为 P(T_1) 违反了 T_1 的完成时间约束(5 天而非 3 天)。为了简单起见,我们在上述算法中仅考虑了基于数值值的约束。

结论

在这篇文章中,我们集中于自主 AI 代理的发现方面。执行复杂任务的先决条件是一个代理登记簿,指定其服务能力和约束。我们概述了一种基于约束的模型来指定代理服务。

我们展示了如何以与其组成代理的约束一致的方式推导和描述复合代理的约束。最后,我们讨论了近似配对,并展示了如何利用有界不一致性的概念更高效地发现代理。

参考文献

  1. D. Biswas. ChatGPT 及其企业应用。 (Data Driven Investor)

  2. A. Bordes 等人 目标导向的聊天机器人:学习端到端目标导向对话,2016 (文章)

  3. E. Ricciardelli, D. Biswas. 基于强化学习的自我提升聊天机器人。见:第四届多学科强化学习与决策制定会议,2019 (Towards Data Science)

  4. D. Biswas. 组合 AI:企业 AI 的未来。2021 (Towards Data Science)

  5. F. Casati 等. eFlow 中的自适应和动态服务组合。HP 技术报告,HPL-2000–39,2000 年 3 月。

  6. J.S. Park 等. 生成型代理:人类行为的互动模拟,2023 (article)

ChatGPT/AutoGPT系列中的相关文章:

《构建决策树分类器:从头构建决策树模型的全面指南》

原文:towardsdatascience.com/constructing-a-decision-tree-classifier-a-comprehensive-guide-to-building-decision-tree-models-2e59959db22d?source=collection_archive---------13-----------------------#2023-03-29

了解从头构建决策树分类器所涉及的基本过程

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

·

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

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

照片由 Jeroen den Otter 提供,来自 Unsplash

决策树在机器学习中有多种用途,包括分类、回归、特征选择、异常检测和强化学习。它们通过简单的if-else语句进行操作,直到达到树的深度。理解某些关键概念对于全面理解决策树的内部工作原理至关重要。

探索决策树时需要掌握两个关键概念:信息增益。熵量化了训练样本集中的杂质。一个只包含一个类别的训练集的熵为 0,而一个包含所有类别样本均匀分布的集合的熵为 1。信息增益则表示通过根据特定属性将训练样本划分为子集所获得的熵或杂质的减少。对这些概念的深入理解对于理解决策树的内部机制非常有价值。

我们将开发一个决策树类并定义进行预测所需的基本属性。如前所述,熵和信息增益是在决定哪个属性进行拆分之前计算的。在训练阶段,节点被拆分,这些值在推断阶段用于进行预测。我们将通过查看代码片段来检查这是如何完成的。

决策树分类器的代码实现

初步步骤包括创建一个决策树类,在随后的代码段中添加方法和属性。本文主要强调从头开始构建决策树分类器,以便清晰理解复杂模型的内部机制。以下是开发决策树分类器时需要考虑的一些事项。

定义决策树类

在这个代码段中,我们定义了一个决策树类,具有一个构造函数,接受 max_depth、min_samples_split 和 min_samples_leaf 的值。max_depth属性表示算法可以停止节点拆分的最大深度。min_samples_split属性考虑节点拆分所需的最小样本数量。min_samples_leaf属性指定叶节点中的样本总数,超过此数量算法将限制进一步的分裂。这些超参数以及其他未提及的参数将在稍后定义各种功能的方法时使用。

这个概念涉及数据中存在的不确定性杂质。它用于通过计算通过拆分所获得的整体信息增益来识别每个节点的最佳拆分点。

这段代码根据输出样本中每个类别的样本计数计算整体熵。需要注意的是,输出变量可能有两个以上类别(多类别),使得该模型同样适用于多类别分类。接下来,我们将引入一种计算信息增益的方法,该方法帮助模型根据此值拆分示例。以下代码片段概述了执行的步骤顺序。

信息增益

下定义了一个阈值,它将数据分为左右两个节点。这个过程对所有特征索引进行,以识别最佳拟合。随后,记录拆分后得到的熵差异,并返回作为特定特征拆分的总信息增益。最后一步涉及创建一个split_node函数,该函数基于从拆分中得出的信息增益对所有特征执行拆分操作。

拆分节点

我们通过定义关键超参数如max_depthmin_samples_leaf来启动这一过程。这些因素在split_node方法中发挥着至关重要的作用,因为它们决定是否应进一步拆分。例如,当树达到最大深度或满足最小样本数时,数据拆分将停止。

一旦满足最小样本数和最大树深度条件,下一步是识别从拆分中提供最高信息增益的特征。为此,我们遍历所有特征,计算每个特征拆分所产生的总熵和信息增益。最终,提供最大信息增益的特征作为将数据分为左右节点的参考。这一过程持续进行,直到树的深度达到并在拆分过程中考虑到最小样本数。

模型拟合

接下来,我们利用之前定义的方法来拟合我们的模型。split_node函数在计算通过不同特征将数据划分为两个子集所产生的熵和信息增益方面至关重要。结果是,树达到了其最大深度,使得模型获得了优化的特征表示,从而简化了推断过程。

split_node函数接受一组属性,包括输入数据、输出和深度,这是一个超参数。该函数基于初始训练数据遍历决策树,识别拆分的最佳条件。随着树的遍历,深度、最小样本数和最小叶子数等因素在确定最终预测时发挥作用。

一旦使用适当的超参数构建了决策树,就可以用它来对未见或测试数据点进行预测。在接下来的章节中,我们将探讨模型如何利用由split_node函数生成的结构良好的决策树处理新数据的预测。

定义预测函数

我们将定义predict函数,该函数接受输入并对每个实例做出预测。基于先前定义的阈值进行拆分,模型会遍历树,直到为测试集获得结果。最后,预测以数组形式返回给用户。

这个predict方法作为决策树分类器的决策功能。它开始时初始化一个空列表y_pred,以存储给定输入值集的预测类别标签。然后,算法遍历每个输入示例,将当前节点设置为决策树的根节点。

当算法遍历树时,它会遇到包含每个特征关键信息的基于字典的节点。这些信息帮助算法决定是向左还是向右子节点移动,取决于特征值和指定的阈值。遍历过程继续,直到到达叶子节点。

达到叶子节点后,预测的类别标签会被追加到y_pred列表中。这个过程对每个输入示例重复,生成一个预测列表。最后,预测列表会被转换成NumPy数组,为每个测试数据点提供预测的类别标签。

可视化

在本小节中,我们将检验应用于估计AirBnb房价的数据集的决策树回归模型的输出。需要注意的是,可以为各种情况生成类似的图表,其中树的深度和其他超参数表示决策树的复杂性。

在本节中,我们强调机器学习(ML)模型的可解释性。随着各行各业对机器学习需求的激增,不能忽视模型可解释性的重要性。与其将这些模型视为黑箱,不如开发工具和技术来揭示它们的内部工作原理,并阐明其预测背后的理由。通过这样做,我们培养对机器学习算法的信任,并确保它们在各种应用中的负责任整合。

注意:数据集取自纽约市 Airbnb 开放数据 | Kaggle,根据创作共用 — CC0 1.0 全球许可协议。

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

决策树回归模型(图片由作者提供)

决策树回归器和分类器因其可解释性而闻名,提供了对其预测背后理由的宝贵洞察。这种清晰度通过与领域知识对齐来增强对模型预测的信任和信心,并提高我们的理解。此外,它还提供了调试的机会,并处理伦理和法律问题。

在进行超参数调整和优化后,AirBnb 房价预测问题的最佳树深度被确定为 2。利用这一深度并可视化结果时,Woodside 邻里、经度和 Midland Beach 邻里等特征被发现是预测 AirBnb 房价最重要的因素。

结论

完成本文后,你应该对决策树模型的机制有一个坚实的理解。从头到尾了解模型的实现尤为重要,特别是在使用scikit-learn模型及其超参数时。此外,你可以通过调整阈值或其他超参数来定制模型,从而提高性能。感谢你花时间阅读这篇文章。

以下是你可以联系我或查看我工作的方式。

GitHub:suhasmaddali (Suhas Maddali ) (github.com)

YouTube:https://www.youtube.com/channel/UCymdyoyJBC_i7QVfbrIs-4Q

LinkedIn:(1) Suhas Maddali, Northeastern University, Data Science | LinkedIn

Medium: Suhas Maddali — Medium

Kaggle:Suhas Maddali | Contributor | Kaggle

使用 H3 和 Plotly 构建六边形地图:全面教程

原文:towardsdatascience.com/constructing-hexagon-maps-with-h3-and-plotly-a-comprehensive-tutorial-8f37a91573bb

发掘六边形地图在数据分析中的潜力

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

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

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

Sam Balye 在 Unsplash

通常,当我们希望使用分级图地图可视化某个区域的变量时,我们会使用常见的行政几何形状。例如,如果我们想查看欧洲的失业率,我们可以通过各国的州来进行可视化。

然而,行政区域往往不规则,并且彼此之间的大小也有所不同。因此,将区域划分为六边形是一种可视化任何变量的有用替代方法。这种方法的优点包括具有平衡的几何形状,以便更好地进行区域比较和改进的区域覆盖。此外,六边形地图还能减少视觉偏差,因为它们提供了区域的均等表示,不像传统的行政边界,后者由于其不规则的形状和大小,有时会扭曲数据的感知。

在本文中,我们将提供如何在 Python 中创建六边形地图的逐步解释。为此,我们将使用两个简化地图构建过程的库:H3 和 Plotly。

分析数据:巴塞罗那市酒店数据集

本文使用的数据集可在巴塞罗那市的开放数据门户中获取。该开放数据门户提供有关巴塞罗那市的人口、经济和社会数据,所有这些数据都可以免费访问。我们使用的数据集包含了巴塞罗那所有酒店的信息,包括它们的位置。您可以从以下链接下载文件。

[## 巴塞罗那市的酒店 - 开放数据巴塞罗那

巴塞罗那市酒店列表和位置

opendata-ajuntament.barcelona.cat

酒店的数量将是我们在六边形地图上可视化的变量。文章的以下部分将逐步解释如何创建这种可视化。

数据读取和清理

下载文件后的第一步是进行数据读取和清理。在这种情况下,数据集包含了许多与我们的分析无关的列,我们不会对其进行检查。我们将特别选择酒店名称、地理位置(纬度和经度),以及可能与位置相关的属性(尽管在这个特定情况下我们不会使用它们)。一旦选择了这些列,我们将使用更简单的名称重命名它们,然后我们的数据集就可以进行可视化了。

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

酒店数据集(图像由作者创建)

使用 H3 生成六边形网格

为了使用六边形地图可视化数据,我们的第一步是创建网格。为此,我们将使用H3 库,这是由 Uber 开发的。get_hexagon_grid函数负责以GeoDataFrame的形式创建六边形网格。它从在特定位置(latitudelongitude),在本例中为巴塞罗那的中心,创建一个六边形开始。这个六边形的大小由resolution参数定义。随后,在中央六边形周围同样大小的六边形会同心生成。生成同心环的数量由ring_size参数决定。最后,这些六边形的集合被转换为GeoDataFrame,其中每个六边形都被分配了一个唯一的 ID, correspond to H3 库提供的 ID。

虽然本文不会详细探讨用于构建六边形网格的每个函数,但感兴趣的读者可以参考库的文档,以详细了解我们是如何应用它的。

[## H3 | H3

六边形层次地理空间索引系统

h3geo.org

以下图表展示了resolutionring_size参数如何影响生成的网格。Resolution控制六边形的大小,这意味着分辨率越高,六边形越小。另一方面,ring_size参数决定了围绕中央六边形创建的同心环的数量。换句话说,较大的ring_size会导致更多的同心环。在下面的图表中,所有图形具有相同的坐标轴限制。正如你所观察到的,要覆盖相同的区域,使用更高的分辨率需要更多的环,因为如前所述,所有创建的六边形与中央六边形的大小相同。

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

各种分辨率和环大小的六边形网格

选择的resolution将取决于我们希望在特定区域表示的变量的变化。如果存在显著变化,将考虑使用更高的resolution。在这种情况下,选择了9作为分辨率。此外,ring_size将取决于我们希望覆盖的区域和之前选择的resolution。在这个特定案例中,ring_size45,足以覆盖整个巴塞罗那市的区域。我们不会深入探讨如何得出这一结论。一般而言,我们获得了巴塞罗那市多边形的边界框,并确定了覆盖该区域所需的环数。

以下是使用之前描述的参数和get_hexagon_grid函数创建六边形网络的GeoDataFrame

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

正如上面所见,get_hexagon_grid函数提供了一个GeoDataFrame,其中第一列是 H3 库分配给每个多边形的唯一 ID,第二列包含实际的多边形,并命名为geometry

每个酒店分配到其相应的六边形

创建六边形网格后,需要将每个酒店分配到其所属的六边形。calculate_hexagon_ids函数计算每个酒店所属的六边形,并创建一个名为Hexagon_ID的新列来存储这些信息。

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

包含‘Hexagon_ID’列的酒店数据集

现在,所有酒店的数据集还包括了每个酒店所在六边形的信息。这些信息可以在Hexagon_ID列中找到,这是一个字母数字标识符。

基于要可视化的变量的数据分组

一旦分配了六边形的 ID,我们就开始计算希望可视化的数据。在这种情况下,我们的目标是显示每个六边形内的酒店数量。为此,我们按Hexagon_ID进行分组并执行count操作。此外,我们希望实现一个悬停功能,以便查看每个六边形内酒店的名称。为此,我们对所有酒店名称执行连接操作。在连接中使用 HTML <br>标签来表示换行,因为 Plotly 使用 HTML 来定义其悬停文本。

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

聚合结果的数据框

如上所示,分组后的数据框有三列:(1)Hexagon_ID,包含唯一的六边形标识符,(2)Count,记录该六边形内的酒店数量,(3)Hotels,列出六边形内的酒店名称。

数据可视化:使用六边形的巴塞罗那酒店制图表示

一旦数据被分组,我们可以进行最终步骤,即使用 Plotly 创建六边形地图

create_choropleth_map 函数负责处理分组数据集和包含每个六边形几何形状的数据集,以生成六边形地图。该地图允许我们可视化城市哪些区域的酒店集中度较高。

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

巴塞罗那市酒店分布热力图(作者创建的图片)

为了创建地图,我们将使用 Plotly Express 中的 choropleth_mapbox 函数。该函数生成一个具有定义几何形状(在本例中为创建的六边形集合)的地图,并根据每个六边形中检测到的酒店数量为其着色,利用用户选择的连续颜色比例。当你将鼠标悬停在其中一个六边形上时,可以查看该六边形内的酒店列表。

在这种情况下,使用的背景地图是 carto-positron,但这个参数可以轻松调整为使用其他地图样式,以提供更好的城市街道和兴趣点识别,例如 open-street-map。此外,我们还可以利用不同的颜色比例。在之前的情况下,我们使用了 Viridis 颜色比例,而在这个情况下,我们使用 Reds 颜色比例。

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

巴塞罗那市酒店分布热力图(作者创建的图片)

地图是互动的,允许我们放大感兴趣的区域。

当放大到红色调区域时,可以明显看出,巴塞罗那的大多数酒店都位于加泰罗尼亚广场周围。

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

巴塞罗那酒店浓度最高的区域(作者创建的图片)

总结

带有行政区域的热力图是可视化变量在地理区域内分布的宝贵手段。然而,由于行政区域形状不规则和大小不同,它们在视觉上可能会提供变量分布的偏差。因此,使用具有规则几何形状的六边形地图作为分析领土分布的极佳替代方案。在本文中,我们详细解释了如何使用 Uber H3 库创建六边形网格以及如何在 Plotly 可视化中利用该网格描绘巴塞罗那的酒店分布

容器:它们如何在幕后工作以及为何它们正在主宰数据科学世界

原文:towardsdatascience.com/containers-how-they-work-under-the-hood-and-why-theyre-taking-over-the-data-science-world-6b94702609aa

初学者指南:理解 Docker 的魔力

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

·发布于 Towards Data Science ·阅读时间 7 分钟·2023 年 1 月 5 日

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

Containerized city — 由 Stable Diffusion 生成的图像

Docker 风靡全球,这是有充分理由的。轻量级、可移植的容器使得打包和部署应用程序变得轻而易举,确保它们在任何平台上都能稳定可靠地运行。

那么 Docker 容器到底是什么,它们在幕后是如何工作的呢?谷歌搜索会给你数百篇关于容器与虚拟机(VMs)比较的文章,但这并没有回答问题。Docker 是做什么的?它是他们发明的吗?我们能否在没有 Docker、Podman 或其他任何你可能使用的平台的情况下创建容器?

本系列文章将分解容器的概念,并解释 Docker 如何利用这些概念来革新我们构建和部署软件的方式。我们将了解 Linux 名称空间是什么,如何使用 cgroups 限制容器可以使用的资源,以及为何 overlay 文件系统在创建类似容器的环境中扮演着关键角色。

你准备好理解 Docker 容器的魔力了吗?在本系列结束时,你将能够创建自己的类似容器的环境,而无需 Docker。

学习速率是一个针对对 MLOps 世界感兴趣的人的新闻通讯。MLOps 是一个广泛的领域,致力于以高效和可重复的方式将 ML 模型投入生产。容器在这个流程中扮演着关键角色。如果你想了解更多类似的话题,请订阅 这里。你将在每个月的第一个星期六收到我的更新和对最新 MLOps 新闻和文章的见解!

关键组件

让我们稍微远离 Docker,开始讨论构成 Linux 容器的关键组件。Linux 容器是一种强大的技术,允许你在单一主机上运行多个沙箱化进程。

这些进程共享主机的内核,但有自己的用户空间,这意味着它们有自己的一套库、依赖和运行环境。构成 Linux 容器的三个关键组件是:命名空间、控制组(cgroups)和覆盖文件系统。

命名空间是一个内核特性,它允许你在单一的 Linux 系统中创建隔离的环境。每个命名空间都有自己对系统的视图,这意味着在一个命名空间中的进程无法感知其他命名空间中运行的进程。

控制组(cgroups)是内核特性,它允许你管理和分配资源,如 CPU、内存和 I/O 带宽,给进程组。

覆盖文件系统允许你将一个文件系统堆叠在另一个文件系统之上,创建一个单一的逻辑文件系统。我们将在后续文章中看到这为什么很重要。

这是对构成容器的每个组件的高层次概述。在本文中,我们将深入讨论命名空间。在后续文章中,我们将探讨 cgroups 和覆盖文件系统如何完成这个整体。

命名空间

命名空间是内核特性,它允许你在单一的 Linux 系统中创建隔离的环境。每个命名空间都有自己对系统的视图,这意味着在一个命名空间中的进程无法感知其他命名空间中运行的进程。命名空间用于创建容器运行的隔离环境。

让我们尝试一个简单的类比:Linux 中的命名空间就像房子中的一个房间。每个房间里都有自己的物品,你只能看到和使用你所在房间里的东西。但房子里可能还有其他房间,里面有不同的东西,除非你进入那些房间,否则你不能看到或使用这些东西。

在 Linux 中,每个进程(类似于计算机上正在运行的程序)可以处于不同的命名空间。因此,如果你有两个进程在不同的命名空间中,它们可以拥有各自独立的资源(比如各自的文件列表或网络连接),而且它们无法看到或使用对方的资源。这对于将不同的进程彼此隔离以及确保一个进程不能干扰另一个进程是非常有用的。

命名空间的类型

在 Linux 中有几种不同类型的命名空间,包括以下几种:

  • PID 命名空间:隔离进程 ID 空间,使得不同 PID 命名空间中的进程可以具有相同的 PID 而不会互相冲突。

  • net 命名空间:隔离网络栈,包括网络接口、IP 地址和路由表。

  • mount 命名空间:隔离挂载点,使得不同挂载命名空间中的进程可以拥有各自独立的文件系统,这些文件系统彼此独立,并与主机文件系统隔离。

  • IPC 命名空间:隔离进程间通信资源,如 System V IPC 对象和 POSIX 消息队列。

  • uts 命名空间:隔离主机名。

接下来,让我们创建自己的 PID 命名空间。

创建你自己的命名空间

因此,让我们创建一个新的 PID 命名空间并在其中运行 bash 命令。首先,让我们使用 pstree 命令探索当前系统的状态。我在一个运行 Ubuntu 的 VirtualBox 虚拟机中工作,因此命令返回了以下输出:

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

pstree — 作者提供的图片

在这里我们可以看到 Linux 中进程的结构。每个进程都有一个父进程,除了第一个进程。通常,init 进程(通常是 systemd)将是 PID 1,并且没有父进程。要了解更多关于 systemd 的信息,请阅读以下故事:

[## Linux Systemd 的崛起:初学者指南

了解 Linux Systemd 的强大和灵活性。

medium.com](https://medium.com/geekculture/the-rise-of-linux-systemd-a-beginners-guide-8ca1e226103a?source=post_page-----6b94702609aa--------------------------------)

如果我们创建一个新的 PID 命名空间,我们期望看到一个新的树结构,其中包含属于此命名空间的进程。此外,我们将在此命名空间中首先运行的命令将获得 PID 1,这将映射到主机上的更高 PID 号。让我们看看实际效果:

unshare -ipf

unshare 命令是你用来创建新命名空间的命令。在这种情况下,使用这些标志,它将创建一个新的 PID 命名空间(p 标志)和一个新的 IPC 命名空间(i 标志)。

现在,如果你尝试获取在此命名空间中运行的进程,你应该能看到 bash 作为 PID 1,对吗?让我们来检查一下:

ps -ef

这是我在系统中得到的结果:

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

ps — 图片由作者提供

那么,发生了什么?为什么我仍然看到init进程作为PID 1?Linux 内核使用/proc文件系统来获取有关正在运行的进程的数据。因此,我们缺少一个组件。我们还需要创建一个新的mount命名空间并挂载一个新的/proc文件系统,因为现在我们从默认的mount命名空间获取这些信息。

为了解决此错误,我们将使用--mount-proc标志,它创建一个新的mount命名空间并挂载一个新的/proc文件系统。输入exit以退出你创建的PID命名空间,并运行以下命令:

unshare -ipf --mount-proc

现在,如果你再次运行ps -ef,你将得到你所寻找的结果:

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

pc-proc — 图片由作者提供

恭喜你,你创建了一个新的PID命名空间。这是理解容器在后台如何工作的第一步。当然,如果你尝试运行比 bash 更有意义的东西会更有帮助,但要记住,你已经创建了你系统的一个隔离视图。要退出此视图,只需在终端中输入exit

结论

Docker 容器是一项颠覆性的技术,它迅速席卷了全球。这些轻量级、可移植的容器使得打包和部署应用程序变得简单,确保它们在任何平台上都能一致且可靠地运行。但是,Docker 容器究竟是什么,它们是如何在后台工作的呢?

在这篇文章中,我们讨论了组成 Linux 容器的关键组件,并详细查看了命名空间。接下来,我们将深入探讨cgroups。我们的目标是创建一个类似容器的环境,而不使用 Docker!

关于作者

我的名字是Dimitris Poulopoulos,我是一名为Arrikto工作的机器学习工程师。我为欧洲委员会、欧洲统计局、国际货币基金组织、欧洲中央银行、经济合作与发展组织和宜家等主要客户设计并实施了 AI 和软件解决方案。

如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据操作的文章,请在MediumLinkedIn或 Twitter 上的@james2pl关注我。

所表达的观点仅代表我个人观点,不代表我雇主的观点或意见。

上下文丰富数据:深度学习模型的秘密超能力

原文:towardsdatascience.com/context-enriched-data-the-secret-superpower-for-your-deep-learning-model-549826a5fb3d?source=collection_archive---------8-----------------------#2023-01-13

利用上下文感知数据工程设计更好的预测模型

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

·

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

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

图片由 Mateo Krössler 提供,来源于 Unsplash

在这篇文章中,我想与大家分享我优化深度学习模型输入数据的方法。我已经成功地在我的数据科学家和数据工程师工作中应用了这一方法。通过实际例子,你将学到如何利用上下文信息丰富模型的输入数据。这将使你能够设计出更为稳健和精准的深度学习模型。

深度学习模型之所以如此强大,是因为它们非常擅长整合上下文信息。我们可以通过将多个上下文维度添加到原始数据中来提升神经网络的性能。我们可以通过一些巧妙的数据工程来实现这一点。

当你开发新的预测深度学习算法时,你可能会选择一种完全适合你特定用例的模型架构。根据输入数据和实际预测任务,有很多可能的方案你可能已经心中有数:你要进行图像分类吗?那么你可能会选择卷积神经网络。是关于时间序列预测还是文本分析?那么 LSTM 网络可能是一个有希望的选择。通常,关于正确模型架构的决策主要由输入到模型中的数据类型驱动。

以这种方式,找到正确的输入数据结构(即定义模型的输入层)是模型设计中最关键的步骤之一。我通常会在工程化输入数据的形状上投入比其他任何方面更多的开发时间。明确一点:我们不应该将原始数据的结构视为既定事实,然后仅仅寻找适合它的模型。神经网络在内部进行特征工程和特征选择的能力(“端到端建模”)并不能免除我们优化输入数据结构的任务。我们应该以一种方式提供数据,使得模型能够从中获得最佳的理解并做出最有信息量的决策(即最精确的预测)。这里的秘密成分是上下文信息。我们应该尽可能多地为原始数据提供上下文。

什么是上下文?

那么我具体说的上下文是什么呢?举个例子。玛丽是一名数据科学家,刚刚开始一份新工作,开发一个饮料零售公司的销售预测系统。她的任务简而言之是:给定一个特定的商店和一个特定的产品(柠檬水、橙汁、啤酒……),她的模型应该预测该产品在特定商店的未来销售数量。预测将应用于数千种不同的产品,涉及到数百个不同的商店。到目前为止一切顺利。在玛丽的第一天,她去到销售部门,那里的预测工作已经由非常有经验的销售会计彼得手动完成了。她的目标是了解这个领域专家基于什么来决定某个产品在未来是否会有更高或更低的需求。作为一名优秀的数据科学家,玛丽预期彼得多年的经验将对确定哪些数据对模型有价值非常有帮助。为了找出答案,玛丽问了他两个问题:

“你查看哪些数据来确定我们下个月在柏林店铺中会销售多少瓶某品牌的柠檬水?你如何解读这些数据?”

彼得回复道:“我们首先观察柏林店铺中柠檬水销售的时间变化情况。” 他绘制了如下图表以说明他的策略:

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

作者提供的图

我们看到一个连续的曲线,在七月/八月(柏林的夏季)有重复的峰值。直观上,夏季气温高,人们更倾向于购买清凉饮品,因此产品销量增加。在较小的时间尺度(约一个月)上,我们看到销售的波动范围在约 10 件内,这很可能是由于不可预测的事件(随机噪声)。

彼得:“当我看到一个重复的模式,在夏季销售增加,在冬季销售减少。我假设这种情况也会发生在未来,并相应地估计销售额。” 这听起来非常合理。

彼得在时间的背景下解释销售数据,其中两个数据点之间的距离由它们的时间差定义。如果数据没有按时间顺序排列,则解释起来会更困难。例如,如果我们仅仅查看直方图中的销售分布,时间上下文就会丧失,我们对未来销售的最佳估计可能只是所有值的中位数等汇总数据。

上下文在数据以某种方式排序时出现。

不言而喻,你应该按照正确的时间顺序输入历史销售数据,以保留来自数据库的“免费”上下文。深度学习模型之所以强大,是因为它们在整合上下文信息方面非常出色,类似于我们的脑袋(在这种情况下是彼得的脑袋)。

你是否曾经想过为什么深度学习在图像分类和图像目标检测方面表现如此出色?因为普通图像本身已经带有很多“自然”上下文:图像基本上是按两个上下文维度排序的光强数据点:即* x的空间距离和 y的空间距离。电影(图像时间序列)则补充了时间*作为第三个上下文维度。

因为上下文对预测非常有益,我们可以通过添加更多上下文维度来提升模型的表现,尽管这些维度并不在原始数据中。我们通过一些巧妙的数据工程来实现这一点,如下一部分所述。

我们应该以模型能够充分理解的数据方式来服务数据,从而做出最有信息的决策。通常会在输入数据的形状工程上投入比其他方面更多的开发时间。

设计上下文丰富的数据

回到与玛丽和彼得的会议。了解到实际数据大多数情况下不像上述图示那样整洁,玛丽稍微修改了图表:

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

作者提供的图

玛丽:“如果最后一个销售数据点高于通常的噪声水平怎么办?这可能是一个真实的效应。也许正在进行一个成功的营销活动。也许配方已经改变,现在味道好得多。在这些情况下,效果是持久的,未来的销售将保持在同一高水平。或者也可能只是由于随机事件的异常值。例如,一个学校班级访问柏林,恰好进入了商店,所有孩子都买了一瓶这种柠檬水品牌。在这种情况下,增长是不稳定的,只是噪声。你会如何决定这是否是一个真实的效应?”

你可以看到彼得在回答之前挠头:“在这种情况下,我会查看与柏林的商店相似的商店的销售情况。例如,我们在汉堡和慕尼黑的商店。这些商店是可比的,因为它们也位于德国主要城市。我不会考虑乡村的商店,因为我期望那里的客户有不同的口味和偏好。”

他添加了来自其他商店的销售曲线,并提出了两种可能的情景。“如果我只看到柏林的销售增长,我会把它视为噪声。然而,如果我看到汉堡和慕尼黑的柠檬水销售也在上涨,我期望这是一种稳定的效应。”

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

作者图

因此,在困难情况下,彼得会考虑更多的数据以做出更好的决策。他在不同商店的背景下添加了一个新的数据维度。正如我们上面所学的,当数据以某种方式排序时,会产生背景。为了创建商店背景,我们首先必须定义一个距离度量,以便相应地排序来自不同商店的数据。比如,彼得根据商店所在城市的规模来区分商店。

通过一些SQLNumpy黑客技术,我们可以为我们的模型提供类似的背景。我们首先需要获取我们公司商店所在所有城市的总人口规模。然后我们测量所有商店之间在人口差异方面的距离。最后,我们将所有销售数据汇总到一个二维矩阵中,其中第一个维度是时间,第二个维度是我们的商店距离度量。

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

作者图

销售矩阵提供了对近期柠檬水销售的良好概述,结果模式可以直观地解释。看看销售矩阵的左下数据点:这是柏林的最新销售数字。这个亮点可能是一个异常值,因为在类似的商店(例如汉堡)中没有再现急剧的销售增长。相反,七月份的销售峰值在类似商店中得到了再现。

我们总是需要一个距离度量来创建背景。

将 Peters 的声明转换为数学术语,柠檬水的销售可以建模为产品提供城市的城市人口规模的函数。每当添加新的上下文维度时,我们总是要非常仔细地考虑正确的距离度量。这取决于我们想预测的实体受到哪些因素的影响。这些影响因素完全依赖于产品,距离度量也必须相应地调整。例如,如果你查看德国的啤酒销售,你会发现消费者更可能购买本地酿酒厂的产品(全国大约有 1300 家不同的酿酒厂)。来自科隆的人通常喝“Kölsch”啤酒,但当你向北开车半小时到达杜塞尔多夫地区时,人们会避免“Kölsch”,转而选择更深色、更麦芽味的“Alt”啤酒。因此,在德国啤酒销售的情况下,根据地理距离建模商店距离可能是一个合理的选择。然而,对于其他产品类别(柠檬水、橙汁、运动饮料等),情况可能会有所不同。

因为我们添加了一个额外的上下文维度,我们创建了一个上下文丰富的数据集,在这个数据集中,潜在的预测模型可以获得柠檬水在不同时间和不同商店的销售概况。这使得模型可以通过查看近期的销售历史,并在其他位置的类似商店进行横向比较,从而对柏林商店的未来销售做出明智的决策。

从这里,我们可以进一步添加产品类型作为额外的上下文维度。因此,我们用其他产品的数据来丰富销售矩阵,这些产品按与柠檬水(我们的预测目标)的相似度排名。我们需要找到一个好的相似度度量标准。可乐与柠檬水相比更相似吗?我们可以根据什么数据定义相似度排名?在商店上下文的情况下,我们有一个连续的度量标准,即城市人口。现在我们处理的是类别。我们真正想找到的是与柠檬水有类似销售行为的产品。我们可以对所有产品的时间分辨销售数据与柠檬水进行交叉相关分析。这样,我们可以为每个产品获得一个皮尔逊相关系数,告诉我们销售模式的相似程度。像可乐这样的软饮料可能与柠檬水有类似的销售模式,在夏季销售增加。其他产品则会有完全不同的表现。例如,Gühwein 是一种在圣诞市场上供应的温热甜酒,可能在 12 月有强烈的销售高峰,而在其他时间几乎没有销售。

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

图由作者提供

交叉相关分析将揭示 Glühwein 的皮尔逊系数较低(实际上是负值),而可乐的系数较高。

尽管我们向销售矩阵中添加了第三维度,但我们可以通过在相反方向上连接第二维度来包含产品上下文。这将最重要的销售数据(柏林的柠檬水销售)放在中心:

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

作者图

添加更多功能

尽管我们现在拥有一个信息丰富的数据结构,但迄今为止我们只有一个特征:在特定商店的特定时间销售的特定产品的数量。这可能已经足够进行稳健而精确的预测,但我们可以自由地从其他数据源中添加有用的附加信息。

饮料购买行为很可能与天气有关。例如,在非常炎热的夏天,柠檬水的需求可能会增加。我们可以将天气数据(例如空气温度)作为矩阵的第二层。天气数据将与销售数据在相同的上下文中排列:时间商店位置产品。对于不同的产品,我们将拥有相同的空气温度数据,但对于不同的时间和商店位置,我们会看到可能有用的信息差异。

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

作者图

结果是,我们有一个包含销售和温度数据的 3-D 矩阵。重要的是要注意,我们没有通过包含温度数据来添加额外的上下文维度。正如我之前指出的,上下文是当数据以某种方式排列时产生的。对于我们建立的数据上下文,我们按照时间产品相似性商店相似性来排列数据。然而,特征的顺序(在我们的案例中沿矩阵的第三维度)是无关紧要的。我们的数据结构类似于 RGB 彩色图像。在 RGB 图像中,我们有两个上下文维度(空间维度xy)和三个颜色层(红色绿色蓝色)。为了正确解读图像,颜色通道的顺序是任意的。只要你定义了顺序,就必须保持顺序。但对于按某种上下文组织的数据,没有像我们有的距离度量。

输入数据的结构没有预定。你应该发挥所有创造潜力和直觉来扩展它。

总结

通过向时间分辨的销售数据和附加特征层添加两个额外的上下文,我们得到一个具有两个“通道”(销售和温度)的 2-D“图像”。这种数据结构提供了关于特定商店近期柠檬水销售的全面视图,同时还包含类似商店和类似产品的销售和天气信息。这种数据结构现在非常适合由深度神经网络解读,例如,包含多个卷积层和 LSTM 单元。我将不讨论如何从这里继续进行并设计合适的神经网络。这可能是后续文章的一个主题。

我希望你已经明白,你的输入数据的结构并不是预定的,你可以(应该)用你所有的创造力和直觉来扩展它。

上下文丰富的数据结构不是免费的。为了预测公司所有门店的各种产品,我们需要生成数千个上下文丰富的销售档案(每个门店-产品组合一个矩阵)。你必须投入大量额外的工作,设计高效的处理和缓存步骤,将数据整理成形,并提供给快速的训练和预测周期。但你会得到一个可以做出准确预测并在数据高度嘈杂时也表现非常稳健的模型,因为它可以“跳出框框”做出非常明智的决策。

你有问题吗?需要一个人工智能、数据科学、数据工程或 Python 开发方面的自由专家吗?访问我的网站并给我发消息。

使用 NLP 进行上下文文本校正

原文:towardsdatascience.com/contextual-text-correction-using-nlp-81a1363c5fc3

检测和校正涉及建模上下文的错误

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

·发表于Towards Data Science ·阅读时间 23 分钟·2023 年 1 月 18 日

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

图片由Lorenzo Cafaro提供,来自Pixabay

在上一篇文章中,我们讨论了使用统计 NLP 方法检测和校正文本中常见错误的问题:

## 使用 NLP 进行文本校正

检测和校正常见错误:问题和方法

towardsdatascience.com

在那里我们盘点了几个问题,并附有实际示例和讨论。以下是我们在那篇文章中未完全解决的问题(最后两个甚至没有涉及)。这些是需要处理上下文的。

  • 漏掉逗号。

  • 漏掉或错误使用冠词。

  • 使用单数而非复数,或反之亦然。

  • 使用错误的介词或其他连接词。

在这篇文章中,我们从涉及冠词的问题开始。我们查看这些场景的详细示例,并深入探讨每个“问题”的含义。

然后我们描述了一个解决这些问题的方法。它使用了自我监督的关键思想。

然后我们转到各种其他场景,并讨论相同的方法如何解决这些问题。尽管结果的自我监督规格略有不同,预处理也略有不同。

涉及冠词的问题

考虑这些示例。

… within matter of minutes …
… capitalize first letter in word …

在第一句话中,withinmatter之间应该有一个a。在第二句话中,capitalize后面应该有一个the,在in后面也应该有一个。

考虑这个规则。

If the string is 'within matter of'
  Insert 'a' immediately after 'within'.

你同意这个规则是有意义的吗?不要介意它的适用范围狭窄。稍后会变得清楚,这几乎无关紧要。

如果你同意,那么withinmatter of分别是左侧和右侧上下文,确定a应该插入的位置。

我们可以简洁地将这样的规则表示为 LaR,应该这样解读。如果左侧上下文是 L,右侧上下文是 R,那么它们之间应该有一个a。在我们的设置中,L 和 R 都是令牌序列,可能有长度限制。

如接下来的段落将清楚地说明,实际上,将这个规则以稍微泛化的形式表示为 LMR 会更好。

这里M表示一个固定的可能性集合,准确地定义了我们要解决的问题。在我们的例子中,我们可以选择M为集合{ a*,* an*,* the*, none* }*。

我们会将这个规则理解为“如果左侧上下文是 L,右侧上下文是 R,那么我们要建模四种可能性。None*,表示 L 和 R 之间没有文章,其余三种是三种特定的文章。

我们真正做的是将我们希望解决的问题形式化为一个具有特定结果的监督学习问题,在我们的例子中是M。这不需要任何人工标记数据。只需定义M

我们真正做的是自我监督。我们可以为不同的M选择定义尽可能多的问题。(实际上,在这篇文章中我们会再讨论几个。)然后我们可以利用监督学习的力量,而不需要承担标记数据的成本。这非常强大。

看一个例子。考虑M = {none, **a, **the, **an** }。假设我们的训练集中恰好有一个句子。下划线只是为了可读性——区分M中的结果和文本中的其他词。

John is a man.

我们还假设我们的规则不会跨越句子边界。这是一个合理的假设。建模中的任何内容都不依赖于这个假设,因此它可以根据需要放宽。

从这个单句语料库中,我们将得出以下标记数据:

John _none_ is a man
John is _none_ a man
John is a _none_ male
…
John is _a_ man

每一行中,被下划线标记的词是M中的一个结果,左侧的词是左侧上下文,右侧的词是右侧上下文。

例如,

John is _a_ man

说如果左侧上下文是[John, is],右侧上下文是[man],那么在左侧和右侧上下文之间有一个a。因此,这个标记实例捕捉了文章应该出现的位置和它的身份。

剩下的实例捕捉负例,即文章不应该出现的地方。

一旦我们拥有这样的标记数据集,我们原则上可以使用任何合适的监督学习方法来学习从输入(L,R)预测标签。

在本文中,我们将专注于一种我们认为非常适合我们特定监督学习问题的监督学习方法。这是一种为特定目的建模 L 和 R 为标记序列的方法。

读者可能会问,为什么不使用最新最好的 NLP 技术来处理这个问题呢?它们可以处理非常复杂的场景?例如递归神经网络、变换器以及最近的大型语言模型如 ChatGPT。甚至可能是隐马尔可夫模型或条件随机场。(有关复杂语言模型的更多信息,请参见[6]和[7]。)这些方法中的一些如果不是全部都应该效果很好。

有权衡。如果有人试图从长远解决这些问题,或许是为了围绕它构建一个产品,例如 Grammarly [3],那么最新最好的方法当然应该被考虑。

另一方面,如果有人希望从头开始构建或至少理解更简单但有效的方法,则本文中的方法应该被考虑。

前述方法也容易逐步实现。对于那些想尝试的人,请查看迷你项目部分。那里描述的项目可以在几小时内完成,最多一天,由一个精通 Python 或其他脚本语言的程序员完成。

方法

首先,让我们描述这种方法如何解决缺失或不正确的冠词问题。接着,我们将把它应用于本文前面提到的其他几个问题。

以 LMR 为例。我们将使用附加到这个规则上的概率分布 P(M|L, R)。P(M|L, R)会告诉我们在M中的哪一个结果在(L, R)的上下文中比其他结果更可能。

例如,如果P(a|L=John is, R=man) 接近 1(如果不是 1 的话),我们就会期待这种情况。

P(M|L, R) 可以从我们的训练数据中以明显的方式学习。

P(m|L, R) = #(L,m,R)/sum_m’ #(L,m’,R)

这里 #(L, m’, R) 是我们训练集中输入(L, R)上标签为m’的实例数量。请注意,如果m’none,则 R 在 L 结束后紧接着开始。

假设我们的训练语料库现在恰好有两个句子。

John is a man.
John is the man.

P(a|L=John is, R=man) 将是½,因为这个(L, R)有两个实例,其中一个标记为a,另一个标记为the

在机器学习意义上的泛化

考虑标记实例

John is _a_ man.
Jack is _a_ man.
Jeff is _a_ man.

如果我们的语料库中有足够多的这些数据,我们希望我们的机器学习能学会这个规则。

is _a_ man

即,P(a|L=is, R=man) 也接近 1。这种规则会更好地泛化,因为它适用于左侧上下文是is而右侧上下文是man的任何场景。

在我们的方法中,我们将按如下方式解决这个问题。

设 LmR 是训练集中的一个实例。下面我们将假设 L 和 R 是标记序列。在我们的设置中,标记化可能基于空格。例如,我们的方法将适用于任何标记化方式。

从 LmR 我们将派生新的训练实例 L’mR’,其中 L’是 L 的一个后缀,R’是 R 的一个前缀。L’或 R’或两者可能都没有标记。

从中派生的实例将覆盖所有 L’和 R’的组合。

当然,如果将其应用于大型语料库且 L 和 R 的长度没有限制,训练集的大小可能会爆炸。好吧,限制它们。

回顾

好的,让我们看看现在的情况。考虑本文前面的例子。

… within matter of minutes …
… capitalize first letter in word …

假设我们的训练语料库足够丰富,例如,维基百科的所有内容都已预先分段成句子,我们应该完全没有困难来检测这些句子中缺失的文章位置,并推荐具体的修复方案。应用这些修复方案后得到的句子是

… within a matter of minutes …
… capitalize the first letter in the word …

现在考虑

… within the matter of minutes …

使用我们训练好的模型,我们可以检测到the这里可能应该是a

预测算法

到目前为止,我们只非正式地讨论了如何使用学习到的规则来识别问题,而没有详细讨论。我们现在填补这个空白。

考虑一个窗口 LmR,我们要在此窗口中将 m 与应用于这种情况的规则的预测进行比较。例如,LmR 如果是

… within the matter of minutes …

我们想基于规则 L’ the R’进行预测,其中 L’是[within]或[],R’是[matter, of, minutes],[matter, of],[matter]或[],并从这些预测中以某种方式得出最终预测。

我们将采取以下方法。我们假设给定一个截止值,称之为c,这是P(m’|L, R)在我们的方法预测**m’**的上下文(L, R)中需要达到的最小值。

我们将按照非递增的|L’|+|R’|的顺序检查我们的规则。这里|T|表示列表 T 中的标记数。我们将停止,直到我们找到某个 L’、R’使得P(m’|L’, R’)至少为c

用简单的英语来说,我们在做这个。在适用于特定情况的所有规则中,我们找到一个对M的某些结果具有足够预测性且在这些规则中最通用的规则。

尝试这些

考虑这些例子,来自en.wikipedia.org/wiki/Shannon_Lucid

我已经移除了文章。我希望读者猜测文章应该放在哪里以及它应该是什么:theaan

… included trip to …
… had different payload …
… on wide variety of …
… was teaching assistant …
… and bought preowned Piper PA-16 Clipper …
… as graduate assistant in Department of Biochemistry and 
  Molecular Biology …
… transferred to University of Oklahoma …

只有在你完成所有预测后才查看下面的内容。

这些实例派生的来源是

… included a trip to …
… had a different payload …
… on a wide variety of …
… was a teaching assistant …
… and bought a preowned Piper PA-16 Clipper …
… as a graduate assistant in the Department of Biochemistry and 
  Molecular Biology …
… transferred to the University of Oklahoma …

你的预测效果如何?如果你做得很好,那么本文中描述的方法也会有效。

小项目

如果你对一个可以在几个小时内实现的小项目感兴趣,考虑这个。编写一个脚本,可能只有几行代码,输入一个文本文件并输出一个标记的训练集。然后检查标记的训练集,以了解它是否包含对预测文章位置和身份有用的实例。

如果你的评估显示出潜力并且你有时间,你可以考虑进一步推进。也许使用现有的机器学习实现,例如来自 scikit-learn 的实现,来处理训练集。或者从头实现该方法。

现在一些更多的细节将有助于你的脚本。考虑将上下文限制为 L 和 R 各自恰好一个单词。在文档中按顺序扫描单词,并即时构建负实例和正实例。忽略句子边界,除非你有 NLP 工具(如 NLTK),并可以使用其分词器将文本分割成句子。

将构造出的实例逐步存入一个包含三列 L、R、M 的 pandas 数据框。M 是我们在本节中选择的集合。将此数据框输出到 CSV 文件中。

如何为你的脚本获取一个合理的训练集?通过复制和粘贴下载一两篇维基百科页面。

涉及逗号的问题

接下来,让我们把注意力转向涉及逗号的问题。在 [1] 中我们覆盖了一些简单的场景。下面的那些更为微妙。

参考 en.wikipedia.org/wiki/Zork

In Zork, the player explores …

首先,我们观察到,为了应用我们的方法,我们应该将逗号保留为一个单独的标记。然后,这个问题看起来就像我们之前讨论的那个关于冠词的问题。选择M = {comma, none} 是有意义的。也就是说,监督学习的问题是预测在上下文 (L, R) 中是否存在逗号。

从我们目前看到的情况来看,尽管我们学习的规则可能有效,但它们可能无法充分推广。这是因为左侧上下文的最后一个标记将是 Zork。我们并没有真正学习到一般模式。

In <token of a certain type> _comma_ the

有没有简单的方法来推广我们的方法,使其能够学习更一般的规则?

答案是肯定的。这里是方法。

我们将介绍抽象标记的概念。我们将从一个与我们示例相关的单一抽象开始。在这篇文章后面,我们将根据需要介绍其他抽象。

我们将假设应用此抽象的单词仅包含从 az 的字符。也就是说,没有数字;没有特殊字符。

这种抽象将生成三种字符串之一:/capitalized/ 表示单词以大写字母开头,后跟零个或多个小写字母,/all_lower/ 表示单词中的所有字母都是小写字母,以及 /all_caps/ 表示单词中的所有字母都是大写字母。

接下来,我们将通过选择性地应用这个抽象操作符,从现有标记中推导出新的标记序列。

让我们详细说明“选择性”。如果对序列中的每个标记,我们考虑两种可能性,即原始标记或抽象标记,我们将会得到生成序列的组合爆炸。

为了缓解这个问题,我们将仅抽象出在我们的训练集中出现频率足够低的标记,或者仅抽象出那些产生/首字母大写/或/全大写/的标记。

以下是我们可能从In Zork中派生出的序列,the

In /capitalized/, the

我们只抽象出Zork,因为它既是首字母大写又是一个不常见的词。

现在假设我们将从抽象序列派生的新的标记实例添加到训练集中。标签是与原始序列相关的标签。

在我们的例子中,得到的标记实例是

In /capitalized/ _comma_ the

现在我们按照之前的方式训练我们的算法。它也会学习到一般化的规则。

注意,当我们说“将新的标记实例添加到训练集中”时,我们并不是暗示这需要离线完成。我们可以简单地动态添加这些标记实例。这类似于在机器学习实践中常做的事情。

Extract features from the input on-the-fly

此外,请注意,我们将我们的方法描述为“添加新的标记实例”,仅仅是因为我们觉得这样解释更有用。我们也可以将其视作没有添加新的标记实例,而只是提取了额外的特征。

这是因为所有新添加的实例都具有相同的标签——原始标签。因此,我们可以将它们全部合并到原始实例中,只是提取了额外的特征。

更细致的例子

现在考虑这些来自 en.wikipedia.org/wiki/Shannon_Lucid 的示例

Due to America’s ongoing war with Japan, when she was six weeks old, 
the family was detained by the Japanese.

They moved to Lubbock, Texas, and then settled in Bethany, Oklahoma, the 
family's original hometown, where Wells graduated from Bethany High School 
in 1960.

She concluded that she had been born too late for this, but discovered 
the works of Robert Goddard, the American rocket scientist, and decided 
that she could become a space explorer.

这些是更复杂的。

尽管如此,我们将继续使用我们的方法,理由是我们在帖子中提到的那些。一个理由是,一个基本但有意义的版本可以在几天甚至几小时内从零开始实现。(不需要机器学习库。)

对这些,我们还要增加一点。这种方法的预测是可以解释的。具体来说,如果它检测到一个问题并提出建议,那么涉及的具体规则可以作为解释附加上。正如我们所见,规则通常是透明的。

好的,回到例子。

让我们逐一检查上述示例中涉及逗号的场景。我们不会检查所有的。

对于我们检查的那些规则,我们还会评估我们当前的方法是否有很好的机会按现状运行。这些检查也会产生进一步改进的想法。

考虑

Due to America’s ongoing war with Japan, when she was six weeks old

我们从中派生出的序列是

Due to /capitalized/’s ongoing war with /capitalized/, when she was six 
weeks old

从这两个序列中派生的标记实例还包括左侧上下文的所有后缀组合与右侧上下文的前缀配对。用机器学习的术语来说,这意味着我们在假设空间中枚举了大量假设(在我们的设置中,假设就是规则)。

我们在上一段中试图说明的要点是,通过生成大量假设,我们增加了找到一些足够具有预测性的规则的可能性。

当然,没有免费的午餐。这也影响训练时间和模型复杂度。

这也假设我们能够丢弃在这个过程中发现的那些结果是嘈杂或无效的规则。具体来说,就是那些预测能力不足或可以被同样具有预测能力的更通用规则覆盖的规则。

在本文的后续部分,我们将解决所有这些问题。也就是说,只有通过对广泛场景的实证评估,才能最终揭示我们的方法的有效性。

回到这个具体的例子。首先,再次查看它。

Due to /capitalized/’s ongoing war with /capitalized/, when she was six 
weeks old

我们的方法有很大机会在现状下有效。如果在这个具体例子中无效,那至少在类似例子中有效。此外,关于改进的具体内容没有什么特别的想法。所以让我们继续看看其他例子。

接下来,考虑

when she was six weeks old, the family was detained by the Japanese.

我们认为,当前的方法在这种情况下可能有效。为什么?考虑

… when she was six weeks old the family was detained by …

基于这些信息,你不会考虑在oldthe之间插入一个逗号吗?(我确实是说“考虑”。)

如果你愿意,这个算法也可能效果很好。它看到相同的信息。

接下来,考虑

They moved to Lubbock, Texas
then settled in Bethany, Oklahoma

我们之前提出的抽象,将某些词抽象为/capitalized/、/all_lower/或/all_caps/应该在这里有所帮助。

如果没有足够的帮助,我们可以加上第二个、更精细的抽象。具体来说,涉及检测命名实体citystate。这些可以让我们得出两个新的序列。

They moved to /city/, /state/
then settled in /city/, /state/

更加细致的案例

以下是涉及逗号问题的更细致的例子。这些也来自en.wikipedia.org/wiki/Shannon_Lucid

Originally scheduled as one mission, the number of Spacelab Life Sciences 
objectives and experiments had grown until it was split into two 
missions,[57] the first of which, STS-40/SLS-1, was flown in June 1991.

To study this, on the second day of the mission Lucid and Fettman wore 
headsets, known as accelerometer recording units, which recorded their 
head movements during the day. Along with Seddon, Wolf and Fettman, Lucid 
collected blood and urine samples from the crew for metabolic experiments.

这些表明我们可能需要允许相当长的左侧和右侧上下文,可能每侧最多 20 个单词。也许还要增加更多抽象。

抛开抽象,如何影响我们的模型训练?首先,由于我们在学习一个复杂的模型,我们需要我们的训练集足够大、丰富且多样。幸运的是,这样的数据集可以轻松组建。下载并使用整个维基百科。见[9]。

好了,现在谈谈训练时间。由于我们有一个庞大的训练集和一个复杂的模型,训练时间可能很长,这个模型涉及许多规则。当然,学习到的模型本身也可能很庞大,学习到的大多数规则可能会变得嘈杂。

在本文后续部分,我们将详细讨论这些挑战及其缓解方法。特别是,我们将提出具体的方式来剔除那些预测能力不足的规则或那些可以通过更通用且足够预测的规则来覆盖的规则。

现在,让我们继续下一个用例,即

涉及介词或其他连接词的问题

现在考虑这些示例,这些示例也来自en.wikipedia.org/wiki/Shannon_Lucid,我对其做了一些小的修改。具体而言,我将某些连接词替换成了其他稍微合理但不如原本的词。

… participated on biomedical experiments …
… satellites were launched in successive days …
… initiated its deployment with pressing a button …

你能发现错误并修复它们吗?

以下是原始的,即正确的版本。

… participated /in/ biomedical experiments …
… satellites were launched /on/ successive days …
… initiated its deployment /by/ pressing a button …

如果你做得很好,那么方法也会很好。

现在进行建模。我们将让M表示我们希望建模的连接词集合。M可以由某个词性标注器标记为介词的单词定义。例如,或者其他方式。

无论如何,我们需要确保可以准确且合理高效地确定特定标记是否在M中。

这是因为在训练过程中,在扫描特定文本时,我们需要知道每个单词是否属于M

为了简化起见,我们将 none 排除在M之外。这意味着我们只能模拟替换错误,即使用错误的连接词。虽然很容易将 none 添加进来,但这会稍微增加描述的复杂性。

单数与复数

考虑这些示例,其中我们想要检查所谓的语法数的单词已用粗体标出。

As we’ve seen, for some of the /problems/ we are trying to solve, we may 
need long left and right /contexts/. Up to 20 /words/ each. Perhaps longer.

We've also discussed that we'd preferably want a very rich data /set/ for 
training.

首先,我们需要问一下如何以自动化的方式检测/…/中的单词。这是一个起点。我们可以运行一个词性标注器,只提取名词。

让我们在我们的示例上试一下。使用parts-of-speech.info/上的词性标注器,我们得到

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

各种词性标记的颜色代码如下。

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

尽管如此,这种方法虽然不是最佳,但足以作为起点。它正确地标出了problemscontextswords。它有一个假阳性,and,和一个假阴性,set。它还标出了training,这可能我们并不在意。

正如我们稍后将详细讨论的那样,尽管假阳性可能会产生额外的无关规则,但这些规则通常不会有害,只是无用。此外,我们将在修剪阶段捕捉到它们。

也就是说,如果我们对准确性有较高要求,我们可能会考虑使用更先进的词性标注器,或其他方式来改进我们的检测方法。我们在这篇文章中不会追究这两个方向。

接下来,我们将进行一种在之前讨论的使用案例中尚未遇到的预处理。假设我们在前一段描述的过程中检测到了一个特定的单词,这是我们研究的对象。这里的“研究对象”是指它应为单数还是复数。

一旦我们检测到这样的词,我们将运行一个语法数分类器,可能使用一个非常简单的启发式方法,例如,如果单词以sies结尾,则视为复数,否则视为单数。接下来,我们将根据该分类器的预测,将 singularplural 添加到文本的副本中。重要的是,我们还将对紧接着标签之前的单词进行单数化处理。

在我们的示例中,完成所有这些操作后,使用我们之前使用的词性标注器,我们会得到

As we’ve seen, for some of the *problem* _plural_ we are trying to solve, 
we may need long left and _singular_ right *context* _plural_. Up to 20 
*word* _plural_ each. Perhaps longer.

所以我们的M将是集合{ singular, plural }。

请注意,左侧上下文包括我们试图预测语法数的词。这是有意为之的。这就是为什么我们在文本中明确添加了标签的原因。

此外,请注意,被星号包围的单词是我们进行单数化处理的单词。我们这样做是因为这些词在待预测标签的左侧上下文中。我们希望去除单词本身中任何可以用来预测其标签的信息。除了单数化版本本身固有的信息。

如果我们没有对这些词进行单数化处理,就会发生标签泄漏。这将产生不良后果。我们可能会学习到看似有效但在预测时表现不佳的规则。

接下来,让我们快速回顾一下文本,以作为合理性检查。评估上下文是否似乎有足够的信号来至少比随机预测得更好。我们能够多准确地预测标签,将有待于经验评估。

似乎对于某些问题,预测 plural左侧和右侧上下文 也似乎比随机预测 plural 更好。没有看到更多示例,很难说效果有多好。类似地,最多 20 个单词 似乎也能预测 plural。如果我们使用将 20 视作 integer_greater_than_1 的抽象,预测可能会有所改善,并且确实会更好地泛化。

模型复杂性、训练时间和查找时间

正如我们所见,对于我们试图解决的某些问题,我们可能需要较长的左侧和右侧上下文。每侧最多 20 个单词。也许更长。

我们还讨论过,我们最好能拥有一个非常丰富的训练数据集。例如,整个维基百科。我们的机制也依赖于抽象,这可能会将训练集的规模放大到另一个数量级。

这会是我们方法的致命问题吗?其实不会。我们可以显著减少模型的大小,并大幅加快训练速度。我们将在下文中逐一讨论这些问题。我们还会讨论如何提高我们称之为查找时间的效率,因为这会影响训练时间和预测时间。

减少模型大小

让我们从模型大小开始。首先,请记住,在现代,大规模的实际模型确实使用数十亿个参数。因此,即使没有任何剪枝,我们也可能没问题。话虽如此,我们还是会对其进行讨论。

当考虑是否删除特定规则时,我们将区分两种情况。

  • 规则是否预测不足?

  • 与这个规则相比,更通用的规则是否足够预测?

我们区分这两种情况的主要原因是我们不会对第一种情况进行显式剪枝。相反,我们将依赖于第二种情况也能处理第一种情况,或者预测算法能够足够好地进行动态剪枝。关于后者,还要注意预测算法将截止点c作为参数,这允许我们在预测时变得更保守或更敏感。

好了,既然这些解决了,我们来处理第二种情况。

为了解释这个方法,让我们从一个足够通用的学习规则 LMR 开始。这是一个例子。

from M learned

我们认为它通用,因为左右上下文都是一个单词。

想象一下,在训练语料库中,表达式from a learned model 至少出现一次。所以我们也会学习到这个规则。

from M learned model

这个规则更具体。因此我们将其视为规则的子规则。

from M learned

现在我们已经定义了子父关系,我们可以将规则排列成树状结构。

现在我们准备描述剪枝标准。对于树中的特定节点v,如果它的所有后代预测的结果与v相同,我们将修剪掉v子树下的所有节点。

让我们将其应用于我们的例子。在设置M = {a, an, the, none}中,规则

from M learned model

预测相同结果的*a*,如

from M learned

此外,假设后一个规则在其子树中仅有一个规则,即前一个规则。那么我们将剪除前一个规则。

好的,我们已经定义了剪枝标准。接下来,我们讨论如何实际进行剪枝,即如何高效地应用标准。简短的答案是自下而上

我们从树的叶子开始,找到它们的父节点。然后,我们逐一考虑这些父节点。如果父节点的所有子节点预测的结果与父节点相同,我们就剪除这些子节点。

我们现在有了一棵新树。我们在它上面重复相同的过程。

当我们不能再剪枝或剪枝足够时,我们停止。

加速训练

一方面,我们只需对训练集中的句子进行一次遍历。此外,我们只需停留在那些M的实例上,以暂停并更新之前描述的各种计数器。这很好。

另一方面,在特定的停止点m,我们可能需要枚举所有可接受的窗口 LmR,以便我们可以增加涉及m的计数器。对于这些窗口中的每一个,我们还需要根据我们建模的抽象来推导额外的窗口。

我们已经讨论了如何约束抽象,所以在这里我们不会重复讨论。

我们希望指出的关键点是,以我们之前描述的方式修剪模型不仅减少了模型的大小,还加快了后续的训练。这是因为,在任何特定的停止点m,在修剪模型中触发的规则通常会比未修剪的模型少得多。

查找时间

这里的查找是指我们希望在特定情况下高效地查找适用的规则。我们从一个例子开始。假设我们已经学会了规则

is M man

对于涉及冠词的问题。回忆一下我们选择了M 为 { aanthenone }。

现在考虑文本Jeremy is a man. 我们要扫描它以查找问题。我们将关注a,因为aM中。我们要按顺序检查以下内容。对于这个M,是否有规则 L = [is] 和 R = []?是否有规则 L = [] 和 R = [man]?是否有规则 L = [is] 和 R = [man]?等等。我们称“是否有规则”为查找。查找输入M、L 和 R。

我们显然希望查找能够快速进行。我们可以通过在哈希表中索引规则集来实现这一点,称之为 H。H 的键是三元组(M、L、R)。可以将 H 视为一个 3 维哈希表,表示为 H[M][L][R]。

总结

在这篇文章中,我们涵盖了涉及检测和纠正文本错误的详细场景。我们所说的“详细”是指那些上下文显得重要的情况。我们讨论了缺少或不正确的冠词、缺少逗号、在应使用复数时使用单数或反之亦然、以及使用错误的连词如错误的介词等问题。

我们将每个问题建模为自监督学习问题。我们描述了一种适用于所有这些问题的方法。它基于对结果空间的概率分布,该分布在左上下文和右上下文上共同条件化。结果的定义和一些预处理确实依赖于特定问题。

我们讨论了枚举左右上下文对及其逐渐增加的长度,以及用于学习更一般规则的抽象机制。

我们描述的方法在其基本形式上容易实现。

我们还描述了如何修剪学习到的规则集,如何加速训练,以及如何高效地查找适用于特定情况的规则。

参考文献

  1. 使用 NLP 的文本修正。检测和纠正常见错误…… | 作者:阿伦·贾戈塔 | 2023 年 1 月 | 数据科学之路

  2. 关联规则学习 — 维基百科

  3. Grammarly 我广泛使用它,非常有用。

  4. ChatGPT: 优化对话的语言模型

  5. 维基百科:数据库下载

  6. 统计语言模型 | 阿伦·贾戈塔 | 数据科学前沿 | Medium

  7. 神经语言模型,阿伦·贾戈塔,数据科学前沿,Medium

数据平台的持续集成和部署

原文:towardsdatascience.com/continuous-integration-and-deployment-for-data-platforms-817bf1b6bed1

数据工程师和机器学习操作的 CI/CD

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

·发表于 Towards Data Science ·阅读时间 9 分钟·2023 年 4 月 14 日

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

图片由 Emmy Sobieski 提供,来源于 Unsplash

什么是数据环境?数据工程师将基础设施资源分为实时和暂存,以创建隔离的区域(环境),在这些区域中,他们可以测试 ETL 服务和数据管道,然后再将其推广到生产环境中。

数据环境 指的是一组应用程序和相关的物理基础设施资源,这些资源支持数据存储、传输、处理和数据转换,以支持公司的目标和计划。

这个故事 提供了 适用于数据的 CI/CD 技术概述 和一个简单的 ETL 服务的 工作示例,该服务使用 Python 构建,并通过 Github Actions基础设施即代码(IaC)进行部署。

持续集成和持续交付(CI/CD)

持续集成和持续交付(CI/CD)是一种软件开发策略,所有开发人员在一个共同的代码仓库上协作,当做出更改时,会使用自动化构建过程来发现任何潜在的代码问题。

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

作者提供的图像

CI/CD 的好处

CI/CD 的主要技术优势之一是它提高了整体代码质量并节省了时间。

使用基础设施即代码的自动化 CI/CD 管道解决了许多问题。

[## 初学者的基础设施即代码

使用这些模板像专业人士一样部署数据管道

levelup.gitconnected.com

更快交付

每天多次添加新功能并不是一件容易的任务。然而,如果我们拥有简化的 CI/CD 工作流,这绝对是可以实现的。

使用 CI/CD 工具,如 GoCD、Code Pipeline、Docker、Kubernetes、Circle CI、Travis CI 等,开发团队现在可以独立且自动地构建、测试和部署。

减少错误

在开发过程中晚些时候发现和解决代码问题是费时且昂贵的。当功能出现错误并发布到生产环境时,这变得尤为重要。

通过使用 CI/CD 管道更频繁地测试和部署代码,测试人员将能够及时发现问题并立即进行修复。这有助于实时降低风险。

减少人工干预和提高透明度

测试应自动运行,以确保新代码或新功能不会损坏任何已有功能。在整个过程中,我们希望获得有关开发、测试和部署周期的定期更新和信息。

轻松回滚

为了防止生产环境的停机,如果新发布或功能出现问题,通常会立即部署最近一次成功的构建。这是另一个出色的 CI/CD 功能,便于轻松回滚。

详尽的日志

了解部署过程至关重要。了解代码为何失败则更为重要。DevOps 和 CI/CD 集成中最重要的部分之一是可观察性。能够阅读我们构建的详尽日志绝对是必备功能。

我们什么时候使用 CI/CD 来处理数据平台?

管理数据资源和基础设施:通过 CI/CD 技术和工具,我们可以配置、部署和管理我们可能需要的数据管道基础设施资源,例如云存储桶、无服务器微服务以执行 ETL 任务、事件流和队列。像 AWS Cloudformation 和 Terraform 这样的工具可以轻松管理基础设施,为测试、预发布和生产环境提供资源。

SQL 单元测试:CI/CD 有助于数据转换。如果我们有一个以 ELT 模式转换数据的数据管道,我们可以自动化 SQL 单元测试以测试其背后的逻辑。一个好的例子是 GitHub Actions 工作流,它编译我们的 SQL 脚本并运行单元测试。

## SQL 脚本的单元测试及其依赖项

以及数据仓库 Gitflow 管道来自动运行

[towardsdatascience.com

验证 ETL 过程:许多数据管道严重依赖 ETL(提取、转换、加载)操作。我们希望确保任何提交到 GitHub 代码库的更改都能正确处理数据。这可以通过实施自动化集成测试来实现。以下是一个简单的实现示例:

[## 数据平台单元和集成测试解释

如何进行这个练习以及如何将其应用到我们的数据管道中?这是我自己提出的一个好问题。

mydataschool.com](https://mydataschool.com/blog/data-platform-unit-and-integration-tests-explained/?source=post_page-----817bf1b6bed1--------------------------------)

监控数据管道。一个很好的例子是使用 CI/CD 和基础设施即代码来配置通知主题和警报,用于 ETL 资源,例如 Lambda 等。如果我们的 ETL 处理服务出现问题,例如错误数量达到阈值,我们可以通过选定的渠道接收通知。以下是一个 AWS Cloudformation 示例:

如何为数据平台设置 CI/CD 管道?

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

示例 CI/CD 管道。作者提供的图像。

步骤 1. 创建一个代码库

这是一个基础步骤。需要一个版本控制系统。我们希望确保我们代码中的每个更改都进行版本控制,保存到云端,并且在需要时可以恢复。

步骤 2. 添加构建步骤

现在,当我们有了代码库后,我们可以配置 CI/CD 管道来实际构建项目。假设我们有一个 ETL 微服务,它从 AWS S3 加载数据到数据仓库。此步骤将涉及在隔离的本地环境中构建 Lambda 包,即在 Github 中。在此步骤中,CI/CD 服务必须能够收集所有所需的代码包来编译我们的服务。例如,如果我们有一个简单的 AWS Lambda 来执行 ETL 任务,我们将需要构建这个包:

# This bash script can be added to CI/CD pipeline definition:
PROFILE=Named_AWS_profile 
# Get date and time for our build package:
date
TIME=`date +"%Y%m%d%H%M%S"`
# Get current directory to name our packge file:
base=${PWD##*/}
zp=$base".zip"
echo $zp
# Tidy up if any old files exist:
rm -f $zp

# Install required packages:
pip install --target ./package pyyaml==6.0 
# Go inside the package folder and add all dependencies to zip archive:
cd package
zip -r ../${base}.zip .
# Go to the previous folder and package the Lambda code:
cd $OLDPWD
zip -r $zp ./pipeline_manager
# upload Lambda package to S3 artifact buacket (we can deploy our Lambda from there):
aws --profile $PROFILE s3 cp ./${base}.zip s3://datalake-lambdas.aws/pipeline_manager/${base}${TIME}.zip

步骤 3. 运行测试

我们希望确保我们部署的数据管道的更改按预期工作。这可以通过编写良好的单元测试和集成测试来实现。然后,我们将配置我们的 CI/CD 管道来运行这些测试,例如,每次我们提交更改或合并到主分支时。举例来说,我们可以配置 Gitflow Actions 来运行**pytest test.py****npm run test**来测试我们的AWS Lambda。如果测试成功,我们可以进行下一步。

步骤 4. 部署到预发布环境

在此步骤中,我们继续实现持续集成。我们的项目已经成功构建,所有测试都通过了,现在我们希望在暂存环境中部署。这里的环境指的是资源。CI/CD 管道可以配置为使用与此特定环境相关的设置,通过基础设施即代码进行最终部署。

Lambda 示例。此 bash 脚本可以添加到 CI/CD 管道的相关步骤中:

STACK_NAME=PipelinaManagerStaging
aws --profile $PROFILE \
cloudformation deploy \
--template-file stack_simple_service_and_role.yaml \
--stack-name $STACK_NAME \
--capabilities CAPABILITY_IAM \
--parameter-overrides "StackPackageS3Key"="pipeline_manager/${base}${TIME}.zip"
# Additionally we night want to provide any infrastructure resources relevant only for staging. They must be mentioned in our Cloudformation stack file stack_simple_service_and_role.yaml

步骤 5. 部署到生产环境

这是最后一步,通常在我们 100%确认一切正常时手动触发

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

图片由作者提供

CI/CD 将使用用于生产环境的 IaC 设置。例如,我们可能希望提供仅与生产相关的任何基础设施资源,即我们的 Lambda 函数名称应为pipeline-manager-live。这些资源参数和配置设置必须在我们的 Cloudformation 堆栈文件中提及。例如,我们可能希望我们的ETL Lambda 由 S3 桶中的 Cloudwatch 事件触发,每当创建新 S3 对象时。在这种情况下,我们需要在参数中提供此 S3 桶的名称。另一个例子是我们的 Lambda 设置如内存和超时。对于暂存服务,不需要过度配置内存,但在生产环境中,我们希望它能够处理更大的数据量。

CI/CD 生产环境步骤示例:

 STACK_NAME=SimpleCICDWithLambdaAndRoleLive
aws \
cloudformation deploy \
--template-file stack_cicd_service_and_role.yaml \
--stack-name $STACK_NAME \
--capabilities CAPABILITY_IAM \
--parameter-overrides \
"StackPackageS3Key"="pipeline_manager/${base}${TIME}.zip" \
"Environment"="live" \
"Testing"="false"

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

图片由作者提供

回滚、版本控制和安全性可以通过 CI/CD 服务设置和 IaC 来处理。

带有基础设施即代码和 AWS Lambda 的 CI/CD 管道示例

假设我们有一个典型的代码库,其中一些 ETL 服务(AWS Lambda)通过 AWS Cloudformation 进行部署。

这可以是一个数据管道管理应用程序或其他执行 ETL 任务的工具。

我们的代码库文件夹结构如下:

.
├── LICENSE
├── README.md
└── stack
    ├──.github
    |   └──workflows
    |       ├──deploy_staging.yaml
    |       └──deploy_live.yaml
    ├── deploy.sh
    ├── event.json
    ├── package
    ├── pipeline_manager
    │   ├── app.py
    │   ├── config
    │   └── env.json
    └── stack_cicd_service_and_role.yaml

我们将在.github/workflows 文件夹中使用deploy_staging.yamldeploy_live.yaml来定义我们的 CI/CD 管道。

在任何Pull Request上,我们希望运行测试并在暂存环境中部署。

然后,如果一切正常,我们将把代码推广到生产环境,并将堆栈部署到生产环境。

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

图片由作者提供

该管道将使用 Github 仓库的机密,我们将在其中复制粘贴 AWS 凭证。

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

图片由作者提供

在 STAGING AND TESTS 成功执行且所有测试通过后,我们可以手动将代码推广到生产环境。我们可以使用workflow_dispatch:来完成此操作:

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

图片由作者提供

市场上可用的 CI/CD 工具

有各种 CI/CD 解决方案可以用于自动化数据管道测试、部署和监控。Github Actions 是一个很好的工具,但有时我们可能需要更多和/或不同的工具。

这不是一个详尽的列表,但以下是一些值得尝试的热门技术:

AWS CodePipeline: 每个管道每月$1.5 的可靠工具。包括通过基础设施即代码进行的自动构建和部署等许多功能。

Circle CI: Circle CI 是一个基于云的 CI/CD 系统,用于自动化数据管道的测试和部署。它有多个连接器和插件,使其设置和操作变得简单。

Jenkins: Jenkins 是一个免费的开源自动化服务器,用于持续集成和部署。它提供了多种插件和连接器,使其成为一个强大的数据管道管理解决方案。

GitLab CI/CD: GitLab CI/CD 是一个基于云的系统,允许团队在一个位置管理代码和数据管道的变更。它具有易于使用的界面,用于创建、测试和部署数据管道。

Travis CI: Travis CI 是一个基于云的 CI/CD 系统,用于自动化数据管道的测试和部署。它易于设置和使用,使其成为缺乏自动化经验的团队的热门选择。

GoCD: GoCD 是一个免费的开源构建和发布工具。它是免费的,并且大量依赖 bash 脚本。

结论

CI/CD 的主要好处之一是提高代码质量。持续集成和部署为数据平台工程师和 ML Ops 带来了许多好处。我们数据管道部署的每一步都可以轻松监控和管理,以确保更快的交付且生产中没有错误。这节省了时间,并帮助工程师提高生产力。

我希望这个故事中给出的简单示例对你有所帮助。利用它作为模板,我能够为容器化应用程序创建强大且灵活的 CI/CD 管道。自动化部署和测试如今几乎已成标准。我们还可以做更多的事情,包括 ML Ops 和为数据科学提供资源。

市场上有很多 CI/CD 工具。一些是免费的,一些不是,但提供了更多灵活的设置,可能更适合你的数据堆栈。我对初学者的建议是从免费的工具开始,并尝试实现这个故事中的示例。它描述了一个可以为任何数据服务复制的过程。

推荐阅读

1. docs.github.com/en/actions

2. stackoverflow.com/questions/58877569/how-to-trigger-a-step-manually-with-github-actions

3. docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html

4. medium.com/gitconnected/infrastructure-as-code-for-beginners-a4e36c805316

5. betterprogramming.pub/great-data-platforms-use-conventional-commits-51fc22a7417c

持续学习:数据科学家的漫长旅程

原文:towardsdatascience.com/continuous-learning-a-data-scientists-odyssey-8d3006c2ce01

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

图片来源:Tbel AbuseridzeUnsplash

导航不断变化的领域

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

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

成为一名数据科学家就意味着成为终身学习者。数据科学领域总是有新的东西出现——新的算法、新的实践、新的概念。作为数据科学家,我们应该如何保持现状并在这个不断变化的领域中导航?在本文中,我将分享作为自学成才的数据科学从业者的经验,讲述如何持续学习。

为什么要持续学习

在讨论作为数据科学家如何持续学习之前,首先需要理解原因。没有目的的学习很少能实际提升技能,因为这很难保持持续的动力。对我而言,持续学习在工作中几乎是必需的。由于问题的复杂性,在工作中遇到障碍是常见的。从零开始构建或改进问题解决方法总是需要额外的研究、阅读和实践。此外,我也是一个好奇的人,渴望了解我领域中的最新趋势和前沿技术。回顾我过去的项目和在 Medium 上的文章,曾经前沿的技术今天看起来已经过时。我对这个领域发展的速度感到惊讶,同时也觉得有义务不断进步和更新技能。对我而言,持续学习可以提高工作效率,增强信心和工作安全感,并激发我在内容创作方面的灵感。实际上,持续学习的心态对任何寻求成长并愿意走出舒适区的人都是有益的,不仅仅限于数据科学或科技行业。在开始之前找到你的“为什么”。

我学到了什么

决定学习什么是重要的。这取决于你当前的技能水平以及短期和长期目标。我专注于学习两种类型的技能:生成洞察力的硬技能和有效传达这些洞察力的软技能。

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

Marvin MeyerUnsplash 拍摄

硬技能

数据科学在很大程度上依赖于硬技能,这些是 excel 于该领域所需的基本能力。拥有扎实的数学和理论基础,并保持对最新的算法和最佳编码实践的了解是至关重要的。从实际的角度来看,了解算法或技术概念背后的数学似乎需要大量的时间和精力,但从长远来看,我仍然发现它是有益的。除此之外,问题解决是另一个重要的技能,它涉及快速学习、应对模糊性、总结和概括特定任务以供未来使用。这些技能将帮助你从混乱和模糊中生成有用的洞察力和业务价值。

除了这些通用技能,领域知识在你在特定行业获得更多经验时也非常重要。各行各业的业务运作方式差异很大。因此,获取洞察力的方法也可能会有所不同。例如,由于数据隐私问题以及数据的收集和存储方式,医疗保健中的数据分析与其他领域大相径庭。电子商务或社交媒体等行业可能拥有大量数据,并且相对容易进行实验以获得洞察力,而传统行业可能会有更多的限制。通过理解业务运作方式,将数据科学与行业领域知识结合起来是很重要的。

软技能

软技能在职业和个人成长中与硬技能一样重要。它们是区分你与其他数据科学家并帮助你进一步发展的技能。我不断提高的软技能包括有效的 沟通、讲故事、演讲、领导力、商业敏锐度等。在职场中,没有人是孤立的。仅仅生成洞察力是不够的。你还必须学会有效地沟通和与他人协作,以最大化影响。以下文章讨论了这些技能的更多细节:

## 七个原则,让我成为更好的数据科学家

确定我的北极星

towardsdatascience.com

我在哪里学习

工作中

通过实践学习是最有效的学习和技能提升方式,你的同事是最好的资源。在工作中,你每天都在学习新技能(希望如此)。你通过解决问题、交付结果来练习硬技能,通过沟通和协作来发展软技能。要在工作中学习,保持开放和积极的心态,设定促进成长的目标,并不断反思你最近学到和实践的内容。这将表明,你简历上的工作年限不仅仅是数字,而是你技能发展进步的体现。

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

图片由HeadwayUnsplash提供

Medium

Medium 可能是我最值得的投资,具有最高的投资回报率。我阅读博客文章,以便对新概念有一个良好的理解,并保持行业最新实践的了解。比起阅读论文或参加课程,理解概念的速度要快得多。我推荐关注技术博客并订阅Towards Data ScienceAnalytics VidhyaTowards AICodeX等。此外,科技公司的技术博客也非常宝贵。我关注了MicrosoftNetflixAirbnbDoorDashExpediaPinterest等。这些博客更新频率较高。

我也利用 Medium 来建立人际网络。我通过我的文章建立了一个优秀的社区,并与其他有才华的写作者建立了联系。我的读者可以根据我的文章内容看到我的进展,从刚进入数据科学领域,到完成完整的项目,再到寻找该领域的工作,以及现在分享工作中的经验和学习。如果你想阅读更多关于数据科学技术和职业发展的文章,与我联系

在线学习平台

如果我想深入学习某个新知识,我会在 Coursera、Udemy、LinkedIn Learning 等在线学习平台上报名课程。虽然观看 YouTube 视频是免费的,但有时这些视频对我来说还不够。如果我报名课程,我希望能够全面学习,并有一个实验室来实践和接受反馈。正如我在上一篇文章中提到的,刻意练习对学习新技能至关重要。在实验室中进行练习并接受评估可以确保我理解新概念,并准备好在需要时应用它们。公司通常为员工提供在线学习平台的学习预算,所以要确保利用这些预算来投资自己。此外,如果你也在美国,你会惊讶于你当地图书馆提供的免费资源。我从我的当地图书馆获得了免费的 Coursera、LinkedIn Learning 和 SkillShare 账户。查找你所在地区图书馆网站上提供的资源。

论文和书籍

阅读研究论文或教科书似乎效率低下且令人不堪重负。然而,这是帮助你彻底且系统学习某些知识的少数几种方法之一。对于你想专攻的技能或你深感兴趣的领域,拥有可信赖的教科书作为参考并跟进最新的研究论文是很好的选择。唯一的低效在于你阅读这些材料的方式。逐句阅读是一种浪费时间的方法。我有一些建议可以帮助你提高阅读效率:

  • 带着问题阅读。 你为什么要打开这本书,或者为什么要阅读这篇论文?如果你心中有具体的问题,你的阅读体验将会更快捷、直击要点。

  • 首先阅读研究论文的摘要和引言。 研究论文可能包含大量数学和细节,这些细节可能与你无关。如果你只是想了解新内容,摘要和引言应该足够了。如果你感兴趣,你可以更深入地阅读。

  • 查找书籍或论文的幻灯片或大纲。 通常会有总结著名书籍和论文要点的幻灯片。阅读幻灯片比阅读整篇文章要容易得多。

  • 查找教科书的 YouTube 视频或摘要。 一些教科书在网上有补充视频,这些视频可能是书籍作者提供的,或者是教授用这本书授课时提供的。视频可以作为一种替代媒介,帮助学习者以视觉方式吸收知识,这对于一些人来说可能更为合适。你还可以通过在线搜索或通过getAbstract获得书籍的摘要和总结。

[## getAbstract: 知识更全面,做得更好。]

世界上最大的商业书籍总结库。通过可以在 15 分钟内阅读的总结来扩展你的商业知识……

www.getabstract.com

  • 请让 AI 为你总结。 如果你只想了解高层次的总结,你还可以使用像 ChatGPT 这样的工具来帮助提供 PDF 格式文件的要点。

会议和网络研讨会

参加会议或网络研讨会是跟进最新技术发展和实践的有效方式。这也是一个与社区建立联系和交流的好机会,尤其是面对面的活动。在会议上,参与者可以高层次地接触到与特定主题相关的最新进展。对于个人感兴趣的主题,讲者通常会在线分享他们的源代码和论文,提供了很好的机会来连接和合作。参加这些活动总是让我大开眼界。我也在与如此多的杰出人物互动后感到非常激励。有很多会议选择供数据科学家选择。查看主题和讲者,选择一个对你现在或未来最有益的会议。你可以根据地点、社区或特定主题来选择。如果你的公司能承担你的费用,那就更好了。说服他们投资于你。

播客

我关注很多讨论数据科学和行业最新趋势与实践的优秀播客。我也喜欢这些提供关于提升生产力、促进持续学习、职业发展等方面的深入建议的播客。以下是我推荐的一些播客:

数据怀疑者播客涵盖了与数据科学、统计学、机器学习、人工智能等相关的话题,所有这些都是从应用批判性思维和科学方法来评估主张的真实性和方法的有效性来探讨的。

我们涵盖了数据收集、数据库、分析、预测建模、可视化、软件工程、实际应用、商业化和创业等方面的工具、技术和实施技巧——你需要的所有数据科学知识。

对数据科学家的日常工作、使用的工具和模型、他们如何解决问题以及职业发展进行深入探讨。这个播客帮助你在数据科学领域获得成功的职业生涯。听一集就像和一位经验丰富的导师共进午餐。嘉宾是来自各个行业的数据科学从业者、AI 研究人员、经济学家以及 AI 公司的 CTO。

对于懂普通话的人,我强烈推荐这个播客作为职业建议,尤其是在科技领域。他们讨论了很多职业迷思和如何提升职场软技能。而且,它很适合在健身时听!

Huberman Lab 讨论神经科学:我们的脑部及其与身体器官的连接如何控制我们的感知、行为和健康。

对我来说,Huberman Lab 更像是一个生产力播客。我喜欢 Dr. Huberman 的基于证据的建议。这些话题拓展了我的知识视野。

关于科学、技术、历史、哲学以及智能、意识、爱情和权力的本质的对话。

  • 讨论特定行业发展和新闻的其他播客

随着职业的进步,除了通用技能,领域知识变得越来越重要。如果你在特定行业或对某些领域感兴趣,跟踪一些播客以保持对最新趋势和实践的更新。

播客提供了一种替代的知识和信息传播媒介。你可以在通勤、锻炼或做家务时听。虽然有些播客内容简洁,其他的则可以提供高密度的技术细节和信息。我必须承认,我应该花更多时间来听播客,找到更合适的时间。我通常在健身房做力量训练或跑步时听播客,这可能不是最适合获取技术信息的时间。如果你发现了一个好的时间来听信息丰富的播客,请和我分享!

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

图片来自 Mohammad MetriUnsplash

总结来说,有很多学习的方式。我们可以在工作中和工作之外学习,学习的方式并不重要,最重要的是保持成长心态。多花些时间总结和概括,以便将其内化为你的技能。

具体的行动是什么?

拥有成长心态很重要,但采取行动同样至关重要。以下是一些保持持续学习习惯的建议:

  • 设定长期和短期目标

目标给我们行动的理由,在我们缺乏意志力时激励我们。在时间管理理论中,建议根据任务的重要性和紧急性对任务进行分类。虽然紧急任务总是优先处理,但每天为重要但不紧急的任务留出时间是至关重要的,因为这将使你在长远中与众不同。这些任务包括学习一门新语言或技能、启动副业等。你定义的这些任务将取决于你的长期和短期目标。这些目标不应仅限于工作或学校。你还可以包括个人成长、关系等方面的目标。反思并问自己:

  • 你希望在下一年和接下来的十年里成为什么样的人?

  • 什么让你感到快乐和满足?

  • 什么让你最兴奋?

  • 你在生活中最看重什么?

这些问题将帮助你找到你的目标。

  • 设定固定的学习时间

当我在研究生院时,我习惯于同时上课、从事研究项目和教学。我不喜欢周末的空闲时间而没有内疚感。我没有统计每周工作多少小时,但肯定超过了 40 小时。一旦我开始工作,我意识到在全职工作的情况下,兼职工作或学习新东西需要更多的努力。因此,我学会了在工作时间之外在日历上安排特定的时间块来专注于这些任务。否则,我可能会发现自己有一天工作很努力,第二天却不知道做什么。或者无意识地在沙发上浪费时间而没有意识到。我通常会在几个工作日的晚上安排时间来处理副业或参加在线课程,早晨则用来阅读有趣的博客文章。找到最适合你的时间表并尝试,然后根据需要做出调整,直到你找到舒适的每周例行程序。

  • 不要使用稍后阅读而从未阅读过

许多在线平台提供一个功能,允许用户收集一些内容并在稍后阅读。如果你没有时间完成阅读或希望之后深入阅读,这非常方便。然而,老实说,你多久会重新访问这些收藏呢?你有多少次花了很长时间找到一篇论文、一门课程或一本教科书,但找到之后却让它们静静地躺在本地磁盘上却从未真正阅读?你有多少次将一篇 Medium 故事添加到阅读列表中却再也没有打开过?我发现自己几乎从未阅读阅读列表中的文章。可以理解的是,如今我们可以很容易地接触到社交媒体,我们每天收到的信息可能会让我们感到不知所措。我们需要对新信息和知识保持开放的心态,并知道我们应该优先接收哪些内容。收藏和稍后阅读功能帮助我们筛选感兴趣的信息,但我们需要后续步骤来掌握和吸收。我发现将特定的时间段用于阅读收藏中的内容很有用。

此外,对你的收藏进行分类也非常有用。我不再将所有内容放在“阅读列表”中,而是按主题如“因果推断”和“生成式 AI”或按项目作为支持资源如“时间序列课程资源”来分类。我发现自己为了特定的目的更频繁地重新访问特定主题。稍加组织会带来很大的不同。

  • 分享你所学到的东西

教授或分享你所学到的东西是确保你正确且彻底掌握某些知识的好方法。就像我开始在 Medium 上写作一样,最初我希望将博客文章作为面试准备的参考和笔记。在写下我所学到的东西时,我被迫认真思考这些概念而不留下任何模糊之处。当我们阅读或听讲座时,我们获取或输入了新的信息。提取或输出这些信息对我们完成学习循环至关重要。写博客文章不仅巩固了我的学习,还能激励他人。我强烈建议开始输出过程,无论是写作、视频、与学习伙伴讨论还是教祖父母。

  • 方法与方法论

我从收听播客 A Bouquet of Arguments 中获得的一个有用见解是了解方法与方法论的区别。在完成任务时,我们遵循一种方法来完成这个特定的任务。与此同时,我们总结出一种方法论来完成所有类似的任务。例如,你被要求在 EDA 和建模过程前清理一个特定的数据集。你通过采用填补缺失数据、检查重复项等方法来预处理这个数据集。由于数据格式的不同,你可能需要定制这个方法。在完成几个类似任务后,你可能会得到一个可以泛化到大多数数据集的预处理方法,就像 这篇文章总结的那样。通过总结和反思学习,将任务解决过程内化到你的技能中。如果没有这个关键步骤,你会错过“做中学”的最重要方面,这将使你能够解决特定任务并扩展到未来解决各种类似任务。

  • 充分利用现有工具

使用正确的工具并不是“懒惰”;而是高效地分配有限的精力和注意力。AI 是一个好的学习伙伴、顾问、老师、助手等。负责任并且批判性地使用它。最新的技术提供了许多我们可以受益的优势。这里有一些我遇到的优秀中等文章,分享了我们都可以利用的令人惊叹的工具,以更好地学习和实践数据科学:

## 如果我能从头开始,我将如何利用 ChatGPT 学习数据科学

2023 年自学数据科学与 AI 的路线图。

towardsdatascience.com [## ChatGPT 已经过时:这里有 8 款将改变你工作的 AI 工具

利用这些革命性的 AI 工具保持领先于其他 ChatGPT 用户。

pub.towardsai.net](https://pub.towardsai.net/chatgpt-is-old-news-here-are-8-ai-tools-that-will-transform-your-business-d4bfcd91721d?source=post_page-----8d3006c2ce01--------------------------------) ## 如何使用 ChatGPT 更快地学习数据科学,即使你已经很先进

讨论数据科学在以 AI 驱动的未来中的相关性,并提供逐步学习数据科学的指南…

[towardsdatascience.com

我还将在未来的文章中讨论更多关于 AI 在数据科学自我教育中的应用。请关注以获取进一步更新。

  • 观看励志视频

我关注了许多制作生产力、时间管理或学习日志的视频的 YouTuber。观看他们的视频激励我在感到懒惰和低效时重新投入。你也可以搜索不同 YouTuber 录制的 x 小时学习视频。他们总是有很好的布置、音乐和氛围。有时,我会打开一个作为我的番茄钟来帮助我在进行深度工作时集中注意力。你还可以加入学习/工作直播,这会让你感觉像在教室或图书馆里,有良好的社区相互监督。

  • 给自己休息时间

维持全职工作和在工作时间之外的持续学习听起来令人恐惧。有时,确实会感到压倒性的!在技术行业中,倦怠非常普遍,你有权偶尔给自己休息。知道何时说“不”和何时给自己休息很重要。你可以休假,规划每周的一天作为休息日,用于进行最放松的活动。我通过去健身房或参观书店来放松,并且每季度都会请假去旅行。知道如何放松也是一种关键技能,与知道如何高效工作一样重要。

有人可能会问,维持全职工作已经很累了,我们真的需要过度施压吗?最近我读了一本由 Tim Ferriss 所著的《每周工作 4 小时》的书。书中提出的许多新颖观点中,我想在这篇文章中分享的是“避免压力但拥抱积极压力”。压力是不好的,它使人感到疲惫,然而,我们都需要生活中的“积极压力”。积极压力是健康的压力,它给你能量,激励你变得更好。持续学习给我带来了健康的压力,这种压力不会让我感到焦虑,而是满足感。感谢你读到这里。希望这篇文章对你找到舒适的工作方式有所帮助。

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

Brett Jordan拍摄,图片来源于Unsplash

免责声明:所有推荐均基于我的个人经验。本文没有广告,但欢迎未来品牌赞助和合作。

最后,别忘了:

通过敏捷数据科学项目管理控制人工智能成本

原文:towardsdatascience.com/control-ai-costs-through-agile-data-science-project-management-9396516f888b?source=collection_archive---------8-----------------------#2023-12-08

运行敏捷数据科学组织的蓝图

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

·

关注 发表在 Towards Data Science ·11 min read·2023 年 12 月 8 日

引言

数据科学的世界复杂而隐蔽,隐藏的成本超出了预算限制。数据科学家对任何组织来说都是一项重要的投资。不幸的是,闲置的基础设施等低效问题会浪费大量的数据基础设施投资。敏捷方法提供了一个解决方案,改善工作流程并减少浪费的时间。通过敏捷,传统的数据科学过程变得更加优化和适应,从而更高效地提供价值。本文探讨了这些隐藏的成本,并演示了敏捷实践如何使您的数据科学项目更具成本效益。

第一部分:数据科学的隐藏成本

数据科学家凭借他们对数据处理的复杂知识和专业技能,是宝贵的资源,他们的生产力至关重要。数据科学家在创新上花费的时间越少,而在繁琐任务上的时间越多,成本就会越高,而收益却没有增加。此外,数据科学家倾向于使用自己的机器以避免受到中央 IT 的限制或建立平行的“影子 IT”能力,这使得知识发现变得繁重,并且常常导致重复造轮子的问题。

浪费可以以多种形式出现。波士顿咨询集团发现,只有 44% 的模型能够投入生产,数据科学家每天的时间中有相当一部分可能浪费在如 IT 设置等琐碎任务上。此外,当数据科学家辛勤工作时,基础设施成本会迅速增加。当他们忙于工作而分心于创新时,数据基础设施投资实际上可能变得闲置、始终在线且过度配置。最后,在 AI 数据规模下,将数据进出云端的成本也会很高。因此,跨多个堆栈、孤岛和环境管理云成本变得困难。

机器学习——尤其是生成式 AI——需要大量的云计算资源和昂贵的 GPU。2023 年,像 ChatGPT 这样的知名模型使像 OpenAI 这样的组织每天的计算成本约为 70 万美元(《华盛顿邮报》的 SemiAnalysis [1])。根据一个 估计,ChatGPT 在部署之前需要数千个 GPU 和几个月的训练 [2]。

持续存在的挑战。约 56% 的数据科学领导者在正确扩展数据科学项目方面需要帮助(BCG)。例如,跨多个云平台的数据不仅增加了存储成本,还使得在团队之间访问和共享数据变得困难。这种支离破碎的方法可能会进一步挤压预算,并削弱数据科学生命周期中至关重要的协作和效率。我们如何将这些绊脚石转变为垫脚石?答案可能在于采纳敏捷方法和结构化的流程设计。

第二部分:数据科学中的流程设计和敏捷方法

今天,当效率和适应性成为关键时,敏捷方法论在数据科学项目中变得越来越重要。敏捷流程接受适应性、协作和迭代开发,这些都可以显著影响整个数据科学生命周期中项目的成本效率。典型的数据科学项目非常适合采用敏捷实践,因为它天生具有敏捷管理方法的关键特征:

  • 增量和迭代开发——数据科学产品是逐步构建的。大多数常用的数据科学项目管理框架都有严格定义的阶段。例如,CRISP-DM 使用业务理解、数据理解、数据准备、建模和评估。

  • 关注价值——预测模型以及数据科学一般来说,都是本质上以价值为导向的,因为模型推荐和洞察直接驱动业务决策。

  • 赋权团队——当数据科学团队可以在团队内部优先安排和组织工作时,能够达到最佳生产力。这包括选择特定的模型、工具、框架、计算资源、编程语言等。

  • 持续学习——这是敏捷的另一个重要原则。当我们开始构建模型时,我们有一个特定的愿景,并根据这个愿景开始构建产品(模型、报告等)。经过第一次迭代,或在项目的一个阶段(如探索性数据分析)之后,我们对问题有了更多了解,这使我们能够相应地调整愿景。

数据科学项目通常要求各阶段之间的互动。例如,模型结果不佳可能会促使重新审视数据收集,以积累具有更好预测能力的数据。敏捷方法论接受这种循环性质,使团队能够适应和优化流程。

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

图片由作者提供

以下是敏捷过程在典型数据科学项目中的简要概述:

  • 业务案例:定义问题和潜在影响。

  • 数据收集和初步分析:收集、分析和验证数据。

  • 建模 / 探索性数据分析:开发和测试模型。

  • 运营化:将模型部署到生产环境中。

  • 监控与分析:持续监控、分析和优化模型。

像 Jira 这样的项目管理工具使敏捷方法论可以呈现不同的形式。如果你的数据科学平台使用项目来组织工作单元,而你的工作流程使用带有任务、故事和缺陷等子问题的史诗,则将史诗问题与项目链接可以简化开发过程和进度/工作负荷的跟踪。

对于处理不同阶段的不同团队的复杂项目,创建链接到任务票据的项目可能更为高效。每个票据代表一个单独的阶段或一组阶段,确保与复杂的工作流程更好地对齐。

第三部分:基础设施成本与控制

基础设施管理至关重要,但在数据科学中常常被忽视。设置和管理数据科学环境的复杂性可能导致大量隐藏成本,尤其是当资源未被充分利用时。当投资闲置、持续开启且过度配置时,这些费用迅速累积,减少了将宝贵资源投入更具生产力领域的机会。

机器学习模型,尤其是深度学习,需要大量的计算资源——高端 GPU 和云计算实例——且成本可能非常高。此外,商业平台可能会有加价,使价格更高。战略性地规划和投资基础设施,平衡对前沿技术的需求与成本控制的必要性。

这个问题不仅消耗了财务资源,还导致了潜在生产力的损失,并且由于资源分配不当给多个团队使用,形成了效率瓶颈。遗憾的是,这种形式的浪费并不总是显而易见的,通常需要细致的跟踪和管理才能发现和减轻。利用敏捷策略可以从数据科学投资中解锁更多的价值,将潜在的浪费转化为生产力和创新。这也为监控成本、资源利用提供了文档记录,并最终有助于计算单个数据科学项目的投资回报率(ROI)。

第四部分:扩展、数据管理和敏捷工作流程

扩展数据科学项目是一项庞大且常被低估的任务。根据行业报告,只有 56%的数据科学项目能够超越实验阶段并创造业务价值。一个重要因素是与数据存储和管理相关的成本不断膨胀,但也包括各种硬件和软件解决方案的成本。然而,采用敏捷实践可以在这股不断上升的费用潮中提供救生船。

具有迭代开发和反馈循环特征的敏捷工作流程,使数据科学团队能够准确发现存储效率低下的问题。例如,通过专注于数据整合的迭代冲刺,可以避免冗余的数据集。通过在先前工作基础上逐步构建并重用数据和代码,敏捷工作流程减少了对额外存储资源的需求。

此外,像版本控制和特性分支这样的敏捷实践可以实现高效的数据管理。适当的版本管理使得回滚到项目的先前状态变得更容易,避免了多个冗余副本的需求,从而节省了存储空间。

敏捷还意味着更好的资源分配。通过 Scrum 会议和看板,团队能够透明地了解谁在做什么,从而更有信息地分配资源,优化人力和机器资源的使用,减少空闲时间,从而降低闲置成本。

敏捷思维也延伸到自动化。通过数据提取、转换和加载(ETL)的自动化管道的迭代开发,可以逐步消除手动瓶颈——加速扩展过程,并显著降低与人工操作和错误修正相关的成本。

然而,重要的是要注意,敏捷并不是一种放之四海而皆准的解决方案。团队必须适应变化,愿意采纳反馈并做出必要的调整。数据科学项目是多方面且复杂的,因此,僵化地遵循任何一种方法可能会带来操作盲点和意外成本。

采用敏捷方法进行规模扩展不仅仅是为了提高速度,而是为了更智能地完成任务。通过专注于迭代改进、透明性和自动化,你将大大提高成功扩展项目的机会,同时控制成本。

第五节:效率、自动化和 IT 的角色

效率是支撑数据科学复杂机制的关键。如果没有效率,不仅成本会飙升,而且价值实现的时间也会增加,从而削弱了采用数据科学的竞争优势。一个经常被忽视但对提高效率至关重要的因素是 IT 的角色。

尽管 IT 部门传统上专注于维护系统完整性和基础设施,但数据科学的兴起扩展了它们的角色。它们现在在建立自动化工作流程和推动敏捷实践的采用方面发挥着关键作用,这直接影响了成本效率。

推动效率的一个可行方法是将 Epics(大型工作块)映射到较小的 Projects(或由数据科学平台支持的等效工作单元),将 Tasks/Stories 映射到 Projects,这一做法通常得到敏捷方法论的支持。这种整合充当了灯塔,引导团队穿越数据科学项目的复杂性。每个 Epic 可以分解成多个较小的任务或故事,帮助进行项目范围界定和角色分配。这不仅促进了透明度,也增强了问责制,从而推动了效率。

自动化管道和 CI/CD(持续集成/持续部署)机制,通常由 IT 部门监督,进一步提升了这种效率。自动化加快了常规任务的处理,释放了数据科学家们的时间,使他们能专注于更复杂的任务和创新。这就是 IT 角色不可或缺的地方。IT 可以设置和维护这些管道,确保数据科学团队拥有高效工作的所有必要条件。

另一个方面是管理云资源和计算能力。机器学习模型需要大量计算,这既耗时又昂贵。在这里,IT 可以根据敏捷计划和当前的冲刺任务,合理分配资源。这避免了计算能力的浪费,确保只使用所需的资源,从而降低成本。

总而言之,IT 的角色正在演变为实施数据科学中的敏捷实践的推动者,这对于控制成本和提升效率至关重要。通过在数据科学团队中启用敏捷实践和自动化,IT 作为支持数据科学敏捷框架的支柱。

第六部分:对业务战略和竞争优势的更广泛影响

随着数据科学的不断成熟,它成为业务战略中更有价值的核心组成部分,为显著的竞争优势提供了途径。通过敏捷方法论,数据科学团队可以放大这一影响,将数据科学从操作工具提升为战略资产。

在商业战略的背景下,敏捷等同于对市场变化的适应性和响应能力。将敏捷过程融入数据科学项目的组织更容易进行调整或扩展,确保他们始终领先于竞争对手。例如,将复杂的项目分解为可管理的“Epic”或“任务票”,有助于高层决策者更容易把握复杂数据科学项目的轨迹,并更明智地分配资源。

此外,敏捷实践促进了持续改进和创新的文化。每个冲刺结束时,团队都会回顾进展并相应调整未来的冲刺。这种迭代过程培养了一种将失败视为学习机会的环境。在一个如数据科学这样经常充满不确定性和复杂性的领域,这种文化是一种强大的竞争优势。

此外,敏捷过程有助于管理风险——这是希望通过数据科学主导市场空间的组织的关键优先事项。敏捷的迭代性质,加上对持续反馈的重视,确保在过程中早期识别任何风险。这允许及时的缓解策略,确保项目不仅按时完成,而且达到预期的质量标准。

通过关注这些原则,企业可以开启价值的新维度,对其财务结果产生重大影响,并将自己定位为各自领域的领导者。

第七部分:关于使用敏捷过程构建模型开发流程的简要教程

在应对数据科学项目的复杂性时,尤其是涉及到构建机器学习模型时,可能会感到棘手。请遵循这个逐步指南,利用敏捷方法论建立模型开发流程,类似于之前讨论的 Jira 集成。目标是揭开流程的神秘面纱,使数据科学团队能够更高效、更有效地运作。

第 1 步:定义项目范围和目标

在开始任何项目之前,请回答以下问题,以形成敏捷项目的基准:

  1. 你试图解决的问题是什么?

  2. 成功指标是什么?

第 2 步:分解为迭代周期或冲刺

将项目分解为更小、更易管理的部分,这些部分也称为冲刺。这些冲刺的时间长度可以从两周到四周不等,具体取决于项目的复杂性和团队对相关任务的熟悉程度。

第 3 步:与更广泛的业务目标对齐(使用史诗任务或任务票)

确保你的数据科学项目在分解成冲刺后,与更广泛的业务目标有明确的联系。利用史诗任务或任务票来保持这种对齐,使所有相关人员,特别是决策者,能够看到更大的图景。

第 4 步:分配角色并创建跨职能团队

在敏捷方法论中,由数据科学家、数据工程师和业务分析师组成的跨职能团队至关重要。尽早分配角色和责任,以促进顺畅的协作。

第 5 步:利用敏捷项目管理工具

类似 Jira 的工具在跟踪进展方面非常有用。这些平台允许高效分配任务并监控冲刺的进展。

第 6 步:促进协作和持续反馈

开放沟通和持续反馈的文化至关重要。鼓励团队成员表达他们的意见和关切,使项目能够根据需要进行调整。

第 7 步:监控进展,必要时调整

敏捷项目管理工具帮助你轻松监控项目的进展。利用这些工具,如果事情没有按照计划进行,敏捷方法论允许你快速调整。无论是在当前冲刺中进行必要的调整,还是在下一个冲刺中进行规划,都可以。

第 8 步:总结回顾和经验教训

在每个冲刺结束后——以及项目结束时——举行回顾会议,团队讨论哪些做得好,哪些做得不好,以及如何在未来的冲刺或项目中改进。

结论

在数据科学和机器学习日益重要的时代,推动业务战略和实现竞争优势的过程中,管理成本和提高效率不容小觑。采用敏捷方法论提供了一个强大的框架,可以直接应对这些挑战。

在你寻求提升数据科学能力时,考虑一个实施良好的敏捷方法可以为你的组织带来的显著成本效益。

我们鼓励你深入了解敏捷方法论,甚至进行一些进一步的阅读或实际培训,继续你在数据科学领域的旅程。通过正确的实践,你的数据科学项目不仅不会成为成本中心,而且会成为一个有价值的资产,为你更广泛的商业目标做出贡献。

参考文献

[1] Will Oremus,《AI 聊天机器人每次使用都会亏钱。这是一个问题。》,《华盛顿邮报》,2023 年 6 月,最后访问日期 2023 年 8 月 30 日,www.washingtonpost.com/technology/2023/06/05/chatgpt-hidden-cost-gpu-compute/

[2] Andrej Karpathy,《GPT 现状》,微软 BUILD,2023 年 5 月 23 日,www.youtube.com/watch?v=bZQun8Y4L2A

可控医学图像生成与 ControlNets

原文:towardsdatascience.com/controllable-medical-image-generation-with-controlnets-48ef33dde652

使用 ControlNets 控制潜在扩散模型生成过程的指南

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

·发表于 Towards Data Science ·阅读时间 9 分钟·2023 年 6 月 13 日

在这篇文章中,我们将展示如何训练一个ControlNet,以使用户能够精准控制潜在扩散模型的生成过程(如 Stable Diffusion!)。我们的目标是展示这些模型在不同对比度下转换脑部图像的卓越能力。为实现这一目标,我们将利用最近推出的MONAI 开源扩展MONAI Generative Models!

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

使用 ControlNet 从 FLAIR 图像(左)生成 T1 加权脑部图像(右)

我们的项目代码可以在这个公开的代码库中找到 https://github.com/Warvito/generative_brain_controlnet

介绍

近年来,文本到图像扩散模型取得了显著进展,使得基于开放领域的文本描述生成高度真实的图像成为可能。这些生成的图像具有丰富的细节、清晰的轮廓、一致的结构和有意义的上下文表示。然而,尽管扩散模型取得了重要成就,但在生成过程中实现精确控制仍然是一个挑战。即使有冗长而复杂的文本描述,准确捕捉用户想要的想法仍然可能是一项困难的任务。

ControlNets的引入,如 Lvmin Zhang 和 Maneesh Agrawala 在其开创性论文“将条件控制添加到文本到图像扩散模型”(2023)中提出的,显著增强了扩散模型的可控性和定制性。这些神经网络作为轻量级适配器,能够实现精确的控制和定制,同时保留扩散模型的原始生成能力。通过微调这些适配器,同时保持原始扩散模型的冻结,文本到图像模型可以高效地扩展到各种图像到图像应用中。

ControlNet 的独特之处在于其解决了空间一致性的问题。与之前的方法不同,ControlNet 允许对生成结构的空间、结构和几何方面进行显式控制,同时保留了来自文本说明的语义控制。原始研究介绍了各种模型,这些模型基于边缘、姿势、语义掩码和深度图实现条件生成,为计算机视觉领域的激动人心的进展铺平了道路。

在医学影像领域,许多图像到图像应用具有重要意义。在这些应用中,一个显著的任务是跨领域翻译图像,例如将计算机断层扫描(CT)转换为磁共振成像(MRI),或在不同对比度之间转换图像,例如从 T1 加权图像到 T2 加权图像。在这篇文章中,我们将重点关注一个特定案例:使用从 FLAIR 图像获得的2D 脑图像切片生成对应的 T1 加权图像。我们的目标是展示如何有效地利用我们的 MONAI 扩展(MONAI Generative Models)和 ControlNets 来训练和评估医学数据上的生成模型。通过深入探讨这个例子,我们旨在提供这些技术在医学影像领域实际应用的见解。

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

FLAIR 到 T1w 翻译

潜在扩散模型训练

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

潜在扩散模型架构

要从 FLAIR 图像生成 T1 加权(T1w)图像,第一步涉及训练一个能够生成 T1w 图像的扩散模型。在我们的示例中,我们使用从UK Biobank 数据集(根据此数据协议提供)提取的脑部 MRI 图像的 2D 切片。我们将原始的 3D 脑部图像通过你喜欢的方法(例如,ANTsUniRes)注册到 MNI 空间。然后,我们从大脑的中心部分提取五个 2D 切片。我们选择这个区域是因为它展示了多种组织,使我们更容易评估所进行的图像转换。使用此脚本,我们最终获得了大约190,000 个切片,空间维度为224 × 160 像素。接下来,我们使用该脚本将图像划分为训练集(约 180,000 个切片)、验证集(约 5,000 个切片)和测试集(约 5,000 个切片)。数据集准备好后,我们可以开始训练我们的潜在扩散模型!

为了优化计算资源,潜在扩散模型使用编码器将输入图像 x 转换为低维潜在空间 z,然后通过解码器重建。这种方法使得即使在计算能力有限的情况下也能训练扩散模型,同时保留其原始质量和灵活性。类似于我们在上一篇文章**(使用 MONAI 生成医学图像)**中做的,我们使用来自 MONAI Generative 模型的带有 KL 正则化的自编码器模型来创建我们的压缩模型。通过使用这个配置和 L1 损失以及 KL 正则化,感知损失对抗性损失我们创建了一个能够高保真编码和解码脑部图像的自编码器 (使用这个脚本)。自编码器的重建质量对于潜在扩散模型的性能至关重要,因为它定义了我们生成图像的质量上限。如果自编码器的解码器生成模糊或低质量的图像,我们的生成模型将无法生成更高质量的图像。

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

使用这个脚本,我们可以通过使用原始图像与其重建之间的**多尺度结构相似性指数测量(MS-SSIM)**来量化自编码器的保真度。在这个例子中,我们获得了一个 MS-SSIM 指标为 0.9876 的高性能。

训练完自编码器后,我们将训练扩散模型 在潜在空间 z 上。扩散模型是一种能够通过在一系列时间步上逐步去噪,从纯噪声图像中生成图像的模型。它通常使用U-Net 架构(具有编码器-解码器格式),其中编码器的层通过长跳跃连接与解码器部分的层相连,从而实现特征重用,稳定训练和收敛。

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

扩散模型的 U-Net 架构,具有编码器和解码器之间的跳跃连接。

在训练过程中,潜在扩散模型根据这些提示学习条件噪声预测。我们再次使用 MONAI 来创建和训练这个网络。在这个脚本中,我们使用这个配置来实例化模型,其中训练和评估在代码的这一部分进行。由于在本教程中我们对文本提示不太感兴趣,我们对所有图像使用相同的提示(句子为脑部 T1 加权图像)。

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

使用我们的潜在扩散模型生成的合成脑部图像

我们可以量化我们训练过的生成模型的性能,这次我们评估了样本的质量(使用Fréchet inception distance (FID))和模型的多样性(计算 1000 个样本组中所有样本对的 MS-SSIM)。使用这两个脚本(12),我们得到了 FID = 2.1986 和 MS-SSIM 多样性 = 0.5368。

正如你在之前的图像和结果中看到的,我们现在拥有一个可以生成高分辨率、高质量图像的模型。然而,我们对图像的外观没有任何空间控制。为此,我们将使用 ControlNet 来指导我们潜在扩散模型的生成。

ControlNet 训练

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

ControlNet 架构

ControlNet 架构包括两个主要组件:一个可训练的来自 U-Net 模型的编码器版本,包括中间块,以及一个预训练的“锁定”版本的扩散模型。这里,锁定副本保留了生成能力,而可训练副本则在特定的图像对图像数据集上进行训练,以学习条件控制。这两个组件通过**“零卷积”层**互联——一个 1×1 的卷积层,其初始化权重和偏置被设置为零。卷积权重逐渐从零过渡到优化参数,确保在初始训练步骤中,可训练和锁定副本的输出与 ControlNet 不存在时的输出保持一致。换句话说,当 ControlNet 应用于某些神经网络块之前,没有引入任何额外的影响或噪声到深层神经特征中。

通过整合这两个组件,ControlNet 使我们能够控制 Diffusion Model 的 U-Net 中每个级别的行为。

在我们的示例中,我们在这个脚本中实例化 ControlNet,使用以下等效代码片段。

import torch
from generative.networks.nets import ControlNet, DiffusionModelUNet

# Load pre-trained diffusion model
diffusion_model = DiffusionModelUNet(
    spatial_dims=2,
    in_channels=3,
    out_channels=3,
    num_res_blocks=2,
    num_channels=[256, 512, 768],
    attention_levels=[False, True, True],
    with_conditioning=True,
    cross_attention_dim=1024,
    num_head_channels=[0, 512, 768],
)
diffusion_model.load_state_dict(torch.load("diffusion_model.pt"))

# Create ControlNet
controlnet = ControlNet(
    spatial_dims=2,
    in_channels=3,
    num_res_blocks=2,
    num_channels=[256, 512, 768],
    attention_levels=[False, True, True],
    with_conditioning=True,
    cross_attention_dim=1024,
    num_head_channels=[0, 512, 768],
    conditioning_embedding_in_channels=1,
    conditioning_embedding_num_channels=[64, 128, 128, 256],
)

# Create trainable copy of the diffusion model
controlnet.load_state_dict(diffusion_model.state_dict(), strict=False)

# Lock the weighht of the diffusion model
for p in diffusion_model.parameters():
    p.requires_grad = False

由于我们使用的是潜在扩散模型,这要求 ControlNets 将基于图像的条件转换为相同的潜在空间以匹配卷积大小。为此,我们使用一个与完整模型共同训练的卷积网络。在我们的案例中,我们有三个下采样级别(类似于自动编码器 KL),在*“conditioning_embedding_num_channels=[64, 128, 128, 256]”中定义。由于我们的条件图像是一个具有单通道的 FLAIR 图像,我们还需要在“conditioning_embedding_in_channels=1”*中指定其输入通道数。

在初始化我们的网络后,我们像训练扩散模型一样训练它。在以下代码片段中(以及代码的这一部分),我们可以看到,首先我们将条件 FLAIR 图像传递到可训练的网络中,并从其跳过连接中获得输出。然后,这些值在计算预测噪声时输入到扩散模型中。在内部,扩散模型将 ControlNets 的跳过连接与自身的跳过连接相加,然后将其输入到解码器部分中(代码)。

 # Training Loop
...

images = batch["t1w"].to(device)
cond = batch["flair"].to(device)

...

noise = torch.randn_like(latent_representation).to(device)
noisy_z = scheduler.add_noise(
    original_samples=latent_representation, noise=noise, timesteps=timesteps
)

# Compute trainable part
down_block_res_samples, mid_block_res_sample = controlnet(
    x=noisy_z, timesteps=timesteps, context=prompt_embeds, controlnet_cond=cond
)

# Using controlnet outputs to control diffusion model behaviour
noise_pred = diffusion_model(
    x=noisy_z,
    timesteps=timesteps,
    context=prompt_embeds,
    down_block_additional_residuals=down_block_res_samples,
    mid_block_additional_residual=mid_block_res_sample,
)

# Then compute diffusion model loss as usual
...

ControlNet 采样与评估

在训练模型后,我们可以对其进行采样和评估。这里,我们使用测试集中的 FLAIR 图像生成条件 T1w 图像。类似于我们的训练,采样过程与扩散模型使用的非常接近,唯一的区别是我们将条件图像传递给训练好的 ControlNet,并使用其输出在每个采样时间步中馈送给扩散模型。正如我们从下图中观察到的那样,我们生成的图像在空间上高度忠实于原始条件,大脑皮层回旋遵循类似的形状,并且图像保持了不同组织之间的边界。

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

测试集中用于输入到 ControlNet 的原始 FLAIR 图像(左)、生成的 T1 加权图像(中)和原始 T1 加权图像,即期望输出(右)的示例。

在我们对模型的图像进行采样后,我们可以量化我们 ControlNet 在不同对比度之间翻译图像的性能。由于我们拥有测试集中的期望 T1w 图像,我们还可以检查它们之间的差异,并使用均方绝对误差 (MAE)峰值 信噪比 (PSNR)MS-SSIM计算真实图像与合成图像之间的距离。在我们的测试集中,当执行这个 脚本 时,我们得到了 PSNR=26.2458±1.0092,MAE=0.02632±0.0036 和 MSSIM=0.9526±0.0111。

就这些!ControlNet 提供了对我们扩散模型的不可思议的控制,近期的方法已经扩展了其方法,以结合不同训练的 ControlNets (Multi-ControlNet),在同一模型中处理不同类型的条件 (T2I adapters),甚至基于样式调整模型(使用像 ControlNet 1.1 这样的技术 — 仅供参考)。如果这些方法听起来很有趣,不要忘记关注我,以获取更多类似的指南!😁

想了解更多 MONAI Generative Model 的教程以及我们的功能,请查看我们的 教程页面

注意:除非另有说明,所有图像均由作者提供

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值