ChatGPT 智能吗?一项科学评审
对当前人工智能范式未来展望的科学辩论的外行人回顾
·
关注 发表于 Towards Data Science ·15 分钟阅读·2023 年 12 月 14 日
–
一年多前,OpenAI 发布了 ChatGPT,引起了全球轰动。ChatGPT 提供了一种全新的与计算机互动的方式:比我们习惯的方式更自然、灵活。最重要的是,ChatGPT 似乎可以做几乎任何事:它能击败大多数人类在 SAT 考试中的表现和通过律师资格考试。几个月内,人们发现它能很好地下棋,并几乎通过放射学考试,还有人声称它发展出了心智理论。
这些令人印象深刻的能力促使许多人宣称 AGI(人工通用智能——具备与人类相当或超越人类的认知能力)即将到来。然而,也有人对这项新兴技术保持怀疑,指出简单的记忆和模式匹配不应与真正的智能混淆。
但我们如何真正区分这些呢?在 2023 年初提出这些说法时,关于 LLMs(大型语言模型)智能的问题相对较少的科学研究。然而,2023 年出现了几个非常巧妙的科学实验,旨在区分记忆来自语料库和应用真正智能之间的差异。
下面的文章将探讨这一领域中一些最具启发性的研究,为怀疑者提供科学依据。文章旨在对所有人开放,无需任何背景知识。读完后,你应该对怀疑者的观点有一个相当扎实的理解。
但首先了解一下 LLMs
在本节中,我将解释一些理解 LLMs——GPT 背后的技术——所需的基本概念,而不涉及技术细节。如果你对监督学习和 LLMs 的操作有一定了解,你可以跳过这一部分。
大型语言模型是机器学习中一个经典的范式,称为“监督学习”。使用监督学习时,我们必须拥有一个包含输入和期望输出的数据集,这些数据被输入到一个算法中(有许多可能的模型可供选择),算法试图找出这些输入和输出之间的关系。例如,我可能有房地产数据:一个包含房间数量、面积和房屋位置(输入)以及它们售出价格(输出)的 Excel 表格。这些数据被输入到一个算法中,算法提取输入和输出之间的关系——它会找出房屋面积的增加或位置如何影响价格。将数据输入算法以“学习”输入输出关系的过程称为“训练”。
训练完成后,我们可以用模型来对没有价格的房屋进行预测。模型将使用训练阶段学到的相关性来输出估计价格。估计的准确性取决于许多因素,最重要的是训练中使用的数据。
这种“监督学习”范式对几乎任何拥有大量数据的场景都极具灵活性。模型可以学习到:
-
识别图像中的物体(给定一组图像和每个图像的正确标签,例如“猫”、“狗”等)
-
将电子邮件分类为垃圾邮件(给定一个已经标记为垃圾邮件/非垃圾邮件的电子邮件数据集)
-
预测句子中的下一个词。
大型语言模型(LLMs)属于最后一种类型:它们接受大量文本(大多来自互联网),每段文本被拆分成前 N 个词作为输入,N+1 个词作为期望输出。训练完成后,我们可以用它们来自动完成句子。
除了大量来自互联网的文本,OpenAI 在其训练中还使用了精心编排的对话文本。用这些问答文本训练模型对于使其表现得像助手至关重要。
预测的具体工作原理取决于所使用的算法。大型语言模型使用一种称为“变换器”的架构,其细节对我们并不重要。重要的是,大型语言模型有两个“阶段”:训练和预测;它们要么接收文本,从中提取词语之间的相关性来预测下一个词,要么接收一个待完成的文本。请注意,整个监督学习范式假设训练期间提供的数据与用于预测的数据相似。如果你用它来预测来自完全新来源的数据(例如,来自另一个国家的房地产数据),预测的准确性会受到影响。
现在回到智能问题上
ChatGPT 通过训练自动完成句子来发展智能吗?要回答这个问题,我们必须定义“智能”。以下是定义智能的一种方式:
(图片由作者提供)
你明白了吗?如果不明白,ChatGPT 可以解释:
(图片由作者提供)
看起来 ChatGPT 确实展现了智能——因为它足够灵活地适应了新的“拼写”。但真的如此吗?你,读者,可能能够适应你未曾见过的拼写,但ChatGPT 在互联网上的大量数据上进行训练:而这个例子在许多网站上都可以找到。当 GPT 解释这个短语时,它只是使用了与其训练中发现的相似的词汇,这并不表现出灵活性。如果这个短语“IN73LL1G3NC3”没有出现在它的训练数据中,它会表现出智能吗?
这就是 LLM-AGI 辩论的核心:GPT(以及 LLMs 一般来说)是否发展出了真正的、灵活的智能,还是只是重复它见过的文本的变体?
我们如何区分这两者?让我们转向科学,探索 LLMs 的能力和局限性。
反转诅咒:LLMs 在“A 是 B”的训练中未能学会“B 是 A”
假设我告诉你奥拉夫·朔尔茨是德国第九任总理,你能告诉我谁是德国第九任总理吗?这对你来说可能显得微不足道,但对 LLMs 来说却远非显而易见。
在这篇出色的论文中,研究人员询问 ChatGPT 关于 1000 位名人的父母的名字(例如:“汤姆·克鲁斯的母亲是谁?”),ChatGPT 能正确回答 79%的时间(在这种情况下为“玛丽·李·费佛”)。研究人员然后利用 GPT 回答正确的问题,提出相反的问题:“玛丽·李·费佛的儿子是谁?”虽然回答这两个问题所需的知识是相同的,GPT 仅在 33%的这些查询中回答成功。
为什么会这样?请记住,GPT 没有“记忆”或“数据库”——它所能做的只是根据上下文预测一个词。由于玛丽·李·费佛被提及为汤姆·克鲁斯的母亲的频率远高于他被提及为她儿子的频率——GPT 可以回忆起一个方向而不是另一个。
ChatGPT 未能记起汤姆·克鲁斯是玛丽·李·费佛的儿子(图片由作者提供)
为了强调这一点,研究人员创建了一个虚构事实的数据集,结构为“<描述>是<名字>”,例如,“第一个登上火星的人是泰勒·奥克里奇”。然后,LLMs 在这个数据集上进行了训练,并询问描述:“谁是第一个登上火星的人”——GPT-3 在这个问题上成功率为 96%。
但当被问及名字——“谁是 Tyler Oakridge”时——GPT 得分为 0%。这可能一开始让人感到惊讶,但与我们对监督学习的了解一致:GPT 无法将这些事实编码到记忆中并随后回忆,它只能根据词序列预测一个词。由于在所有文本中,它读到名字后面跟着描述,而不是相反——它从未学会预测有关名字的事实。显然,仅通过自动完成训练开发的记忆是非常有限的。
推理还是背诵?通过反事实任务探索语言模型的能力与局限性
这篇论文可能是我将要探讨的最重要的论文,旨在揭示记忆与智能之间的核心差异。它由几个小型实验组成,所有实验都使用反事实任务。以下是一个反事实任务的示例:
算术通常在基数为 10 的情况下进行(使用数字 0–9),然而,其他数字系统可以使用,只使用这些数字的子集或附加数字。
一个反事实任务可以是在除了 10 以外的任何基数中解决算术问题:完成任务所需的抽象技能是相同的,但你会发现互联网(以及 LLM 训练集)上有显著更多的十进制系统的例子。当 GPT-4 在基数为 10 的情况下被问及简单的算术问题(27+62)时,它 100%准确地回答了所有问题。然而,当要求它在计算中使用基数为 9 时,它的成功率降至 23%。这表明它未能学习到抽象的算术技能,且仅依赖于它所见过的类似示例。
这些反事实任务被创建用于几个其他领域,如下所示:
GPT-4 在各种任务的默认版本(蓝色)和反事实对应任务(橙色)上的表现。与默认任务实例相比,GPT-4 在反事实变体上的表现始终且显著较差。(图片由文章作者之一 Zhaofeng Wu 慷慨提供)
另一个反事实是:Python 使用零起始编号;然而,这只是一个约定,我们可以很容易地创建一个一基数的编程语言。在一种一基数的 Python 变体中编写代码需要与正常 Python 相同的技能,任何有经验的程序员都能迅速适应这种变化。但 GPT-4 在生成 Python 代码时得分 82%,而在要求使用一基数变体时仅得 40%。在代码解释测试(预测一段代码的作用)中,它对正常 Python 的得分为 74%,而对不常见的变体得分为 25%。
但我们不必涉足不同的 Python 版本。即使在普通 Python 中,LLM 在面对你无法在网络上找到的奇怪编码任务时也会失败,正如Filip Pieniewski 最近在 Gemini 上展示的。
在国际象棋中,GPT 被要求评估一系列走法是否合法。对于普通棋局,它 88%的时间准确预测了走法的合法性。但当主教和骑士的起始位置被调换时,它对走法合法性的猜测变得完全随机,而即使是新手玩家也应能轻松适应这些变化。
实际上,Jonas Persson 展示了你甚至不需要改变起始位置。如果你和 GPT 开始下棋,并进行非常非常规但合法的走法——它可能会声称这些走法是非法的,因为它从未见过类似的走法。正如 Persson 精辟指出的:
“当达到足够的先进水平时,纯粹的模式识别可以模仿规则导向的推理。但它们是不同的。和 GPT-4 下棋就像进入一个假村。离开主街,进入小巷——做一些意外的事情——你立即意识到那些令人印象深刻的房子都是支撑起来的布景。”
GPT 声称将车移动到 h3 是一个非法走法。(图片来源于作者)
这一发现对 LLM 作为通用智能技术的指责非常严重。解决问题通常涉及制定新的规则或对问题进行概念化:程序员可能编写一个具有创新内部逻辑的库,数学家可能发明一个新的数学分支,或者艺术家可能创造新的艺术风格——他们都理解当前范式的局限性,然后为新的范式制定规则。即使是更平凡的活动也需要这种灵活性:如果道路被阻塞,你可能需要偏离标记的路径。GPT 能做到这些吗?如果它在明确要求时不能一致地遵循反事实规则,它能否“意识到”一个问题的解决需要一组新的规则,从而突破默认范式? 基于数据相关性检测的引擎是否足够灵活以应对新情况?
思维理论(ToM)
心智理论是理解其他人可能有不同的信念和愿望的能力,这种能力在儿童发展的最初几年是缺失的。一种测试心智理论的方法是给孩子一个标有“巧克力”的盒子,而实际上里面装的是铅笔。然后我们展示盒子的真实内容,并问孩子:“你的朋友杰里米会认为盒子里是什么?”如果孩子还没有发展出心智理论,他们会回答“铅笔”——因为他们不能将自己对内容的知识与其他人可能的想法分开。
尚未发展出心智理论的孩子无法将自己对内容的知识与其他人可能的想法分开。(图片由作者提供)
这种能力对于理解一个人的动机至关重要,因此对 AGI 的发展至关重要。想象一下你有一个多功能机器人,你给它的指令是“清理房间”。在清理的过程中,机器人必须做出几个关于清理或移动的决策;那张碎纸重要吗,还是应该扔掉?我是否应该先询问?一般来说,一个智能体需要理解我的动机和知识的局限性,才能填补复杂请求的实施细节。
因此,当 新的研究声称心智理论可能在 LLM 中自发出现时,它在 AI 领域引起了很多关注。文章使用了文本版的铅笔/巧克力考试来测试 GPT-4,并发现其表现相当于七岁的水平。这可能最初看起来很令人印象深刻,但请记住“IN73LL1G3NC3”示例:GPT 的训练数据中可能包含这些测试问题的例子。因此,这与一个没有类似问题训练的孩子的公平比较并不相同。如果我们想测试 GPT 的心智理论能力——我们必须创建一个新的考试,我们可以确信它不在其训练数据中。
FANToM: 机器心智理论互动压力测试基准
本文提出了一个新的 ToM 基准,其中包含了几个多参与者对话。在这些对话中,有些参与者会“离开房间”一段时间,而其他参与者则继续对话。然后,LLM 会被问到几个关于谁知道什么的问题:凯莉是否知道琳达的狗是什么品种?谁知道它是什么品种?大卫会认为它是什么品种?只有当 LLM 在所有涉及同一信息的问题上回答正确时,它的回答才被视为正确。
这可能是一个令人困惑的任务,因此即使是人类在这项测试中的得分也只有 87.5%。然而,GPT-4 的得分为 4.1%或 12.3%,具体取决于 GPT 版本;这与 GPT 发展出人类级别的 ToM 的说法几乎不一致。
FANToM 数据集的解释。(图片由文章作者之一 Melanie Sclar 慷慨提供)
关于心理测量考试构建效度的说明
关于所有心理测量测试,人们常常混淆测试与其试图测量的质量。我们关心 SAT 分数的原因是因为它们与大学表现相关。儿童在 ToM 考试中的成功与其他有价值的行为相关:理解一个人的面部表情、记住一个人的个性特征,或能够看一部电影并理解角色的动机。虽然这些测试与行为之间的相关性在人的身上已经被证明,但没有理由认为它们也适用于 LLMs。 事实上,尽管 SAT 的结果令人印象深刻,GPT 在数学、化学和物理的开放性大学水平考试中平均得分为 28%。除非有其他证明,否则通过测试并不能证明其他能力,除了能正确回答测试问题。
但对于 ToM 来说,没有相关性可言:LLMs 是否通过 ToM 测试 — 它们不能看到面部表情、观看电影,甚至不能记住一个人及其动机。由于我们在测量 ToM 时真正感兴趣的行为对 LLMs 来说是不可用的,LLMs 发展出心智理论的想法不仅是错误的,还可能是毫无意义的(或至少:需要对这一术语有新的定义和理解)。
关于大型语言模型的规划能力 — 一项批判性调查
这个实验试图探测 LLM 的规划能力。一个例子任务是将彩色积木按特定顺序堆叠,给定积木的“初始状态”(在桌子上以某种顺序排列)。LLM 会得到一系列明确定义的可能行动,例如:
Action: pickup
Parameter: which object
Precondition: the object has nothing on it,
the object is on-table,
the hand is empty
Effect: object is in hand,
the hand is not empty
LLM 的任务是指定一系列需要采取的行动以实现目标。
一个类似的任务涉及从一个地址发送包裹到另一个地址,而可用的行动是卡车和飞机运送。这些是相对简单的规划任务,仅使用少量可能的行动,然而,GPT-4 在积木拼图中得分为 12–35%,在物流任务中得分为 5–14%(取决于 GPT 版本)。
此外,如果将行动的名称替换为随机词(从“pickup”到“attack”),即使每个行动的定义保持类似,GPT 的成功率也会降到 0-3%。换句话说,GPT 并没有使用抽象思维来解决这些问题,而是依赖于语义。
结论,LLMs 是否是通用人工智能的路径?
定义智能并非易事,但我认为任何真正的智能应至少包含四个元素:
-
抽象——将对象识别为更大类别或规则的一部分的能力。这种对世界的抽象表示可以被称为认知“世界模型”。例如,理解你视网膜上的不同图像指代同一个人,或在棋局中,某一步棋是合法的,因为它符合任何棋局的规则框架。
-
记忆——在世界模型中将属性附加到实体及其之间关系的能力,并随着时间的推移进行更新。例如,一旦你识别出一个人,你可能会记得有关他们的其他属性或他们与其他个体的关系。
-
推理和推断——利用世界模型在新的或想象的世界状态中对实体的行为得出结论的能力。例如,根据抛球的属性预测球的轨迹,或根据一个人的特征预测其行为。
-
规划——使用推理来制定一系列行动以实现目标的能力。
一年前,我们可以根据 LLM 的架构从分析上推断这些元素不太可能出现在 LLM 中,但今天我们不再需要这种分析推断,因为我们有实证数据表明 LLM 在上述所有元素上的表现都很差。它们不过是统计自动补全模型,使用一种强大的模式匹配方法。有关当前机器学习范式中缺失的智能元素的更深入分析,请参见 Gary Marcus 的著名文章“深度学习正遇到瓶颈”。
当 ChatGPT 首次发布时,我的一位朋友告诉我,与它交谈感觉像是魔法。但就像一个魔术师将人锯成两半一样——在我们声称锯技术可以彻底改变手术之前,仔细审查表演并在不同环境下进行测试是很重要的。LLM 使用的“技巧”是它们训练了大量的文本,使它们能够对许多问题给出合理的答案。但在未曾涉足的领域进行测试时,它们的能力会消失。
GPT-5 会更好吗?假设它仍然使用 GPT 架构,仅仅在更多的数据和更多的参数下进行训练,那么几乎没有理由期待它会发展出抽象或推理能力。正如谷歌的 AI 研究员弗朗索瓦·肖莱特所说:“令人着迷的是,自 2017 年以来深度学习的局限性一直没有改变。相同的问题,相同的失败模式,没有进展。”
由于最近关于 AI 监管和 LLMs 潜在危险的讨论很多,我觉得有必要明确指出,缺乏真正的智能并不意味着 LLMs 没有潜在风险。显然,人类拥有几种没有智能宣称却能以各种方式对社会造成伤害的技术,这些技术需要被控制。
通过我们对 LLMs 局限性的重新理解,我们可以更准确地预测可能出现的危害:由于智能似乎不会立刻出现,Skynet 和 Matrix 不必担心。让我们担忧的可能是那些只需要快速生成逼真文本的活动,例如网络钓鱼和传播假新闻。然而,LLMs 是否真正为这些任务提供了一种颠覆性工具则是另一个辩论。
关于 AGI 的未来,谁也无法预测。也许在未来的智能人工体中会使用一些在 LLMs 中应用的机器学习技术,也许不会。但毫无疑问,在智能所需的灵活性出现之前,主要的谜题部分仍然缺失。
数据民主化是否被夸大了?
组织如何为实现数据民主文化过程中可能遇到的障碍和成功因素做好准备
·
关注 发布于 Towards Data Science ·7 min read·Sep 26, 2023
–
数据民主化目前是讨论更有效利用商业数据时的主要理念之一。然而,数据民主化或其缺乏也被列为在美国和欧洲组织中从数据使用中获取更多价值的主要挑战。
因此,是时候问一下我们是否一直在错方向上努力。对数据民主化的炒作是否合理?为了回答这些问题,我们需要探讨企业和其他组织在尝试民主化数据时遇到的障碍,以及需要解决的数据民主化的成功因素。
定义数据民主化
与许多相对新颖的概念一样,数据民主化的定义尚未稳定,各个使用者对这一术语的理解可能有所不同。通常,数据民主化会被定义为使组织内的最终用户能够独立访问更多数据。正如我们将看到的,这种宽泛的定义不足以捕捉民主化的本质。
单纯地给员工更多数据访问权限,并不会使他们实际使用数据更多或获得更好的结果。数据民主化的定义必须包括不仅是表面的数据访问,还包括实际的、持续的员工赋权,使其不断使用数据并提高分析技能。因此,“自助分析”这一术语可能比“数据民主化”更准确地抓住了这种内部开放数据框架的本质。
数据民主化为何重要?
理论上,允许更多业务用户访问更大部分组织数据的好处已经得到认可,并在实践中进行了测试。
首先,数据民主化能够更有效地利用时间和资源。公民数据科学家,指的是既是领域专家又能熟练使用和处理数据的人员,对于企业实现这种效率至关重要。
一方面,公民数据科学家将平凡的数据管理任务从专业数据科学家手中接过,允许后者专注于更高层次的职责。另一方面,领域专家在能够自行提取和处理数据时,也可以更快地完成他们的工作,而不是请求数据相关服务。
此外,数据民主化将其从黑暗中带出。全球范围内,超过 50%的数据在各种公司流程中被收集后存储却未被利用,占用了存储空间,增加了数据安全和管理成本,并消耗了电力。提供更广泛的公司数据访问可以显著减少黑暗数据的体积,并创造从现在仅仅是负担的数据中提取价值的机会。
此外,当更多具有广泛专业知识的团队被允许查看数据时,决策会变得更好、更全面。由于特定专业背景形成的个人偏见和先入为主的观念将对数据推理的影响减小,使得数据驱动的推理更加多样化和客观。
最终,数据的获取赋予了员工权力,并有助于创造一种归属感。除了技能提升和操作速度的直接好处外,这种赋权还提升了员工的士气,他们现在对大局和自身角色有了更深入的理解。
自助分析的障碍
由于每个组织都类似于选择其政治秩序的社会,我们可以通过将数据民主化和转向自助分析的挑战与阻碍国家民主维持的挑战进行比较,从而更好地理解这些挑战。
资源的可用性
在大多数民主国家,所有公民都有权访问政府机构持有的信息。然而,如果没有建立的程序、易于理解的目录和数字基础设施,只有少数人能够查看存放在庞大档案馆中的记录。
同样,单纯将数据访问权限授予更多员工并不会显著扩展数据用户的范围。创建有效的数据民主不仅需要形式上的自由,还需要 substantial resources 来使用数据。这包括为员工提供分析工具,使他们能够处理内部数据,甚至收集额外的公开信息,以完成他们的任务。
将这一点付诸实践是复杂的,因为公司必须寻找或开发一个定制解决方案,该方案需要为有经验的数据用户提供 SQL 接口,同时为初学者提供某种“拖放”功能。这类工具确实存在,但需要良好的数据建模。在 Oxylabs,我们选择了 Apache Superset,然而,没有“一刀切”的解决方案,每个组织都必须寻找最适合其员工技能和需求的工具。
这使我们面临第二个主要挑战——即素养。教育对各种形式的有效民主至关重要。因此,应该建立适当的培训机会,以分享与数据相关的实际、法律和伦理知识。没有这些,员工可能无法使用开放数据,或者更糟糕的是,错误地解读数据,得出不正确的结论。
不幸的是,确保每个人了解业务数据的广泛背景,并使用相同的定义(例如什么是“活跃用户”或“产品销售”)为数据团队带来了大量额外工作——这是数据民主化应该解决的主要挑战。
共享责任
当曾经生活在独裁统治下的人们过渡到民主制度时,主要挑战之一是学习如何承担与自由和自我治理相伴随的公共福祉的个人责任。
在过渡到数据民主化的情况下,同样的挑战表现为接受数据保护作为每位员工的共同责任。当管理和共享数据是 IT 和数据专家的专属领域时,确保这些过程的质量、安全性和合规性的责任也落在他们身上。这可能对相当一部分员工来说更为可取,因为新的责任形式可能让人感到恐惧。
因此,目标是说服员工不怕使用数据,并赋予他们以安全和负责任的方式使用数据的能力。上述全面的数据规范和网络安全培训对实现这一目标至关重要。Airbnb 提供了一个良好的示例,通过建立内部数据大学来提高员工的数据素养;之前,公司通过推出名为 Dataportal 的数据探索工具来开放内部数据访问。
Netflix 和 Uber 等公司也采用了自助分析工具,并配以内部数据培训。对于决定走这条路的公司来说,最重要的因素是是否应以相同的方式涉及所有员工(这很少发生)。通常,组织从将员工分为不同目标群体或角色,并赋予不同的数据访问权限和定制教育中获益。
文化转变
在民主化的情况下,激励合作和分散决策的文化至关重要——未能培养合适的文化可能使得良好的物质条件失效。即使所有必要的工具都可用,大多数员工也准备承担数据安全责任,没有组织范围的文化转变,民主化将会失败。这种转变是数据民主化成功因素的基础。
-
高层管理支持。 管理层同意民主化倡议并不一定意味着他们准备积极支持这一措施。没有高层管理的监督和显著兴趣,退回到旧的做事方式是很容易的。
-
拥有明确的愿景和计划。宣布民主化是一回事,而实施它则是另一回事。当组织内对开放数据的角色没有愿景且没有行动计划时,数据民主化的发展很少能超越初始步骤。
-
不同团队之间共享数据的意愿。 民主是一个基于互信和合作的开放社会。然而,组织内部的团队可能不愿意与他人共享数据,认为这是一项麻烦的额外任务,甚至可能会互相踩脚。
-
推动和支持与数据相关的举措。 非专家业务用户的基于数据的举措未必能产生预期结果或迅速实现。鼓励员工继续实验需要果断地选择创新的潜力而不是短期的生产力。
这些都不是一蹴而就的。改变组织文化是一个漫长而曲折的过程,过程中有很多机会让人感到沮丧或奋发向上。
结论
正如温斯顿·丘吉尔所说,民主是最糟糕的政府形式,但比其他所有形式都要好。数据民主也是如此。
尽管尝试将组织数据民主化注定会存在缺陷和许多障碍,但这是我们所知道的最佳前进道路。将不断增长的数据资源封锁起来,并让大多数业务用户完全依赖少数数据专家,显然不是一种可持续的替代方案。
面对现实中的障碍时,对数据民主作为解决所有组织问题的奇迹解决方案的热情会逐渐消退。这时,认真进行协作工作、跨组织分享经验以及积累知识以发展更民主的业务数据管理条件的时机就到了。
决策科学是否正在悄然成为新的数据科学?
原文:
towardsdatascience.com/is-decision-science-quietly-becoming-the-new-data-science-5616a12fa9e8
许多世界顶级公司已开始雇佣决策科学家。这是否标志着一个新时代的悄然开始?
·发布于 Towards Data Science ·6 分钟阅读·2023 年 8 月 2 日
–
图片来源:Steven Coffey 于 Unsplash
如果我告诉你,世界上一些最著名的数据科学家实际上并不是数据科学家呢?
以 Cassie Kozyrkov 为例。Cassie 曾是 Google 的首席数据科学家,但在过去的 5 年里,她一直担任 Google 的首席决策科学家。或者看看 Chris Dowsett,他开始时是一名统计学家,后来成为 Instagram 的决策科学负责人。
在 2023 年,大部分关于“数据驱动工作”的炒作与 GenAI 相关。但在幕后,还有另一个新兴的领域,正在数据世界中悄悄掀起波澜。
认识一下决策科学家。
近年来,越来越多的组织开始雇佣决策科学家。而且我说的并不仅仅是硅谷的利基创业公司——我说的是从 Meta 到曼联以及所有介于它们之间的庞大组织。
那么,决策科学家到底在做什么呢?我们这些在传统数据科学领域工作的人应该如何应对决策科学的兴起?
介绍决策科学:数据科学的腼腆弟弟
根据 Cassie Kozyrkov,即 Google 的首席决策科学家,决策科学是将信息转化为行动的学科。
这是一门在选项之间进行选择的科学。
她写道:
决策智能是一个跨学科领域,涉及决策的各个方面。它将数据科学(统计学、机器学习、人工智能、分析)与行为科学(心理学、神经科学、经济学和管理科学)结合起来。
这难道不只是数据科学的重新命名吗?
如果你觉得这听起来与数据科学惊人地相似,你并不孤单。这也是我最初的反应。
但 Cassie 定义的关键在于那个时尚的小词:“跨学科。”如果数据科学主要是基于应用统计和机器学习的定量学科,我们可以将决策科学视为一个包括定量和定性方法的学科。它的主要关注点是做出决策,这使得它比传统的数据科学(通常过于关注用统计回答问题或用机器学习改进产品)更加全面。
诚然,决策科学的职位发布和 HBR 文章没有数据科学那么多。但作为一个数据科学家,我相信决策科学的兴起将对数据行业产生深远的影响,我们在数据科学领域工作的人最好注意一下。
为什么?因为这表明数据科学正在碎片化……这其实是件好事。
数据科学正在碎片化……这其实是件好事
在存在的前十年中,数据科学是城里的新宠(如果我再听到一次“最性感的工作”……)。
数据科学家曾经是个全能型人才,从商业分析到机器学习工程应有尽有。我们是解决数据驱动商业问题的首选,理论上在董事会和引擎室都得心应手。
但在 2023 年,这已不再是完整的画面。在许多大型企业中,数据科学家不再向高管汇报;他们有分析翻译员来做这件事。他们不再构建数据管道或生产化模型;他们有机器学习工程师和数据运维团队来完成这些工作。在一些公司中,数据科学家甚至不再构建机器学习模型;他们有机器学习科学家来做这件事。
趋势很明显:数据科学正在碎片化。
曾经一个自豪的跨学科领域,现已变得越来越孤立和专业化。有趣的是,十年前的数据科学职位描述(≈“利用机器学习、统计学和批判性思维解决商业问题”)似乎更适用于现代的决策科学家,而不是现代的数据科学家(至少在大型公司中)。
如果你喜欢这个故事,点击我的“关注”按钮对我意义重大——只有 1%的读者会这么做!感谢阅读。
数据科学的围墙是否在增加? 图片由Dilmeer Hazoor提供,来源于Unsplash
数据科学家应该如何应对数据科学的孤立和决策科学的兴起?
如果你是一个数据科学家或数据专业人士,我认为有三个主要的反思要点:
决策科学提醒我们超越统计学/数学,记住定性方法的价值
我喜欢决策科学的一个方面是它强调跨学科方法的价值。
当代数据科学往往更像是应用数学,过于执着于算法和技术细节,而忽视了大局。我们建立了出色的模型,但在企业环境中未能带来实质性进展,因为我们没有解决正确的问题或未能将信息传达给正确的决策者。
决策科学通过提醒我们数据只是回答问题和解决问题的工具,并且——为了达到最佳决策——我们需要借鉴包括行为科学和心理学在内的众多领域,来纠正这种偏见。
你可能永远得不到(或不想要)“决策科学家”这个职位,但跨学科的方法对我们所有从事数据工作的人都有价值。如果你对结合非数学方法感兴趣,可以查看 Cassie 的精彩文章,她介绍了行为经济学中的问题,比如*“改变信息展示方式如何影响选择行为?”* 和心理学中的问题,比如*“情感、启发式和偏见如何影响决策?”*
决策科学的兴起为数据专业人士打开了有趣的职业机会。
当我在 2019 年开始接触数据时,我阅读了无数关于数据科学现状的 Reddit 帖子。当时,数据科学家没有明确的职业路径,万金油的标签意味着许多数据科学家在数据工程或可视化等任务中陷入困境,而这些任务并没有被真正视为核心数据科学“经典”的一部分。
决策科学等专业的兴起是对这种困惑的有益解药。通过区分数据科学和决策科学,公司能够更好地划分不同数据人员的职责,而数据专业人士在专业化方面有了更多选择。
不要误解我的意思——数据科学中总会需要通才,因此通才的数据科学角色不会消失。但在大型组织中,我们可能会看到更多的决策科学家,从个人角度来看,我认为这是一个极好的发展。
为什么?因为如果你对数学/工程方面更感兴趣,你可以选择更多地专注于 MLOps 或数据工程。或者,如果你主要对解决问题感兴趣,那么决策科学可能更适合你,你就不必在机器学习工程或数据治理中陷入困境。
(好吧,我稍微撒了点谎 — 我们永远无法完全摆脱数据治理!但关键是我们有更多的选择。)
3. 人工智能将把我们所有人变成决策科学家
我想说的最后一件事是,人工智能的兴起使得决策科学技能变得愈加重要。
正如我在牛津的教授常常说过,人工智能擅长回答被提出的问题,而不是提出从未被提出过的问题。
决策科学引导我们的注意力去提出正确的问题,在提示工程和自动机器学习的时代,我几乎找不到比这更有价值的技能。
还有一件事 —
我开始了一个名为AI in Five的免费新闻通讯,每周分享 5 个要点,涵盖最新的人工智能新闻、编码技巧和数据科学家/分析师的职业故事。没有炒作,没有“数据是新石油”的废话,也没有来自埃隆的推文(或者现在该说‘x-es’?)— 只有实用的技巧和见解,帮助你在职业发展中取得进步。
点击这里订阅 如果这对你有吸引力!感谢阅读。
[## AI in Five | Matt Chapman | Substack
数以百计的订阅者。来自数据科学和人工智能领域的最新新闻、职业故事和编码技巧…
aiinfive.substack.com](https://aiinfive.substack.com/?source=post_page-----5616a12fa9e8--------------------------------)
F1 分数真的比准确率更好吗?
原文:
towardsdatascience.com/is-f1-score-really-better-than-accuracy-5f87be75ae01
根据不同指标,错误(和正确)的成本是多少?
·发表于 Towards Data Science ·10 分钟阅读·2023 年 4 月 18 日
–
[图片来源:作者]
如果你搜索“哪个指标更好,准确率还是 F1 分数?”,你可能会找到类似的答案:
“如果你的数据集不平衡,忘记准确率,选择 F1 分数。”
如果你寻找解释,可能会发现对“假阴性和假阳性相关的‘不同成本’”的模糊提及。但这些来源并没有明确说明不同指标中这些成本是什么。
这就是我觉得需要写这篇文章的原因:尝试回答以下问题。误报和漏报的成本在准确率中是什么?在 F1 分数中又是什么?是否有某种指标可以让我们为这些成本分配自定义的值?
从混淆矩阵开始
准确率和 F1 分数都可以从所谓的混淆矩阵中计算得出。混淆矩阵是一个方阵,用于比较我们模型预测的标签与真实标签。
这是一个包含两个标签:0(即负类)和 1(即正类)的混淆矩阵示例。请注意,在本文中,我们将专注于二分类,但我们所说的内容可以推广到多分类情况。
二分类器的混淆矩阵。矩阵的元素包括真阴性(TN)、假阳性(FP)、假阴性(FN)和真阳性(TP)。 [图片来源:作者]
由于比较,我们的观察结果可能会落入以下 4 种情况:
-
真阴性(TN):我们的模型正确预测了 0。
-
假阳性(FP):我们的模型预测为 1,但真实标签是 0。
-
假阴性(FN):我们的模型预测为 0,但真实标签是 1。
-
真阳性(TP):我们的模型正确预测了 1。
在 Python 中,获取分类器的混淆矩阵最简单的方法是通过 Scikit-learn 的 confusion_matrix
。这个函数有两个必需的参数:y_true
(真实值数组)和 y_pred
(预测值数组)。在这种情况下,我还将设置可选参数 normalize="all"
以获取观察值的相对计数,而不是绝对计数。
我使用了一个包含 20% 正类的数据集,并在其上训练了一个模型。这是测试集上的混淆矩阵:
使用 Scikit-learn 计算混淆矩阵。[图片由作者提供]
这是一个更友好的结果可视化:
混淆矩阵。[图片由作者提供]
我们一起来阅读一下:
-
真负类(TN):78% 的测试集被正确标记为 0。
-
假正类(FP):2% 的测试集被错误标记为 1。
-
假负类(FN):9% 的测试集被错误标记为 0。
-
真正类(TP):11% 的测试集被正确标记为 1。
混淆矩阵为我们提供了关于分类器的所有信息。然而,我们通常需要一个能够总结模型性能的单一指标。
两个最受欢迎的指标是准确率和 F1-score。我们来看看如何从混淆矩阵中计算这两个指标:
-
准确率: 正确分类的项目百分比。它可以通过正确分类的观察值百分比来计算。拥有混淆矩阵后,这就是主对角线上的元素之和,在本例中为:78% + 11% = 89%。
-
F1-score: 精确度和召回率(正类)的调和均值。这个指标相比准确率稍显不直观。由于 F1 是基于精确度和召回率的,我们先来看一下如何计算这两个指标。精确度是指被正确分类的预测正类的百分比,所以
precision = TP/(FP+TP) = 11%/(2%+11%) = 85%
。召回率是指被正确分类的实际正类的百分比,所以recall = TP/(FN+TP) = 11%/(9%+11%) = 55%
。得到精确度和召回率后,F1 是这两个数量的调和均值,所以:f1_score = (2*precision*recall)/(precision+recall) = (2*85%*55%)/(85%+55%) = 67%
。
现在我们了解了准确率和 F1-score,我们继续前进。
从一个矩阵到多个矩阵
你可能没有注意到,但我们上面看到的混淆矩阵来源于一个任意选择。
确实,二分类器的输出——最原始的形式——不是标签数组,而是概率数组。对于每个观察值,分类器输出它属于正类的概率。要从概率转到标签,我们需要设置一个概率阈值。
通常,默认的阈值设置为 50%:任何高于 50% 的观察值将被分类为 1,而低于该水平的观察值将被分类为 0。
然而,取决于具体应用,可能更适合使用不同的阈值。让我们看看根据我们设置的阈值混淆矩阵会如何变化。
二分类器的混淆矩阵,取决于概率阈值。[图片来源:作者]
当然,随着阈值的增加,我们标记为正例的观察结果越来越少:这就是为什么“1”列下的值越来越小。
在这里,我们看到了 6 个不同的阈值作为示例。然而,可能的阈值通常有成千上万。在这些情况下,绘制图表更为方便。然而,由于概率阈值不太直观,我觉得在X轴上显示被预测为正例的观察百分比,而不是阈值本身,更为方便。
根据概率阈值(即预测正例的百分比),混淆矩阵的四个元素。[图片来源:作者]
此外,就我们的目的而言,直接查看准确率和 F1 分数可能比查看混淆矩阵的原始值更有趣。
准确率和 F1 分数,取决于概率阈值(即预测正例的百分比)。[图片来源:作者]
由于准确率和 F1 分数都是越大越好的指标,我们会选择使得相应指标达到最高值的阈值。因此,在上述图表中,我画了一条虚线,标示出相应指标的最大值。
如你所见,不同的指标会导致我们选择不同的阈值。特别是:
-
准确率会使我们选择一个较高的概率阈值,以使 14%的观察结果被分类为正例。
-
F1 分数会使我们选择一个较小的概率阈值,使更多的观察结果(19%)被分类为正例。
那么,我们应该选择哪个指标呢?
错误预测的成本
实践者的普遍智慧是,在不平衡问题中,F1 分数必须优于准确率。
然而,如果你去寻找为什么 F1 分数被认为优于准确率的原因,你会发现解释模糊。许多解释围绕“不同成本”展开,这些成本与假阴性和假阳性有关。但它们从未明确量化这些成本。
此外,仅仅关注错误会使我们对问题的理解变得有限。事实上,如果错误预测确实会带来成本,那么正确预测必然会带来收益。
因此,我们应该考虑不仅是假阳性和假阴性的成本,还要考虑真正阳性和真正阴性的价值。从这个想法出发,我们可以得出一个新的矩阵——我称之为“价值矩阵”——它为混淆矩阵的每个元素分配一个(可能是经济的)价值。
这个矩阵有什么意义?
好吧,由于它为混淆矩阵中的每个量分配了一个值,因此将这两个矩阵(逐元素)相乘以获得任何组(TN、FP、FN、TP)的预期值是很自然的。
这是一个预期值,因为混淆矩阵包含属于任何组的观察百分比。作为百分比,这可以被解释为概率。因此,将这个概率乘以(可能是经济的)值给我们一个预期值。
将真阴性、假阳性、假阴性和真正性预期值相加,给出整个模型的预期值。
二分类器的预期值。混淆矩阵包含每个元素的频率。值矩阵包含每个元素的值(利润或损失)。两个矩阵的元素乘积得出每个组件的预期值。最后,我们将它们相加,得到模型的整体预期值。[图像来源:作者]
对混淆矩阵和值矩阵的分解对非技术利益相关者也非常直观。毕竟,每个人都能理解百分比和美元!
到此,我们准备回答最初的问题:准确率和 F1-score 的值矩阵是什么?
查找准确率的值矩阵
我们已经看到,准确率只是将混淆矩阵主对角线上的值相加。因此,直接证明准确率的值矩阵是单位矩阵是很简单的。
准确率作为分类器的预期值。[图像来源:作者]
准确率的缺陷应该是显而易见的:它等同于假设在正确预测(真正性或假阴性)情况下我们获得 1,而在错误预测情况下我们不损失任何东西。这种假设对于大多数用例至少是不太可能的。
查找 F1-score 的值矩阵
那么,在 F1-score 中,与正确/错误答案相关的值是什么?
在实践中,我们希望找出值矩阵的哪些元素会给我们得到的 F1-score。这对应于填补以下图中的问号:
F1-score 作为分类器的预期值。[图像来源:作者]
不幸的是,对于我们来说,答案不像准确率那样简单。事实上,在这种情况下,没有闭式解。然而,我们可以利用从不同阈值中提取的信息:
不同混淆矩阵的 F1-score(基于不同的概率阈值)。[图像来源:作者]
我们可以使用真负样本、假阳性、假负样本和真阳性作为自变量,将结果 F1 分数作为因变量。只需进行线性回归即可获得结果系数的估计值(即填充值矩阵的数字)。
在这种情况下,我们得到的值如下:
F1 分数的值矩阵(通过线性回归估计)。[作者图片]
从这里可以看出,F1 分数更注重正样本(无论它们被分类为 0 还是 1)。
注意这是一个近似解!与准确率不同,这里不存在值矩阵的精确解。如果你感兴趣,这是我们的结果(虚线)与 F1 分数实际曲线的比较。
实际 F1 分数与我们估计的曲线。[作者图片]
超越准确率和 F1 分数
我们已经看过准确率和 F1 分数的值矩阵。前者是任意的,而后者甚至不能直接计算(无论如何都会是近似解)。
那么,为什么不直接设置我们的自定义值矩阵呢?
实际上,根据你的使用案例,应该相对容易计算错误(正确)预测对你来说的成本(价值)。
举个例子。你想预测哪些客户更可能流失。你知道一个客户平均每月价值$10。为了防止客户离开公司,你想给他们提供一个折扣,每个客户减少$2 的利润(这里假设折扣会被所有人接受)。
所以你的值矩阵将是如下:
流失示例的值矩阵。[作者图片]
为什么会这样?
-
真负样本:$0。你的预测任务不会影响它们,所以值为 0。
-
假阳性:-$2。你给了他们折扣,但他们本来也不会流失,因此你无故减少了$2 的利润。
-
假负样本:$0。你的预测任务不会影响它们,所以值为 0。
-
真阳性:+$8。你正确预测了他们会流失,因此你节省了$8($10 减去由于你的行为产生的$2)。
问题在于,值矩阵的特性完全取决于你的具体使用案例。
例如,让我们设置一些示例值矩阵,并观察相应的期望值如何变化。
一些示例说明了分类器的期望值如何根据值矩阵变化。[作者图片]
我们可以对所有可能的阈值重复这个过程:
分类器的期望值,取决于正确/错误预测相关的值。[作者图片]
与准确率和 F1 分数不同,这些自定义 KPI 可能会取负值。这是很有意义的!事实上,在现实世界中,有些情况可能导致你的分类器让你损失金钱。你肯定希望提前知道这种可能性,而这个自定义指标可以让你做到这一点。
观察三条曲线的行为很有趣。其他条件相同时,假阴性的高成本和假阳性的低成本(即从黑线移动到绿线)会激励我们将更多观察值预测为正例(即从 16%增加到 39%)。这很直观:假阴性的高成本会激励我们将更少的观察值分类为负例,反之亦然。
一般来说,使用自定义价值矩阵可以让你在精准率/召回率的权衡中找到最佳位置。
结论
在本文中,我们比较了准确率和 F1 分数,基于它们对错误的不同成本分配。
准确率有点过于简单,因为它给正确预测赋值 1,而对错误赋值为零。另一方面,F1 分数更像是一个黑箱:你总是需要反向工程来获得其价值矩阵(无论如何,这将是一个近似解)。
我的建议是使用自定义价值矩阵,这取决于你的具体应用。一旦你设置了价值矩阵,你可以将其与混淆矩阵相乘,得到分类器的期望值。这是唯一能让你了解在现实世界中使用你的分类器的实际经济影响的方法。
感谢阅读!
如果你觉得我的工作有用,你可以订阅 每次我发布新文章时获得电子邮件通知 (通常每月一次)。
如果你想支持我的工作,你可以 请我喝咖啡。
如果你愿意, 加我 LinkedIn!
特征工程已经过时了吗?
原文:
towardsdatascience.com/is-feature-engineering-dead-203e6a9e5751
评估特征工程在现代数据科学中的角色
·发表于Towards Data Science ·阅读时间 6 分钟·2023 年 1 月 10 日
–
图片由Markus Spiske提供,来源于Unsplash
深度学习是目前数据科学中最热门的话题之一——你好,ChatGPT。处于这一领域前沿的数据科学家明白,深度学习与许多其他机器学习和人工智能领域有所不同。特征工程,即为模型创建和转换输入的过程,是这些关键区别之一。该领域的领导者如谷歌的软件工程师 Francois Chollet 表示,“深度学习消除了对特征工程的需求”(1)。
那么这是否意味着特征工程已经过时了?我不这么认为,原因如下。
特征工程 — 机器学习与深度学习的区别
在我们深入探讨之前,首先需要了解在机器学习和深度学习中如何生成特征。在传统的机器学习中,你通常不会直接使用原始数据作为模型的输入。相反,你会对数据进行调整和转换,以提高模型的性能。
例如,如果你需要创建一个分类文档的模型,你可能会想用文档的文本作为特征,但你可能不会将原始文本直接输入模型。相反,你可能会将文本表示为词频向量。
这是一个将文本表示为词频向量的例子。图片由作者提供。
这个特征不是由模型本身创建的。数据科学家花时间理解问题,并创建数据的数值表示,使模型更容易学习当前任务。
从表面上看,这个字数统计可能看起来非常简单,你可能会怀疑是否需要人来创建这个特征。但当你通过各种步骤如去除标点符号、规范化文本和去除像“the”和“of”这样的停用词来清理数据集时,特征的字数统计与原始数据集上的统计结果大相径庭。所有这些特征工程步骤使得机器学习模型能够更好地从复杂数据(如文本)中的潜在噪声中提取信号。
相反,深度学习中没有特征工程。我第一次接触到这一点是通过卷积神经网络(CNNs)进行计算机视觉。在许多方面,为模型创建特征以区分图像中的猫和狗是一项艰巨的任务。但随着 CNN 的出现,计算机视觉领域的特征工程基本上变得过时。CNN 开创了一个新纪元,使机器学习模型能够确定适合任务的特征。
特征工程为何将长期存在
尽管像 ChatGPT 这样的深度学习技术在主流新闻中引起了很多关注,我们能否依赖深度学习来解决需要机器学习的日常业务问题?正如生活中的许多事情一样,我认为答案是“视情况而定”。在计算机视觉的情况下,我认为特征工程已经过时,但这只是一个小众领域。让我们探讨一些我认为特征工程至关重要的领域。
数据分析
在数据分析领域,特征工程仍然是工作的核心部分——只是没有叫这个名字。每天,我发现团队成员使用 Excel、Power BI 或 Tableau 在创建可视化之前对原始数据集进行计算。这些计算中的许多都是数据科学家所称的特征工程!
图片由 Markus Winkler 拍摄,来源于 Unsplash
尽管数据分析师可能会计算两个数字系列的比率并将其绘制为线图供业务利益相关者审阅,但数据科学家可能会将该比率用作机器学习模型的特征。出于某种原因,数据分析师不会将这视为特征工程。
特征不仅仅用于帮助机器学习模型进行学习。它们也用于帮助人们学习。就像数据科学家一样,数据分析师也处理复杂多变的数据。这种现实意味着特征工程对于数据分析师从数据中提取特征、使可视化更具洞察力至关重要。
可解释性
虽然深度学习模型可能能够自动生成特征,但这通常会牺牲可解释性。许多现实世界的业务问题需要可解释性。实际上,某些使用案例甚至法律上要求使用可解释的模型。
以信用行业为例。如果你有一个模型用来批准或拒绝贷款,你必须能够用通俗易懂的语言解释模型为何拒绝了某人的贷款。不幸的是,深度学习模型不可解释,因此信用行业的数据科学家通常需要使用需要特征工程的简单传统机器学习模型。
图片由Scott Graham拍摄,来源于Unsplash
特征工程使你能够创建和选择对人类更有意义且更具可解释性的特征。通过仔细选择和创建相关特征,你可以更容易理解模型如何得出其预测结果以及在不同场景下可能表现如何。
此外,可解释的模型通常更可信,并且更容易部署到生产环境,因为它们更透明且更易于维护。当模型不可解释时,可能很难理解它为何做出某些预测。这使得调试和改进模型变得具有挑战性,也难以识别和修复可能出现的问题。
数据质量
无论是深度学习还是机器学习,模型的好坏取决于数据的质量——垃圾进,垃圾出。虽然许多数据科学家可能将特征工程视为构建模型过程中的一步,但它也可以帮助数据科学家提高数据集的质量。
我曾在多个项目中为数据质量监控构建功能。其中我最喜欢的一个是与风速计数据相关的项目。风速计可能因各种原因出现故障。我们用来识别坏数据的技术之一是计算相同高度风速计之间的比率,并将其与风向进行散点图分析。
图片由Benjamin Sadjak拍摄,来源于Unsplash
这一组功能使我们能够识别出风速计的轴承何时出现故障。我们能够删除坏数据,并适当地提高模型的性能。
结论
尽管深度学习领域取得了令人印象深刻的进展,但数据科学家和数据分析师构建功能的需求并未过时。在许多方面,这种需求现在比以往任何时候都更加迫切,尤其是在日益复杂的世界中。
特征工程使数据科学家和数据分析师能够将原始数据转换为更好地表示数据中的潜在结构和关系的形式。此外,它还使他们能够通过识别和解决可能影响模型性能或导致不正确分析的错误、不一致或缺失值来确保数据质量。最终,特征工程是一项对数据科学家和数据分析师都非常重要的技能,并且将继续存在。
参考文献
- F. Chollet,《用 Python 进行深度学习》(2017),
www.amazon.com/Deep-Learning-Python-Francois-Chollet/dp/1617294438
生成性人工智能是否正在接管世界?
企业纷纷加入“生成性人工智能”功能或产品的热潮。是什么驱动了这种现象?这为什么会成为问题?
·
关注 发表在 Towards Data Science · 10 分钟阅读 · 2023 年 10 月 3 日
–
图片来源:Mārtiņš Zemlickis 由 Unsplash 提供
《人工智能炒作周期:奔向何处?》
我最近在追看《Money Stuff》,即 Matt Levine 在 Bloomberg 上发表的不可或缺的新闻通讯/博客,里面有一篇有趣的文章讲述了人工智能股票挑选算法实际上并不偏爱人工智能股票(而且它们在所做的挑选上表现也不是很好)。 去阅读《Money Stuff》了解更多信息。
但是在那次分析中提到的一个点是,经济领域各个企业都被人工智能的 FOMO(错失恐惧症)所困扰。这导致了一系列半开玩笑的“人工智能”应用。
“一些公司声称他们在做人工智能,但实际上只是试图搞清楚自动化的基础。那些伪装者迟早会被揭穿的,”他说。…
时尚和服装公司 Ralph Lauren 本月早些时候将人工智能描述为“我们收入增长之旅中的一个重要部分”。餐厅连锁店,如 KFC 的母公司 Yum Brands 和 Chipotle,宣传了人工智能驱动的技术,以提高配料订单的效率或帮助制作玉米片。
几家与旅游相关的企业,如 Marriott 和 Norwegian Cruise Line 表示,他们正在开发人工智能驱动的系统,以使预订等流程更高效和个性化。
上述例子中没有在他们最近的季度报告中提及人工智能,尽管 Ralph Lauren 确实在其 5 月的年报中大致提到了一些相关举措。
(摘自《Money Stuff》,但他引用了《金融时报》)
对我来说,这点正中要害,尽管我不太确定他们是否会被揭穿。我也承认,许多公司实际上确实在使用生成式人工智能(通常是来自大开发公司的现成工具),但这些工具很少是任何人真正需要或想要的——他们只是想赶上这个新热潮。
不过,我认为讨论一下这一切是如何发生的可能会有用。当有人决定他们的公司需要“人工智能创新”,无论这是否真正涉及生成式人工智能,实际上发生了什么?
对人工智能(和自动化)的理解
在继续之前,我们先来回顾一下什么是真正的人工智能。如常读者所知,我非常讨厌人们随意使用“人工智能”这个词,因为他们大多数时候根本不知道自己在说什么。我更喜欢更具体的描述,或至少解释一下我所指的含义。
对我来说,AI 是指我们使用机器学习策略,通常但不总是深度学习,来构建可以完成复杂任务的模型或模型组合,这些任务通常需要人类能力。机器学习模型何时变得足够复杂,才应该称其为 AI?这是一个非常困难的问题,而且对此有很多分歧。但这是我的框架:机器学习是我们用来创建 AI 的技术,机器学习是一个大伞,包括深度学习和许多其他内容。数据科学领域则是一个更大的伞,可能包括部分或全部机器学习,同时也包括许多其他内容。
AI 是指我们使用机器学习策略,通常是深度学习,来构建可以完成复杂任务的模型或模型组合,这些任务通常需要人类能力。
还有另一种子类别,即生成式 AI,我认为当大多数普通人谈论 AI 时,这实际上就是他们的意思。这包括你的 LLM、图像生成等(参见我之前的帖子以获取更多讨论)。如果说搜索引擎在技术上算是 AI,那可以争论,但它绝对不是生成式 AI,如果你今天问路上的人,简单的搜索引擎是否是 AI,他们可能不会这样认为。
让我们讨论一个例子,也许能帮助澄清自动化以及为什么它们不一定是 AI。一个问答聊天机器人是一个很好的例子。
一方面,我们有一个相当基础的自动化,已经存在很久了。
-
客户在你的网站的弹出框中输入问题或搜索词。
-
一个应用程序会查看这个问题或一组词,并去除停用词(例如 a、and、the 等——一种简单的搜索和替换功能)。
-
应用程序然后将剩余的词放入搜索框中,返回数据库/FAQ/wiki 的搜索结果到聊天弹出框中。
这是对旧方式的一个非常粗略的近似。人们不喜欢它,如果你请求了错误的东西,你就会陷入困境。它基本上是一个 LMGTFY*。这个工具甚至不模仿人类可能使用的解决问题或回应策略。
另一方面,我们现在可能有一个 ChatGPT 等效物:
-
客户在你的网站的弹出框中输入问题或搜索词。
-
背后的 LLM 将客户的输入作为提示,解析这些内容,并根据词汇、其句法嵌入和模型的训练,返回极其“类人”的响应。
这将带来一些显著的好处。首先,LLM 不仅知道你发送给它的词语,还知道其他具有类似含义和关联的词语,根据它学习到的词嵌入,因此它能够在回应时超越使用的确切词语。如果你询问“买房”,它可以将其关联到“房地产”或“抵押贷款”或“房价”,大致因为它在训练中见过这些词在类似的语境和相邻的位置。
此外,客户在网站上的响应可能会更加愉悦和易于阅读,从而提升他们与公司互动的美学体验。这个模型的结果更加细致且复杂,远远超过你传统的聊天机器人。
然而,我们需要记住,LLM 并不关心信息的准确性或时效性。记住我之前帖子中的评论,LLM 是什么以及它是如何训练的——它并不是在学习事实准确性,而只是生产与人类写作非常相似的文本,和人类喜欢收到的文本。事实可能是准确的,但也有可能并非如此。另一方面,在第一个例子中,你完全控制数据库中可能返回的所有内容。
对于你网站的普通用户来说,这在前端可能感觉不会有显著不同——回应可能更愉悦,可能让他们感到“被理解”,但他们不知道答案在 LLM 版本中存在更高的准确性风险。从技术上讲,如果我们仔细分析,这两者都在自动化回答客户问题的过程,但只有一个是生成式 AI 工具。
旁注:我现在不会讨论 AGI(人工通用智能)和专门化 AI 的区别,只是说 AGI 目前并不存在,任何告诉你它存在的人都是错误的。我可能会在未来的帖子中更详细地讨论这个问题。
谁在背后?
那么,让我们继续之前的对话。是什么导致公司在新闻稿中推出一些基本的自动化或 ChatGPT 的封装,并称之为他们的新 AI 产品?是谁在推动这一切,他们实际上在想些什么?我的理论是,这里有两个主要路径。
-
我想要 PR: 一位高管看到炒作周期的到来,他们希望让他们的业务获得一些媒体关注,于是让他们的团队构建一些他们可以出售的 AI 产品。(或者,将他们已有的东西重新标记为 AI。)他们可能知道或关心这些东西是否实际上是生成式 AI。
-
我想要魔法: 一位高管在新闻或媒体中听到一些关于 AI 的信息,他们希望他们的业务能够获得他们认为竞争对手从 AI 中获得的任何优势。他们来到办公室,指示他们的团队构建能够提供AI好处的东西。如果这位高管真的知道生成型 AI 和更简单的自动化之间的区别,我会感到惊讶。
当然,这并不必然排除一个好的生成型 AI 工具最终出现的想法——实际上,已经存在很多这样的工具了!但当我们以“我们需要将这项技术用于某些事情”而不是“我们需要解决这个实际问题”为前提时,我们正在以完全错误的方式接近开发过程。
但是,拜托,这有什么害处呢?这真的重要吗,还是这只是数据科学家之间对最新疯狂“AI”功能的一些有趣笑话材料?我认为这确实重要(尽管这也常常是有趣笑话的材料)。
为什么我们应该关心这个问题?
作为数据科学家,我认为我们应该对这种现象感到有点不安,原因有几个。
首先,这种文化贬低了我们实际的贡献。 数据科学曾经是最吸引人的职业,很多杂志封面都这么告诉我们,但幸运的是,我们现在正在进入一个更加平静、稳定、不那么炫目的地方。数据科学团队和部门通过确定如何高效、有效地运行业务,为其企业提供了稳固、可靠的价值。我们找出市场对象及其时机;我们告诉公司如何组织其供应链和仓库;我们通过改变系统和流程来发现生产力机会。我们不再只是“我们一直这样做”,而是现在有权通过数据找到实际的最佳方法。有时我们会构建全新的产品或功能,使我们公司销售的东西变得更好。这是非常有价值的工作!如果你不相信,去看看我的文章 数据科学角色的原型。
我们所做的这些事情,即使不是生成型 AI,也并不比它更不重要或更无价值。我们做了很多机器学习的工作,可能并没有触及到 AI 本身神秘的复杂性边界,但这些工作仍在帮助人们并产生影响。
第二,我们通过称一切为人工智能只是助长了这种愚蠢的炒作周期。 如果你把线性回归称作人工智能,你也是在支持这种表述意义不断降低的竞争。如果我们用这个词来指代所有事物,它将会死于千刀万剐。也许这没关系,我知道我已经准备好停止听到“人工智能”这个词了。但原则上,我们这些在数据科学领域的人知道得更清楚。我认为我们至少有责任正确使用行业术语,并抵制将其意义混淆的压力。
第三,我认为最重要的一点是,我们花时间迎合外界对人工智能宣传的需求,实际上是在浪费本可以用来创造真正价值的时间。 我坚信,数据科学家应该构建能改善人们生活并帮助人们完成必要工作的工具。如果我们在构建一个没有人需要且没有帮助的工具,无论它是否使用人工智能,那都是浪费时间。不要这样做。你的客户几乎肯定实际上需要某些东西(看看你的工单积压!),你应该做那些事情。不要因为你“需要一个人工智能的东西”而做项目,而是因为这些项目满足需求并具有实际目的。
当公司高层早晨走进来决定“我们需要人工智能功能”时,无论是为了宣传还是为了魔力,这并不是基于战略性地理解你们的业务实际需要什么,或你们实际上要解决的客户问题。我知道作为数据科学家,我们并不总能反对高层的命令,即使这些命令有些荒谬,但我真的希望看到更多公司在此时稍作停顿,考虑生成性人工智能工具是否真的能解决他们业务中的实际问题。如果没有,可能就静静等着,等到问题真正出现。生成性人工智能不会消失,它会在你真正需要的时候出现。与此同时,继续使用我们已有的所有经过验证的数据科学和机器学习技术——但不要假装这些现在是“人工智能”,以此获得点击或宣传。
查看我的更多作品请访问 www.stephaniekirmer.com.
野外实例
好了,我已经对整个闹剧发牢骚够多了,现在我们来点乐子。我一直在浏览公司发布的新闻稿,这些公司向世界介绍它们的新奇人工智能功能,并反思这些功能是多么荒谬和浪费,我挑选了一些有趣的来分享。
-
可口可乐利用生成式 AI 设计广告和发明新口味:这则新闻稿是一篇上乘的文字沙拉,但他们似乎在使用 Dall-E 生成广告视觉效果。坦率地说,这些视觉效果在我看来仍像是 2002 年的产物,但也许我老了。此外,他们明确承认这是一次炒作周期的冒险。“在去年倾斜于增强现实之后,我们正在拥抱人工智能的力量,并继续在这一令人兴奋的领域构建公司能力。” 元宇宙没能奏效,所以这就是下一个东西了,我猜?
-
这似乎是真正的生成式 AI,但这是我听过的最糟糕的想法之一。Afterparty 想要 让名人通过深度伪造节省与粉丝交流的时间 的同时还能赚钱。有人想要这个吗?我了解到名人通常对 AI 复制他们的肖像持有相当的谨慎,考虑到潜在的价值。我也不明白为什么粉丝会想要这个。(谁拥有深度伪造头像的知识产权?)不过,嘿,还有 NFTs!
请在评论中分享你最喜欢的“为了 AI 而 AI”的荒诞例子,我会在未来发布一些最佳的例子。
让我谷歌一下,给那些还记不起的年轻人。
生成式 AI 是否值得其环境足迹?
生成式 AI 可能会有显著的环境足迹,而这个故事讨论了我们可能获得的回报。
·
关注 发表在 Towards Data Science ·8 min read·2023 年 10 月 31 日
–
图片由 Eric Krull 提供,来源于 Unsplash
生成式 AI 目前受到了广泛关注。ChatGPT 报道称拥有数亿用户,类似的功能也被声称整合到了从 Microsoft Word 和 Teams 到搜索引擎的多种数字产品中。
如果数十亿人开始广泛使用生成式 AI,其环境足迹可能会变得显著[1]。
普遍生成型人工智能的环境影响
如果数十亿人开始每天使用生成型人工智能技术,我们的环境会发生什么?
普遍生成型人工智能的环境影响
但我们从这项技术中获得的价值是否会超过潜在的环境成本?
这是我将在本文中尝试阐明的问题, outlining some perspectives on what we may stand to gain.
首先,我将提供一些关于生成型人工智能可能带来的生产力提升的观点。
接下来,我将讨论生成型人工智能是否会成为一种净正面或净负面的技术。
接下来,我将讨论生成型人工智能可能在多大程度上减少不平等。
最后,我将提供我的观点,探讨我们是否应该期待生成型人工智能加快绿色转型。
范围
请注意,以下内容仅涉及生成型人工智能。生成型人工智能不同于其他类型的人工智能。
同时请注意,我仅关注生成文本(包括代码)的生成型人工智能,排除图像和声音生成技术。
关于生成型人工智能的简单工作定义,请参见[2]。
生成型人工智能是否会提高我们的生产力?
让我们考虑一下生成型人工智能可能带来的生产力提升程度。一项关于 ChatGPT 对各种写作和分析任务的生产力影响的研究发现,使用 ChatGPT 的参与者在这些任务上花费的时间比未使用 ChatGPT 的对照组少了 40%。此外,根据同行评审,任务解决方案的质量提高了 18%[3]。
一项针对软件开发人员的调查显示,88%的受访者报告称,使用生成型人工智能工具GitHub Co-Pilot可以提高他们的生产力[4]。这一结果在一篇实证研究论文中得到了验证,该论文表明,在使用 Co-Pilot 实施一个 JavaScript 服务器时,生产力提高了 126%[5]。
正如尼尔森[6]所指出的,与 2007 年至 2019 年间美国 1.4%和欧盟 0.8%的年度劳动生产力平均增长率相比,这些数字令人震惊。
ChatGPT 每次查询的能耗
ChatGPT 回答一个问题需要消耗多少电力?
ChatGPT 每次查询的能耗
但这些结果是否适用于研究研究的实验环境之外?我们是否可以期望类似的生产力提升?例如,实现一个 Javascript 服务器(Co-pilot 帮助完成的任务比原计划快了 124%)是否是软件开发中的一个代表性任务?我不知道,因为我从未做过这个任务,但我相当肯定,不同编程任务的生产力提升不会相同。我期望像前述这样的生产力提升可以在解决明确的编程任务时获得,这些任务包括编写大量的样板代码,但目前我预期生成性 AI 对于需要大量时间考虑问题后才知道问什么问题的任务的帮助会很小——如果有的话。因此,我预计编程任务的平均生产力提升将低于 126%。
随着生成性 AI 工具和我们使用它们的能力变得越来越成熟,我们可能会看到更高、更广泛的生产力提升。
这就留下了一个问题:社会愿意为这样的生产力提升支付什么环境成本?确定一个可接受的成本的一个方法是查看历史生产力提升的碳成本。我将这留给读者作为练习。
对 ChatGPT 成本的估算支持了 ChatGPT 每月使用数百万千瓦时的估计。
kaspergroesludvigsen.medium.com
生成性 AI 会成为一种净正面技术吗?
现在让我们讨论生成性 AI 是否会成为一种净积极技术的不同观点——即一种其足迹被其导致的减排所超越的技术。
反对广泛采用生成性 AI 的一个论点是:如果生成性 AI 不减少温室气体排放,它将是一种净负面技术——一种使用的排放量多于减少的技术。由于温室气体排放导致的气候变化,我们应该减少我们的全球碳足迹,而不是增加它。
但生成性 AI 会是净负面还是净正面呢?很容易想象它可以在某些地方节省消耗。例如,它可能减少我们搜索 Google 和加载网页的需求。但问题是进行一次 Google 搜索和加载一个网页的碳足迹是多少。这是一个复杂的问题。
关于进行一次 Google 搜索的电力消耗,网络上确实有一个数字,但据我所知,这个数字来自 2009 年。自那时以来,情况可能发生了很大变化,我想象今天的 Google 搜索是由更复杂且能耗更高的机器学习方法驱动的。然而,我确实预期 Google 搜索的能耗会低于 ChatGPT 的查询,尽管我认为差异可能小于某些地方提到的 10 倍[7]。
鉴于此,我怀疑并非所有生成型人工智能的查询都会节省足够的 Google 搜索量来弥补其环境成本。
我已经写了很多关于人工智能环境影响的内容,而我经常收到的评论之一是生成型人工智能将减少我们的整体资源消耗和碳足迹。除了上述情况之外,我仍然很难看到这种情况。但是请挑战这一点。
最近发表了一篇题为“AI 的碳排放低于人类的写作和插图”[8]的论文。论文主张生成型人工智能比人类更具能源效率。我将在即将发布的博客文章中分析这篇论文中的主张。
[## 通过我的推荐链接加入 Medium - Kasper Groes Albin Ludvigsen
作为 Medium 的会员,你的部分会员费用将用于你阅读的作者,你可以完全访问每个故事…
kaspergroesludvigsen.medium.com](https://kaspergroesludvigsen.medium.com/membership?source=post_page-----8b6130ade14f--------------------------------)
生成型人工智能会减少不平等吗?
在我与人们讨论生成型人工智能环境影响的过程中,我听到一些人认为环境影响是值得的,因为他们期望这项技术会有助于减少不平等。是否可以期待这种情况并不明确。原因如下。
之前提到的关于 ChatGPT 对生产力影响的研究[3]发现,技能较低的人使用 ChatGPT 的生产力提升大于技能较高的人。因此,我们可能预期生成型人工智能的使用可以帮助提升受到结构性不平等影响的人群。
但是,不同工人群体在生成型人工智能提升生产力的程度上存在差异。以记者和木匠为例。对于写作的记者来说,生成型人工智能可以直接支持他们的主要产出(文章)的生产。而生成型人工智能不会直接帮助木匠建房子。所以似乎并不是所有工人群体都能平等地从生成型人工智能中受益。如果使用生成型人工智能带来的生产力提升导致工资上涨,我们可能会看到工人群体之间的不平等加剧。
这一观点得到了麻省理工学院的研究支持,其中一位经济学家发现,1980 年至 2016 年美国工资不平等增长的 50%至 70%是由自动化造成的[9]。
与此同时,国际货币基金组织(IMF)指出,人工智能可能会加大富国和穷国之间的差距[10]。
总而言之,上述研究表明,生成式人工智能可能有助于减少在生成式人工智能能够协助的任务中技能水平的不平等,但同时,它可能增加不同工人群体和国家之间的不平等。
两种简单的方法来估算机器学习模型的碳足迹以及 17 个减少碳足迹的建议
[towardsdatascience.com
生成式人工智能是否会加速绿色转型?
现在让我们考虑生成式人工智能在多大程度上能够加速绿色转型。显然,作为白领工人,绿色能源及相关领域的研究人员可能会因使用生成式人工智能而变得更高效。他们可能像其他人一样,写研究文章或编写代码的速度更快。但在可预见的未来,我个人不期待生成式人工智能系统如 ChatGPT 能直接促进绿色转型。我很难想象 ChatGPT—一个基于现有文本生成下一个最可能单词的通用文本生成工具—能够提出突破性的想法。不过,我希望我错了。如果你有不同的观点,请告诉我。
然而,我确实相信其他类型的人工智能可以帮助加速绿色转型或应对气候变化。例如,其他类型的人工智能可以帮助减少建筑能耗、打击森林砍伐、优化航运路线以减少能耗等。
结论
生成式人工智能的兴起引发了关于这项技术环境成本的讨论。本文的目的是阐明我们从生成式人工智能中可以获得什么,以便为关于生成式人工智能是否值得其环境足迹的辩论提供信息。
初步研究表明,使用生成式人工智能可能会提高某些任务的生产力,但尚不清楚这些发现是否会推广到其他环境。
研究还表明,生成式人工智能可以帮助减少同一职业中工人之间的技能不平等,但我认为它可能会导致不同职业工人之间的不平等加剧。此外,人工智能和自动化技术已被发现增加了国家之间的经济差距。
关于生成式人工智能是否会加速绿色转型,我个人的观点持怀疑态度。
总之,很明显生成性人工智能对生产力有积极影响,也可能对不平等有影响,但这需要付出环境代价。问题是:生成性人工智能的好处是否超过了成本?这本质上是一个价值判断——我希望你在阅读完这篇博客文章后,对这个问题有了更好的思考。
感谢阅读。
就这些!希望你喜欢这个故事。告诉我你的想法吧!
关注我,获取更多关于人工智能和可持续发展的内容,并订阅,以便我发布时通过电子邮件获取我的故事。
我有时也会写关于时间序列预测的文章。
也欢迎在LinkedIn上联系我。
参考文献
[1] https://towardsdatascience.com/environmental-impact-of-ubiquitous-generative-ai-9e061bac6800
[2] https://www.mckinsey.com/featured-insights/mckinsey-explainers/what-is-generative-ai
[3] https://news.mit.edu/2023/study-finds-chatgpt-boosts-worker-productivity-writing-0714
[4] https://github.blog/2022-09-07-research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/
[5] https://arxiv.org/abs/2302.06590
[6] https://www.nngroup.com/articles/ai-tools-productivity-gains/
[7] https://www.cell.com/joule/fulltext/S2542-4351(23)00365-3?_returnURL=https%3A%2F%2Flinkinghub.elsevier.com%2Fretrieve%2Fpii%2FS2542435123003653%3Fshowall%3Dtrue
[8] https://arxiv.org/abs/2303.06219
[9] https://www.technologyreview.com/2022/04/19/1049378/ai-inequality-problem/
[10] https://www.imf.org/en/Blogs/Articles/2020/12/02/blog-how-artificial-intelligence-could-widen-the-gap-between-rich-and-poor-nations
医疗分析适合你吗?
原文:
towardsdatascience.com/is-healthcare-analytics-right-for-you-320897b34409
你在这个领域面临的 3 个挑战,直到你退休的那一天
·发布于 Towards Data Science ·阅读时间 7 分钟·2023 年 1 月 2 日
–
图片由 KOBU Agency 提供,来源于 Unsplash
目前,当你在 Indeed 上搜索“医疗分析”时,会返回超过 8,000 个职位列表。它们涵盖了从健康 IT 和信息学到数据分析师等多种职位。你还可以通过搜索特定类型的职位来找到更多工作机会,例如:收入周期、风险、质量、EPIC、基于价值的护理(VBC)、人口健康、利用管理等。
为什么有这么多健康分析职位?
医疗行业是一个快速增长和变化的行业,同时也高度受监管,复杂(且有些混乱),细节丰富,工作起来可能非常令人恼火,并且是每一个活着的人都必需的服务。
该领域最成功和充满热情的数据从业者深刻理解数据和业务或医疗系统内部运作的细微差别。这通常意味着最资深的人在医疗领域有着许多年丰富的经验,仿佛都是不可能智慧的神谕者。事实上,如果你在医疗行业工作了整个职业生涯,我保证你每天都会学到新东西。这并不意味着新进入医疗行业的人不会成功——实际上,我们需要更多带着其他行业新想法进入医疗行业的人!这只是意味着医疗领域不是那些疲惫不堪的人、寻求“快速成功”的人或只是想浅尝辄止的人,所以我们看到有相当多的员工流动,他们最终跳槽到其他行业,通常是在那些能赚到更多(有时更多得多)钱或面临更少障碍以获得结果的地方。
你必须真正热爱医疗保健(并且忍受一些痛苦)才能坚持留在这个领域。但正是这些挑战使医疗保健成为一个最好的保密秘密。
医疗保健是数据爱好者的梦想!
由 Alexander Sinn 拍摄于 Unsplash
除了为你的工作提供意义之外,对于那些对数据有兴趣的人来说,它也可能带来经济上的回报——即使是刚刚起步的初学者也能获得奖励。入门级数据分析师的薪资通常在$80,000 以上,并且对于那些具备特定技能集(如数据科学、先进分析、特定健康 IT 系统(如 EPIC)或临床背景等)的人员,薪资可以迅速飙升到六位数的高端。对于那些已经在医疗保健行政或临床角色中的人来说,增加数据专业知识到你的简历中,可以轻松地将你定位于更高级别和更高薪资的职位。
医疗保健为分析和数据科学提供了巨大的机会,但这也伴随着重大挑战。这些挑战很多,但我将其简化为三个主要问题:信任、偏见,以及(惊喜!)糟糕的数据。
继续阅读,以确定医疗保健分析是否适合你。
第一大问题 — 缺乏信任:
当涉及到人们的实际生命时,任何数据模型中的风险或不确定性都可能很难被接受——尤其是当模型方法缺乏解释性,这可能让医生或其他护理人员对结果的推导过程或影响结果的因素感到安慰时。还有一个变更管理的因素,这与数据模型的可靠性或洞察的有效性无关。如果你比较保守,创建风险模型或金融模型,你可能在信任领域会有更多成功,但可能会遇到更多的第二大问题。
第二大问题—偏见泛滥:
通常当你想到偏见时,可能会想到一个人固有的假设,这些假设无意中塑造了数据模型或洞察的开发或解释。但偏见也可以指你正在处理的数据本身是固有的片面。在医疗保健中,这种情况被成倍放大,以下仅是一些因素:
-
个人偏见: 一个人的固有假设不经意间影响数据模型或洞察的发展或解释(显而易见)。但在医疗保健中,这可能意味着你甚至没想到的事情,比如“我想分析健康不平等,所以我会查看不同非洲裔美国人的结果如何与白人不同,并考虑社会经济因素、人口统计、种族/民族和疾病历史。” 看明白了吗?即使我们不认为自己有偏见,我们仍然倾向于基于我们所了解的轶事或之前分析过的内容来形成假设和分析。相反,我们需要专注于打破这种轶事偏见,利用数据识别未知的未知。这可能意味着新的和新颖的数据来源,添加你之前从未想到的输入或特征,或开发更多的无监督方法等。
-
数据偏见: 我们只知道我们四面墙内发生的事情(我们的数据仅反映我们的操作方式和已知的事物);或者你的数据可能只反映某一特定群体或子集的患者,他们的行为非常特殊和不同——例如,分析医疗保险人群与医疗补助人群、雇主组与特定雇主之间的见解很可能无法转移。
-
确认偏见: 当客户要求数据洞察时,如果你的发现与他们轶事上或情感上认为准确或真实的内容不符,就会被忽视;类似地,人们倾向于倾向于确认他们假设的关键论点,以便为他们已经在心理上做出的决定提供理由,并忽视其他内容。即使他们声称以数据驱动,这也非常难以仅通过数据来克服。
关键问题#3 — 数据不一致和碎片化
惊喜! 这不仅限于医疗保健,数据社区已经对此进行了多次讨论,因此我不会在这里重复。我不会说医疗保健的数据是所有数据中最脏的,尽管我可能会暗示…
知道你将不得不让你的手感到挫败,必须极其关注细节,不对任何结果解释做出假设,直到你理解数据和业务。这不是一个适合纯粹主义者或对模型创新更感兴趣的人,而不是理解数据、假设和解释或沟通的细微差别的地方。
医疗保健的变革不会发生在没有更好的数据系统、数据整合和数据共享的情况下。
这是显而易见的,已有很多文献记录并讨论过。但今天,它对潜在的医疗保健分析师有两层含义。
-
要获得医疗保健所需的全新和创新的见解,并真正成为创新者,你需要来自许多不同系统的新数据,而不仅仅是你的电子病历(EMR)或索赔数据。为了获得这些数据,你将不得不在整个分析过程中花费 80-90%的时间扮演数据探索者、数据工程师和数据验证者的角色。这意味着……
-
你必须对医疗保健分析充满好奇,善于合作,并在沙盒中友好相处。如果你想在医疗保健分析中取得进展,简单来说,这里不再是数据封建主义或智力优越的地方。 在未来的文章中,我将讨论为什么这种心态对那些不愿分享的医疗保健组织会自我限制——你需要的或想要的大量有意义的数据必须来自他人,如果你能让人们与你分享并一起合作,使其可用,更不用说可操作了。
这一切听起来是否不可能?可能是的。
为了提供背景,目前许多组织仍在努力链接自己患者的旅程,即使是在他们的四面墙之内——例如,从医生办公室/医疗小组访问(在一个 EMR 系统中),到医院访问(在不同的 EMR 系统中),到已安排的后续专家推荐预约,再到该人是否参加了这个后续预约——更不用说患者是否领取了处方、离开医院后立即去了一家麦当劳、回到一个充满有毒自来水的家中、在一个远离主要护理提供者的高山社区、在一个没有高速互联网或宽带的地区、在一个教育水平最低的州等等。社区健康和医疗保健在不断缓慢地迈向……
但这些看似不可逾越的挑战正是它如此令人兴奋的原因!
我们在所有这些领域还有很长的路要走,但我相信,凭借合适的人才、出现的新数据方法和重新焕发的合作热情,我们可以达到目标。我们看到医疗保健比以往任何时候都更加拥抱数据,数据科学的新方法带来了前所未见的新见解,而由于主要运营商和政府项目推出的新举措和计划,合作达到了前所未有的高水平。
医疗保健分析可能不适合那些容易疲倦的人,但它绝对适合那些深度好奇和顽强坚持的人。
那个人会是你吗?
在 Medium 上关注我以获取更多关于健康数据和医疗保健分析的内容。
在 LinkedIn 上联系以分享经验教训和数据驱动的方法,以便更好地决策。
Stefany Goradia 是 RS21 健康实验室的副总裁,她的职业生涯专注于医疗分析的前线工作,并为内部和外部客户提供价值。她撰写了如何解读医疗数据、将其传达给利益相关者,以及如何利用这些数据来支持明智的决策和执行。
你需要的是压缩吗?
更高效的基于压缩的主题分类实现
·
关注 发布于 Towards Data Science ·6 min read·2023 年 7 月 22 日
–
图片由 Tomas Sobek 提供,来源于 Unsplash
最近发布的论文标题为*“低资源”文本分类:一种无参数分类方法与压缩器* [1],最近引起了相当多的公众关注。他们的关键发现是,在某些情况下,他们可以通过简单的想法来超越大型语言模型如 BERT,即如果两个文本文件可以被压缩到更小的文件大小,它们就更相似(尽管关于他们结果的有效性存在一些争议,见这篇博客文章和这次讨论,包括作者的回复)。
他们方法的主要思想是,Bennet 等人定义的“信息距离”在文本分类中是一个好的距离度量。由于信息距离本身不可计算,他们使用归一化压缩距离(NCD)[3]来近似,它通过像 gzip 这样的“现实生活”数据压缩器来估计信息距离。NCD 具有更好的压缩器(即压缩比更好的压缩器)可以更好地估计真实信息距离的特性。
因此,自然期望更好的压缩器会在分类中实现更好的性能。但他们无法通过实验验证这一点;论文中考虑的最佳压缩器 bz2 在准确性方面表现不如 gzip。他们解释道:“[…] bz2 使用的 Burrows-Wheeler 算法通过在压缩过程中排列字符,忽略了字符顺序的信息” [1, p.6817]。这意味着仅凭压缩无法解释他们的发现,但与字符顺序也有关系。
这让我思考:他们的结果有多少是由于压缩,多少是由于两个文档之间的字符串比较?
为了调查这个问题,我将他们的结果与两种替代方案进行比较:(1)一个仅依赖于替换重复字符串的简单压缩器,以及(2)一个在查询文档和属于某些主题的所有文档之间显式进行子字符串匹配的算法。
第一次消融:LZ4 能否完成任务? 压缩算法 gzip 基于DEFLATE,它使用LZ77和霍夫曼编码来压缩数据。让我们更详细地了解这两种算法,并思考它们在我们使用场景中的含义。
在压缩过程中,LZ77 使用一个滑动窗口来处理先前看到的数据。如果字符串重复,则存储字符串第一次出现的引用,而不是字符串本身。因此,如果我们将两个连接的文档的长度作为距离度量,文档会更接近,如果它们在滑动窗口大小(通常为 32KB)内有更多重叠的子串。
哈夫曼编码进一步压缩结果文本:它不是对每个字符使用 8 位,而是用更少的位表示频繁出现的字母,用更多的位表示不常出现的字母。如果我们将哈夫曼编码应用于连接的文档,那么如果两个文档使用频率相似的字符,压缩后的文档将会更小。
可以预期,匹配的子串在主题分类中比相似的字符频率更重要。因此,我通过观察使用LZ4算法[4]进行压缩时的性能,进行了一项消融研究(基本上是 LZ77,但有一个在 python 中可用的快速实现)。由于 LZ4 的压缩比远低于 gzip,他们的解释表明 LZ4 的性能不如 gzip。然而,如果主要的工作是子串匹配,LZ4 将表现得与 gzip 一样好。
更明确的算法 为了进一步深入,我实现了一个简单的算法,明确地进行子串匹配:它将文档分配给具有最相似子串的主题(这里的子串是字符级 n-gram)。其工作原理如下:
文本编码:
1. 提取文本中的所有字符 n-gram,范围为 5 ≤ n ≤ 50。
2. 对提取的 n-gram,使用hash(n_gram) % int(10e8)
在 python 中计算 8 位哈希代码(因为我想控制要跟踪的不同事物的数量)。
3. 将其记录在集合中(因此丢失了有关某个代码出现次数的信息)。
训练:
1. 计算给定主题的每个文本的哈希代码集合。
2. 进行集合并,以获得在主题中出现的哈希代码集合。
推断:
1. 对某些查询文本,计算其哈希 n-gram 的集合。
2. 对于训练中遇到的每个主题,计算该主题集与查询集之间的交集大小。
3. 将查询文本分配给交集最大的主题。
实验和结果 我在 100-shot 设置中对 gzip、lz4 和哈希 n-gram 算法进行了比较,共进行了 5 次实验,具体如他们的论文所述。对于这三种方法,我坚持他们的实验设置,以便重现他们报告的结果(再次说明,这可能导致准确性度量的夸大)。代码可以在github上找到。
你可以从torchtext (AG_NEWS [5],DBpedia [6] 和 YahooAnswers [5])中的三个数据集上查看性能,见下表:
我们看到 lz4 和哈希 n-gram 在所有三个考虑的数据集中都优于 gzip,其中哈希 n-gram 算法在 3 个数据集中的 2 个数据集中表现最好。但它仍然无法与 BERT 竞争,根据他们在 100-shot 设置中的论文,BERT 在 AG_NEWS 上的性能为 0.82,在 DBpedia 上接近 1。
这些结果具有重要的实际意义:在我们的实验中,基于 lz4 的算法运行速度比基于 gzip 的算法快大约 10 倍。更重要的是,哈希 n-gram 算法甚至在推理时改善了计算复杂度:你只需与每个主题集进行比较,而不是与文本语料库中的每个文档进行比较。
我们从中学到了什么? 我的结果表明,gzip 的显著性能可以归因于他们的方法隐式比较了字符级 n-gram。这一发现使得可以使用像 lz4 这样的更快的压缩器而不会有任何性能损失。此外,甚至可以重写他们的算法,使其在推理时具有与数据集大小无关的恒定复杂度,使他们的方法更接近于在大数据集上的实际应用。如果你想在实践中使用它,我已经开始按照我提出的算法的 scikit-learn API 进行实现,请见此处。
剩下的一个问题是,为什么这种方法比TF-IDF方法表现更好,即使两者都在比较文档中的词汇?
也许考虑字符级 n-gram 在某些任务中比将文本拆分成单个词汇更有效。但更重要的是,这里使用的方法对所有 n-gram 赋予相等的权重,无论它们的出现次数。这意味着它给予所谓的长尾(即稀有)信息很多重要性,这显然对某些文本任务如主题检测很重要。注意,变换器网络在建模这种长尾信息上表现不佳(有关证据,请参见例如[5]),这也是这些非常简单的方法成为衡量你百万参数模型的一个非常有趣的基准的原因。
参考文献 [1] Z. Jiang, M. Yang, M. Tsirlin, R. Tang, Y. Dai, J. Lin. “低资源”文本分类:一种无参数分类方法与压缩器 (2023), ACL 2023
[2] C. H. Bennett, P. Gács, M. Li, P. MB Vitányi 和 W. H. Zurek, 信息距离 (1998), IEEE 信息理论交易
[3] M. Li, X. Chen, X. Li, B. Ma 和 P. Vitányi, 相似性度量 (2004), IEEE 信息理论交易
[4] N. Kandpal, H. Deng, A. Roberts, E. Wallace, C. Raffel, 大型语言模型在学习长尾知识方面的困难 (2022), arxiv.org/abs/2211.08411
感谢 Joel Niklaus 和 Marcel Gygli 的讨论和反馈。
Julia 比 Python 和 Numba 更快吗?
原文:
towardsdatascience.com/is-julia-faster-than-python-and-numba-897c53694621
优化
Numba 非常快速,但它够快吗?
·发布于数据科学前沿 ·16 分钟阅读·2023 年 9 月 19 日
–
Numba 是一个广泛使用的 Python 优化库,它将函数执行时间提升到接近 C 语言的水平,而 C 语言毫无疑问是快速的。
这种优化水平足以与像 Julia 这样较新的、专门构建的目标语言竞争吗?如果是的话,在 Python 中实现这种执行速度是否有任何陷阱?
引言
我之前写过一篇对比 NumPy 和 Julia 的文章。结果基本上是 Julia 确实比 NumPy 快,总体而言。然而,事情比这更复杂一点,所以我建议你查看那篇文章,了解详细信息:
## Julia 真的比 Python 和 Numpy 更快吗?
C 语言的速度与 Python 的简单性
towardsdatascience.com
对那篇文章最常见的回应之一是类似于:
好吧,你也应该使用 Numba。它实现简单,而且更快!
-相当多人
…因此这篇文章将直接尝试解决这个建议。
使用 Numba 是否能与 Julia 的速度相匹配,甚至超越?它是否像人们声称的那样易于使用和实现?而且,有什么缺点吗?
让我们来看看……
关于 Julia 的简要介绍
由于你们中的一些人可能还没有阅读关于 NumPy 的前一篇文章,我将重复那篇文章中包含的“什么是 Julia?”部分,但如果你已经阅读了前一篇文章,可以随意跳过。
什么是 Julia?
如果你对 Julia 一无所知,这里有一个快速入门指南。
Julia 是一种开源语言,具有动态类型、直观且易于使用的特点,类似于 Python,但执行速度如同 C 语言一般。
它已经存在大约 11 年(诞生于 2012 年),所以它是一种相对较新的语言。然而,它已经发展到一个成熟的阶段,你不会把它称作是一时的潮流。
语言的原始创造者活跃于相关领域的工作中:
对于我们所做的工作——科学计算、机器学习、数据挖掘、大规模线性代数、分布式和并行计算——…
- julialang.org — Jeff Bezanson, Stefan Karpinski, Viral B. Shah, Alan Edelman
总的来说,它是一种专门为数据科学领域设计的现代语言。创造者的目标本身就能告诉你很多东西:
我们希望拥有 C 的速度和 Ruby 的动态特性。我们希望有一种语言,它是同构的,具有类似 Lisp 的真正宏,但也具备像 Matlab 那样明显的、熟悉的数学符号。我们希望它像 Python 一样适用于通用编程,像 R 一样适合统计,像 Perl 一样自然地处理字符串,像 Matlab 一样强大地进行线性代数,像 shell 一样擅长将程序粘合在一起。我们希望它易于学习,同时能够让最严肃的黑客感到满意。我们希望它既具交互性又具编译性。
(我们提到过它应该和 C 一样快吗?)
- julialang.org — Jeff Bezanson, Stefan Karpinski, Viral B. Shah, Alan Edelman
听起来很令人兴奋,对吧?
顺便说一下,如果你想了解 Python 和 Julia 在语法和一般使用方面的对比,那么你可以查看我的另一篇文章,该文章深入探讨了使用 Julia(Flux)和 Python(TensorFlow)解决深度学习图像分类问题的情况:
## Julia 的 Flux 与 Python 的 TensorFlow:它们如何比较?
一个端到端深度学习项目的比较
[towardsdatascience.com
Numba 是什么,它为什么如此快速(以及受欢迎)?
图片由 Towfiqu barbhuiya 提供,在 Unsplash
Numba 的理念极其简单。
将 Python 代码预编译为机器代码,并执行编译后的代码,而不是 Python 代码。或者更详细地说:
Numba 使用行业标准的 LLVM 编译器库,将 Python 函数翻译为优化后的机器代码。用 Numba 编译的 Python 数值算法可以接近 C 或 FORTRAN 的速度。
要接近 C(或 FORTRAN)的速度,意味着 Numba 确实会非常快。
实现(通常)很简单
Numba 实现方式的一个主要优点是,在大多数情况下,它非常易于使用。以下是一个普通 Python 函数的例子,以及相应的 Numba 函数:
#normal function
def loop_function(a, b):
c = np.zeros(a.shape, dtype=np.float32)
for i in np.arange(c.shape[0]):
if a[i] < b[i]:
c[i] = 1.0
else:
c[i] = 2.0
return c, a + b
#the same function implemented with Numba implemented
@njit
def loop_function_numba(a, b):
c = np.zeros(a.shape, dtype=np.float32)
for i in np.arange(c.shape[0]):
if a[i] < b[i]:
c[i] = 1.0
else:
c[i] = 2.0
return c, a + b
实际上只需一个装饰器!似乎不在每个函数上实现 Numba 就有些不妥。(稍后会更多地讲到现实情况……)
那我应该用 Numba 替换 NumPy 吗?
Numba 不是 NumPy 的替代品或替代选择。它的设计目的是补充NumPy。
Numba 旨在与 NumPy 数组和函数一起使用。Numba 为不同的数组数据类型和布局生成专门的代码,以优化性能。特殊的装饰器可以创建 通用函数,这些函数可以像 NumPy 函数一样对 NumPy 数组进行广播。
这非常出色,因为 NumPy 已经非常强大,而 Numba 进一步提升了它的性能。此外,如果你决定使用 Numba,也不需要重新编写所有的 NumPy 代码。
Numba 的其他技巧
编译步骤只是开始。Numba 具有一整套附加功能,可以进一步提高执行速度。一些例子:
-
并行处理— 如果你的 CPU 有多个核心,你可以利用它们进行并行处理,以加快计算速度
-
快速数学 — 减少数值精度以提高执行速度
-
缓存 — 将编译后的代码保存在缓存中,以减少重复使用时的编译开销
-
CUDA— 利用你的 GPU 进行计算
当然,除了上述四个选项之外,还有更多的选择,如果需要的话,还可以进行大量的自定义。本文将主要关注上面列表中的并行处理和 Fastmath。
使用 GPU (CUDA) 需要另外一篇文章来详细说明,因此在这篇文章中不会涉及。
缺点
Numba 主要有两个负面点。
第一个也是最明显的,就是需要编译,而且编译需要时间。
如果函数只执行一次,那么编译时间可能是一个显著的缺点。然而,如果代码需要重复使用编译的函数(例如在循环中),那么这个缺点可能会变得微不足道。这完全取决于情况。
…需要编译,而且编译需要时间。
第二个,根据直接来自 Numba 网站的引用,是 Numba 只能在其设计用于的函数上实现。
Numba 是一个开源 JIT 编译器,将Python 和 NumPy 代码的一个子集翻译成快速的机器代码。
我会指出,虽然提供的函数非常丰富,因此你可能不会觉得这是个问题,但这仍然是一个负面点。此外,还有相当多的内置灵活性,允许编写自定义代码,比如 NumPy ufuncs。因此,如果你有非常独特的需求,也有一些变通办法。
速度测试的基础
正如本文开头所提到的,这篇文章实际上是两篇之前文章的汇总。
第一个提供了如何利用 NumPy 矢量化来加速你的 Python 代码的指南:
比普通函数快多达 8000 倍
towardsdatascience.com
…一个自然的进展是查看 NumPy 及其矢量化实现与 Julia 的比较:
## Julia 真的是比 Python 和 NumPy 更快吗?
C 的速度与 Python 的简单性
towardsdatascience.com
…现在,主要是由于对之前 Julia 文章的评论,我认为观察 Julia 与 Numba 增加的功能相比如何将会很有趣。
那么,让我们开始吧!
测试将如何进行?
图片由 Nguyen Dang Hoang Nhu 提供,来源于 Unsplash
将测试三种不同的函数。每个函数的复杂度逐渐增加。
函数 1 — 简单的求和
以下函数的输入(a 和 b)定义为具有一百万个元素的一维数组/向量。每个元素是从正态分布中取出的随机数,类型为 float32。
对于 Python 函数,数组将是 NumPy 数组。
# Example of an input array
series1 = np.random.randn(1000000).astype(np.float32)
# Python + NumPy + Numba
@njit
def sum_nums_numba(a, b):
return a + b
# Example of an input array
series1 = randn(MersenneTwister(12), Float32, 1000000);
# Julia
function sum_nums(a::Vector{Float32}, b::Vector{Float32})
return a + b
end
函数 2 — 循环函数
循环是无处不在的,因此值得关注。
输入数组将与函数 1 相同。
# Python + NumPy + Numba
@njit
def loop_function_numba(a, b):
c = np.zeros(a.shape, dtype=np.float32)
for i in np.arange(c.shape[0]):
if a[i] < b[i]:
c[i] = 1.0
else:
c[i] = 2.0
return c, a + b
# Julia
function loop_function(a::Vector{Float32}, b::Vector{Float32})
c::Vector{Float32} = zeros(Float32, size(a))
for i = 1:size(c)[1]
a[i] < b[i] ? c[i] = 1.0 : c[i] = 2.0
end
return c, a + b
end
函数 3 — 矩阵操作
矩阵操作是数据科学(尤其是深度学习)领域许多算法和任务的关键组成部分,因此是一个重要的考虑因素。
输入到函数中的数据将是一个从正态分布中取出的 100 x 100 随机数矩阵。
# Example of an input matrix
matrix1 = np.random.randn(100,100).astype(np.float32)
# Python + NumPy + Numba
@njit
def matrix_func(mat_a, mat_b):
a = mat_a.T
c = np.dot(mat_b,a)
d = c.reshape(50,50,4)
e = mat_b.reshape(50,4,50)
f = d.reshape(200,50)
g = e.reshape(50,200)
h = np.dot(f,g)
i = h.reshape(40000)
result = 0.0
for j in np.arange(i.shape[0]):
result = result + (i[j] - np.sum(i)) / np.sqrt(abs(np.average(i)))
return result
# Example of an input matrix
matrix1 = randn(MersenneTwister(12), Float32, 10000);
matrix1 = reshape(matrix1,(100,100));
# Julia
function matrix_func(mat_a, mat_b)
a = mat_a'
c = mat_b * a
d = reshape(c,(50,50,4))
e = reshape(mat_b,(50,4,50))
f = reshape(d,(200,50))
g = reshape(e,(50,200))
h = f * g
i = reshape(h,40000)
result = 0.0
for j = 1:size(i)[1]
result = result + (i[j] - sum(i)) / sqrt(abs(mean(i)))
end
return result
end
额外的调查
为了让信息更具参考性,还将研究以下项目:
-
所有 Numba 函数都将分别在包含和不包含编译阶段的情况下进行计时。这将帮助判断编译对整体执行时间的影响。
-
将进行单次迭代和多次迭代测试。再次是为了研究编译对执行时间的影响。
-
除了“正常”运行函数外,还将比较 Numba 和 Julia 中并行处理的有效性。
-
将研究 Numba 中 Fastmath 参数的额外好处
测量
函数的计时将使用 Python 中的 timeit 模块 和 Julia 中的 BenchmarkTools 模块 进行。
iterations = 10000
timeit.timeit(stmt=numba_func, setup=setup, number=iterations)
@benchmark sum_nums(rand_array1, rand_array2) samples=10000
一些常规信息(环境、版本等)
所有的测试都在完全相同的硬件上进行,该硬件使用的是 4 核心/8 线程 CPU(i7–4790K)(具体细节打印在 Jupyter notebooks 中)。
软件版本如下:
Julia: 1.9.2
Python: 3.11.4
NumPy: 1.23.5
Numba: 0.57.1
本文的 notebooks
图片由 Jessica Lewis 提供,来源于 Pexels
本文中生成结果所用的所有代码都完整地保存在两个 Jupyter notebooks 中,链接如下:
[## notebooks/julia-numba-comparison at main · thetestspecimen/notebooks
Jupyter 笔记本。通过在 GitHub 上创建帐户来为 thetestspecimen/notebooks 的开发做出贡献。
github.com](https://github.com/thetestspecimen/notebooks/tree/main/julia-numba-comparison?source=post_page-----897c53694621--------------------------------)
结果
图片由 Anna Nekrashevich 提供,来源于 Pexels
从……
一个简单的求和
首先在单次迭代中。
对两个数组进行一次迭代的简单求和 — 图表由作者提供
这个第一次单次迭代的运行仅仅是为了说明,相较于整体执行时间,使用 Numba 时函数编译可能会带来显著的开销。
值得指出的是,要避免陷入仅仅因为 Numba 而使用它的陷阱,而不考虑它是否合适。如果你只需执行一个相对简单的函数一次,那么通常直接使用 NumPy 会更好,或者如果情况允许,至少利用缓存。
现在让我们增加迭代次数,以减少初始编译的影响。
对两个数组进行 10000 次迭代的简单求和 — 图表由作者提供
好了,就是这样。Julia 垫底了!
实际上,差异很小(10000 次迭代 — Julia[7.2s] — NumPy[5.1s]),但这仍然是一个差异。
更令人惊讶的是,即使忽略掉 Numba 的编译时间,Numba 的执行速度实际上比 NumPy 稍慢。
这很好地说明了适当矢量化的 NumPy 计算非常优化,这是在考虑 Numba 是否适合你的特定应用时需要考虑的另一个因素。
注意: 有关 NumPy 矢量化的详细信息,以及它是如何工作的,请查看我之前的文章,我在其中详细讲解了:
比普通函数快最多 8000 倍
towardsdatascience.com
循环函数
进入一个更现实且稍微复杂的场景,让我们看看一个循环函数。
本质上是逐个元素地运行一个包含 100 万个元素的数组,并根据 if-else 语句替换每个元素。
# Python + NumPy + Numba
@njit
def loop_function_numba(a, b):
c = np.zeros(a.shape, dtype=np.float32)
for i in np.arange(c.shape[0]):
if a[i] < b[i]:
c[i] = 1.0
else:
c[i] = 2.0
return c, a + b
100 次迭代的循环函数(Comp — 包括函数编译时间,Para — 并行处理)— 作者图表
再次,Numba 占据了上风。
有趣的是,即使在 Numba 运行中包含编译时间,Numba 的速度仍然比 Julia 快。显然,如果迭代次数较少,这种领先优势将会减小,甚至最终会逆转。然而,执行阶段确实更快。
你还会注意到,在 Julia 和 Numba 的情况下,并行处理可以显著帮助。函数需要做一些轻微调整,但没有过于极端的改动。
对于 Julia,只需在 for 循环前添加 Threads.@threads
:
# parallelised Julia function
function loop_function_para(a::Vector{Float32}, b::Vector{Float32})
c::Vector{Float32} = zeros(Float32, size(a))
Threads.@threads for i = 1:size(c)[1]
a[i] < b[i] ? c[i] = 1.0 : c[i] = 2.0
end
return c, a + b
end
对于 Numba,只需在装饰器中添加 parallel=True
,并将 np.arange
替换为 prange
(即 并行范围)。
@njit(parallel=True)
def loop_function_numba_par(a, b):
c = np.zeros(a.shape, dtype=np.float32)
for i in prange(c.shape[0]):
if a[i] < b[i]:
c[i] = 1.0
else:
c[i] = 2.0
return c, a + b
通过使用 Fastmath 获得了额外的微秒,这本质上是通过降低精度来提高执行速度。这在机器/深度学习领域非常有用,因为在训练模型时不一定需要高数字精度。
只需对装饰器做一个简单的补充:
@njit(parallel=True, fastmath=True)
def loop_function_numba_par_fast(a, b):
c = np.zeros(a.shape, dtype=np.float32)
for i in prange(c.shape[0]):
if a[i] < b[i]:
c[i] = 1.0
else:
c[i] = 2.0
return c, a + b
矩阵操作
矩阵操作是数据科学工作流和深度学习/神经网络中不可或缺的一部分。
鉴于此,我觉得可能有趣的是看看 Julia 和 Numba 如何处理不同的矩阵操作链,包括:
-
普遍存在的点积
-
转置
-
重新形状
-
求和
-
平方根
-
绝对值
-
平均值
# the Python code for reference
@njit
def matrix_func(mat_a, mat_b):
a = mat_a.T
c = np.dot(mat_b,a)
d = c.reshape(50,50,4)
e = mat_b.reshape(50,4,50)
f = d.reshape(200,50)
g = e.reshape(50,200)
h = np.dot(f,g)
i = h.reshape(40000)
result = 0.0
for j in np.arange(i.shape[0]):
result = result + (i[j] - np.sum(i)) / np.sqrt(abs(np.average(i)))
return result
20 次迭代的矩阵操作(Comp — 包括函数编译时间,Para — 并行处理)— 作者图表
在这种情况下,Julia 表现最佳,差距相当大(大约快 10 倍)。为什么会这样尚难以解释,需要进一步调查。然而,我怀疑这与 Numba 的一些限制有关,我将在下一节进一步讨论。
另一个需要注意的地方是,由于这个函数的执行时间较长,相比于函数 1 和 2,编译时间在 20 次迭代时已经微不足道。
最终,Numba 如人们所说的那样快速,并且在大多数情况下使用起来非常简单。它轻松地将 Python 及其生态系统推向 Julia 的领域,整体上更新鲜。
但有一些注意事项…
局限性
图片由 RDNE Stock project 提供,来自 Pexels
可以公平地说,Numba 确实能够跟上,有时甚至超越 Julia 的执行速度。
然而,Julia 和 Numba 之间有一个主要区别。Numba 是一个语言的外部库,而 Julia 中使用的方法是集成到核心语言中的原生方法。
Numba 是一个语言的外部库,而 Julia 中使用的方法是集成到核心语言中的原生方法。
这基本上意味着,使用 Julia 你非常不容易遇到不兼容问题或方法应用限制。而对于 Numba,则不能这样说。Numba 的应用限制不仅在官方文档中被明确规定:
……但由于不兼容性,你更可能会发现 bugs。
我发现的一些 bug
本文中的代码非常有限。比较简单的函数。然而,我仍然遇到了 Numba 的问题,因此不得不调整我的分析。
在最近对 2D 数组/矩阵(函数 3)进行的基准测试中,为了使函数在使用 Numba 时能够运行,必须进行各种调整。
需要注意的是,使用纯 Python/NumPy 而不使用 Numba 时,以下问题都不存在。
-
你不能使用带有第二个参数的
np.reshape
(即你不能指定重新排序类型‘F’,‘C’等)。这是一个问题,因为 Julia 和 Python 使用不同的默认矩阵索引顺序,尝试尽可能保持比较/公平需要查看这个第二个参数。 -
np.matmul
不受支持,因此你必须使用np.dot
。这对像本文中使用的 2D 数组没有问题,但这些方法在高维数组中并不等效,因此如果你依赖于np.matmul
处理高维数组,可能会遇到问题。 -
打开 bug — 在转置后使用
np.reshape
需要进行复制,否则会失败 -
打开 bug —
np.dot
不支持整数数组。由于第 2 点,被迫从np.matmul
切换到np.dot
后,在测试中我遇到了另一个问题,然后才转向浮点数。
我在上述四个点上浪费了不少时间,因为不总是清楚你是否在做错事(即尝试实现不支持的内容),或者是在处理一个 bug。如果我处理的不是用于文章的“实验”代码,而是项目代码,那可能会变得相当令人沮丧。
结论
Numba 非常优秀,最重要的是它完全符合人们对它的所有评价:
快速且易于实现
…是的,总的来说,它基本上和 Julia 一样快。只要在适当的情况下使用。
然而,我不能忽视的是,与 Julia 直接比较时,Numba 有一些严重的局限性。当然,这些局限性的重要性会根据你的需求和特定约束有所不同。
在现实世界中,这基本上意味着,如果你的当前项目或基础设施依赖于 Python,而转到新语言太困难(缺乏经验丰富的开发者、太多的遗留代码、预算不足等)。那么由于像 NumPy 和 Numba 背后开发者的辛勤工作和坚持不懈,Python 在数据科学领域的速度和功能仍然是最新的。Numba 和 NumPy 非常有效地填补了这一空白。
然而,当你在 Julia 中编写代码时,你很清楚,基础语言在没有任何外部库的情况下已经进行了高度优化。它也是从根本上以数据科学为设计目标,因为这是创造者自己所需的:
对于我们所做的工作——科学计算、机器学习、数据挖掘、大规模线性代数、分布式和并行计算——…
- julialang.org — Jeff Bezanson, Stefan Karpinski, Viral B. Shah, Alan Edelman
你不需要了解或熟悉外部库和工具来确保你的项目在 Julia 中运行得很快。它默认就是很快的。这允许你更多地考虑你想要实现的目标,而不是不断考虑如何加快速度或优化。
这就是为什么如果条件允许,转向 Julia 是非常有意义的(在我看来!)。
注意: 如果你想了解更多关于 Julia 与 Python(TensorFlow)在深度学习方面的对比,务必查看这篇文章:
## Julia 的 Flux 与 Python 的 TensorFlow:它们的比较如何?
一个端到端深度学习项目的比较
towardsdatascience.com
如果你觉得这篇文章有趣或有用,记得关注我,或 注册我的新闻通讯 获取更多类似内容。
如果你还没有,可以考虑 订阅 Medium。你的会员费不仅直接支持我,还支持你阅读的其他作者。你还将获得 Medium 上每篇文章的完全无限制访问权限。
使用我的推荐链接注册将使我获得少量回扣,而不会影响你的会员资格,因此,如果你选择这样做,我非常感谢。
[## 使用我的推荐链接加入 Medium - Mike Clayton
作为 Medium 会员,你的会员费的一部分将支付给你阅读的作者,而且你可以完全访问每一个故事…
medium.com](https://medium.com/@maclayton/membership?source=post_page-----897c53694621--------------------------------)
逻辑回归是回归模型还是分类模型?让我们结束争论
从两个不同的角度和 3 轮讨论
·发表在数据科学前沿 ·11 分钟阅读·2023 年 3 月 14 日
–
尽管我们可以找到许多讨论这个问题的帖子和文章,我决定再添加一篇。因为这是一个讨论一些基础理论和框架的机会。
有些人试图通过给出明确的答案来捍卫他们的观点:逻辑回归是回归模型,或者逻辑回归是分类模型。我不会捍卫任何观点,因为对我来说,这场争论有些荒谬。
-
对于那些认为逻辑回归是分类模型的人,请注意,在“逻辑回归”这个名字中,有“回归”二字,所以对于那些将该模型命名为回归模型的人,他们认为它是回归模型是有原因的。是的,我知道可能存在误称,但你必须承认确实有原因。
-
对于那些认为逻辑回归仅仅是回归模型的人,你们也知道它被应用于分类任务。因此,其他人想称它为分类模型。
所以答案是这两种观点都是可能的。就像生活中的许多事物一样,我们对看似相同的主题给出了不同的、有时是矛盾的陈述,这是因为我们从不同的角度看待它。所以有趣的不是答案,而是我们如何得出这个答案。
这个问题也类似于关于番茄是水果还是蔬菜的古老争论。它们都有两个有效的答案,因为它们来自不同的角度和研究领域,即植物学和营养学。承认这两个答案将有助于你更好地理解植物的结构,并改善你对膳食的营养分析。对于逻辑回归也是如此,在这篇文章中,我们将尝试理解为什么会有这两种可能的答案,它们背后的原因将帮助你更好地理解这个模型的基本结构。
图片由 Tamanna Rumee 提供,来源于 Unsplash
0. 这两种观点
简而言之,有两种观点:
-
统计学家的观点:名称“逻辑回归”本身是由统计学家命名的,因此按定义,对他们来说,逻辑回归是一种回归模型,因为模型的输出是一个概率(在 0 和 1 之间),且它是连续的。
-
机器学习从业者的观点:有两种类型的监督学习,回归或分类,因此对他们来说,逻辑回归是一种分类器,因为它用于分类任务。
事实上,在我们的学习过程中,我们阅读了各种信息来源,有些遵循统计学的观点,有些则遵循机器学习的观点。有时,这两种观点的界限是模糊的。
现在,有人会说,通常,机器学习可以被视为统计学的一个分支,至少,它们并不是完全不同的,我不应该反对它们。是的,我同意,不过,我会通过明确区分这两种观点来解释它们,你将会看到这些差异。这样我们可以更好地理解所研究的主题。我计划写一篇文章来讨论这两种观点,特别是逻辑回归在这篇文章中作为一个重要的例子。
1. 第 1 轮:模型究竟是什么
首先,我们在谈论什么?什么是逻辑回归?我们会惊讶地发现,我们实际上在讨论两种不同观点下的模型。
1.1 统计学家的逻辑回归模型
对统计学家来说,模型是
p = 1 / (1 + exp (- (wX + b) ) )
模型的输出是一个 0 到 1 之间的值,随后可以表示一个概率。如果你愿意,你可以通过将概率切分为两部分来进行分类。通常,我们使用中间值:0.5 或 50%。因此,这里的顺序是,首先我们得到概率作为输出,然后进行分类。
这就是为什么对统计学家来说,逻辑回归是一种回归模型,因为其输出是连续的。
1.2 机器学习观点下的逻辑回归模型
对机器学习从业者来说,模型是
y = wX + b
输出是 y,称为决策函数。通常,y 的值要么是-1,要么是 1。
然后我们需要拟合模型,并选择一个损失函数。现在,当使用对数损失函数时,与统计学家的逻辑回归模型是等效的。
最终,线性模型被用于分类任务,具体取决于 y 是正数还是负数。
从某种程度上讲,他们不应该使用逻辑回归这个名字,因为逻辑函数从未用于类别预测。但是,由于最小化对数损失等同于最大化似然度,并且在分类方面得到了相同的结果,所以我们说逻辑回归已经被应用了。
我们可以想象,将这种线性模型与对数损失结合的特定组合称为“对数损失分类器”。但事实证明,机器学习研究人员通常不会给出具体的名称,而是指出现有统计模型中的等效模型。
现在,如果你想计算概率,你可以应用逻辑函数!因此,顺序不同,这里我们首先进行决策函数的分类,然后如果需要,可以计算概率。
(你们中的一些人可能对我从机器学习的角度所说的感到困惑。希望在第 3 轮中会更清楚。暂时,只需考虑 SVM。就像逻辑回归一样,SVM 是一个分类器。而与逻辑回归相反,概率计算不是立即得到的。你可以应用逻辑回归,但也存在其他方法,如同调回归,用于计算概率。)
1.3 第 1 轮的结论
总之,尽管统计学家和机器学习从业者使用相同的名称“逻辑回归”,但模型实际上是不同的,模型的输出也是如此。统计学家认为逻辑回归是一个回归器,因为模型试图建立一个概率的连续结果。而机器学习从业者认为逻辑回归是一个分类器,因为输出是二元的……哦等等,但线性模型的输出是连续的。分类部分是他们在模型拟合时添加的一个步骤。分类步骤真的属于模型本身的一部分吗?让我们进入第 2 轮。
2. 第 2 轮:一个(线性)分类器到底是什么
我记得在高中时,为了写一篇哲学论文,我们总是应该首先定义我们使用的术语。那么,分类器是什么?
2.1 从机器学习的角度来看线性分类器
对于机器学习从业者来说,逻辑回归是一个分类器,因为它应用于具有二元结果的数据集。所以,分类器的定义是应用于具有二元目标变量的数据集的模型。
记住这个定义后,让我们看看,如果我们在线性模型中使用平方误差而不是对数损失会怎么样?
当然,这是可能的,因为我们总是可以计算两个数字之间的平方误差,即使目标变量只有两个值。
对于有任何疑问的人,你可以阅读 SGDClassifier 的官方文档:
‘squared_error’,‘huber’,‘epsilon_insensitive’和‘squared_epsilon_insensitive’是为回归设计的,但在分类中也可能有用
所以根据这个分类器的定义,线性回归也是一个分类器!
2.2 从统计学角度来看分类器
现在,对于统计学家来说,什么是分类器?更具体地说,你能找到一个直接具有二元输出的数学函数吗?看来通常的数学函数总是具有数值输出。0 到 1 之间的输出是最接近二元输出的。因此,如果逻辑回归仍被认为是回归模型,那么基于数学函数的分类器可能根本不存在!
为了澄清我的陈述,我在谈论基于数学函数的模型或参数模型。对于基于距离的模型如 KNN,或基于决策树的模型,没有争议区分回归器和分类器。
有人会提到 LDA(线性判别分析),但你能写出 LDA 的数学函数吗?你不能,因为这个模型的起点不是基于数学函数的模型。但令人惊讶的是,最终的分类模型形式可能非常接近逻辑回归!你可以阅读这篇关于 LDA 与逻辑回归比较的文章。
有人会提到 SVM(支持向量机)。从统计的角度来看,我不确定 SVM 的实际位置在哪里。在《统计学习导论》一书中,有专门的一章讲述 SVM,好像它与其他建模方法非常不同。可以确定的是,分类是基于 y 的规则:如果 y 为正,则类别为正,否则将分配为负类别。因此,从这个角度来看,我们可以对逻辑回归应用相同的推理:它不是一个分类器,因为模型的主要输出不是二元的,而是连续的,只有在此之后,才能应用关于 y 的决策规则。然而,通常认为 SVM 是一个分类器。
事实是我们通常甚至不提及 y 被建模的情况,而是直接跳到超平面的部分,考虑 y = 0,如我们在维基百科页面上看到的那样。
en.wikipedia.org/wiki/Support_vector_machine
2.3 第二轮总结
对于第二轮的总结,当我们试图定义一个分类器时,争论已经结束。对于机器学习从业者来说,逻辑回归是一个分类器,这不是因为模型本身的任何特征,而仅仅是因为训练数据集有一个二元目标变量。对于统计学家来说,嗯,它是一个回归器,因为在试图找到一个数学函数来建模二元输出时没有其他选择……哦等等,当输出是从负无穷到正无穷的实数时,它是回归。当输出是从 0 到 1 时,它也是回归,或许对统计学家来说,有不同类型的回归。让我们进入第三轮。
3. 第三轮:两个不同的框架
是时候退后一步,从更高的视角来看一下:逻辑回归在其他模型中处于什么位置?
3.1 从统计学的角度看广义线性模型
对于统计学家来说,逻辑回归属于一个叫做广义线性模型(GLM)的模型家族。基础模型是线性回归,函数为 y = wX + b,术语“广义”意味着可以对这个简单的线性模型应用各种链接函数,从而使得生成的模型能够预测不同类型的输出,例如连续值、具有概率输出的二元值、多项式概率输出、计数数据或仅正值。
然后,模型参数的估计是通过最大似然估计(MLE)来完成的。因此,根据输出的性质,使用的分布种类不同,支持范围也不同,例如具有实数支持的正态分布、具有仅正值支持的伽马分布、具有整数支持的泊松分布和具有二元支持(0 和 1)的伯努利分布。
为了研究模型的质量,我们通常会研究系数和模型的统计显著性。
3.2 机器学习框架
对于机器学习,通常的区分只是回归器与分类器。值得注意的是,如果目标变量代表计数数据,仅正值,它仍然是回归。分类可以是二元的或多类的。
对于模型拟合部分,我们通常使用“成本函数”这个术语,其值必须被最小化,而“似然”则必须被最大化。但在许多情况下,这两者是等价的。对数损失是其中一种可能的损失函数。事实证明,使用对数损失使得模型等同于逻辑回归。
(现在,我们还可以提到,结合 L2 惩罚项的铰链损失等同于 SVM。正如我之前提到的,我不知道 SVM 在统计学中的位置,但在机器学习中,它的位置非常明确:它是一个具有铰链损失和 L2 惩罚的线性模型。当统计学家说它创建了一个进行分类的超平面时,事实是,具有对数损失的线性模型,也就是逻辑回归,做的也是一样的,事实上,无论使用什么损失函数,这都是真的,因为这是线性分类器的定义:从线性模型创建一个超平面!)
为了评估模型的质量,我们通常使用性能指标和模型调优部分,包括优化超参数。在这里我们可以注意到,GLM 没有超参数的概念。
你可以了解更多关于统一线性分类器在估计器 SGDClassifier 中的内容。
SGDClassifier — 作者提供的图片
3.3 第三轮结论
所以根据这两个框架,“逻辑回归是回归器还是分类器”这个问题有点奇怪:
-
“逻辑回归”是 GLM 框架中使用的术语
-
回归器与分类器是机器学习框架
这个问题的本质类似于“番茄是水果还是蔬菜”。两种答案都是可能的,因为这两种观点来自两个不同的领域:植物学和营养学。
总结这一轮,统计学角度试图找到根据输出性质定义上相关的模型,在逻辑回归的情况下,主要目标是用伯努利分布建模二元输出。统一框架是 GLM。从机器学习的角度来看,我们有三个主要步骤:
-
模型:在逻辑回归的情况下,它是 y = w X + b
-
拟合:选择对数损失来找到系数 w 和 b
-
调优:我们通常使用惩罚项来避免过拟合,需要进行调优。
4. 结论
逻辑回归是回归器还是分类器?现在,希望我们都能看到这个问题本身是定义不明确的。名称“逻辑回归”本身反映了一种观点。输出没有明确定义。基于数学函数的分类器没有明确定义。
但这是一个机会,因为在真正尝试回答这个问题时,我们可以从不同的角度重新发现许多我们以为已经了解的事物,从而获得更多理解。回归器与分类器之间的区别本身就是机器学习的视角。对于统计学家来说,逻辑回归是属于 GLM(广义线性模型)的一个模型,这个框架考虑了更多类型的输出,比如计数数据、仅正输出。
为了更好地了解机器学习模型,特别是一些我提到的模型,如 LDA 或 SVM。它们在这些框架中的地位如何?就像关于番茄是水果还是蔬菜的古老争论一样。你可能会忘记同样的问题也适用于南瓜和青豆。在某种程度上,LDA 和 SVM 也可以被视为回归器和分类器。
我写了这篇文章,以便你可以阅读关于机器模型的三步,以获得更好的总体理解。
我撰写关于机器学习和数据科学的文章,并以清晰的方式解释复杂概念。请通过以下链接关注我,获取我的文章的完整访问权限:medium.com/@angela.shi/membership
参考资料:
其他参考资料:
PandasGUI — 轻松数据分析的终极秘密
原文:
towardsdatascience.com/is-pandas-easy-to-use-try-this-tool-to-make-it-easier-2071eeffe482
图片由 Alan Frijns 提供,来源于 Pixabay
PandasGUI 的数据分析实用概述
·发表于 Towards Data Science ·阅读时间 7 分钟·2023 年 4 月 14 日
–
数据分析已成为各个行业不可或缺的一部分,因为它使我们能够根据收集的数据做出明智的决策。Python 中最受欢迎的数据分析库之一是 Pandas,它提供了强大的数据操作和清理工具。然而,使用 Pandas 有时可能会感到不知所措,特别是对于那些刚接触数据分析或偏好更直观方法的人来说。这时,PandasGUI 就派上用场了 — 这是一个将图形用户界面引入 Pandas 的库,使数据操作和可视化变得更加易于访问和用户友好。
在本文中,我们将详细了解 PandasGUI 及其功能,指导您完成安装过程,并展示其能力。
1. 安装与启动
图片由 traditional chinese medician · 素君 提供,来源于 Pixabay
首先,我们需要安装 PandasGUI。和往常一样,我们可以使用 pip
来安装它。
pip install pandasgui
1.1 非 Windows 操作系统的小问题
本节适用于使用非 Windows 操作系统的用户,如果您实际使用的是 Windows 操作系统上的 Python,则可以跳过此步骤。
看起来作者是在 Windows PC 上创建了这个库,因此假设操作系统会有一个环境变量 APPDATA
。但是,对于其他操作系统如 Mac 或 Linux,这种情况并非如此。具体来说,当我们尝试导入 PandasGUI 时,会出现这个错误。
import pandas as pd
import pandasgui
修复此问题的最简单方法是手动为该环境变量指定一个空字符串。
import os
os.environ['APPDATA'] = ""
然后,我们将能够毫无问题地使用 PandasGUI。
警告信息是正常的。我猜它没有实现一些 Mac OS 中推荐的接口,因此我的系统给出了这个警告。
1.2 加载示例数据集
为了演示这个库,我们需要使用一个示例数据集。如果你是一名数据科学家,你可能对 Iris 数据集很熟悉,它在许多分类或聚类机器学习演示中被使用。
我们从 Datahub.io 获取数据集。它是一个用于发现、共享和发布来自各种来源的高质量开放数据集的平台。这里的大多数数据集是开源的,并且可以根据许可证用于学习目的,包括 Iris 数据集。
df = pd.read_csv("https://datahub.io/machine-learning/iris/r/iris.csv")
df.head()
df.shape
1.3 启动 PandasGUI
现在,让我们极其简单地启动 PandasGUI。只需按如下方式调用 show()
函数即可。
pandasgui.show(df)
不用担心关于缺失字体家族的警告,这再次是由操作系统造成的。指定的字体家族在我的 Mac OS 上不存在。这不影响我们使用 GUI。
运行这一行代码后,GUI 应该会以桌面应用程序的形式弹出。
2. PandasGUI 的功能
UI 相当直观。它由以下组件组成。我将在后续小节中介绍它们。
-
DataFrame 列表 — 我们可以在这里导航和切换数据帧。它还显示了数据帧的形状以方便查看。
-
过滤查询 — 创建和选择查询表达式以过滤当前数据帧
-
列列表 — 查看和导航当前数据帧的列
-
功能标签 — 切换标签以导航不同的工具
-
主要区域 — 显示当前操作的结果
2.1 过滤数据帧
我想介绍的第一个功能是过滤。它依赖于 DataFrame 查询表达式来快速为我们过滤数据帧。
具体来说,我们只需输入类似sepallength > 7
的查询并按回车。过滤器将应用于数据框。我们可以在主区域查看过滤后的结果。
如果我们想回到查看整个数据框,我们可以取消勾选表达式以移除过滤器。
此外,还可以添加许多查询表达式并使用复选框灵活应用它们。例如,下面的截图显示了两个已选中的表达式,它们都用于过滤数据框。
2.2 排序、类型转换和颜色编码
在数据框主区域,我们还可以轻松地完成许多类似 Excel 的操作,如排序和颜色编码。除此之外,我们还可以轻松地转换列的数据类型。
例如,下面的截图显示了数据框按sepalwidth
列的降序排序,并且数值列根据其值的范围进行了颜色编码。
2.3 统计信息
在第二个特征标签中,我们可以看到该数据框的统计信息。
还值得一提的是,我们也可以在左侧选择查询表达式。然后,统计信息将基于过滤后的数据框重新计算。
2.4 绘图
我不得不说,当我们想使用代码绘制图表时,Python 是最简单的语言之一。然而,我们毕竟还是要写一些代码。
在 PandasGUI 中,我们可以在几秒钟内使用其列绘制数据框。例如,下面的演示显示了我只需切换到“绘图器”标签并选择“散点图 3D”。然后,将一些列拖到轴字段中。
如果我们想切换到其他类型的图表,也不需要花费多少时间。这实际上让我们可以快速测试不同类型的图表,并决定哪种图表能更好地讲述数据故事。
2.5 重塑数据框
我们还可以使用 PandasGUI 通过拖放重塑数据框。例如,我们可以通过将“class”转换为列来透视 Iris 数据框,然后计算每个属性的平均值,例如花瓣长度。
拖动列后,点击“完成”按钮。将生成如下的新数据框。
2.6 生成代码
对于上述大多数功能,PandasGUI 也可以为我们生成代码。当我们使用 GUI 决定哪种图表最好时,这非常有用,然后可以轻松生成代码并将其放入实际脚本中。
类似地,重塑功能也提供了代码导出功能。它允许我们多次实验重塑,然后输出正确的代码。
好吧,我们可能可以在 ChatGPT 中完成这个,但需要解释很多内容,并将其应用到我们的背景中 😃
总结
总结来说,本文深入探讨了 PandasGUI 的各种功能,这是一种强大的库,为广泛使用的数据处理和可视化的 Pandas 库带来了图形用户界面。我们演示了安装过程,加载示例数据集,并探索了如筛选、排序、统计分析、绘图、重塑和代码生成等功能。
PandasGUI 是一个宝贵的工具,可以通过简化常见任务和提供互动体验来显著增强你的数据分析工作流。尽管它极大地便利了初学者和经验丰富的数据科学家的数据处理,但需要注意的是,它可能不支持极其复杂的操作。对于高级操作,可能需要依赖传统的 Pandas 脚本。
[## 通过我的推荐链接加入 Medium - Christopher Tao
感谢阅读我的文章!如果你不介意的话,请请我喝杯咖啡 😃 你的会员费用支持成千上万的…
medium.com](https://medium.com/@qiuyujx/membership?source=post_page-----2071eeffe482--------------------------------)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员,以支持我和成千上万的其他作者!(点击上面的链接)
除非另有说明,否则所有图片均由作者提供
PyTorch 的 Nesterov 动量实现是否有误?
·
关注 发表在 Towards Data Science ·6 分钟阅读·2023 年 9 月 2 日
–
动量帮助 SGD 更有效地遍历复杂的损失景观。图片由 Maxim Berg 提供,来源于 Unsplash。
引言
如果仔细查看 PyTorch 的 文档,你会发现他们对 Nesterov 动量的实现与 原始论文 中的公式有一些不同。最显著的是,PyTorch 的实现是在当前参数上计算梯度,而 Nesterov 动量的核心是评估偏移参数的梯度。不幸的是,关于这些差异的讨论在互联网上很少。在这篇文章中,我们将检查并解释 PyTorch 实现与 Nesterov 动量原始公式之间的差异。最终,我们将看到 PyTorch 的实现并非错误,而是一种近似,并推测其实现的好处。
公式
原始论文 使用以下更新规则描述了 Nesterov 动量:
其中 v_{t+1}
和 θ_{t+1}
分别是时间 t 的速度向量和模型参数,μ 是动量因子,ε 是学习率。PyTorch 的 SGD 文档 中的说明称他们使用以下更新规则:
其中 g_{t+1}
代表用于计算 v_{t+1}
的梯度。我们可以展开 θ_{t+1}
的更新规则得到:
从中我们可以推断:
和更新规则变成:
这些是 PyTorch 理论上使用的更新规则。我之前提到过,PyTorch 实际上是在当前参数上评估梯度,而不是偏移参数。通过查看 PyTorch SGD 文档中的算法描述可以看到这一点。我们将在后面进一步调查这一点。
请注意,对于原始公式 (1, 2) 和 PyTorch 公式 (3, 4) 来说,如果 v_0 = 0
,则 θ
的第一次更新变为:
尽管 PyTorch SGD 文档中说明算法在第一步将动量缓冲区初始化为梯度,但我们稍后会显示这意味着 v_0 = 0
。
初步差异
从原始公式 (1, 2) 到 PyTorch 公式 (3, 4) 存在两个直接的区别:
-
学习率被移出了
v_{t+1}
。 -
在*
v_{t+1}
的更新规则中,涉及梯度的项被添加而不是减去,而在θ_{t+1}
*的更新规则中,涉及速度向量的项被减去而不是添加。这种梯度项符号的差异仅仅是前一节中展示的结果。
要理解这些差异,让我们首先展开更新规则。如 这里 所提示的,如果我们考虑学习率调度,第一种差异的影响会更为明显。因此,我们考虑一个更新规则的广义化,其中 ε 不再是固定的,而是可以随时间变化,并将 ε_t 记作时间步 t 时的学习率。为简洁起见,设:
假设 v_0 = 0,原始公式变为:
那么 PyTorch 公式变为:
在原始公式(6)中,如果学习率在时间 t 发生变化,那么仅会影响求和中 i = t 的项的大小,而所有其他项的大小保持不变。因此,学习率变化的直接影响是相当有限的,我们必须等待学习率变化在随后的时间步中“逐渐”发挥更强的作用。相比之下,在 PyTorch 公式(7)中,如果学习率在时间 t 发生变化,那么整个步骤的大小会立即受到影响。
对于 v_0 = 0,从展开的规则可以看出,第二种差异最终没有影响;在任一公式中,这一步的结果都是从当前参数中减去折扣后的梯度和。
主要差异
忽略权重衰减和阻尼,通过分析 PyTorch 的 文档,我们可以看到实现的更新规则是:
其中 θ’_{t+1} 是时间 t 时的模型参数
我们将方程 3 和 4 称为 PyTorch 的“笔记”公式,将方程 8 和 9 称为 PyTorch 的“实现”公式。我们在θ和*θ’*之间做了区分,原因会很快显现出来。与笔记公式最明显的区别是梯度在当前参数处进行评估,而不是在偏移后的参数处。从这一点来看,算法实现的更新规则似乎并不是 Nesterov 动量的正确实现。
我们现在将考察 PyTorch 算法如何最终近似 Nesterov 动量。旧版本 PyTorch 的推导可以在 Ivo Danihelka 提供的 这里 找到,并在 这个 GitHub 问题 中引用。当前版本 PyTorch 的推导可以在 这里 找到,这相对是对之前推导的简单调整。为了方便读者,我们在此提供这些(重新推导的)推导的 LaTeX 渲染。实现的公式是通过简单的变量变换得到的。具体而言,我们设:
很明显,v_{t+1} 的注释更新规则 (3) 在变量变换后与 v_{t+1} 的实现更新规则 (8) 等效。我们现在想要推导一个关于 θ’_{t+1} 的更新规则,以 θ’_t 为变量:
这正是我们在 PyTorch (9) 中看到的更新规则。总体上,PyTorch 实现假设当前参数 θ’_t 已经是“实际”参数 θ_t 的偏移版本。因此,在每一个时间步, “实际”参数 θ_t 与当前参数 θ’_t 之间的关系为:
然而,从源代码来看,PyTorch SGD 实现似乎在算法结束时没有对“实际”参数进行任何修正,因此最终输出在技术上是“实际”参数的近似值。
最后,我们现在展示 v_0 必须为 0:
此外,我们可以确认对“实际”参数的第一次更新与原始表述中 v_0 = 0 时的第一次更新相同:
我们可以看到这等同于方程 5。
实现表述的好处
当然,剩下的大问题是:为什么 PyTorch 要从方程 3 和 4 重新表述 Nesterov 动量到方程 8 和 9?一个可能的解释是,重新表述可能在所需的算术操作数量上有所节省。为了评估这个可能的解释,我们来计算一下算术操作的数量。对于注释的表述 (3, 4),我们有:
在这里,总共有七个操作。对于实现的表述 (8, 9),我们有:
在这里,总共有六个操作。PyTorch 实现中的第二个梯度只是使用了第一个梯度计算的保存结果,因此每个时间步只执行一个梯度计算。因此,一个明显的好处是 PyTorch 实现减少了每一步的一个额外乘法操作。
结论
总结
-
PyTorch 的 SGD 文档注释 (3, 4) 中的更新规则与原始 Nesterov 动量更新规则 (1, 2) 中的学习率位置不同。这允许学习率调度对整体步长有直接影响,而原始表述则会使学习率变化在随后的时间步中“逐步”体现。
-
PyTorch SGD 算法 (8, 9) 中实现的更新规则是在简单的变量变换后对文档注释 (3, 4) 中更新规则的近似。尽管“实际”参数可以在每个时间步从当前参数中轻松恢复,但 PyTorch 实现并没有在算法结束时进行任何修正,因此最终参数在技术上仍然是“实际”最终参数的近似值。
-
PyTorch 实现的一个明显好处是它避免了每个时间步的额外乘法操作。
参考文献
-
“SGD。” SGD — PyTorch 2.0 文档,pytorch.org/docs/stable/generated/torch.optim.SGD.html。访问日期:2023 年 9 月 2 日。
-
Sutskever, Ilya 等人。“深度学习中初始化和动量的重要性”。国际机器学习会议。PMLR,2013 年。
-
Danihelka, Ivo. “Nesterov 的动量简明介绍”。2012 年 8 月 25 日。
-
Chintala, Soumith. “SGD 中的 Nesterov 动量是错误的 · Issue #27 · torch/optim。” GitHub,2014 年 10 月 13 日,github.com/torch/optim/issues/27。
-
Gross, Sam. “在文档中添加关于优化中使用的动量公式的说明 · Issue #1099 · pytorch/pytorch。” GitHub,2017 年 3 月 25 日,github.com/pytorch/pytorch/issues/1099#issuecomment-289190614。
-
Zhao, Yilong. “修复 Nesterov 动量错误 · Issue #5920 · pytorch/pytorch。” GitHub,2018 年 3 月 21 日,
github.com/pytorch/pytorch/pull/5920#issuecomment-375181908
。
无服务器难以采纳吗?
理解使您的无服务器采用成功的简单措施
·
关注 发表于 Towards Data Science ·13 min read·Nov 20, 2023
–
Mikhail Nilov 拍摄的照片,来自Pexels
一年多前,我们在奥地利塞默林的 9 月环境中某个高处徒步时,在我们的小径上的一个路口迷失了方向。由于路标不明确,我用手机寻找线索。在众多 Twitter(X)通知中,刚刚闪过保罗·约翰斯顿的文章学习无服务器(以及为什么难)。
在平常的日子里,我会立刻阅读它。但考虑到当前的位置以及引导家人走出树林的责任,我并不愿意为了无服务器牺牲赏心悦目的塞默林早晨。
我重读了这一点,在他的文章中,保罗勇敢地击中了许多钉子!我本想更早地加入,但是为了完成《AWS 上的无服务器开发。构建企业级无服务器解决方案》(O’Reilly, 2024)这本书,我在一年后来借了这把锤子,来打自己的一些钉子,从整体角度来看问题,而不仅仅是学习本身。
在这篇文章中,我将带你了解使用无服务器技术开发应用程序时成功的一些关键因素 — 无论是在商业产品开发、构建数据驱动的应用程序、AI 还是机器学习方面。
AWS 上的无服务器开发:构建企业级无服务器解决方案
驾驶汽车难吗?
-
驾驶 手动变速汽车难吗?
-
学习 手动变速汽车难吗?
答案因人而异。如果你已经开车几年,对第一个问题的回答将是否定的 no。因为多年来,你已经熟悉了所有的操作,它们已经变得自然而不需要考虑。
然而,当你还是一名学习者时,你对第二个问题的回答肯定是 yes。学习驾驶时,有许多事情需要考虑 —— 需要协调的动作、按顺序进行的活动以及需要并行进行的观察。所有这些都是在车辆运行时进行的。
仅仅掌握方向盘技能并不足以使你称为一名司机。
如果你现在考虑一个自动变速汽车,作为驾驶员的活动会有所减少,因为汽车的机械结构会处理某些动作(就像云提供商处理无服务器中的一些重活)。
我们日常生活中有很多挑战,但我们学习技能并跟随已验证的路径来提升自己。无服务器开发也不例外。它可能听起来有点简单(就像自动变速汽车),但它不会让你即刻启动引擎并飞驰而去。
一个混乱的无服务器实现。来源作者。
在技术上有很多错误的做法 —— 无服务器更是如此。使用无服务器服务构建混乱的事件驱动架构非常容易且时间短。但是,构建和开发一个模块化、可观察且可持续的解决方案需要知识和正确的技能。这并不意味着无服务器很难。
在技术领域中,有许多做错事的方法——尤其是在无服务器环境中。
如果你不理解其生态系统,无服务器将会很难。
一辆车有许多部件,从高层次到细节层次。车发动机主要作为一个整体来书写,但有多个组件。一个正常运转的汽车需要一个司机(忽略无人驾驶的情况)并搭载乘客。从某种程度上讲,所有这些共同构成了汽车的生态系统。
很多时候,许多人将无服务器描绘成一种架构蓝图、函数即服务(FaaS)或框架。对我而言,它超越了这些概念,远超我们通常想象的。无服务器,某种程度上,是一个技术生态系统。当你和我使用无服务器时,我们也成为其中的一部分——类似于司机和乘客成为汽车生态系统的一部分。
无服务器生态系统包含许多因素。来源作者。
如图所示,无服务器生态系统包含多个因素。无服务器技术带来了其独特的特性。云平台及其托管服务构成了基础。开发实践、工具和框架使流程更快地带来价值。业务利益相关者与工程师合作,为客户在无服务器上构建现代能力。所有这些以及更多内容都是生态系统的一部分。
上述描绘的目的是让你超越编写函数或讨论基础设施工具的思维。考虑一下无服务器给你的组织、团队和你个人带来的多样性,因为你在使用无服务器时将会身兼多职。随着我们成熟并成为无服务器生态系统的一部分,像Lee Gilmore这样的想法比以前更为常见。
如果你以错误的心态开始,无服务器将会很难。
几年前,一位工程师联系我寻求有关他无服务器旅程的指导。聊天几分钟后,很明显他希望以云无关的方式实现他的 Lambda 函数逻辑,以便他的无服务器应用程序可以在组织决策者希望切换时随时部署到不同的云提供商 如果及何时 决策者想要切换。
了解他的意图后,我询问了他对非 FaaS 服务的处理方法,以及他如何使其具有云无关性。他的解释是某种宏伟的六边形架构实现!
在通话快结束时,我意识到他还没有在生产环境中部署任何无服务器工作负载!
尽管类似上述的思想和方法让董事会满意,但挑战和对业务的价值却未被评估。企业采用诸如无服务器这样的技术,以提高速度、增加流量并建立竞争优势。以上述心态接触无服务器就像是在追逐海市蜃楼,永远无法完成并交付任何东西。
工程师经常指出框架提供的多云配置作为例子(或借口)。事实上,工具提供这样的功能是为了让每个人都能使用它们,并且你不应该根据框架提供的内容做出多云决策。当这些错误的策略无法产生价值时,你会听到抱怨 - 切换到 Serverless 是困难的、令人困惑的,并且违反直觉 — 正如保罗在他的文章中提到的。
开发工具经常支持多云能力,但你不应该基于框架提供的内容做出多云决策。
如果你认为 Serverless 太简单,它就会变得困难。
我被邀请参加一个会议,听取并批准一个 Serverless 架构提案。一个工程师展示了一个精心制作的虚拟板,并详细解释了他们的架构。Lambda 函数主导了解决方案,周围散布着一些 DynamoDB 表。我开始感到不舒服,并且抱歉地打断了谈话,问了这个问题 -
你以前构建过 Serverless 解决方案吗?
工程师回答说,是的!
在对设计中某些选择的几个“为什么”进行更多询问后,工程师承认之前他们只为简单功能编写了 Lambda 函数,而没有设计或构建事件驱动的微服务。
我在这里的意图不是贬低工程师,而是强调我们在学习和使用新技术时都要经历的重要阶段。知道如何编写和操作 Lambda 函数绝对是正确的开始,但与此同时,你不应该认为 Serverless 中的一切都太容易了。这种态度会导致你实现混乱的 Serverless 应用程序。
我同意,对于新手来说,将问题分解为微服务、识别应用程序的同步和异步部分、以事件方式思考,或者设计可观察性都是复杂的。事实上,这些方面中的许多并不新鲜,也不特定于 Serverless。不同之处在于,过去的隔离团队结构中,作为程序员的你从未接触过或参与其中。
学车时,你需要经过多次课程才能在实际驾驶测试中感到自信。同样,评估你的 Serverless 技能并在工作中作为 Serverless 工程师进行必要的学习(在后面的部分讨论)是必要的。
Serverless 是很难的,如果你排除工程师参与架构讨论。
我在指导团队时采用的方法是将一个服务或功能的开发所有权分配给一名或多名工程师 — 从想法到生产。他们从与产品团队、利益相关者和技术专家的早期交流开始,收集关于他们将要构建的解决方案的知识。他们参与必要的构思会议和问题分析,并在得到资深人员和专家指导后开始起草架构,然后发布一个解决方案设计文档,供所有人审查。从这里开始,实施票据被创建并进入迭代开发和交付阶段。
它带来了什么,我们为什么需要它?
上述方法是有意为之的。尽管存在缺点和批评,但它为团队和工程师的职业成长带来了许多好处。要教育工程师并使他们成为无服务器生态系统的一部分,你必须停止向他们提供架构蓝图。相反,通过向他们提供思想和资源来与他们一起演进架构,使他们学习、开发和交付。
不要在架构师的象牙塔中设计你的无服务器架构,而是在你团队的引擎室中创建它们。
曾经在一个组织中,进行了跨团队合作,以推出一个新功能。之前有几次构思会议,与一群人讨论后达成了一个高层提案,足够详细以在解决方案设计中详细描述。后来,几名工程师被指派一个票据来实现他们团队解决方案的一部分。然而,这些工程师从未参与过先前的会议,没有简要介绍,也没有看到捕捉到所有涂鸦、绘图和思绪的虚拟板。
可以想象,上述工程师陷入了困境。无论工程师的能力如何以及问题的微不足道程度如何,请确保你的无服务器开发不是从 Visual Studio (VS) Code 开始的。如果你这样做,不能保证你的无服务器体验会更顺利。
无论工程师的能力如何以及问题的微不足道程度如何,你的无服务器开发不应该从 VS Code 开始。
如果你追求完美主义而不是实用主义,无服务器开发就会很困难。
在我的演讲中,我分享了一张幻灯片,展示了一个实际思维的团队如何借助无服务器加速,而试图通过悲观的观点使一切完美的纯主义团队则落后。
两种类型的无服务器采用派系。来源作者。
通常情况下,信息过载和没有实际引擎室经验的象牙塔架构师的完美主义会使你的无服务器采用变得困难,你的经验变得糟糕。
我曾经在社区交流中听到过两支无服务器团队的故事。这两支团队有共同之处。它们都在各自的边界内运作 — 即有界上下文内 — 开发事件驱动的微服务,并且拥有明确定义的 API。
其中一支团队在单个生产 AWS 账户中拥有和运行它们的微服务(测试、QA、预发布等有单独的账户),将它们的 Lambda 函数放置在自定义 VPC 之外,并仅在必要时配置 VPC,将它们的 API 托管在 Amazon API Gateway 并配备必要的使用计划。他们的服务由 Amazon EventBridge 上的自定义事件总线协调。对于这支团队来说,开发、部署和运营新的微服务听起来是轻而易举的。
然而,第二支团队遵循纯主义思想,选择在不同的 AWS 账户中托管每个微服务,并将其 Lambda 函数部署在自定义的 VPC 内。此外,它们所有的 API 都托管在一个不同的网关着陆平台上。随着二十多个微服务的增加,它们在处理涉及的复杂性时陷入困境。
当然,在我们做出不同选择和决策的情况下,我们应该评估并纠正课程,以避免陷入难以管理且无法回头的局面。
采用无服务器架构的主要动机之一是将繁重的工作交给云服务提供商,但如果我们的策略与无服务器的优势背道而驰,无服务器只会变得更加困难。
如果你侵蚀团队边界,无服务器将变得困难。
当涉及团队边界时,每个人都会考虑有界上下文(如领域驱动设计中的概念)。然而,其他边界对于自治的两披萨无服务器团队同样重要,如下所列。破坏边界将导致使你的无服务器经验变得困难的后果。
-
有界上下文边界
-
团队责任边界
-
团队所有权边界
-
源代码仓库边界
-
云账户边界
前三者相互依赖且重叠。如果你的团队是组织领域的有界上下文的保护者,你就处于一个很好的位置。在这种情况下,你的团队负责有界上下文边界内的所有事物,并拥有所有功能、服务和实现工件。
所有你拥有资产的实现工件都在一个仓库中,你的团队成员在其中贡献并共享。
AWS 云账户边界标志着您部署和操作云及无服务器资产的运营边界。
在理想的世界中,您的团队与这些边界之间会有一对一的映射,如下所示。
-
您的团队存在是因为有了有界上下文。
-
您的团队负责并拥有有界上下文中的所有内容。
-
您的团队有一个仓库,只有您的团队贡献。
-
您的团队在其专用的云账户中操作其拥有的所有内容。
您作为无服务器工程师的生活尽可能简单和愉快!
现在,让我们开始放松并打开边界,想象可能会发生的事情。
由于业务优先级和满足交付期望的需要,您将来自另一个团队的工程师分享对您团队边界的责任,迫使您团队的重点领域发生变化。
-
您如何确保团队了解彼此的工作方式?
-
您如何确保代码质量保持一致?
-
您如何确保选择的 AWS 服务和架构模式是对齐的?
-
您如何确保操作责任没有漏洞?
这些团队可以合作解决和缓解情况。但合作意味着更多的聊天、配对、审查、讨论、会议等,这些都会影响两个团队的关注和效率。
开放团队边界和共享责任,如果没有充分的考虑,可能会对组织产生负面影响。无服务器开发会变得更加困难,开发者体验也会变得令人沮丧。
如果不投入人员的成长,无服务器将变得困难。
我们周围充满了捷径。几条捷径可以教您编写 Lambda 函数。这种快餐式的学习方法只在食物存在的时间内有效。为了满足您的胃口,您需要不断订购更多的食物。
要在无服务器中取得成功,您必须不断学习。
Paul 的文章 主要关注学习以及进入无服务器领域的人们通常如何努力理解技术及其生态系统。正如 Paul 所描述的,对于一个新手来说,甚至单一用途的 Lambda 函数的概念本身也需要时间消化。
要在无服务器中取得成功,一旦掌握了单一用途的 Lambda 函数,您需要迈出许多步伐。几个领域充当您向成功目标迈进所需的跳板,并且您在此过程中积累了许多特质。
我经常强调无服务器如何为团队带来工程多样性。如果您想让无服务器变得简单,这种认识至关重要。
工程师应该得到引导、培养、指导或培训(或者你的组织中使用的术语),让他们理解利益相关者的需求,允许他们提出架构方案,灌输单一功能和微服务的好处,展示如何融入安全性,教授可观察性原则,让他们部署到生产环境,并标记他们为服务的所有者。这不会一夜之间实现,也不会仅通过看几段 YouTube 视频就能达成。这正是质量培训和长期人才成长战略发挥作用的地方。
传统的专业化专家与多样化的无服务器工程师。信息来源作者。
不要用企业官僚主义限制工程师。让他们自由学习新知识,参加会议,并参与技术研讨会和协作活动。
我在一次会议上与一位工程经理交谈。她认为像 EventStorming 和架构 Katas 这样跨越几个小时或更长时间的研讨会是浪费时间,并影响团队的生产力。于是我问她,如果有几位机会被拒绝和不满的工程师请了一两天病假,她怎么处理生产力问题。她没有答案!
无服务器训练营是装备工程师掌握无服务器技术生态基础的简单方法。一些组织已成功实施了这类项目。Matt Coulter,一个 AWS 英雄,曾提到 Liberty Mutual 公司成功为新员工实施的一个项目。组织经常因预算约束而将此类倡议降级,甚至未评估其带来的好处。
在无服务器培训中的一个挑战是课程大纲中技术、开发、架构和运营元素的质量和覆盖范围。在多个课程中,我听到了Yan Cui的《生产就绪的无服务器》培训研讨会获得了很好的反馈。Yan 是 AWS 无服务器英雄,也是无服务器知识的强大力量。
学习构建生产就绪无服务器应用的最佳实践。
productionreadyserverless.com](https://productionreadyserverless.com/?source=post_page-----56c35672b958--------------------------------)
让工程师理解利益相关者的需求,允许他们提出架构方案,灌输单一功能和微服务的好处,展示如何融入安全性,教授可观察性原则,让他们部署到生产环境,并标记他们为服务的所有者。
无服务器将变得更加简单…
就像驾驶随着驾驶时间的增加变得更好更容易一样,随着你积累经验并熟悉其生态系统,无服务器变得更加高效和愉悦。
过山车并非每个人的最爱。寻求刺激的人们常给他人的最常见建议是 — 你必须学会放手!
你必须学会相信无服务器技术,以利用它提供的无差别重型工作。如果 AWS 提供托管解决方案,请利用它们来增加业务价值。为什么要反其道而行之,构建你永远不需要的复杂解决方案?
从那些成功采用无服务器的人那里获取灵感。
要结束的时候,我找不到比Momento 的 AWS re: Invent 2023 社区派对主题更好的短语 -
相信无服务器!
是的,相信无服务器,并学会放手!