通过这些技巧和窍门使你的表格数据在 CLI 中脱颖而出
提高可读性:在 CLI 中展示数据集的技巧
·发表于 Towards Data Science ·6 分钟阅读·2023 年 4 月 12 日
–
几天前,我想帮助我的父亲解决一个问题。他需要尽快聚合、筛选和展示一些数据。事实上,他每次都打印数据(大约 10 页!!)并手动搜索数据!我看到了他的困难,决定立即帮助他。
对于像我这样能够分析数据的人来说,这并不难:数据已经是 Excel 格式,所以 Jupyter Notebook 和 Pandas 是完美的选择。
问题是我不为我的父亲工作。而且,我们住在不同的城市,每隔几周才见一次面。所以,我需要给他一个可以使用的工具,其特点如下:
-
简单使用。
-
如果他输入错误,不要让电脑爆炸。
这就是我决定创建一个可以通过 CLI 管理的小程序的原因。我想创建的是简单的:用户通过命令行输入,然后程序在终端中显示与 Pandas 相同的所有数据。
在这篇文章中,我将展示如何通过 CLI(命令行界面,即终端)展示表格数据。如果你不知道的话,终端就是我们要使用的工具。我们将创建一个简单的项目,让你立刻上手 Python,并讨论我使用的库。
创建表格数据
首先,让我们创建一些表格数据以便练习:
import pandas as pd
# Create data
data = {"fruit":["banana", "apple", "pear", "orange"],
"color":["yellow", "red", "green", "orange"],
"weight(kg)":[0.3, 0.1, 0.1, 0.2]
}
# Transform data to data frame
df = pd.DataFrame(data)
这些是我们的数据:
我们创建的表格数据。图片由作者提供。
我们创建了一些包含水果信息的表格数据,特别是:水果名称、颜色和重量(以千克为单位)。
现在,为了使其“更真实”,我们可以将其保存到 Excel 文件中,如下所示:
# Save data frame to xlsx file
df.to_excel("fruit.xlsx")
**NOTE:** This methodology of saving files that Pandas gives us is very useful.
For example, we can use it to convert CSV files into XLSX; We did it
in this article here.
问题及其解决方案
现在,我们将创建一个简单的过滤器,如果我们稍微使用一下 Excel,就不需要 Python。我面临的问题更复杂,但这里我们故意简单地创建它:我们的目标不是展示这种方法是否比其他方法更好。这里我们展示的是如何通过 CLI 显示表格数据,一个简单的示例就能完成任务。
所以,假设这是我们的问题:我们希望用户输入一个水果的名称,我们的程序返回所选水果的所有特征。我们还希望过滤器在某种程度上是“智能”的,以便如果用户输入“pea”,它将显示与“pear”相关的特征。
为此,在 Pandas 中我们可以使用方法str.contains()
。让我们在 Jupyter Notebook 中尝试一下:
import pandas as pd
# Import data
df = pd.read_excel("fruit.xlsx")
# Filter for pear
data_frame = df[df["fruit"].str.contains("pea")]
# Show filtered data
data_frame.head()
我们得到:
过滤后的数据。图片由作者提供。
仔细阅读:我们故意将“pea”写成了一个错别字,以确保 Pandas 无论如何都会返回数据。它确实如预期般返回了数据。
现在,我们必须面对另一个问题:用户通过 CLI 的干预。据我所知,在这些情况下,我们可以使用两种不同的方法:我们可以使用内置函数input
,或者可以使用库argparse
。
如果你错过了,我写了一篇关于如何在数据科学中使用argparse
的文章。可以在这里查看:
我知道,这可能很难承认,但……它真的可以节省你的时间!
现在,在这种情况下,我决定使用内置函数input
,因为我认为它更容易使用,在像这样的简单情况下是一个很好的选择。实际上,如果我们只需要通过 CLI 传递一个字符串作为参数,这是完美的选择(你可以在这里阅读文档)。
我们可以这样使用input
函数:
# User input
fruit = input("filter the data for the kind of fruit: ")
现在,让我们看看这如何工作以及如何返回数据。我们可以使用的代码如下:
import pandas as pd
# User input
fruit = input("filter the data for the kind of fruit: ")
# Import data
df = pd.read_excel("fruit.xlsx")
# Filter for user input
data_frame = df[df["fruit"].str.contains(fruit)]
# Print results
print(data_frame)
**NOTE:**
look at the difference of how we've pasted the arguments in the method
str.contains(). Aboved we've passed "pea" with quotes because we were
searching directly for a string.
In this case, insetead, we have passed "fruit" without quotes because
we have used "fruit" as a variable to invoke the input() function so it
has to be passed as is (with no quotes).
现在,让我们将其保存为fruit.py
,移动到fruit.xlsx
所在的文件夹,并通过终端运行它:
我们通过 CLI 的代码。GIF 由作者提供。
好吧,正如我们所看到的,一切都正常工作。但有一点:我们可以改进可视化吗?如果我们想要更好地展示数据,就像在 Pandas 中一样,会怎样呢?
嗯,我找到的解决方案是使用库 tabulate
(这是文档)。
所以,让我们将 tabulate
添加到我们的代码中,看看会发生什么:
import pandas as pd
from tabulate import tabulate
# User input
fruit = input("filter the data for the kind of fruit: ")
# Import data
df = pd.read_excel("fruit.xlsx")
# Filter for user input
data_frame = df[df["fruit"].str.contains(fruit)]
# Print results
print(tabulate(data_frame, headers='keys', tablefmt='psql'))
然后我们得到了:
我们的 CLI 代码。图片由作者提供。
如我们所见,数据以“表格方式”显示,这样更清晰。此外,正如我们所见,代码可以正确处理拼写错误,如果我们搜索“pea”就像之前在 Jupyter 中那样。
结论
我希望这对你在通过 CLI 显示表格数据时有所帮助。如果你有其他建议,请在评论中告诉我:我总是乐于改进和学习新知识。
-
订阅 我的新闻通讯 以获取更多关于 Python 和数据科学的信息。
-
喜欢这篇文章吗?通过 我的推荐链接加入 Medium:以 5$/月(无需额外费用)解锁 Medium 上的所有内容。
-
在这里找到/联系我: https://bio.link/federicotrotta
-
觉得有用吗? 支持我一下 Ko-fi。
让语言模型更像人脑
原文:
towardsdatascience.com/making-language-models-similar-to-human-brain-b6ea8270be08
神经科学 | 人工智能 | 自然语言处理
在自然语言处理领域,语言模型(LMs)与人脑之间仍存在差距,这激励人工智能(AI)去弥补这一差距。
·发表于 Towards Data Science ·14 分钟阅读·2023 年 3 月 23 日
–
图片由作者使用 OpenAI DALL-E 生成
地球上有数千种脊椎动物物种,但只有一种能够通过语言传达无限的概念。语言传递对人类至关重要,并使他们能够塑造我们所知的故事。
语言模型是否无法匹配这种人类能力?为什么?
一项新的研究尝试基于语言模型和神经科学来回答这个问题。
## 人脑在听语音时的预测编码层级证据 - Nature Human…
最近,在自然语言处理领域取得了显著进展:深度学习算法越来越…
人工大脑和自然大脑如何进行交流?
最近,我们看到 语言模型(LMs)在文本生成、翻译和补全等任务上取得了重大进展。这一切都归功于一个简单却有效的想法:我们可以通过上下文来预测一个词。
尽管这个想法看起来如此简单,但它却是从 BERT 到 ChatGPT 的所有语言模型的基础。每个变换器都基于 嵌入 和 自注意力(这使我们能够将句子中的词关联起来)。
现状、最新消息、影响因素以及正在发生的变化。所有这些都在一篇文章中。
medium.com](https://medium.com/data-driven-fiction/everything-but-everything-you-need-to-know-about-chatgpt-546af7153ee2?source=post_page-----b6ea8270be08--------------------------------)
多年来,作者们尝试检测这些模式的激活与人脑对语言和文本的反应之间是否存在映射关系。多项研究表明,这种映射是线性的,取决于模型预测序列中未来单词的能力。
最近,一项研究显示,甚至可以利用人工智能可视化一个人观察到的图像。表明可以从脑活动记录中重建一个人所见的内容。
研究人员能够使用 fMRI 数据重建图像。
levelup.gitconnected.com](https://levelup.gitconnected.com/stable-diffusion-and-the-brain-how-ai-can-read-our-minds-45398b395ea9?source=post_page-----b6ea8270be08--------------------------------)
人工智能算法是否已经赶上了人类的能力?
不,而且我们对人类语言或相关脑过程的理解也不充分。
然而,人类与这些算法之间仍然存在差距:尽管有大量的训练数据,当前的语言模型在长篇故事生成、总结和连贯对话以及信息检索方面仍然面临挑战;它们未能捕捉到几种句法结构和语义属性,其语言理解仍然肤浅。(来源)
“即使在大量人类上下文和强大的 GPT-2 大语言模型下,Beam Search(大小 32)会导致退化重复(蓝色高亮),而纯采样则导致不连贯的胡言乱语(红色高亮)”来源(这里)
示例展示了即使是最新的语言模型在识别嵌套短语中的主语及其依赖关系时仍然存在问题。无论如何,作者指出,单纯优化下一词预测往往会导致生成不一致且平淡的序列(有时还会出现重复循环)。
预测编码理论 可能为为什么语言模型仍然落后于人类语言提供了解释。这到底是什么?
根据预测编码假说,皮层的结构实现了一种自上而下的预测算法,不断地预测即将到来的感觉刺激。每个皮层区域都拥有一个环境的内部模型,该模型通过汇总支配过去输入的统计规律生成。 (source)
换句话说,大脑保持(并不断更新)对周围环境的心理模型。大脑有一个空间层次(或概念的层次)表示。实际上,皮层是从最简单到最复杂的层次结构组织的。
因此,人脑并不是预测序列中的下一个词,而是在多个时间尺度和不同的表征层次上进行预测,向上层级递进。
“深度语言算法通常训练以从其紧密上下文中预测单词。与这些算法不同,大脑根据预测编码理论进行(1)长程和(2)层次预测。” 图片来源:here,许可证:here
在语言的背景下,这一理论包含可测试的假设,例如大脑应不断预测一个从音素(什么声音可能出现)到单词甚至短语(可能传达什么意义)的语言表征层次。 (source)
例如,以前的研究表明,当参与者听到短语“从前有一个……”时,可以从脑部记录中追踪到单词“时间”(即使在其被发音之前)。
虽然我们对基本原理有一个大致的了解,但实际过程仍不明确。事实上,我们不知道在语言表达过程中,大脑如何实现多层次的预测。
我们为什么关心这个问题?
更好地理解这一过程是修改大型语言模型的第一步。使大型语言模型更类似于人脑,可以帮助我们减少人类与语言模型之间的差距。第三,正如之前所示,映射大脑与模型之间的关系还可以帮助我们更好地理解模型本身。
如何将模型映射到大脑
自然故事听觉范式和数据来源的示意图。来源:here,许可证:here
第一步是,我们能否将神经网络的激活映射到大脑上?它们之间有关系吗?
作者们从叙事数据集开始。该数据集由 345 名受试者在约 4.6 小时内(超过 40,000 个独特单词)听取 27 个不同故事组成。
作者们定义:
-
w 作为一系列 M 词(受试者听到的故事中的词汇)
-
Y 作为由 w 诱发的 fMRI 记录
-
X 作为用 w (从 GPT-2 第 12 层提取)输入的深度语言模型的激活
首先,作者决定量化 fMRI 听觉(Y)与深度语言算法(X)激活之间的相似性,当模型输入相同的故事时。为此,他们创建了一种所谓的“脑评分”。
作者们取用了患者听到的故事中的相同词序列(数据集中包含了转录,并与 fMRI 记录对齐),并将其用作模型的输入。因此,通过输入网络计算一个词的向量(模型根据一个序列预测下一个词)。
一旦获得这些数据,作者们尝试将 Y 激活与音频故事的反应和 X 模式激活进行映射:
为此,我们在训练集上拟合了线性岭回归 W,以预测 fMRI 扫描结果。然后,我们通过计算预测的 fMRI 扫描和实际 fMRI 扫描之间的 Pearson 相关性来评估这种映射 (source)
换句话说,他们在获得 X 的线性投影后,将 X 和 Y 相关联。
结果与之前的研究一致,表明GPT-2的激活准确映射到分布在大脑两个半球的区域。脑评分在听觉皮层以及前颞叶和上颞叶区域达到了顶峰。
此外,这不仅限于 GPT-2,还适用于分析过的其他变换器模型。换句话说,这种映射可以推广到其他最先进的语言模型。
总体而言,这些结果确认深度语言模型线性映射到大脑对口语故事的反应上。 (source)
大脑如何预测长距离的词?
照片 Jessica Yap 来自 Unsplash
变换器 替代了 递归神经网络(RNNs),因为它能够建模长期依赖(输出依赖于过去的输入)。这全因 自注意力 使其能够使用更长的序列作为输入。
正如我们所说,尽管语言模型取得了巨大的进展,但它们与人类之间仍存在很大差距。
通常,在阅读文本、听演讲或对话中,会有许多长期依赖。大脑往往能够轻松地从上下文中预测下一个单词或短语。但大脑是如何处理这些的呢?
接下来,我们测试了增强语言模型的激活与长期预测是否会导致更高的大脑得分。 (source)
换句话说,如果我们添加预测表示,它能否提高我们预测大脑的能力?
作者定义了一个预测窗口,其中包含未来一定数量的单词信息。模型保持不变,只是在这种情况下,输入也附加了预测表示(预测窗口)。对于距离 d(单词数量),预测窗口是当前单词的七个连续单词的网络激活的串联。
我们不将未来的单词串联在序列中,而是将模型的激活进行串联,因此我们并不将未来的单词提供给模型,而是它们的表示。
“预测得分”简单来说就是“将预测窗口与当前 GPT-2 激活拼接时,大脑得分的增益。” 或者用简单的话说,就是对下一个单词的表示在多大程度上有助于我们预测大脑活动。
“c,测试是否添加未来单词的表示能改善这种相关性。d,上图中,一个平坦的预测得分在不同距离下表明预测表示并没有使算法更类似于大脑。下图中,相反,预测得分在d > 1 处达到峰值则表明模型缺乏类脑预测。Fd 的峰值指示了算法需要预测表示的未来距离,以便与大脑最相似。” 图像来源:这里,许可证:这里
我们的结果表明,F 在 d = 8 个词的距离处达到最大值,并在通常与语言处理相关的区域达到峰值(图 2b–d)。作为比较,刺激中每秒平均有 2.54 个词。因此,8 个词对应于 3.15 秒的音频(两个连续 fMRI 扫描的时间)。 (来源)
简而言之,作者注意到几个有趣的事项:
-
从零到 10 的每个词都有助于这种预测效果。
-
最佳窗口大小大约是八个词。
-
随机预测表示未能帮助预测脑部活动。
-
你甚至可以使用 GPT-2 生成的词代替序列中的真实词(未来词)。这显示了类似的结果,但效果较小。
综合来看,这些结果揭示了大脑中的长程预测表示,代表了大脑评分的 23%(±9% 跨个体)的改善。 (来源)
作者换句话说,这些数据确认了过去和当前的词表示占据了语言理解中涉及的大脑信号的很大一部分。确实,这些信号映射到以前定义的 语言网络。
大脑解剖学研究表明,皮层是按层级组织的。输入和信息以层级方式处理,因此低级声学、音素和语义由大脑中的不同结构按照精确的层级编码。
这是不同区域如何在自然语言中编码不同任务的示例。来源 (这里)
因此,作者提出了一个问题:“这一皮层层级的不同层次是否预测相同的时间窗口?”
换句话说,他们测试了预测范围在皮层层级中的变化。他们随后研究了不同区域如何影响预测分数及其在词距离 d 上的变化。
结果表明,前额叶区域的预测平均而言,比颞叶区域更偏向未来。 (来源)
已经展示了区域之间存在差异,仍然有几个问题。这种时间差异与上下文有什么关系?在句法和语义内容方面是否存在差异?
如所示,变换器编码语言表示的方式具有层次结构。例如,BERT的各层捕获了不同的表示。较低的层捕获短语级别的信息,然后这些信息会被稀释。各种语言信息是以层次化的方式学习的,较低层学习表面特征,中间层学习句法特征,高层学习语义特征。
为此,作者计算了预测得分,但使用了不同级别的 GPT-2。然后,他们将这些预测得分按级别映射到脑区。
总的来说,这些结果表明,额顶皮层的长期预测比低级脑区的短期预测更具上下文关联性和更高层次。 (source)
换句话说,模型各层的不同表示(正如我们上面所说的,模型层的复杂性随着选择的层的深度而增加)在大脑中的映射方式不同。预测的深度与皮层层级之间存在对应关系。
低级预测(低级信息)在处理高层预测(中颞叶、顶叶和额叶区域,这些区域处理预测和复杂信息整合)的脑区之外的不同脑区(具体来说是上颞沟和脑回)中进行预测和分析。
作者然后提取了句法和语义预测表示,对于每个词及其上下文,他们生成了 10 个可能的未来,这些未来具有与原始句子相同的句法。实际上,给定一个句子开头,他们生成了 10 种不同单词的续写,但具有相同的句法属性(词性和依赖树)。然而,这些句子具有不同的语义(即不同的含义)。
然后,他们提取了 GPT-2 的激活(第 8 层),并对这十种可能的未来进行了平均,以提取各个未来的共同句法组件。进一步地,他们将这种平均(句法表示)从实际词序列的激活中减去(以获得纯粹的语义表示)。然后,他们构建了一个语义和语义分开的预测窗口:
我们通过分别连接七个连续未来词的句法和语义组件,构建了句法和语义预测窗口。 (source)
这种方法允许将激活分解为两个组件,一个是语义的,另一个是句法的。一旦完成这些操作,作者计算了预测评分,如之前所见,显示出大脑活动的差异。
结果显示,语义预测是长距离的(d* = 8),并涉及一个分布广泛的网络,主要集中在额叶和顶叶。相比之下,句法预测(图 4b)相对短距离(d* = 5),并局限于上颞叶和左额叶区域(图 4c,d)。 (source)
正如作者所指出的,这些结果表明大脑进行多层次的预测,不同区域有不同的任务:
上颞叶皮层主要预测短期、浅层和句法的表示,而下额叶和顶叶区域主要预测长期、上下文、较高层次和语义的表示。 (source)
我们可以在语言模型中实现预测编码吗?
他们从之前的结果中注意到了他:
这些结果显示,将 GPT-2 当前和未来词的表示进行串联,可以更好地模拟大脑活动,特别是在额顶区。 (source)
这些原则可以转化为 GPT-2 训练吗?
换句话说,使用微调是否可以让模型学习预测更长范围、更有上下文且更高层次的表示?如果可以,这是否改善了模型的脑图谱?
为了测试这一点,作者决定对 Wikipedia 上的 GPT-2 进行微调。他们决定改变目标训练方式,而不是使用语言建模方法(即给定前一个词序列预测下一个词),他们决定在经典目标的基础上增加高层次和长距离目标,模型还必须预测序列中远离的词的高层次表示。
具体而言,模型不仅需要预测下一个词,还需要预测后续词的表示。模型还必须预测序列中距离为 d=8 的单词的未微调 GPT-2(第 8 层)模型的隐藏状态。然后,模型还会学习序列中下一个词的长期、高层次和更具上下文的表示。
结果表明,GPT-2 在高层次和长范围建模下的微调最能解释前额顶叶反应(图 5,在 IFG 和角回/上缘回平均增益>2%,所有P < 0.001)。这些结果进一步强化了前额顶叶区域在预测长距离、上下文和高层次语言表示中的作用。 (source)
简单来说,提供这种上下文表示使模型更能预测大脑活动。
结束语
图片由 Anete Lūsiņa 在 Unsplash 提供
这项研究在更好地理解大脑如何理解语言和作出反应方面提出了有趣的观点,并且探讨了神经科学与机器学习之间的联系。
通过更好地理解这些机制,我们可以设计出与人脑更为相似的人工智能模型。当前的语言模型在给定前文的情况下预测下一个词,但人脑考虑的是上下文和未来的可能性。实际上,大脑预测传感器输入,然后将其预测与现实进行比较,然后更新自身的内部模型表示。
因此,未来的模型在训练过程中可能需要考虑未来单词的远程和抽象表示。在这项研究中,他们展示了甚至不需要改变模型的架构,但未来的模型可以重新调整其结构以提高效果。
此外,正如在其他背景中所示,未来的观察(例如,未来待分类的图像)确实保持不确定,其潜在表示更加稳定。这就是为什么像对比学习这样的办法已被证明更有效。所以,如果这已被证明有效,为何不在具有更多上下文信息和更多关于未来潜在表示的信息的语言模型架构和训练中实施它呢?
作者指出,然而,这项研究仍处于初步阶段:
最后,目前测试的预测编码架构仍然很初步。需要对这一方法在自然语言处理基准上的系统性推广、扩展和评估,以证明使模型更接近大脑的有效实用性。 (source)
无论如何,自从 Transformer 发布以来,模型变得更大了,但结构几乎保持不变。为了克服当前语言模型的局限性,我们需要对架构和训练进行修改。还有什么比人脑更好的灵感来源呢?
如果你觉得这很有趣:
你可以查看我的其他文章,你也可以订阅以便在我发布文章时获得通知,还可以通过LinkedIn与我联系。
这是我的 GitHub 仓库链接,我计划在这里收集与机器学习、人工智能等相关的代码和资源。
[## GitHub - SalvatoreRa/tutorial:关于机器学习、人工智能、数据科学的教程……
关于机器学习、人工智能、数据科学的教程,包含数学解释和可重用的代码(用 Python 编写……
或许你会对我最近的一篇文章感兴趣:
Google 的新模型经过训练可以回答医学问题。如何做到这一点?
META 的 LLaMA:小型语言模型战胜巨头 [## META 的 LLaMA:小型语言模型战胜巨头
META 开源模型将帮助我们理解语言模型偏见的产生
META 的 LLaMA:小型语言模型战胜巨头 [## 稳定扩散技术填补医学图像数据的空白
一项新的研究表明,稳定扩散技术可能有助于医学图像分析和稀有疾病研究。如何做到这一点?
为什么我们有巨大的语言模型和小型视觉变换器? [## 为什么我们有巨大的语言模型和小型视觉变换器?
Google ViT-22 为新的大型变换器铺平道路,革新计算机视觉
作为分析师的错误——以及应对策略
原文:
towardsdatascience.com/making-mistakes-as-an-analyst-and-strategies-to-deal-with-them-b4d486d7c4dd
曾经因为分析中的错误被指出而感到焦虑吗?你并不孤单。
·发表于 Towards Data Science ·6 min read·2023 年 10 月 17 日
–
来源:Unsplash
制作错误分析并根据我的结果将组织引导到错误方向,一直是我开始作为分析师以来最大的恐惧之一。老实说,被暴露和被指出我的错误甚至更让我感到焦虑。
我的噩梦场景:根据我的建议,我的团队花费数月时间开发的一个主要功能在测试中未能提供价值。人们开始提出问题,经过调查后,发现我的假设是基于错误的分析结果。
自那时以来,与许多分析师交谈和指导后,我了解到我并不是唯一有这种感觉的人。相反,这是许多分析师共有的非常普遍的恐惧。
我们为何对我们的分析感到焦虑
对于分析感到焦虑的原因非常明显:发布和推广错误的结果和建议不仅影响整个组织,同时也对我们个人带来风险。
尽管存在这些风险,避免分享分析或回避有争议的或挑战假设的结果并不是正确的方法。事实上,这些分析往往是最重要的。相反,关键是制定有助于减少产生错误输出风险的策略。 这从欣赏以下几点开始:
作为分析师犯错误是非常容易的。
分析师在一个高度复杂的环境中工作,拥有很高的自由度,因此有许多机会犯错或得出错误结论。
进行分析涉及几个不同的步骤:
-
定义研究问题和方法
-
收集和清理数据
-
数据的分析和解释
-
结果的可视化和沟通
在每个阶段,犯错都是相当容易的,而这些错误最终会反映在我们的建议和组织采取的行动中。但同时,我们可以使用不同的策略来最小化这种风险。
在开始分析之前设置一个合适的基础
在开始编写第一行代码并深入数字之前,至关重要的是对分析的目标和达成目标的方法达成一致。我在职业生涯初期学到,分析特定问题对不同的人可能意味着非常不同的事情:例如,分析新功能的性能是否意味着调查哪些用户群体使用该功能、该功能驱动了哪些动作(以及可能的收入)或对生态系统其他部分的副作用是什么(或者这些都包括在内,这种情况下我们需要讨论时间线)?
每当我开始进行新的分析时,我通常会制定一个简短的分析计划并与我的同事和利益相关者讨论,以获得早期反馈。这些早期反馈让我可以提前验证我的分析计划,并在必要时进行调整。同时,这也使我能够将分析集中在真正需要的方面,而不是生成一个非常广泛、工作量大的文档,试图涵盖特定问题的每一个角度。
下一步是研究过去是否进行过类似的分析。你可能不是第一个研究特定主题的人,特别是如果你在一个有多个分析师的团队中。确保检查是否有人在你之前已经研究过相同的问题以及他们使用的方法。这可以再次帮助验证你的方法,为如何结构和处理你的分析提供更多灵感,并作为与利益相关者达成交付物一致的模板。
来源:Unsplash
利用以往的工作来验证你的方法和结果
一旦分析的目标和方法达成一致,最终就可以开始运行第一个查询并深入数据。在分析结果和所采用的方法上,利益相关者不应再有任何惊讶,但在处理数据时仍然有很多可能出错的地方:使用错误的数据集、编码错误或逻辑错误,几乎有无尽的潜在错误空间。
以前的分析和查询可以是增强你对结果信心的绝佳方式。检查和比较其他人如何使用特定的数据表和字段(即使他们调查了不同的问题):是否有特定的人群你不应包括在分析中?是否有需要警惕的例外或边缘情况?
如果有以前的分析涉及相同或类似的问题,确保将这些结果与你当前的结果进行比较。是否在特定数字上存在较大差异?如果有,是否可以通过业务变化或不同的基本假设来解释,还是数据问题可能导致了差距?
持续分享进行中的工作
一旦分析有了些许成果,持续与利益相关者和同事分享你的进行中的工作以寻求早期反馈是一个好主意。虽然最初呈现不成熟或不完整的结果可能有些不安,但这对于早期发现差距和潜在的后续问题至关重要。
在开始分享我的工作时,我还会尝试发现差距并预测人们在阅读我的结果和建议时可能会有的问题:在漏斗中是否有特别的下降点,需要更多的清晰度来解释为什么会发生这种情况?我的结果是否与之前的假设一致,如果不一致,是否需要额外的背景信息?
同时,呈现不成熟的结果并不意味着呈现一个难以消化的粗糙作品。你的(早期)分析的外观不仅有助于传达当前状态和下一步,还能建立对你工作质量的信任。根据我的经验,即使是仍在进行中的工作,也值得花额外的精力使分析从一开始就看起来专业,以促进持续的讨论。这也有助于你自己构建你希望通过数据呈现的叙事。
构建一个最小化错误空间的环境
最终,拥有正确的分析文化对于促进健康的讨论和建立有助于最小化错误的流程至关重要。这包括但不限于创建一个开放的环境,在这里可以公开分享和讨论进行中的工作,重点在于共同提升彼此的工作。
采用适当的工具和机制来利用彼此的工作,可以极大地提升你和你的团队所产出的工作的质量。首要任务是,分享用于生成分析结果的查询和代码应当成为组织中的最佳实践。直接将来源链接到分析结果,对于重现结果和学习彼此的方法是非常有帮助的。
此外,将管道工作作为每次分析的核心部分有助于降低复杂性。我见过分析师从头开始构建各种复杂的查询,以得出相同的指标或见解(我自己也犯过这种错误)。然而,通过将特定的指标或数据字段集成到管道中,使这些数据对其他人可用,不仅有助于减少复杂性和工作量,还能标准化某些定义和方法,使来自不同分析的结果更容易进行比较。
将错误转化为成功
在某些时候,我们必须接受无论我们做什么,总会有人为错误的可能性。上述策略通常有助于降低这种风险,但在某些情况下,错误可能仍然会出现。如果发生这种情况,重要的是从错误中学习并对其保持开放态度。
归根结底,尽管采取了所有预防措施,错误是人类的特性,难免会发生。犯错是学习和成长的自然部分。
在这些情况下,我们必须前进并从错误中学习。然而,在许多情况下,我们的团队也可以从我们的错误中学习。公开讨论错误和不良结果可以帮助下一位避免完全相同的错误,并总体上提高团队工作的质量。
所以下次你犯错时(尽管采取了上述所有预防措施),我强烈建议你考虑将其作为经验教训公开分享给你的团队,并将这些讨论作为你们文化的一部分。
通过源分离实现音乐标记 AI 的可解释性
让我们打开黑匣子
·
关注 发表于Towards Data Science ·10 min read·Apr 4, 2023
–
图片由Jadson Thomas,Clem Onojeghuo和Dmitry Demidov提供。
介绍
为什么我们需要这个?
音乐标记的 AI 系统已经存在了一段时间。自 2010 年代中期以来,音乐流媒体服务一直在竞争最具创新性的音乐推荐系统,后台使用复杂的标记 AI。逐渐地,制作音乐库和音乐标签公司开始关注标记 AI,用于对其庞大的音乐数据库进行分类、过滤和查询。今天,甚至艺术家们也在使用自动标记系统,以获得对自己音乐的客观见解,找到合适的受众。
尽管自动标签系统广泛存在,但其内部工作原理鲜为人知。由于音频数据复杂且高维,深度学习模型在音乐标记任务中始终优于传统的机器学习方法。深度学习的问题是显而易见的:通过构建越来越复杂和高效的模型,我们牺牲了可解释性。深度学习模型实际上是黑箱,我们无法确切了解内部发生了什么。
本项目的目标
本项目旨在通过将音轨拆分成其乐器来源(stem)并观察分类如何变化,来阐释音乐标记 AI 系统的行为。这种方法受到了一个著名的可解释 AI(XAI)概念的启发,称为Shapley 值。
Shapley 值来源于合作博弈论。假设我们有不同的玩家,他们可以组成“联盟”来实现共同目标。目标是为每个玩家分配一个值,表示将他们加入联盟通常如何改善结果,即确定他们的公平份额。那么,这个概念与音乐标记和乐器源分离有什么关系呢?
图 1 帮助你理解博弈论与音乐分类器之间的类比。如果一首曲目被 AI 标记系统指定为“爵士”风格,我们可能会想知道乐队中的每种乐器(鼓、吉他、声乐)对这一分类的贡献有多大。换句话说:我们想找出每种乐器对使曲目听起来像“爵士”音乐有多重要。
图 1:本项目目标的插图。图像由作者提供。
方法
示例音乐
所有用于此分析的示例曲目均取自Free Music Archive (FMA),这是一个包含成千上万的免版权音乐片段的数据集。第一个示例是一首包含多个失真的吉他、重鼓和开头较柔和男声的曲目。这首曲目将作为我们的**“摇滚”示例**。
摘自 Aviv Mark 的《Wonder 的面貌》(CC BY-NC-ND 3.0 许可证)。
下一段音乐包含步伐感强的贝斯、扫帚鼓、轻松的吉他和一个主导的即兴钢琴。这将作为我们的**“爵士”示例**。
摘自 Quantum Jazz 的《Jingle Jazz》(CC BY-SA 3.0 许可证)。
第三条也是最后一条轨道是“爵士”和“摇滚”流派的混合,结合了布鲁斯风格的钢琴、带有轻微摆动的鼓、失真的电吉他和更像摇滚的声音。这一片段将作为我们的**“混合流派”示例**。
摘自 Sakee Sed 的《Vermouth 和 Baby》(CC BY-NC-ND 3.0 许可证)。
源分离与重组
对于这个项目,我使用了LALAL.AI 的源分离工具,这是一家专门从事此技术的初创公司。虽然还有许多其他竞争解决方案,如 Spleeter 或 Vocalremover.org,但在我对他们的在线演示印象深刻之后,我选择了 LALAL.AI。此外,他们还非常友好地提供了进行本文所需源分离工作的资源。
在将三条轨道拆分成其乐器源后,我将这些孤立的源组合起来,形成每条轨道的所有可能源组合。对于具有 4 个源(“摇滚”和“爵士”)的轨道,这导致了 15 个新的音频文件,从单一的鼓轨道到完整的乐队设置。而对于有 5 种乐器的“混合流派”轨道,总共有 31 种组合可能。每种组合都类似于 Shapley 值博弈理论中的“联盟”概念。
流派与心情标记
至于自动标记 AI,我使用了另一个名为“Cyanite AI”的服务。Cyanite 是一个自动标记工具,提供来自不同类别的标签,如流派、心情或乐器。虽然还有其他自动标记提供商,如 AudioRanger 和 Songtradr 的 musicube,但我对 Cyanite 的产品非常熟悉,因为我曾作为工作学生为其做过贡献。Cyanite 还慷慨地为我提供了分析本项目示例轨道的资源。
自动标记器为每个标签输出 0 到 1 之间的分数,表示标签与轨道的匹配程度(1 表示非常匹配,0 表示不匹配)。这个输出值可以解释为轨道是“摇滚”、“金属”还是“悲伤”或“愤怒”的程度。
计算 Shapley 值
对于每条轨道,我分析了所有源联盟的两个最显著的流派和心情。为了获得乐器的 Shapley 值,我计算了每个乐器缺席的联盟与该乐器存在的联盟之间的流派和心情评分差异。这些差异的平均值,即将该乐器添加到混音中的平均贡献,就是 Shapley 值。
结果
摇滚轨道
摘自 Aviv Mark 的《Wonder 的外观》(CC BY-NC-ND 3.0 许可证)。
“摇滚”轨道被自动标记工具标记为“摇滚”和“金属”流派,以及“充满活力”和“攻击性”心情。
图 2:基于 Stem 的“摇滚”轨道 Shapley 值。图像来源:作者。
我们能看到什么?
图 2 显示了每个乐器来源对各自标签的贡献。例如,我们可以看到,电吉他平均增加了“金属”评分超过 50 个百分点。另一方面,“摇滚”评分仅增加了大约 5 个百分点。从中我们可以看出,电吉他的声音更像是一把“金属”吉他,而不是“摇滚”吉他。对于人声,则正好相反:人声显著提高了“摇滚”评分,同时降低了“金属”评分。这告诉我们,这首歌中的人声和电吉他在风格上相互对比。这不是很酷吗?
从情绪的角度来看,我们可以看到电吉他在表达这首曲目的“充满活力”和“攻击性”情绪方面特别重要。与风格图不同,所有乐器似乎都传达了相同的情绪,只是程度不同。有趣的是,贝斯乐器似乎对风格或情绪评分没有贡献。这可能是因为贝斯的表现不够鲜明,要么是因为它比较安静,要么是因为它的演奏方式不具备某种特定风格或情绪的特点。
我们能用它做什么?
Shapley 值方法已经帮助我们通过分析哪些乐器以何种方式对我们感兴趣的特定风格或情绪做出贡献(或相反),来理解自动标记系统的输出。例如,如果我们希望这首曲目获得更高的“金属”评分,我们应该考虑用不同的歌手或唱腔重新录制人声。为了使其更“摇滚”而不那么“金属”,我们可以尝试降低电吉他的失真度。
爵士曲目
摘自 Quantum Jazz 的《Jingle Jazz》(CC BY-SA 3.0 许可证)。
对于“爵士”曲目,唯一的音乐风格输出为“爵士”,情绪输出为“愉快”和“放松”。
图 3:基于 Stem 的 Shapley 值用于“爵士”曲目。图像由作者提供。
我们能看到什么?
图 3 显示了钢琴和鼓使这首歌听起来特别“爵士”。虽然从音乐的角度来看,贝斯和电吉他在录音中也表现得非常“爵士”,但突出钢琴和鼓是有道理的,因为它们在混音中更为突出,似乎承载了歌曲的“风格重量”,在我听来。单凭鼓和钢琴就能做出一首听起来很棒的爵士曲目,而如果只有吉他和贝斯,没有其他乐器的话则会显得奇怪。
情绪分析揭示了所有乐器对相同情绪的积极贡献。然而,钢琴和鼓比对“轻松”情绪的贡献更多地提高了“快乐”分数。电吉他和贝斯则相反,它们对曲子的“轻松”分数贡献更多。这一点很有趣,因为尽管钢琴和鼓也是情绪标签中最重要的乐器,但如果没有电吉他和贝斯或它们的演奏方式不同,这首曲子会显著地少一些“轻松”感。
我们可以用它做什么?
通过我们的分析,我们再次获得了哪些乐器对曲目标签最重要的见解。此外,我们还可以看到,通过改变一些乐器的演奏、录制或混音方式,我们现在可以操控歌曲的情绪特征。
混音曲目
摘自 Sakee Sed 的《Vermouth and Baby》(CC BY-NC-ND 3.0 许可证)。
正如预期,这首曲子被标记为“摇滚”和“爵士”。至于情绪,“快乐”和“轻松”也被标记了。
图 4: “爵士”曲目的基于干音的 Shapley 值。作者提供的图像。
我们可以看到什么?
图 4中展示的结果令我非常惊讶!首先,我们的方法识别出钢琴非常“爵士”,并且不太适合“摇滚”风格。另一方面,声乐非常不典型于“爵士”,更倾向于“摇滚”分类。其他乐器也是对比性的,即它们指向两个风格方向中的任何一个,但它们的整体贡献分数确实很低。
我们首次看到了一些对比性的情绪分数贡献,尽管数值较小。图表暗示,声乐和鼓使得这首曲子更“快乐”而更少“轻松”。然而,大部分的权重还是由钢琴承担的,这使得曲子更“快乐”且更“轻松”。
我们可以用它做什么?
这项分析为我们提供了一些关于哪些乐器对自动标记 AI 的风格和情绪输出有贡献的宝贵建议。我们还可以看到,去掉或改变钢琴部分会使这首曲子少一些“爵士”风格,但同时也可能减少其“快乐”和“轻松”感。
讨论
什么效果良好?
本文的整体目标是找到一种算法解决方案,通过源分离为黑箱自动标记系统提供局部解释,这一目标已经达成。生成的解释提供了每种乐器如何对自动标记系统的风格和情绪输出做出贡献的见解。尽管我们只查看了几个选定的风格和情绪,但这种方法可以扩展到其他标签,如年代、品牌价值、地点等,而无需额外的努力。
我可以看到这种方法可以在两个用例中对音乐家的工作有所帮助。
-
音乐家可以使用它来检查他们的音乐是否以他们认为合适的方式被 AI 解读。如果不是这样,Shapley 值会给出关于哪些乐器可以更改以实现这一目标的建议。这可以帮助音乐家在音乐目录或流媒体服务中获得更好的可见性。
-
最后,这种方法对创作和制作过程本身可能是有用的。音乐家可以分析他们的演示,并获得一些关于歌曲中每个乐器的特征,如哪些流派、情绪等的 AI 反馈。这可以帮助作曲家进一步完善他们的作品或尝试新的风格方法。
有哪些方面表现不佳?
提议的算法主要问题是资源效率低。输入的音乐轨道必须被拆分成所有存在的乐器/乐器组。这本身就需要很长时间,因为音乐源分离系统复杂且需要大量计算能力。然后,所有乐器源的组合被生成并分别输入到 AI 自动标签器中。如果我们在轨道中有 6 个乐器源,这意味着自动标签器需要处理 31 条轨道而不是仅仅一条。一旦完成,Shapley 值至少可以非常高效地计算。总的来说,对少量轨道进行这种处理是可行的,但在当前技术下,规模化应用此算法可能超出了范围。
这种方法的另一个弱点是,尽管源分离工具在过去几年中取得了显著进步,但结果仍然不完美。如果我们自动化算法而不逐个检查每个分离的源,我们将无法发现分离效果不佳的情况。这可能会严重扭曲分析结果。
下一步可能是什么?
提议的方法具有较高的算法复杂性,因此在轨道中乐器数量增加时不易扩展。此外,目前我们是否可以充分依赖源分离系统的质量尚不清楚。随着计算资源变得更便宜以及源分离工具的质量进一步提高,这两个挑战将不再是问题。然而,算法复杂性仍将是一个问题,除非找到并开发出一种高效的近似算法。
为这篇博客文章编写的代码远非高效,仅仅是为了文章目的而创建的。虽然我会在GitHub上发布代码,但我建议不要将其作为实际应用该算法的基础。我认为,最好从头开始构建一个高效的多阶段处理流程,并注重细节。基于云的实现看起来很有前途,因为大多数处理过程可以通过利用并行计算来大幅加速。
从宏观角度来看,这种方法将 Shapley 值的概念应用于音乐作品的抽象特征,而不是 AI 所看到的“真实”数据(例如,光谱图或波形的值)。我相信这种特征抽象的方法在其他使用非表格数据训练 AI 模型的领域也有其他应用(例如图像、文本、语音)。例如,我们可以将一段文本拆分成单独的句子,并尝试类似于我们在这里做的事情。通过这种方法,我们可能能够识别出邮件中哪个句子导致邮件被分类为垃圾邮件。一定还有更多类似的应用等待发现和实施!
非常感谢你的阅读!
我写了很多关于 AI 和音乐的文章。以下是一些相关的帖子,你可能会感兴趣:
-
使用 Spotify 的 Pedalboard 进行自然音频数据增强
-
使用分治法 CRNN 进行音乐分类
了解 A/B 测试的意义:通过困难问题更好地理解
通过具有挑战性的问题揭示 A/B 测试中反直觉的方面,提升你的理解,并避免错误
·
关注 发表在 Towards Data Science · 6 分钟阅读 · 2023 年 7 月 4 日
–
照片由 ALAN DE LA CRUZ 提供,来源于 Unsplash
这篇文章强调了实验中常见的统计错误。它以五个问题和答案的形式展开,这些答案常常让人感到直觉上不对劲。它专为那些已经熟悉 A/B 测试但希望扩展理解的人群量身定制。这可以帮助你在日常工作中避免常见错误或在面试中表现出色。
问题 1:你进行了一个 A/B 测试(α = 0.05, β = 0.2),结果具有统计学意义。在这种情况下,它是真阳性的可能性有多大?
想象一下,如果你只测量有效的假设。那么,100%的成功 A/B 测试将是真阳性。当你的所有假设都无效时,100%的成功 A/B 测试将是假阳性。
这两个极端的例子旨在说明,没有额外的步骤——对假设分布的假设——是不可能回答这个问题的。
再试一次,假设我们测试的 10%的假设是有效的。那么,从 A/B 测试中观察到统计显著的结果意味着有 64%(根据贝叶斯定理,(1–0.2)*0.1 / ((1–0.2)0.1 + 0.05(1–0.1)))的机会它是真阳性。
作者提供的图像
问题 2:假设原假设成立。在这种情况下,更高还是更低的 p 值更可能出现?
很多人认为是前者。这似乎是直观的:当没有效应时,结果更可能远离统计显著性,因此 p 值更高。
然而,答案是否定的。当原假设成立时,p 值是均匀分布的。
混淆的原因在于,人们通常通过 z 分数、样本均值或样本均值的差异来可视化这些概念。所有这些都是正态分布的。因此,可能很难理解 p 值的一致性。
让我们通过一个模拟来说明这一点。假设治疗组和对照组均来自同一个正态分布(μ = 0, σ = 1),这意味着原假设成立。我们将比较它们的均值,计算 p 值,并多次重复这个过程。为了简化起见,我们只关注治疗组均值较大的情况。然后,我们再看看 p 值在 0.9 到 0.8 和 0.2 到 0.1 之间的情况。
当我们将这些 p 值区间映射到我们模拟的分布上时,图像变得更加清晰。尽管接近零的分布峰值较高,但此处区间的宽度较窄。相反,当我们远离零时,峰值缩小,但区间的宽度增加。这是因为 p 值的计算方式使得等长区间包含曲线下相同的面积。
作者提供的图像
问题 3:由于一些技术或业务限制,你进行了一个样本量较小的 A/B 测试。结果勉强显著。然而,效应值很大,比你在类似 A/B 测试中通常看到的更大。效应值的增大是否能增强你对结果的信心?
不一定。为了将效应归类为显著,它必须与零的距离为正负 2 个标准误差(当α = 0.05)。随着样本量的缩小,标准误差通常会增加。这意味着在小样本中观察到的统计显著效应往往更大。
以下模拟演示了:这些是当两个组(N=1000)都从相同的正态分布(μ = 0,σ = 1)中抽样时的显著 A/B 测试的绝对效应值。
作者提供的图像
问题 4:让我们基于之前问题中获得的理解继续探讨。是否可以检测到小于 2 个标准误差的真实效应?
是的,尽管这里的语义比较模糊**。** 真实效应值可能显著小于 2 个标准误差。即便如此,你仍然会预期一定比例的 A/B 测试显示统计显著性。
然而,在这些条件下,你检测到的效应值总是被夸大的。假设真正的效应是 0.4,但你检测到的效应是 0.5,且 p 值为 0.05。你会认为这是真阳性吗?如果真正的效应值只有 0.1,但你又检测到效应为 0.5 呢?如果真正的效应仅为 0.01,那这仍然是一个真阳性吗?
让我们可视化这个场景。对照组(N=100)从正态分布(μ = 0,σ = 2)中抽样,而处理组(N=100)则从相同的分布中抽样,但μ从 0.1 到 1 变化。无论真实效应大小如何,成功的 A/B 测试生成的估计效应值至少为 0.5。当真实效应小于这个值时,结果估计显然被夸大了。
作者提供的图像
这就是为什么一些统计学家避免将结果划分为“真阳性”或“假阳性”这样的二元类别。他们更倾向于以更连续的方式处理这些结果[1]。
问题 5:你进行了 A/B 测试,结果显著,p 值为 0.04。然而,你的老板仍然不相信,并要求再做一次测试。这个后续测试没有产生显著结果,p 值为 0.25。这是否意味着原始效应不真实,初始结果是一个假阳性?
将 p 值解释为二元的、词典式的决策规则总是存在风险。让我们回顾一下 p 值实际上是什么。它是惊讶的度量。它是随机的,是连续的。它只是证据中的一部分。
设想第一个实验(p=0.04)是在 1,000 人中进行的。第二个实验(p=0.25)则是在 10,000 人中进行的。除了质量上的明显差异外,正如我们在问题 3 和 4 中讨论的,第二个 A/B 测试可能估计的效应大小要小得多,可能在实际中不再具有显著意义。
让我们倒过来看这个场景:第一个(p=0.04)是在 10,000 人中进行的,第二个(p=0.25)则是在 1,000 人中进行的。在这种情况下,我们对效果‘存在’的信心更大。
现在,假设两个 A/B 测试是相同的。在这种情况下,你观察到了两个相当相似的、稍微令人惊讶的结果,它们都与零假设不太一致。它们落在 0.05 的两侧并不是特别重要。重要的是,在零假设为真时,连续观察到两个小 p 值是不太可能的。
我们可能需要考虑的一个问题是,这个差异本身是否具有统计显著性。以二元方式分类 p 值会扭曲我们的直觉,让我们相信不同侧的 p 值之间存在巨大甚至本体上的差异。然而,p 值是一个相当连续的函数,尽管两个 A/B 测试的 p 值不同,但它们可能对零假设提供了非常相似的证据[2]。
另一种看待这个问题的方法是结合证据。假设两个测试的零假设都为真,根据Fisher 方法,组合后的 p 值为 0.05。还有其他方法可以结合 p 值,但基本逻辑相同:在大多数情况下,尖锐的零假设并不现实。因此,即使这些结果在统计上没有单独显著,足够多的‘令人惊讶’的结果也可能足以拒绝零假设。
通过使用 Fisher 方法融合两个 p 值。图片来源:Chen-Pan Liao,来自维基百科
结论
我们常用的零假设检验框架,在分析 A/B 测试时并不是特别直观。没有经常的心理训练,我们常常会退回到‘直观’的理解,这可能会误导我们。我们也可能会形成一些例行程序以减轻这种认知负担。不幸的是,这些例行程序往往变得有些仪式化,遵守正式程序的过程掩盖了实际推断的目标。
参考文献
-
McShane, B. B., Gal, D., Gelman, A., Robert, C., & Tackett, J. L. (2019). 放弃统计显著性。美国统计学家, 73(sup1), 235–245.
-
Gelman, A., & Stern, H. (2006). “显著”和“非显著”之间的差异本身并不具有统计显著性。美国统计学家, 60(4), 328–331.
理解大型语言模型的承诺(及风险)
·
关注 发表在 Towards Data Science ·发送至 通讯 ·4 分钟阅读·2023 年 4 月 27 日
–
尽管 ChatGPT 和类似工具在最近几个月中占据了我们大量的关注,但大型语言模型(LLMs)——这些支撑着我们无休止分享、截图,偶尔摇头的聊天输出的基础设施——却一直处于(相对)默默无闻的状态。
从某种程度上说,这很有道理:当你在笔记本电脑上观看节目时,你专注于情节和角色,而不是使那些移动像素成为可能的电网。如果你现在正在吃饼干(就像…一些 TDS 编辑,可能如此),你可能在思考你正在享受的风味和口感,而不是,比如说,关于小麦农民或可可豆的历史。
然而,作为数据专业人员,我们只有通过深入和细致地理解 LLM 才能受益。当然,这有一个职业角度,但也有一种更模糊的享受,即了解某些复杂而神秘的事物在幕后实际是如何运作的。为了给你提供帮助,我们汇集了一系列优秀的文章,探讨了 LLM 的过去、现在和未来——并讨论了它们的惊人能力和非同小可的局限性。请享用!
-
后 ChatGPT 时代的机器学习研究。一些最普遍的 LLM(如 OpenAI 的 GPT 模型)的内部运作仍被企业严格保密。这对那些未来项目很可能会遇到专有壁垒的 NLP 研究人员意味着什么?安娜·罗杰斯提出了一个有力的观点:“那些不开放且不合理可重复的东西不能被视为必要的基线。”
-
评估最近在对话 AI 方面的进展的影响。LLM 的规模和力量使得人机互动在短短几个月内取得了巨大的飞跃。加迪·辛格反思了我们如何走到这里——以及在机器开始以类人方式交流之前,还缺少什么。
-
欢迎来到一个新的伦理(和实际)困境。LLM 需要大量的训练数据,这已成为一个主要的风险因素。这些模型目前面临着对可能存在的偏见、私人或有害文本以及未经授权的版权材料的严密审查。在此期间,用户该如何做?凌娟·吕的首篇 TDS 文章对我们在负责任地生产 AI 生成内容时应了解的风险和危险进行了深思熟虑的概述。
-
LLM 驱动工具的广阔视野。仅几个月前,LangChain 库还未引起大多数从业者的注意。现在不同了:它已经成为许多想利用 LLMs 构建新应用程序的人的首选资源。Varshita Sher 博士的最新深度剖析是该库核心构建模块的有益、实用介绍。
-
使用 LLMs 识别漂移和检测异常。随着使用 ChatGPT 生成生硬诗歌的新奇感逐渐消退,新的用例继续出现 —— 其中许多可能会简化数据科学工作流程。举例来说,Aparna Dhinakaran,Jason Lopatecki 和 Christopher Brown 的最新文章,概述了使用 LLM 嵌入进行异常和漂移检测的有前景方法。
-
额外阅读:深入一层。如果语言模型(LLMs)使用户界面应用如 ChatGPT 成为可能,那么转换器神经网络是首先使 LLMs 成为可能的架构。要理解这个至关重要(且常常复杂)的主题,探索Soran Ghaderi详细的“地图”,回顾过去和现在的转换器研究。
准备继续你用饼干激励的阅读狂欢?以下是几篇你应该看看的杰出文章:
-
我们很高兴分享Michael Bronstein和 Emanuele Rossi 的最新研究,探索机器学习和博弈论的交集。
-
三年后,她的病毒式帖子宣布了仪表板的消亡,泰勒·布朗洛带来了对这些常受诟病但不可避免的工具更新和更加微妙的视角。
-
当前的商业格局如何影响数据团队?对于Barr Moses,数据科学家缩小他们的工作与核心业务需求之间的差距至关重要[/the-next-big-crisis-for-data-teams-58ac2bd856e8]。
-
深度学习专家们,这篇文章适合你们:Shashank Prasanna的最新作品是对推动 PyTorch 2.0 的编译器技术的便捷、耐心的入门指南。
感谢你本周花时间与我们相伴!如果你喜欢在 TDS 阅读的文章,可以考虑 成为 Medium 会员 —— 如果你是符合条件国家的学生,不要错过 享受会员大幅折扣的机会。
直到下一个变量,
TDS 编辑部
2023 年从数据分析师转型为数据科学家
原文:
towardsdatascience.com/making-the-jump-from-data-analyst-to-data-scientist-in-2023-74e2cf7fc139
从数据分析师转型为数据科学家所需的技能和资源。
·发表于Towards Data Science ·阅读时间 12 分钟·2023 年 1 月 2 日
–
图片由作者使用Canva创建。
冒名顶替综合症、挫折、怀疑。这些只是我在 2018 年从数据分析师转型为数据科学家时经历的一些问题。在过去的五年里,人工智能的进步带来了改变世界的技术,例如大型语言模型和变换器模型、扩散模型以及改进的计算机视觉模型。尽管过去五年里自学数据科学的资源数量和质量急剧增长,但从数据分析师过渡到数据科学家所需的技能依然不变。
从数据分析师到数据科学家的转型让我感到不堪重负。我对自己资质的了解有限,不知道自己是否申请了合适的职位,也没有一个可以请教的行业人士。这篇文章包含了我在自己的转型过程中学到的一切,以及我希望从一开始就知道的内容,包括如何利用现有技能、自学数据科学、需要掌握的基本技能以及一系列特定的(免费的)资源,以帮助你转型成为数据科学家。
数据分析师和数据科学家的区别是什么?
虽然分析师有从过去的数据中获取、分析并做出商业建议的经验,但科学家本质上是利用这些数据创建预测未来的产品。在这方面,“未来”并不总是意味着预测尚未发生的事件,但很多时候意味着预测现有“未见”数据的结果。尽管数据科学角色需要比分析师角色更高级的技能,但你需要掌握的技能并不一定难以学习。
数据分析师与数据科学家的技能
数据分析师和数据科学家之间的具体技能有所不同。下表概述了数据分析师和数据科学家常用技能和工具之间的差异。需要特别注意的一点是,这两个类别并不是互斥的。例如,一些数据分析师可能已经在当前职位中使用 R 或 Python 进行基本任务。同样,数据科学家可能会选择使用 Excel 和描述性统计方法来处理某些不需要预测模型的项目。
作者创建的图表。
利用并理解你当前的分析技能
你当前的职位名称可能不包括“数据分析师”这几个字,但这并不意味着你不是数据分析师。你可能是业务分析师、商业智能分析师、质量保证分析师、客户成功分析师、金融分析师、项目分析师或供应链分析师。关键是:你是否利用分析数据获得的洞察帮助他人做出商业决策?如果答案是肯定的,那么你就是数据分析师!
为了更好地理解你可以带到数据科学职位的技能,问自己关于当前和过去工作的以及教育背景的问题。
你分析了哪些数据类型?
-
定性数据还是定量数据?
-
文本还是数字?
-
名义型、序数型还是类别型?
-
离散数据还是连续数据?
-
实时(流式)还是历史数据?
-
结构化、半结构化还是非结构化数据?
-
时间序列数据还是地理位置数据?
-
用户数据还是操作数据?
你如何与数据进行互动?使用了哪些工具?
-
你如何与数据进行互动?使用了哪些工具?
-
从各种来源获取数据(数据库、Google 表格、Excel 文件)
-
清理数据(标准化、去除异常值、通过 vlookups 合并数据、特征工程)
-
分析数据(数据透视表、图表、SQL 查询、R/Python、SPSS)
-
沟通发现(与内部、外部利益相关者)
-
提出商业建议并做出数据驱动的决策
你是如何沟通你的发现的?
-
PowerPoint 演示文稿还是书面报告?
-
研讨会还是电话会议?
你在什么业务领域或学术专长方面有经验?
-
金融服务——保险、投资、会计、审计
-
医疗保健——公共卫生、流行病学、病毒学、临床研究
-
学术领域——物理、化学、生物、遗传学、统计学
在审阅上述信息时,尽可能具体 提供细节。
你与多大的数据集互动过?你使用过哪些类型的 SQL 查询?你建立过哪些类型的统计模型,并使用了哪些指标来评估它们?你有哪些 Python 包的经验?你在分享数据见解时运用了哪些类型的沟通技能?你向哪些利益相关者提供了数据驱动的建议?你的数据驱动决策带来了多少收入或节省?
在从数据分析师转型为数据科学家时,不要低估你的非技术技能和经验的重要性。作为分析师,你带来了一个重要的资产:你已经知道如何以批判性和创新性的方式思考数据。提升你的技术技能时,拥抱这种思维方式。
学习数据科学基础的方法(免费)
CHUTTERSNAP 拍摄的照片,来源于 Unsplash
在线学习平台
如果你完全是编程新手,我建议投资加入一个在线学习平台,如 DataCamp 或 Codeacademy。这是立即开始学习的最快方式,无需下载 Python 到你的电脑上并设置编程环境。开始时只学习你希望的编程语言 Python 或 R,然后再尝试实际的数据科学工作。以下是一些推荐的课程:
-
DataCamp — Python 入门
-
DataCamp — 学习 Python 3
YouTube
如果你的预算有限(或即使没有),YouTube 上有一些极好的资源用于学习技术数据科学技能。
-
3blue1brown — 广泛的数学和统计视频(很棒的神经网络视频)
-
Mosh 编程 — 为有志的软件工程师提供完整课程和较小的专题视频
-
Sentdex — 学习 Python、数据可视化、机器学习和深度学习的视频
免费的在线大学课程
成为数据科学家的道路上,你不一定需要完成(并支付费用)证书课程。在我的经验中,证书在简历上看起来不错,但雇主更关注你完成的实际项目和你建立的模型。
尽管如此,战略性地选择单一在线课程以学习特定技能或技术,可以让你比在线学习平台更深入地探讨这些主题。这些课程围绕特定课程大纲组织,并且通常由全球顶尖大学的教授授课。以下是一些优秀的例子:
-
监督学习:回归与分类 — 我推荐从 Andrew Ng 教授的这个 Coursera 课程开始。理解监督学习为学习更高级的概念,如深度学习,提供了最好的基础。
-
哈佛大学 CS50 — 根据freeCodeCamp的说法,这是世界上最受欢迎的计算机科学入门课程之一,由世界顶级计算机科学家之一教授。
-
斯坦福大学 CS101 — 一门自定进度的课程,教授计算机科学的基本知识,不需要任何经验。
-
斯坦福大学 CS329S — 由 MLOps 大师Chip Huyen教授,这门课程教你如何创建可部署、可靠和可扩展的机器学习系统。
现实世界的数据科学项目
根据美国劳工统计局的数据,预计数据科学家的需求在 2021 到 2031 年间将增长 36%。由于高需求、高薪资、极大的灵活性以及几乎无限的在线学习机会,数据科学职位从未像现在这样受到求职者的青睐。五年前,当我告诉人们我是一名数据科学家时,我通常需要解释我的工作。现在,当我说我是数据科学家时,人们会问我对 ChatGPT 或 AI 艺术的看法。这意味着初级数据科学岗位的竞争非常激烈。
因此,现实世界的数据科学经验比以往任何时候都更为重要。通过原创代码(而非泰坦尼克号分类器的复制品)展示你的编程技能将使你脱颖而出。这体现了你的编码、分析和解决问题的能力以及创造力。有很多方法可以获得这些经验,我无法一一列举,但这些是我最喜欢的一些方法。
通过数据为善(志愿者)学习数据科学
数据为善运动的核心在于利用数据科学和工程技能来促进社会公益。如果你通过像DataKind或CorrelAid这样的专门组织进行志愿服务,你可以申请参与那些已经经过审核、规划和组织的项目。通过志愿服务,你将学习并应用新技能,与其他数据科学家和工程师合作和建立网络,同时在一个有趣且有意义的项目中积累在异步环境下工作的经验。
在你当前的工作中启动一个数据科学项目
如果你已经在担任数据分析师的职位,你可能已经与公司中的数据科学家有所接触。如果没有,主动联系数据科学团队负责人或一位高级数据科学家,或请求你的团队负责人进行介绍。提出问题以了解团队的工作内容,并提出一个满足特定需求的小项目。通过这个过程,你不仅可以获得有价值的技术技能,还能更深入地了解数据科学解决方案如何针对特定的商业问题进行定制。
注意:在要求与其他团队合作时考虑职场政治。
创建一个小型数据科学作品集
在面试之前向潜在雇主展示你的技能。 创建有效数据科学作品集的关键是从小处开始,专注于那些对你有趣的项目!以下是如何入门:
网站
暂时不用担心自定义域名和托管。要快速且免费地上线,可以使用GitHub Pages或datascienceportfol.io。我选择了后者作为我的作品集,因为它是最快的选择,并且不需要我进行编码。
项目
创建小范围项目并逐步更新。可以从数据清洗或可视化项目开始,逐渐过渡到建立模型。以下是一些入门建议:
-
网络爬虫
-
情感分析
-
时间序列分析
-
二分类器
-
回归模型
-
主题建模
-
文本摘要
参与数据科学(和开源)社区
我获取(并保持)灵感的最爱方式是参加数据科学聚会,比如PyLadies Berlin和PyData Berlin。聚会由志愿者组织,通常由一家目前招聘数据相关职位的本地公司赞助。社区成员展示他们最新的个人和工作相关项目(类似迷你会议),并在聚会前后留出时间进行网络交流。
如果你还不是数据科学家,这不应成为你对这些聚会感到畏惧的理由。尽管我在这些活动中遇到了许多经验丰富的、杰出的数据科学家和工程师,但我遇到的有志成为数据科学家和工程师的人更多。
参与开源项目是另一种参与实际项目并提升编程和工程技能的方式。考虑贡献一些你最常使用的包,如Pandas、NumPy或scikit-learn。请记住,这些包的开发和维护几乎完全由志愿者完成,这让我们有工作可做,因此考虑回馈一下!
你是否应该获得数据科学硕士学位?
简短的回答是:不必要。因为数据科学的本科和研究生课程仍然很新,它们尚未被大多数数据科学职位所要求。此外,新学位项目通常需要几年时间才能在学术界建立声誉。
根据我的经验,雇主对你构建了哪些统计模型和数据管道以解决实际问题更感兴趣,而不是你上过哪些大学课程。在数据科学领域,“做”比“知道”更重要。 在考虑高级学位项目或付费证书之前,尝试完成几个从头到尾的实际数据科学项目。
你需要的最低限度数据科学技能
图片由Sarah Dorweiler提供,来源于Unsplash
我遇到了太多试图在申请数据科学职位之前学习所有数据科学知识(这几乎是不可能的)的有志数据科学家。但鉴于现在的职位描述写作方式,我几乎不能责怪他们。当你申请第一个数据科学职位时,记住,所列出的所需技能和技术只是一个愿望清单。
来自 FastAPI 创作者 Sebastián Ramírez 的热门推文。
此外,如果你符合某个职位的所有技能要求,你可能会被认为是过于优秀的候选人。 在申请我的第一个数据科学职位时,我制定了自己的经验法则,这一法则立刻提高了我的面试与申请比例:如果你认为你可以在工作中学会做某事,就把它当作一种技能来声明。
以下是一些示例:
-
如果你懂 R 语言,假设你可以学习 Python。
-
如果你已经构建了回归模型,假设你可以构建 XGBoost 模型。
-
如果你有 MySQL 经验,假设你可以使用 SQLite。
以下是我推荐在申请第一个数据科学职位之前,应该熟练掌握的最低限度技能列表。
编程
Git
-
创建新仓库
-
克隆现有的仓库
-
查看新分支
-
提交并推送更改
环境管理(Python)
-
设置虚拟环境(使用
virtualenv
、conda
) -
安装新包
-
使用
requirements.txt
文件
SQL
-
选择和过滤数据,合并来自多个表的数据
-
(其他操作请在 Pandas 中完成!)
Python
-
本地读写数据
-
列表推导式
-
数据类型
-
编写自定义函数
-
解析字符串
-
scikit-learn
-
将数据分成训练集和测试集
-
训练,评估模型
-
进行预测
-
-
Pandas
-
数据聚合
-
合并,连接
-
删除重复项
-
子集数据
-
按列排序
-
使用 apply 和 lambda 函数创建新列
-
-
Matplotlib 或 Plotly
-
直方图,密度图
-
散点图
-
条形图
-
热图
-
-
基本自然语言处理
-
分词
-
词干提取,词形还原
-
TF-IDF
-
统计分析和可视化工具
理解数据
-
探索性数据分析(EDA)
-
相关性图(用于确定特征重要性和识别混淆变量)
-
分析数据分布并识别偏斜
-
数据聚合
-
数据清理(见“Python 技能”)
-
处理缺失值和异常值
-
数据标准化(在构建模型之前)
-
了解多少数据足以构建模型
统计学
-
集中趋势度量(均值、中位数、众数、标准差)
-
统计显著性的 T 检验
可视化
-
图表(直方图、密度图、散点图、热图)
-
最佳拟合线(用于回归)
-
ROC 曲线
机器学习
模型构建
-
确定是否真的需要 ML 模型?!
-
特征工程
-
监督学习
-
线性回归
-
逻辑回归
-
CART/决策树模型(对代码测试非常有帮助)
-
-
无监督学习
-
聚类,主题模型
-
处理多标签模型的类别不平衡
-
模型评估
-
识别模型过拟合的情况
-
将模型保存为 pickle 文件,加载和推断它们
-
使用混淆矩阵指标(AUC、精确度、召回率、准确率等)进行模型评估
-
分析预测概率的分布
结论
找到第一份数据科学工作的过程需要信心、耐心、自律和毅力。作为一名拥有两年相关工作经验的定量数据分析师,我花了超过八个月的全职求职才收到数据科学职位的录用通知。 在这段时间里我学到了很多,成为数据科学家后我学到的更多。
如果你想做出转变,以下是我的一些顶级建议总结:
-
通过问自己有关你有经验的数据类型的问题,更好地了解你当前的技能。
-
在线学习平台(即 DataCamp、Codecademy)是如果你没有编码经验时学习 R 或 Python 的最快方式。
-
在考虑攻读数据科学高级学位之前,先利用好在线课程、YouTube 视频、GitHub 仓库和博客等免费资源。
-
参与动手项目是同时提高技术技能和软技能的最有效方式(而且是免费的)。
-
考虑与数据公益组织志愿服务或参与开源项目,以获得实际经验。
-
如果你符合特定职位的所有要求,你已经超出了资格要求。
无论你在成为数据科学家的旅程中处于何处,我都祝你好运!查看我的数据科学资源 备忘单 和下面的链接以获取相关内容。
图片和内容由作者生成。点击 这里 下载。
如果你希望保持对最新数据科学趋势、技术和包的了解,可以考虑成为 Medium 会员。你将获得对如 Towards Data Science 等文章和博客的无限访问权,并且支持我的写作。(每个会员我会赚取一小部分佣金)。
[## 使用我的推荐链接加入 Medium - Mary Newhauser
阅读 Mary Newhauser 的所有故事(以及 Medium 上成千上万其他作家的故事)。你的会员费直接支持…
medium.com](https://medium.com/@mary.newhauser/membership?source=post_page-----74e2cf7fc139--------------------------------)
想要联系吗?
我还写了:
清理文本数据的干净方法
towardsdatascience.com [## 对参议员推文进行 DistilBERT 微调
关于使用 snscrape、SQLite 和 Transformers(PyTorch)对美国参议员的推文进行 DistilBERT 微调的指南…
medium.com](https://medium.com/nlplanet/fine-tuning-distilbert-on-senator-tweets-a6f2425ca50e?source=post_page-----74e2cf7fc139--------------------------------)
参考资料
(1) J. Alammar,《插图版 Transformer》 (2018)。
(2) S. Rangwala,计算机视觉的进展推动交通自主 (2022)。
(3) R. O’Connor,机器学习的扩散模型介绍(2022 年)。
(4) A. Bridgwater,13 种数据类型(2018 年)。
(5) K. Pannetta,利用数据实现社会公益(2018 年)。
(6) 劳工统计局,职业展望手册,数据科学家(2022 年)。
做出正确决策:AI 建议、决策辅助工具以及大语言模型的前景
探索大语言模型带来的决策新时代
·
关注 发表在Towards Data Science · 10 分钟阅读 · 2023 年 9 月 28 日
–
介绍
人工智能的民主化导致了 AI 系统在各种领域的采用。最近一波生成模型,例如预训练的大型语言模型(LLMs),已广泛应用于我们日常生活中的不同活动——从通过帮助撰写邮件提高生产力,到帮助解决令新手和专家作家都感到困扰的“空白页”难题。由于对 LLMs 在决策中的依赖日益增加,本文提供了人类决策和人类与 AI 决策演变的综合分析。最后,文章反思了 LLMs 在辅助决策任务中提供的机会以及对 LLMs 决策依赖的相关威胁。
人类决策
在一个几乎每个日常决策(例如,购买食品或穿着衣物、阅读书籍、听音乐或观看电影,从生活方式选择到旅行目的地)的选择范围不断扩大的世界中,决策质量受到了重新关注。在他有影响力的作品中揭示“选择悖论”的巴里·施瓦茨(Barry Schwartz)阐述了这种随着千年技术进步而逐渐增加的决策困难。施瓦茨通过一个例子来解释这一点:医生向患者提供一系列治疗方案,传达潜在风险并将其与每种治疗的收益进行权衡。在这种情况下,高风险决策的负担从专家医生转移到非专家患者。除了其他因素外,选择的过多往往会阻碍有效的人类决策。
不同的研究社区,从进化心理学到认知科学和神经科学,已经探索了人类决策的性质以及塑造人类决策过程的各种因素。人类决策受认知偏差困扰,充满了非理性,这一点并不鲜见。这一点在诺贝尔奖获奖行为经济学家丹尼尔·卡尼曼的*《思考,快与慢》*一书中得到了最著名的记录。
由 Robynne Hu 提供的照片,来源于 Unsplash
人类与人工智能的决策
技术的出现带来了决策支持系统的增长,这些系统可以帮助人类克服决策过程中遇到的障碍。决策支持系统在更广泛的社会技术背景下有各种形态和形式——从驱动用户交互的算法到帮助用户进行预测和预报的复杂机器学习模型。例如,推荐系统可以通过向用户展示可能最能满足其需求的内容或产品来提供帮助。其他算法系统则可以挖掘大量数据,以在各种决策任务中向用户提供建议。
所有的人类与 AI 决策制定背景中一个共同的核心目标是通过将人类智能与算法系统的计算能力相结合,提升决策效果。然而,这与许多协作的人类与 AI 决策过程在现实世界中的展开方式相去甚远。人类在决策任务中未能适当地依赖 AI 系统,从而导致团队表现次优。适当的依赖被概念化为在人类依赖 AI 建议时 AI 正确时的依赖,以及 AI 不正确时的人类自我依赖[11]。有许多因素在塑造这些结果中发挥作用——人类因素(例如,领域知识、对技术交互的亲和力、先前经验);系统因素(例如,AI 系统的准确性或信心);任务因素(例如,任务复杂性、任务不确定性、风险)。
对人类与 AI 在各种背景下的决策制定的实证探索,包括贷款申请决策和医学诊断,已揭示出人类要么对 AI 建议的依赖不足,错失了改善决策结果的机会,要么对 AI 建议的依赖过度,从而导致次优结果。为了应对过度依赖和不足依赖的问题,并促进对 AI 建议的适当依赖,先前的研究提出了使用解释[13]、认知强制功能(即,在决策过程中强制进行关键考虑和反思的干预措施)[4]、传达 AI 系统优缺点的教程或培训课程,以及提高人群一般 AI 素养的倡议。最近的研究提出了一种名为“评估性 AI”的替代框架,以促进对 AI 建议的适当依赖。该框架建议决策支持工具应提供支持和反对人们所做决策的证据,而不是提供接受或拒绝的推荐[7]。
认知偏差也影响了人机决策[1, 3]。Rastogi 等人[9]认为,我们对决策任务的整体感知和理解可能会受到认知偏差的扭曲,例如确认偏差、锚定偏差和可得性偏差。他们探讨了锚定偏差的作用,并提出了减少其对协作决策表现负面影响的方法。He 等人[22]展示了厄尔斯效应(一种元认知偏差)如何影响人们对 AI 系统建议的依赖。他们揭示了那些高估自己能力或表现的用户倾向于对 AI 系统表现出过少的依赖,从而阻碍了决策任务中的最佳团队表现。其他因素,如算法厌恶和欣赏,也被证明对人机决策的成果有影响[17]。
尽管在人机协作的广泛领域中正在进行持续的工作,但在决策任务中如何适当地依赖 AI 系统仍然是一个未解的问题。人工智能、机器学习和人机交互交汇的不同研究社区正积极推进我们对这一领域的理解,并开发方法、工具和框架,帮助我们从人机协作的潜力中受益。
目前,大型语言模型(LLMs)在各个领域得到了广泛的应用和采纳。在本文的余下部分,我们将深入探讨 LLMs 在辅助人类决策中提供的机会以及潜在的好处。
LLMs 用于决策任务
尽管大型语言模型(LLMs)表现出偏见和可能造成伤害的潜在风险,它们在各种社会技术系统中的使用仍在不断增加。话虽如此,它们也显示出了在大规模上产生积极影响的潜力——例如,通过支持审计过程,如 Rostagi 等人[8]所展示的,通过一个由生成型 LLM 驱动的审计工具。作者提议在商业语言模型的协同审计中利用人类和生成模型的互补优势。Wu 等人[14]提出了AutoGen,一个通过多代理对话支持复杂 LLM-based 工作流程的框架。AutoGen 可以支持在线决策任务,如游戏或网络互动。
一方面,有证据表明,像 GPT-3 这样的 LLMs 表现出与人类直觉惊人相似的行为,以及随之而来的认知误差[16]。最近的研究强调了使用 ChatGPT 进行放射学决策的可行性,潜在地改善临床工作流程和放射学服务的负责任使用[18]。为了增强决策过程中的 AI 安全性,Jin 等人[15]旨在复制并赋予 LLMs 在新颖或异常情况下决定是否打破规则的能力。另一方面,LLMs 可能无意中加剧对边缘化群体的刻板印象[20],并表现出涉及种族、性别、宗教和政治取向的偏见。与决策支持系统中培养适当信任和依赖的挑战类似,如果人类依赖 LLMs 做出决策,我们将需要更好地理解这种互动的利与弊。在 LLM 驱动的互动中,尤其突出的风险是通过使用解释在决策任务中创造的解释深度的假象,导致对 AI 系统的过度依赖。如果人类与决策支持系统的互动变得更加“无缝”(例如通过交互式或对话界面),我们可以预期会发现更多不适当依赖的实例。
通过它们的架构和超参数的视角研究 LLMs 变得越来越困难。此时有足够的证据表明,生成式 AI 可以产生高质量的书面和视觉内容,这些内容可以为社会福祉服务,也可能被误用以造成伤害。Potsdam Mann 等人[19]认为,为 LLMs 输出分配责任存在信誉-责备不对称性,并且伦理和政策影响集中在 LLMs 上。
接下来需要做什么?
显然,在决策任务中安全且健壮地使用 LLMs 需要更多的研究和实证工作。特别是考虑到目前在多模态和多语言 LLMs 方面的限制。以下是一些仍然至关重要的问题汇编,用于确定我们可以从将 LLMs 嫁接到日常决策中中持续获益的程度:
-
如何促进对 LLMs 或 LLM 注入系统进行有效决策支持的适当依赖?
-
我们如何提高 LLM 注入的决策支持系统的稳健性、可靠性和信任度?
-
如何在多模态和多语言决策环境中培养对 LLMs 的适当信任和依赖?
-
如何支持不同能力、个人特征、先验知识、教育和资格以及其他人口统计学特征的人在 LLMs 决策任务中得到平等的支持?
因此,如果你手边有一个大语言模型,还是不要急于把它当作黑箱决策辅助工具来依赖!
Dr. ir. Ujwal Gadiraju 是代尔夫特理工大学的终身副教授。他共同指导了Delft “Design@Scale” AI 实验室并领导了一个以人为本的 AI 与众包计算研究方向。他是 ACM 的杰出演讲者,也是CHI Netherlands的董事会成员。Ujwal 在Toloka AI的 AI、数据和研究团队中花费部分时间工作,同时也是Deeploy的顾问委员会成员,Deeploy 是一家正在成长的 MLOps 公司。
参考文献
-
Bertrand, A., Belloum, R., Eagan, J. R., & Maxwell, W. (2022 年 7 月). 认知偏差如何影响 XAI 辅助决策:系统评估. 见于 2022 AAAI/ACM AI、伦理与社会会议论文集(第 78–91 页)。
-
Bossaerts, P., & Murawski, C. (2017). 计算复杂性与人类决策. 认知科学趋势, 21(12), 917–929。
-
Boonprakong, N., He, G., Gadiraju, U., van Berkel, N., Wang, D., Chen, S., Liu, J., Tag, B., Goncalves, J. 和 Dingler, T., 2023. 关于理解和缓解人类与 AI 协作中的认知偏差的研讨会。
-
Buçinca, Z., Malaya, M. B., & Gajos, K. Z. (2021). 信任还是思考:认知强制函数可以减少对 AI 的过度依赖. ACM 人机交互学报, 5(CSCW1), 1–21。
-
Haupt, C. E., & Marks, M. (2023). AI 生成的医学建议——GPT 及其超越。 Jama, 329(16), 1349–1350。
-
Kahneman, D. (2011). 思考,快与慢。 麦克米伦。
-
Miller, T. (2023 年 6 月). 可解释 AI 已死,万岁可解释 AI!使用评估性 AI 的假设驱动决策支持. 见于 2023 ACM 公平性、问责性与透明度会议论文集(第 333–342 页)。
-
Rastogi, C., Tulio Ribeiro, M., King, N., Nori, H., & Amershi, S. (2023 年 8 月). 支持人类与 AI 协作的审计 LLMs. 见于 2023 AAAI/ACM AI、伦理与社会会议论文集(第 913–926 页)。
-
Rastogi, C., Zhang, Y., Wei, D., Varshney, K. R., Dhurandhar, A., & Tomsett, R. (2022). 快速与缓慢决策:认知偏差在 AI 辅助决策中的作用. ACM 人机交互学报, 6(CSCW1), 1–22。
-
Santos, L. R., & Rosati, A. G. (2015). 人类决策的进化根源. 心理学年鉴, 66, 321–347。
-
Schemmer, M., Hemmer, P., Kühl, N., Benz, C., & Satzger, G. (2022). 我是否应该听从基于 AI 的建议?衡量人类与 AI 决策中的适当依赖性. arXiv 预印本 arXiv:2204.06916。
-
Schwartz, B. (2004). 选择的悖论:为何更多更少。 纽约。
-
Vasconcelos, H., Jörke, M., Grunde-McLaughlin, M., Gerstenberg, T., Bernstein, M. S., & Krishna, R. (2023). 解释可以减少在决策过程中对 AI 系统的过度依赖。ACM 人机交互学报,7(CSCW1),1–38。
-
Wu, Qingyun, Gagan Bansal, Jieyu Zhang, Yiran Wu, Shaokun Zhang, Erkang Zhu, Beibin Li, Li Jiang, Xiaoyun Zhang, 和 Chi Wang. AutoGen:通过多代理对话框架启用下一代 LLM 应用。arXiv 预印本 arXiv:2308.08155 (2023)。
-
Jin, Z., Levine, S., Gonzalez Adauto, F., Kamal, O., Sap, M., Sachan, M., Mihalcea, R., Tenenbaum, J. 和 Schölkopf, B., 2022. 何时例外:将语言模型作为人类道德判断的解释。神经信息处理系统进展,35, 第 28458–28473 页。
-
Hagendorff, T., Fabi, S., & Kosinski, M. (2022). 机器直觉:揭示 GPT-3.5 中的类人直观决策。arXiv 预印本 arXiv:2212.05206。
-
Erlei, A., Das, R., Meub, L., Anand, A., & Gadiraju, U. (2022 年 4 月). 值得关注的是:人类会忽略其经济自利以避免与 AI 系统讨价还价。见于 2022 年 CHI 计算机系统人因会议论文集(第 1–18 页)。
-
Rao, A., Kim, J., Kamineni, M., Pang, M., Lie, W., & Succi, M. D. (2023). 评估 ChatGPT 作为放射科决策的辅助工具。medRxiv, 2023–02。
-
Porsdam Mann, S., Earp, B. D., Nyholm, S., Danaher, J., Møller, N., Bowman-Smart, H., … & Savulescu, J. (2023). 生成式 AI 涉及信贷–责备不对称。自然机器智能,1–4。
-
Dhingra, H., Jayashanker, P., Moghe, S., & Strubell, E. (2023). 酷儿首先是人:解构大语言模型中的性别身份刻板印象。arXiv 预印本 arXiv:2307.00101。
-
He, G., Kuiper, L., & Gadiraju, U. (2023 年 4 月). 了解认知:人类能力的幻觉可能阻碍对 AI 系统的适当依赖。见于2023 年 CHI 计算机系统人因会议论文集(第 1–18 页)。
使用 PyTorch、ONNX 和 TensorRT 将视觉变换器的预测速度提高 9 倍
如何使用 16 位浮点数、TensorRT、网络重写和多线程来显著加速深度学习模型预测
·发表于Towards Data Science ·阅读时间 11 分钟·2023 年 6 月 4 日
–
Sanjeevan SatheesKumar拍摄于Unsplash
诸如UNET、SwinUNETR这样的视觉变换器在计算机视觉任务中,如语义分割,都是最先进的。然而,这些模型进行预测需要大量时间。本文展示了如何将这种模型的预测速度提高 9 倍。这一改进为许多实时或接近实时的应用铺平了道路。
肿瘤分割任务
为了设置场景,我使用 SwinUNETR 模型从胸部 CT 扫描图像中分割肺肿瘤,这些图像是单通道灰度 3D 图像。以下是一个示例:
-
左侧列展示了来自 3D CT 扫描图像的几幅 2D 切片,处于轴向平面。两个弯月形的黑色区域是肺部。
-
右侧列显示了肺肿瘤的手动标注。
胸部 CT 扫描通常尺寸为 512×512×300,存储在磁盘上大约需要 60 到 90 兆字节。它们不是小图像。
我使用 PyTorch 训练了一个 SwinUNETR 模型来分割肺肿瘤。经过训练的模型对胸部 CT 扫描进行预测大约需要 10 秒。因此,每张图像 10 秒是我的起点。
在我们讨论速度优化之前,先来看一下模型的输入和输出,以及它是如何进行预测的。
模型输入和输出形状
模型输入和输出,由作者提供
-
输入是一个表示胸部 CT 扫描的 3D numpy 数组。
-
SwinUNETR 模型无法处理整个图像,因为它太大了。一个解决方案是将图像切割成较小的块,称为感兴趣区域(ROIs)。在我的设置中,感兴趣区域的大小为 96×96×96。
-
SwinUNETR 模型一次只看到一个感兴趣区域,输出两个二值分割掩码,一个用于肿瘤类别,另一个用于背景类别。这两个掩码的大小都是感兴趣区域的大小,即 96×96×96。更准确地说,SwinUNETR 输出两个未归一化的类别概率掩码。在后续步骤中,这些未归一化的掩码通过softmax归一化为 0 到 1 之间的概率,然后通过argmax转化为二值掩码。
-
这些掩码根据对应感兴趣区域的切割方式进行合并,以生成两个全尺寸的分割掩码——肿瘤掩码和背景掩码——每个掩码的大小与整个胸部 CT 扫描相同。请注意,尽管模型返回了两个分割掩码,但我们只关注肿瘤掩码,会忽略背景掩码。
-
输入和输出数组,以及模型,使用的是 32 位浮点数。
滑动窗口推断
以下伪代码实现了上述预测思路。
滑动窗口推断,作者提供的图像
注意本文中的代码片段是伪代码,以保持简洁。根据相同的逻辑,像split_image这样的实现显而易见的方法留给读者自行实现。
-
sliding_window_inference方法接受完整的 CT 扫描image和一个 PyTorch model。它还接受一个batch_size,因为一个感兴趣区域很小,GPU 可以同时处理多个区域进行预测。batch_size指定了发送到 GPU 的感兴趣区域的数量。sliding_window_inference返回二值肿瘤分割和背景掩码。
-
该方法首先将整个图像划分为感兴趣区域,然后将这些区域分组为batch,每组包含batch_size个感兴趣区域。在这里,我假设感兴趣区域的数量可以被batch_size整除,以简化代码。
-
每个batch会被发送到model以生成一批预测结果。每个预测结果对应一个单独的感兴趣区域。
-
最终,所有感兴趣区域的预测结果被合并形成两个全尺寸的分割掩码。合并过程还包括softmax和argmax。
对图像进行预测的代码片段
以下代码片段调用了sliding_window_inference方法,以对加载到第一个 GPU “cuda:0” 的图像文件进行预测,图像作为 PyTorch 张量:
调用模型预测的代码片段,由作者提供
在上述设置下,我现在介绍一组策略,以加快模型预测速度。
策略 1:在 16 位浮点数中进行预测
默认情况下,训练好的 PyTorch 模型使用 32 位浮点数。但通常情况下,16 位浮点数精度足以提供非常相似的分割结果。使用单个 PyTorch API half 就可以轻松将 32 位模型转换为 16 位模型:
16 位浮点数精度的预测,作者图片
这个策略将预测时间从 10 秒减少到 7.7 秒。
策略 2:将模型转换为 TensorRT
TensorRT 是 Nvidia 提供的一款软件,旨在为深度学习模型提供快速推理。它通过将通用模型(如 PyTorch 模型或 TensorFlow 模型,能够在多种硬件上运行)转换为仅在特定硬件上运行的 TensorRT 模型来实现这一目标——即你进行模型转换的硬件。在转换过程中,TensorRT 还进行许多速度优化。
来自 TensorRT 安装的 trtexec 可执行文件执行转换。问题是,有时将 PyTorch 模型转换为 TensorRT 模型会失败。在 PyTorch SwinUNETR 模型上失败。特定的失败消息并不重要,你会遇到自己的错误。
重要的是要知道有一个解决方法。解决方法是首先将 PyTorch 模型转换为中间格式,ONNX,然后再将 ONNX 模型转换为 TensorRT 模型。
ONNX 是一种开源格式,用于表示机器学习模型。ONNX 定义了一组通用的操作符——机器学习和深度学习模型的构建块——以及一个通用的文件格式,使 AI 开发者能够在各种框架、工具、运行时和编译器中使用模型。
好消息是,将 ONNX 模型转换为 TensorRT 模型的支持优于将 PyTorch 模型转换为 TensorRT 模型的支持。
将 PyTorch 模型转换为 ONNX 模型
以下代码片段将 PyTorch 模型转换为 ONNX 模型:
将 PyTorch 模型转换为 ONNX 模型,作者提供
它首先为单个兴趣区域创建随机输入。然后使用已安装的onnx Python 包中的 export 方法来执行转换。此转换会生成一个名为 swinunetr.onnx 的文件。参数 dynamic_axes 指定 TensorRT 模型应支持输入的第 0 维的动态大小,即批量维度。
将 ONNX 模型转换为 TensorRT 模型
现在我们可以调用 trtexec 命令行工具将 ONNX 模型转换为 TensorRT 模型:
将 ONNX 模型转换为 TensorRT 模型的 trtexec 命令行,作者提供
-
onnx=swinunetr.onnx 命令行选项指定了 onnx 模型的位置。
-
saveEngine=swinunetr_1_8_16.plan 选项指定生成的 TensorRT 模型的文件名,称为计划。
-
fp16 选项要求转换后的模型以 16 位浮点精度运行。
-
minShapes=modelInput:1×1×96×96×96 指定生成的 TensorRT 模型的最小输入大小。
-
maxshapes=modelInput:16×1×96×96×96 指定生成的 TensorRT 模型的最大输入大小。由于在 PyTorch 转换为 ONNX 的过程中,我们只允许第 0 维,即批量维度,支持动态大小,因此在 minShapes 和 maxShapes 中,只有第一个数字可以改变。它们一起告诉 trtexec 工具输出一个可以用于批量大小在 1 到 16 之间的输入的模型。
-
optShapes=modelInput:8×1×96×96×96 指定生成的 TensorRT 模型在批量大小为 8 时运行最快。
-
workspace=10240 选项为 trtexec 提供 10G 的 GPU 内存来进行模型转换。
trtexec 将运行 10 到 20 分钟,并输出生成的 TensorRT 计划文件。
使用 TensorRT 模型进行预测
以下代码片段加载 TensorRT 模型计划文件,并使用从stackoverflow中改编的 TrtModel:
使用 TensorRT 模型进行预测,由作者提供
请注意,即使在 trtexec 命令行中,我们指定了 fp16 选项,在加载计划时,我们仍然需要指定 32 位浮点数。很奇怪。
对从 stackoverflow 获得的 TrtModel 需要进行一些小调整,但你会解决的。这并不难。
使用这个战术,预测时间为 2.89 秒!
战术 3:包装模型以返回一个掩码
我们的 SwinUNETR 模型返回两个分割掩码,一个用于肿瘤,一个用于背景,以未归一化概率的形式。这两个掩码首先从 GPU 转移到 CPU。然后在 CPU 中,这些未归一化的概率会被 softmax 转换为 0 和 1 之间的适当概率,最后通过 argmax 生成二值掩码。
由于我们只使用肿瘤掩码,因此模型无需返回背景掩码。GPU 和 CPU 之间的数据传输需要时间,而 softmax 等计算也需要时间。
要获得只返回单一掩码的模型,我们可以创建一个新的类来包装 SwinUNETR 模型:
SwinUNETR 包装器以返回单一掩码,由作者提供
下图展示了新的模型输入输出:
SwinWrapper 输入和输出,由作者提供
forward 方法通过神经网络的前向传递处理一批感兴趣区域以进行预测。在这个方法中:
-
原始模型首先在传入的感兴趣区域上调用,以获取两个分割类别的预测。输出形状为 Batch×2×Width×Height×Depth,因为在当前的肿瘤分割任务中,有两个类别——肿瘤和背景。结果存储在out变量中。
-
然后对两个未归一化的分割掩码应用softmax,将它们转换为介于 0 和 1 之间的归一化概率。
-
然后仅选择肿瘤类别,即类别 1,返回给调用者。
实际上,这个封装器实现了两个优化:
-
仅返回一个分割掩码,而不是两个。
-
将softmax操作从 CPU 移到 GPU 中。
那么argmax操作呢?由于只返回一个分割掩码,所以不需要argmax。相反,为了创建原始的二进制分割掩码,我们将进行tumour_segmentation_probability ≥ 0.5,其中tumour_segmentation_probability是 SwinWrapper 中的forward方法的结果。
由于 SwinWrapper 是一个 PyTorch 模型,我们需要再次进行 PyTorch 到 ONNX 和 ONNX 到 TensorRT 的转换步骤。
在将 SwinWapper 模型转换为 ONNX 模型时,唯一需要更改的是使用封装模型:
将封装的 SwinUNETR 模型转换为 ONNX,由作者提供
将 ONNX 模型转换为 TensorRT 计划的trtexec命令行保持不变,所以我不会在这里重复。
这个策略将预测时间从 2.89 秒减少到2.42 秒。
策略 4:将感兴趣区域分配到多个 GPU
以上所有策略仅使用一个 GPU,但有时我们希望使用更昂贵的多 GPU 机器以实现更快的预测。
其思路是将相同的 TensorRT 模型加载到n个 GPU 中,在sliding_window_inference中,我们进一步将一批 ROIs 分割为n个部分,并将每部分发送到不同的 GPU。这种方式下,SwinWrapper 网络的耗时前向传递可以并行处理不同部分。
我们需要将sliding_window_inference方法改为以下的sliding_window_inference_multi_gpu:
多 GPU 滑动窗口推断,由作者提供
-
和之前一样,我们将感兴趣区域分成不同的批次。
-
我们根据提供的 GPU 数量将每个批次拆分成多个部分。
-
对于每个部分batch_per_gpu,我们将任务提交到 ThreadPoolExecutor 中。该任务对传入的部分执行模型推断。
-
submit方法立即返回一个 future 对象,表示任务完成时的结果。submit方法在任务完成前立即返回是至关重要的,这样我们可以在不等待的情况下将其他任务提交到不同的线程,实现并行处理。
-
在内层for 循环中提交所有任务后,等待所有 future 对象完成。
-
在任务完成后,从期望中读取结果并合并结果。
要调用这个新版本的sliding_window_inference_multi_gpu,请使用以下代码片段:
使用多个 GPU 进行模型预测,作者
-
我使用了两个 GPU,因此我创建了两个 TensorRT 模型,每个模型分别放在不同的 GPU 上,“cuda:0”和“cuda:1”。
-
然后我创建了一个包含两个线程的 ThreadPoolExecutor。
-
我将模型和执行器传递给sliding_window_inference_multi_gpu方法,类似于单 GPU 的情况,以获得肿瘤类别分割掩码。
这个策略将预测时间从 2.42 秒减少到1.38 秒!
现在我们有四种策略,将 SwinUNETR 模型的预测速度提高了 9 倍。还不错。但我们是否为了速度牺牲了预测精度?
我们是否为了速度牺牲了预测精度?
在这里“精度”一词指的是最终模型对肿瘤的分割效果,而不是浮点预测精度,例如 16 位、32 位精度。
为了回答这个问题,我们需要查看 DICE 指标,这个指标用于衡量分割模型的性能。
DICE 分数是通过预测的肿瘤与实际肿瘤重叠的比例来计算的。DICE 分数介于 0 和 1 之间;分数越高,模型预测越好:
-
DICE 1 表示完美预测,
-
DICE 0 表示完全错误的预测,或者根本没有预测。
让我们看看测试图像的 DICE 分数:
不同策略下的 Dice 分数,作者
我们可以看到,只有当我们在策略 1 中将 32 位 PyTorch 模型转换为 16 位模型时,DICE 分数从 0.93 略微下降到 0.91。其他策略不会降低 DICE 分数。这表明这些策略可以在仅有微小精度损失的情况下实现更快的预测速度。
结论
本文介绍了四种策略,通过使用 ONNX、TensorRT 和多线程等工具,使视觉变换器预测速度大大提升。
致谢
我要感谢我的朋友 Chunyu Jin。他向我展示了快速深度学习模型推断的可能性。他为我制作了第一个运行的 TensorRT SwinUNETR 模型,并建议了我在这里尝试的许多策略。
[## 通过我的推荐链接加入 Medium - Wei Yi
阅读 Wei Yi(以及 Medium 上的成千上万其他作者)的每一个故事。如果你喜欢我的故事,请考虑…
medium.com](https://medium.com/@jasonweiyi/membership?source=post_page-----dc1f09b6814--------------------------------)
使用 ipywidgets 让你的数据分析变得生动
原文:
towardsdatascience.com/making-your-data-analytics-come-to-life-using-ipywidgets-cfa9538279f7
了解如何使用小部件动态更新数据分析
·发表于Towards Data Science ·8 分钟阅读·2023 年 2 月 21 日
–
图片由John Schnobrich拍摄,来源于Unsplash。
对于我日常的数据分析任务,我最喜欢的开发环境绝对是 Jupyter Notebook。Jupyter Notebook 允许我快速修改代码并重新运行单元格以查看更新。然而,这一功能对使用我的 Jupyter Notebook 查看数据分析结果的用户并不友好。如果用户可以在不修改代码的情况下与我的程序进行交互,那将非常有用。这就是ipywidgets包发挥作用的地方。
ipywidgets是一个包含 Jupyter Notebook 交互式 HTML 小部件的包。通过使用 ipywidgets 中的小部件,你的 Jupyter 笔记本将变得生动,用户可以直接控制他们的数据并可视化数据的变化。在本文中,我将带你深入了解如何将 ipywidgets 与数据集一起使用。
安装 ipywidgets
在你的 Jupyter 笔记本中,按如下方式安装ipywidgets和widgetsnbextension包:
!pip install ipywidgets widgetsnbextension
然后,如下启用widgetsnbextension:
!jupyter nbextension enable --py widgetsnbextension --sys-prefix
使用interact
函数
对于我们的示例,我将使用位于www.kaggle.com/datasets/teertha/ushealthinsurancedataset?resource=download.
的保险数据集。
许可证😗 CC0: 公共领域. 描述 — 该数据集包含 1338 行被保险数据,其中保险费用是针对被保险人的以下属性给出的:年龄、性别、BMI、子女数量、是否吸烟和区域。这些属性包括数字变量和分类变量。
让我们首先将 CSV 文件加载到 Pandas DataFrame 中:
import pandas as pd
df = pd.read_csv('insurance.csv')
df
所有图片由作者提供
滑块控件
假设我想检索所有包含 3 个子项的行。我可以这样做:
df.query(f'children == 3')
如果我想检索具有 4 个子项的行,那么我必须修改我的语句并重新运行单元格。显然,这不是很高效。
这时,ipywidgets
包中的interact
函数就非常有用了:
from ipywidgets import interact
def f(children):
display(df.query(f'children == {children}'))
在上述代码片段中,我定义了一个名为f
的函数,该函数接受一个参数——children
。该函数将查询数据框并显示结果。接下来的语句就是魔法发生的地方:
interact(f, children = 5)
interact()
函数(ipywidgets.interact
)会自动创建用户界面(UI)控件(称为小部件),并将它们绑定到你指定的函数上。上述语句将生成一个包含IntSlider控件以及数据框的输出:
你传入
children
参数的值将决定生成什么类型的用户界面控件。在这里,你传入了一个整数,因此生成了一个滑块控件。如果你传入n
,它将生成一个取值范围为[-n,+3*n]的整数值滑块控件。
去拖动滑块吧。当你拖动时,数据框将动态更新。
我们可以对年龄字段做同样的操作,但这次我们要设置可选择的年龄范围:
def f(age):
display(df.query(f'age > {age}'))
interact(f, age = (df['age'].min(), df['age'].max()))
最小年龄为 18 岁,最大年龄为 64 岁。当前滑块的值将显示在中间位置——41(即(18+64)/2)。
如果你传入一个浮点数,比如 BMI:
def f(bmi):
display(df.query(f'bmi > {bmi}'))
interact(f, bmi = (df['bmi'].min(), df['bmi'].max()))
然后会显示一个FloatSlider控件:
下拉控件
那么选择区域呢?我们可以将区域作为列表传入:
def f(region):
display(df.query(f'region == "{region}"'))
interact(f, region = df['region'].unique())
现在你可以使用下拉控制选择四个区域中的一个:
如果我想选择所有区域呢?为此,你需要发挥创造力。首先,我会创建一个包含四个区域的元组列表:
regions = [(i.capitalize(),i) for i in df['region'].unique()]
上面的代码片段生成了以下列表:
[('Southwest', 'southwest'), ('Southeast', 'southeast'), ('Northwest', 'northwest'), ('Northeast', 'northeast')]
每个元组中的第一个元素是显示给用户的内容。第二个元素是所选项的值。
然后,将一个元组—(‘All Regions’,’@*’)
,添加到列表中:
regions.append(('All Regions','@*'))
现在regions
变量看起来是这样的:
[('Southwest', 'southwest'),
('Southeast', 'southeast'),
('Northwest', 'northwest'),
('Northeast', 'northeast'),
('All Regions', '@*')]
现在你可以将regions
变量传递给interact()
函数:
def f(region):
display(df.query(f'region.str.contains("{region}")'))
interact(f, region = regions)
请注意,我需要更改查询语句以使用 contains()
函数。你现在可以选择所有区域项,以从所有区域中选择行:
复选框小部件
当你向 interact()
函数传入布尔值时,它会显示一个 CheckBox
小部件。考虑以下示例:
YES, NO = 'yes', 'no'
def f(smoker):
display(df.query(f'smoker == "{YES if smoker == True else NO}"'))
interact(f, smoker = True)
上面的代码片段显示了一个复选框。取消选中它,所有非吸烟者将会显示出来:
文本小部件
假设你希望用户在区域中输入而不是从下拉控制中选择。很简单,只需将字符串传递给 interact()
函数,如下所示:
def f(region):
display(df.query(f'region.str.contains("{region}")'))
interact(f, region = "")
现在你将看到一个文本框,你可以在其中输入区域:
有一个问题。观察到当你输入时,数据框会自动更新。这个功能被称为连续更新。对于大型数据框,这将是一个问题,因为每次你更改文本框的内容时,它都会重新查询数据框,这可能会耗费时间。
你可以通过显式指定 Text
小部件(控制)然后将 continuous_update
参数设置为 False
来禁用连续更新:
from ipywidgets import widgets
def f(region):
display(df.query(f'region.str.contains("{region}")'))
interact(f, region = widgets.Text('', continuous_update = False));
数据框现在会在你输入查询并按下 Return/Enter 键后更新:
单选按钮小部件
单选按钮是另一种让用户从预定的值列表中进行选择的方式。对于我们的数据集,你可以使用它来让用户在吸烟者和非吸烟者之间进行选择:
def f(smoker):
display(df.query(f'smoker == "{smoker}"'))
interact(f, smoker = widgets.RadioButtons(options=["yes", "no"], value="no"));
对于单选按钮,你需要手动指定
widgets.RadioButtons()
类。
上面的代码片段显示了一组单选按钮,用于选择吸烟者和非吸烟者:
使用 Interactive 函数
到目前为止,一切顺利。你已经能够创建和使用各个小部件来过滤数据框中的不同字段。但是如果你想将它们全部组合成一个大过滤器怎么办?这时 interactive()
函数就派上用场了。
interactive()
函数类似于 interact()
函数,但它允许你传入多个值以创建多个小部件。以下 f()
函数接收六个参数,这些参数通过 interactive()
函数传入:
from ipywidgets import interactive
import ipywidgets as widgets
report_output = widgets.Output()
display(report_output)
def f(age, bmi, children, region, sex, smoker):
filtered = df.query(f'age >= {age} and bmi >= {bmi} and smoker == "{smoker}" and region.str.contains("{region}") and sex=="{sex}" and children=={children}')
with report_output:
report_output.clear_output()
display(filtered)
regions = [(i.capitalize(),i) for i in df['region'].unique()]
regions.append(('All Regions','@*'))
interactive(f,
age = (df['age'].min(), df['age'].max()),
bmi = (df['bmi'].min(), df['bmi'].max()),
children = (df['children'].min(), df['children'].max()),
region = regions,
sex = widgets.RadioButtons(options=["female", "male"], value="female"),
smoker = widgets.RadioButtons(options=["yes", "no"], value="no"),
)
在运行代码片段的地方,你将看到以下内容:
当你与小部件互动时,数据框会自动更新。如果你有一个大型数据框,你可能会发现每次控制中的值发生变化时更新数据框是比较麻烦的(你的屏幕会因为这些小变化而刷新),因此,最好避免在用户希望查看更新的数据框之前刷新数据框。为此,将第二个参数 ({‘manual’: True}
) 插入到 interactive()
函数中:
interactive(f,
{'manual': True},
age = (df['age'].min(), df['age'].max()),
bmi = (df['bmi'].min(), df['bmi'].max()),
children = (df['children'].min(), df['children'].max()),
region = regions,
sex = widgets.RadioButtons(options=["female", "male"], value="female"),
smoker = widgets.RadioButtons(options=["yes", "no"], value="no"),
)
现在将出现一个标有运行互动的按钮。你可以在小部件中更改值,当你准备好查看更改时,点击运行互动按钮,数据框将会更新。
如果你喜欢阅读我的文章并且这些文章对你的职业/学习有帮助,请考虑注册成为 Medium 会员。每月$5,它可以让你无限访问 Medium 上的所有文章(包括我的)。如果你通过以下链接注册,我将获得少量佣金(对你没有额外费用)。你的支持意味着我将能够投入更多时间撰写类似的文章。
## 通过我的推荐链接加入 Medium - Wei-Meng Lee
阅读 Wei-Meng Lee 的每一个故事(以及 Medium 上的其他数千名作者的故事)。你的会员费直接支持…
总结
本文简要介绍了使用interact()
和interactive()
函数生成小部件并绑定到函数的过程。以下是根据你提供的数据类型创建的小部件类型的快速总结:
-
IntSlider或FloatSlider — 当你传入一个数字值或一对数字值的元组时
-
下拉菜单 — 当你传入一个值的列表(或元组的列表)时
-
文本 — 当你传入一个字符串值时
-
复选框 — 当你传入一个布尔值(
True
或False
)时
还有其他类型的小部件需要你在interact()
和interactive()
函数中手动指定,例如单选按钮及其他很多。在我的下一篇文章中,我将详细讲述在这篇文章中没有机会讨论的其他小部件。在此之前,祝你玩得开心!
管理一个联邦数据产品生态系统
原文:
towardsdatascience.com/managing-a-federated-data-product-ecosystem-3c6bff94c728
随着数据网格的成熟,企业在管理不断增长的联邦数据产品生态系统时遇到了困难。如何管理这个快速发展的生态系统?
·发布于 Towards Data Science ·阅读时间 9 分钟·2023 年 1 月 11 日
–
企业数据管理未兑现的承诺
我们都知道数据的体量、种类和复杂性正在指数增长。然而,我们当前的方式——集中式数据管理——正在失败。企业被提供了更大控制的幻想,但却看到缓慢、缺乏灵活性和官僚化的过程,这些过程阻碍了创新。
因此,企业在不同的数据管理方法中进行实验也就不足为奇了。数据网格就是这些“实验”之一。早期迹象表明,情况在向好的方向发展。
但数据网格仍在发展和成熟中。数据联邦——数据网格所基于的——在其路径上仍然存在一些障碍。
本文描述了数据网格如何拥抱数据的联邦——以及数据管理的联邦——以显著提高速度、促进敏捷性并实现本地自治。但成功的障碍以及如何克服这些障碍也将被讨论。在这方面,将讨论几个主题,包括:
-
数据网格作为联邦数据和联邦数据管理的关键推动者
-
扩展数据网格的潜在挑战
-
在数据网格中联邦数据的新原则
-
使用数据网格扩展数据联邦的新原则
数据网格的承诺
数据网格是一种相对较新的方法,提供了一组新的数据管理原则。简单来说,这些原则将数据视为具有明确所有权和责任的一级产品,支持自助服务平台和联邦治理。关于这方面的资料已经有很多这里、这里和这里讨论过,所以我不会专门深入探讨数据网格。
我建议还有一些更为根本的关于数据网格的内容值得讨论。简单来说,数据网格的承诺在于它实现了数据和数据管理的联邦化,促进了地方自治,从而推动了在今天快速变化市场中所需的速度、灵活性和创新。
联邦数据的演变概念
但我们从头开始:什么是“联邦数据”和“联邦数据管理”?是什么让它变得更好?
让我们从基础开始:数据是现代企业的“乐高积木”。就像一个单独的乐高积木,单个数据元素的价值有限。但当它们结合在一起时,积木可以组装成更大的组件,称为“数据产品”。
图 1,数据网格——企业数据的乐高积木
数据产品结合了数据网格的原则,包括明确的边界、授权的所有者、自助服务功能,从而实现了企业内部数据产品的“联邦化”。数据产品分布在整个企业中,没有中央流程或团队将它们绑定在一起。
大规模联邦数据的观察
今天,许多企业在充满活力但规模较小的生态系统中运行多个数据产品。但随着这些生态系统的发展,我们发现数据产品变成了:
-
难以找到,因为没有一个“注册表”作为数据产品的可搜索目录;而且一旦找到,它们的文档很少或不一致,使得数据产品难以理解,尤其是当它们的使用超出原始创建者组时。
-
难以访问和获取,因为获取数据访问权限的方法简单或一致的方式非常少;有一种名称解析服务将数据产品标识转换为端点,就像互联网的 DNS 一样;而且一旦获得访问权限,数据产品很难使用,因为访问各种数据产品的一致机制非常少。
-
难以操作、观察和安全,因为每个数据产品有不同的安全需求,甚至有更为多样化的实现。观察性工具不一致,安全需求的多样化导致复杂性过高,操作性推迟到生产问题需要解决时才会考虑。
-
难以信任,因为数据的来源、其转换过程以及数据供应链中不可避免的错误会使人怀疑数据产品的质量和可靠性;对于需要深入了解数据的受监管行业而言,数据产品不幸的是难以管理,因为数据产品提供的统计数据和指标不一致,导致手动处理增加。
图 2,数据难以找到、消费、信任和共享
这些问题是所谓的“规模问题”的症状。成功——在这种情况下,即组织中涌现出的大量数据产品——显然有一些负面影响。但是,我们如何驯服联邦的混乱演变,克服这些规模问题呢?
根据我在发展大型数据生态系统方面的经验,我认为出现了一套新的原则,这将使联邦数据管理能够以实际和高效的方式扩展。这些原则分为两个类别:一组适用于数据产品及其负责人,另一组则促进快速增长。
联邦数据产品的实用原则
联邦数据产品依赖于许多因素:愿景的清晰性、实际权衡的考量以及对实施卓越的持续关注。但增长你的联邦数据产品生态系统的关键成功因素是实践性地实施和制度化一个单一的概念:数据产品负责人至高无上。
那么,实际上,这意味着什么?我想这意味着字面上的意思:数据产品负责人对其数据产品的所有元素拥有最终决策权——以及否决权。是的,所有决定。并且,他们需要在良好的企业行为的正常范围内工作——他们必须遵守高级管理政策、监管限制,在某些情况下,还要承担盈亏责任。但他们有权决定如何实施这些政策,如何适应监管限制,如何达到他们的收入(或成本)目标。他们决定!
所以,毫无疑问,在数据产品负责人被赋权并拥有真正的决策权的地方,你会发现一个成功的数据产品生态系统以及不断增长的数据产品集合。
图 3,数据产品负责人原则
所以,为了实现“数据产品负责人至高无上”,我提供以下新的数据产品负责人原则:
-
数据产品负责人“拥有”他们的技术决策;数据产品负责人可以使用他们认为最有效的任何技术——即使这些技术与当前的企业标准相悖——来构建他们的数据产品。例如,数据产品负责人的目标是优先考虑灵活性、速度和数据产品负责人的自主权,这些优先于传统的成本关注和企业标准采纳。现在,要明确的是,他们显然应优先考虑现有企业标准产品,但他们并不依赖于这些标准。是的,他们可能需要承担引入新技术所需的额外开销。但他们自己做决定。
-
数据产品负责人“管理”他们的数据供应链:数据产品负责人保证他们的数据供应链的完整性。他们掌握数据摄取的所有杠杆:数据产品团队,而非中央管道团队,负责他们的数据摄取管道的规格;数据产品负责人还具备设计和构建摄取管道的技能。从实际角度来看,数据产品负责人推动管理实践、工具和仪器的投资,以主动识别、诊断数据供应链中的质量、稳定性或可用性问题。
-
数据产品负责人“认证”他们的数据需求链:数据产品负责人证明——或认证——数据的安全性、可信度、质量以及对服务水平的遵守。数据产品负责人制定消费合同(显然是与消费者合作)。他们还决定这些合同如何实施,以及如何满足服务水平期望。他们还主动衡量并公开报告质量指标,以确保数据期望得到满足。
-
数据产品负责人“销售”他们的数据产品:数据产品,像企业提供给消费者的其他产品一样,拥有生命周期。虽然生命周期类似,但在企业中的重点几乎总是截然不同。虽然传统产品的负责人(即向消费者提供并由消费者支付的产品)预计要达到收入和成本目标,但内部产品几乎从不如此。同样,数据产品负责人需要像传统产品负责人一样行动——他们需要积极推进,他们需要销售,他们需要获得尽可能多的组织支持和动力,以便——至少——成为自给自足、被认可并获得资助。
促进联合数据产品成长的实用原则
尽管拥有了授权的负责人,但事情仍然可能偏离轨道。发生问题时,会发现理解上的差距以及限制数据产品生态系统成长的不必要约束。
因此,让我提供一些对我来说效果良好的原则。对一些人来说,这些原则可能显得相悖,对另一些人来说可能不切实际,对其他人来说可能与企业指令不一致。但它们有效!
这些原则优先考虑灵活性和速度,而不是成本控制。它们选择测试和学习而非追求完美。它们提供创新和加速市场时间,而不是不必要的一致性。
图 4,促进联邦数据产品增长的原则
所以,这些就是新的原则,以及它们如何促进联邦数据产品的增长。
-
“让百花齐放”:我们必须鼓励数据产品的增长和多样性,允许各种想法和方法繁荣,而不是被压制或限制。为了让“百花齐放”变得更容易,企业应该使创建安全、可靠、可观察和可操作的数据产品变得简单。企业应该强烈倡导一种“测试和学习”的方法,容忍实验。
-
“杂草控制是次要优先事项”。继续我们的类比……在一片花海中,难免会有杂草。修剪杂草比为花朵提供食物和光照(是的,这个类比有些牵强)要不那么重要。关键是培养最有前景和最有价值的数据产品,同时允许自然选择过程的发生——并让学习哪些有效、哪些无效的过程得以进行。是的,构造不良的数据产品不会被使用,会失去资金,并最终应该被淘汰。但更重要的是,有价值的数据产品将取而代之,并希望能够蓬勃发展。
-
让数据产品易于查找、理解、使用和信任:企业必须建立一个一致的数据产品“注册表”,其中展示必要的数据词汇表、知识图谱、治理信息和反馈。然而,企业还必须确保数据生产者能够轻松创建、认证和管理注册表中的数据产品。为了使数据值得信赖,数据产品的消费者(和生产者)必须能够向数据产品所有者提供反馈。用现代的说法,他们应该能够“点赞”、“投票”或“收藏”数据产品。这个“众包”模式在软件(GitHub “stars”)和社交媒体(Facebook “likes”)中效果极佳,为数据产品所有者提供了宏观的数据产品质量和可信度视图,同时为数据产品所有者提供了宝贵的信息。不言而喻,“企业”的角色是提供工具和设施,使反馈提供变得简单。
-
简化和优化数据产品治理:企业应定义每个数据产品所有者必须提供的绝对最小属性、指标和服务水平。但企业还必须提供支持工具和设施,以便数据产品所有者能够轻松建立和发布这些信息。
结论
本文描述了数据网格如何拥抱数据联邦——以及数据管理——以显著提高速度,促进敏捷性,并实现地方自主。我们展示了数据网格作为数据联邦和数据管理的关键推动因素,并指出了在扩展数据网格时的潜在挑战。但我们也提出了在数据网格中联邦数据的新原则,同时提供了与数据网格一起扩展数据联邦的新原则。
正因如此,我希望不仅能够助力于您的企业数据网格之旅,更重要的是,加速其成长!
除非另有说明,本文档中的所有图片均由 Eric Broda(本文作者)创建。所有图片中使用的图标均为库存 PowerPoint 图标和/或不受版权保护。
本文中表达的观点仅代表我个人,不一定反映我的客户的观点。
使用 TOML 配置轻松管理深度学习模型
你可能永远不需要那些长 CLI 参数来运行你的 train.py
·
关注 发表在 Towards Data Science ·4 分钟阅读·2023 年 6 月 15 日
–
照片由Scott Graham提供,来源于Unsplash
管理深度学习模型可能很困难,因为需要为所有模块配置大量参数和设置。训练模块可能需要诸如batch_size
或num_epochs
的参数,或用于学习率调度器的参数。同样,数据预处理模块可能需要train_test_split
或用于图像增强的参数。
管理或引入这些参数到管道中的一种天真的方法是将它们作为 CLI 参数传递给脚本。命令行参数可能很难输入,并且在单个文件中管理所有参数可能不切实际。TOML 文件提供了一种更清洁的配置管理方式,脚本可以以 Python dict
的形式加载配置的必要部分,而无需读取/解析命令行参数的样板代码。
在这篇博客中,我们将深入探讨 TOML 在配置文件中的使用,以及如何在训练/部署脚本中高效地使用它们。
什么是 TOML 文件?
TOML,代表Tom’s Obvious Minimal Language,是一种专门为配置文件设计的文件格式。TOML 文件的概念与YAML/YML 文件非常相似,这些文件能够以树状层次结构存储键值对。TOML 相对于 YAML 的一个优点是其可读性,当存在多个嵌套层级时,这一点尤为重要。
图 1. 同一模型配置以 TOML(左)和 YAML(右)编写。TOML 允许我们在相同的缩进级别下编写键值对,无论层次结构如何。
就个人而言,除了增强的可读性,我找不到任何实用的理由来优先选择 TOML 而非 YAML。使用 YAML 完全没问题,这里有一个Python 包用于解析 YAML。
为什么我们需要在 TOML 中配置?
使用 TOML 存储模型/数据/部署配置有两个优势:
在单个文件中管理所有配置:通过 TOML 文件,我们可以为不同模块创建多个设置组。例如,在图 1 中,与模型训练过程相关的设置嵌套在[train]
属性下,类似地,模型部署所需的port
和host
存储在deploy
下。我们不需要在train.py
或deploy.py
之间跳转以更改参数,而是可以从单个 TOML 配置文件中全局化所有设置。
如果我们在虚拟机上训练模型,而没有代码编辑器或 IDE 可用来编辑文件,这可能会非常有帮助。单个配置文件可以通过大多数虚拟机上可用的
vim
或nano
轻松编辑。
我们如何从 TOML 中读取配置?
要从 TOML 文件中读取配置,可以使用两个 Python 包,[toml](https://github.com/uiri/toml)
和 [munch](https://github.com/uiri/toml)
。toml
将帮助我们读取 TOML 文件并返回文件内容作为 Python dict
。munch
将转换dict
的内容以实现属性样式的元素访问。例如,不需要写config[ "training" ][ "num_epochs" ]
,我们可以直接写config.training.num_epochs
,这增强了可读性。
请考虑以下文件结构,
- config.py
- train.py
- project_config.toml
project_config.toml
包含我们的 ML 项目的配置,如,
[data]
vocab_size = 5589
seq_length = 10
test_split = 0.3
data_path = "dataset/"
data_tensors_path = "data_tensors/"
[model]
embedding_dim = 256
num_blocks = 5
num_heads_in_block = 3
[train]
num_epochs = 10
batch_size = 32
learning_rate = 0.001
checkpoint_path = "auto"
在 config.py
中,我们创建了一个函数,该函数返回使用 toml
和 munch
的 munchified 版本的配置,
$> pip install toml munch
import toml
import munch
def load_global_config( filepath : str = "project_config.toml" ):
return munch.munchify( toml.load( filepath ) )
def save_global_config( new_config , filepath : str = "project_config.toml" ):
with open( filepath , "w" ) as file:
toml.dump( new_config , file )
现在,在我们项目的任何文件中,比如 train.py
或 predict.py
,我们都可以加载这个配置,
from config import load_global_config
config = load_global_config()
batch_size = config.train.batch_size
lr = config.train.learning_rate
if config.train.checkpoint_path == "auto":
# Make a directory with name as current timestamp
pass
print( toml.load( filepath ) )
的输出是,
{'data': {'data_path': 'dataset/',
'data_tensors_path': 'data_tensors/',
'seq_length': 10,
'test_split': 0.3,
'vocab_size': 5589},
'model': {'embedding_dim': 256, 'num_blocks': 5, 'num_heads_in_block': 3},
'train': {'batch_size': 32,
'checkpoint_path': 'auto',
'learning_rate': 0.001,
'num_epochs': 10}}
如果您正在使用像 W&B Tracking 或 MLFlow 这样的 MLOps 工具,将配置保持为 dict
可能会很有帮助,因为我们可以直接将其作为参数传递。
结束
希望您考虑在您的下一个 ML 项目中使用 TOML 配置!这是管理全局或局部于您的训练/部署或推理脚本的设置的一种清晰方式。
而不是编写长长的命令行参数,脚本可以直接从 TOML 文件中加载配置。如果我们希望用不同的超参数训练两个版本的模型,我们只需在 config.py
中更改 TOML 文件。我最近的项目中开始使用 TOML 文件,实验变得更快了。MLOps 工具也可以管理模型的版本以及它们的配置,但以上讨论的方法的简单性是独特的,并且需要最小的现有项目更改。
希望您喜欢阅读。祝您有个愉快的一天!
在单台机器上管理多个 CUDA 版本:全面指南
如何在开发环境中处理不同的 CUDA 版本
· 发表在Towards Data Science ·阅读时间 6 分钟·2023 年 10 月 27 日
–
照片由Nikola Majksner提供,发布在Unsplash
在我以前的 AI 顾问角色中,我负责利用虚拟环境作为管理和隔离 Python 环境的工具。鉴于该项目依赖 GPU 加速,我遇到了已安装的 CUDA 版本与项目所需版本不匹配的情况。为了解决这个问题,我不得不安装必要的 CUDA 版本并配置我的环境以使用它,而不影响系统的 CUDA 设置。据我所知,针对这种特定需求的全面教程非常稀缺。因此,本教程为那些寻求了解如何在项目中安全管理多个 CUDA 工具包版本的人提供了宝贵的资源。
目录:
· 1. 介绍
· 2. CUDA 可用版本
· 3. 下载和提取二进制文件
· 4. 安装 CUDA 工具包
· 5. 项目设置
· 6. 结论
1. 介绍
在系统上安装多个版本的 CUDA 工具包可能会产生多种影响和后果,其中一些可能会影响你的系统:
-
这可能会导致系统
PATH
和环境变量中的冲突。如果管理不当,这些冲突可能会影响默认使用的 CUDA 版本。 -
这可能需要特定的 GPU 驱动程序版本以实现最佳性能和兼容性。安装新版本可能需要更新你的 GPU 驱动程序。
-
一些库和软件可能依赖于特定的 CUDA 版本。安装新版本可能会破坏与这些依赖项的兼容性。
-
依赖于 CUDA 的应用程序可能需要进行调整,以便与新版本兼容。不兼容可能会导致错误或意外行为。
-
不正确地管理多个 CUDA 版本可能导致系统不稳定或 GPU 加速应用程序出现错误。
因此,为了安全地管理项目的多个 CUDA Toolkit 版本,请按照以下步骤操作:
-
检查系统当前的 CUDA 版本。
-
下载并解压所需版本的二进制文件。
-
执行安装程序,仅安装工具包。
在本教程中,我将提供一个详细的逐步示例,说明如何完成此操作。此外,我将指导您在成功安装二进制文件后设置虚拟环境。
2. 可用的 CUDA 版本
通过运行命令 nvidia-smi
来查看系统当前使用的 CUDA 版本:
如您所见,CUDA 版本为 12.1。
现在让我们显示我机器上可用的 CUDA 版本:
$ ls /usr/local/ | grep cuda
cuda
cuda-11.7
cuda-12
cuda-12.1
我的机器上有三个不同的版本。
3. 下载并解压二进制文件
假设我将要处理的项目需要 CUDA Toolkit 版本 11.8。要获取它,我们首先访问 NVIDIA CUDA Toolkit Archive 网站:这里。我们找到项目所需的特定版本的 CUDA Toolkit。重要的是确保我们选择与操作系统兼容的版本。在我的例子中,我选择了目标平台:
我的目标平台:Linux — x86_64 — Ubuntu — 22.04
选择与您的操作系统对应的 CUDA Toolkit 的runfile (local)
版本。此文件通常带有 .run
扩展名。选择 runfile (local)
时,网站会提供安装说明。在我的情况下,提供的说明如下:
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run
然而,必须牢记,我们的目标不是安装此版本,因为已经有一个更新版本。因此,我们只需按照第一条说明下载文件:
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
可以通过将 MD5 校验和与下载文件的校验和进行比较来验证下载。请访问 此链接 进行验证。
“本地安装程序是自包含的。它是一个大型文件,只需从互联网下载一次即可,在多个系统上安装。本地安装程序是推荐的安装类型,适用于带宽较低的互联网连接,或者在无法使用网络安装程序的情况下(例如由于防火墙限制)。” [1]
此时,打开终端,进入您传输 CUDA runfile 的目录,并使 CUDA runfile 可执行:
chmod +x cuda_11.8.0_520.61.05_linux.run
4. 安装 CUDA 工具包
现在,我们使用--silent
和--toolkit
标志运行 CUDA runfile,以进行 CUDA Toolkit 的静默安装:
sudo ./cuda_11.8.0_520.61.05_linux.run --silent --toolkit
其中:
-
--silent
: 进行无进一步用户输入和最小命令行输出的安装。 -
--toolkit
: 仅安装 CUDA Toolkit 并保留当前驱动程序。
如果系统要求你接受协议,请接受以继续安装。
到此为止,CUDA 工具包二进制文件已被提取。我们可以通过再次运行以下命令来确认:
$ ls /usr/local/ | grep cuda
cuda
cuda-11.7
cuda-11.8
cuda-12
cuda-12.1
如你所见,cuda-11.8
现在在我的机器上可用,系统当前版本保持不变(你可以通过运行nvidia-smi
确认)。
这些步骤允许你安装 CUDA 版本的二进制文件。在下一节中,我将展示如何设置项目以使用所需的 CUDA 版本。
5. 项目设置
在处理多个项目时,建议使用虚拟环境。我们从创建一个虚拟环境开始。在我的情况下,需要python3.8
。要创建虚拟环境,我们可以使用以下命令。我在venv
文件夹中创建了一个名为my_venv
的环境,这是我放置虚拟环境的文件夹:
python3.8 -m venv venv/my_env
source venv/my_env/bin/activate
让我们看看当前使用的 CUDA 版本:
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Thu_Nov_18_09:45:30_PST_2021
Cuda compilation tools, release 11.5, V11.5.119
Build cuda_11.5.r11.5/compiler.30672275_0
如你所见,创建的环境没有使用所需的 CUDA 版本,因此我们需要通过更新 activate 文件并添加以下行来手动设置:
export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
你可以使用你喜欢的编辑器更新 activate 文件,或者你可以简单地运行以下命令将文本追加到文件末尾:
echo "export PATH=/usr/local/cuda-11.8/bin:$PATH" >> venv/my_env/bin/activate
echo "LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH" >> venv/my_env/bin/activate
最后,我们需要重新激活环境并再次运行nvcc
命令:
$ source venv/nerfstudio/bin/activate
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0
就这些!现在项目已经配置为运行所需的 CUDA 版本,并且没有冲突!
6. 结论
按照本教程中的步骤,你可以成功地在系统上维护多个 CUDA 版本,而不会遇到安装之间的冲突。这种灵活性使每个项目能够使用其所需的确切 CUDA 版本,通过配置环境变量来实现。
感谢阅读。希望你喜欢本教程。如果你喜欢我的教程,请通过关注和订阅来支持我。这样,你将收到有关我新文章的通知。如果你有任何问题或建议,请随时在下面留言。
参考文献
图片来源
本文中所有未在标题中提及来源的图像和图形均由作者提供。