通过项目驱动的面试招聘你下一个数据分析炽星
基于项目的面试可成为招聘全能人才的有效策略。以下是如何在您的企业中实施这一策略。
·
关注 发表在 Towards Data Science ·6 min 阅读·2023 年 1 月 6 日
–
用 DALL-E 创作
雇佣一位数据分析师或科学家可能是一种充满焦虑的体验。您如何确保最终雇佣的人既具备技术方面的能力,又能解释业务并传达结果?
一个高度成功的策略是让面试者完成一项回家作业项目。
如果你还没有遇到这种招聘形式,家庭作业(或测试/作业)是一种通过模拟候选人在工作中会遇到的项目来评估其适应性的方式。这是一种在许多技术和非技术职位中广泛使用的招聘策略。
当谈到分析行业时,家庭作业通常涉及给候选人提供一个数据集,并列出他们必须使用数据回答的封闭式和/或开放式问题。这通常还包括候选人通过演示文稿展示他们的发现,并提交任何脚本/代码/文档。
在面试过程中给予候选人家庭作业作为评估的一部分有几个优点,例如:
-
让候选人以更真实和有意义的方式展示他们的技能。
-
筛选出那些没有表现出完成作业所需的毅力的候选人。
-
允许候选人在自己的节奏和环境中工作。这对于那些可能在时间压力或高压环境下表现不佳的候选人尤其有用。
-
让面试官看到候选人如何解决问题,他们的思考过程和对细节的关注。
-
让面试官评估候选人提供高质量工作的能力以及是否能按时完成任务。
家庭作业可以提供比仅仅面对面面试或技能测试更全面和准确的候选人技能和能力评估。在我的招聘经验中,家庭作业——特别是演示文稿——确实帮助我们区分了能够理解我们业务特定数据细微差别的候选人与那些可能有扎实基础但难以分辨噪音和信号的候选人。这确实帮助我们招聘到能够推动业务发展的全能人才。
虽然这是招聘合格数据分析师的有效方法,但创建这样的项目可能会耗时且评估标准不确定。
以下是如何做到这一点。
你希望评估任何潜在分析职位候选人的三个主要标准是:
-
他们工程和建模数据集的能力。
-
他们分析和解释数据的能力。
-
他们沟通发现的能力。
让我们更详细地了解如何构建家庭作业项目并评估提交内容。
1. 评估建模/工程
如何实施
提供 2-3 个独立的数据表供候选人操作和合并。在作业中包含多个表格将帮助候选人展示他们理解如何处理不同粒度和对象来讲述共同故事的能力。
在现实世界中,数据通常包含缺失、错误且缺乏文档。了解你发送的数据存在什么问题,并要求候选人包括他们对数据可能存在“偏差”的观察。我们大多数人需要能够应对的常见数据挑战包括:重复记录、缺失值、次优数据类型。
包括几个有客观正确/错误答案的问题。理想的候选人应能操作数据以回答基本的描述性问题,例如“过去 6 个月发生了多少销售”或“2022 年的平均停留时间是多少?”
让候选人提交他们的代码,以评估其数据建模技术的效率和鲁棒性。
评价标准
-
(5 分) 效率:提供的代码是否构成了一个工程良好的数据模型,该模型高效且避免了不必要的操作?
-
(5 分) 准确性:候选人是否准确地连接和聚合了数据?他们是否充分考虑并解释了任何存在的坏数据?
-
(5 分) 可解释性:数据模型是否已标记和文档化?用户是否能在无需进一步解释的情况下理解数据管道的功能?
2. 评估分析和批判性思维技能
实施方法
确保包括一个候选人可以利用此数据集帮助解决的业务目标。例如,可以决定哪些营销活动有效,哪些客户群体最成问题,或询问可能导致过大损失或低效的原因。
在你的评估中,包含一些问题,以帮助你评估候选人在三种主要分析技术——描述性/探索性、因果性和预测性/推断性方面的推理能力。
-
包括一些问题,以评估候选人探索和描述数据的能力。这些问题可以包括“在数据中,你认为最有趣的数据点是什么?”或“你在数据中发现了什么令人惊讶的东西?”
-
包括一些问题,以帮助候选人展示他们连接因果关系的能力——例如“哪个活动/战术表现最佳”,或“哪个 A/B 变体最成功,为什么?”
-
根据职位的范围,你还可以包括一些问题,帮助你评估候选人通过高级分析进行预测性思考的能力。问题可以包括“在数据上开发和训练预测模型,并使用适当的指标评估其性能。”或“使用特征工程和/或参数调整来提高预测模型的性能。”
评价标准
(5 分) — 候选人是否以准确和有代表性的方式描述了数据?
(5 分) — 候选人是否以合理的方式连接了因果关系?
(5 分) — 候选人是否应用分析技术对数据做出合理的推断或预测?
3. 评估沟通技巧和叙事能力
如何实施
分析只有在别人能理解和使用的情况下才有用,因此数据分析师能够有效沟通他们的发现是很重要的。
要求候选人总结他们的分析并在一个由混合(技术和非技术)观众组成的后续面试中进行展示。观察分析师在向非技术观众解释其思路和模型的技术细节方面的能力。他们是否使用清晰简洁的语言,并能有效回答问题和解决疑虑?
准备一系列问题以深入了解候选人包括/排除展示内容的理由。示例问题包括:
-
“你为什么选择这个特定的可视化方式?”
-
“你是如何决定观察哪些变量的?”
-
“你如何判断预测模型是否适合当前问题?”
-
“如果有更多时间,你会做什么?”
评估标准
(5 分) — 演示是否清晰,候选人是否能够向非技术观众展示技术信息?
(5 分) — 候选人是否能回答关于潜在商业影响或在提供额外商业背景时的观众提问?
(5 分) — 候选人是否能够为展示中的方法提供合理的解释?
结论
希望这篇文章能为你在进行基于项目的面试时提供更多框架。
积分系统以及在项目中强调的技能集可以根据你的具体招聘需求进行调整。你可能需要根据是否寻求倾向于技术或业务方向的人才来调整积分分配,但根据我的经验,培养分析师拥有平衡的技能集会带来更有成就感的职业生涯和更好的成果。
一个常见的问题是给予候选人完成作业的时间长短?重要的是考虑到人们可能会很忙,并根据候选人的个人情况提供灵活性。然而,候选人能够设定日期并坚持完成是很重要的。一般来说,我认为一周应该是一个合理的作业返回时间。
如果你希望获取我在面试中使用的具体模板,请随时通过 Medium 或 LinkedIn 联系我。
祝招聘愉快。
进化多目标优化与耙选择
一种用于良好分布的帕累托前沿近似的方法
·
在Towards Data Science上发布的文章,作者:Oliver Kramer,阅读时间约 5 分钟,发布日期:2023 年 3 月 14 日。
–
图像由 AI 生成。
多目标优化是一个关键的研究领域,在工程、金融和生物学等多个领域具有广泛的应用。它涉及同时优化多个目标,其中目标可能是相互冲突的,不可能在不妥协其他目标的情况下改善一个目标。近年来,许多新方法已经被开发出来,以解决多目标优化问题。在这篇博客文章中,我们介绍了一种名为“rake selection”的新方法,旨在有效解决多目标优化问题。
遗传算法(GA)非常适合多目标优化,因为它们基于解决方案的种群而非单一解决方案运行。这一特性使它们能够探索更大的搜索空间,并捕捉到可以覆盖广泛目标的多样化解决方案。
在典型的遗传算法(GA)中,生成一个潜在解决方案的种群,并根据多个目标评估其适应度。然后,选择最适合的个体进行繁殖,产生新一代解决方案,这些解决方案经过进一步的选择和繁殖,直到找到一个令人满意的解决方案。
在多目标优化中,种群中每个个体的适应度是同时基于多个目标进行评估的。这使得遗传算法能够捕捉到一组在种群中不被任何其他解决方案支配的解决方案,这被称为帕累托最优前沿。
图 1:在一个具有两个目标的最小化问题中,一个解决方案将目标空间划分为四个象限。
如果解空间中的其他任何解决方案都不支配某个解决方案,则该解决方案被称为帕累托最优。图 1 展示了单个解决方案如何将目标空间划分为四个象限。左下象限包含支配考虑中的解决方案的解决方案;所有这些象限中的解决方案在两个目标方面表现更好。右上象限中的解决方案被考虑中的解决方案支配。左上和右下象限包含与考虑中的解决方案不可比拟的解决方案。非支配解的集合包括相对于所有其他解决方案在这些象限中的解决方案。
非支配排序
大多数多目标优化方法,如 NSGA-II、撬棒选择和基于超体积指标的选择,都从非支配排序开始。这个过程涉及根据非支配等级对 GA 的种群进行排序。如果一个解没有被其他解支配,则被认为是非支配的。第一个等级包含所有非支配解,如果这些解被移除,第二个等级由未被剩余解支配的解组成。这个过程持续进行,直到所有解都被排序。图 2 说明了解如何将解排序到不同的等级中,粉色方块代表非支配解,橙色方块代表第二等级的解,灰色方块代表第三等级的解。第一等级的非支配解作为二次选择过程的基础。
图 2:非支配排序根据支配关系为每个解分配一个等级。
撬棒选择
维持目标空间中解的均匀分布的一个有效方法称为撬棒选择。它基于在撬棒基准上正交定位的撬棒,并延伸到非支配解所在的目标空间区域,见图 3。撬棒基准将最优解与单一目标相关联。对于每个撬棒,选择排名为一的解中距离最近的点。如果非支配解过少,还可能考虑来自下一个排名的解。无论目标空间的维度如何,点和线之间的距离都可以高效地计算。
图 3:离撬棒最近的解被选择进入下一代。
形成撬棒基准的最优点可以通过单独优化每个目标来计算,然后使用其余目标的适应度值计算目标空间中的附加坐标点。或者,撬棒基准可以通过使用当前种群中每个目标的最佳解来计算。这种即时计算的撬棒基准可能导致不同的位置。
撬棒方法的有效性在 Pareto 前沿具有线性形状时最为明显。当前沿变得更加弯曲时,撬棒在并行线切割中的效果会降低。然而,可以基于当前非支配解集的形状对撬棒方法进行调整。[2] 提出了类似的机制,通过计算比例来调整每一步的撬棒距离,基于撬棒与选择解之间的连接。这种方法允许在处理形状更复杂的 Pareto 前沿时具有更大的灵活性和有效性。
实验
图 4 展示了在多目标问题 ZDT1 至 ZDT4 上进行 Rake Selection 的实验结果。耙基连接角点,垂线定义了目标空间中的耙。需要注意的是,由于坐标轴的比例不均,这些耙在图中可能不会显得垂直于耙基。
图 4:ZDT 1–4 的耙选择实验(来自[2])。
在 1,000 次迭代后,相当于 50,000 次目标函数评估,解位于耙上和帕累托前沿的曲线上。这表明 Rake Selection 方法在识别非支配解和实现多个目标之间最佳权衡方面的有效性。
结论
总结而言,多目标优化是一个关键的研究领域,具有广泛的应用。遗传算法(GAs)是多目标优化的有效工具,因为它们基于解的种群运作,并能够探索多样的解集,以捕捉多个目标之间的权衡。非支配排序和耙选择是可以有效识别帕累托最优前沿和选择最佳权衡解的技术。实验结果表明,Rake Selection 方法在识别非支配解和实现多个目标之间的最佳权衡方面是有效的。总体而言,多目标优化是一种强大的方法,能够提供对复杂系统的宝贵见解并指导决策过程。
除非另有说明,所有图像均由作者提供。
参考文献
-
K. Deb, S. Agrawal, A. Pratap, 和 T. Meyarivan. 一种快速且精英的多目标遗传算法:NSGA-II. IEEE 进化计算汇刊,6(2):182–197,2002 年。
-
O. Kramer 和 P. Koch. 耙选择:一种新颖的进化多目标优化算法。见于 人工智能进展(KI),页 177–184,2009 年。
1.5 年的 Spark 知识总结为 8 个技巧
我在 Databricks 客户合作中的学习经验
·
关注 发布于 Towards Data Science · 8 分钟阅读 · 2023 年 12 月 24 日
–
图 1:如何编写 Apache Spark 的技术图示。图片由作者提供。
在 Databricks,我帮助大型零售组织部署和扩展数据及机器学习管道。以下是我在实际工作中学到的 8 个最重要的 spark 技巧/窍门。
在本文中,我们假设读者对 Spark 及其结构有一般的工作知识,但本文应对所有层次的读者都适用。
让我们深入探讨一下吧!
0 — 快速回顾
快速回顾一下 Spark 的功能…
Spark 是一个大数据处理引擎。它接受 Python/Java/Scala/R/SQL 并将这些代码转换为一组高度优化的转换操作。
图 2:Spark 驱动程序和工作节点配置。图像作者提供。
在最低层次上,Spark 创建任务,这些任务是 对数据分区的可并行变换。这些任务从驱动节点分配到工作节点,工作节点负责利用它们的 CPU 核心来完成变换。通过将任务分配给可能许多的工作节点,Spark 允许我们进行水平扩展,从而支持在单台机器上不可能实现的复杂数据管道。
好吧,希望这些信息不是全新的。不管怎样,在接下来的部分,我们会慢下来一点。这些提示应该对 Spark 的初学者和中级用户都有帮助。
1 — Spark 就是一个杂货店
Spark 是复杂的。为了帮助你和其他人理解其结构,我们借用 排队理论 中一个非常好的类比:spark 就像是一个杂货店。
当考虑 Spark 的分布式计算组件时,有三个主要组件……
-
数据分区: 我们数据的行子集。在我们的杂货店中,它们是 杂货。
-
Spark 任务: 在数据分区上执行的低级变换。在我们的杂货店中,它们是 顾客。
-
核心: 你处理器中并行工作的部分。在我们的杂货店中,它们是 收银员。
就这样!
现在,让我们利用这些概念来讨论一些 Spark 的基础知识。
图 3:收银员类比的插图,特别是针对数据倾斜。图像作者提供。
如图 3 所示,我们的收银员(核心)一次只能处理一个顾客(任务)。此外,一些顾客有很多杂货(分区行数),如图中收银员 2 处的第一个顾客所示。从这些简单的观察……
-
收银员(核心)越多,你可以并行处理的顾客(任务)就越多。这是 水平/垂直扩展。
-
如果你没有足够的顾客(任务)来充分利用你的收银员(核心),你就会支付收银员的空闲时间。这与 自动扩展、集群大小和分区大小有关。
-
如果顾客(任务)的杂货(分区行数)差异很大,你会看到收银员的利用率不均。这是 数据倾斜。
-
你的收银员(核心)越好,他们处理单个顾客(任务)的速度就越快。这涉及到升级你的处理器。
-
等等。
由于这个类比来源于直接与分布式计算相关的排队理论,它的解释能力非常强!
使用这个类比来调试、沟通和开发 Spark。
2— 将数据一次性收集到内存中
Spark 初学者最常见的错误是误解了延迟计算。
懒惰求值 意味着在调用内存集合之前不会执行任何数据转换。调用集合的方法示例包括但不限于……
-
.collect():将 DataFrame 载入内存作为 Python 列表。
-
.show():打印 DataFrame 的前
n
行。 -
.count():获取 DataFrame 的行数。
-
.first():获取 DataFrame 的第一行。
最常见的错误集合方法是程序中普遍使用 .count()
。每次你调用集合时,所有上游的转换都会从头开始重新计算,因此如果你有 5 次 .count()
调用,你的程序将呈渐近地运行 5 倍时间。
Spark 是懒惰求值的!管道应该有一个从源头到目标的单一流动。
3— 达到服务级别协议后停止
在与大型组织合作时,一个出乎意料的常见问题是他们忽视了大局,从而以低效的方式优化管道。
这是大多数用例中管道优化的方法……
-
问问我们是否需要做这个项目。 简而言之,考虑一下优化管道实际上能带来什么。如果你期望运行时间提高 20%,而管道的运行成本是$100,那么你是否应该投入你极其昂贵的数据工程师的薪资以节省每次运行的$20?也许吧,也许不是。
-
寻找代码中的低悬果实。 在同意做这个项目后,检查代码是否有明显的缺陷。示例包括懒惰求值的误用、不必要的转换和转换顺序不正确。
-
利用计算来使任务在服务级别协议下运行。 在检查代码相对高效后,直接将计算资源投入问题中,以便你可以 1) 达到服务级别协议,并且 2) 从 Spark UI 收集统计数据。
-
停止。 如果你已经充分利用了计算资源,并且成本不算过高,做一些最后的计算改进后就停下来。你的时间是宝贵的。不要浪费时间去节省美元,而是在其他地方创造数千美元。
-
深入挖掘。 最后,如果你真的需要深入挖掘,因为成本不可接受,那么就卷起袖子,优化数据、代码和计算。
这个框架的美妙之处在于,1–4 只需要对 Spark 有基本了解,并且执行非常快速;有时你可以在 30 分钟的电话会议中收集 1–4 的相关信息。该框架还确保我们会在“足够好”时立即停止。最后,如果需要第 5 步,我们可以将其委托给团队中最强的 Spark 专家。
通过找出所有避免过度优化管道的方法,你可以节省宝贵的开发时间。
4—磁盘溢出
磁盘溢出是 Spark 作业运行缓慢的最常见原因。
这是一个非常简单的概念。Spark 设计用于利用内存处理。如果内存不足,Spark 将尝试将额外的数据写入磁盘以防止进程崩溃。这称为磁盘溢出。
图 4:突出显示磁盘溢出的 Spark UI 屏幕截图。图片由作者提供。
写入和读取磁盘速度较慢,因此应尽量避免。如果你想了解如何识别和减轻溢出,请参考这个教程。然而,一些非常常见且简单的方法来减轻溢出是…
-
每个任务处理更少的数据,这可以通过更改分区数量来实现,方法是通过spark.shuffle.partitions或repartition。
-
增加计算中的 RAM 与核心的比率。
如果你希望你的作业运行得更佳,请防止溢出。
5—使用 SQL 语法
无论你使用 Scala、Java、Python、SQL 还是 R,Spark 在底层总是利用相同的转换。因此,选择适合你任务的语言。
对于许多操作,SQL 是支持的 Spark 语言中最简洁的“语言”!更具体地说:
-
如果你在添加或修改列,请使用selectExpr或expr,尤其是与 Python 的f-strings配合使用。
-
如果你需要复杂的 SQL,创建临时视图然后使用spark.sql()。
这里有两个快速示例…
# Column rename and cast with SQL
df = df.selectExpr([f"{c}::int as {c}_abc" for c in df.columns])
# Column rename and cast with native spark
for c in df.columns:
df = df.withColumn(f"{c}_abc", F.col(c).cast("int")).drop(c)
# Window functions with SQL
df.withColumn("running_total", expr(
"sum(value) over (order by id rows between unbounded preceding and current row)"
))
# Window functions with native spark
windowSpec = Window.orderBy("id").rowsBetween(Window.unboundedPreceding, Window.currentRow)
df_with_running_total_native = df.withColumn("running_total", F.sum("value").over(windowSpec))
使用 SQL。
6—全局过滤器
你需要读取存储在复杂目录中的一堆数据文件吗?如果是这样,请使用 Spark 极其强大的读取选项。
我第一次遇到这个问题时,我重写了os.walk以与数据存储在的云提供商一起使用。我非常自豪地向我的项目伙伴展示了这个方法,他只是说,“让我分享我的屏幕,”然后向我介绍了全局过滤器。
# Read all parquet files in the directory (and subdirectories)
df = spark.read.load(
"examples/src/main/resources/dir1",
format="parquet",
pathGlobFilter="*.parquet"
)
当我应用上面显示的 glob 过滤器,而不是我自定义的 os.walk 时,数据摄取操作的速度提高了超过 10 倍。
Spark 有强大的参数。在构建定制实现之前,请检查是否存在所需的功能。
7 — 使用 Reduce 与 DataFrame.Union
循环几乎总是对 spark 性能有害。原因如下…
Spark 有两个核心阶段 — 规划和执行。在规划阶段,spark 创建一个有向无环图(DAG),指示如何执行指定的转换。规划阶段相对昂贵,有时可能需要几秒钟,因此你希望尽可能少地调用它。
让我们讨论一个必须遍历许多 DataFrame、执行昂贵转换,然后将它们追加到表中的用例。
首先,几乎所有的迭代使用案例都得到了本地支持,特别是 pandas UDFs、窗口函数和连接。但如果你确实需要一个循环,下面是如何调用一个单一的规划阶段,从而在一个 DAG 中完成所有变换。
import functools
from pyspark.sql import DataFrame
paths = get_file_paths()
# BAD: For loop
for path in paths:
df = spark.read.load(path)
df = fancy_transformations(df)
df.write.mode("append").saveAsTable("xyz")
# GOOD: functools.reduce
lazily_evaluated_reads = [spark.read.load(path) for path in paths]
lazily_evaluted_transforms = [fancy_transformations(df) for df in lazily_evaluated_reads]
unioned_df = functools.reduce(DataFrame.union, lazily_evaluted_transforms)
unioned_df.write.mode("append").saveAsTable("xyz")
第一个解决方案使用 for 循环遍历路径,进行复杂转换,然后追加到我们感兴趣的 delta 表中。在第二种方法中,我们存储一个惰性计算的 DataFrame 列表,对它们进行转换,然后通过合并进行简化,执行一个 spark 计划并写入。
我们实际上可以通过 Spark UI 看到后端架构的差异…
图 5:for 循环与 functools.reduce 的 spark DAG。图片由作者提供。
在图 5 中,左侧对应于 for 循环的 DAG 将有 10 个阶段。然而,右侧对应于functools.reduce
的 DAG 将只有一个阶段,因此可以更容易地进行并行处理。
对于读取 400 个唯一 delta 表并追加到一个 delta 表的简单用例,这种方法比 for 循环快 6 倍。
创造性地创建一个单一的 spark DAG。
8 — 使用 ChatGPT
这不是关于炒作。
Spark 是一个成熟且有充分文档的软件。LLMs,特别是 GPT-4,擅长将复杂信息提炼成易于理解和简明的解释。自从 GPT-4 发布以来,我没有做过一个复杂的 spark 项目而没有依赖 GPT-4。
图 6:GPT-4 对影响 spark 中数据分区大小的示例输出。图片由作者提供。
然而,显而易见的是,使用 LLMs 时要小心。你发送到封闭源模型的任何内容都可能成为母公司组织的训练数据 — 确保你不发送任何敏感信息。此外,请验证 GPT 的输出是否可靠。
如果使用得当,LLMs 在 spark 学习和开发中具有颠覆性作用。每月$20 是值得的。
10 个数据分析师可能会遇到的常见问题——以及如何回答它们
学习如何应对一些行业数据分析师最常遇到的问题
·
在 Towards Data Science 上发布 ·10 分钟阅读·2023 年 7 月 25 日 关注
–
照片 由 Scott Graham 提供,来源于 Unsplash
在快速变化的数据分析领域,遇到既视感并不罕见,尤其是当你进入新的角色时。你可能会注意到一个反复出现的模式,那就是关于数据和业务的相同问题不断浮现。
但请相信,这不是偶然的。
在不同的组织、行业和部门之间,出现了显著的相似性。尽管它们提供的产品、服务和商业模式各异,但组织对从数据中获得的见解有着共同的渴望。
作为数据分析师,理解和解决有关你业务的基本问题对你的有效性至关重要。通过将你的报告和分析框架置于核心业务问题的背景下,你可以引发与管理层和决策者更深入的讨论。
通过这篇文章,我旨在为你提供应对这些重复出现的问题所需的知识和见解。通过准备好解决这 10 个基本问题,你将增强你的分析能力,并在组织中确立自己作为不可或缺的资产。
下面是你可能会被问到的问题。
💸财务与销售
产品收入与基准相比如何?
组织通常想知道他们的财务状况是否达到了年度目标。这虽然最常见于财务数据分析师的报告中,但大多数分析师都应该做好回答这类问题的准备。
当我处理财务规划与分析报告时,组织通常会为财政年度设定一系列目标/配额基准。这些基准会以月度和累计总额的形式提供。它会类似于以下内容:
我们希望 X 产品线每月带来$100,000 的收入。这意味着它在第一个月应带来 100,000,在第二个月带来 200,000……
为了解决这个问题,作为数据分析师,你的角色将涉及将各种数据源,如 CRM 系统或由高层领导设定的外部清单,与账单系统结果连接起来。通过合并这些来源,你可以识别出收入的盈余或赤字,并为任何偏离预期目标的情况提供有意义的解释。你的分析将揭示造成赤字的潜在因素,使管理层能够做出明智的决策。
这种类型的报告不仅展示了你处理财务数据的能力,还展示了你在连接和解释来自不同来源的信息方面的分析技能。通过有效地弥合财务目标与实际结果之间的差距,你使决策者能够全面了解组织的财务表现。
我们预期收入将如何增长或收缩?
预测收入增长或收缩的趋势是领导者希望解决的关键问题。作为数据分析师,你可以在提供有关未来收入趋势的知情预测方面发挥关键作用,通常是在月度和季度基础上。让我们探讨一些你作为数据分析师或财务团队成员可以实施的技术,以有效解决这个问题:
-
时间序列预测模型 — 该模型使用统计技术根据历史数据预测日期轴上的值。可以使用多种技术来执行时间序列模型,详细内容过于繁琐,此处不作详述 — 请参阅我提供的链接以获取更多信息。
-
利用销售管道 — 常见的财务报告是“实际 vs 预测”报告。例如,“3 X 9”表示我们展示了 3 个月的实际数据与 9 个月的预测数据。预测元素将利用 CRM 中的开放数据,并计算在财年结束前的成交可能性百分比。
-
手动输入 — 在某些团队中,销售领导希望能够审查管道中的内容,并挑选出哪些销售机会将会成交、成交时间以及预计价值,作为最终审查。虽然这种方法仍然有效,但依赖于个人的判断,无法程序化精简。这通常涉及接收一个需要纳入时间序列汇总的数值电子表格。
通过准确预测收入的增长或收缩,组织可以主动分配资源,设定实际目标,并识别潜在的绩效差距。掌握这些信息,领导者可以做出与预算编制、投资、招聘和运营规划相关的关键决策。收入预测使领导者能够评估组织的财务健康状况,评估销售和营销策略的有效性,并做出调整以确保可持续增长。最终,收入预测使领导者能够应对不确定性,降低风险,并引导组织走向长期成功。
特定销售渠道的有效性如何?
销售和财务领导希望能够查看不同收入来源的情况。一些可能的问题包括:
-
哪些销售渠道随着时间的推移在增长和缩减?
-
哪些产品在特定渠道上表现最佳,这反映了我们客户的什么信息?
销售渠道本身指的是组织可以获取收入的不同方式。销售渠道的数量在不同的组织中会有所不同,因为这还取决于其商业模式。一个典型的销售渠道集可能如下所示:
-
直接销售 — 使用销售团队与客户达成交易并将其记录在如 Salesforce 等 CRM 系统中。
-
电子商务 — 客户直接在组织的网站上购买产品。
-
企业合作伙伴关系 — 组织可以与其他公司合作销售其产品或服务。这可能包括形成战略联盟、合资企业或附属合作伙伴关系,以扩展其覆盖范围并利用合作伙伴的客户基础。
由于直接销售在大多数组织中占据重要部分,我发现这种类型的渠道报告最为突出。销售团队通常会实施某些销售举措,在特定时间段内推广特定产品线。这通常会引发一个仪表盘的创建,用于显示这些举措的进展情况,我们如何达到整体目标,以及每个销售代表的表现情况。预计这种类型的报告会受到最严格的审查,因为它很可能作为销售佣金的参考……
🎯竞争分析
我们拥有的市场份额百分比是多少?
对组织来说,了解他们在竞争对手中的位置是重要的。例如,领导层需要掌握以下内容:
-
按客户支出和单位数量,总市场规模是多少?
-
按产品类别?按地区?我们的组织在市场规模中占有多少百分比?
这可以通过多种方式在各个行业中进行跟踪。我们可以以新闻媒体行业为例。该领域的组织希望了解每天在所有新闻网站上有多少总访客,以及这些访客中有多少在每个网站上。像Comscore这样的供应商提供一系列工具,允许分析团队评估竞争格局,并查看主要网站的独特页面浏览量。
👤客户报告
客户保留:客户流失和续订率?
领导者想了解他们如何扩展客户基础。这意味着提供在给定时间点的汇总总数,同时了解典型客户的流失率。如果有客户在 x 个月后停止使用你的服务的模式,那么原因是什么?这对客户生命周期的故事有什么启示?
理解客户保留率和流失的可能性,使领导者能够调整路径或为销售团队提供挽救可能流失客户的能力。当团队掌握流失报告时,他们将对客户流失的原因有深入了解,并会制定标准化流程以保持客户的账单状态。
客户细分:我们的典型客户类型有哪些?
映射一系列客户档案是向产品和销售领导者提供的强大分析。这使团队能够根据最相关的客户群体(在 B2C 中)或最相关的组织类型(在 B2B 中)来量身定制服务。
这是一个典型的机器学习问题,使用 K-Means 聚类模型,这是一种无监督模型,根据一系列输入将记录分组到一定数量的不同组中。执行客户细分模型是一个独立的主题 —— Ceren Iyim 写了一篇关于这个主题的优秀文章,名为Customer Segmentation with Machine Learning**。
📱产品与市场营销
我们的产品/服务哪些功能使用最多,哪些功能使用最少?
拥有数字产品的组织不断监测用户最常使用的功能。理解用户的“点击路径”背后的模式使得 Instagram 和 TikTok 等产品能够如此引人入胜和互动(有人可能会说这些服务在这一领域过于有效,但那是另一篇文章…)。当产品团队能够理解产品中的哪些功能有效、哪些无效时,他们可以构建对用户更具影响力的功能,这最终会提高客户留存率。
这也适用于那些不是围绕数字产品建立的组织——包括服务、零售和酒店业。数据可能通过客户调查的不同形式进行收集。领导者仍然可以从直接的客户反馈中获得有价值的发现,甚至从客户交易历史中获得洞察。亚马逊客户评论就是一个很好的例子——分析团队可以发展出对产品的一般情感,并报告评论中最常出现的关键词。
我们的在线品牌互动(网站/社交媒体)是什么?
公司希望对其品牌认知有一个清晰的把握。因此,创建了数字营销活动来吸引对其组织的关注和参与,这最终成为销售工具。不足为奇的是,客户更可能购买他们熟悉和信任的品牌产品。
因此,数据分析师可以被指派负责报告社交媒体互动或网站分析数据。在这种情况下,你可能需要回答如下问题:
-
我们的帖子获得了多少印象、互动和分享?这些数据随时间如何变化?
-
哪些页面或帖子表现得比其他的更好?
当领导者能够回答这些问题时,他们可以将品牌互动策略调整为最有效的内容,从而最终增加浏览量和认知度。
我们的客户满意度是多少?
与品牌互动类似,领导者也需要了解客户对你的产品和品牌的总体情感。团队可以参考多个数据点来推测总体满意度,包括以下内容:
-
使用开源或付费 API 提取的组织社交媒体账户上的评论、推文和帖子。
-
客户满意度调查
从客户满意度中获得的洞察将能够描述客户认为哪些方面做得好与哪些方面存在最大痛点的更大趋势,从而对他们的产品和服务产生积极影响。以下是一些相关的示例:
-
Apple 和 iPhone:客户反馈在新 iPhone 型号的推出中发挥了重要作用。Apple 通过调查、用户测试和客户服务互动积极寻求客户意见。有关电池寿命、相机质量、软件功能和设计偏好的反馈影响了 Apple 在随后的 iPhone 发布中对这些方面的改进决策。
-
Netflix 和离线观看:响应客户反馈,Netflix 引入了离线下载内容的选项。许多用户请求这一功能,尤其是在互联网连接有限的情况下。Netflix 听取了客户的偏好,并引入了下载功能,提高了客户满意度,扩展了服务的便利性。
🚚供应链优化
我们的操作流程中存在哪些低效之处?
对于提供实物产品的组织而言,了解从订单到履行过程中存在的痛点对于提升整体服务质量和扩大订单量至关重要。运营领导者总是寻找减少交付时间的方法。一种常见的衡量方法是周期时间分析,这是一种时间序列报告,用于了解每个过程环节需要多长时间。例如,履行过程可能如下所示:
-
客户下订单。
-
订单在订单处理系统中接收。
-
运营团队审核订单并向制造商请求所需材料。
-
根据生产订单生产货物。
-
材料被打包并装载到配送车辆上。
-
产品正在运送到客户处。
-
订单交付给客户。
在此过程中,我们会为每个步骤分配一个时间值,并生成一个仪表板,汇总所有订单的每个步骤的平均值/中位数长度,并根据筛选条件(按产品线、在某个日期范围内、客户位置等)进行过滤。
改善操作流程的另一种方法是通过错误率监控,这是设计用来捕捉异常、操作错误或对标准化流程的例外的报告。例如,为什么订单在某一步骤失败? 或 哪些客户订单场景在流程中没有考虑到,从而导致了手动操作? 一旦这些问题得到解答,领导者就可以采取措施来解决它们或减少它们的发生频率。
结论
本文提供了各种组织性问题。一时间掌握所有这些问题可能会让人感到不堪重负。所以这里有一个建议:专注于我之前提到的业务领域中的一个。深入了解该领域,明白管理层对它提出了哪些问题。在我担任过的几乎所有分析角色中,那些在其领域内成为专家的数据分析师也是最受认可的。
虽然这个列表并未完全涵盖每个组织的报告需求,但它应为你提供一个关于需要在高层次上提出哪些问题的一般框架。在任何角色中,你的工作与最终收益(收入)的关联越紧密,你作为员工的不可替代性就越强。作为数据分析师时,当你对我所讨论的这些问题有深入理解时,你在角色中的有效性更高,并能提供可操作的结果。
提升检索增强生成系统性能的 10 种方法
从原型到生产的工具
·
关注 发表在 Towards Data Science ·9 分钟阅读·2023 年 9 月 18 日
–
快速入门指南并不够
“检索增强生成是补充用户对大型语言模型(LLM)如 ChatGPT 的输入,加入你(系统)从其他地方检索到的额外信息的过程。LLM 然后可以利用这些信息来增强它所生成的响应。” — Cory Zue
LLMs 是一个了不起的发明,但存在一个关键问题。它们会编造内容。RAG 通过为 LLMs 提供事实背景,使其在回答查询时更有用。
使用 LangChain 或 LlamaIndex 等框架的快速入门指南,任何人都可以用大约五行代码构建一个简单的 RAG 系统,比如一个文档聊天机器人。
不过,用那五行代码构建的机器人效果不会很好。RAG 易于原型设计,但很难投入生产——即达到用户满意的程度。一个基础教程可能使 RAG 达到 80% 的效果,但弥补剩下的 20% 通常需要一些认真的实验。最佳实践尚未确定,并且可能因使用场景而异。但是,弄清楚最佳实践是非常值得我们花时间的,因为 RAG 可能是使用 LLMs 的最有效方式。
本文将探讨提高 RAG 系统质量的策略。它专为那些使用 RAG 构建系统、希望弥补基础设置与生产级性能之间差距的读者量身定制。就本文而言,提高意味着增加系统处理的查询比例,其中系统:1. 查找适当的上下文 2. 生成适当的响应。我将假设读者已经理解 RAG 的工作原理。如果没有,我建议阅读 这篇文章 作为一个很好的介绍。还假设读者对用于构建这些工具的常见框架有一些基本了解:LangChain 和 LlamaIndex。然而,本文讨论的思想与框架无关。
我不会深入探讨每种策略的具体实施细节,而是会尝试给出何时以及为何它可能有用的想法。鉴于这一领域的快速发展,提供一个详尽或完全最新的最佳实践清单是不可能的。相反,我旨在概述一些你在尝试改进检索增强生成应用程序时可以考虑和尝试的内容。
提高检索增强生成性能的 10 种方法
1. 清理你的数据。
RAG 将 LLM 的能力连接到你的数据上。如果你的数据在实质上或布局上令人困惑,那么你的系统将会受挫。如果你使用的数据包含冲突或冗余的信息,你的检索将难以找到正确的上下文。当它找到时,LLM 执行的生成步骤可能会不尽如人意。假设你正在为你的创业公司帮助文档构建一个聊天机器人,你发现它的效果不好。你首先应该查看的是你输入系统的数据。主题是否按逻辑分解?主题是否集中在一个地方还是多个分开的位置?如果你作为一个人,不能轻松判断需要查看哪个文档来回答常见问题,你的检索系统也无法做到。
这个过程可以像手动合并同一主题的文档一样简单,但你可以更进一步。我见过的一个更具创意的方法是使用 LLM 创建所有提供的文档的摘要。检索步骤可以首先在这些摘要上进行搜索,仅在必要时才深入详细信息。一些框架甚至将其作为内置抽象。
2. 探索不同的索引类型。
索引是 LlamaIndex 和 LangChain 的核心支柱。它是承载检索系统的对象。RAG 的标准方法涉及嵌入和相似性搜索。将上下文数据分块,嵌入所有内容,当有查询时,从上下文中找到相似的部分。这种方法效果很好,但并非所有用例的最佳方法。查询是否与特定项目有关,例如电子商务商店中的产品?你可能需要探索基于关键词的搜索。它不一定是非此即彼,许多应用程序使用混合方法。例如,你可以对特定产品的查询使用基于关键词的索引,但对一般客户支持则依赖嵌入。
3. 尝试不同的分块方法。
分块上下文数据是构建 RAG 系统的核心部分。框架抽象了分块过程,让你无需考虑。但你应该考虑。分块大小很重要。你应该探索哪种方式最适合你的应用程序。一般来说,更小的块通常会改善检索,但可能会导致生成缺乏周围上下文。有很多方法可以处理分块。唯一不适用的是盲目处理。这篇来自 PineCone 的文章列出了一些策略。我有一组测试问题。我通过运行实验来处理这些问题。我用小、中、大块大小循环了一遍,发现小块效果最好。
4. 玩转你的基础提示。
在 LlamaIndex 中使用的一个基础提示的例子是:
“上下文信息如下。根据上下文信息而非先前知识,回答查询。”
你可以覆盖这个设置并尝试其他选项。你甚至可以破解 RAG,使其在找不到好的答案时允许 LLM 依赖自己的知识。你还可以调整提示来帮助引导它接受的查询类型,例如,指示它对主观问题以某种方式回应。至少,覆盖提示是有帮助的,这样 LLM 可以了解自己正在做的工作。例如:
“你是一个客户支持代表。你旨在尽可能提供有用的信息,同时只提供事实信息。你应该友好,但不要过于多话。上下文信息如下。根据上下文信息而非先前知识,回答查询。”
5. 尝试元数据过滤。
提高检索效果的一个非常有效的策略是为你的块添加元数据,然后利用它来帮助处理结果。日期是一个常见的元数据标签,因为它允许你进行按时间过滤。假设你正在构建一个允许用户查询其电子邮件历史的应用程序。较新的电子邮件可能会更相关。但从嵌入角度来看,我们不能确定它们与用户查询的相似性最高。这提出了一个在构建 RAG 时需要记住的普遍概念:相似性 ≠ 相关性。你可以将每封电子邮件的日期附加到其元数据中,然后在检索时优先考虑最新的上下文。LlamaIndex 有一个内置的 Node Post-Processors 类,专门帮助处理这个问题。
6. 使用查询路由。
通常拥有多个索引是很有用的。然后在查询到达时,将它们路由到适当的索引。例如,你可能会有一个处理总结性问题的索引,一个处理指向性问题的索引,还有一个适用于与日期相关的问题的索引。如果你尝试优化一个索引以应对所有这些行为,你会发现它在所有这些行为上的表现都将有所折中。相反,你可以将查询路由到合适的索引。另一种用例是将一些查询定向到基于关键词的索引,如第二部分所述。
一旦你构建了你的索引,你只需要在文本中定义每个索引的用途。然后在查询时,LLM 将选择合适的选项。LlamaIndex 和 LangChain 都提供了这样的工具。
7. 关注重新排名。
重新排名是解决相似性与相关性之间差异问题的一种方法。通过重新排名,你的检索系统会像往常一样获取顶级节点作为上下文。然后它会根据相关性对这些节点进行重新排序。Cohere Rereanker通常用于此策略。这是我看到专家们经常推荐的策略。无论用例是什么,如果你在使用 RAG,你应该尝试重新排名,看看它是否能改善你的系统。LangChain 和 LlamaIndex 都提供了简化设置的抽象。
8. 考虑查询转换。
你已经通过将用户的查询放入基本提示中来改变用户的查询。进一步改变它可能是有意义的。这里有几个例子:
重新表述:如果你的系统没有找到查询的相关上下文,你可以让 LLM 重新表述查询并再次尝试。对人类来说看似相同的两个问题,在嵌入空间中不总是看起来那么相似。
HyDE: HyDE是一种策略,它会获取一个查询,生成一个假设响应,然后使用这两者进行嵌入查找。研究发现,这可以显著提高性能。
子查询:LLM 在处理复杂查询时通常表现更好。你可以将这种功能集成到你的 RAG 系统中,以便将查询分解为多个问题。
LLamaIndex 有关于这些类型的 查询转换 的文档。
9. 微调你的嵌入模型。
基于嵌入的相似性是 RAG 的标准检索机制。你的数据被分解并嵌入到索引中。当查询到来时,它也会被嵌入以便与索引中的嵌入进行比较。但是,是什么在进行嵌入呢?通常是一个预训练模型,如 OpenAI 的 text-embedding-ada-002。
问题在于,预训练模型对嵌入空间中的相似性的理解可能与你实际上下文中的相似性不太一致。假设你在处理法律文件。你希望你的嵌入模型更多地依据你的领域特定术语,如“知识产权”或“合同违约”,而不是像“特此”和“协议”这样的通用术语。
你可以微调你的嵌入模型来解决这个问题。这样做可以提升你的检索指标 5%–10%。这需要更多的努力,但可以显著改善你的检索性能。这个过程比你想象的要简单,LlamaIndex 可以帮助你生成训练集。有关更多信息,你可以查看 Jerry Liu 关于 LlamaIndex 如何进行嵌入微调的 这篇文章,或 这篇文章,其中详细介绍了微调的过程。
10. 开始使用 LLM 开发工具。
你可能已经在使用 LlamaIndex 或 LangChain 来构建你的系统。这两个框架都有有用的调试工具,允许你定义回调,查看使用了什么上下文,检索来自哪个文档等等。
如果你发现这些框架内置的工具不够完善,那么有一个不断扩展的工具生态系统可以帮助你深入了解你的 RAG 系统的内部工作。Arize AI 提供了一个 notebook 内工具,允许你探索上下文是如何被检索的以及为什么。 Rivet 是一个提供可视化界面的工具,帮助你构建复杂的代理。它刚刚由法律科技公司 Ironclad 开源。新工具不断推出,值得尝试看看哪些工具对你的工作流程有帮助。
结论
使用 RAG 构建系统可能令人沮丧,因为它很容易上手,但要做到完美却非常困难。我希望以上策略能为你提供一些灵感,帮助你弥合这一差距。这些想法中的任何一个都不是全能的,整个过程充满了实验、尝试和错误。我在这篇文章中没有深入探讨评估,即如何衡量系统的性能。目前,评估更像是一门艺术而非科学,但设立某种可以持续检查的系统是很重要的。这是判断你所实施的变化是否有效的唯一方法。我之前写过关于如何评估 RAG系统的文章。欲了解更多信息,你可以探索LlamaIndex Evals、LangChain Evals和一个非常有前景的新框架,RAGAS。
10 位女性分享在 IT 和数据领域的工作经验
·
关注 发表在 数据科学前沿 ·9 分钟阅读·2023 年 3 月 9 日
–
IT 行业仍然被认为是男性主导的领域,还是时代在慢慢变化?我们采访了来自欧洲不同国家的女性 IT 专业人士,了解她们在 IT 或数据相关工作的经验。
照片由 Mimi Thian 提供,来源于 Unsplash
为什么技术行业中的从业者是更多女性还是男性很重要?如今,技术招聘人员经常试图确保 IT 和数据团队的多样性,以确保 10 名软件工程师或数据分析师组成的团队不会提出相同的 10 个解决方案。
尽管有这些努力,根据麦肯锡的研究,在欧洲只有 22%的技术岗位由女性担任。考虑到女性在 STEM 学科的低入学率,这并不令人感到特别惊讶。此外,根据欧洲统计局的数据,女性在高等教育中 STEM 学科的毕业率正在下降。
因此,我邀请了 10 位具有不同 IT 领域经验的女性 IT 专业人士分享她们在技术行业的亮点和挑战,以帮助年轻女孩决定是否想尝试 IT 职业。(更多关于受访女性的细节可以在本文末尾找到。)
问题 1: 你认为女性在 IT/数据领域或任何人从事这个领域工作的最大优势是什么?
图片由Christina @ wocintechchat.com拍摄,来源于Unsplash
玛利亚: 我会从 IT/数据从业者的角度来回答这个问题。因为我认为这些优势与性别无关。IT 或数据相关的工作需求非常高。这给了你选择的机会,对我来说这也意味着力量。
你不必急于得到任何东西,你可以选择最适合你的工作。其他一些优势是能够在任何地方工作,因为你只需要一台笔记本电脑和 Wi-Fi。高薪是当前对这些角色需求旺盛的另一个结果。此外,我非常喜欢挑战和解决问题的可能性,但我认为这更多是个人感受。
雅雅: 优势包括各种工作机会、体面的薪资以及在一个动态环境中工作,在这里你总是能学到新东西。这也非常灵活,你可以很容易地转换领域。
比安卡: 最大的优势是持续学习和自我发展、环境、薪资和其他福利。
尽管来自葡萄牙的数据工程师玛利亚、在法国工作的摩洛哥软件工程师雅雅,以及来自罗马尼亚的软件测试员比安卡提到高薪是技术行业的一个优势,但这只是部分正确。
IT 和数据领域的薪资通常高于大多数其他部门,但基于经济活动的性别薪酬差距在欧盟 ICT 部门中仍然是第二高。来自 Eurostat 的数据 显示,2020 年未经调整的性别薪酬差距为 13%,而金融和保险服务领域为 26.4%,信息和通信(ICT)紧随其后,为 19.4%的性别薪酬差距。
Swati:一般来说;在家工作、灵活的工作时间(如果项目允许的话),而且不需要太多的体力劳动。
Nadia:有很多优势;高薪资、成长机会、灵活的时间表:我不必在 9 点开始一天或在 6 点结束。我每周的会议相对较少,我可以根据自己的喜好安排剩余的时间。
另外,跨国移动的可能性:我去年搬到了法国,我不会说法语,但这并不影响我的工作,因为一切都用英语讨论。而且,工作的性质当然也是不受国家限制的。
正如 Swati Bhoi 和 Nadia Chirkova 所提到的,她们都在法国工作,尽管她们来自不同的原籍国(印度和俄罗斯),但远程工作的可能性是一个特别的好处,特别是在 IT 领域。根据来自 Coresignal 的分析,IT 和服务在 2021 年在欧洲的远程职位中占据了最高比例,为 22.1%。
Darya:社区和网络。尽管女性在 IT 领域仍然代表性不足,女性创建了许多支持小组,你可以在这些小组中结识志同道合的人。有专门针对女性的活动(如HerHackathon)或女性专属的专业项目(如BreakLine)。社区支持和欢迎。
Sylvie:作为自由职业者,自主安排工作时间的可能性。另外,该领域的良好薪资使我们能够获得独立。对我来说,作为女性是一个优势,因为多样化团队的需求使女性更容易找到工作,而且女性在电脑前被贴上极客标签的可能性较小。
Andreea:总体而言,能够在一个非常创新的领域工作在技术和社会发展的过程中变得越来越重要。
Catherine:对我来说,这是一个女性配额和学习成长的机会。
尽管一些公司努力聘用更多女性担任某些技术岗位,但女性在技术快速增长的角色中的代表性仍然很低。
虽然 46%的欧洲 UX 设计师是女性,但在软件工程和架构职能中,女性仅占 19%。此外,云解决方案架构师仅有 10%是女性,Python 开发者中只有 13%是女性,而这些职位在就业市场上需求极高。
图片来源:Humphrey Muleba 于 Unsplash
特雷莎:女性在 IT/数据领域工作的最大优势,或者说任何人在这个领域工作的最大优势,就是工作的创造性。这些项目和挑战种类繁多,提供了持续学习和成长的机会。此外,工作的性质允许在时间和空间上有很大的灵活性。
只需一台笔记本电脑、网络连接,和可能的一杯好咖啡,我就可以在任何地方工作,无论是在家里、咖啡店,还是在我们位于布拉格市中心的美丽办公室。这种灵活性使我能够追求职业生涯,同时还能照顾我的两个儿子(陪伴大儿子去柔道课,或在周五午餐后接小儿子放学)。
我真正喜欢在 IT 行业工作的原因是女性可以获得的支持和社区。有许多旨在支持和赋能女性的倡议(比如Czechitas或PyLadies),社区也非常强大和热情。
问题 2:你认为女性在 IT/数据领域工作,或者一般在这个领域工作的人面临的最大挑战是什么?
图片来源:LinkedIn Sales Solutions 于 Unsplash
凯瑟琳:我认为在 IT 或数据世界中,男性的声音更容易被听到。
Swati:从我的女性视角来看,当你提出解决方案时,可能面临被不够重视的风险,有时薪水较低,还需要更具说服力来证明自己的价值。
Aya:我认为最大的挑战之一是打破这是男性领域的刻板印象,证明我们同样有能力和聪明。这迫使我们在工作中加倍努力,以使我们的技能得到认可。
Maria:一个常见的挑战是需要不断学习。你必须投入大量精力来学习和提升你的编程/分析技能。但他们没告诉你的是,如果你想要成功,你必须不断进行这项工作。总是有新的东西,新的更好的东西,你必须跟上 IT 及其市场的速度。
作为女性,我不得不承认,相较于我的男性同事,我觉得自己必须比男性客户证明自己多一倍或三倍才能被认真对待。不止一次,他们的问题被直接问向电话中的男性,即使我在主导讨论。这也引发了“我够好吗?”、“我只是填补了一个名额吗?”的疑问,你开始怀疑自己并感觉像个冒名顶替者。
面试的女性共同关心的问题是,相比男性同行,IT 领域的女性工作者需要证明自己,这可能也是2022 年所有科技裁员中有 69.2%是女性的原因之一。这个数据来自于WomenTech Network 的研究。
Bianca:最大挑战是技术迅速变化以及客户需求模糊且经常不完整。
Sylvie:我认为在 IT 领域对女性没有什么特别的要求,除了我每月一次的生理期让我感到困扰。我在同事中感到受尊重。
Andreea:总体而言,跟上技术进步,以及向不同的参与者展示数据素养和数据民主的重要性,当数据基础设施尚未到位时。
Darya:这绝对是冒名顶替综合症。我遇到了许多背景、经验和职业水平各异的了不起的女性,她们时不时感受到“自己不够好”的感觉。IT 领域广阔且变化迅速,所以不可能了解所有的东西。
此外,这个领域竞争激烈,因此人们常常会相互比较。这一切都造成了一种不擅长编程、数据、演讲等的错觉。总有某人做得更好。所以在我看来,成功往往取决于个人,是否能够勇敢地开始只与过去的自己进行比较。
虽然白俄罗斯数据科学家 Darya Petrashka 提到的冒名顶替综合症在 IT 和数据领域由于技术快速变化而相当常见,但女性往往会更多地遭遇这一综合症。
正如网站 womenintech.co.uk/ 所指出的:“女性常常感到自己不属于这里,不如男性同行技艺高超。同样,来自少数群体的员工可能会因为相同的原因而体验到类似的感觉。”
Nadia:最大的挑战是保持知识的最新:你使用的框架可能会频繁变化,或者出现新的工具。但通常有许多以友好和全面的方式编写的教程或博客,所以这并不难。在我的领域,这一点更为强烈,因为除了工具之外,你还必须跟上科学文献。相关的文章每天都在发布。但这也是一种乐趣,因为阅读所有这些文章令人兴奋和鼓舞。
另一个挑战是较低的身体活动水平和大量的屏幕时间,对健康有非常负面的影响。你必须通过其他活动如散步或运动来弥补这一点。我个人在没有特殊的蓝光阻挡眼镜的情况下无法看屏幕,因为我的眼睛很快就会感到疲劳。
Tereza:我觉得最近变化很大,但仍然存在的最大挑战之一是克服我们内心的刻板印象。当我考虑大学选项时,我最初倾向于更多传统的女性专业,比如语言和经济学。我没有考虑 IT 行业的职业。
然而,在发现了专注于女性 IT 教育的组织之后,我意识到我的真正热情在于编程和数据分析。总结一下——保持开放的心态,接受所有可能性,并且永远不要停止学习和探索。
受访的 IT 或数据专业人士:
Catherine,是一名拥有 1-2 年经验的 BI 分析师,来自英国,远程为位于伦敦的客户工作。
Bianca,是一名拥有 2 年经验的测试工程师,来自罗马尼亚,工作地点在罗马尼亚的雅西。
Sylvie,是一名数据分析师和教师(自由职业者),拥有 7 年经验,来自法国,在法国格勒诺布尔工作。
Swati,是一名拥有 4 年以上经验的 IT 顾问,来自印度,在法国巴黎工作。
Darya,是一名拥有 3.5 年经验的数据科学家,来自白俄罗斯,远程在波兰工作。
Tereza,是一名数据分析经理,拥有 8 年经验,来自捷克,在捷克布拉格工作。
Andreea,是一名面向客户的数据科学家,拥有 6 年经验,来自法国,在法国里昂工作。
Maria,是一名拥有 2 年经验的数据工程师,来自葡萄牙,远程为位于伦敦和捷克布拉格的客户工作。
Nadia,是一名计算机科学领域的研究科学家,拥有 5 年经验,来自俄罗斯,在法国格勒诺布尔工作。
Aya,是一名拥有 1 年经验的软件工程师,来自摩洛哥,在法国格勒诺布尔工作。
声明:部分名字已根据受访女性的要求进行了更改。
TDS23-MEM
来源:{url}
学习-DBT-简易方式-7d9f773d25ea?source=collection_archive---------6-----------------------
2023 年十大令人困惑的 XGBoost 超参数及其调优技巧.md
10 个决策树比 1 个更好-719406680564.md
10 个示例学习 Python 的 JSON 模块 - 793e62309d64.md
10 个令人兴奋的项目创意,使用大型语言模型(LLMs)来丰富你的作品集-970b7ab4cf9e.md
10 个最常见却令人困惑的机器学习模型名称-e70595eef514.md
10 个最常被问的 Python 列表问题在 Stack Overflow 上的链接。
2023 年提高数据科学技能的 10 个简单方法-af274dc513da.md
10 个关于 Julia 的知识点,我希望早知道的-3104ce7e3a2c.md
未来十年将塑造数据科学家角色的 10 个趋势-759cdda3a442.md
10 个提高 Pinns 的实用提示和技巧-1a5dd7b86001.md
10 种向 Pandas 数据框中添加列的方法-ccadf7306d89.md
11 个帮助我获得第一个数据科学职位的实用技巧-be5d2036d49.md
11 个你可能忽视的有用 Pandas 功能点 - 原文链接
12 个用于数据科学的思维模型-f2e2133d85ea.md
12 个 Python 装饰器,助力你的代码提升到新水平-a910a1ab3e99.md
像专业人士一样测试你的预测的 12 种方法
2023 年你需要了解的 13 个数据流行词-87d8d908e5b6.md
130 毫升技巧和资源,经过精心策划,历时 3 年,并附赠免费电子书 7832ca4a37ef.md
14 种让你的 Pandas 工作流飞快的技巧-b00ff0ac9267.md
16、8 和 4 位浮点格式 - 它是如何工作的?
python-mocking-in-production-1924953c8a14?source=collection_archive---------12-----------------------
2 个最佳 SQL 技巧,用于查找表中的重复值-1197618dcc74.md
2 种有效的方式将数据从本地迁移到云端-b3c3b03837f0.md
2023 年你需要知道的 2 个重要 SQL CASE WHEN
示例-cb5d50e59daa.md
2 个简单步骤减少 Pandas DataFrame 的内存使用 - b654565d654.md
2 个任务提升你的 Python 数据处理技能-3daf6c1c0528.md
20 个令人惊叹的 Julia 技巧和窍门,帮助高效程序员-5fedbfd00f73.md
20 个示例,掌握 Python Pandas 中数据框的合并技巧-22ffcd6059d1.md
2023 年回顾:总结后 ChatGPT 时代以及对 2024 年的展望-bb4357a4e827.md
8 个大多数数据科学课程没有教授但你应该知道的内容(第一部分)- 812e691c9430?source=collection_archive---------1-----------------------
2d-矩阵-变换-计算机-视觉-80b4a4f2120f.md
3 个常见的时间序列建模错误你应该知道的-a126df24256f.md
3 种提升大型语言模型的简单方法-68670fde9ffa.md
3 个简单技巧优化 Pandas DataFrames-b8bdbd50253.md
比较两个 Pandas DataFrames 的三种简单方法
3-easy-ways-to-include-interactive-maps-in-a-streamlit-app-b49f6a22a636.md
你应该了解的 3 个 PostgreSQL 基本函数-b2a96e301ac0.md
3 门免费课程以跟上最新的 ChatGPT 趋势
3 种有效使用 ChatGPT 和 GPT-4 进行更好编码的方法-7fb94e86be3e.md
3 个重要的 SQL 优化技术-d6da3e9c8442.md
3 种智能方式利用 ChatGPT 加速你的下一个数据科学项目-8c3e1c5aea18.md
3 个初级数据科学家应做的职业决策-728b20991120.md
3 个关于 Python 数据结构的必知概念-641e6f6207fc.md
3 个强大的 Python 库,帮助部分自动化 EDA,并让你开始你的数据项目。
3-powerful-tricks-to-work-with-date-time-data-in-python-67c2d3834338.md
3 个关于 astype
和 to_datetime
在 Pandas 中的实际区别 fe2c0bfc7678.md
2023 年数据科学作品集需要的 3 个项目-56623fc18c31.md
你希望翻译的是文件名吗?请确认。
3-python-用于高效解决特定数据处理任务的操作-551c8ed41c02.md
3 种快速简单的方法来使用 Pandas 可视化你的数据-4cac57fb4c82.md
3 个提升编程的快速技巧-760e06afd0c6.md
你应该注意的 3 个静默的 Pandas 错误 - 80d0112de6b5.md
3 种简单而强大的方式,这种 AI 技术将彻底改变数据管理。
3 种简单方法在 Python 中创建瀑布图-1124f7afc90f.md
3 个可能削弱你 SQL 查询性能的微妙错误-47e897688977.md
3 种季节性及其检测方法-4e03f548d167.md
3 个使用 Matplotlib 创建的独特图表,你可能之前没有见过的-421ab8cdd36f.md
3-使用 SQL 的 CASE WHEN 语句的场景-51e8e2829218.md
3 个处理日期时间数据的实用 Pandas 提示-424afbec628b.md
3 种在 Python 中使用 Altair 构建地理地图的方法-77c8e0781538.md
3 种方法将 matplotlib 图表嵌入 HTML 页面 - 8e11fa66a4b0.md
在非数据科学岗位上积累数据科学经验的三种方法 - 在非数据科学岗位上积累数据科学经验的三种方法
扩散模型:它们是如何扩散的?
理解生成式人工智能背后的核心过程
·发表于 Towards Data Science ·7 分钟阅读·2023 年 11 月 4 日
–
扩散模型
机器学习中的“扩散模型”这一名称来源于统计学中扩散过程的概念。
那是什么统计概念?
在自然科学中,扩散是粒子从高浓度区域扩散到低浓度区域的过程,这一过程常通过物理学和数学中的扩散方程来描述。
反应-扩散是一个很好的例子。
卡尔·西姆斯的珊瑚生长模拟
反应-扩散
反应-扩散是一个相当复杂的过程;如果你想阅读数学逻辑,你可以访问扩散模型大师卡尔·西姆斯的网站:
格雷-斯科特反应-扩散模型的插图教程。
让我们从一个简单的类比开始:
反应-扩散系统是一种描述事物如何变化和移动的方式,尤其是当你谈论化学物质时。想象你在纸上有几种不同的颜料,它们开始混合并创造出新颜色——这就像是“反应”部分。颜料的斑点不仅停留在一个地方;它们会扩散并混合——这种扩散就像是“扩散”部分。
所以,这些系统只是一组规则,它们告诉我们这些过程是如何发生的:化学物质如何相互反应形成新物质,以及它们是如何移动或扩散的。
这可以描述自然界中的许多不同事物,例如动物皮肤上的图案是如何形成的,污染是如何在环境中扩散的,以及许多其他同时发生反应和移动的情况!
反应-扩散算法在生成吸引人且实用的图案方面非常高效 — 图像由作者提供。
为什么这有用?
嗯,你可以用它们设计鞋子! 😉
New Balance Two WXY 系列具有反应-扩散图案 — 这不是我的设计,但计算设计团队在 2018 年向办公室的设计师们介绍了 RD — www.newbalance.com
嗯,这只是一个应用案例 —
反应-扩散系统可以通过数学公式进行描述和模拟,这有助于我们理解扩散事件。
这些公式主要解释了一个或多个化学物质如何随时间变化并在空间中移动。
这涉及到化学反应,其中化学物质可以转变为其他化学物质,以及扩散,即使这些化学物质在一个区域内扩散的过程。
AI 和机器学习中的扩散模型
在生成式 AI 领域,扩散模型以一种有些类似的方式工作,通过建模向数据中逐步添加噪声的过程,然后学习逆转这一过程。
然而,重要的是不要将反应-扩散生成的图案与机器学习系统中添加到图像的噪声混淆!
扩散模型接收一个信号(例如图像),并逐渐添加噪声,直到原始信号完全被遮蔽。再次强调,添加的噪声不需要有特定的形状(与反应-扩散生成的美丽图案相对!)
这在概念上类似于物质通过介质扩散的物理过程。
扩散模型的训练涉及学习逆过程:从一个有噪声的信号开始,逐渐去除噪声,以恢复原始信号。
这个过程让人联想到物理学中逆转扩散过程,其中粒子的位置从平衡状态(完全扩散)追溯到原始状态(浓缩)。
因此,"扩散模型"这一名称捕捉了从噪声到干净、有序信号的逆过程的本质,这是机器学习生成模型中的核心。
我见过很多解释扩散模型的图示,但要么我迷失在其中,要么它们被过于简化,以便阐明实际过程。
我还想为设计师开发一个自定义图示:这些人懂得伪代码和流程图,但不一定了解其中的数学(当然也有例外):
图示展示了扩散过程 — 由作者绘制
这个图示既不特别详细也不完全简化。我希望复杂度能“刚刚好”,使更多的人能够理解扩散过程。
在这个图示中,我感到有必要解释 UNET 和随后的“添加噪声”节点,因为它们构成了扩散过程中的“魔法”。
我们开始吧 —
UNET
UNET 是一种用于快速而精确图像分割的卷积网络架构。
结果发现,它最初是为了生物医学图像分割开发的。
UNET 的名称来源于其 U 形架构!
在“UNET”名称的由来中,我猜想可能有一些视觉传达元素在发挥作用!在我提供一个更民主化的 UNET 描述(我也能理解的 (!))之前,这里是我在 Medium 上找到的更逐行的技术描述(做得好!):
UNet 逐行解释
示例 UNet 实现
towardsdatascience.com
UNET 在其他应用中变得流行,如地理信息系统(GIS)。在这方面,分割技术可以帮助从航空或卫星数据中划定海岸线,实现精确的沿海制图。同样,它也可以用于识别和提取大型结构的轮廓,如摩天大楼或工业综合体,从高分辨率图像中提取。
因此,UNET 的应用逐渐扩展到其原始应用之外的各种图像到图像的翻译任务,包括图像去噪、超分辨率,最后进入生成模型如稳定扩散。
在稳定扩散模型的训练中,这包括从文本描述生成图像(文本到图像)或将一张图像转化为另一张具有某些风格变化的图像(图像到图像),UNet 发挥了重要作用。以下是其使用的简化说明:
1. 编码器-解码器结构
可以把 UNET 想象成一台有两个主要部分的机器。第一部分是“编码器”,它像一台紧凑的相机,聚焦于图像中最重要的部分,并将其拆分成更小的部分——这样更易于处理。第二部分是“解码器”,它像一位艺术家,接过紧凑的版本后,重新绘制出包含所有细节的完整图像。
2. 跳跃连接
通常,当你将某物缩小(如在编码器中),你会丢失一些细节(显而易见!)。但 UNET 有一个巧妙的技巧:它使用“跳跃连接”,这些快捷方式允许它记住并恢复在图像变小时可能丢失的细节。这有助于“艺术家”部分确保最终图像与原始图像一样详细。
3. 潜在空间操作
想象图像在编码器中的压缩版本作为一种蛋糕的食谱,我们称之为“潜在空间”。这个食谱包括了制作蛋糕所需的所有原料和步骤。在稳定扩散中,你可以改变这个食谱来改变最终的蛋糕。想把香草蛋糕变成巧克力蛋糕?你调整食谱——这就像调整“潜在空间”。你不是从头开始;你只是对原料(或图像特征)做一些小的调整,以得到不同但相关的结果(这可以帮助我们猜测自定义训练的提示)。如果基本食谱是草图,那么添加的风味和装饰就是绘画中的颜色和纹理。
4. 使用噪声进行训练
想象一下在暴风雨中开车。一开始,雨水猛烈地拍打在你的挡风玻璃上,让你难以看清前方的路。然而,雨刷会擦去水滴,给你短暂的清晰视野。训练 UNET 处理噪声就像是在提升雨刷的效果。起初,它们可能有缺陷,每次擦拭视野依然模糊。但随着你“训练”雨刷——调整其速度并确保它们与玻璃的接触正确——它们在清除雨水方面变得更有效。同样,U-Net 开始时试图穿透图像上的“雨”噪声。随着时间的推移,它在清除噪声方面变得更好,直到它能稳定地提供清晰的“视图”——就像有效的雨刷最终给你清晰的道路视野一样——可能不是最好的比喻,但你明白了……
如果你不喜欢这样的比喻,这里有一个更直接的描述:
添加和去除噪声
· 从一张干净的输入图像开始,引入噪声,将其转变为带噪声的图像。
· 在训练过程中将带噪声的图像输入 UNET,这是一种去噪自动编码器。
· 训练 UNET 预测并识别添加到图像中的特定噪声。
· 通过迭代训练,提高 U-Net 准确预测噪声的能力。
· 随着 UNET 技能的提升,它在从噪声数据中生成清晰图像方面变得更为娴熟。
· 利用 UNET 的噪声处理和操作能力来增强扩散过程,该过程系统地添加和去除噪声以制作新图像。
这种逐渐扩散的过程是产生高质量合成图像所必需的,已经在互联网上和我们的日常生活中广泛存在——但像 Midjourney、Stable Diffusion、Dall-E 等 AI 驱动的图像生成模型的令人印象深刻的结果是无可否认的。
就这样。读完这些内容后,希望你对扩散模型有更清晰的理解。
了解作者
想了解更多或联系我?这里是我的 LinkedIn 和 YouTube 账号。我还会在我的 Instagram 账号上分享生动的图像和新闻。
参考资料
[## U-net 是如何工作的? | ArcGIS Python API
ArcGIS Python API 文档。
developers.arcgis.com](https://developers.arcgis.com/python/guide/how-unet-works/?source=post_page-----5ac0fcb4426f--------------------------------) ## 卷积神经网络解析
让我们一起构建你的第一个 CNN 模型
towardsdatascience.com
探索 Linux 容器中叠加文件系统的力量
towardsdatascience.com/exploring-the-power-of-overlay-file-systems-in-linux-containers-d846724ec06d
通过独特而简单的分层思路释放容器化的潜力
·发布于 Towards Data Science ·7 min read·2023 年 2 月 1 日
–
本系列文章探讨了 Linux 容器如何在幕后工作,以及我们需要什么工具来构建类似的环境而无需 Docker。为什么要这样做?好吧,如果你真的想知道当你执行 docker run
时发生了什么,这是你需要迈出的第一步。最后两篇文章集中在命名空间和控制组(groups)在容器化中的作用。
## 容器:它们如何在幕后工作以及为什么它们正在主导数据科学世界
初学者理解 Docker 神奇的指南
使用 Linux 控制组优化容器资源分配
The Power of Linux Cgroups: How Containers Take Control of Their Resources
本文完成了对这一主题的讨论,引入了叠加文件系统,这是创建类似容器环境所需的最后一个构建块,无需依赖 Docker。
Linux 容器彻底改变了现代计算中应用程序的部署和管理方式。此技术的核心是叠加文件系统,这是一个关键组件,使容器能够共享一个共同的基础镜像,同时保持每个容器之间的隔离。
在接下来的段落中,我们将深入探讨叠加文件系统的概念及其在使 Linux 容器轻量、高效和安全方面的作用。无论你是经验丰富的系统管理员还是刚开始探索容器的新人,本文都提供了叠加文件系统的全面概述及其对容器化世界的影响。
学习速率是一个针对那些对 MLOps 世界感兴趣的人的新闻简报。MLOps 是一个广泛的领域,致力于以高效和可重复的方式将 ML 模型投入生产。容器在管道中扮演了关键角色。如果你想了解更多类似的主题,可以在 这里 订阅。你会在每个月的最后一个星期六收到我的更新和对最新 MLOps 新闻和文章的看法!
设置场景
Linux 容器已成为现代计算的一个重要组成部分,提供了一种高效和灵活的方式来打包和部署应用程序。与传统虚拟机不同,容器允许多个隔离的应用程序在单个主机上运行,共享主机的操作系统内核。这种架构提供了诸多好处,包括提高效率、可扩展性和可移植性。
容器已经存在了十多年,首个容器化技术出现于 2000 年代初。然而,直到 2013 年 Docker 的出现,容器才真正起飞,成为现代应用程序部署的基石。
然而,为了充分理解底层发生的情况,我们退一步,假设 Docker 不存在,尝试自己创建一个类似容器的环境。虽然这个努力不会给我们一个生产就绪的解决方案,我们仍然会缺少一些东西,但它将使我们更好地理解容器是如何工作的。
为此,本文探讨了叠加文件系统。叠加文件系统是一种联合文件系统,允许多个下层堆叠在一起,创建数据的统一视图。在 Linux 容器的背景下,叠加文件系统用于将容器所做的更改层叠在基础镜像之上,同时保持原始镜像的完整。这允许容器共享一个共同的基础镜像,并减少需要传输、存储和部署的镜像的大小。
如果这个解释听起来令人困惑,让我们自己创建一个 overlay 文件系统。它比你想象的要简单。
一个简单的例子
要构建 overlay 文件系统,我们需要两样东西:i)一个下层和 ii)一个上层。简单来说,我们需要两个目录。为了清楚地说明它们的角色,我们将第一个命名为lower
,第二个命名为upper
:
mkdir lower upper
接下来,让我们进入lower
目录并创建三个文件。我们将第一个文件命名为delete-me.txt
,第二个命名为duplicate.txt
,最后一个命名为lower.txt
。可以在文件中放入任何内容,但请确保明确说明这是一个存在于lower
目录中的文件。例如,在duplicate.txt
中我们可以写:
I'm a duplicate file in the lower directory.
lower
目录 — 作者提供的图片
在upper
目录中,我们还将创建一个duplicate.txt
文件和一个upper.txt
文件。你可以根据自己的需要填充这些文件的内容,但请确保明确说明这些文件存在于upper
目录中。
upper
目录 — 作者提供的图片
现在,我们准备创建一个 overlay 文件系统,它将把两个目录叠加在一起,并呈现数据的统一视图。为此,我们需要两个更多的目录,一个名为merged
,另一个名为workdir
。这些目录与lower
和upper
目录处于同一层级。
mkdir merged workdir
我们的工作环境 — 作者提供的图片
创建 overlay 文件系统的命令如下:
sudo mount -t overlay -o lowerdir=lower/,upperdir=upper/,workdir=workdir none merged/
让我们一步一步地解读这个过程。首先,你说你想挂载一个类型为overlay
的新文件系统。你指定了lower
、upper
和workdir
目录。你将源设置为none
,因为没有包含数据的底层设备。相反,数据来自lower
和upper
目录。最后,你说你想将其挂载到merged
目录中。workdir
目录是系统保存所需元数据的特殊位置。我们不会触碰这个目录。
如果你现在列出merged
目录中的文件,你会看到lower
和upper
目录的统一视图。lower
目录中的lower.txt
和delete-me.txt
文件都在其中,而upper
目录中的upper.txt
和duplicate.txt
文件也在其中。正如你现在可以安全地猜测的那样,lower
和upper
目录中具有相同名称的任何文件都将来自upper
目录。
合并目录 — 作者提供的图片
此外,lower
目录是只读的。你在merged
目录中所做的任何更改不会影响它。相反,一切都将记录在upper
目录中。
例如,如果你删除了delete-me.txt
文件,系统将在upper
目录中放置一个字符设备,其名称相同,次要和主要数字为零。这告诉系统该文件已被删除,你将在merged
目录中看不到它:
删除文件 — 作者图像
如果你在lower
目录中浏览,你会发现delete-me.txt
文件仍在你留下的位置:
下层目录是只读的 — 作者图像
另一方面,如果你更改了lower.txt
文件的内容,系统将执行写时复制操作。这意味着,当你保存对lower.txt
文件的更改时,它将把文件复制到upper
目录,并在其中保留这些更改。你可以自行检查每个目录中的lower.txt
文件的内容。
这就是覆盖文件系统的精髓;你有一个保持不变的下层目录,而一个位于其上方的目录记录所有的更改。这就是在容器中如何保持基础镜像的文件系统不变,并拥有记录你对容器所做更改的层。
结论
总之,覆盖文件系统在 Linux 容器的成功中扮演着至关重要的角色,它使得应用程序的高效、安全和隔离部署成为可能。覆盖文件系统允许容器共享一个共同的基础镜像,同时保持每个容器相互隔离,从而减少镜像的大小并提高容器生态系统的整体性能。
在本文中,我们探讨了覆盖文件系统的基础知识及其对容器化生态系统的影响。现在,我们准备继续前进,创建一个不使用 Docker 的类似容器的环境。我将在下一篇文章中见到你。
关于作者
我的名字是Dimitris Poulopoulos,我是一名在Arrikto工作的机器学习工程师。我为欧洲委员会、Eurostat、IMF、欧洲中央银行、OECD 和 IKEA 等主要客户设计和实施了人工智能和软件解决方案。
如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据操作的文章,可以在Medium、LinkedIn或 Twitter 上的@james2pl关注我。
表达的意见完全是我个人的观点,并不代表我雇主的观点或意见。
最佳 ChatGPT 插件
译文:
towardsdatascience.com/the-best-chatgpt-plugins-96ea60ccf5f8
网页浏览、总结、编码等
·发布于 Towards Data Science ·8 分钟阅读·2023 年 5 月 25 日
–
就在几天前,OpenAI 通过向所有 ChatGPT Plus 用户推出网页浏览和插件进行了令人兴奋的更新。我认为现在是深入探讨一些我觉得有用的插件,并讨论它们在网页浏览、总结、编码等方面的应用的好时机。
⭐ 1. 网页浏览
至少有三种工具可以用于网页浏览:
-
OpenAI 的官方 Bing 搜索
-
KeyMate.AI 搜索
-
WebPilot
这三个工具在处理基本问题时表现很好。不过,我想找一个例子,展示语言模型和网页浏览工具需要几个步骤才能找到答案。这里是我想出的需要三步网页搜索的问题:
“谁接替了伍迪·约翰逊成为美国驻英国大使?她在那位总统的任期内服务过?此外,这位总统目前的年龄是多少?”
令人惊讶的是,这三个工具都答错了这个问题。最终的答案可能还可以,但中间的答案是错误的。
1.1 Bing 搜索(全新)
微软刚刚宣布将 Bing 作为默认搜索体验带入 ChatGPT。当我今晚写这篇博客文章时,我注意到我已经在 ChatGPT 上获得了 Bing 搜索的访问权限!
Bing 搜索使用了正确的搜索词,但返回了错误的答案。简·哈特利是现任美国大使,而不是伍迪·约翰逊的继任者。
对这个工具,我有一些喜欢和不喜欢的地方:
✅ Bing 搜索:我喜欢我们知道确切的搜索词,并且可以点击搜索词查看搜索结果。
✅ 思考:看起来 OpenAI 给了 LLMs 在每一步中考虑该做什么的机会。
✅ 引用:我真的很喜欢答案中的引用。
❎ 我希望能更清楚地看到内部发生了什么。也许有方法可以做到这一点,但我找不到。如果有人知道,请告知。
❎ 我们不能将 Bing 搜索与其他插件一起使用。将 Bing 的搜索能力与插件功能结合会更强大。我猜现在的替代方案是使用像 WebPilot 这样的搜索插件与其他插件互动。
1.2 OpenAI 之前的官方网页浏览(已替换为 Bing 搜索)
OpenAI 之前的网页浏览可以通过三个步骤正确回答这个问题:
1.3 KeyMate.AI 搜索
嗯,这个工具给出了各种错误答案。它甚至没有返回一个合法的大使。而且,看步骤时,它浏览了太多文档,不清楚它使用了哪个文档来得出最终答案。
1.4 WebPilot
WebPilot 是一个开源工具。你可以在这里找到它的 Github 仓库。WebPilot 没能找到谁接替了 Woody Johnson。正确的答案应该是 Yael Lempert,而不是现任大使 Jane D. Hartley。
✅ 我喜欢它提供了内部的情况:网页链接、链接内容以及语言模型应如何响应的规则。
✅ WebPilot 还可以以指定的语气回答问题、翻译、重写等。
⭐ 2. 网页总结
上述所有工具也可以用于总结网页:
2.1 OpenAI 官方网页浏览
2.2 KeyMate.AI 搜索
2.3 WebPilot
2.4 链接阅读器
链接阅读器工具旨在读取各种链接的内容,包括网页、PDF、PPT、图片、Word 文档及其他文档。
⭐ 3. 视频总结
3.1: VoxScript
VoxScript 在总结 YouTube 视频方面非常有用。我实际上发现这个工具对我最为有用。
3.2 ChatWithVideo
ChatWithVideo 在总结视频方面也表现不错。我发现当我询问有关视频的问题时,所需时间较长。
3.3 VideoInsights
我似乎对 VideoInsights 运气不佳。
⭐ 4. 编码
Noteable
我无法相信只有一个 ChatGPT 编程插件,那就是 Noteable。他们确实抓住了机会展示和推广他们的产品。虽然我之前没有机会使用 Noteable,但由于它是唯一的编程相关插件,我不得不尝试一下,结果令人印象深刻。
这是我使用的提示词(来源):
加载此数据:
media.githubusercontent.com/media/MuseumofModernArt/collection/master/Artists.csv
我是美国一家主要艺术博物馆的协调员。我正在考虑在来年展示哪些藏品。请创建并执行一个笔记本,以分析上述数据,并提供图表和图形,以及趋势和异常的描述,讲述 MoMA 的艺术家在性别、国籍和历史时期上是否得到代表。请记住,我没有数据分析经验,所以请在笔记本中包含解释你所做工作的文本,并说明为什么这些工作很重要,以便易于理解。
Noteable 插件能够指导我创建一个新项目,并使用我创建的新项目:
结果是一个完整的报告,包括数据清洗、可视化和洞察!哇!如果你仔细观察,会发现有两个地方代码未运行并返回了错误信息。Noteable 能够重新运行并修复这些错误:
“似乎发生了一个错误,因为‘artists’变量未定义。这可能是由于内核重启,导致所有变量被清除。我们需要重新运行数据加载和缺失值处理的单元格。”
关于 Noteable 插件的更多想法:
✅ 我喜欢生成报告的简便性,用户界面也很棒。我没有期待一个完整的报告,那真是一个惊喜。我还发现了更多的示例,包括各种建模和可视化样式。
❎ 每次运行的时间比我想象的要长,而且每次得到的结果都不同。我希望它能更快,并生成更一致的结果。但这其实不是 Noteable 的问题,而是使用 OpenAI 模型的一个问题。生成的所有内容都是概率性的,没有保证每次都能得到相同的结果。
⭐ 5. 我最喜欢的 ChatGPT 插件
你最喜欢的 ChatGPT 插件是什么?你能猜到我最喜欢的是哪个吗?一定是 Comic Finder 插件。
你可以组合使用最多三个插件。例如,WebPilot 能够回答谁是英国首相,而 Comic Finder 找到了一些与政治相关的漫画。输出的信息很有价值,澄清了这些漫画虽然没有直接提到英国首相,但与政治领域相关。非常聪明!
⭐ 其他工具
-
Wolfram Alpha:毫无疑问,Wolfram Alpha 是最可靠的 ChatGPT 插件之一。它提供了强大的计算能力、精准的数学功能、精心整理的知识、实时数据和可视化工具。
-
Zapier:凭借跨越超过 5,000 个应用程序集成的自动化任务能力,Zapier 是一个非常实用的插件,可以简化你的工作流程。
-
PDF 互动:有很多插件可以与 PDF 文件互动。例如,之前提到的 Link Reader 插件与 PDF 文件配合得很好。此外,AskYourPDF 和 ChatWithPDF 等插件在这方面提供了更多功能。
-
与金融相关的插件:值得注意的是,针对金融相关任务的插件非常丰富,特别是在获取市场数据和见解方面。
🤔 我对 ChatGPT 插件的投诉:
-
用户界面: 用户界面还有改进的空间。虽然只有 128 个插件,但已经感到有些令人不知所措。如果能有一个搜索栏以便于查找特定插件,以及一些插件的描述缺乏有用的细节,那会更好。
-
插件的可信度: 我对插件的可信度不太确定。我唯一信任的插件是 Wolfram 插件,因为它由著名的 Wolfram Alpha 开发。然而,对于其他插件,我不确定背后的开发者,也没有时间去调查每一个。如果插件能够像应用商店的应用程序一样托管,提供链接、演示和评分,那将有助于提高透明度。
-
与网页浏览的兼容性: 目前,官方的网页浏览插件无法与其他插件一起使用。如果能够与其他插件无缝配合,那将会很有帮助。
-
插件使用的限制: 只能同时使用三个插件可能会令人沮丧。如果语言模型本身可以决定使用哪些已安装的插件,而不是限制用户只能选择三个,那将更为理想。虽然我理解更多插件可能会消耗额外的令牌空间,但如果能有更多插件的选择将会很受欢迎。
-
插件在代码中的集成: 我不确定如何将插件集成到 OpenAI API 中。如果有一个一致且简单的方法在 Python 中与插件互动,那将非常好。
🔮 未来
在微软 Build 大会上公布的最新消息确实将 ChatGPT 插件提升到了一个全新的水平。微软正在建立一个跨平台的 AI 插件生态系统:
开发者现在可以使用一个平台来构建和提交适用于消费者和商业环境的插件,包括 ChatGPT、Bing、Dynamics 365 Copilot、Microsoft 365 Copilot 和 Windows Copilot。
ChatGPT 插件无疑仍处于开发初期。我预期会有大量新插件涌现,赋能和释放 AI 系统的潜力。我期待着探索更多插件并见证未来的进展。
. . .
由Sophia Yang于 2023 年 5 月 24 日发布
Sophia Yang 是一名高级数据科学家。请在LinkedIn、Twitter和YouTube上与我联系,并加入 DS/ML Book Club ❤️
从零开始训练 BERT 的终极指南:最终篇
译文:
towardsdatascience.com/the-ultimate-guide-to-training-bert-from-scratch-final-act-eab78b0657bb
最终前沿:构建和训练你的 BERT 模型
·发表于Towards Data Science·阅读时间 7 分钟·2023 年 12 月 18 日
–
图片来源:Rob Laughter在Unsplash
本博客文章总结了我们关于从零开始训练 BERT 的系列内容。有关背景和完整理解,请参阅系列的第一部分、第二部分和第三部分。
当 BERT 在 2018 年登场时,它在自然语言处理(NLP)领域掀起了一场巨浪。许多人将其视为 NLP 的 ImageNet 时刻,类似于 2012 年深度神经网络对计算机视觉及更广泛的机器学习领域带来的变化。
五年过去了,预言依然准确。基于 Transformer 的大型语言模型(LLMs)不仅仅是新玩具;它们正在重塑整个格局。从改变我们的工作方式到革命性地获取信息,这些模型是无数新兴初创公司背后的核心技术,旨在挖掘它们尚未被充分利用的潜力。
这就是我决定撰写这一系列博客文章的原因,深入探讨 BERT 的世界以及如何从零开始训练自己的模型。重点不仅仅是完成任务——毕竟,你可以轻松找到在 Hugging Face Hub 上预训练的 BERT 模型。真正的魔力在于理解这个突破性模型的内部工作原理,并将这些知识应用于当前环境。
第一篇文章作为你的入门票,引入了 BERT 的核心概念、目标和潜在应用。我们甚至一起完成了微调过程,创建了一个问答系统:
BERT 训练的终极指南:介绍 [## BERT 训练的终极指南:介绍
解密 BERT:改变 NLP 领域的模型的定义和各种应用。
第二部分作为你了解分词器这一经常被忽视领域的内部指南——解释它们的作用,展示它们如何将单词转换为数值,并指导你训练自己的分词器:
BERT 训练的终极指南:分词器 [## BERT 训练的终极指南:分词器
从文本到标记:你的 BERT 分词指南
在第三章中,我们讨论了我认为整个训练流程中最困难的步骤:数据集准备。我们深入探讨了为 BERT 的专用 Masked ML 和 NSP 任务准备数据集的细节,这些任务是它用来理解语言和上下文的代理。
BERT 训练的终极指南:准备数据集 [## BERT 训练的终极指南:准备数据集
数据准备:深入探讨,优化流程,并发现如何应对最关键的步骤
现在,最终的序幕拉开并落下:训练。在这篇文章中,我们将挽起袖子,训练一个新的 BERT 模型——你可以稍后针对特定的 NLP 需求进行微调。如果你已经涉足深度学习模型训练,这篇文章应该能让你毫无问题地跟上。所以,事不宜迟,让我们深入探讨吧!
学习速率是一个面向对 ML 和 MLOps 世界感兴趣的人的通讯。如果你想了解更多类似的主题,请点击这里订阅。每个月的最后一个星期天,我会与你分享最新的 MLOps 新闻和文章的更新和看法!
训练循环
现代框架如 PyTorch 和 TensorFlow 简化了构建和训练深度神经网络的过程。训练循环就像编排,将数据集特征传递通过模型以获得预测,将模型的预测与标签(真实值)进行比较以计算损失,最后使用损失通过模型的层反向传播误差以更新模型的权重。
这就是在 PyTorch 中流程的样子:
for epoch in range(epochs):
# forward pass
predictions = model(features)
# calculate the loss
loss = criterion(predictions, labels)
# propagate the error backward to calculate the gradients
loss.backward()
# update the model's weights
optimizer.step()
# xero gradients
optimizer.zero_grad()
理论上,这看起来很简单,不是吗?实际上,它变得更简单而且更强大。我们将使用 Hugging Face transformers
库来训练我们的 BERT 编码器。Trainer
对象为我们处理循环实现,并添加了许多其他功能。因此,我们可以将注意力转向代码的其他部分。现在,让我们首先定义我们的指标。
在纸面上,这个过程看起来真的很简单,你不觉得吗?现实更好:它不仅简单,而且非常强大,这要归功于像 Hugging Face transformers
库这样的工具。
他们的 Trainer
对象承担了繁重的工作,同时增加了许多额外的功能。因此,我们可以将注意力转向代码的其他部分。
所以,接下来让我们定义我们的指标。
准确率
为了评估我们模型在训练期间的表现,我们需要关注两个关键数字:损失和对我们有意义的指标。损失是像梯度下降这样的算法在反向传播期间用来改进模型性能的,而指标则是更易于理解的东西。
本着简洁的精神,我们将选择一个直接的衡量标准:模型在掩码语言建模(MLM)和下一句预测(NSP)任务上的准确率。实质上,我们关心的是两个方面:我们的模型在填充那些掩码词时的准确度,以及它在识别两句逻辑上是否相互衔接方面的表现。
然而,我们必须说这不是验证我们模型性能的最佳方式。例如,考虑以下句子:
我在数学方面是 [MASK]。
你会如何填充掩码词?我是擅长数学,还是我是糟糕的数学?这两种预测在语境上似乎都有效,但它们完全改变了句子的意思。
因此,用只有一个正确答案的验证数据集来评估模型不是最好的主意。这可能并不能真正测试模型理解语言的能力,而是记忆能力。为了解决这个问题,我们可以计算另一个指标,比如训练后模型的困惑度。
现在,让我们通过从 transformers
库中加载相应模块来评估模型的准确性:
import evaluate
metric = evaluate.load("accuracy")
def preprocess_logits_for_metrics(logits, labels):
mlm_logits = logits[0]
nsp_logits = logits[1]
return mlm_logits.argmax(-1), nsp_logits.argmax(-1)
def compute_metrics(eval_preds):
preds, labels = eval_preds
mlm_preds = preds[0]
nsp_preds = preds[1]
mlm_labels = labels[0]
nsp_labels = labels[1]
mask = mlm_labels != -100
mlm_labels = mlm_labels[mask]
mlm_preds = mlm_preds[mask]
mlm_accuracy = metric.compute(
predictions=mlm_preds, references=mlm_labels)["accuracy"]
nsp_accuracy = metric.compute(
predictions=nsp_preds, references=nsp_labels)["accuracy"]
return {"Masked ML Accuracy": mlm_accuracy, "NSP Accuracy": nsp_accuracy}
训练
假设你在整个教程系列中一直跟随我,现在你正处于一个关键时刻,你已经准备好了数据集。数据科学家中有一句常见的说法:一旦你的数据集为模型雕琢完成,你的大部分工作就差不多完成了。由于深度学习框架的进步,接下来的步骤往往感觉像是简单的模板代码。
所以,带着期待,让我们开始实例化模型吧。
from transformers import BertForPreTraining, BertConfig
model_config = BertConfig()
model = BertForPreTraining(model_config)
现在迎来了高潮:启动训练脚本。首先,我们将定义训练参数,然后,在一切准备就绪后,我们将启动训练循环:
from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(
"bert-pretrained-wikitext-2-raw-v1",
logging_first_step=True,
evaluation_strategy="epoch",
learning_rate=5e-5,
weight_decay=0.01,
push_to_hub=True,
per_device_train_batch_size=16,
per_device_eval_batch_size=32,
fp16=True,
save_strategy="epoch",
num_train_epochs=20
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=nsp_train_dataset,
eval_dataset=nsp_validation_dataset,
data_collator=data_collator,
compute_metrics=compute_metrics,
preprocess_logits_for_metrics=preprocess_logits_for_metrics
)
两小时和 20 个周期后,在有限的 Colab Notebook 环境中,我在 NSP 任务上达到了 80%的准确率,在 Masked ML 任务上达到了 15%的准确率。对于一个从零开始训练的模型来说,这些数字还不错。
训练结果 — 作者提供的图片
然而,值得注意的是,在大多数实际场景中,你的起点并不是从零开始。通常,你会从一个预训练的模型开始,这往往能带来更好的结果。
同时,还有大量的空间进行实验和提升性能。调整训练过程中的超参数,特别是学习率,可以显著提升你的结果,即使你是从头开始构建模型。
结论
我们已经达到了从零开始训练 BERT 模型的最终目的地。在这段旅程中,我们了解了为什么 BERT 被认为是 NLP 领域的开创性模型,并深入探讨了分词器的复杂性,不仅理解了它们的机制,还掌握了训练我们自己分词器的技巧。
接下来,我们的旅程带我们经历了为两个并行运行的任务——NSP 和 Masked ML 任务——准备数据集的细致过程。最终,我们来到了启动训练脚本的关键步骤,使用了transformers
库。
这是一段漫长但充实的旅程,我希望你也喜欢它。你应该准备好将这些知识应用到自己的活动中,并扩展到更多领域。下次见,祝编程愉快!
关于作者
我的名字是 Dimitris Poulopoulos,我是一个为 HPE工作的机器学习工程师。我为欧洲委员会、国际货币基金组织、欧洲中央银行、宜家、Roblox 等主要客户设计和实施了 AI 和软件解决方案。
如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据运维的文章,可以在 Medium、LinkedIn 或在 Twitter 上的 @james2pl 关注我。
所表达的意见仅代表我个人,并不代表我的雇主的观点或意见。
从交叉职能机器学习项目中获得的 20 个经验教训
如何在复杂的跨团队项目中导航,推动及时解决方案,同时不破坏关系
·
关注 发表在 Towards Data Science ·6 分钟阅读·2023 年 8 月 7 日
–
图片由作者使用 SDXL 1.0 生成。
无论你是在领导还是协助跨团队项目,都会感到压力。虽然推动截止日期和管理复杂情况的压力常常有“什么没有杀死你就让你更强”这种说法,但这些情况是可以避免的,并且学习可以在一起完成大项目的有趣环境中发生。
跨团队的工程项目具有挑战性,而机器学习项目则增加了另一层复杂性,合作者通常需要帮助理解技术背后的知识、机器学习在生产中的影响和风险。
在与美国和亚洲公司及创业公司合作的过程中,这些公司具有非常不同的工作伦理、标准和期望,我很幸运地领导并参与了多个大规模的跨团队项目,交付了面向客户的机器学习解决方案。
在这里,我总结了在规划、开发过程、管理文档和沟通方面的经验,以及我从跨团队合作中提炼出的规则。
管理沟通、基础设施和文档
[towardsdatascience.com
规划、截止日期和里程碑
-
当将团队聚集在一起处理某个特性时,准备一页纸总结该特性、说明其必要性的充分理由,并通过来自 A/B 测试/使用分析的数据或上级的请求来证明其优先级。
-
在接触团队时,要记住每个团队都有自己要实现的功能堆栈;如果他们承诺处理某项任务,就需要重新调整任务的优先级。
-
在规划新特性和定义工作范围时,始终首先联系经理。他们了解资源状态,并可以指引合适的人选。始终将经理纳入规划和沟通中;他们可能知道其他项目的相似性。
-
降低成本和提高货币化是团队总是愿意投入资源和时间的两个话题。如果你能将你的要求以这种格式呈现,达成一致将更容易。
-
不同的文化和国家对权力在团队成员之间的分配有着截然不同的看法。虽然只是作为指导,霍夫斯泰德的权力距离指数在多个场合上帮助我们更快速、顺利地达成优先级对齐。
开发过程
-
确定日期 — 制定明确且有依据的截止日期。请团队制定工作范围并提出一个日期。截止日期本身并不总是有帮助,但它们作为团队成员在规划工作时的心理锚点,使工作更加集中。
-
确保您遵循适合当前时刻的开发模式和标准。当为了紧迫的截止日期而推动某些特性时,可能会带来短期思维的成本。确保记录下妥协的地方,并在截止日期后分配时间来完善项目。
-
当面临重大截止日期时,团队会变得更容易管理,人员通常愿意付出额外的努力;在节奏较慢的时期不要总是指望这一点。
-
在计划休假时,安排好交接工作,并在您离开时设定清晰的里程碑。分配职责,并指出您回来后需要处理的范围。
-
设定明确的基准,并报告与基准的结果——这样团队更容易看到进展并提供反馈。
文档
-
在为外部人员准备文档时,确保进行团队级审查,然后请一个不同团队的可信成员阅读文档,以确保对外部人员而言文档清晰,然后再与其他外部成员和高层管理人员分享。
-
记录会议内容,发送跟进邮件、总结并列出负责人员,确保每个人达成一致。
-
在与共同作者分享文档之前,总是要先询问,尤其是当文档尚未完成时。
-
无论是外部还是内部文档,所有文档必须包含 POC、创建日期和最后一次重要更改。
-
使用共享文档进行讨论和对齐。口头协议往往会被误解和遗忘。拥有书面文本来对齐提供了一个起点和一个建设性讨论的锚点。如果您是文档的所有者,请允许第三方留下评论。
沟通
-
确保提供定期报告——这些不仅有助于早期标记问题,还能让您保持责任感。如果问题被足够早地标记出来,管理层将有时间提供资源以协助交付。决策过程中的可见性和透明度也使得批评变得更加容易,从而帮助形成更好的解决方案。
-
高层管理人员没有时间深入了解;但他们会对当前的方向和优先级有更好的了解。当向高层管理人员提供信息或潜在的开发选项时,不要过多深入细节。保持报告简洁明了,多用视觉材料,高层概述和现实世界的类比,早期标记问题,这些都是让管理层满意的要素。
-
在向高层管理人员沟通不同选项时,不要仅仅描述几个选项并要求他们选择一个。最好有一个预设的决定,例如,我们想选择 X,因为它具备 AB 和 C;然而,Y 有 DEF,但从长远来看,这一点不重要。您是否同意我们继续进行 A?
-
沟通时,与其不抄送重要人员,不如多抄送一个不太相关的人。问问自己:“如果我不联系他们,他们会生气吗?”——项目可能因为有人生气而脱轨。
-
与团队成员以及跨团队保持良好关系是至关重要的。保持这种关系的最佳方式是保持关注,并开放接受反馈。主动请求反馈,尤其是负面的 — 发送消息表明你愿意沟通 — 建立信任。潜意识中,人们会注意到问题并在可能爆发之前告诉你。
三种每位博士生免费获得的软技能
这是我在攻读机器学习博士学位期间学到的关于研究、沟通和团队合作的全面技巧和窍门列表…
towardsdatascience.com
摘要
客户和高层管理者不需要问题。他们需要解决方案。这通常是员工和企业主之间的区别 — 员工擅长指出问题,而企业主推动解决方案。
拥有主人心态有助于将人们聚集在一起,建立更具鼓励性的环境。毕竟,当前方有明确的道路时,工作起来要容易得多,而领导者的任务就是定义这条道路。
然而,当争论出现时,当不确定正确决策时,问自己,“对团队和项目来说,什么是最好的?” — 这总是有助于做出正确的决策。
建立项目管理技能的好书包括:
-
《谈判力:如何赢得谈判》 由克里斯·沃斯著 — 用于帮助谈判。
-
《突然掌控:向上管理、向下管理、全面成功》 由罗伯塔·马图森著 — 用于帮助建立与管理层和团队成员的沟通。
-
《激进的坦诚》 由金·斯科特著 — 用于提供诚实且可操作的反馈。
-
《异类:成功的故事》 由马尔科姆·格拉德威尔著 — 用于在挑战性情境中建立正确的态度。
-
《部落领导力》 由戴夫·洛根著 — 用于在团队中建立正确的文化。
如果你喜欢这篇文章,请与朋友分享!要阅读更多关于机器学习和图像处理的主题,请按下订阅按钮!
喜欢这位作者吗?保持联系!
我是否遗漏了什么?请随时留言、评论或直接在 LinkedIn 或 Twitter 上给我发消息!
机器学习面试的准备指南和资源。
towardsdatascience.com ## 我希望在攻读机器学习博士学位前掌握的九种工具
无论你是创建初创公司还是取得科学突破,这些工具都能提升你的机器学习流程。
本博客中的观点仅代表我个人,不代表 Snap 的观点。
寻找机器学习团队候选人时应关注的 20 种软技能
·
关注 发表在 Towards Data Science ·9 分钟阅读·2023 年 2 月 16 日
–
尽管教育、技能和经验提供了技术基础,并且对一个有能力的机器学习(ML)团队至关重要,但只有当结合了正确的软技能时,团队才会变得强大和成功。
图像阅读机器人 ML 生成自 creator.nightcafe.studio
教育、技能和经验是一个合格的机器学习专家的重要特质。拥有数学、计算机科学、自然科学和统计学的坚实教育背景,为理解驱动机器学习模型的基础理论和算法提供了强有力的基础。此外,通过动手实践各种编程语言、库和工具来获得实际技能,对于实现和部署成功的机器学习解决方案至关重要。[R1, R2]
然而,正确的软技能组合可以将一支有能力的机器学习专家团队转变为成功的团队。这些技能补充了技术技能。[R3] 软技能是个人属性和能力。在机器学习领域,软技能尤为重要,因为它们使专家能够有效地与利益相关者、客户和其他团队成员合作,以确保解决了正确的问题,开发和部署了正确的解决方案。
准备好提升你的团队吧!在接下来的 20 点中,我将分享我对这些能力的个人见解。所以,让我们深入探讨,发现如何发掘我们自己和团队的最佳表现!
阅读机器人的图像由 openAI 的 dall-e 生成
-
有目的地工作:明确活动的目的很重要。对目标有清晰的认识可以使工作保持一致。在机器学习项目中,很容易从一个有趣的分析跳到另一个。风险在于,你可能会在某个地方结束,却没有找到解决实际问题的方案。有目的地工作可以帮助开发有意义的解决方案。[R4]
-
有纪律和专注地工作:自律工作是成功的主要因素。自律使你能够纠正过去的行为而不重复错误。它使得培养良好的工作习惯并保持足够的质量标准成为可能。[R5] 在现代工作环境中,干扰无处不在。专注于特定的目标并保持全神贯注,可以在有限的时间内获得高质量的结果。[R6]
-
智力严谨性和灵活性:在开发机器学习解决方案时,明确基本假设、应用逻辑严谨的推理并得出结论很重要。同时,保持心理灵活性以重新审视假设和结论也同样重要,如果结果看起来可疑的话。根据我的经验,机器学习生成的结果如果看起来好得不真实,往往并非如此。
-
时间管理:找到专注工作的时间是困难的。团队可以引入专门的时间用于集中工作,但这只能在每个团队成员充分利用可用时间时才能实现集中工作。时间管理的另一个方面是能够持续工作,设定明确的优先级,以管理项目和团队之间的相互依赖,并按时完成任务。记住:你永远无法完成所有想做的事情,所以一定要优先排序![R7, R8]
-
跨文化能力:ML 专家可能来自不同的教育背景、国籍和年龄群体。每个团队成员都能够处理文化差异非常重要。例如,在我们的团队中,主要使用英语,但对我们大多数人来说,英语是外语。重要的是要仔细倾听并提出问题,直到双方都确认达成了共同的理解。
-
终身学习的态度:ML 领域广泛,团队的要求和期望也多种多样。对领域特定主题以及与之相关的内容有深厚的学习态度,加上对其他解决有趣问题领域的广泛兴趣,可以成为解决问题的丰富灵感来源。这种基本态度可以为团队快速熟悉新项目中的主题条件奠定基础。顺便说一下,午餐讨论也会变得更加有趣![R9]
-
挫折容忍度:在开发 ML 解决方案时,实验和测试未知结果的新方法是日常工作的一部分。ML 专家必须承担进入未知领域所带来的风险。事情不应该出错,但往往会出错,例如数据不足(数量、信息内容、质量)、算法可能无法收敛等等。团队需要能够在问题变得困难时坚持下去,能够应对挫折并继续前进。第一次、第二次或第三次都不会总是成功——ML 是困难的,我们必须应对。
-
责任感:处理数据意味着处理信任。这带来了极大的责任:对数据、对所应用算法的结果以及对因数据偏差等意外结果负责。ML 团队必须认识到这一点,并且不畏惧承担这种责任。[R10]
-
责任感与所有权:机器学习解决方案的开发和运作是复杂的,往往意味着团队必须应对不确定性。重要的是团队中的每个人都要对各自的工作负责。具有健康所有权思维的团队通常拥有“如果我搞坏了,我就修复”的文化。然而,所有权需要问责。每个人必须对自己负责,并且必须有空间和安全感,诚实地面对结果。[R11]
-
工程思维:无论其准确性如何,机器学习模型如果不能部署、应用于现实数据、扩展和维护,则价值有限。成功的团队会开发出可维护、可扩展且稳健的端到端解决方案。这包括两个方面:首先是数据——数据通常是杂乱的,需要大量工作和精心处理才能揭示其有价值的信息内容。其次是软件(& 云)工程。在这里,软件工程的最佳实践适用。[R12]
-
分析与批判性思维:不要信任机器!毕竟,机器学习算法解决的是数值优化问题。它们将数字作为输入并输出数字。无论结果是否合理或是否解决了给定的问题,都需要由经验丰富的机器学习专家团队进行检查。
-
协作:信任和安全是任何真正协作的基础。每个团队成员必须对自己的能力和局限性有信任,以便在团队内建立信任并进行持续改进。在这种情况下,安全意味着:首先,在团队内部,我们尊重所有权,但积极为机器学习产品的成功做出贡献。其次,每个人都会犯错,每个团队成员都应感到安全,能够承认错误、纠正错误并从中学习。这使得每个团队成员都能成为一个强大而可靠的合作者。
-
基于角色的指导:基于角色的指导是一种有效促进个人和职业成长的方式。这种方法有两个方面:首先,寻找团队内部或外部的导师,以进行积极的学习、获得指导和交流意见。其次,寻找受指导者,提供指导,例如,通过代码审查、数据探索讨论或挑战机器学习解决方案。
-
问题解决:我们收到的每个请求都代表着一个尚未解决的问题。我们的工作是根据现有数据探讨是否存在潜在解决方案,这本质上是一个困难的挑战。为了解决这个问题,团队中的每个人都需要拥有个人的工具箱,能够处理、理清,并最终解决所给的问题。这通常涉及将先进的分析应用于复杂的数据集,开发有效的算法,并寻找创新的解决方案。这种能力为团队、公司及其客户做出了宝贵的贡献。
-
有效沟通:主动发言者和主动倾听者都对良好的沟通负有责任。发言者需要能够在与合作者、利益相关者或其他专家沟通时清晰地表达复杂的技术概念和结果。[R13] 在机器学习开发中,明确的资源和时间规划可能是困难的。这也是为什么它被称为数据科学。因此,协商资源和截止日期的能力是团队工作的一个重要方面。[R14] 数据往往无法满足利益相关者的期望,这可能会导致摩擦。同样重要的是,具有文化和教育多样性、不同能力以及有时目标冲突的团队的性质可能会导致真正困难的对话。处理这些对话需要耐心、理解的开放态度以及适量的同理心。[R15] 我们在这里列出了成功的机器学习专家所需的三大主要沟通方面。
-
应对模糊性:模糊性来源于竞争的想法、不明确的结果愿景、相互冲突的利益和有限的信息。根据可用信息推理和调整计划的能力对于得出结论和确定最佳下一步至关重要。[R16]
-
战略思维:能够设想整体解决方案及其对团队、组织、客户和社会的影响是机器学习专家的重要技能。这种能力结合对机器学习产品开发中相互关联复杂性的深刻理解,使他们能够专注于大局,预见障碍,并提前考虑几步。因此,专家能够清晰地与利益相关者和客户沟通,并优先关注成功的关键领域。
-
组织能力:机器学习产品开发中的典型挑战包括复杂的相互依赖、不可预见的障碍和不完整的信息,例如关于现有数据是否足以解决问题的不确定性。计划可计划的事项、处理意外情况、设定优先级、分配合适的资源以及有效地交付结果是关键技能。[R17]
-
商业头脑:这是识别和优先考虑那些对公司经济成功产生积极影响的正确决策的能力。一个重要的前提是理解商业问题和客户需求。然后,挑战在于有效且技术上高效地实现这些需求。技术解决方案的表现与机器学习模型的质量相关,同样重要的是其成本效益实施。强大的商业头脑使机器学习专家能够为公司的利润做出贡献。
-
以客户为中心:给客户他需要的,而不是他要求的。 这是将知识和能力用于帮助客户的关键技能。客户应该对机器学习产品和开发团队充满信心。客户中心意味着理解客户的需求并开发合适的解决方案。[R18]
“我们的计划是通过新产品引领公众,而不是询问他们想要什么样的产品。公众不知道什么是可能的,但我们知道。” 赤尾守田(1921–1999)是日本商人,索尼的联合创始人、首席执行官和董事长。
推荐阅读列表
[R1] 安基塔·尼贾姆;数据科学家必备的 20 种技能 blog.insaid.co
[R2] 西德赫什·辛德;在这里发现顶级 11 种数据科学技能 emeritus.org/blog(2022 年 12 月 8 日)
[R3] 安迪·麦克唐纳;成功数据科学家必须具备的 5 种软技能 towardsdatascience.com(2022 年 10 月 28 日)
[R4] 西蒙·西内克;《从为什么开始:伟大的领导者如何激励每个人采取行动》(2011 年 12 月 27 日)
[R5] 詹姆斯·克利尔;《原子习惯:一种简单且经过验证的方法来建立好习惯并打破坏习惯》(2018 年 10 月 16 日)
[R6] 丹尼尔·戈尔曼;《专注:卓越的隐藏驱动力》(2013 年 10 月 8 日)
[R7] 奥利弗·伯克曼;《四千周:凡人的时间管理》(2021 年 8 月 10 日)
[R8] 米哈伊·契克森米哈伊;《心流:最佳体验的心理学》(2008 年 7 月 1 日)
[R9] 大卫·爱泼斯坦;《范围:全才如何在专业化世界中获胜》(2020 年 10 月 1 日)
[R10] 凯特·克劳福德;《人工智能地图:权力、政治与人工智能的全球成本》(2022 年 8 月 16 日)
[R11] 乔科·威林克,莱夫·巴宾;《极端责任:美国海豹突击队如何领导和胜利》(2017 年 11 月 21 日)
[R12] 罗伯特·C·马丁;《清洁代码:敏捷软件工艺手册》(2008 年 8 月 1 日)
[R13] 南希·杜阿特;《幻灯片学:创造伟大演示的艺术与科学》(2008 年 8 月 7 日)
[R14] 克里斯·沃斯;《从不妥协:谈判如同你的生命依赖于此》(2017 年 3 月 23 日)
[R15] 道格拉斯·斯通,布鲁斯·帕顿,希拉·欣;《困难对话:如何讨论重要的事》(2010 年 11 月 2 日)
[R16] 卡琳·艾尔斯特,塔玛拉·克里斯滕森;《在模糊中引领:如何将不确定性转变为可能性》(2022 年 10 月 12 日)
[R17] 斯科特·伯肯;《实现目标:掌握项目管理》(2008 年 4 月 1 日)
[R18] 保罗·洛普辛斯基 《为什么索尼的联合创始人赤尾守田是我心目中的产品经理英雄,以及他为什么也应该成为你的英雄》(2017 年 3 月 7 日)
2023 年的预测:AI 研究的下一步是什么?
对于过去的一年感到兴奋,我们展望 2023 年,想知道它会是什么样子。
·
跟随 发表在Towards Data Science ·12 分钟阅读·2023 年 1 月 8 日
–
这篇博客文章由Guy Eyal,Gong 的 NLP 团队负责人,共同撰写。
简而言之:
2022 年,大型模型在各类任务和领域中取得了最先进的成果。在自然语言处理(NLP)方面,当模型被训练以对齐用户意图和人类偏好时,实现了显著突破,从而提高了生成质量。展望 2023 年,我们可以期待看到改进对齐过程的新方法(例如带有 AI 反馈的强化学习)、理解对齐效果的自动化指标的开发,以及个性化对齐模型的出现,即使是在线方式。可能还会关注解决事实性问题以及开发开源工具和专门的计算资源,以支持对齐模型的工业规模发展。除了 NLP,还可能在音频处理、计算机视觉和机器人等其他模态中取得进展,并发展多模态模型。
2022 年 AI 研究进展:年度回顾
2022 年对人工智能/机器学习来说是优秀的一年,发布了大量语言模型(LLMs)并在各种基准测试中取得了最先进的结果。这些 LLMs 通过少量学习展示了其优越的表现,超越了在相同任务上进行了微调的小型模型[1–3]。这有可能减少对专业领域数据集的需求。诸如思维链[4]和自洽性[5]等技术也帮助提升了 LLMs 的推理能力,在推理基准测试中取得了显著提升。
对话系统也取得了显著进展, resulting in more helpful, safe, and faithful models that could stay up-to-date through fine-tuning on annotated data and the use of retrieval from external knowledge sources [6–7]。
在自动语音识别(ASR)中,使用编码器-解码器变换器架构实现了模型规模的更高效扩展,在多个 ASR 基准测试中减少了 50%的词错误率而无需领域适配[8]。
扩散模型[9–10]在大型图像数据集上进行训练,在计算机视觉领域取得了显著进展,并引发了 AI 艺术的新趋势。此外,我们还看到了利用预训练大语言模型(LLMs)来提升从视觉到机器人等任务表现的多模态模型的初步出现[9–12]。
最终,ChatGPT [13] 的发布让用户瞥见了在各个领域和领域中与 AI 助手合作的未来。
图片来源:Moritz Knöringer 在 Unsplash
2023 年预测:对齐年的到来
对过去一年充满期待,我们展望 2023 年,想知道它会是什么样子。以下是我们的想法:
最近几个月,人工反馈的强化学习(RLHF),一种使模型与用户意图和人类偏好对齐的监督方法,变得越来越受欢迎 [15]。这种监督方法在生成质量方面表现出良好的结果,比较 vanilla GPT3 [16] 和 ChatGPT 的输出可以看出。RLHF 的效果如此显著,以至于经过指令调优的模型超越了一个大于 100 倍的模型。
图片来源 — InstructGPT [15]
随着今年趋势的进一步发展,我们和许多人一样,预计对齐将继续是一个重要因素。然而,我们预测将有更多的核心功能进行积极研究,这些功能目前在大多数模型中缺失,因此限制了它们在许多领域的适用性。
人工智能反馈的强化学习(RLAIF)
目前,RLHF 需要人工策划的数据。虽然与预训练数据规模相比较小,但仍需要大量且昂贵的人力。例如,OpenAI 使用了 40 名注释员编写和标注了 64K 个样本用于指令调优 [15]。我们认为,今年将被利用的一个有趣且令人兴奋的替代方案是使用不同的 LLM 作为指导者和标注者——人工智能反馈的强化学习(RLAIF)。RLAIF 将能够降低成本并快速扩展对齐过程,因为机器将完成所有的端到端工作。Anthropic [17] 最近的一项有趣工作表明,通过良好的提示,可以引导语言模型对有害输出进行分类。这些分类结果反过来用于训练 RLHF 所需的奖励模型。
对齐的度量标准
我们假设将会开发许多方法来实现模型输出与用户意图之间更好的对齐。这反过来将进一步提高生成质量。
为了理解哪种方法更优,自动度量标准应与当前的人类评估方法一起开发。这是 NLP 中的一个长期问题,因为以前的度量标准未能与人类注释对齐。
最近,引入了两种有前景的方法:MAUVE [18],它通过使用发散前沿比较人类生成和模型生成输出的分布,以及模型编写的评估 [19],它利用其他语言模型来评估生成输出的质量。在这些领域的进一步研究可能是 2023 年的一个有价值的方向。
个性化对齐模型
期望一个模型与整个社会对齐是没有意义的,因为我们彼此之间并不对齐。因此,我们预计会看到许多不同的模型与不同的用途和用户对齐。我们称之为个性化对齐模型。
我们将看到各种公司根据自己的需求调整模型,而大型公司则将多个模型与不同的用户需求对齐。这将大大改善最终用户在使用 LLMs 时的体验,包括个人助理、互联网搜索、文本编辑等。
开源和专业计算
要实现行业规模的个性化对齐模型,需要公开可用的两个组件:可对齐的模型和计算资源,这两个组件今天尚未完全存在。
待对齐的模型和 开源模型作为对齐的候选者必须被开发,因为当前的模型,如 Meta 的 OPT [20],不够充分,因为它们与付费 API 不匹配。或者,我们将看到模型对齐的付费 API:由 Google / OpenAI / Cohere / AI21 提供的非公开模型将提供全面的消费者服务选项,并将作为一种有效的商业模式。
计算资源: 尽管对齐比预训练便宜得多,但仍然需要非常专业的计算资源。因此,我们预测将出现争相生成这种公共可用基础设施的情况,可能是在云端。
处理事实问题
LLMs 生成的输出的明显流畅性可能会导致个人将模型视为事实准确且自信。然而,LLMs 的一个已知限制是它们倾向于生成虚假的内容,这仍需要通过对齐来解决。因此,我们看到两个重要的研究方向将在今年蓬勃发展:文本输出的源(引用)和模型的置信度。
当前输出的源可以通过多种方式实现。一个有趣的方向是将 LLMs 与文本检索机制连接,这将有助于将输出与已知来源进行关联[21]。这也可能帮助模型保持相关性,即使它们的训练过程在过去某个时间点停止了。另一个最近提出的想法是在后处理过程中通过搜索最接近输出的文档[22]来实现。虽然后者不能解决虚假信息,但可以使用户更容易验证结果。
在不同领域(例如 ASR [23])的近期研究中训练了具有两个输出的模型:令牌预测和每个令牌的置信度评分。使用类似的方法,同时将置信度评分扩展到整个输出,将帮助用户谨慎对待结果。
在线对齐
随着人们的兴趣、信仰、工作和家庭状况的变化,他们的个人助理也应该适应这些变化是有意义的。我们预测的一个非常有前景的研究方向是在线对齐。用户将能够在部署后继续个性化他们的模型。对齐过程将通过向模型提供反馈的在线学习算法不断更新[24]。
其他模态的情况如何?
我们期望在音频和语音识别领域看到显著的改进。我们假设 Whisper [8] 将能够利用未标注的数据(如 Wav2Vec 2.0 [25] / HuBERT [26]),这将显著提高在挑战性声学场景中的表现。
SpeechT5 [27] 是一个早期的探索者,因此我们假设类似 T0 的模型 [28] 将在规模上(包括训练数据和模型大小)进行训练,从而改进音频嵌入。这将实现一个统一的语音增强、分离和转录系统。在长期来看,我们期待听觉模型能够回答类似于自然语言处理(NLP)模型的问题。这些听觉模型的基础上下文将是一个音频片段,该片段将作为查询的上下文,而无需隐式转录。
多模态模型
明年的一个重要范式将是大型多模态模型。它们会是什么样子?我们猜测它们可能会非常类似于语言模型。我们所指的是,用户将以某种模态提示模型,模型将能够以不同的模态生成其输出(如 Unified-IO [29])。
尽管非常令人兴奋,扩散模型 [9] 目前无法对图像进行分类。这可以通过输出类似于我们今天在分类任务中使用的 LLM 的文本来轻松解决。类似地,这些模型将能够通过良好的提示来转录、生成和增强音频和视频。
那么多模态模型的对齐情况如何?这是远未来的事!或者用我们当前领域的节奏来说——几个月后。
结束语
本文展示了我们对 2023 年 AI 研究中所需进展的预测。大型模型可以执行广泛的学术任务,正如它们在标准基准测试中的出色表现所示。然而,这些模型在现实场景中仍会遇到令人尴尬的失败(不真实、有毒,或对用户没有帮助)。我们相信,通过将模型与用户需求对齐并保持其最新状态,可以解决许多这些问题。为此,我们关注了对齐过程的可扩展性和适应性。如果我们的假设正确,生成语言模型领域将很快发生重大变化。这些模型的潜在用途广泛,从编辑工具到可以在法律、会计和工程等行业中自动化手工劳动的领域特定 AI 助手。将上述声明与计算(GPT-4)的预测进展结合起来,并采用同样的方法应用于视觉和音频处理领域,预示着另一个令人兴奋的年头。
感谢阅读!!如果您对这一 2023 年的预测有任何想法,我们热烈欢迎在评论中分享。
参考文献:
[1] Chowdhery, A., Narang, S., Devlin, J., Bosma, M., Mishra, G., Roberts, A., Barham, P., Chung, H. W., Sutton, C., Gehrmann, S., Schuh, P., Shi, K., Tsvyashchenko, S., Maynez, J., Rao, A., Barnes, P., Tay, Y., Shazeer, N., Prabhakaran, V., . . . Fiedel, N. (2022). PaLM: 通过路径扩展语言建模。arXiv。doi.org/10.48550/arXiv.2204.02311
[2] Scao, T. L., Fan, A., Akiki, C., Pavlick, E., Ilić, S., Hesslow, D., Castagné, R., Luccioni, A. S., Yvon, F., Gallé, M., Tow, J., Rush, A. M., Biderman, S., Webson, A., Ammanamanchi, P. S., Wang, T., Sagot, B., Muennighoff, N., . . . Wolf, T. (2022). BLOOM: 一种 176B 参数的开放访问多语言模型。arXiv。doi.org/10.48550/arXiv.2211.05100
[3] Zhang, S., Roller, S., Goyal, N., Artetxe, M., Chen, M., Chen, S., Dewan, C., Diab, M., Li, X., Lin, X. V., Mihaylov, T., Ott, M., Shleifer, S., Shuster, K., Simig, D., Koura, P. S., Sridhar, A., Wang, T., & Zettlemoyer, L. (2022). OPT: 开放预训练变换器语言模型。arXiv。doi.org/10.48550/arXiv.2205.01068
[4] Wei, J., Wang, X., Schuurmans, D., Bosma, M., Ichter, B., Xia, F., Chi, E., Le, Q., & Zhou, D. (2022). 思维链提示在大型语言模型中引发推理。arXiv。doi.org/10.48550/arXiv.2201.11903
[5] Wang, X., Wei, J., Schuurmans, D., Le, Q., Chi, E., Narang, S., Chowdhery, A., & Zhou, D. (2022). 自我一致性改善语言模型中的思维链推理。arXiv。doi.org/10.48550/arXiv.2203.11171
[6] Thoppilan, R., De Freitas, D., Hall, J., Shazeer, N., Kulshreshtha, A., Cheng, H., Jin, A., Bos, T., Baker, L., Du, Y., Li, Y., Lee, H., Zheng, H. S., Ghafouri, A., Menegali, M., Huang, Y., Krikun, M., Lepikhin, D., Qin, J., . . . Le, Q. (2022). LaMDA: 对话应用的语言模型。arXiv。doi.org/10.48550/arXiv.2201.08239
[7] Shuster, K., Xu, J., Komeili, M., Ju, D., Smith, E. M., Roller, S., Ung, M., Chen, M., Arora, K., Lane, J., Behrooz, M., Ngan, W., Poff, S., Goyal, N., Szlam, A., Boureau, Y., Kambadur, M., & Weston, J. (2022). BlenderBot 3: 一个持续学习以负责任地互动的部署对话代理。arXiv。doi.org/10.48550/arXiv.2208.03188
[8] Radford, A., Kim, JW, Xu, T, Brockman, G., McLeavey, C., Sutskever, I. (2022). 通过大规模弱监督实现稳健的语音识别。OpenAI。cdn.openai.com/papers/whisper.pdf
[9] Rombach, R., Blattmann, A., Lorenz, D., Esser, P., & Ommer, B. (2021). 《使用潜在扩散模型的高分辨率图像合成》。arXiv。 doi.org/10.48550/arXiv.2112.10752
[10] Ramesh, A., Dhariwal, P., Nichol, A., Chu, C., & Chen, M. (2022). 《基于 CLIP 潜变量的分层文本条件图像生成》。arXiv。 doi.org/10.48550/arXiv.2204.06125
[11] Tang, Z., Yang, Z., Wang, G., Fang, Y., Liu, Y., Zhu, C., Zeng, M., Zhang, C., & Bansal, M. (2022). 《统一视觉、文本和布局以实现通用文档处理》。arXiv。 doi.org/10.48550/arXiv.2212.02623
[12] Wang, P., Yang, A., Men, R., Lin, J., Bai, S., Li, Z., Ma, J., Zhou, C., Zhou, J., & Yang, H. (2022). 《OFA:通过简单的序列到序列学习框架统一架构、任务和模态》。arXiv。 doi.org/10.48550/arXiv.2202.03052
[13] Ahn, M., Brohan, A., Brown, N., Chebotar, Y., Cortes, O., David, B., Finn, C., Fu, C., Gopalakrishnan, K., Hausman, K., Herzog, A., Ho, D., Hsu, J., Ibarz, J., Ichter, B., Irpan, A., Jang, E., Ruano, R. J., Jeffrey, K., . . . Zeng, A. (2022). 《做我能做的,不是我说的:将语言建立在机器人能力上》。arXiv。 doi.org/10.48550/arXiv.2204.01691
[14] chat.openai.com/chat
[15] Ouyang, L., Wu, J., Jiang, X., Almeida, D., Wainwright, C. L., Mishkin, P., Zhang, C., Agarwal, S., Slama, K., Ray, A., Schulman, J., Hilton, J., Kelton, F., Miller, L., Simens, M., Askell, A., Welinder, P., Christiano, P., Leike, J., . . . Lowe, R. (2022). 《训练语言模型以遵循人类反馈的指令》。arXiv。 doi.org/10.48550/arXiv.2203.02155
[16] Brown, T. B., Mann, B., Ryder, N., Subbiah, M., Kaplan, J., Dhariwal, P., Neelakantan, A., Shyam, P., Sastry, G., Askell, A., Agarwal, S., Krueger, G., Henighan, T., Child, R., Ramesh, A., Ziegler, D. M., Wu, J., Winter, C., Hesse, C., . . . Amodei, D. (2020). 《语言模型是少样本学习者》。arXiv。 doi.org/10.48550/arXiv.2005.14165
[17] Bai, Y., Kadavath, S., Kundu, S., Askell, A., Kernion, J., Jones, A., Chen, A., Goldie, A., Mirhoseini, A., McKinnon, C., Chen, C., Olsson, C., Olah, C., Hernandez, D., Drain, D., Ganguli, D., Li, D., Perez, E., Kerr, J., . . . Kaplan, J. (2022). 《宪法 AI:来自 AI 反馈的无害性》。arXiv。 doi.org/10.48550/arXiv.2212.08073
[18] Pillutla, K., Swayamdipta, S., Zellers, R., Thickstun, J., Welleck, S., Choi, Y., & Harchaoui, Z. (2021). MAUVE: 使用发散边界测量神经文本与人类文本之间的差距。arXiv。 doi.org/10.48550/arXiv.2102.01454
[19] Perez, E., Ringer, S., Lukošiūtė, K., Nguyen, K., Chen, E., Heiner, S., Pettit, C., Olsson, C., Kundu, S., Kadavath, S., Jones, A., Chen, A., Mann, B., Israel, B., Seethor, B., McKinnon, C., Olah, C., Yan, D., Amodei, D., . . . Kaplan, J. (2022). 通过模型编写的评估发现语言模型行为。arXiv。 doi.org/10.48550/arXiv.2212.09251
[20] Iyer, S., Lin, X. V., Pasunuru, R., Mihaylov, T., Simig, D., Yu, P., Shuster, K., Wang, T., Liu, Q., Koura, P. S., Li, X., Pereyra, G., Wang, J., Dewan, C., Celikyilmaz, A., Zettlemoyer, L., & Stoyanov, V. (2022). OPT-IML: 通过泛化视角扩展语言模型指令元学习。arXiv。 doi.org/10.48550/arXiv.2212.12017
[21] He, H., Zhang, H., & Roth, D. (2022). 通过检索重新思考:忠实的大型语言模型推理。arXiv。 doi.org/10.48550/arXiv.2301.00303
[22] Bohnet, B., Tran, V. Q., Verga, P., Aharoni, R., Andor, D., Soares, L. B., Eisenstein, J., Ganchev, K., Herzig, J., Hui, K., Kwiatkowski, T., Ma, J., Ni, J., Schuster, T., Cohen, W. W., Collins, M., Das, D., Metzler, D., Petrov, S., . . . Webster, K. (2022). 属性问答:属性大型语言模型的评估与建模。arXiv。 doi.org/10.48550/arXiv.2212.08037
[23] Gekhman, Z., Zverinski, D., Mallinson, J., & Beryozkin, G. (2022). RED-ACE: 使用置信嵌入进行鲁棒的错误检测。arXiv。 doi.org/10.48550/arXiv.2203.07172
[24] Bai, Y., Jones, A., Ndousse, K., Askell, A., Chen, A., DasSarma, N., Drain, D., Fort, S., Ganguli, D., Henighan, T., Joseph, N., Kadavath, S., Kernion, J., Conerly, T., Elhage, N., Hernandez, D., Hume, T., Johnston, S., Kravec, S., . . . Kaplan, J. (2022). 通过人类反馈的强化学习训练有用且无害的助手。arXiv。 doi.org/10.48550/arXiv.2204.05862
[25] Baevski, A., Zhou, H., Mohamed, A., & Auli, M. (2020). wav2vec 2.0:一种自监督学习语音表示的框架。arXiv。 doi.org/10.48550/arXiv.2006.11477
[26] Hsu, W., Bolte, B., Tsai, Y., Lakhotia, K., Salakhutdinov, R., & Mohamed, A. (2021). HuBERT:通过掩蔽预测隐藏单元进行自监督语音表示学习。arXiv。 doi.org/10.48550/arXiv.2106.07447
[27] Ao, J., Wang, R., Zhou, L., Wang, C., Ren, S., Wu, Y., Liu, S., Ko, T., Li, Q., Zhang, Y., Wei, Z., Qian, Y., Li, J., & Wei, F. (2021). SpeechT5: 统一模态编码器-解码器预训练用于口语语言处理。arXiv。 doi.org/10.48550/arXiv.2110.07205
[28] Sanh, V., Webson, A., Raffel, C., Bach, S. H., Sutawika, L., Alyafeai, Z., Chaffin, A., Stiegler, A., Scao, T. L., Raja, A., Dey, M., Bari, M. S., Xu, C., Thakker, U., Sharma, S. S., Szczechla, E., Kim, T., Chhablani, G., Nayak, N., . . . Rush, A. M. (2021). 多任务提示训练实现零样本任务泛化。arXiv。 doi.org/10.48550/arXiv.2110.08207
[29] Lu, J., Clark, C., Zellers, R., Mottaghi, R., & Kembhavi, A. (2022). Unified-IO: 统一模型用于视觉、语言和多模态任务。arXiv。 doi.org/10.48550/arXiv.2206.08916
[30] Mildenhall, B., Srinivasan, P. P., Tancik, M., Barron, J. T., Ramamoorthi, R., & Ng, R. (2020). NeRF: 将场景表示为神经辐射场用于视图合成。arXiv。 doi.org/10.48550/arXiv.2003.08934
[31] Chen, C., Gao, R., Calamia, P., & Grauman, K. (2022). 视觉声学匹配。arXiv。 doi.org/10.48550/arXiv.2202.06875
[32] Zhu, Z., Peng, S., Larsson, V., Xu, W., Bao, H., Cui, Z., Oswald, M. R., & Pollefeys, M. (2021). NICE-SLAM: 神经隐式可扩展编码用于 SLAM。arXiv。 doi.org/10.48550/arXiv.2112.12130
使数据团队成功的决策
·
关注 发表在 Towards Data Science · 发送为 通讯 · 3 分钟阅读·2023 年 7 月 13 日
–
现实是复杂的:人们和组织的行为往往出乎意料,外部事件可能不断干扰我们最精密的工作流程。对于数据团队来说,可能会倾向于用最新的光鲜工具或炫目的新员工来应对这些挑战时刻。这样做可能会有效——但只是到一定程度为止。
面对变化、令人失望的结果或偶尔的公司混乱,帮助团队培养韧性的方法很少是这种快速的神奇解决方案。 相反,是多个明智决策的逐渐积累——这些决策使可靠的实践和一致的表现成为可能。本周,我们精选了一些文章,专注于帮助数据团队脱颖而出并在长期内保持成功的决策。享受阅读!
-
数据测试是“验证数据质量的最基本和实用的方法之一,” Xiaoxu Gao 说——这是许多数据团队任务的核心。 然而,创建可靠的测试以形成稳健的商业决策并非易事;Xiaoxu 的文章 提供了一条有用的路线图,以避免一些最常见的陷阱。
-
从测试的细节中退一步,shane murray 提出了一个关键问题:哪个团队应该首先对数据质量负责? 如你所猜测的,这个常见难题没有一刀切的答案,但一旦你对每种选择涉及的权衡有了更细致的理解,你将更有能力做出正确的决策。
-
数据科学家天生擅长连接,无论是业务和产品团队之间,营销人员和客户之间,还是技术与非技术合作伙伴之间。 Robert Yi 最近分享了一篇发人深省的文章 呼吁数据团队对他们提供给其他利益相关者的数据负责,文章概述了他们可以采取的一些步骤,以确保在业务职能之间进行清晰有效的沟通。
-
当你从事投资组合项目时,目标往往是找到最准确的模型并结束工作。 Hennie de Harder 提醒我们,在实际工作中,许多其他因素也会影响决策——从成本到实施复杂性。这就是为什么 数据团队必须拥有一致的方法来比较不同的机器学习解决方案。
这是一个我们保证你不会后悔的小决定:阅读更多我们的每周亮点!我们在过去几天发布了一些出色的文章,不希望你错过它们。
-
Rik Jongerius 和 Wessel 带我们了解他们为荷兰铁路运营商 NS 执行的迷人项目:这涉及到向移动应用用户提供 实时列车拥挤度预测。
-
将数据转化为驱动行动的洞察 可能会很棘手——尤其是在较大的组织中。Khouloud El Alami 分享了一些弥合这一差距的实用想法。
-
语言模型如何编码和表示历史事件? Yennie Jun 探索了一个话题,其相关性将在 AI 工具在教育环境中变得越来越普及时迅速增长。
-
如果你对最近出现的开源 LLMs 感到好奇,可以考虑关注并跟随 Het Trivedi 的 云端运行 Falcon-7B 模型的教程,作为微服务。
-
利用 Spark 和 Tableau Desktop 的强大功能,Yu Huang, M.D., M.S. in CS 展示了如何 自动化创建仪表板的过程。
-
如果你想要一个有趣(且启发性强)的项目回顾,Shaked Zychlinski 解释了 他们如何创建一个基于 ChatGPT 的法语辅导器的工作原型(包括语音转文本和文本转语音功能)。
感谢您支持我们的作者!如果您喜欢 TDS 上的文章,可以考虑 成为 Medium 会员 — 这将解锁我们整个档案(以及 Medium 上的所有其他帖子)。
直到下一个 Variable,
TDS 编辑团队
车辆路径问题:精确与启发式解决方案
了解如何用 Python 解决复杂的路由问题
·
关注 发表在 Towards Data Science ·13 分钟阅读·2023 年 8 月 4 日
–
照片由 Nik Shuliahin 💛💙 提供,来源于 Unsplash
车辆路径问题(VRP)的目标是确定由一组车辆执行的最佳路径集合,以服务于一组指定的客户。由于其多种应用和具有挑战性的组合特性,它是运筹学和数值优化中研究最多的问题之一。
具有负载(和持续时间)约束的容量车辆路径问题(CVRP)是最常见的变种之一,因为它引入了负载容量有限的车辆以及可能的持续时间/距离约束。其他常见的变种还引入了多个仓库、异质车队、取货和配送以及时间窗约束。
这些问题的组合方面使得考虑一个简单的 15 点集合时,有 6 × 10¹¹条可能的路线将其连接起来(Dantzig & Ramser, 1959)。因此,某些现实世界的应用在过去几十年中计算和算法研究进展之前可能仍不切实际。Branch-Cut-and-Price 算法已能够证明具有数百名客户的 CVRP 实例的最优性(Fukasawa et al., 2006; Pecin et al., 2017),而最先进的元启发式算法结合局部搜索技术可以在几秒钟内为这些实例提供高质量(有时最优)的解(Vidal et al., 2012; Vidal, 2022)。
在本文中,我们将介绍具有负载(和持续时间)约束的容量车辆路径问题,并使用混合整数规划(MIP)和专门的(元)启发式算法进行求解。在第一部分中,我们将使用 Python AML Pyomo,配合 HiGHS 求解器,而在第二部分中,我们将使用 Google OR Tools 包。
那些对问题的现实世界应用更感兴趣而不是理论方面的读者可能会快速浏览MIP部分,并对专门(元)启发式和有用扩展部分更感兴趣。
那些对 MIP 公式感兴趣但尚不熟悉数值优化的人可能会发现查看我之前关于线性规划和分支定界方法的故事会很有帮助,然后再继续阅读本文。
与往常一样,你可以在这个 git 仓库 中找到完整的代码。
现在,让我们深入了解吧!
混合整数规划
本节中提出的数学公式将使用 Toth & Vigo (2002)中所展示的相同方程,该模型被称为“三指数车辆流量公式”。
考虑一个节点集合V(需求和仓库)和一个车辆集合K。我们将使用小写的i和j来表示节点索引,小写的k来表示车辆索引。由于该模型适用于不对称情况,假设节点是一个完整的有向图G(V, A)的一部分,其中A是弧。在这个问题中,有一个单一的仓库节点,索引为 0,所有车辆的容量都是Q。考虑两个决策变量组:
-
x_{i, j, k}: 是一个二进制变量,表示由车辆 k 执行的从节点 i 到节点 j 的活跃弧。
-
y_{i, k}: 是一个二进制变量,表示节点 i 的需求由车辆 k 满足。
我们的目标是最小化与活跃弧相关的成本值。总持续时间或距离是常见的例子。假设弧 i,j 的成本是 cᵢⱼ。目标函数可以表示为如下。
CVRP 的目标函数。(作者提供的图像)。
我们还需要包括确保以下条件的约束:
-
每个客户 i 只被访问一次,因此有一个从它出发的活跃弧和一个到达它的活跃弧。
-
如果任何由车辆 k 索引的弧变量进入一个节点 i 或从中出去,则该节点的需求 q 分配给车辆 k。
-
分配给一辆车的总需求不能超过其容量 Q。
-
恰好 |K| 个节点从仓库出发并到达仓库。
-
没有子回路……然而,子回路的数量可能太大,无法从一开始就枚举出来。我们将详细讨论如何进行处理。
CVRP 的约束。(作者提供的图像)。
和往常一样,在 Python 教程中,让我们通过导入本节中使用的库开始我们的 动手 部分:
import time
from itertools import cycle
import numpy as np
from scipy.spatial.distance import pdist, squareform
import matplotlib.pyplot as plt
import matplotlib as mpl
import networkx as nx
import pyomo.environ as pyo
from pyomo.contrib.appsi.solvers.highs import Highs
现在让我们实例化一个具有 N 个需求节点的随机问题。在此示例中,depot 节点被假设为第一个节点(索引 0),因此我们确保其对应的需求也为零。
np.random.seed(42) # Results should be always the same
N = 10
demands = np.random.randint(1, 10, size=N)
demands[0] = 0
capacity = 15
n_vehicles = 4
coordinates = np.random.rand(N, 2)
distances = squareform(pdist(coordinates, metric="euclidean"))
distances = np.round(distances, decimals=4) # avoid numerical errors
必要的车辆数量可以通过使用二进制装箱问题来计算。如何执行的示例也包含在 完整源代码 中。
在 pyomo 中建模问题有两种方法:Abstract 和 Concrete 模型。在第一种方法中,问题的代数表达式在提供一些数据值之前被定义,而在第二种方法中,模型实例在定义其元素时立即创建。你可以在 库文档 或 Bynum 等人(2021)的书中找到更多关于这些方法的信息。本文中,我们将采用 Concrete 模型的表述。
model = pyo.ConcreteModel()
让我们实例化需求节点 V、弧 A 和车辆 K 的集合。注意,仓库节点包含在节点 V 集合中,如原始数学公式所示。
model.V = pyo.Set(initialize=range(len(demands)))
model.A = pyo.Set(initialize=[(i, j) for i in model.V for j in model.V if i != j])
model.K = pyo.Set(initialize=range(n_vehicles))
现在我们设置容量、需求负荷和弧成本的参数。
model.Q = pyo.Param(initialize=capacity)
model.q = pyo.Param(model.V, initialize={i: d for (i, d) in enumerate(demands)})
model.c = pyo.Param(model.A, initialize={(i, j): distances[i, j] for (i, j) in model.A})
以及指示给定车辆中的活跃弧和车辆访问的节点的决策变量。
model.x = pyo.Var(model.A, model.K, within=pyo.Binary)
model.y = pyo.Var(model.V, model.K, within=pyo.Binary)
在包含约束之前,我将创建我们的目标,计算活跃弧的总成本。
model.obj = pyo.Objective(
expr=sum(
model.x[i, j, k] * model.c[i, j]
for (i, j) in model.A
for k in model.K
),
sense=pyo.minimize,
)
我们还必须包括之前列出的约束条件。首先,让我们使用常见的Pyomo签名来实现它们:*function(model, domain)。
def arcs_in(model, i):
if i == model.V.first():
return sum(model.x[:, i, :]) == len(model.K)
else:
return sum(model.x[:, i, :]) == 1.0
def arcs_out(model, i):
if i == model.V.first():
return sum(model.x[i, :, :]) == len(model.K)
else:
return sum(model.x[i, :, :]) == 1.0
def vehicle_assignment(model, i, k):
return sum(model.x[:, i, k]) == model.y[i, k]
def comp_vehicle_assignment(model, i, k):
return sum(model.x[i, :, k]) == model.y[i, k]
def capacity_constraint(model, k):
return sum(model.y[i, k] * model.q[i] for i in model.V) <= model.Q
然后将它们纳入我们的模型中。
model.arcs_in = pyo.Constraint(model.V, rule=arcs_in)
model.arcs_out = pyo.Constraint(model.V, rule=arcs_out)
model.vehicle_assignment = pyo.Constraint(model.V, model.K, rule=vehicle_assignment)
model.comp_vehicle_assignment = pyo.Constraint(model.V, model.K, rule=comp_vehicle_assignment)
model.capacity_constraint = pyo.Constraint(model.K, rule=capacity_constraint)
请注意,我还没有包括子旅行消除约束。我们应该考虑所有可能的N个节点的排列,每次取k个,这可能会变得非常庞大,即使对于中等规模的实例也很难枚举。或者,在我们的解决过程中,我们将递归地在每次找到新解时包括子旅行消除约束,如果我们验证这个解产生了子旅行的话。在一些商业求解器中,这些称为“懒惰约束”,可以通过回调直接纳入求解器。
首先,让我们创建一个函数,给定一个子旅行、所有剩余节点、一个子旅行中的节点和一辆车,返回一个Pyomo表达式,对应于之前陈述的数学公式。此外,让我们包括一个ConstraintList,在解决过程中我们将向其中添加新的元素。
def subtour_elimination(model, S, Sout, h, k):
nodes_out = sum(model.x[i, j, k] for i in S for j in Sout)
return model.y[h, k] <= nodes_out
model.subtour_elimination = pyo.ConstraintList()
我们必须创建一些函数,给定一个解,返回创建的子旅行(如果存在)。为此,我们将首先使用find_arcs函数创建一个活动弧的列表。这个列表将用于创建一个不完整的有向图,使用Networkx的DiGraph类。find_subtours函数应该返回一个list的sets,表示连接组件。
def find_arcs(model):
arcs = []
for i, j in model.A:
for k in model.K:
if np.isclose(model.x[i, j, k].value, 1):
arcs.append((i, j))
return arcs
def find_subtours(arcs):
G = nx.DiGraph(arcs)
subtours = list(nx.strongly_connected_components(G))
return subtours
我们的目标是消除不包含仓库节点的连接组件组。因此,在下一步中,我们将创建函数,遍历集合列表,并包括新的约束条件,如果组件集合不包括仓库节点的话。这将使用ConstraintList类的add方法。
def eliminate_subtours(model, subtours):
proceed = False
for S in subtours:
if 0 not in S:
proceed = True
Sout = {i for i in model.V if i not in S}
for h in S:
for k in model.K:
model.subtour_elimination.add(
subtour_elimination(model, S, Sout, h, k)
)
return proceed
现在我们已准备好提出一个解决程序,它迭代地求解 MIP,验证当前解是否有子旅行,如果有,则包括新的约束以消除它们。否则,找到的解就是最优的。
def solve_step(model, solver):
sol = solver.solve(model)
arcs = find_arcs(model)
subtours = find_subtours(arcs)
time.sleep(0.1)
proceed = eliminate_subtours(model, subtours)
return sol, proceed
def solve(model, solver):
proceed = True
while proceed:
sol, proceed = solve_step(model, solver)
return sol
现在让我们实例化求解器并求解我们的模型。如果安装了highspy包,Highs求解器可以在Pyomo中使用(检查导入)。所以确保运行pip install highspy
。
solver = Highs()
solver.highs_options = {
"log_file": "Highs.log",
"mip_heuristic_effort": 0.2,
"mip_detect_symmetry": True,
"mip_rel_gap": 1e-6,
}
solution = solve(model, solver)
还需要一个函数来找到创建的路径,然后我们就准备好绘制结果了。
def find_tours(model):
tours = []
for k in model.K:
node = 0
tours.append([0])
while True:
for j in model.V:
if (node, j) in model.A:
if np.isclose(model.x[node, j, k].value, 1):
node = j
tours[-1].append(node)
break
if node == 0:
break
return tours
使用 MIP 产生的 CVRP 路径。(作者提供的图像)。
对于总共有 10 个节点的小规模实例,结果令人惊讶。然而,即使对于这个小规模实例,求解器也花费了将近半分钟来获得解,而且随着需求点增加,复杂性显著增加。幸运的是,有专门的算法公开可用,用于在短时间内找到更大实例的优质解。让我们在下一节中查看它们。
专门的(元)启发式算法
多年来,已经提出了几种针对 VRP 变体的专门(元)启发式算法。它们大多依赖于局部搜索算法,以便在给定的解中尝试不同的扰动,从而顺序地改进其成本,直到在给定的邻域中无法进一步改进。使用 Google Or Tools 时,我们也将使用与构造算法相关的局部搜索方法。
在这一部分中,将使用 Rochat 和 Taillard (1995) 的实例 150d。其数据来源于 CVRPLIB。该实例有 150 个客户和一个仓库节点,因此我们肯定无法使用之前展示的 MIP 策略来解决它。
让我们再次从导入所使用的库开始。
from itertools import cycle
import numpy as np
import pandas as pd
from scipy.spatial.distance import pdist, squareform
import matplotlib.pyplot as plt
import matplotlib as mpl
from ortools.constraint_solver import routing_enums_pb2
from ortools.constraint_solver import pywrapcp
让我们从一个包含每个节点坐标和需求的数据文件中加载问题数据。
dataset = pd.read_csv("./data/tai150d.csv", index_col=0)
coordinates = dataset.loc[:, ["x", "y"]]
demands = dataset.d.values
capacity = 1874
n_vehicles = 15
N = coordinates.shape[0]
distances = squareform(pdist(coordinates, metric="euclidean"))
distances = np.round(distances, decimals=4)
使用 OR Tools VRP 求解器的第一步是实例化一个路由管理器和一个模型。
# Create the routing index manager: number of nodes, number of vehicles, depot node
manager = pywrapcp.RoutingIndexManager(
N, n_vehicles, 0
)
# Create Routing Model
routing = pywrapcp.RoutingModel(manager)
接下来,我们将添加回调函数以量化与弧/边和节点相关的维度。我们 routing 实例的 RegisterTransitCallback 方法可以用来量化与弧/边相关的任何维度,而 RegisterUnaryTransitCallback 方法可以量化与节点相关的值。根据参数的原始大小,可能需要重新缩放你的参数,因为 ortools 只考虑维度中的整数值。
# Same valid for any callback related to arcs/edges
def distance_callback(from_index, to_index):
from_node = manager.IndexToNode(from_index)
to_node = manager.IndexToNode(to_index)
return distances[from_node, to_node]
transit_callback_index = routing.RegisterTransitCallback(distance_callback)
# Same valid for any callback related to nodes
def demand_callback(from_index):
from_node = manager.IndexToNode(from_index)
return demands[from_node]
demand_callback_index = routing.RegisterUnaryTransitCallback(demand_callback)
现在,我们将使用之前定义的 demand_callback_index 来加入容量约束。请注意,持续时间约束也可以使用相同的语法定义,只需将 RegisterTransitCallback 的实例作为第一个参数传递。此外,需要强调的是,routing 模型处理异质车队,因此我们必须在第三个参数中传递一个值的列表。
# Any constraint associated with vehicles can take same arguments
routing.AddDimensionWithVehicleCapacity(
demand_callback_index,
0, # null capacity slack
[capacity,] * n_vehicles, # vehicle maximum capacities (list for each vehicle)
True, # start cumul to zero
'Capacity'
)
同样,目标的定义也将 callback 作为主要参数。在这个示例中,让我们最小化在 transit_callback_index 中定义的距离。
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)
最后,我们必须定义求解器参数并解决我们的模型。
# Setting heuristic strategies
search_parameters = pywrapcp.DefaultRoutingSearchParameters()
search_parameters.first_solution_strategy = (
routing_enums_pb2.FirstSolutionStrategy.CHRISTOFIDES
)
search_parameters.local_search_metaheuristic = (
routing_enums_pb2.LocalSearchMetaheuristic.GUIDED_LOCAL_SEARCH
)
search_parameters.time_limit.FromSeconds(300)
# Solve the problem
solution = routing.SolveWithParameters(search_parameters)
以下代码片段可用于提取我们解决方案中使用的路线。
tours = []
for vehicle_id in range(n_vehicles):
index = routing.Start(vehicle_id)
tours.append([])
while not routing.IsEnd(index):
node_index = manager.IndexToNode(index)
previous_index = index
index = solution.Value(routing.NextVar(index))
tours[-1].append(node_index)
else:
node_index = manager.IndexToNode(index)
tours[-1].append(node_index)
可以通过运行简单的代码 solution.ObjectiveValue()
来访问目标值。使用所提供的配置,我得到的目标值为 2679,这与证明的最优值 2645 非常接近(1.2% 的差距)。获得的路线如下图所示。
使用 ortools 在实例 tai150d 中获得的路线。(图片来源于作者)。
完整的代码(包括图表)可以在这个 git 仓库 中找到。
有用的扩展
OR Tools 库作为路由问题的一般求解器非常出色,因为它处理了多种变体的 VRP,例如时间窗、异构车队和多个仓库。然而,适用于经典 CVRP 的算法表现可能更佳。完全值得查看一下 HGS-CVRP 包(Vidal, 2022),它结合了最先进的遗传算法和几种局部搜索策略。该算法能在不到 20 秒的时间内找到实例 tai150d 的最优解。
关于一些实际应用,可能需要依赖于道路距离(或持续时间)而非欧几里得距离来连接位置。谷歌提供了一个很好的付费接口,你可以在 这个教程 中查看。然而,如果你在寻找开源替代方案,值得查看 OpenStreetMap API。一些有用的请求包括:
-
https://router.project-osrm.org/table/v1/driving/
-
http://router.project-osrm.org/route/v1/car/?overview=false&steps=true
在 中应该是以逗号分隔的经纬度对的列表,在不同对之间用分号分隔。你还可以在 table 请求中指定起点和终点,这在完整表格太大而无法在单个请求中处理时很有用。
除了进行精确的路由计算外,数据可视化也是一个重要工具。Python 库 folium 可以非常有用。绝对值得查看一下。
进一步阅读
在本文早些时候,我们实现了一个精确的 MIP 模型用于 CVRP,这对于中等规模的实例并不适用。然而,结合 列生成 和 分支定界 的算法在解决上百客户的实例时表现成功。值得查看 Fukasawa 等人(2006)和 Pecin 等人(2017)的研究论文。
对于感兴趣的列生成介绍,可以在我之前的 Medium 文章 中找到。
关于 元启发式算法,Vidal 等人(2012)和 Vidal(2022)的论文非常出色。两者也以技术报告的形式提供,链接可以在 HGS-CVRP 仓库中找到。
结论
在这篇文章中,介绍了两种解决容量受限车辆路径问题(CVRP)的方法:混合整数规划和(元)启发式方法。第一种方法用于解决一个小规模实例,并且成功解决了该问题,但无法处理中等规模或大型实例。第二种方法则用于解决文献中的一个具有挑战性的问题,该问题有 150 个客户,解算器在 300 秒内找到了一个与已知最优解相差 1.2%的高质量解。
参考文献
Bynum, M. L. 等, 2021. Pyomo-optimization modeling in python. Springer.
Dantzig, G. B., & Ramser, J. H., 1959. The truck dispatching problem. 管理科学, 6(1), 80–91.
Fukasawa, R., Longo, H., Lysgaard, J., Aragão, M. P. D., Reis, M., Uchoa, E., & Werneck, R. F., 2006. 针对容量受限车辆路径问题的鲁棒分支定界与定价方法. 数学规划, 106, 491–511.
Pecin, D., Pessoa, A., Poggi, M., & Uchoa, E., 2017. 改进的分支定界与定价方法用于容量受限车辆路径问题. 数学规划计算, 9, 61–100.
Rochat, Y., & Taillard, É. D., 1995. 在车辆路径问题的局部搜索中进行概率性多样化和强化. 启发式期刊, 1, 147–167.
Toth, P., & Vigo, D., 2002. 车辆路径问题概述. 车辆路径问题, 1–26.
Vidal, T., 2022. 针对 CVRP 的混合遗传搜索:开源实现和 SWAP*邻域. 计算机与运筹研究, 140, 105643.
Vidal, T., Crainic, T. G., Gendreau, M., Lahrichi, N., & Rei, W., 2012. 一种用于多车库和周期性车辆路径问题的混合遗传算法. 运筹学, 60(3), 611–624.