学习成为数据科学领袖
原文:
towardsdatascience.com/learn-to-be-a-data-science-leader-5394425dd097
学习无人教授的技能的 5 个资源
·发布于 Towards Data Science ·阅读时间 5 分钟·2023 年 1 月 15 日
–
Nick Fewings 在 Unsplash 上的照片
关于如何成为数据科学家,有大量的培训材料、课程和文章可供参考。一旦你开始在这一领域工作,随着经验和技能的积累,向高级数据科学家的过渡应该会自然发生。
对于许多数据科学家来说,高级职位之后的自然下一步是转到领导一个数据科学家团队的角色。这个角色与初级和高级职位非常不同,因为这通常意味着承担直接管理职责,帮助他人成长和发展以及管理项目。
最困难的是,你需要在保持足够技术水平以维持数据科学家职位的同时,还要处理所有这些事务。
最困难的是,你需要在保持足够技术水平以维持数据科学家职位的同时,还要处理所有这些事务。
我在一年多前正式过渡为首席数据科学家,所以现在我觉得有足够的资格提供一些建议。在接下来的几周里,我将写一系列关于数据科学领导力的文章。
这篇文章将介绍一些帮助你学习不一般教授的领导技能的资源。实际上,大多数新的数据科学领导者需要在工作中学习这些技能。我个人发现以下五个资源在我担任数据科学领导角色的头几个月里非常宝贵。
1. 导师制度
在哪里比通过已经成为有效领导者的人更好地学习成为一个有效的领导者呢?如果你正在进入领导角色或希望你的职业朝这个方向发展,我建议你找一位导师。
在哪里比通过已经成为有效领导者的人更好地学习成为一个有效的领导者呢?
我非常幸运地拥有了几位正式和非正式的导师,他们帮助我过渡到领导角色,并成为一名优秀的领导者和经理。一个导师应该能够分享他们自己的领导经验,并充当你可能遇到的想法和担忧的讨论对象。
一旦你进入领导角色,你会变得非常忙碌。你将负责项目、人员和决策,这有时可能会非常令人不堪重负。我发现拥有一个导师帮助我了解应该如何分配时间,以及如何最好地管理团队和项目。
2. 《经理人的路径》
《经理人的路径》由 Camille Fournier 编著,是一本针对技术行业领导者的书籍,但书中的许多内容同样适用于任何领导角色,包括数据科学领域。
本书涵盖了从技术负责人到管理一个团队、管理多个团队以及一直到总监级别角色的所有职业阶段的领导和管理章节。它详细描述了在每个阶段的期望以及如何在这些角色中脱颖而出。
我发现关于如何有效地进行一对一会议、管理项目和处理诸如业绩不佳等挑战性情况的实用建议非常宝贵,因此这本书一直放在我的桌子上,我不断参考。
它甚至涵盖了如何从自己的经理那里获得最大收益,即使你不想转向领导角色,这也是有用的。
3. 《高效能人士的七个习惯》
我几年前读过这本书,应用其中列出的原则确实在当时彻底改变了我的职业生涯。
当你进入领导角色时,你将面临许多相互竞争的要求。你可能需要在人员管理职责、项目管理职责和自己对团队的技术贡献之间分配时间。优先考虑并确保你将时间投入到正确的事情上将变得至关重要。
优先考虑并确保你将时间投入到正确的事情上将变得至关重要。
《高效能人士的七个习惯》涵盖了七个原则,当这些原则应用于你的职业生涯时,特别是在领导阶段,将帮助你成为一名优秀的经理,把时间花在正确的地方,并防止你过度疲惫。
这 7 个习惯如下,但我鼓励你阅读这本书并详细研究每一个。
-
主动出击
-
从终点开始思考
-
把重要的事情放在首位
-
思考双赢
-
首先寻求理解,然后再求被理解
-
学会协同
-
磨刀不误砍柴工
4. 极棒的数据领导力
极棒的数据领导力是一个 GitHub 仓库,包含了与数据领导力相关的精选文章、视频和博客帖子。这其中有大量数据科学特定的内容,而许多通用数据内容可以应用于任何数据相关的角色。
该列表被划分为几个主题领域,涵盖了领导力的大部分方面,包括招聘、战略、多样性与包容性、项目管理和影响力。这是一个我经常参考的资源,因为它包含了许多有用的信息。
5. 数据科学领导者播客
Domino Datalab 的数据科学领导者播客包含了一系列与数据科学领域领导者的访谈。涵盖了一些有用的话题,包括如何将团队提升为战略业务伙伴、数据科学价值链的样子以及如何将负责任的 AI 嵌入到你的项目中。
将数据科学嵌入许多企业仍然很困难,这使得数据科学领导者的角色在某些方面比在其他领域的领导更具挑战性。该播客涵盖了一些可以帮助新领导者了解其数据科学团队在组织中应如何定位的话题。
我个人发现本文涵盖的资源在从个体贡献者角色过渡到领导角色时非常宝贵。这种过渡可能很困难,因为通常你直到进入角色后才会学习领导技能,同时在试图掌握新技能的过程中,还需要平衡许多竞争需求。
如果你是一名数据科学家,考虑未来转型为领导角色,我强烈建议你现在查看一些这些资源。特别是《高效能人士的 7 个习惯》这本书,我无法推荐更多,因为其原则在任何职业阶段,甚至在你的人生中应用,都几乎肯定会产生变革性的效果。
作为快速回顾,这里是上述资源的提醒,以及它们将帮助你解决的领导力方面。
-
导师指导: 很适合向已经担任领导角色的人学习,他们可以给你提供你从书本中无法学到的见解。
-
管理者的路径: 对你在不同领导层级上会遇到的新任务提供了很好的实用建议。
-
高效能人士的 7 个习惯: 这将帮助你了解如何在众多竞争需求中优先考虑正确的事项,如何有效沟通并避免职业倦怠。
-
极棒的数据领导力: 综合整理的有用文章列表,涵盖了领导力的大部分方面。
-
数据科学领袖播客: 非常适合学习更广泛的与业务相关的策略,以领导数据科学团队。
感谢阅读!
学会“遗忘”机器
一种基于数据的方法来进行生成语言模型的机器遗忘
·
关注 发表在 Towards Data Science ·7 分钟阅读·2023 年 11 月 23 日
–
图像生成自 DALLE 3
在当今的科技领域中,几乎很难找到一个没有听说过机器学习的人。在过去的十年里,研究领域如此流行,以至于即使是行业之外的人也熟悉诸如人工智能(AI)、神经网络(NNs)和机器学习(ML)等术语。
然而,谈到机器遗忘时,似乎法律行业比科技社区听到的更多。最近大型语言模型(LLMs)的迅猛发展,在快速变化的 IT 世界中感觉像是十年,尽管实际上只有 1-2 年,揭示了数百个与 AI 发展相关的未解决的伦理和法律问题。小说家起诉 OpenAI 未经同意使用他们的文本来训练 GPT 模型。Twitter 上充满了艺术家的批评评论,他们认为他们的作品被用于侵犯版权法。遵守“被遗忘权”变得极其困难。
与 AI 对齐类似,机器遗忘似乎是一个被忽视的领域,因为现有的开源解决方案有限。我相信应该鼓励和推广机器遗忘的探索,特别是考虑到目前有关 AI 使用的法律和伦理规范尚不完善,数据保护机制严重缺失。在本文中,我想提出一些对生成语言模型早期应用遗忘技术的实际改进建议。
机器遗忘
“机器遗忘”或“机器遗忘”一词的意思正如其字面意思所示:它包括旨在从机器学习模型的“知识存储”中删除请求信息的技术。然而,当你需要考虑实际方法以在时间、计算资源和模型在“未遗忘”数据上的性能方面高效实现这一点时,这远非直观。一个明显的解决方案是使用初始数据集从头开始重新训练模型,同时排除“遗忘集”——但对于深度神经网络的遗忘来说,这将是一个极其不切实际的方法。
“机器遗忘框架”来自于“机器学习调查”
机器遗忘领域的核心研究成果被简洁地汇编在“机器遗忘调查”中。另一篇涵盖基础知识并提供易于理解解释的文章是“机器遗忘:遗忘的责任”。虽然我个人推荐这些资源,但你可以找到大量其他优质的研究材料。然而,在实际应用方面,仍有许多工作要做。
一个有前景的举措,可能将该领域从理论探索转向实际应用,是NeurIPS 2023 机器遗忘挑战赛。在这里,参与者竞争以创建一个用于 ResNet18 卷积神经网络的遗忘算法。
生成语言模型的机器遗忘
考虑到生成语言模型的广泛可访问性和对大多数互联网用户的推广,迫切需要遗忘机制。最早成功的技术之一不久前在开源中发布;你可以在罗宁·埃尔丹和马克·鲁西诺维奇的“谁是哈利·波特?LLM 中的近似遗忘”中找到详细信息。
使用StableDiffusion生成的图像
作者们对 Meta 在今年夏天发布的Llama 2 7b 聊天模型采用了一种数据增强方法进行机器遗忘。选择的遗忘目标,也称为“遗忘集”,是哈利·波特系列(真是聪明,这些麻瓜!),这是机器遗忘的一个完美示例,因为它可能涉及版权法的违反。他们展示了只需一小时的 GPU 微调,得到的模型就无法回忆起大多数与哈利·波特相关的内容,同时其在常见基准上的表现几乎没有受到影响。
方法概述
该方法的主要目标是让 Llama 2 7b 忘记从定义的遗忘集中的实体之间的联系(“哈利”<是朋友>“赫敏”),通过给模型提供合理的通用替代(“哈利”<是朋友> “莎莉”)。为了将这些替代作为微调数据集中的目标标签,在生成目标时,“待遗忘领域”中的特殊术语应受到高度惩罚。这种惩罚可以通过将方程(1)中由强化模型在原始输入——哈利·波特书籍——上生成的 logits 与基线模型在原始输入的通用翻译上生成的 logits 相结合来实现。
“谁是哈利·波特?LLM 中的近似遗忘”中的方程(1)
增强模型是进一步微调于哈利·波特小说的 Llama 2 7b。基线模型是未经微调的 Llama 2 7b。为了使基线模型的输出分布偏离哈利·波特主题,作者将原始输入中的特有术语替换为通用术语,以便模型根据与哈利·波特系列无关的上下文生成下一个词。为了自动化这种替换,作者引入了一个锚定术语字典——特定于“哈利·波特”的术语——映射到通用翻译上。该字典由GPT-4完全收集。
{‘Anchor Terms’: ‘通用翻译’}来自“谁是哈利·波特?LLMs 中的近似遗忘”
结果的微调数据集由来自哈利·波特书籍的标记化文本块组成,与目标标签一一对应,这些目标标签是对应于方程(1)中v_generic的最大条目的标记。
来自“谁是哈利·波特?LLMs 中的近似遗忘”的微调数据集的一部分
总结来说,作者描述了遗忘过程中的四个步骤:
来自“谁是哈利·波特?LLMs 中的近似遗忘”的机器遗忘算法
利用该方法:关键挑战
数据增强方法的结果很有前景,鼓励在类似任务中进一步应用。然而,作者在几个应用阶段留有改进的空间。
对 GPT-4 现有知识的依赖: 该算法在一定程度上依赖 GPT-4 对哈利·波特系列的先前理解来生成通用翻译。虽然模型预计对哈利·波特领域有广泛的知识,但系列粉丝的重新评估可能提供宝贵的见解。
特有术语的挑战: 惩罚与系列相关的所有独特术语是一个问题。例如,将每个‘Harry’替换为像‘John’这样的常见名字,会扰乱模型对自然语言的理解,导致句子变成,“Harry 走向他,说,‘嗨,我的名字是John’。”为解决这个问题,作者采用了以下策略:
-
排除重复的锚定词实例对损失函数的贡献,超出其初始出现的影响。
-
降低与之前出现过的术语翻译相关的 logits 的可能性。
然而,这种策略也会影响模型的通用语言理解。例如,一个适用于微调数据集的合理替代方案是,“Harry 走向他,说,‘嗨,我的名字是Harold’。”
评估技术: 团队利用 GPT-4 进行了初步评估,评估内容包括 300 个《哈利·波特》提示的完成情况,以及对完成内容的进一步分析。然而,他们承认其准确性存在局限性,因此选择了对结果进行人工检查,以便在最终训练中进行更彻底的验证。作者没有提供如何进行这种人工检查的详细信息。
克服挑战
解决关键挑战的更有效方法是结合人类洞察力和大型语言模型(LLMs)的混合方法。
为了利用人类直觉和大型语言模型的集体优势,我设计了三个众包项目接口,方便使用 LLM 和人群进行协作标注。每个为人工标注设计的接口都针对上面列出的挑战量身定制。
对 GPT-4 现有知识的依赖:
图片由作者提供
使用*命名实体识别(NER)*来纠正 GPT-4 对锚定术语词典的 NER 选择。作为输入,提供文本和 GPT-4 的术语选择(你可以要求模型直接返回文本中的位置),并指示人群纠正和补充选定的实体。
处理特殊术语的挑战:
图片由作者提供
借助基线模型,检查语言正确性提示,通过基线模型对原始输入的通用翻译进行完成。所有基线模型对答案不确定的示例(输出标记的概率低于你选择的经验阈值)应发送到显示在图片中的众包项目。
评估技术:
图片由作者提供
可以按照上述图片所示的方式设计 GPT-4 的评估的人工检查。
结论
作者指出,与虚构的《哈利·波特》世界不同,非虚构领域可能没有如此丰富的独特术语,这可能使基于锚定术语的数据增强方法不适用。然而,如果本文中概述的数据增强技术适用于你的项目,考虑整合建议的改进并引入你自己的调整。让我们共同推进机器去学习领域的发展!
前向传递中的学习与推理:新框架
学习与推理统一为一个连续、异步和并行的过程
·
关注 发表在 Towards Data Science ·18 分钟阅读·2023 年 1 月 20 日
–
在三层网络上进行前向传递中的学习和推理。 推理和学习同时进行。学习重用与推理相同的前向路径。综合来看,这些信号传播特性将学习和推理统一为一个连续、异步和并行的过程——从而解除学习的限制。这与之前关于学习的观点大相径庭,尤其是在监督设置和反向传播下。
在这篇文章中,我介绍了一个前向传播的推理和学习框架,称为信号传播框架。这是一个只使用前向传播来学习任何类型数据和任何类型网络的框架。我展示了它在离散网络、连续网络和尖峰网络中都能良好地工作,而无需修改网络架构。换句话说,用于推理的网络版本与用于学习的网络版本相同。相比之下,反向传播和以前的工作对于训练版本的网络有额外的结构和算法元素,这些被称为学习约束。
信号传播是一种约束最少的学习方法,且具有比反向传播以前的替代方法更好的性能、效率和兼容性。它也比反向传播具有更好的效率和兼容性。这个框架在arxiv.org/abs/2204.01723
(2022 年)和ieeexplore.ieee.org/document/10027559
中介绍。前向学习的起源在我的工作arxiv.org/abs/1808.03357
(2018 年)。
我开发了一个库来实现对任何模型的前向传播学习。该库的快速开始指南可以帮助你在现有模型上实现这个库。还有cifar-10的示例实验,也作为教程使用。
[## GitHub - amassivek/signalpropagation: 前向传播学习与推理库,适用于神经网络…
信号传播:一个统一学习和推理的前向传播框架,一个用于训练的 Python 包…
这篇文章是一个关于前向传播学习的简明教程。在教程结束时,你将理解这个概念,并知道如何在你的工作中应用这种学习方式。教程提供了适合初学者的解释,以及适合专家的详细步骤。
目录
-
引言
1.1. 以前的学习方法
1.2. 一种新的学习框架
1.3. 学习约束的问题
-
学习的两个要素
-
前向传播中的学习
3.1. 学习方法
3.2. 学习步骤
3.3. 完整程序概述
3.4. 尖峰网络
-
前向学习的工作
4.1 错误前向传播
4.2. 前向传播
-
阅读材料
-
附录:信用分配阅读
6.1. 空间信用分配
6.2. 时间信用分配
1. 引言
1.1. 以前的学习方法
学习是使人工神经网络工作的活跃成分。反向传播被认为是表现最佳的学习算法,为人工神经网络的成功提供了动力。然而,它是一个高度约束的学习算法。这些约束被视为其高性能所必需的。普遍接受的观点是,减少这些约束中的任何一个都会降低性能。然而,由于这些相同的约束,反向传播在效率和兼容性方面存在问题。它在时间、内存和能量方面效率低下,与生物学习模型、神经形态芯片和边缘设备的兼容性低。因此,人们可能会考虑通过减少不同的约束子集来解决这个问题,以提高效率和兼容性,同时尽量不降低性能。
例如,训练网络的反向传播有两个约束: (1) 反馈权重与前馈权重对称;以及 (2) 每个神经元都需要这些反馈权重。推理网络从不使用反馈权重,这就是我们将它们称为学习约束的原因。这些约束的子集包括:不添加任何反馈权重、只在五层网络中的一两层添加反馈权重、反馈权重不对称,或这些的任意组合。这意味着约束可以部分或完全地添加或移除,从而形成约束子集进行减少。可以不断尝试减少这些约束的不同子集,以提高效率和兼容性,并希望不会对性能产生重大影响。
以前的反向传播替代学习算法曾尝试放松约束,但没有成功。它们减少学习中的约束子集以提高效率和兼容性。它们保留其他约束,期望保持与保留所有约束(即反向传播)相似的性能。因此,这意味着学习约束存在一个光谱,从高度约束的反向传播到没有约束的信号传播,即我在这里介绍的框架。
1.2. 一种新的学习框架
现在,我展示了与以往工作的不同。这里展示的结果支持最少约束的学习方法——信号传播——在性能、效率和兼容性上优于反向传播的替代方法,这些替代方法选择性地减少学习的约束。这包括一些成熟且有重大影响的方法,如随机反馈对齐、直接反馈对齐和局部学习(所有这些方法都不依赖反向传播)。这是对从神经科学到计算机科学等领域学习的迷人洞察。它惠及生物学习(例如在大脑中)到人工学习(例如在神经网络、硬件、神经形态芯片中)的领域。
信号传播也显著影响了学习算法未来研究的方向,其中反向传播是比较的标准。在学习约束的范围中,与高度约束的反向传播相反,信号传播是最少约束的方法,用于比较和作为开发学习算法的起点。仅有反向传播作为最佳比较,学习算法没有起始点,只有最终目标。现在,我引入信号传播作为学习算法评估其效率、兼容性和性能的新基准。
1.3. 学习约束的问题
反向传播下的约束是什么?
为什么这是个问题?
反向传播下的学习约束与大脑中的学习难以调和。下面,我提供了主要的约束:
-
在网络中完成完整的前向传播后,才可以顺序地在反向传播中提供反馈。
-
训练网络需要为每个神经元添加全面的反馈连接。
-
学习和推理有两种不同的计算。换句话说,反馈算法是一种与前馈活动分开的计算类型。
-
反馈权重需要与前馈权重对称。
这些约束还妨碍了在硬件上高效实施学习算法,原因如下:
-
权重对称性与非双向的基本计算单元不兼容。
-
非本地权重和误差信息的传输需要特殊的通信通道。
这些学习约束禁止在学习过程中进行计算并行化,并增加了内存和计算量,原因如下:
-
前向传播需要在后向传播开始之前完成(时间,顺序)
-
隐藏层的激活需要在前向传播期间存储,以便于后向传播(内存)
-
反向传播需要特殊的反馈连接(结构)
-
参数在前向传播的反向顺序中更新(时间,同步)
2. 学习的两个要素
神经网络中的学习是如何进行的?
简短回答:空间和时间信用分配
数据主要有两种形式:单个输入和多个连接的输入,这些输入按顺序或时间上连接。狗的图像是一个单个输入,因为网络仅基于该图像进行预测。在这种情况下,网络被提供一个单一图像以预测该图像是狗还是海龟。
一只海龟行走的视频是多个连接的输入,因为视频由多个图像组成,网络在看到所有这些图像后进行预测。在这种情况下,网络被提供多个图像以预测海龟是行走还是隐藏。
反向传播 (BP) 用于单个输入;时间反向传播 (BPT) 用于多个连接的输入。
BP 提供的学习包括:
- 每个神经元(空间信用分配)
BPT 提供的学习包括:
-
每个神经元(空间信用分配)
-
多个连接的输入(时间信用分配)
为每个神经元提供学习被称为空间信用分配问题。空间信用分配指的是网络中神经元的布置,例如组织成神经元层。例如,在一个五层网络中,反向传播学习信号从第五层依次传递到第一层神经元。在第三部分中,我将展示信号传播学习信号是如何从第一层传递到第五层的,与推断过程相同。
为多个连接的输入提供学习被称为时间信用分配问题。时间信用分配指的是在多个连接输入中移动。例如,视频中的每一帧图像都被输入到网络中,产生来自相同神经元的新响应。每个神经元的响应是特定于每张图像/输入的。因此,反向传播学习信号在这些神经元响应中传递,从视频中最后一张图像的神经元响应开始到第一张图像的神经元响应。在第三部分中,会清楚地看到信号传播学习信号从第一张图像的神经元响应传递到最后一张图像的神经元响应,与推断过程相同。
请注意,时间信用分配的内在问题是空间信用分配。时间信用分配将学习信号通过视频中每张图像。对于每张图像,空间信用分配将学习信号传递到每个神经元。信号传播优雅地通过解决内在问题来解决外在问题——前向传播,通过构建推断网络,遍历两个问题。
BP 进行空间信用分配。BPT 将 BP 扩展到同时进行空间和时间信用分配。(有关空间和时间信用分配的完整阅读,请参见第六部分。)
3. 前向传播中的学习
信号传播框架 (SP)
我在这里介绍的是一种前向传递学习和推理的框架,称为信号传播(SP)。这是一个令人满意的解决方案,用于时间和空间的信用分配。SP 是一种约束最少的学习方法,其性能、效率和兼容性优于以前的反向传播替代方案。它还具有比反向传播更好的效率和兼容性。SP 提供了一个合理的效率和兼容性性能折中。这特别吸引人,因为它兼容基于目标的深度学习(例如监督学习和强化学习),适用于新硬件和长期存在的生物模型,而以前的工作则不然。(一般来说,反向传播是表现最好的算法。)
SP 在学习发生时没有约束,包括:
-
仅前向传递,没有反向传递
-
无反馈连接或对称权重
-
只有一种用于学习和推理的计算类型。
-
在前向传递过程中随输入传播的学习信号
-
在神经元/层被前向传递到达后,更新参数
一个有趣的见解是,SP 为大脑中没有错误反馈连接的神经元如何接收全局学习信号提供了解释。
因此,信号传播是:
-
与大脑和硬件中的学习模型兼容。
-
学习更高效,时间和内存消耗较少,无需额外结构。
-
一种低复杂度的学习算法。
3.1. 如何在前向传递中学习?
信号传播将目标视为额外的输入(见下图)。通过这种方法,SP 将目标前向传递通过网络,就像它是一个输入一样。
将目标视为输入。来自 Upsplash 的动物图像。
SP 在网络中向前移动(见下图),将目标和输入越来越靠近,从第一层(左上)一直到最后一层(右下)。注意到在最后一步/层时,狗的图像接近其目标[1,0,0],而青蛙的图像接近其目标[0,1,0]。然而,狗的图像和目标与青蛙的图像和目标之间仍有较大距离。这一操作发生在每层神经元的表示空间中。例如,第 1 层的神经元接收狗的图像(输入 x)和狗的标签(目标 c),分别输出激活 h_1_dog 和 t_1_dog。青蛙的情况也一样,产生 h_1_frog 和 t_1_frog。在这些神经元的激活空间中,SP 训练网络使输入及其目标更加接近,同时与其他输入及其相应目标保持距离。
层层推进,将目标及其相应输入逐渐靠近,但与其他输入和目标保持距离。来自 Upsplash 的动物图像。
3.2. 前向学习的步骤
以下是一个示例三层网络的整体图。每层都有自己的损失函数,用于更新网络中的权重。因此,SP 执行损失函数并在目标和标签到达某层时立即更新权重。由于 SP 将目标和输入一起(交替)输入,层/神经元权重会立即更新。对于空间信用分配,SP 在输入从第一层到达最后一层之前更新权重。对于时间信用分配,SP 为每个时间步长的多个连接输入(例如视频中的图像)提供学习信号,而无需等待最后一个输入被送入网络。
这是一个三层网络。学习和推理的前向传播将分三步进行。每层有自己的损失,共有三种损失。输入是 x,目标是 c,二者通过网络的前端输入。
在前向传播中,学习和推理的整体算法。推理和学习阶段并行运行,每层的权重会立即更新。注:对于图示网络(左),N = 3,即层数。为了清晰起见,省略了偏置(b 和 d)。损失 L(例如梯度、赫布式)和优化器(例如 SGD、Momentum、ADAM)有很多选择。输出函数 output()
,y,在下面的步骤 4 中详细说明。
接下来,我们将逐步、逐层进行学习和推理(即产生答案/预测),以前向传播的方式进行。请注意,在下面的指南中,目标和输入被批量拼接到前向传播中,便于跟随。
步骤 1) 层 1
步骤 2) 层 2
步骤 3) 层 3
步骤 4) 预测
在输出层,有三种选择来输出预测结果。第一种和第二种选项提供了更多的灵活性,并自然地从使用前向传播的训练过程中跟随。第一种选项是取一个 h_3 作为一个类别,并与每个 t_3 进行比较。例如,SP 输入一张狗的图像并得到 h_3_dog,然后输入所有类别的标签并得到 t_3_i = { t_3_dog, t_3_frog 和 t_3_horse},最后它将 h_3_dog 与每个 t_3_i 进行比较;最接近的 t_3_i 即为正确的类别。
第二个选项是第一个选项的自适应版本。它是自适应的,因为 SP 不再将 h_3_dog 与每个 t_3_i 进行比较,而是寻找最近的 t_3_i 子集。例如,我们维护一个树结构,其中 t_3_frog 在树中比 t_3_horse 更接近 t_3_dog。因此,我们首先将 h_3_dog 与 t_3_frog 进行比较,然后与 t_3_dog 进行比较,并停止。我们不会与 t_3_horse 进行比较,因为它距离太远,不在我们最近的 t_3_i 子集中。
第三个选项:经典且直观的选择是训练一个预测输出层。这个选项在回归和生成任务中也更直接。例如,一个分类层,每个类别有一个输出。因此,第 3 层将是一个分类层。注意,在推断过程中 t_3 不再使用。此外,注意到 t_3_i 等同于一个分类层。要看到这一点,只需将 t_3_i 连接在一起,形成一个分类(预测)层的权重矩阵,与 h_3(例如 h_3_dog,h_3_horse,…)一起使用。这意味着第三个选项是第一个选项的特例,并且可以是第二个选项的特例。
3.3. 完整过程概述
3.4. 尖峰网络
尖峰神经网络类似于生物神经网络。它们被用于大脑学习模型中,也用于神经形态芯片。尖峰神经网络在学习中存在两个问题。首先,反向传播下的学习约束与大脑学习难以协调,这阻碍了在硬件上高效实现学习算法(如上所述)。其次,训练尖峰网络会导致死亡神经元问题(见下文)。
下面提供了一个参考图。这些网络中的神经元通过激活(尖峰)来响应输入,以将信息传递给另一个神经元,或者什么都不做(左上图)。通常,这些网络存在一个问题,即神经元从不激活,这意味着它们从不尖峰(左下图)。因此,无论输入是什么,神经元的响应始终是无反应。这被称为死亡神经元问题。
解决这个问题的最流行方法是使用替代函数来替代神经元的脉冲行为。网络仅在学习期间使用替代品,即当学习信号发送到神经元时。替代函数(蓝色)即使在神经元不脉冲时也为神经元提供值(右上图)。因此,即使神经元没有脉冲向另一个神经元传递信息,它仍能学习(右下图)。这有助于防止神经元的“死亡”。然而,替代品在硬件学习中,如神经形态芯片中难以实现。此外,替代品不适合大脑中的学习模型。
信号传播提供了两种与大脑和硬件学习模型兼容的解决方案。
以下是学习信号(标记为红色)通过一个脉冲神经元(标记为 S)、穿过电压或膜电位(U),以更新权重(W)的可视化。左侧是带有“死神经元”问题的反向传播。左二是带有替代函数(f)的反向传播。反向传播的学习信号是全局的(L_G),来自网络的最后一层;虚线框表示上层神经元/层。
右侧的其他图像展示了信号传播(SP)提供的两种解决方案。首先,SP 也可以使用替代品,但学习信号不经过脉冲方程(S)。相反,学习信号在脉冲方程(S)之前,直接附加到替代函数(f)上。因此,SP 与大脑中的学习更兼容,例如在生物神经元的多室模型中。其次,SP 可以仅使用电压或膜电位(U)进行学习。在这种情况下,学习信号直接附加到 U 上。这不需要替代品或对神经元的更改。因此,SP 与硬件中的学习兼容。
4. 前向学习的研究工作
关于前向学习的工作列表 - 使用前向传播进行学习。工作按日期排序。
一个社区维护的仓库网页用于记录前向学习方法,位于 amassivek.github.io/sigprop
。代码库可在 github.com/amassivek/signalpropagation
获取。
4.1. 误差前向传播算法(2018)
误差前向传播算法是信号传播框架在前向传播中的实现(如下图)。在信号传播下,S 是上下文 c 的变换,对于监督学习来说,c 是目标。
在误差前向传播中,S 是从输出到网络前端的误差投影,如下图所示。
错误前向传播算法。来自 MNIST 数据集 的图像 7。
错误前向传播:重用前馈连接在深度学习中传播错误
4.2. 前向前向算法 (2022)
前向前向算法是信号传播框架在前向传递中的实现(见下图)。在信号传播下,S 是上下文 c 的变换,对于监督学习来说,这是目标。
在前向前向中,S 是目标 c 和输入 x 的连接,如下图所示。
前向前向算法。来自 MNIST 数据集 的图像 7。
前向前向算法
www.cs.toronto.edu/~hinton/FFA13.pdf
5. 阅读材料
信号传播:前向传递中的学习与推理框架
arxiv.org/abs/2204.01723
(2022)
前向前向算法
www.cs.toronto.edu/~hinton/FFA13.pdf
(2022)
错误前向传播:重用前馈连接在深度学习中传播错误
arxiv.org/abs/1808.03357
(2018)
5.1 其他材料
一份关于空间和时间信贷分配的良好指南。我参考了它来帮助编写“附录:信贷分配阅读”。
使用深度学习的经验训练尖峰神经网络
arxiv.org/abs/2109.12894
(2021)
社区维护了一个代码库网页来记录前向学习方法,位于 amassivek.github.io/sigprop
。
代码库可以在 github.com/amassivek/signalpropagation
上获取。
感谢:Alexandra Marmarinos 的编辑工作和指导。
6. 附录:信贷分配阅读
6.1. 空间信贷分配
空间信贷分配的问题是:学习信号如何到达每一个神经元?
在下图的左侧,是一个三层网络。一般来说,学习分为两个阶段:推理阶段和学习阶段。在第一个阶段,称为推理阶段,输入从第一层传递到最后一层。由于输入通过网络前向传递,因此推理阶段发生在网络的“前向传递”过程中。在第二阶段,称为学习阶段,学习信号(标记为红色)需要到达网络中的每一个神经元。
不同的学习算法在学习阶段有不同的解决方案。在反向传播中,学习信号通过网络向后传播,因此学习阶段发生在通过网络的“反向传递”中。正如我们将在信号传播中看到的,学习也可以在前向传递中进行。
广泛来说,学习阶段有两种方法。第一种方法计算全局学习信号(左中图),然后将此学习信号发送到每个神经元。第二种方法在每个神经元(或层)计算局部学习信号(右图)。第一种方法的问题在于需要以精确的方式协调将此信号发送到每个神经元。这在时间、内存和兼容性上都很昂贵。第二种方法没有遇到这个问题,但性能较差。
6.2. 时间信用分配
信贷分配的时间局部性问题是:全局学习信号如何到达多个连接的输入(即每个时间步)?
单张图像只需要学习信号到达每个神经元。然而,视频是一系列连接的图像。因此,学习信号需要通过多个连接的输入(即时间)进行传播,从视频中的最后一张图像一直到视频中的第一张图像。这一概念适用于任何序列或时间序列数据。那么,全局学习信号如何到达每个时间步?有两种流行的方法来回答这个问题:时间上的反向传播和前向模式微分。
6.2.1. 时间上的反向传播(BPT)
对上述问题的主要回答如下,并分为两个阶段。首先,将构成视频的所有图像逐一输入网络。这是推断阶段,在这个阶段,多个连接的输入通过网络向前传递(前向传递)。其次,从最后一张图像开始向回传播学习信号直到第一张图像。这是学习阶段,在这个阶段,学习信号在多个连接的输入(即时间)中向后传播;因此,称为时间上的反向传播。
第一步:推断
在下图中,BPT 将构成视频的每一张图像 X[i](例如乌龟走路的图像)输入网络。BPT 从第 1 张图像 X[0](第一张图像的左下角)开始,这是时间步长 1(时间显示在图的顶部)。接着,BPT 输入图像 X[1],这是时间步长 2。最后,我们以时间步长 3 的最后一张图像 X[2]结束——这个演示用于非常短的视频或 GIF。每次 BPT 将图像输入网络时,请注意网络中的中间层将每张图像通过时间连接到下一张图像。
第二步:通过时间进行学习
BPT 将学习信号(用红色标记)从图像(时间)中向后传播,形成了乌龟行走的视频。学习信号是从损失函数(图中的右上方)形成的。它的传播方向与我们输入图像 X[i]的方向相反。首先计算时间 3 的图像 X[2]的梯度/更新,然后是时间 2 的图像 X[1],最后是时间 1 的图像 X[0]。这就是为什么它被称为时间上的反向传播。再次注意,网络中的中间层将来自最后一张图像 X[2]的学习信号连接到第一张图像 X[0]。
6.2.2. 正向模式微分(FMD)
在 FMD 下,推断(第 1 步)和学习(第 2 步)阶段的行为是类似的。因此,FMD 将第 1 步(推断)和第 2 步(学习)一起进行(交替)。怎么做?在第 2 步中,FMD 将学习信号向前传播通过图像(时间),这与第 1 步中的推断过程非常相似。因此,学习信号不再需要从视频中的最后一张图像 X[3]返回到第一张图像 X[0]。结果是:FMD 的学习信号从 X[0]开始,而不需要等待 X[3]。
为什么选择 FMD 而不是 BPT?上面我讨论了在反向传播(backpropagation)下学习的限制以及它在效率和兼容性方面存在的问题。FMD 尝试提高效率。特别是,BPT 会在学习之前将所有构成视频的图像输入到网络中。而 FMD 则不会,因此在时间上比 BPT 更高效。然而,FMD 在成本上明显高于 BPT,特别是在内存和计算方面。注意,FMD 解决了时间上的问题。然而,它并没有解决反向传播下空间信用分配的学习限制,这在 FMD 中也存在。
除非另有说明,否则所有图片均由作者提供。
学习机器学习 | Maarten Grootendorst: BERTopic、数据科学、心理学
《学习机器学习》第一期的内容是对 BERTopic 的幕后 mastermind Maarten Grootendorst 的深刻采访。
·
关注 发表在 Towards Data Science ·43 min read·2023 年 2 月 13 日
–
欢迎来到“学习机器学习”,这是一个探索机器学习令人兴奋世界的采访系列,重点关注的不仅仅是算法和数据,还有来自专家的职业建议和生活经验。
人工智能正在改变世界,机器学习推动着这场变革。在每一 集 中,来自行业和学术界的领先从业者分享他们的知识、经验和洞见,谈论在这一快速发展的领域取得成功所需的条件。
首集 以 马尔滕·格罗滕多斯特 为特色,他是 BERTopic 和 KeyBERT 的创建者,也是 在 Towards Data Science 上发表的众多文章 的作者。他分享了对开源项目、心理学在机器学习和软件开发中的作用以及自然语言处理未来的看法。该访谈现已在所有 播客平台 上提供。
收获
马尔滕·格罗滕多斯特是许多强大 Python 库的创建者,包括 KeyBERT 和 BERTopic。他最初从心理学开始他的职业生涯,获得了临床心理学和组织心理学的硕士学位后,转向了数据科学。他通过开发开源库和撰写深刻的数据科学文章迅速在该领域产生了影响。他最常用的库 BERTopic 是一个主题建模框架,它是一种自动识别文档集中的主题的方法。它可以用于探索性数据分析和跟踪趋势随时间的变化。他还讨论了在创建 BERTopic 时面临的挑战,以及最新版本的目标和特点。
马尔滕讨论了类似 ChatGPT 的 approaches 的含义,这些 approaches 常被误认为是人工通用智能(AGI),以及它们在行业中的接受情况。他分享了对这些拥有数十亿参数的大型语言模型如何融入 AGI 讨论的好奇,并认为即将到来的一年将会有重大变化。
马尔滕的建议包括:
-
在深入学习更复杂的算法之前,专注于理解和掌握编码和机器学习的基础知识。
-
建立坚实的基础,因为这将使未来的成长更加顺利和容易。
-
理解模型的评估。在主题建模中,“真相”往往取决于观察者的视角。
-
强调在尝试解决问题之前,真正理解问题的重要性,引用他在癌症研究中的经验,其中一位同事花了数周时间来理解问题,然后才开始编码。
-
你不需要一次性掌握所有的知识。找到健康生活和你对机器学习的热情之间的平衡是重要的。
现在就观看视频,或在 Spotify 或 Apple Podcasts上收听!
内容表
欢迎
收获
完整采访
— 背景
— BERTopic 深入探讨
— 从机器学习中学习
视频采访
Spotify 音频
资源
— Maarten Grootendorst
— 从机器学习中学习联系
视频内容
完整采访
背景
Seth: 欢迎。很荣幸有 Maarten Grootendorst 在这里。他是许多有用的 Python 库的创作者,包括KeyBERT和BERTopic。我一直很欣赏您的工作,并且非常喜欢使用您的库。欢迎!
Maarten: 太棒了,谢谢你邀请我。我很乐意在这里。
Seth: 所以,为了开始讨论,您能介绍一下您的职业背景,以及您如何涉足数据科学领域吗?
Maarten: 当然。我的背景有点不寻常。我最初是一名心理学家。我有组织心理学和临床心理学的硕士学位。这些领域的研究很有趣,也有很多有趣的工作可以做。但我一直觉得缺少了点什么。
一些,我不会说是确切的,但是更偏向硬科学而不是我当时所从事的软科学。所以我开始探索更多统计学方面的东西,因为这是我们在心理学中经常做的事情,最终我开始学习编程和机器学习。
然后我想到,好吧,在荷兰学习相对便宜,所以我决定攻读数据科学硕士学位。那里我真正发现了我的激情,这是我可以找到真正结合了心理学和技术方面的地方。因为在几乎所有情况下,数据科学中我们所做的大部分工作都涉及某种人类方面的因素。
所以我真的可以利用我的心理学背景。然后之后,我开发了一些包,如 KeyBERT 和 BERTopic,写了一些东西之类的。
Seth: 对,是的,所有那些令人惊叹的有用软件包。所以,你的心理学背景,你想再深入一点吗?
Maarten: 是的,当然。我开始学习社会心理学的学士学位,这是相当广泛的,对吗?包含了许多不同的学科。而且我的母亲实际上是一名组织心理学家,所以我有点跟随她的脚步。不,但这是我熟悉的东西,也是我觉得有趣的东西。
我发现组织心理学非常有趣。它涉及到工作场所的人类行为,以及这些行为如何与生活中的重大方面——工作——相互关联,对吧?但那时候我真的还不够成熟,无法深入这个领域并做必要的工作。
我想,好的,让我在进入职场之前进一步探索和发展自己。因此,我探索了临床心理学,在那里我可以更多地专注于帮助那些有焦虑症、抑郁症或创伤后应激障碍等问题的人。
然后,当然你从中学到很多有趣的东西,但我总觉得有些东西缺失。不是说这些领域不有趣,但你知道,像我这样的人总是试图找到自己的人生目标,找出是什么让自己快乐。虽然这很不错,也很有趣,但我很确定它不会让我在接下来的 30、40 年里感到快乐。
所以你探索,最终我发现了机器学习。
Seth: 当你第一次发现机器学习时,是什么真正吸引了你?
Maarten: 有趣的是,因为我缺乏一些技术方面的知识,这也是吸引我进入机器学习的原因之一,因为它确实是一个新领域。
这些算法背后有很多技术基础,但你使用和应用它们的方式仍然需要你在许多情况下具备某种商业感知。一种视角,即我们什么时候使用它?这真的有必要吗?我们需要一个非常复杂的算法,还是可以使用相对简单的东西?
那个难题真的很有趣,因为它涉及很多小方面,远不止是优化这个算法。
那个难题,对我来说仍然是个谜。这个难题真的很有趣,因为它涉及很多小方面,远不止是优化这个算法。正是这种吸引力让我对它产生了兴趣,并且我可以发挥我认为的许多技能。
Seth: 当你从心理学转向更技术性的领域时,你觉得自己首先需要学习哪些东西?
Maarten: 作为心理学家,你并不是最具技术性的人,对吧?你专注于这种互动、人类行为和观察技巧。
里面有一些统计数据,但最初的关键是基础。所以,编程当然很重要,你可以非常了解一个算法,但如果你不能清晰且准确地编写代码,那么一定会出现 bug 或问题。这一点真的很重要。
与其深入复杂的学习算法,不如从非常简单的回归开始,这实际上可能非常复杂,如果你深入研究其中的一些复杂性。因此,我专注于在进入下一步之前尽可能完美地理解这一点。
最好的学习方式确实是彻底理解和掌握基础知识。如果你把基础做得非常好,就像是直觉或自动完成的事情,进入下一步就会变得容易得多。这一直是我的重点。
Seth: 所以就是创建可以成为你未来工作基础的构建块。
Maarten: 是的,是的。那基础说得很好。基础越扎实,你在其上建立的东西就会越好。
BERTopic 深度解析
Seth: 完全正确。既然有了 BERTopic 的创造者,我想我们应该花些时间深入了解一下。如果你不介意的话,我让你来介绍一下。简单讲讲主题建模和它的强大之处。
Maarten: 是的,当然。所以 BERTopic 是一个主题建模框架,其中你实际上拥有,例如 10,000 个文档。这可以是任何东西,对吧?可以是某个产品的评论,可以是某个系统的票据,也可以是医院的多学科会诊记录和一些患者。基本上,你想知道的是:这些文档讲了什么?你可以做很多事情。你可以阅读所有 10,000 个文档并标记它们,这完全没问题。如果你有时间的话。
Seth: 花一点时间。
Maarten: 只需一点点,或者你可以自动完成。
这就是主题建模发挥作用的地方,因为顾名思义,它基本上是从这些文档集合中提取主题,并以帮助你理解这些文档内容的方式传达这些主题。它还可以帮助你做趋势分析,例如,如果你有 Twitter 消息,可以查看 Covid 在两年前和现在的讨论情况。
这是一种非常好的提取信息的方式,但因为它是一种自动化的方式,没有真实的标准,所以也很难进行评估。因此,这与我作为心理学家的特点非常契合,因为它允许大量的人类评估和对技术的解释。
你可以用它进行探索性数据分析,看看我的文档中有什么。但它也被广泛应用于社会政治科学中,我们观察过去几年发展起来的某些信息,并查看这些趋势如何发展和变化,针对不同的类别或目标等。
塞斯: 是的。我已经关注 BERTopic 一段时间了,我知道 0.13 版本最近刚刚发布。我想知道,最初的包的目标是什么?它在过去三年左右有什么变化?
马滕: 它开始时是作为创建一个流程的方式。好的。所以,聚类和尝试从中提取主题表示的流程已经存在了一段时间。但我想找到一种方法,以一种流程的方式来做,在你使用的步骤之间几乎没有假设。
图片 由 Maarten Grootendorst 提供
所以我们基本上是在将文档转换为数字,即数值,然后将其缩减到更小的维度。所以,你不再有 300 个数值,而是将其压缩为五个。我们将对这些文档进行聚类,并从这些聚类中提取主题表示,已经有很多流程可以做到这一点。
但你最初想到的主题是以一种方式来实现的,你可以说,好的,我对这个聚类算法不太满意,我要选择完全不同的东西。或者,我对这个降维算法不满意,我要选择不同的东西。
然后,重点主要放在最后一部分,即主题提取方式。我使用了一种修改版的 TF-IDF 度量,叫做cTF-IDF。因为我最初是这样想的,所以很容易开发出许多变体和扩展,通常会成为不同的包。
所以在主题建模中,你有LDA,这是一种经典的主题建模技术。是的。但如果你想使用某种变体,你必须安装不同的包。在许多情况下(当然不是所有情况),gensim已经实现了很多。但是,如果你想做层次主题建模或动态主题建模,我认为这些功能还没有实现,你需要为此安装不同的包。
我希望它变成一个一站式的主题建模工具,而不是简单地说,每个主题是最好的主题模型。实际上,它绝对不是。我是说,我们仍然需要遵循无免费午餐定理。但你基本上可以用它来做所有事情。
因为我专注于每个主题的最小假设管道。现在我们在进行主题建模——在线主题建模,基于类别,半监督,监督,以及其他一些方法。它将继续以这种方式发展。所以,现在它更专注于构建自己的主题模型类型的包。
还有一些事情即将出现,但到目前为止,过去几年已经有了一个发展轨迹。
Seth: 是的。我在行业里工作了几年,并做了主题建模。我可以说我很喜欢使用 BERTopic。这非常棒——只需这种抽象级别,你不必了解每一个细节,就可以获得如此出色的结果。
另外,正如你提到的模块化,你可以插拔不同的算法以获得不同的输出。所以,你之前提到了评估主题模型的问题。你能讨论一下为什么评估主题模型如此困难吗?
Maarten: 一般来说,你会有,比如说 1 万份文档,这些文档是某个人或一组人的推文。BERTopic 或任何主题建模技术在无监督的情况下(没有真实答案)从这些消息或文档中提取主题。
但谁来判断这些主题是否准确?那么准确性到底意味着什么?说这些消息中有一百个主题是否准确,还是说有十个主题更准确?这些主题的描述由一定数量的词表示,这些描述是否比其他算法更准确?
但谁来判断这些主题是否准确?那么准确性到底意味着什么?说这些消息中有一百个主题是否准确,还是说有十个主题更准确?这些主题的描述由一定数量的词表示,这些描述是否比其他算法更准确?
这也取决于你所处理的用例。有时候我们需要更抽象的主题,因为我们在寻找全球趋势,有时候我们在寻找非常具体的主题。在医学领域,我们经常寻找非常具体类型的疾病、背景或药物等。
所有这些不同类型的事物使得很难说,“这就是事实”。因为在这种情况下,事实往往确实在观察者的眼中。它是你的使用案例。你有一个特定的目标——你想用它做些什么。你想用它实现的目标会改变评估指标。
如果我们谈论一些技术细节,它可以是准确性。如果你有标签,它可以是一致性。也就是说,一个主题有多一致,但主题的一致性在于我认为一致和你认为一致之间的差异。因为 BERTopic 是一个聚类算法。我们可以说,好吧,我们将进行聚类,或者我们将评估聚类。
我们可以评估它在未见文档上的预测。但那将是一个有监督的任务。找出某事是否准确有很多不同的方法,因为这里的准确性定义如此困难,这就是为什么它是一种如此主观的建模方式。
Seth: 是的。我认为困难在于没有必然的地面真相,对吧?你不知道某个类别或某个集群应该属于什么。因此,很难说这个模型的准确性如何。
Maarten: 没错。地面真相可以被创建,但每次都应该根据使用案例从头开始创建,因为我可以为我的特定使用案例创建一个地面真相,但另一个使用案例的地面真相将完全不同,有时还需要一个完全不同的评估指标。
Seth: 你见过的一些最独特或最有趣的 BERTopic 使用案例是什么?
Maarten: 最独特的往往是那些试图做一些 BERTopic 不真的旨在做的事情的案例。很多情感分析的人想用 BERTopic 来做。
Seth: 这很棘手。
Maarten: 这很棘手。如果你采用一种半监督的方法,将其语义特性编码并提前计算,那么可以做到。但我实际上看到的是几个趋势分析。但变得越来越流行的是,最初我总认为主题建模在生产中不常用,对吧?
这是一种探索性的数据查看方式,但我看到越来越多的案例专注于尝试动态识别集群。例如,如果你有一个票务系统,并且你想查看是否每天都有一些问题出现,那么你可以使用在线版本的主题建模来查看新问题是否在几天内出现。
所以你可以迅速解决你遇到的问题。这是我大约半年前开发的功能,因为我看到越来越多的用例出现,我想,好吧,但如果我不仅要使用看不见的数据,还要使用主题不同于最初训练的数据呢?
然后,对我来说,这确实是一个我以前未曾见过的非常有趣的用例。
塞斯: 用于随时间发现新聚类的技术有哪些?
马滕: 所以,有一个库,我认为它叫做 River,它主要关注在线聚类或一般机器学习方法的那部分,但它也允许发现新信息。所以,scikit-learn 通常不关注发现新主题或新信息。但持续训练模型是一个有效的用例。例如,River 更加关注真正的在线方面,更加关注发现我们之前未曾发现的东西。
对吧?
塞斯: 开发 BERTopic 时,你遇到的最具挑战性的事情是什么?
马滕: 所以依赖性问题比我之前想的要复杂得多。我有几个包,有些比其他的更容易,但与 numpy 的 API 问题很多——这些问题真的很棘手,随着时间的推移,这仍然是一个问题,因为依赖项不断变化。从某种意义上说,它们变化是合理的,我也不时更改 API,所以事情会断裂,但有时它们真的很难修复和查找,因为有这么多依赖项的组合,而这很难考虑到所有这些,嗯,这就是一个问题。
第二个问题主要是 API 开发,而不一定是算法。我觉得它们很有趣,但仍然很困难,不过这实际上不是问题。但 API 本身是人们每天都在使用的,如果你以重大方式更改它,那么每个人都得进行更改。现在在生产中有效的东西会停止工作,因此在考虑这些事情时,确实很棘手,因为我可能想要在未来进行更改,这当然是不可能的,因为我现在考虑将 plotly 更换为 bokeh,这将非常麻烦——这将会很棘手。
但如果我想做更多的事情,那就会有很多问题——现在你传入的是文档,但总有一天我想传入图像、声音等等,对吧?这需要重大 API 更改,而这种更改需要以不会让用户烦恼的方式进行,因为他们经常使用它,如果你要大幅更改,它显然不是最佳的用户体验,所以这些问题实际上是最困难的。
常发生的情况是,当我想要开发功能或者实现新功能时,我必须引入新的依赖,这真的是我认为你应该尽可能避免的。当开发一个包时,BERTopic 已经有相当多的依赖,而在一个完美的世界中我本来只希望有三个依赖,但这当然不会发生,一旦你添加另一个依赖,所有东西之间的互动可能会搞砸一切,因为这实际上为所有这些依赖提供了另一个复杂性层。
…当我想要开发功能或者实现新功能时,我必须引入新的依赖,这真的是我认为你应该尽可能避免的……当你添加另一个依赖时,所有东西之间的互动可能会搞砸一切,因为这实际上为所有这些依赖提供了另一个复杂性层。
所以,当你进行主题建模时,自然要添加一个包,例如 NetworkX,以显示主题之间的某种网络关系,这将会非常有趣并且绝对可行,但这需要添加另一个可能与我已经拥有的依赖不兼容的依赖。我为 BERTopic 做了一些协方差主题建模,我非常想实现,但这也要求我添加 stats models 依赖,这是一个很棒的包,但它是另一个依赖,因此我可以很容易地列出 20 个额外的依赖,然后 BERTopic 可能会停止工作,是的,所以不幸的是,这在于你想添加的那些包之间的平衡。
Seth: 权衡这些取舍,尽量保持轻量,同时平衡额外的功能等。
Maarten: 对,确切地说。
Seth: 是的。你还提到了一种称为 API 心理学的东西。你想谈谈这个吗?
数据科学家的视角
towardsdatascience.com
Maarten: 对。所以,这就是我所经历的,对吧?我因为心理学背景极其偏见,所以我称呼所有事物为心理学,只是因为我想这样做。
Seth: 你可以做到这一点。
Maarten: 很好。那么我会继续这样做。但问题是,就像我之前提到的,当你进行 API 设计时,这关乎人们如何与你的包、你的模型、你的软件进行互动。
因此,剧烈的变化会伤害用户体验。因此,从流行的 API 设计中学习很多东西,比如 numpy 和 scikit-learn 以及 pandas,人们在某个时刻已经部分由于这些包开发了一种编码方式。如果你试图遵循这些包的哲学和设计,即使是在设计新的东西时,你也确实在关注体验的心理学。
因为如果你按照 scikit-learn 的方式做一切,那真的很好,因为大家都知道 scikit-learn。这样在接触这种模型时会感觉直观。同样的原则也适用于创建包。它不一定需要遵循 scikit-learn 的规范。
每当你创建一个新参数时,你会给这个参数起什么名字?什么是直观的?即使是参数的位置也可能非常重要,因为有时人们不想创建关键字参数,他们只是直接丢入变量,对吧?所以,在设计包时,位置确实很重要。
在开发一个包时,你需要考虑很多这样的因素,因为,嗯,人们会使用它,如果人们要使用它,那么肯定有某种用户体验或心理方面的因素,在这些方面你可以真正地做出改变,从而影响你所创建的东西的适应性。
塞斯: 对于 BERTopic 你最兴奋的未来方向是什么?
马滕: 所以我之前简要提到过这个问题。
我在考虑更改 plotly。我这么做不是因为我讨厌 plotly。Plotly 非常棒。还有 bokeh 或 altair 等等。只是因为我想在某个时刻添加图像,这已经通过一个名为 concept 的不同包实现,该包尝试将文档和图像集成到一个主题建模方法中。
我也想最终在 BERTopic 中实现这个功能。但为了做到这一点,当你要可视化你的数据点时,你通常也希望可视化图像,这直接是不可能的。在 Plotly 中,你需要在其上使用 dash,而这并不是我在 API 设计心理学方面所喜欢的。
这会大大改变你与可视化的互动方式。我在考虑将其更改为 bokeh,因为 bokeh 允许你对图像做更多的操作。至于有趣的未来方向,那是因为我们有更多的多模态嵌入类型模型。
我们可以在相同的维度空间中处理文档、图像、声音。因此,如果你能在相同的维度空间中做到这一点,那么话题建模也可以朝这个方向发展。但除了嵌入之外,还有更多需要考虑的地方。还要考虑话题表示提取以及如何将图像与文档、甚至是声音在某些时候连接起来。
这是我需要深入探讨的内容。我这里有一些代码,但我认为还有很多可以从中获得的东西。
从机器学习中学习
塞斯: 你认为在机器学习中还有什么重要的问题没有答案?
马滕: 当然有一些,但最近经常出现的一个问题是,这与 ChatGPT 类型的方法有关。当这样的模型发布时,人们开始把 AI 谈论得像通用人工智能一样,对吧?
真实的智能,真实的意识,它能够通过图灵测试的那些夸张说法……而且我认为我们距离这些还有一点距离。但现在这开始变成一个有点模糊的领域,因为很多人以那种方式讨论它。
虽然定义可能有所不同,但技术上我们仍然认为我们接近得比较快。如果我们确实在接近,我认为也很重要的是承认 ChatGPT 当然不是那样的。但它是什么,以及如何被接受到行业中,什么是和什么不是,对我来说,这是一个我们需要关注的重要问题。
因为虽然 ChatGPT 可以做非常了不起、非常有趣的事情,但它不是事实信息。它不一定必须是这样,这并不总是如此。在开发这些类型的模型时,需要考虑到这一点。我们正在看这些拥有数十亿参数的巨大语言模型,它们可以做非常有趣、非常了不起的事情。
我真的很想知道这将如何融入到 AGI(通用人工智能)的讨论中。但我确实认为,按照现在的趋势,未来一年将会非常剧烈。
塞斯: 是的。我认为自然语言处理将会有另一个非常激动人心的一年,你知道的,ChatGPT 和 GPT-4 将在几个月内推出。
当然。这显然会很有趣。但确实存在真正的智能与创建拥有数十亿或数万亿参数的大型语言模型之间的某种差距。这并不一定会转化为理解——这是我的看法。
这引出了我的下一个问题,自从你开始从事这个行业以来,领域发生了怎样的变化?是大型语言模型的出现,还是你看到的其他变化?
Maarten: 所以,当我开始做大型语言模型,或者更确切地说,当我开始做机器学习时,Word2Vec 类型的模型真的开始出现,并展示了它们的可能性。
然后慢慢过渡到变压器类型的模型。从那里,当然我们现在拥有的就是目前的情况。我会说,大型语言模型真正改变了整个领域,特别是当你考虑到现在的Hugging Face时。考虑到他们托管的大量模型和它们可以做的事情。
我想说的是,我们看到一个巨大的趋势正在向那些没人能在自己机器上运行的大型语言模型发展。并且,针对这一领域的研究非常有限,更多的是集中在蒸馏和让它对你我更可及上。
我这里有一台带有不错 GPU 的笔记本电脑,但仅此而已。我希望在不使用 API 的情况下运行这些模型。这并不总是可能的,因为速度不够快。而且,仍有很多研究包朝这个方向发展。例如,如果你使用sentence-transformers,它们将其蒸馏,并快速生成对所训练内容的非常准确的表示。
因此,使用这些模型的推理速度非常快,我希望看到更多这样的模型,而不是数十亿的参数。虽然这很不错,不要误解我的意思。我们需要这些模型来最终得到一个蒸馏或更小的版本。但如果对较小的模型的关注程度能与对大型模型的关注一样,那将是很好的,因为我可以使用较小的模型。
我的意思是,较大的模型对我来说实际上是不可接触的。
Seth: 你是否看到生成模型如何影响主题建模和 BERTopic 之类的东西?你是否考虑过将其融入其中?
Maarten: 是的。这又回到了依赖性等问题。
但我认为 Cohere 所做的是,他们创建了一个主题模型,我想它叫做。这基本上是一个在 BERTopic 之上的 GPT。因此,BERTopic 生成一些主题和这些主题的描述,通过单词数来描述。然后他们将这些单词输入到 GPT 模型中,并要求从中创建一个主题——仅仅是自然描述。
而且它做得很好。这样的方法的问题在于,从生产环境的角度来看,很难在你的机器上运行,对吧?你需要有一个 API,如果你使用 Cohere,那是绝对没问题的,这是一个很棒的服务。但当你在没有互联网连接的情况下本地运行时,拥有一个本地 GPT 模型几乎是不可能的。
当这些模型变得相对较小并且可以在你的机器上运行时——那时我将开始将这些技术集成到 BERTopic 中。但如果你想在几百个主题上使用 GPT,并将其分配到,比如说,一百个类别中,那就变得非常困难,并且计算时间非常长。
这就是为什么我现在不想把它集成到 BERTopic 中的原因,对吧?这就是为什么 Cohere 所做的事情很了不起。如果你觉得需要的话,这是一种在 BERTopic 基础上的附加功能。如果你有那种服务或对其感兴趣,我也会强烈建议使用。
但在 BERTopic 中集成这些技术还为时尚早,直到性能达到现在 BERTopic 的状态。
Seth: 对。这很有意义。是的,我尝试将一些 BERTopic 的输出放入一些开源生成模型中,结果让我感到惊喜。
Maarten: 啊,这太棒了。
Seth: 我认为这绝对是一个有趣的未来研究领域。你怎么看待这些新生成模型所制造的炒作?你觉得炒作与现实之间有很大的差距吗?
Maarten: 是也不是。我知道这是个令人恼火的答案,但不,我不认为有差距,因为很多这些模型,拿 ChatGPT 或者稳定扩散来说,可能会更有趣。基本上,我们从文本中创建图像,这真是太惊人了。
使用稳定扩散生成的图像,提示词为:“不可思议的图像,展示某人在学习如何做机器学习”
这真的很令人惊叹。实际上,有些人是很棒的提示者,他们知道需要使用哪些词汇来创造出色的图像。如果你能非常聪明地运用这些,那么在一些用例中,这可能会很有趣,比如在制作原型时,或者在为你的游戏创作艺术品时。
仍然存在一个差距,也就是说,它并没有完全按照你的需求进行操作,对吧?你仍然需要寻找很多方法来确保它给出你需要的输出。这是一个非常大的模型,运行速度可能没有你期望的那么快。关于艺术家被网络上直接复制的问题也很多。
在过去几个月里,我看到很多人说,好吧,有人训练了我的特定艺术作品,现在它生成了看起来像是我的作品。好吧,这当然不是我们应该追求的方向。所以我认为有很多炒作是有意义的,但很多炒作也只是因为这些工具很有趣。
是否会在很多组织中实际使用这一点,我对此表示高度怀疑。但在某些特定的应用场景中,我确实认为这会产生巨大影响,但这些场景只是有限的几个。对于很多人来说,这只是一些有趣的东西,很容易传播开来。
Seth: 对吧?是的。ChatGPT 的影响确实令人难以置信,短短一周内就获得了超过一百万的用户。与它互动的感觉确实很特别。我认为他们减缓了输出,使其感觉像是在与人交谈。
Maarten: 也许这与我不完全确定有关,只是为了确保人们仍然在使用它,而不会过多查询它。
对。它减慢了你实际查询的时间,但即使在荷兰,也有很多人用荷兰语使用它,并且效果相对较好,这很有趣。我想知道什么时候会看到它出现在实际的研究和合同中。它真的很有传播性。
Seth: 是的。你有没有用它来帮忙,哪怕是日常的小事?
Maarten: 实际上没多少,因为它仍然需要我花很多时间去修正,而我喜欢按照自己的方式来做。
我在写文章时使用它来生成十个标题,例如,给我一些灵感,并从中提取,然后我会在十次中改变九次。但我确实认为这是获得你想创建的东西的初步想法的一个了不起的方式。
如果你想写一个关于联邦学习的介绍,只需输入它。它可以返回一些内容,你可以按自己的方式修改,进行调整。看到这一点真的很有趣。也许在某个时候,我们不必自己打出所有这些内容。我们只需请别人或让 ChatGPT 来做。
然后,它会迭代地要求你以符合你想实现的方式进行修改。所以我们写作和互动的方式可能会完全改变,如果像这样的东西变得更开放源代码,或最终更易于公众访问,而不仅仅是 API 的话。
这绝对会很有趣,对吧?
Seth: 是的。我认为创造合适的提示有一定的创造力。这也是未来的发展方向。人与机器的这种互动可以产生最佳的输出,也许得到一个初步的想法,然后你可以基于此进行工作或修改。
Maarten: 这确实节省了很多时间,对吧?我的意思是,你知道你想写什么。在许多情况下,你写论文时需要写关于联邦学习的介绍,或者可能是稳定扩散,或者其他什么内容。只需请别人写一个初稿,然后你可以修改它。
你已经知道你想写什么,如果你是该领域的专家,那么你需要做的只是检查是否一切正确且完成得当。但这节省了很多时间。当然,这其中也有风险,当人们使用它并且只是照搬照抄时,可能会出问题。
但最终我们也会找到处理这个问题的方法。
Seth: 是的。我认为这有一个有趣的方面,可能有些人会忘记。大型语言模型如此强大,是因为所有这些信息都是由人类创造的,这为这一切奠定了基础。
所以回到机器学习领域——是否有一些人激励了你——你受到他们的很大影响?
Maarten: 所以我跟随一些人,但我不会特别说有这些人对我影响巨大。原因是,从心理学背景来看,我倾向于从尽可能多的角度看待事物,这同样适用于那些影响我的人。
所以我尝试摘取人们所说的片段,并将其用于我认为有趣的内容。因为每个人都有自己的优点和缺点,我专注于这些优点,但我挑选 20、30 个人,他们在特定领域表现出色,然后试图将他们结合起来。
所以我开始学习基于 transformer 的模型,使用了Jay Alammar 的可视化。
Seth: 非常了不起,经典。
Maarten: 他在这方面做了很棒的工作。但这是我从他那里获得的一个方面,然后我从其他完全不同的人那里获得其他东西并使用它。因此,这更多是人员的组合,而不是单独有一个人,我觉得我喜欢那个人做的一切,这种情况很少发生,因为你知道,我们是人,我们并不是在所有方面都很出色。所以,你知道,这个人在这方面更好,那个人在可视化方面更好,那个更好的编码员。
现在,我是Sentence-Transformers库的超级粉丝。例如,是的。所以有一个采访即将进行,Nils Reimers 的工作非常出色,对吧?是的。但如果我需要可视化,我会去找 Jay [Alammar]。你知道,这是一种人员的组合,我认为你最终会自己找到他们。
因为我可以说,这里有 20 个人的名单,我觉得他们很有趣,但我觉得他们有趣是因为我是谁,我以某种方式看待事物,所以也试图用支持我观点的观点来支撑我的思维。我在这方面还是人类。因此,即使我提供这些人,也可能与那些看待事物方式不同的人不合适。
是的。所以抱歉,这算是一种非回答,
塞思: 不,这是一个很好的见解。我喜欢这一点。有没有其他领域的人激励你?
马滕: 嗯,这是个好问题。我最近为 BERTopic 做了那个动画。
塞思: 喜欢它。
马滕: 是的,谢谢。我没有刻意去争取这些赞美,但还是很受用。
塞思: 我仍然喜欢它。
马滕: 我用3Blue1Brown的软件做了那个。我真的很喜欢这个。这个 YouTube 频道提供了数学相关的内容,呈现方式很棒,还有一个开源的主要包,任何人都可以使用。
我非常喜欢关注那些类型的人,因为他们以如此愉快的方式提供信息,让我感觉像是在看 Netflix。如果你能做到这一点。例如,Kurzgesagt,我最近在一篇文章中提到过,他们的频道也提供了关于不同主题的大量信息。
如果你能以一种像看电影一样的方式呈现复杂的内容,那真的是美妙的。是的,我真的对此印象深刻。所以,也许这些类型的人会影响我。
塞思: 是的。我在数据科学和机器学习中发现,确实存在硬技能,对吧?
然后还有软技能,包括能够解释你正在做的工作,融入心理学的部分,理解人们如何学习、如何思考事物、如何感知事物,并且理解什么是最好的表达方式?什么是最好的可视化方式?
这非常重要,因为这样你就可以让其他人参与进来,对吧?然后你可以得到他们的反馈,这样事情才能真正开始起飞并达到新的高度。
马滕: 是的。我完全同意。
这当然是我非常偏见的观点,但在这个领域,我真的认为有时候一种确实不能存在于另一种之中。当然,我可以创建最复杂的算法来执行某种特定任务,但如果我不能有效地与利益相关者沟通,那真正的意义何在?
我在开源软件中看到过很多包做得非常出色,但使用起来非常困难,所以没有人使用它们,这真的很遗憾,因为没有考虑到心理学的方面。
但这也可以反过来运作,对吧?如果我想向一个人解释某件事,特别是一个困难的算法,我真的需要非常、非常了解那个算法,才能够解释清楚。
所以我知道怎么以一种方式解释它,怎么以一种方式沟通,怎么以一种方式表达以吸引受众,但这并不意味着我理解内容。所以这两方面都适用。
当人们说,你需要有软技能时,总是很好的,但为了拥有软技能,你确实需要那些硬技能,因为如果你不知道自己在说什么,你可以稍微编造一下,但人们会发现的。
Seth: 你确实需要用硬技能来支持这一点。
Maarten: 是的。在某些情况下,我真的认为它们同样重要。并非所有情况下都如此,我的意思是这并非黑白分明,但如果我们从商业角度来看,你只需要确保你能做好你的工作。
但剩下的部分确实是销售,说服别人,好的,这值得投资。为了做到这一点,你需要解释清楚。你需要吸引人们。作为数据科学家,这并不总是必要的,有时候你有经理为你做这些事情——把这些事情抽象化,因为有很多技术数据科学家不一定想专注于大量的会议和演示,这也是公平的。但仍然需要有人来做好销售。
Seth: 学会如何与各种类型的利益相关者打交道,从非技术人员到 CEO,再到产品负责人,甚至其他数据科学家,这一点非常重要,了解你的受众是谁,以及传达你所学到的最佳方式。
进入从机器学习中学习的领域。
Maarten: 顺便说一句,名字很棒。这太好了。
Seth: 是的。谢谢。我很感激。你收到的哪些建议在你的机器学习旅程中帮助最大?
Maarten: 是的,对我来说,我不一定知道这个建议是从谁那里得到的,但真正理解问题本身就是一种解决方案。
我会一遍又一遍地说这个。如果你真的不了解你试图解决的问题,那么你不可能得到一个好的解决方案。这看起来很简单,但实际上并非如此。这是你可以做的最困难的事情之一。真正能尝试或真正理解他们所处理的问题的人少之又少。
我会一遍又一遍地说这个。如果你真的不了解你试图解决的问题,那么你不可能得到一个好的解决方案。这看起来很简单,但实际上并非如此。这是你可以做的最困难的事情之一。真正能尝试或真正理解他们所处理的问题的人少之又少。
比如说,我现在在从事癌症研究,我有很多了不起的同事,其中有一个人在编码之前真的会深入研究问题,对吧?在真正编写代码之前,他会花几周的时间来搞清楚究竟发生了什么。他仍然编写代码,并且还在研究潜在的解决方案,但他花费几周时间只是为了搞清楚到底发生了什么。
数据的表现形式是什么,它被使用的背景是什么,困难是什么,法律上的关联,例如——这使得编码变得更加容易,因为你已经完成了所有的基础工作,对吧?然后你准确知道你想要编程的内容,你想要预测什么,一旦你想要解决什么。
但这非常困难,因为这不仅仅是一个技术问题。它通常还涉及到,比如说,数据是如何生成的。在大多数情况下,虽然不是总是如此,但数据总是有某种心理因素,或者数据本身存在一些问题,这总是存在的。
总是有某种“脏数据”存在。
塞斯: 奇怪的伪影,对吧?就像发生了一些事情。
马尔滕: 确切地说,确切地说。这确实取决于过程。所以你需要理解数据生成的过程。但如果你要设计一个解决方案,你是为谁设计的呢?
那么他们为什么会想要那个解决方案呢?因为经常发生的情况是,人们请求解决方案时,实际上可能意味着完全不同的事情。这不是他们的错,因为他们试图传达,但由于你是我们的技术人员,你知道可能性是什么,你可能会说,好吧,但你可能需要更多地关注这个方向和那个方向。
如果你不做这些,可能最终会推出一个模型,人们会说,“啊,这不是我们真正想要的。”然后你也常常会看到,创建解决方案的人说:“哦,但你应该早告诉我。”这不是我们应该沟通的方式,对吧?
这是一个双向的过程。你不能只是告诉某人,你需要告诉我你具体需要什么,就好像你是数据科学家一样。事情不是这样运作的。我们需要相互帮助。我认为了解过程、理解问题是数据科学中最值得投入时间的方式。
塞斯: 100%。有时只需要一支笔和纸,对吧。在你进入代码之前。
马尔滕: 是的,绝对如此。
塞斯: 另外,我还想补充一点,我会说,重新审视问题,对吧?是的。也许在你开始做一些工作后,你会开始意识到,哦,你知道,所有的要求还没有完全解决。
你知道,。
马滕: 不,那很完美。那很棒,因为,你知道,它从问题开始,正如你提到的,频繁回顾以查看,好的,我仍然保持在我最初认为的问题的轨道上,这可能会在你开始设计解决方案时发生变化。
塞斯: 对。这种数据科学中的迭代过程的棘手之处在于,一旦你选择了某种解决方案,它开始让你的视野变得有些狭窄,对吗?
马滕: 当然。
塞斯: 所以这就是为什么你总是必须回到原点——理解并弄清楚从商业角度来看这是什么,从数据角度来看这是什么?对,就是这样。
马滕: 是的。如果随着时间的推移变得稍微窄一些也没关系。当然。你现在从广泛的角度出发,尝试探索所有存在的东西,最终会找到一个解决方案。所以它必须变得更加具体。但正如你所提到的,不要太快,它应该花费一些时间,就像强化学习一样。
探索与利用之间应该有一个平衡,对吧?你知道,我们会设计一个解决方案,但我们仍然会留出一些空间来探索一些不同的东西,看看这些是否仍然有效,或者是否仍然相关,等等。
塞斯: 对。那种前期的时间可以节省你很多时间。
马滕: 需要花费大量时间。是的。
塞斯: 对于刚刚开始从事机器学习或自然语言处理的人,你有什么建议?
马滕: 所以我真的会尽可能多地开始做项目,没关系,哪怕只是一个泰坦尼克号数据集或房价回归。
我认为这是一个方面。确实,有很多人已经做过这些,但亲自动手在数据科学中极其重要,因为在某个阶段你会对某些事情产生直觉。你看到一个问题,你不完全知道原因,但你觉得,好的,这应该是解决方案。
这发生是因为,我的意思是,你也在某种程度上是一个预测模型。你知道那种直觉——那是因为你之前在前一个项目中学到了一些东西,你发现有些方法效果很好,或者有些东西与你现在正在做的非常相似。
这发生是因为,我的意思是,你也在某种程度上是一个预测模型。你知道那种直觉——那是因为你之前在前一个项目中学到了一些东西,你发现有些方法效果很好,或者有些东西与你现在正在做的非常相似。
通过做所有这些项目,亲自动手分析数据,收集自己的数据,清理自己的数据,应用这些算法并深入研究,这帮助你真正理解这个领域,培养对事物何时有效和何时无效的直觉。
一个著名的例子是,当大多数人刚开始时说的,如果你看到一个模型有 99%的准确率。没错。肯定会有什么问题。
Seth: 哦,不
Maarten: 这种情况不会发生。一般来说,不会发生。所以这是你逐渐培养出的直觉。当然,这是一个著名的例子,但类似的例子还有很多。许多这样的东西最终被实现到 BERTopic 中,因为我觉得,哦,这里发生了些奇怪的事情。
我不完全确定,但我觉得我应该看看那里和那里。是的。现在,我之所以这样做的唯一原因是因为我在许多这些项目中积累了大量经验,即使这是我之前没有做过的事情,我也会立即知道去哪里找。我认为如果你刚开始,就做好工作吧,
Seth: 对了。现实世界或真实项目的经验可以让你大致知道哪里可能会有陷阱,哪里可能会有坑,这些经验可以帮助你更好地应对。
Maarten: 是的,绝对的。如果你刚开始,不要怕别人说不要使用 Titanic 数据集,也不要使用房价数据集。
每个人都要从某个地方开始,从完全干净的数据开始是可以的。真的可以。然后你可以慢慢过渡到不那么干净的数据,收集自己的数据等等。
Seth: 对了。那么,在类似的方向上,你会给自己什么建议,当你刚开始的时候?
Maarten: 哦,这是一个很棒的问题。哦,我真的需要好好考虑一下。
哦,这很棘手,因为我当然是根据自己的经验来讲的。也许可以稍微早一点进入这个领域。我所说的意思是我进行了转型,因此我相对较晚进入这个领域。我这一代有很多人已经有了四五年的经验,虽然攻读硕士学位很好,确实推荐。
经验能让你更进一步,我认为,啊,也许不只是稍微进一步,但它是同样有价值的。如果你能两者兼顾,那当然是很棒的。
我认为我在数据科学的多年中,从未真正拥有一个导师,不是一个我可以随时仰视并询问我所处理的事情的人。我不得不自己发现一切,这有其优点,但主要缺点是大大拖慢了某些学习过程。
所以我会给自己建议的是,也许在那段时间里,稍微少关注学术,更多地专注于获取经验。
Seth: 这仍然是个好建议,我喜欢顾问或导师的想法。
我认为这是人们往往会回避的事情,但我认为他们不应该这样。这是一个重要的事情,可以在你的旅程中帮助你。有时候,自己做所有的事情是很好的,对吧?你会面对学习的痛苦,当你完成时会获得强烈的成就感。
马滕: 正是这样。
赛斯: 但如果你有一个人,哪怕只是一个可以倾诉的对象,那肯定会加快进程。
马滕: 正是这样。一位好的导师有时会说,自己去解决吧。因为一个好的导师会知道你的能力,知道你有多坚持,以及你能做什么和不能做什么。
一位好的导师有时会说,自己去解决吧。因为一个好的导师会知道你的能力,知道你有多坚持,以及你能做什么和不能做什么。
所以,他或她会在某个时候知道,好吧,如果你再多花几个小时,我相信你会解决的,对吧?如果到那时还不行,好吧,我会把你推向正确的方向。对吧?但这就是你得到的全部。对,一个推动。所以,我认为这对我来说会有很大的区别。
一个导师。
赛斯: 这就是一位好老师或好导师可以提供的东西。那么,从更哲学或更广阔的角度来看,机器学习的职业生涯教会了你什么关于生活的东西?
马滕: 你让我思考了困难的问题。不,实际上,对我来说,机器学习在我生命中的出现与慢性疼痛大致是在同一时刻。
处理这些问题相当困难。因此,找到一个健康的生活和我当时最喜欢的事情——机器学习之间的平衡对我来说很困难,因为慢性疼痛使得我每天打字 10 小时变得困难。
我真的必须平衡我工作的方式和时间。这很棘手,对吧?所以当你换职业时,这已经很困难了。但当你最终找到你认为“好,这就是我想做的”时,同时你还会有慢性疼痛。
这并不是让你感到特别开心的事情。对我来说,这一直是非常困难的,但事后看来,这却是一个非常宝贵的学习经历。真正了解我所坚持的是什么,什么对我重要,我想要关注的是什么,以便在某些时候退后一步。
因为这也是机器学习的领域——它发展迅速,极其迅速,没有人能够跟上所有发生的事情。但错失恐惧变得巨大的时候。随着稳定扩散和聊天 GPT 等这些东西几乎是每天发布,这种感觉时常会出现。
但我真的学会了退一步看全局。你不需要知道一切。有些事情比其他事情更重要或不重要,你可以跟随,但最终你会赶上发生的事情。
但我真的学会了退一步看全局。你不需要知道一切。有些事情比其他事情更重要或不重要,你可以跟随,但最终你会赶上发生的事情。
我是说,ChatGPT 表现得非常好,这很棒,但如果我不把这个模型变成某种业务,我可能从一开始就不会知道这一点。那时候我不需要知道,所以我可以给自己更多空间来寻找平衡。虽然有了 BERTopic 和写作以及 KeyBERT,仍然很困难。
Seth: 是的。我不确定你是如何找到时间来维护如此出色的库并保持日常工作的。
Maarten: 我不知道。我尽力而为。我不确定我的妻子是否总是那么开心,但我会确保找到平衡。但你说得对,日常工作与开源和写作结合在一起确实很困难。
所以也许将来我会喜欢将这些结合起来。但是你知道,这取决于情况。毕竟这是开源的,对吧?也许如果有一天有一个组织说,好吧,我们会全力支持这个项目,那么这可能会对我产生兴趣。但目前,我有一个很棒的工作。
我获得了很多自由,可以围绕慢性疼痛进行工作,这很棒,因为并不是很多组织提供这样的条件。同时,我仍然可以从事我认为重要的工作。
Seth: 好吧,你的工作受到这位机器学习科学家的高度赞赏,我相信还有许多其他人也如此。
所以总结一下,如果有人对联系你或了解更多关于你感兴趣的话,有没有地方可以去?
Maarten: 你可以去 Twitter 或 LinkedIn。这些是我主要的联系渠道。我还有一个网站。
它是 maartengrootendorst.com,只有荷兰人能理解。只是我的名字,但这是发音的方式。翻译成英语并不是最简单的事。但没有 Twitter 和 LinkedIn,主要是 LinkedIn。你可以在那儿很好地联系到我。是的。
Seth: 太棒了。Maarten,与你交谈非常愉快。
谢谢。非常感谢。
Maarten: 谢谢你邀请我。采访很棒。我喜欢这些问题。真的,其中大部分非常技术性,对吧?如果你有像 KeyBERT 或 BERTopic 这样的东西,这就是你主要做的事情。但更关注一点哲学和心理学的方面,我非常感激。
Seth: 绝对的。非常感谢。
Maarten: 谢谢。
立即收听
完整访谈的视频可以在这里观看:
Maarten Grootendorst: BERTopic, 数据科学, 心理学 | 机器学习中的学习 第 1 集
该播客现在可以在所有 播客平台 上收听:
现在在所有播客平台上可用
资源
了解更多关于 Maarten Grootendorst 和他的工作:
-
BERTopic: BERTopic 是一种主题建模技术,利用 🤗 transformers 和 c-TF-IDF 创建密集的集群,从而生成易于解释的主题,同时保留主题描述中的重要词汇。
-
KeyBERT: KeyBERT 是一种简约易用的关键词提取技术,利用 BERT 嵌入生成与文档最相似的关键词和短语。
学习更多关于机器学习的资源:
视频内容
-
00:00 机器学习中的学习介绍
-
00:20 Maarten Grootendorst 介绍
-
00:54 职业背景
-
02:21 心理学背景
-
04:07 是什么吸引了你学习机器学习?
-
05:18 你需要学习的第一个技能是什么?
-
07:12 什么是 BERTopic?主题建模的力量是什么?
-
09:38 初始包的目标是什么?它是如何变化的?
-
12:41 BERTopic 的好处
-
13:18 为什么评估主题模型如此困难?
-
16:06 分配真实值的挑战
-
16:44 BERTopic 的一些独特用例是什么?
-
18:38 随时间推移发现新集群的技术有哪些?
-
19:29 在开发 BERTopic 时,你面临的最具挑战性的事情之一是什么?
-
24:13 API 的心理学是什么?
-
29:04 在机器学习中你认为仍未回答的一个重要问题是什么?
-
31:22 自然语言处理的激动人心的一年
-
32:00 自你开始在这个行业工作以来,这个领域发生了什么变化?
-
34:22 生成模型如何影响主题建模和 BERTopic?
-
37:00 这些生成模型的炒作和现实之间是否存在差距?
-
39:15 ChatGPT
-
41:30 人类与机器的互动
-
43:18 领域中是否有激励你的人物?
-
47:10 与他人分享你的数据科学工作
-
50:48 从机器学习中学习
-
51:00 你收到的对你机器学习之旅有帮助的一条建议是什么?
-
54:30 重新审视问题
-
56:30 你会给刚进入这个领域的人什么建议?
-
59:36 你会给刚开始时的自己什么建议?
-
1:02:35 从机器学习的职业生涯中你学到了什么关于生活的东西?
-
1:06:30 总结
-
1:06:48 如何联系马尔滕·格鲁滕多斯特
-
1:07:20 结论
从机器学习中学习 | Vincent Warmerdam:Calmcode,Explosion,数据科学
数据科学的过去、现在和未来:与 Explosion ML 工程师及 calmcode 创始人Vincent Warmerdam的访谈
·
关注 发表在 Towards Data Science · 53 分钟阅读 · 2023 年 6 月 14 日
–
作者提供的图片
欢迎回到“机器学习的启示”系列,访谈探讨了机器学习的迷人世界。随着 AI 革新我们的世界,每集节目提供了技术见解、职业建议和来自领域内领先从业者的生活经验。
在这一集中,calmcode 和 koaning.io 的创始人、Explosion 的 ML 工程师以及前 Rasa 的研究倡导者 Vincent Warmerdam 分享了他的经历和建议。他在数据科学领域担任过顾问、倡导者、培训师、领导者、教育者和招聘者等多个角色。他的工作重点是简化流程、有效利用模型和教育他人。
他的网站 calmcode 提供高质量、易于消费的教育数据科学内容,已获得广泛欢迎和积极反馈。目前每月吸引数千名用户,并成为数据科学家的宝贵资源。Vincent 帮助组织了 PyData Amsterdam,并且他一直是 PyData 和 NormConf 的演讲嘉宾。他的演讲既有趣又引人入胜(可以在 YouTube 上查看)。
Vincent 创建了数十种工具来帮助机器学习开发、数据处理、测试和自然语言处理。
🙂Vincent D.
github.com](https://github.com/koaning?source=post_page-----e07951a07cf4--------------------------------)
Vincent 对于构建实用工具、公开分享自己的工作和以简洁冷静的方式解决现实问题的热情影响了我工作的方式。
摘要
Vincent 的职业道路不寻常,他在数据科学尚处于萌芽阶段时便进入了这一领域。他将自己的成功归因于运气、博客的受欢迎程度、组织聚会和开源贡献,这使他直接从 CEO 和 CTO 那里获得了工作机会,而不是通过传统招聘流程。他的学术背景包括运营研究和设计,这使他对算法和约束有独特的视角。他还提到,作为 Comedy Club 的调酒师经历帮助他提高了演讲技巧。
受到家庭成员错误诊断的启发,Vincent 被吸引到机器学习领域,以利用算法做出更好的决策和预测。在他的硕士论文期间,他抓住机会专注于机器学习。
他在开源领域的工作受到了希望解决特定问题和有时是满足自身需求的驱动。他从第一个 PyPI 项目 evol 开始,并基于他在不同公司中的需求和经验开发了如 scikit-lego、human-learn、whatlies 和 doubtlab 等库。
大型库的出现是他在 human-learn 和 whatlies 上工作的结果。它利用嵌入、降维和聚类来促进批量标注和数据探索。虽然该工具不能提供完美的标签,但它有助于降低入门门槛并在处理新数据集时建立直觉。
他创建了 calmcode 以回应数据科学中优质教育内容的缺乏,旨在提供简明而有见解的教程,重点是有效地传达思想。他的课程由一系列简短易懂的视频组成。他专注于教授工具和方法,以提升日常的数据科学工作。
文森特在该领域的经验为我们提供了对机器学习现状的深刻见解。我们讨论了生成模型的局限性、规则驱动系统在补充机器学习模型中的作用以及实际标签标注的复杂性。
文森特的建议真实而深刻。他警告说,早期职业生涯中过于强调经济收益是不明智的,应优先发现自己的激情和真正的动机。他在感受到机器学习领域的有用性和对技能专业人才需求的对比中挣扎,同时也认识到过多的炒作。最重要的是,文森特强调要清楚自己能够和不能够影响的事物,并将精力集中在能够产生影响的领域。
建议与收获
-
正确理解问题是最重要的——即使算法更好,如果应用于错误的问题,可能也不会产生更好的结果。
-
重新表述问题可能是有益的——全面考虑系统优化,而不是仅仅专注于改进单个组件。
-
“人们经常忘记算法通常只是系统中的一个齿轮。我们感兴趣的是构建一个更好的系统,而不是一个更好的齿轮。所以,如果你正在构建一个更好的齿轮但它不适合其他部分,它不是更好的齿轮,因为你没有得到更好的系统。”
-
考虑开始一个博客,分享你的学习经历。撰写简短的“今天我学到”片段可以是建立在线存在感和展示你持续学习的一种简单方式。
-
刚开始时不要感到压力要知道所有事情。考虑相关角色,如分析师,这可以提供有价值的技能和知识,对你的数据科学旅程大有裨益。
-
“你可以比你想象的更频繁地创建 Python 包,所以尽管去创建一个吧。”更多的人应该创建自己的 Python 包,即使是用于内部工具或小的辅助函数。还没有足够多的人利用打包和重用自己代码的好处。
-
走出机器学习的圈子可能会令人耳目一新,并提供灵感。与不在该领域的人互动,了解他们的观点,可以帮助你创建更好的应用程序,并关注工作的人的方面。
-
在职业生涯早期,要小心不要过于关注金钱。重要的是找出你喜欢什么,是什么让你兴奋,而不仅仅是追逐更高的薪水。
-
“在机器学习的过程中,我有些复杂的看法。部分观点是它是一个非常有用的工具,我们需要更多优秀的人来做机器学习。但与此同时,它也像一个充满炒作的垃圾桶,我们确实希望减少这种炒作。我每天的工作就是在这两种感觉之间处理。”
-
“调用 .fit 和 .predict 是简单的部分。所有围绕这些的东西要复杂得多。特别是当你考虑公平性主题、所有可能出错的事情时,我们真的能提前知道这些吗?我不知道你是否总是能知道。”
-
“有些事情你可以控制,有些事情你不能控制。只要确保你理解什么是可以控制的,什么是不可以控制的,然后从那里开始行动。”
目录
介绍
总结
建议与收获 完整采访
— 欢迎
— 背景
— 学术背景
— 机器学习的吸引力
— Calmcode
— 开源
— 批量处理
— 理解问题
— 机器学习中的未解之谜
— 生成性与预测性机器学习
— 影响因素
— 职业建议
— 对新数据科学家的建议
— 从机器学习中学习
视频采访
Spotify 音频
前一集 featuring Maarten Grootendorst
参考文献
完整采访
(注:为了清晰起见,本次采访进行了轻微编辑)
欢迎
塞斯:欢迎来到《从机器学习中学习》。在这一集里,我很高兴能邀请到 Vincent Warmerdam。他目前是 Explosion 的机器学习工程师,该公司开发了 SpaCy 和 Prodigy。Vincent 是一名教育者、博主,并且是 PyData 的常客讲者。
他创造了许多有价值的开源工具。在 LinkedIn 上,他获得了超过一百次的“出色”认可。真正是数据科学社区中的激励力量。欢迎收听播客。
Vincent:嗨。那句话让我检查一下。我有一百个认可吗?我不知道。
塞斯:结束。
Vincent:哦,好吧,酷。
这是我和一位前同事之间的内部玩笑,看看谁能获得最多。我现在在 LinkedIn 上得到了超过九十九个对我的“出色”认可,真不错!
背景
塞斯:你能给我们讲讲你的职业经历吗?你是怎么走到今天这一步的?
文森特:给出合适的职业建议有点困难,因为我想承认我有一点运气,我也很幸运,因为当我开始从事数据科学工作时,这正是随机森林比较新的时代。如果你能使用随机森林,你已经比所有传统的线性模型要强很多。所以你只需运行拟合和预测——就这样。你就有了一个工作。而且,我正好在那个时代赶上了。
之后,我开始了博客写作。我开始通过组织一些聚会来帮助大家。阿姆斯特丹有一个机器学习聚会——我帮助组织了 PyData Amsterdam。
我还曾经有一个相当受欢迎的博客,所以人们开始因博客而认识我。在某个时候,这种认可让你有了机会,你被邀请去演讲,然后人们就把你视为权威人物。我不是,我喜欢认为自己有明智的想法,但我尽量对这一点保持谦虚。但这也基本上是我职业生涯的故事,因为人们知道我的博客,通常包括公司的首席技术官。然后首席技术官会说,“嘿,我喜欢你的博客。我们能喝杯酒吗?”
然后,通常这就会导致工作机会。我还没有和招聘人员谈过。说实话。在我的职业生涯中,我从未通过招聘渠道获得过工作。
这一直是通过 CEO 或 CTO,因为他们事先知道我的工作。这非常奇怪,这是一个非常糟糕的故事,因为对于其他人来说,这非常难以复制,因为我在这方面非常幸运。我确实认为拥有一个博客并且能够获得认可是非常有用的,只是很难复制。但我也喜欢认为我为开源做的一些旁项目确实有所帮助。Calmcode 是如今人们认识我的一个方面。有句老话说,种下一千朵花,总会有一朵是莲花。
…种下一千朵花,总会有一朵是莲花
图片生成使用了 huggingface.co/CompVis/stable-diffusion-v1-4
,提示为“种下一千朵花,总会有一朵是莲花”
我认同这种观点,但很多情况也归结于运气和一点特权。我只是想对这一点保持诚实。能够被认可对我来说确实很有用。
塞斯:是的,确实如此。我的意思是,每个人的经历都是独特的。你在不同公司担任过什么角色?
我知道你曾经做过顾问,也当过倡导者。你有过一些有趣的头衔,对吧?
文森特:在之前的一家公司,有一个阶段他们会让你选择任何名字,我和几个同事觉得这很有趣,看看我们能把名字搞得多么夸张。所以我叫自己宝可梦大师,因为我觉得这挺有趣的。我最喜欢的头衔是高级人物,因为在某个时候,我只是公司里的老一辈。所以我就这样称呼自己。
就角色而言,我做了很多培训,所以有时候你会称自己为培训师。因为你在做咨询工作,所以在不同的团队中你会扮演不同的角色。所以我曾经也担任过领导。
我还帮助一家招聘公司在公司里招聘特定数据团队的人。有时候我的角色会非常短期。有时候会是两年。但通常,我是数据团队中的一员,试图让团队变得高效,做任何事情。通常,我喜欢认为自己很擅长保持事情的简单。
我可以从线性模型中获得很多收益,这通常效果很好。在那之前,我在大学期间做了很多不同的工作,我也喜欢认为这也有所帮助。我的背景是运筹学,但在此之前,我实际上学过设计。我的晚间工作是荷兰一家喜剧剧院的酒保,我认为这可能在某种程度上帮助了我的演讲技巧。学习设计一段时间也让我在思考算法时有了不同的视角。
运筹学让我在做数据科学工作时经常思考约束条件。我喜欢认为我有一个比较多样的背景,而正是这种多样的背景使我能够轻松完成现在正在做的事情。这就是总结。
学术背景
塞斯:这很有道理。那么,深入了解一下你的学术背景吧,是什么呢?所以,既有运筹学又有设计?这听起来很独特。
文森特:是的,我学了工业设计工程一年,然后发现这不适合我。所以我不得不换专业。然后学士学位是计量经济学和运筹学,硕士学位是运筹学。我认为这两个中最有趣的是运筹学。而且,因为这也有一个通向计算机科学的小门。
如果我想学习计算机科学课程,那对我来说会是一种比较简单的方式来获取我想上的课程。不过,我在大学时也参加了划船并做了一些聚会,所以我还不能开始我的硕士课程。因此,我有一年时间只是选修了我感兴趣的课程。我修了一些神经科学的课程,觉得相当有趣,还有心理学和生物学等等。
我喜欢认为知识的多样化被证明非常有用,但我正式的学术背景是运筹学。所以这就是优化系统背后的数学。这就是你在那儿学到的东西。
Seth: 非常酷。在运筹学中,人们尝试解决的典型或经典问题是什么?
Vincent: 所以,在机器学习中,一个非常经典的例子就是你通常会尝试优化某个目标。你希望将损失降到最低或将准确率提高到最高。你有算法来实现这一点。你通常会拿到数据和你想要预测的标签,然后制定某种损失函数,试图使这些损失最小化。在运筹学中,你也会做类似的事情。
在运筹学中,你通常不会处理机器学习算法,而是处理,例如,“嘿,我们有一些股票想要投资,顺便提一下,这也引入了约束条件。因为,是的,我们想获得最高的回报,但当然,我们不想超出预算,我们也有风险偏好。”这些都被定义为严格的数学约束条件。如果你想优化,那就有点不同了,因为如果你的算法超出了约束的范围,那你就进入了不好的领域。所以我认为这是主要的问题。
如果你在做运筹学,那么你会被教导约束条件非常重要,你希望以数学上合适的方式处理这些约束。这是另一回事。但这正是他们所处理的主要内容,这种有约束的优化。这就是他们的工作。
Seth: 非常酷。是的。听起来你需要很强的数学背景。里面也有一些线性代数吗?
Vincent: 需要大量的微积分和线性代数。虽然,我会说这有点取决于你做什么。当你攻读硕士学位时,当然你会上理论课程,并且需要做证明。但当你开始做论文时[情况会有所变化]。我有一个教授基本上说:“我对机器学习一无所知,Vincent,但你似乎非常渴望。你做机器学习,然后教我它是怎么回事,因为我一点头绪都没有。”
这很棒。教授们允许我做我想做的事情,我也能以这种方式自学。但如果你真的想做正规的运筹学,特别是如果你想攻读博士学位,那是非常数学密集的。确实如此。
坦白说,这对我来说有点太沉重了。我更倾向于应用方面,但仍然认识那些最终攻读博士学位的人,他们绝对是数学证明类型的人。他们是那种线性代数“食谱”的人。这确实存在于这个领域。
机器学习的吸引力
Seth: 是什么吸引了你对机器学习的兴趣?最初是什么让你感兴趣的?
Vincent: 做出预测总是很酷的,对吧?所以这其中有一些我认为非常有趣的东西。我记得比较长的故事是,我非常亲近的一个家庭成员得到了一个错误的医学诊断。
错误的诊断是他们告诉这个人你得了很严重的疾病,但实际上并没有。幸运的是,我们及时发现了这个问题。但是,他们可能因为这个决定做了一些非常奇怪的生活决策,比如立即卖掉房子。这让我意识到,做出错误决定会有明确的后果。任何我们能做的改进决策的事情都是有趣的。
也许这与机器学习有关。整个概念是你试图通过使用机器从数据中学习更多,这种想法是有一定道理的。它似乎非常有趣。所以,那时我确实想,嘿,看看这些算法是否能够做一些事情。
然后职业前景变得非常棒。所以这也是进入那个领域的另一个动力。但是最初的火花是一个错误的决定被做出了。这就是我开始思考,也许我们可以在这里改进一些系统的原因。
Calmcode
Seth: 非常有趣,我们马上就会深入探讨机器学习。但是,拥有 calmcode 的创造者和维护者,这真的是一个令人难以置信的资源。
[Vincent 笑]
Seth: 不,没什么好笑的。Calmcode 是令人难以置信的。
这是我推荐给每个新数据科学家的前两三件事之一。你将非常复杂的事情分解成清晰、冷静、逻辑和理性的方式是非常有价值的。
Vincent: 很高兴听到。
Seth: 那你能谈谈 calmcode 吗?你为什么开始做它?它到底是什么?给大家一个详细介绍。
Vincent: 首先,很高兴听到你喜欢 calmcode。我很高兴听到它有所帮助。基本上,calmcode 的故事是,在某个时候,我在查看有关数据科学的教育内容。作为教育工作者,我开始注意到有很多垃圾。
举个例子,大约四五年前,关于 scikit-learn 如何工作的第一教程,涉及一个叫做 Load Boston 的数据集,这个数据集是关于波士顿房价的。很多教程使用这个数据集,从你的 O’Reilly 书籍到许多开源包。但当你查看数据时,结果发现他们用来预测房价的一个变量是肤色。
我忘了确切的名称,但它类似于城镇中黑人比例。你不应该把这个数据放到预测模型中。这是一个非常非常糟糕的主意。此外,为什么这个数据集会出现在 scikit-learn 上?为什么这么多人在使用它?
这导致了我很多的挫败感。我还注意到有些企业课程使用 Load Boston,收费高达一千美元一天。你看了之后会觉得,这真是一团糟。然后我想,如果我这么沮丧,也许可以通过把这些东西免费分享出来来获得一些动力。
我知道自己有足够的知识来教授这些主题,因为我以前教过。但我也发现,很多教育内容似乎更关注创作者,而不是把想法传达出去。所以我觉得做一个学习平台会是一个有趣的实验。如果我来做这个平台,我会怎么做?这就是 CalmCode 的诞生原因。
这个想法是你最多只有五个一分钟的视频来解释一个单一主题,这些视频的顺序可以组成一个关于 pandas 的小课程,也可以是关于其他任何东西的小课程。
…对于每一个主题,我都可以问:这是一个平静的工具吗?它是否能让你的日常生活更好?如果答案是否定的,那我就不教这个工具。
我喜欢做 calmcode 的原因是,对于每一个主题,我都可以问:这是一个平静的工具吗?它是否能让你的日常生活更好?如果答案是否定的,那我就不教这个工具,这也是我不教 Spark 的原因之一。因为安装起来真的很麻烦。有时有比使用大型数据工具更简单的数据分析方法。
这只是一个非常有个人见解的学习环境,人们似乎非常喜欢。我收到了很多非常好的反馈。自从孩子出生以来,我做得少了很多。
看到这个小小的爱好项目在没有干扰的情况下保持非常平静真的很酷。每个月似乎有一万到两万人访问。我还经常在会议上收到陌生人请我喝酒。这些事情都很棒。
Seth:是的。这是一个很好的资源。确实是在回馈社会,为数据科学家创建一个学习任何东西的地方。你有没有发现自己回去查看旧的 calmcode 以刷新一些技能?
Vincent:是的。这是另一个原因。calmcode 对我来说很好的一点是,它有点像一个片段库。我知道我做的课程中提到了这些内容,而且我确实需要一个配置文件,它在哪里?
就在今天,我查看了我的 typer 课程,因为我需要“哦,选项是怎么工作的?复制粘贴。”所以现在这几乎也成了我自己的片段工具。虽然不是最初的意图,但似乎确实发生了。
此外,我现在也在为 calmcode 建立搜索功能。这算是一项兴趣项目。我在考虑,嘿,也许搜索功能的主要任务就是找到正确的代码片段,这本身就是一个有趣的搜索问题。
对,确实,我也需要一个提醒。有很多课程。我不能总是把所有的课程都记在脑海里。在这种意义上,我仍然会看我自己的内容。是的。
塞斯:是的。这对你来说是一个很好的资源,你可以使用,它也成了许多其他人可以使用的东西。我在想我第一次使用它的经历。我认为是像 args kwargs 这样的内容,它是网站上最早的几个之一。是的。我会不时回顾它。
文森特:很好。是的。很好。
塞斯:谢谢。
文森特:嗯,那么我希望能做更多的事情。
但简单的事实是,由于有了宝宝,我的生活现在有点不同了。所以,我有很多想法可以用在 calmcode 上。我也有点喜欢这个项目的原因是,即使我不投入任何精力,网站仍然会运行。对吧?所以这也是它的平静设计的一部分。
我真的喜欢有一个不容易出错的兴趣项目。如果有任何问题,也很容易修复,因为它只是一个静态网站。这使得它非常简单。
塞斯:如果没有时间限制或资源限制,你会做什么来改进 calmcode?
文森特:我特别想做几个课程。其中一个就是嵌入,我觉得这似乎有一点炒作,但你也可以让嵌入做不同的事情,了解它们为什么有效。不过它们并不能解决所有问题,我可以做一个有趣的课程,从字母嵌入开始,逐步过渡到其他嵌入和图像,然后还展示它们可能失败的情况。我认为这会非常酷。
贝叶斯 MCMC [马尔可夫链蒙特卡洛] 的内容,也希望能有,因为你可以创建非常精确的模型,这是一种不够被重视的技巧。
我还希望在网站上增加一个新部分,专注于演示和基准测试。我认为很难做错基准测试。所有基准测试都有偏差,但有些可以非常有洞察力。我认为庆祝一下这个部分也会很有趣。我已经准备了几个例子,但我没有时间去实际制作它们。
但像,嘿,你可以做些什么来让数值算法收敛得更快。标准化真的有帮助吗?只是探索一下这些问题可能会非常有趣。
像这样的事情在我的脑海中。总是有东西可以做。还有,另一个我在玩的是,像,是否与其他人合作这个项目会有趣?也许吧。我不知道。但当然,没有时间上的压力。所以如果我现在不花时间在上面也没关系。这也是不错的。
开源
Seth: 是的。太棒了。稍微转换一下话题,谈谈你的开源工作。我认为我第一次接触到你的库是 bulk。也许之前还有其他的,但这是我真正使用的第一个。然后你还有 embetter、human-learn、whatlies、doubtlab 和 cluestar。这些是我最熟悉的。我知道还有另外两三个。
Vincent: 是的,目前大约十几个。
Seth: 你什么时候决定一个项目值得成为开源库?当你认为它是一个工具时?
Vincent: 这有助于稍微解释一下开源的起源。所以我第一个发布在 PyPI 上的开源项目叫做 evol,基本上是一个用于进化编程的 DSL。我和我的一位同事一起制作了它。这个想法很有趣,我想拥有自己的小库。
所以我在寻找一个问题。然后我发现,如果我有一个人口对象和一个进化对象,并且这两者可以以很好的方式互动,那么制作遗传算法非常简单。好吧,很酷的库,我做了一些关于它的讲座。
但后来,我自己学会了如何制作 Python 包。然后我成为了一名顾问,开始注意到在不同的客户处,我会编写相同的 scikit-learn 组件。因此,我觉得我需要一个包含这些组件的库,因为我不断重用它们。这就是 scikit-lego 的由来,也是我熟悉 scikit-learn 生态系统的过程。
然后,我开始在 Rasa 工作。在那里,我们进行大量的句子分类基准测试,因为 Rasa 构建聊天机器人。当你构建聊天机器人时,句子进入系统,我们需要确定意图。好吧。因此,我写了一些基准测试工具,因为这是我需要的,而其中一些可以开源。
Whatlies 就是一个例子,因为我想要一个库,可以非常快速地拥有许多非英语嵌入,并查看它们是否更好。然后发现 Rasa 周围有一个非英语社区,他们对此非常感兴趣。
所以我能够构建一些 Rasa 插件来支持所有这些非英语工具。然后在某个时候,我开始维护自己的库,然后我发现我需要为我的文档添加一些单元测试,因为我不想让文档出现问题。因此,我制作了一些工具来帮助我做到这一点。Mktestdocs 就是这些工具之一。
我注意到 Rasa 的测试运行得非常慢,所以我制作了 pytest duration insights,以便找出哪些测试最慢。你可以看到这些东西是如何累积的,但这总是因为我在解决另一个问题。我的首选方式是在公开场合进行操作。
当然,也有一些工具我不能公开展示。我在一家公司工作。有些工具是私有的。这没问题。但大多数时候,我遇到一个问题时,我只是希望以后能够用非常少的努力解决它。因为我之前做过包,所以重复这件事变得非常简单。
这也是疑问实验室的形成过程,以及embetter的形成过程,老实说,也包括 bulk 的形成过程。只不过在某个时刻,我意识到我需要这个工具来完成工作。它很好用,所以我们就打包它,公开构建,这对我来说效果很好。这就是主要的故事。
塞思:是的,非常酷。这是一个很棒的故事。看起来,创建一个工具,你积累了某些技能,然后一个事情引出了另一个事情,这样它就不那么难了。
一旦我猜测,你大概有三十多个惊人的工具来添加那个第 37 个工具。
文森特:是的,但我确实想做一个评论,因为我确实认为,通常来说,如果我回顾一下我访问过的公司,以我的顾问背景来看,我确实认为没有足够的人创建自己的 Python 包。
例如,假设你有一个 pandas 查询,需要处理时间序列或在某个非常特定的数据库上工作。那么,从数据库中读取数据的函数可能是一个需要重复使用的函数。也许你还需要添加会话,或者你有一个非常特定的机器学习模型需要重用。
对于所有这些实用工具,你不希望它们存在于笔记本中。你希望它们存在于 Python 包中。我看到并不是所有人都创建自己的内部工具,这我认为是个遗憾。当时我和一些成熟的同事在一起,我们会在内部编写自己的 Python 工具。
…你可以比你想象的更频繁地创建 Python 包。所以,即使是为了你自己在 pandas 中喜欢使用的小助手函数,也可以创建一个。
由于我们有这样的习惯,对我来说,制作一个公开的工具也变得相当容易。所以,这也是我对更广泛的群体的建议,你可以比你想象的更频繁地创建 Python 包。即使是为了你自己在 pandas 中喜欢使用的小助手函数,也可以创建一个。这是一个完全合法的使用案例。
Bulk
塞思:是的。深入到我使用最多的那个工具——bulk。你能谈谈 bulk 吗?它的工作流程和要求是什么?涉及了哪些机制?
Vincent:是的。所以也许可以有趣地解释一下那个库是如何偶然出现的。我有一个叫做 human-learn 的库。它有几个非常酷的功能,但 human-learn 的核心是,作为一个人,你现在可以在不了解机器学习的情况下制作 scikit-learn 模型。你可以做的一件事是将一个 Python 函数转换成一个 scikit-learn 兼容的组件,这非常有用。所以你可以对 kwargs 进行网格搜索等等。
不过,我觉得很酷的一点是,通常你会看到一个图,那里有一些蓝点,那里有一些黄点,还有一些红点。人们说,这就是我们需要机器学习的地方,然后算法对它们进行解析。但我觉得,你知道,你可以直接在绿色点周围画一个圆圈,在蓝色点周围画一个圆圈,然后将那个圆圈转换成一个 scikit-learn 模型。所以这就是 human-learn 的一个特性。在 human-learn 中,我们有 bokeh 组件可以从笔记本中做到这一点。
当我在做那个项目的时候,我也在 Rasa 上处理 whatlies 的所有词嵌入。然后某一刻,我开始意识到,当你将这些词嵌入传递到 UMAP 时,你会得到这些簇。然后我想,哦,我只想选择它们。哦,等等。我有一个叫做 human-learn 的工具,它正好可以做到这一点。
在大约一个小时内,我在一个笔记本中完成了这个功能。然后,我把它展示给了一些同事,他们都说:“这非常有用,Vinny。做得好。”所以这是一个分享了很多的笔记本。
现在,我不再在 Rasa 工作了,我开始在一家叫 Explosion 的公司工作。我们有一个注释工具。我觉得再次做批量处理的技巧,但不想在笔记本中使用它。所以我把它变成了一个可以在本地运行的小型 Web 应用程序,这是我喜欢在 Prodigy 中开始注释之前使用的预处理步骤之一。你只需将数据嵌入到一个 2-D 图中,使用 UMAP,然后你通常会看到簇,你尝试探索那个空间,进行选择,仅此而已。
这是进行批量标注的非常好方法,因为这些嵌入的簇往往会出现。这基本上就是整个技巧。这些批量标注技术,虽然它们有用,但并不完美。它们对我来说足够实用,可以在一个小时内开始。这就是它的力量。过去需要我六个小时的工作,现在只需一个小时。
这是一个只对开始时有效的小技巧,但我在很多新的数据集上经常使用它。所以对我来说,它完全解决了一个问题。批量功能也是这样一个项目,我希望有更多的时间去修复一些粗糙的地方,但它是一个完全有效的小窍门,我喜欢使用它。似乎有一小部分人也非常欣赏这个工具,尤其是因为它不仅处理文本,还处理图像。开箱即用,它就是这样做的。
塞斯:非常酷。是的。我在笔记本中使用过批量功能。我知道我曾联系过你,你非常慷慨地花时间帮助我在不同环境中运行它。
文森特:是的,第一个笔记本确实很有 bug。这确实是真的。我确实记得那一点。
塞斯:依然很有效。
文森特:是的。嗯,在 Rasa 的时候,我养成了制作这些视频的习惯。所以,批量功能还有一个附带的 YouTube 视频,这也是很多人发现它的方式。我觉得有一个库恰好有那个笔记本,而且现在还在获得星标。
但我现在推荐大家使用命令行工具,因为这样干扰更少,稳定性也更高。
塞斯:是的。有趣的是,当我将很多工作从笔记本迁移到脚本时,我再次遇到了批量功能,现在我更多地使用网页版应用。我喜欢它们,它们都是很棒的工具,你提出了一个好观点。
有时候,降低开始解决问题的门槛是非常重要的,因为这样你就能开始推动事情发展,开始有一些想法,并且能够取得有意义的进展。我喜欢它的一点是,通过探索数据,你开始建立一些直觉,你会想到,“哦,这些可能是一些潜在的类别。”
文森特:确实有一个人的参与学习方面,我认为这也是非常有用的。尤其是当他们给你提供一个新的数据集时。是的,你可以开始把它丢进算法中,这样[没问题]。但真正理解数据集中的内容通常是最耗时的。而且,作为批量工具的副作用,你至少能接触到这些集群。这本身就很有用。
现在,你可以对句子和图像进行批量标注。我正在致力于将这一功能扩展到短语以及文本中的子字符串。因此,现在我可以嵌入整个句子,但我希望能够做到的是,我还可以说,取出该句子中的每个名词短语,并为其创建一个小点。因为这样一来,如果你有兴趣做命名实体识别或类似的事情,我们也可以为你进行批量标注。
尤其是像视频游戏这样的东西,可能是缩写——《星球大战》是两个标记。如果我们能把它变成一个短语,那就太好了。在我们公司 Explosion,我们有很多技巧可以完全解决这个问题。只是我需要一个下午的时间才能在大批量中完成这项工作。
不过这些都是在计划路线图上的内容,我确实对解决这些问题感兴趣。
理解问题
塞斯:是的。我注意到你的一些工作大多集中在创建高质量的数据集上。但在此之前,需要实际了解问题。我观看了你的一次 PyData 演讲,基本上是在重新表述问题。
你举了一个关于有人在寻找豆子、牛肉和面包的问题的绝佳例子。
文森特:哦,是的。
塞斯:你能谈谈那个吗?
文森特:所以这不是我的故事。我实际上遇到了在世界粮食计划组织做运营研究的人。他们面临的问题之一是[处理]世界上的饥饿问题。有时候,一个饥饿的村庄会说,我们需要更多的豆子或鸡肉,或者对某些产品有需求。然后世界粮食组织所做的一部分就是尽可能便宜地采购这些食品。
还有成本方面的问题,比如物流。我们能把食物装上卡车吗?租车的费用有多高?还有所有的物流。正如那个人所说,他们最初定义问题的方式是错误的,因为当一个人说,我需要豆子,是的,他们可以这么说,但他们需要的不是豆子,而是营养。而豆子富含纤维和蛋白质。
好的。还有其他食物,比如扁豆,也富含纤维和蛋白质。如果我们在对抗饥饿,那我们不会太挑剔是否得到豆子或扁豆。也许如果我们这样做,我们可以在不需要造船厂的情况下获取食品,我们可以直接发货。
通过重新定义这个问题,我相信他们得到了大约五%的成本减少,这对于一个已经花了多年时间来优化的操作来说是个极高的数字。获得五%的成本减少几乎是闻所未闻的,但这基本上是因为他们在解决错误的问题。我的理论至少是,这个故事是发生在世界粮食计划组织的一个人身上的一个轶事。通常情况下,这种重新表述问题的行为是非常有用的,也许我们做得还不够。
在 NLP 中的一个例子,我们有时在支持论坛上看到的问题是,比如说,他们有一份简历想要解析。然后他们说,我想要每份工作的开始日期和结束日期。因此,我想要一个能够检测开始日期的算法。你知道,你可以建立一个能够检测开始日期的算法,这没问题。但如果你将问题重新表述为,首先找出所有日期,然后再确定哪个是开始日期,哪个是结束日期,那么第二个问题就变成了,开始日期可能在前面,结束日期可能在后面。如果你将问题重新表述为两步走,整个问题就变得简单多了,而不是考虑成端到端。
还有很多这样的机会人们会忽视。我再次回到 calmcode,我担心部分机器学习教科书要负部分责任,因为很少有机器学习书籍实际上告诉你,如果忽略一半的数据更有意义,你可以选择忽略。你可以选择解决一个更容易解决的不同问题。但这似乎不是我看到的思维模式,尤其是新毕业生。这有点遗憾。
但关于世界粮食计划署的故事,我必须相信那个在台上告诉我这个故事的人,但这确实发生了。比如,世界粮食计划署通过重新表述一个数学问题找到了一种减少运输成本五个百分点的方法。这绝对是现实生活中会发生的事情。
“不是算法拯救了这一天,而是对世界的理解。如果用在错误的问题上,更好的算法会产生更糟的结果。”
塞斯:对,没错。在这样规模的工作中,任何形式的减少,五个百分点的减少都是巨大的。我最喜欢你在那个演讲中说的那句话:“不是算法拯救了这一天,而是对世界的理解。如果用在错误的问题上,更好的算法会产生更糟的结果。”我真的很喜欢这句话。
文森特:哦,很高兴听到这个。所以,这个故事中还有更多的轶事。但如果有人对这个感兴趣,有一位运筹学家,[拉塞尔] 阿科夫。
他写了一篇论文,标题是《运筹学的未来已经过去》,这是他在八十年代写的。它基本上概述了为什么运筹学算法可能会失败。原因与这个轶事有关。我提到这个是因为这些论点对于数据科学也适用。这篇文章虽然是八十年代的,但每个人都应该读一读:运筹学的未来已经过去。
我写了一篇类似的文章,叫做 数据科学的未来是过去,只是重复了一些这些论点。但人们常常忘记算法——它通常只是系统中的一个齿轮,我们关注的是建立一个更好的系统,而不是一个更好的齿轮。所以如果你在构建一个更好的齿轮,但它与其他部分不匹配,那它就不是一个更好的齿轮,因为你没有得到一个更好的系统。
但人们常常忘记算法——它通常只是系统中的一个齿轮,我们关注的是建立一个更好的系统,而不是一个更好的齿轮。所以如果你在构建一个更好的齿轮,但它与其他部分不匹配,那它就不是一个更好的齿轮,因为你没有得到一个更好的系统。
Akhoff 在他的书中做得非常好的一点是,他基本上解释了很多系统理论。在那里有一句我推荐人们多考虑的话,也许不要想着去制造一个更好的齿轮。不要想着“嘿,也许系统中有一个部分可以优化。”也许尝试看看你能否改进两个部分之间的沟通。因为从系统的角度来看,通过这样做,你实际上是在优化两个方面。
同时,你也在获得清晰度,这总是好的。这种通过将问题简化为一个单一的数字而忽略其他因素的思维方式,通常是数据科学中人们迷失自我的一个陷阱。
Seth: 是的。这非常有趣,因为我觉得有很多时候,人们处理问题时有时会专注于不同的模块,他们有一种模块化的思维方式,他们会想,哦,如果我把这个东西做到最好,那么整个系统会更好。在某些情况下,这会带来巨大的改进。但有时,理解支持系统及其集成方式非常重要。这让我想起,你必须有良好的集成测试,确保一切都适合系统。
Vincent: 这里有一个小故事,bol.com 的前首席执行官在他的自传中写了这些内容。所以,bol.com 就像是荷兰的亚马逊。亚马逊在这里并不那么大。bol.com 基本上就是亚马逊,不过是蓝色的,而且是荷兰的——这是我们这里的一种现象。
但他们在某个时点雇佣了他们的第一位数据科学家。这本书中有一章讲述了这个——当我们迎来第一位数据科学家时发生了什么?在书中,第一位数据科学家被描绘成一个有点傲慢的人。总是抱怨说这些人类不如我的算法。
他做的事情之一是他发现了一个最佳时间来推文关于新视频游戏发布的时间等。所以这就是他做的事。在荷兰,我们有一个叫做纪念日的节日。我相信是七点钟,也可能是八点,但在纪念日,我们纪念第二次世界大战。基本上,全国上下会有两分钟的沉默。
你可能见过一些照片,骑自行车送披萨的人会下车,站着静静地待两分钟。这是人们非常认真对待的事情。所以,在纪念日的七点钟,推文关于新的《使命召唤》射击游戏的时间会非常糟糕,而如果你推文说你对在纪念日射击人感到超级兴奋,那将特别糟糕。但这正是发生的,因为他的算法确定七点钟是开始推文这种事情的最佳时间。
这些故事非常多,对吧?单独看,纸面上,我不一定能责怪数据科学家做了他或她的工作。但这就是系统的问题。组一担心可能会出错,组二则不担心。
如果你让他们相互交流,那么通常世界会变得更美好。这是我会说的主题。
塞思:当你得到问题的答案时,你必须问自己,这有意义吗?这有时是很多人跳过的一小步,但非常重要。
文森特:我确实想承认,这也是困难的,对吧?我认为调用.fit 和.predict 是简单的部分。
这都是围绕这个主题的东西。要复杂得多。尤其是当你考虑公平性主题、所有可能出现的问题时,我们真的能事先知道吗?我不知道你是否总能做到。
不过要提到一个项目吗?这个项目叫做deon,有一个Deon 清单。还有一个calmcode 课程。
Deon 是一个数据科学清单。就是一些在不同公司出现过的问题,有报纸文章解释情况变得多么糟糕。他们有一个清单,类似于“嘿,在上线前检查这个,因为可能会出错。”对于清单上的每一项,他们还有两篇关于过去发生的事情的报纸文章。因此,作为数据科学家,你可以去找你的老板说:“我想要[最小化]风险,因为这实际上出了问题。”
这是一个非常酷的项目,因为他们实际上进行了适当的轶事收集,这在当今时代是一个强大的行为。
机器学习中的未解之谜
塞思:是的。一百个百分点。在数据科学中与任何事物相关联的故事总是有价值的。
回到整体讨论机器学习的话题,您认为在机器学习中还有什么重要的问题未得到解答?
Vincent:好的。所以我在 PyData Afterparty 上喝酒时,几个人找到了我,而这些人是我认为相对资深的人。他们对自己的领域很了解,他们让我预测机器学习的未来。
我当时感觉像是想开个玩笑,因为,知道的,你在酒吧里。我当时不太想深入探讨这个问题。作为玩笑,我想着说,“你知道我对数据科学未来的看法,人们将真正意识到我们领域中的大量废话。也许我们应该彻底停止。”
但我决定再考虑一下,我会说,实际上这一点确实有些道理。我确实有点担心,我们做的很多事情更像是炒作,而不是我们是否真正理解了问题。
那么,机器学习中缺少什么?好吧,也许我们做得太多了。这是我一种感觉。
当然,未来机器学习会有一席之地。这肯定会发生,但它不必成为一切。这有点是我担心的事情。
有位作者写了一本关于人工奇怪现象的书。就像人工智能可以产生的所有奇怪废话一样。
这本书叫做 你看起来像个东西,我爱你,作者是 Janelle Shane。读一读。这本书一开始提到我有这些 Tinder 文本,我想让一个算法找出最佳的 Tinder 文本发送出去。然后算法给出的结果是,“你看起来像个东西,我爱你。” 这有点搞笑且聪明,但我认为这不是你在 Tinder 上应该发送的内容。
但这本书充满了这些例子,你要小心人工愚蠢现象也在同时发生。对吧?有很多这样的例子。比如,《使命召唤》就是一个例子。
我发现自己有点像那个对一切都不满的老人,像是在对着云发牢骚。感觉有点像,“当然,机器学习有它的位置,但我们能先不依赖它吗?”先尝试简单的方法,因为这是人们似乎常常忘记做的事情。对我来说,这才是更紧迫的问题。
Seth:与自然语言处理领域现在所有发生的事情,包括生成模型和 ChatGPT,类似的观点。你如何看待炒作与现实之间的差距?我很期待听到你这个老顽固的看法。
Vincent:所以我实际上在专业上玩这些东西。如果你查看一下,Explosion 仓库现在有 openai/prodigy recipes。这就是仓库的名字。所以我们正在稍微尝试一下,比如,嘿,ChatGPT 能不能说,这里有一个句子,检测所有的日期。
以便我们可以在我们的 Prodigy 界面中预先高亮显示。这是我们现在正在探索的事情。结果发现,它在一些例子中确实非常好,而在其他例子中却很差。我们还不完全理解为什么。
但我承认这可能非常有用。如果这能让你更快地获得更好的训练数据,因为标注只是说“是”或“否”比高亮每一个用户界面中的项目要快,这似乎完全可以接受。
我觉得更值得关注的是,人们有时会说:“哦,这很神奇。这就是它的工作原理。这是魔法。”这不是魔法。这在某种程度上有点像马尔科夫链,它只是预测下一个词。你可以想象,如果你给它足够的文本和计算能力,你可能会让它生成非常可信的文本,像你在互联网上找到的那样。然后你可以问,比如,它是否在概括?还是只是记住?
空中漂浮的魔法由稳定扩散 v1–4生成
这些问题都是公平的,但这还不是智力。这还不是实际的推理。我有很多愚蠢的例子可以证明,实际上并没有真正的智力在运作。
话虽如此,只要有一个人参与其中,并且它被证明是有用和高效的,我认为这是可以的。但话说回来,那是当我带上职业眼镜时。显然,我认为还有一些有害因素需要考虑。你绝对可以批量发送更多的群发邮件,也许还能有更多的 Twitter 机器人,还有那些我不太喜欢的东西。
总之,这只是一个方面。另一件我也许想强调的事情是,我也尝试了 Midjourney。我尝试生成《万智牌》卡片。
Seth:好吧。我见过这些,它们非常有趣。
Vincent:我觉得有趣的是,某一刻我想说,嘿,让我们制作一些办公室里的《万智牌》卡片。你会有一个兽人领主产品经理,一个兽人风险投资家,还有一个兽人 TED 演讲者。这个想法立刻就很有趣,因为如果你想到办公室,你会想到一个沉闷的灰色西装。如果你想到兽人,你会想到《魔兽世界》和像是战争狂人等等。所以,这真的很有趣。
但接下来的问题是,我们是否能生成真正搞笑的图片?这证明是有些困难的。所以我有一张铁甲兽人的图片,基本上完全覆盖在铁网中,坐在电脑后面。你可能会觉得,数据工程师,还不错。这已经挺搞笑的了。
但我想让这个兽人是一个数据分析工程师,因为他们在谈论数据湖。然后我认为有趣的事情是一个沉重的铁甲兽人,但头盔上冒出一个小黄呼吸管。这会是最搞笑的事情。我拼命尝试也没能生成一个黄色的呼吸管。
然后你开始思考,为什么会这样?接着你也会想,比如说,文森特,你已经在办公室里把《魔兽世界》地下城和龙的风格结合在一起了。那两种风格甚至兼容已经很牵强了,更不用说你还生成了一些奇怪的呼吸管了。对吧?
所以如果人们认为这些工具像魔法一样,我的最佳建议是试着想出一个尴尬的奇怪任务,触及算法在舒适范围内的边缘,这通常会给你一些示例,帮助你理解这实际上并不是魔法。它只是试图记住,试图生成它之前见过的东西。有很多边缘情况的示例,这种东西就像是“你看起来像个东西,我爱你”。读那本书。书中有很有说服力的例子,风格也很可爱。我强烈推荐。
生成性和预测性机器学习
塞斯:谢谢。是的,我会去查看。我认为生成模型非常有趣,因为不同于预测模型,例如你在做文本分类时,你可以知道是否正确?通常有一个真实的标准。而在生成模型中,比如说你想创建一个戴着呼吸管的兽人,你怎么知道它是否正确?
这不是那么明确。
文森特:你实际上需要多少标签的无关照片才能生成这个?对吧?哦,不过这里的解决方案的一部分显然也是用户界面。你可以用文本作为输入做出惊人的事情。但在这种情况下,你也没问题。我们快到了。我只想选择头盔周围的区域,在那里需要出现一个黄色的呼吸管。
这样的事情在某个时候会发生,这将使这些系统变得更好。然后我可以继续处理企业精灵,解决其他边缘情况。对吧?这将是一个持续的过程。
但,是的,一般来说,因为你提到了真实情况——真实情况也很棘手。这也是许多人工愚蠢产生的原因。对于我个人的不满——所以考虑一下,图像分类,那些著名的猫狗问题:这是一张狗的照片还是猫的照片?
来源:Catdog Logo 维基百科
标准分类会说,这这是一个二分类任务。但随后你可能会想,我们可能有没有猫或狗的照片。那么,我们需要三个类别吗?好的。那么,如何处理既有猫又有狗的照片呢?哦,对,这也可能发生,对吧。
好的。现实更复杂。那么我们该怎么办?
好吧,也许我们需要问,照片中有没有狗?有还是没有。照片中有没有猫?有还是没有。也许这些应该只是两个二分类器。也许那样更合理。那么,当照片中有四只狗时怎么办呢?
再次强调,你越是思考,你会发现,即使是定义明确的文本分类也不总是与现实相符。即使你有真实标签,你也要考虑,真实标签可能也与现实不符,因为句子可能涉及多个主题,照片也可能涉及多个事物。
所以退一步真正思考一下,有些问题可能只是细节,只要我们真正理解问题,但也许我们应该专注于此。也许我们应该跳过超参数调整,只关心——我们真的理解问题吗?
赛斯:是的。这确实是一个很好的观点。我认为,当你面对一个问题时,人们往往会跳到解决方案上。如果你正在做文本分类——哦,好吧。我打算创建一个多分类文本分类器。结果是,这从来没有那么简单,对吧?
这实际上是多标签的。我应该使用层级结构吗?我应该这样做吗?还是那样做?你知道,深入理解问题总是能帮助你发现更多。这比对原始多分类文本分类器进行超参数调整要有价值得多。
“模型可以进行一步操作,但如果需要的话,你的系统可以进行两步或三步。因此,绝对可以考虑这种两步系统,其中我们有几个分类器来检测几个属性,然后我们有一个基于规则的系统,它会说,‘好吧,这种组合看起来很有趣。我们试试这个。’人们往往忘记了可以在其上构建的基于规则的系统。这有点被忽视了。但通常情况下,这也是解决问题的方法。”
Vincent: 嗯,总的来说,我确实有一些通用的建议。我在 Prodigy 论坛上,帮助一些 SpaCy 用户解决问题。我在这个领域给出的最通用的建议是,考虑一下也许模型可以做一步,但你的系统可以在需要时做两步或三步。所以绝对可以考虑两步系统,其中有几个分类器检测几个属性,然后我们有一个基于规则的系统,接下来会说,“哦,好吧。这些东西的组合似乎很有趣。我们就这么做吧。”
人们常常忽视可以在其基础上构建的基于规则的系统。这有点遗憾。但通常来说,八成的情况下,这也是解决问题的办法。所以亲爱的观众,可以根据这些信息做出决定,但我确实认为一般来说,两步法绝对有效。
Seth: 我认为这特别好的建议,尤其是在深度学习的热潮中。我觉得我们仍然处于一个寻找机器学习模型和启发式方法之间最佳组合的世界中,有时候即使是相当基础的启发式方法,也常常能产生最佳结果。
影响
Seth: 现在我们来谈谈从机器学习中学习的部分。我们从这里开始。在机器学习领域中,有哪些人对你产生了影响?
Vincent: 我有一些非常可爱的直接同事,我现在仍然与他们保持联系。显然就是这些了。刚开始的时候,我在学习 R,所以 Hadley Wickham 是我非常仰慕的人。我还在几次机会中见过他,这真的很酷。他在五年前开设了一个高级课程,我是助教。非常棒的经历,我见到了这位大人物。
Katharine Jarmul 是我想到的另一个人。她是 PyLadies 的发起人之一,同时也是机器学习隐私和公平的积极倡导者。她曾经为我的几场演讲审阅过幻灯片,她真的是太棒了。我想起她了。
我认为 Vicki Boykis 是最有趣的人之一——她在垃圾信息发布方面应该获得更多的认可,她真的很棒。NormConf 事件也是她帮助启动的一个了不起的项目,非常精彩。
然后 Bret Victor 我认为有我见过的最好的演讲,也是我将来可能看到的最好的演讲。 编程的未来 是 Brett Victor 的演讲。这是我基本上每年都会观看的内容。这是我见过的最令人惊叹、最具启发性的东西。我不会告诉你具体内容。就去看看吧。
Seth: 我很期待。
文森特:然后,我想,[拉塞尔] 阿科夫,但阿科夫的主要问题是我完成了整个运筹学的硕士学位,然后一位教授要退休了,我是他聚会上的发言人之一。后来他提到他想要我来这里的原因是因为我真的让他想起了阿科夫。我当时想“他是谁?”
“他是一个了不起的人。赶紧买他的书。”然后你读到这些东西。他就像我在 80 年代一样。所以这绝对也是一个很好的灵感来源。
…普通人非常有启发性,但普通人并不认为他或她应该上台。
我想提到的一点是,当我组织 PyData 时。你会想,“好吧,谁是好的主讲人,谁是好的受邀讲者等等。”我的印象是普通人非常有启发性,但普通人并不认为他或她应该上台。
最好的例子是在 PyData London 上,有一个普通的讲座,讲者在婆罗洲的雨林中为寻找濒危的猩猩而制造无人机。
塞斯:哇!
文森特:他有一个小房间,但他的演讲非常棒。所以我想,算了,你是阿姆斯特丹的主讲人。这是我听过的最惊人的事情。这是你的爱好。
所以他是第二年的主讲人。他感激不尽,玩得非常开心。但他没有意识到那确实是主讲材料。类似地,我读过一篇博客文章,讲者试图找出哪些词最具金属感。
他的方法是通过对金属歌词和非金属歌词进行大规模马尔可夫链训练。博客文章的结论是,最少金属的词是“合作”,因为它只在语料库中出现了一次。你读到这些内容,真是太棒了。因为你基本上是在一个相当幽默和傻乎乎的问题上正确地应用理论。
但这里有激情。当我接触到他时,[我说] 你真的需要申请 PyData。我不需要审查你的东西,我认为你会被接受的。
他只是没想到这是他可以做的事情。我喜欢认为有很多人遭受这种情况,他们可能有一个非常宏伟的启发时刻,但不认为自己能分享出来。当然,有些人确实是内向的,这也没问题。但我在 PyData 上学到的一课是,灵感确实可以来自你意想不到的惊人角度。所以不要过于关注大名鼎鼎的人物。
这也是一个问题。
塞斯:是的。最好的那种人非常谦逊,他们对自己的工作做得非常好,你可以看出他们多么关心自己所做的事,以及他们对工作的认真程度。我不知道“自豪”是否是正确的词,但他们非常认真地对待自己的工作。他们很在意…
Vincent:他们在乎,是的。你可以是最聪明的人,但如果你对你的话题不在意,那将不会是一个很棒的演讲。
假设你可能走了一些捷径,但你计算出了最佳的宝可梦。我不知道,就类似的事情。这仍然可以是一个很棒的演讲。
再次提到,更多人应该这样做。如果人们对写博客和做演讲感兴趣,考虑一下闪电演讲和非常短的博客文章,称为“今天我学到了”。世界上确实需要更多这样的内容。我很高兴看到 PyAmsterdam 一年一度的闪电演讲聚会,十个人进行五分钟的演讲。
那些聚会往往非常精彩。任何 PyData 的组织者如果在听,请随意借鉴这个想法。这些聚会总是很有趣。
职业建议
Seth:非常酷。所以你已经给了很多建议,但我想问一下,你收到的哪个建议或某些特别突出的东西帮助了你在机器学习或职业发展中?
Vincent:我在职业生涯早期就得到了这个建议。我以前的 CTO 现在仍然和我一起,他在我二十三岁时给了我相当好的职业建议。他说,“小心加薪。因为如果你的工作开始赚很多钱,但有些乏味,那么金钱可能会成为你留在那里的原因。”
点击这里查看视频 ## 早期职业生涯中要小心加薪
因为如果你的工作开始赚很多钱,但却有些乏味,那么金钱可能会成为你留在那里的原因。点击这里查看视频
这在职业生涯早期是个危险的事情,因为你可能需要弄清楚你生活中喜欢什么。也许你需要搞清楚是什么让你有动力。如果你过度关注金钱,这有点像过度关注指标。你可能会过度优化一些可能不那么重要的东西。所以这是一条很酷的建议,有点元方面的。但我确实认为,我已经能够很好地应用这些建议。
再次说,我在这里很幸运,对吧?但我已经能够应用这些建议,这真的很棒。
这是一个有点奇怪的轶事,但它也令人惊讶地充满了启发。我有很多朋友在数据科学方面什么也不做。我很喜欢这样。我是书呆子 Vincent,当我和他们喝啤酒时,他们会说,别做书呆子 Vincent,你现在在正常人中间,可以谈谈生活了。
我住在一个你基本上认识所有邻居的社区。这个社区仍然是中产阶级社区的一部分——因为城市化它在变化,但我们彼此都认识。所以我街上有一个人,他是个画家。当天气好的时候,他会在家门外的长凳上放一箱啤酒。
整条街的人基本上都会去喝一杯。真的很可爱。最可爱的社区。但问题是他最近成为了独立承包商,也意味着他买了他的第一台笔记本电脑,而他已经四十二岁了。
他需要帮助,不仅仅是他的网站,还有像启动词这样的问题。他的一生中,主要的计算机是他的手机,他一直使用它,但他发现计算机非常复杂。说实话,我觉得这真是一个令人耳目一新的事情。也提醒我们,我对计算机的体验不一定要是正常的。这是一个非常有用的提醒。所以,从某种意义上说,这是最好的灵感。
也许不要总是沉浸在机器学习中。这是我的建议。尤其是当你为普通人使用的应用程序做机器学习时。记住他们其实并不在乎你的算法。真的,他们不在乎。他们真的,真的不在乎。
我发现自己有时陷入机器学习的泡沫中。我发现[走出这个圈子]非常清新。
我以前也在咨询工作中做过这个。我正在制作一个卡车司机用于物流的应用程序。有时候,我会去卡车司机们聚集的吸烟角落,了解他们是什么样的人。还要了解他们对应用程序感到沮丧的地方,更多地做这些。更多地成为一个人际互动中的环节。
我正在尝试更多地关注人性化的方面,这让我感到非常有启发。
对新数据科学家的建议
赛斯:是的。我真的很喜欢这个。对于那些刚刚开始这个领域的人,比如说,他们刚刚被聘为初级数据科学家,或者他们正在考虑开始从事数据科学工作,你会给他们什么建议?
文森特:好的。那么第一步,我在 NormConf 上做过一个关于这个主题的讲座。这个讲座标题为让一天变得精彩的 Group-by 语句。这个讲座正好为你设计的。
话虽如此,我其实是一个很差的职业建议提供者,因为回顾过去,我觉得我今天所处的位置很大程度上是由于运气,而运气是很难优化的东西。
我认为一般来说,有一个自己的博客,分享你今天学到的东西,可能会很有用。所以,就像 calmcode 在某种程度上仍然是我的代码片段库一样,你的博客也可以是你的代码片段库。总的来说,我发现对于这些“今天我学到了什么”片段——如果你能够每月写两篇,可能每篇需要半小时,而不是一篇需要几个小时的大博客,这件事不应该超过几十分钟。但你这样做了一年,就会有一个包含 24 篇文章的博客。
如果你在学习并且能够分享知识,那么人们会认可你确实有一些履历表明你在学习东西。所以,如果你想以较低的努力获得一定的在线存在感,这似乎是件相当简单的事。这是我推荐的做法。
我确实认为,如果你是刚起步的超级初级人员,我想承认这有点困难。现在的[招聘市场现状]有点让人遗憾。但是,你可以做的一件事是考虑一下,你不需要知道所有东西才能得到工作。
你也可能能找到相关的工作。我给那些想进入数据科学领域的朋友的一些建议是,学习 R 可能比学习 Python 稍微容易一点,做一两年的分析师可能也会更简单一些。
而且你作为分析师学到的所有技能,如果你想以后成为数据科学人员,都将非常有用。所以,如果更容易并且你能从中获得报酬,不要优化头衔。只需优化你在工作中学到的东西。这似乎更容易。作为一个优秀的分析师没有什么错。
也许我们需要更多优秀的分析师,而不是优秀的数据科学家。对吧?也许我们需要更多拯救一天的 group by 语句。提示,看看这个演讲。
但我确实认为在职位头衔上有一点虚荣。“比如,我是超级高级的员工,超级工程师。是的。”但如果你只是一个真正称职的分析师,我们需要更多的优秀分析师。这也没关系。去争取吧。
从机器学习中学习
Seth:是的。这确实是个好建议。现在我们都在等待的问题是,机器学习的职业生涯教会了你什么人生道理?
Vincent:有些问题在你忽视它们时会自行解决。说真的,我经历过很多这种情况,问题通过忽视机器学习部分得到了解决,你会开始怀疑,也许有些问题真的能在你忽视它们时自行解决。
我在几个实例中注意到,情况确实是这样的。特别是当你有一个孩子时,你确实会学到一些东西,也有可能过度优化一些事情。而且,比如说,哦,宝宝睡不好。嗯,这个问题会在某个时候自行解决。并不是说我这边的影响会在那方面产生非常显著的影响。
我想机器学习也一样。有些事情你可以控制,有些事情你无法控制。只要确保你理解自己能控制和不能控制的东西,然后从那里继续前进。
再次说,我对整个机器学习的看法有些复杂。部分原因是我认为它是一个非常有用的工具,我们需要更多优秀的人来从事机器学习。但同时,它也像一个令人厌烦的炒作桶,我们真的希望减少这种炒作。我日常的工作就是处理这两种感觉。
我希望这在某种程度上回答了这个问题,但这就是我的情况。尽量冷静地做,这就是我的最后一句俏皮话。这也是我可能会推荐的。
塞思:说得对。我认为有些问题随着时间的推移会自行解决。我还喜欢机器学习的第一条规则:你真的需要使用机器学习吗?
文森特:是的。我同意。还有一点我真的可能要为雇主稍微夸耀一下。
我非常喜欢 SpaCy 的一点是,你不必使用机器学习的部分。你也可以只使用 SpaCy 中的非机器学习部分。它们也表现出色,快速且非常有用。还有一些机器学习包允许你做一些基于规则的工作。如果你在做 NLP,这就是我为什么喜欢使用 SpaCy 的原因。
你不必一直使用统计方法。基于规则的引擎也很好。推销完毕。
塞思:我已经是 SpaCy 的忠实粉丝有一段时间了——至少四年,可能更久。它帮助我解决了许多问题,从命名实体识别、文本分类到做匹配的酷方法,所有这些。
文森特:好吧,如果我可以做一个最后的推销。现在有很多关于数据驱动的人工智能的讨论。但我开始对这些 Explosion 团队的工作产生兴趣的原因之一是,他们在 2017 年写了一篇博客文章,标题是监督学习很棒——破碎的是数据收集。他们在 2017 年就做了数据驱动的工作,但这是我读过的最好的博客文章之一。
他们谈到了数据质量,其中一句最经典的名言就是:不要指望得到优秀的数据,如果你让低薪员工感到无聊,因为机械土耳其人有时仍然是人们的选择,读那篇博客文章。我会给你一个链接到节目备注。这也是人们应该阅读的非常有启发性的内容。
Seth: 太棒了。非常感谢你。与您交谈真是太愉快了。你给了我很多很棒的资源。整理这些节目说明肯定会很有趣。如果有些地方你希望听众更多了解你,那些地方会是哪里?
Vincent: 目前我在 Twitter 和 Fosstodon 上。不过主要的是我不能宣布任何消息。因为我在 Explosion 工作,能看到正在开发的内容。所以我正在做一些非常酷的事情,肯定会有超级酷的公告,我的其他同事们也在做很棒的工作——只需关注 Explosion 即可。
有很多非常酷的内容正在开发中。如果你这样做,那么你也会在某个时候听到一些我正在做的事情。
Seth: 太棒了。非常感谢你,Vincent。真是非常愉快。
Vincent: 同样。
立即收听
完整访谈的视频可以在这里观看:
Vincent Warmerdam | 从机器学习中学习 第 2 集
播客现在可以在所有 播客平台 上收听:
我们的上一集节目特邀了 Maarten Grootendorst,BERTopic 和 KeyBERT 的创始人,以及 Towards Data Science 上的一位 多产作者。他讨论了开源项目、心理学与机器学习和软件开发的交集,以及自然语言处理的未来。
## 从机器学习中学习 | Maarten Grootendorst: BERTopic, 数据科学, 心理学
从机器学习中学习的第一集节目介绍了 BERTopic 的创始人 Maarten Grootendorst。
towardsdatascience.com
参考资料
了解更多关于 Vincent Warmerdam 的资源:
本集参考资料
了解更多有关从机器学习中学习的资源:
通过代码学习数学:导数
原文:
towardsdatascience.com/learning-math-through-code-derivatives-bbcd2df166d3
通过 Python 深入了解导数
·发表于 Towards Data Science ·阅读时间 5 分钟·2023 年 3 月 20 日
–
莱布尼茨团队。图片由作者提供。
数学对许多人来说是一个 notoriously difficult 的学科。由于其累积性和抽象性,学生可能会发现很难建立联系并理解数学的应用。在我不断的学习过程中,我发现通过实现代码来增强对数学概念的理解是非常有帮助的。
编程要求精确,因为计算机只能执行特定的一组指令。对精确性的需求要求采用逻辑和系统化的问题解决方法,这对理解基础概念非常有帮助。通过编程,我们可以对所实现的理念形成更深刻的直觉。此外,编程允许我们以互动和动手的方式实验、可视化和自动化数学概念,这可以使理论概念生动起来,提升我们的学习体验。
在本文中,我们将通过在 Python 中实现“前向差分商”近似,来更好地理解导数。虽然这是一个简单的实现,所需代码很少,但它揭示了导数所代表的核心。
什么是导数?
首先,我们定义导数。由于有许多免费的导数资源,这个解释不会是全面的。函数 f(x) 对 x 的导数定义为:
一维情况下的导数定义。图片由作者提供。
导数告诉我们在某一点,函数变化的方向和速率。通过选择两个点 x 和 x + h,计算这两个点之间函数的斜率(即(f(x+h) — f(x)) / h),并让 h 无限接近 0,我们恢复了函数在 x 处的瞬时变化率(即导数)。
用 Python 近似计算导数
导数最抽象且可能最难理解的部分是 h 接近 0 但实际上不会达到 0\。我们可以用 Python 编写一个函数来近似这个概念:
import numpy as np
from typing import Callable, Union
def derivative(f: Callable[[float], float], x: Union[float, np.ndarray], h: float = 0.001) -> Union[float, np.ndarray]:
"""
Approximate the derivative of a function f at point x using
the forward difference quotient defintion.
Parameters
----------
f : callable
A function that takes a float as input and returns a float.
x : float or ndarray
The point(s) at which to compute the derivative of f.
h : float, optional
The step size used in the finite difference approximation. Default is 0.001.
Returns
-------
float or ndarray
The derivative of f at point x, approximated using the forward
difference quotient.
"""
# If h gets too small, the computation becomes unstable
if h < 1e-5:
raise ValueError('h values less than 1e-5 are unstable. Consider increasing h')
return (f(x + h) - f(x)) / h
这个函数接收一个纯函数%2C%20and)作为输入,该函数仅有一个变量,并在 x 参数指定的点处近似计算导数。这个函数的实际逻辑只存在于一行代码中,但它能在可接受的误差范围内近似计算多个导数。
要观察这个过程,我们可以近似计算二次函数的导数。根据幂法则(或通过计算差商的极限),我们知道:
二次函数的导数。图片来源:作者。
例如,函数在 x = 3 处的导数是 2*3 = 6\。以下代码近似计算了 x = 3 处的二次函数的导数:
# Define the quadratic function
def f(x):
"""
The quadratic function f(x) = x²
"""
return x**2
# Define the input(s) to compute derivatives for
x = 3
# Define the value of h used to approximate the derivative
h = 0.001
# Approximate the derivative
print(derivative(f, x, h))
# Output: 6.000999999999479
通过将 h 设置为接近 0 的小正数,我们提取出一个接近真实值的导数近似值。随着 h 变得更小(直到达到某个容忍度),近似值会变得更加准确:
# Define a smaller h value to get a more accurate approximation
h = 1e-5
# Take the derivative
print(derivative(f, x, h))
# Output: 6.000009999951316
我们可以将这种行为可视化,以观察 h 值逐渐减小时的效果:
随着 h 的值减小,导数的近似值变得更准确(趋近于 6)。图片来源:作者。
另一个有趣的例子涉及三角函数。根据导数的定义,我们知道以下内容:
sin(x)的导数是 cos(x)。图片来源:作者。
使用导数函数,我们可以进行如下近似:
import numpy as np
import matplotlib.pyplot as plt
# Define the h value
h = 1e-5
# Define the domain
x = np.linspace(-10, 10, 1000)
# Approximate the derivative of sin(x) (should be close to cos(x))
f_prime = derivative(np.sin, x, h)
# Plot sin(x) vs the approximated derivative
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, np.sin(x), label='f(x) = sin(x)')
ax.plot(x, f_prime, label="f'(x) ~= cos(x)")
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Approximated derivative of sin(x) (close to cos(x))')
ax.legend()
plt.show()
sin(x)的近似导数类似于 cos(x)。图片来源:作者。
最后的思考
本文实现的导数近似称为“前向差分商”,它是进行数值微分的众多方法之一。需要注意的是,这种近似是不完美的,因为它在h
的值很小时往往会崩溃。此外,在实际应用中,我们可以计算封闭形式函数的精确导数,避免近似的需求。本文的目的是帮助读者通过代码了解数学如何运作,并希望增强他们对导数的直觉。我鼓励读者在不同的函数上测试代码,探索其他导数近似方法,并理解各自的优缺点。感谢阅读!
参考文献
学习网络游戏
原文:
towardsdatascience.com/learning-network-games-29970aee44bb
图论机器学习与博弈论
网络游戏是一个强大的工具,用于建模在网络上进行的个体或组织之间的战略互动,其中一个玩家的回报不仅依赖于他们自己的行动,还依赖于他们邻居的行动。这类游戏在经济学和社会科学中有广泛的应用,包括研究社会网络中的影响扩散、金融市场的动态以及国际关系中的联盟形成。网络游戏的研究通常假设已知底层网络结构,但这往往是不切实际的。最近,机器学习方法被提出来解决这个问题,通过利用玩家的观察行为来学习底层网络结构。在这篇博客文章中,我们概述了一种新颖的方法,它使用类似 Transformer 的架构来推断游戏的网络结构,而不需要明确知道与游戏相关的效用函数。
·发布在 Towards Data Science ·阅读时间 10 分钟·2023 年 4 月 20 日
–
基于 Shutterstock 的插图。
这篇文章由 Emanuele Rossi 共同撰写,并基于论文 E. Rossi 等人,"学习推断网络游戏的结构"(2022 年)ICML,与 Federico Monti、Yan Leng 和 Xiaowen Dong 合作。
博弈论是一个用于建模和分析多个决策者相互作用的情况的数学框架,其中每个决策的结果都依赖于所有相关玩家的行动。在网络游戏中[1],玩家通过网络(图)相互连接,游戏的结果不仅依赖于玩家的策略,还依赖于网络的结构。每个玩家都试图最大化他们的效用函数,在网络游戏中,这个函数不仅依赖于他们自己的行动,还依赖于邻居的行动。
均衡行为 是指一组策略,在这种策略下,任何玩家都没有动机去改变自己的策略,前提是其他玩家的策略不变。换句话说,在均衡状态下,每个玩家的策略都是最优的,考虑到其他玩家的策略。在网络游戏中,均衡行为取决于图结构以及其他依赖于游戏的参数。
例如,考虑一个社交网络上的场景,个人可以决定在平台上花费多少时间。在这种情况下,他们的行为可能会受到网络上朋友的影响,这在玩家之间创造了战略上的相互依赖。例如,如果乔的朋友们在平台上花费了大量时间,乔可能会感受到自己使用平台的更大收益。
在不同的环境下,乔是一个电子商务平台的用户,他在决定是否购买一本书。如果他的朋友已经购买了这本书,乔可能会不太愿意买,因为他可以向朋友借这本书。这些例子说明了网络游戏中的行动如何受到邻近玩家行动的影响,从而导致战略上的相互依赖和均衡行为的出现。
网络游戏的示例。左侧: 如果乔的朋友们也在社交应用上花时间,乔可能会在应用上花更多的时间。右侧:如果他的朋友已经买了那本书,乔就更没有购买的动力,因为乔可以借到书。
从行动中推断网络
在上述例子中,我们假设了解乔的朋友,即游戏的网络结构。然而,在许多情况下,潜在的网络结构并不可直接获得。相反,我们可能只能观察到由代理之间的互动所产生的均衡行为。在这些情况下,一个关键问题是我们是否可以仅根据这些均衡行为重建网络结构。了解网络结构可以帮助预测行为并规划基于网络的干预措施,如营销活动或信息扩散。
之前已经显示,在关于效用函数和游戏类型的特定假设下,可以重建控制网络游戏的图 [2]。然而,这些假设可能不切实际,特别是当对正在进行的游戏了解甚少时。为此,在最近的一篇论文 [3] 中,我们开发了一种不需要关于效用函数形式的假设的方法,可以应用于广泛的网络游戏。
我们首先研究三种常见的网络游戏类型,线性二次、线性影响 和 Barik-Honorio [4]。这三种游戏因效用函数的形式不同而异,从而导致图中行动的平滑程度不同:
eᵤᵥ = bᵤ xᵤ — ½ xᵤ² + β Σᵥ aᤥᵥ xᵤ xᵥ,
xᵤ 是玩家 u 采取的连续行动,bᵤ 是玩家的 边际效益,β 是表示网络中邻居行为之间依赖强度的游戏参数,aᵤᵥ 是表示 u 和 v 之间连接强度的图的邻接矩阵中的条目。
以先前提到的在社交平台上花费时间的情景为例,方程的第一项将捕捉使用平台的个人效益(例如保持最新消息),第二项将表示这样做的成本(例如减少时间做其他更重要的事情),第三项将捕捉与朋友行为的相互依赖。特别是,如果用户在朋友也花时间使用该应用时有动机花更多时间使用它,则 β 将是正值 [5]。
线性二次 游戏的纯策略 纳什均衡 是
x* = (I — βA)ᐨ¹ b
x* 是一个维度为 n 的向量(等于玩家数量或图的节点数),A 是图的未知 n×n 邻接矩阵,b 是玩家的 n 维边际效益向量。
类似的公式可以推导出 线性影响 和 Barik-Honorio 游戏的平衡行动 x* 的公式,将这三种游戏泛化为形式 [6]
x* = f(A) h(b),
函数 f(A) 反映了网络中邻居行为的影响,并编码了游戏的具体效用函数,相反,h(b) 仅受个体特征影响,如单个玩家的边际效益。
游戏理论文献中常见的三种不同类型的具体实例。颜色表示玩家采取的行动,在这种情况下是归一化在 -1 和 +1 之间的连续值。
在我们的论文中,我们进一步展示了[7]玩家的动作包含图的谱信息,确认了仅从动作中重建图结构的可能性,并证明了我们下面概述的方法的合理性。
一种机器学习方法
我们将推断游戏网络结构视为一个机器学习问题。我们训练一个模型,将玩家的动作映射到游戏的网络结构中,而没有对基础效用函数的任何先验知识。为此,我们收集了来自使用相同效用函数的游戏中的动作和网络对(X, A)的数据集(尽管我们不知道这个函数)。这使我们能够避免对效用函数做出强假设,而是训练一个对其无关的模型。
这种方法在社会网络和决策数据仅存在于小规模人群的场景中特别有用,我们旨在学习从决策到较大人群网络结构的映射。例如,政府、公共机构和研究人员可以通过让个人提名他们的朋友来收集小规模人群的社会网络数据,然后使用提出的方法以成本效益的方式学习较大人群的网络互动。
我们的机器学习模型具有一个编码器-解码器架构,该架构对玩家和游戏的排列是不可变的,对应于n×K矩阵X的行和列,其中K表示游戏的数量。为实现这一点,我们修改了一个变换器模型,该模型在节点集合上自然是排列不变的,但在游戏集合上则不是。我们的编码器为每个玩家生成K个向量,如下所示:
玩家u在游戏k中的标量动作xᵤₖ首先通过一个非线性变换,得到一个F维向量。
yᵤₖ = ReLU(xᵤₖw + b).
我们接着计算未归一化的注意力分数。
sᵤᵥ = Σₖ yᵤₖᵀ W Wₖ yᵥₖ
通过首先计算每个游戏的分数,使用带有查询和键权重矩阵W和Wₖ的“学习点积”,然后对游戏进行求和,得到玩家u与玩家v之间的注意力分数。注意力分数
αᵤᵥ = softmaxᵥ(uᵤᵥ)
通过在第二维度上对未归一化分数进行 softmax,得到最终的F维嵌入。
zᵤₖ = φ(Σᵥ αᵤᵥyᵥₖ)
节点u在游戏k中的yᵤₖ向量,通过将其他节点的yᵤₖ向量按注意力分数加权后聚合得到,然后通过一个 2 层 MLP φ进行处理。
解码器通过聚合玩家u和v的K个向量来输出邻接矩阵每个条目的概率。这是通过对每个游戏的两个向量进行点积并求和,然后将结果输入多层感知机(MLP)来完成的。
âᵤᵥ = ψ(Σₖ zᵤₖ ⊙zᵥₖ)
其中 ⊙ 表示点积,ψ 是一个 2 层 MLP。
生成的编码器在游戏集上也是排列不变的。
图示表示了我们模型的编码器-解码器架构。包含玩家行为的nxK 输入矩阵X被编码为nxFxK 张量Z,其中zᵤₖ是游戏k中节点u的嵌入,基于在同一游戏中其他玩家的行为进行计算。Z随后被解码为n×n的邻接矩阵Â,其中条目âᵤᵥ包含了u和v之间存在边的概率。
实验结果
我们进行了实验,以验证我们的方法在从玩家行为中学习网络结构的有效性,使用了合成数据集和真实数据集。作为基线,我们使用了 DeepGraph [9](我们知道的唯一机器学习方法),特定于游戏类型的优化方法,以及节点之间行为的简单相关性和反相关性。
在合成数据集上,我们的模型(称为NuGgeT)在各种不同的游戏和图类型中始终优于以前的方法。
我们报告了在Linear Influence游戏中的结果(见论文中的Linear Quadratic和Barik-Honorio),在三种不同类型的合成图(Watts–Strogatz,Erdős–Rényi 和 Barabási–Albert)以及不同的边际效益平滑度(这种游戏的超参数)下。我们的方法称为 NuGgeT,始终优于基线方法。
我们模型在学习映射的性能取决于可用的游戏数量和训练图的数量,我们进行了消融实验来评估这两个因素。通常,更多的游戏和图对我们的方法有利。然而,我们观察到,在大多数情况下,模型性能在大约 100 个游戏和 500 个图时趋于饱和。
我们进一步在两个真实世界的数据集上验证了我们的方法:Indian Villages 数据集[10]和Yelp Ratings 数据集[11]。前者包含来自印度 75 个村庄的社会网络调查数据。每个村庄构成一个社会网络图,其中节点是家庭,边是自报的友谊。我们将房间数量、床位数量以及家庭在家庭相关决策中的其他决定视为行动。理由是,如果邻居采用了某种设施,村民往往通过采取相同措施来获得更高的收益,即遵循社会规范。
Yelp Ratings 数据集由用户对商家的评分和用户之间的社交连接组成。我们从原始数据中提取了 5000 个表示社区的子图,其中的行为是用户对 22 类商业的平均评分。
在两个现实世界的数据集上,NuGgeT 优于以往的方法,展示了我们的方法在游戏效用未知的情况下的有效性。特别是在印度村庄数据集上,NuGgeT 的增益尤其显著,而竞争方法 DeepGraph 完全无法学习。我们推测这可能是因为 NuGgeT 更加数据高效,得益于其内置的不变性,这一点通过对训练图数量的消融实验得到了确认。
NuGgeT 在我们测试的两个现实世界数据集上优于以往的方法,确认了其在游戏效用函数未知的情况下的有效性。
总之,我们的论文突出了博弈论与图机器学习之间的有益联系,特别是在网络游戏的背景下。通过开发一种新的机器学习方法来从观察到的游戏结果中推断网络结构,我们展示了利用博弈论思想来提升机器学习的潜力,反之亦然。展望未来,还有广阔的机会进一步探索网络游戏与图神经网络之间的联系,为这些领域带来更多激动人心的发展。
[1] 参见例如 M. O. Jackson 和 Y. Zenou,网络上的游戏 (2014),博弈论手册 4:95–163 以获取概述。
[2] Y. Leng 等,在网络上学习二次博弈 (2020),ICML。
[3] E. Rossi 等, 学习推断网络游戏的结构 (2022),ICML。
[4] A. Barick 和 J. Honorio,对连续动作图形游戏高效学习的可证明计算和统计保证 (2019),arXiv:1911.04225。
[5] 第一个项表示采取更大行动的边际收益,第二个项表示采取行动的成本,而第三个项表示与邻居行动的关系。如果β为正,则玩家采取更高行动的激励会随着其邻居也采取更高行动的数量增加而增加,这称为战略互补关系。另一方面,如果β为负,则玩家采取更高行动的激励会随着其邻居采取更高行动的数量增加而减少(战略替代关系)。
[6] 在这个公式中,选择 f(A)=(I — βA)ᐨ¹ 和 h(b)=b 产生一个线性二次博弈,f(A)=Aᐨ¹ 和 h(b)=b 产生一个线性影响博弈,f(A)=u₁(A 的最大特征向量)和 h(b)=1 产生一个 Barik-Honorio 类型的博弈。
[7] 我们论文中的第 3.3 节 [3]。
[8] 参见 “The Illustrated Transformer” 博客文章,以获得对 Transformer 及查询和权重矩阵作用的直观解释。
[9] E. Belilovsky 等人,《学习发现稀疏图模型》(2017),ICML。
[10] 数据集与 A. Banerjee 等人的论文《微型金融的扩散》(2013),《科学》341(6144) 配套。论文的两位作者(Abhijit Banerjee 和 Esther Duflo)获得了 2019 年经济学诺贝尔奖。
[11] Yelp 开放数据集。
我们感谢 Federico Barbero, Fabrizio Frasca,以及 Francesco Di Giovanni 对本文的校对。有关图上深度学习的更多文章,请查看 Michael 的 其他文章 ,在 Towards Data Science 上 订阅 他的文章和 YouTube 频道,获得 Medium 会员资格,或在 Twitter* 上关注他。*
以正确的方式学习新的数据科学技能
·
关注 发布于 Towards Data Science · 以 Newsletter 形式发送 ·3 分钟阅读 ·2023 年 8 月 17 日
–
我们倾向于将学习曲线视作整齐、平滑、不断上升的线条。然而,只要仔细观察任何学习旅程,你会发现沿途有无数的低谷和平台期:实际上,即便是经验丰富的专业人士在面对新工具或工作流程时也会感觉像个初学者。
本周,我们整理了一些近期最受欢迎的教程和入门指南。这些内容对数据和机器学习从业者几乎没有任何先决条件;它们涵盖了从深度学习到异常检测的不同主题,但都致力于耐心解释、具体细节和专家背景。若你感到学习乏力,下面的亮点必定能帮助你走出困境。
-
有时候从头开始尝试是有意义的:为什么不**从零开始实现并训练一个卷积神经网络(CNN)**呢?你将有Betty LD的逐步指导;如果你一直在考虑尝试 PyTorch Lightning 库,这正是你的机会。
-
看来今年夏天是开源大语言模型的季节,每几天就有新的模型出现。Donato Riccio的新文章是一个面向初学者的 Llama、Alpaca 等开源大语言模型的指南,涵盖了微调和使用这些 LLM 的基础知识。
图片由Giulia Bertelli拍摄,来源于Unsplash
-
想更深入了解开源 LLM 资源?无需浮具:Shawhin Talebi将帮助你熟悉 Hugging Face 的 Transformers 库,它提供了“一个轻松且无需费用的方式来使用各种开源语言模型。”
-
想要对传统的机器学习方法有新的视角吗?Evie Fowler的最新贡献概述了使用异常检测方法解决不平衡结果类别带来的问题在监督学习中的好处。
为什么停在这里?如果你仍然有学习的兴致,我们还有一些精彩的读物你不容错过:
-
Ruth Eneyi Ikwu分析了未经检查的共线性如何导致意外偏差,通过对一个问题数据集的批判性审视。
-
有没有实际路径实现可持续 AI? Leonie Monigatti 的 Kaggle 竞赛获奖文章调查了提高深度学习模型在生产中效率的潜在方法。
-
如果你对音频和音乐数据充满热情,Naman Agrawal 的时间和频域特征提取的深度解析 是必读的。
-
Mark Ridley 提供了关于生成式 AI 的崛起如何影响产品工程团队的深思分析。 (系好安全带:这是这个优秀系列中的第一篇文章。)
-
数据科学和 ML 角色描述不断演变;Stephanie Kirmer 聚焦于 ML 工程师,并探讨他们的出现是否可能是数据科学中“粉色领带”现象的症状。
-
Pol Marin 继续探索体育分析中的有趣话题;他最新的研究对象是:FC 巴塞罗那的防守(及其不满之处)。
感谢您支持我们的作者!如果您喜欢在 TDS 上阅读的文章,考虑成为 Medium 会员 —— 这将解锁我们的全部档案(以及 Medium 上的所有其他文章)。
直到下一个 Variable,
TDS 编辑部
在职学习 Python 数据科学 第一部分:哲学
原文:
towardsdatascience.com/learning-python-for-data-science-on-the-job-part-1-philosophy-6e2aedc4e041
关于如何在没有正式教育的情况下成为一名熟练数据科学家的实用建议和理念
·发表于 Towards Data Science ·8 分钟阅读·2023 年 1 月 14 日
–
图片由 Fatos Bytyqi 提供,来自 Unsplash
随着数据科学在各个行业中的普及,值得注意的是,许多自学成才的程序员已经进入了职场。很多人正在寻求职业转型,希望用数据科学这一强大工具来补充自己的专业知识,或者只是对所有的炒作感到好奇。尽管我回到学校接受了一些正式的数据科学教育,但在本科阶段我从未参加过编程课程,在回到学校之前我已经在数据科学领域工作了 2 年;我绝对会认为自己是一个自学成才的程序员!自从我开始使用 Matlab 和 Python 探索系统生物学应用中的优化技术以来,已经快 10 年了。回顾过去,我想分享一些我尝试过的东西——有些成功了,有些失败了——这些都帮助我在工作中学习 Python(和 Matlab)编程以及数据科学。
本文是关于在没有正式教育情况下学习数据科学的两部分系列文章中的第一部分。第一部分是我经验的反思,提供了一些实践建议,包括尝试和可能需要避免的事项(你会发现我不喜欢 YouTube 教程!)。第二部分 通过一个简单的线性回归问题,分别在 Excel 和 Python 中进行操作,讲解了一些基本的 Python 语法,并比较了每种方法的优缺点。希望你喜欢!
入门指南
我仍然清楚地记得我作为新生研究助理的第一周,周围都是以代码为生、为梦的研究生。我不明白为什么有人能理解像print('Hello World!')
这样的简单代码。这是为什么?我究竟要如何做更多高级的事情?
我很快意识到,编程基本上是用特定的词汇和结构表达的逻辑思想,以产生结果。它与在计算器中输入内容是一样的,只是更强大。唯一困难的部分是学习语法,即将你脑中的逻辑转换为计算机可执行任务的关键字和字符。
这是我学习语法时的一些有效方法:
-
Google 是你最好的朋友!要学习如何做一个
for
循环,只需 Google “Python for loop example。”你可能会看到一些很好的教程,详细讲解使用哪些关键字和字符。随着你问题的深入,你会发现 Stack Overflow,这是一个人们提出问题并从社区获取答案的论坛。你会看到很多创造性的方法来做同样的事情,并最终培养对常见做法的敏感性。 -
从你熟悉的事物开始对待 Python。例如,我们可能都用过计算器,因此首先就像使用计算器一样输入方程式。然后开始增加复杂性,比如分配变量、打印结果和提高计算复杂性。本系列第二部分的练习是一个很好的深入案例研究。
-
学会阅读文档。不幸的是,没有一个好的标准来规范人们编写文档的方式,有些文档写得非常差。但是每当你开始使用一个新包(如 pandas 或 numpy)时,如果你对如何做某事有疑问,首先查看它们的文档,然后再 Google 查找答案。
关于入门的其他几点:
-
确保对你的代码进行注释!这可能是你应该学习的第一个语法。Google “how to comment code in Python。”注释是不会被执行的代码行,所以你可以解释你写代码的逻辑和理由。不时回顾你早期的代码,认识到你的进步。
-
熟练调试。这可以简单到添加
print
语句,以便你能看到程序正在做什么,并检查是否符合你的预期。 -
阅读!大量阅读!当我开始我的数据科学工作时,我对 Python 生疏,并且从未进行过数据科学。所以我每天工作开始的第一个小时都会阅读教程并进行副项目实践。这对于我了解有哪些选项非常有价值。在阅读的同时,考虑你所阅读的内容如何应用到你的工作项目中。我发现了很多创新方法的灵感,这些灵感是通过阅读中的想法激发的(例如,参见我关于模拟 PID 控制器的系列)。
-
有很多平台可以运行 Python 代码。目前,对于初学者(以及那些尝试新想法的高级用户)来说,Jupyter notebook 是最好的选择。如果你在课堂上学习,你的老师很可能会使用 Jupyter notebook,因为它更直观,并且具有简单文本文件所没有的内置功能。
使用入门教程和材料
在我看来,一般的教程或 YouTube 视频不值得花时间。它们对我不起作用,而且过于笼统,实际上并不具备帮助性。如果你完全是编程新手,它们可能对你了解语法的运作方式有些帮助。如果你使用这些教程,你必须积极参与,边看边写代码。我们大多数人无法仅仅通过观看和吸收来有效学习……你可能会观看一个 4 小时的教程,但如果你没有积极参与,教程结束后你可能不会成为一个更好的程序员。
我通过沉浸在我关心的项目中来学习编程。我会获取一些起始代码,然后逐行阅读以理解它。我会添加print
语句来更好地了解发生了什么。接着,我会开始进行一些小的调整和定制。即使现在,我几乎从不从头开始编写代码;而是会找到一些类似的代码(通常是我之前写过的,但作为起点,可以从在线资源开始),复制粘贴,然后根据我的特定项目进行定制。
从一个项目开始而不是教程有两个好处:首先,它给你一个你关心的任务,因此你会更投入(Towards Data Science 对于寻找项目演练非常好)。这也可能与你以后工作中要做的事情更相关。其次,它给你提供了定制代码以实现你想要的功能的机会,而不是仅仅生成数百万已经完成的代码。就像做一个有答案的学校作业和做一个没有单一正确答案的开放式工作项目之间的区别。你将能够认识到完成同一任务的不同方式。最终,你会开始认识到更高效的编码方法,但现在,更重要的是多加练习。
从基础开始
简单的事实是,没有人能在一夜之间成为 Python 大师。即使经过 10 年,我仍在不断学习。但是,有一件事真的很有帮助,那就是先从代码中的基本功能开始,然后再增加复杂性。这不仅是初学者编码的好框架,对高级编码者也是如此。实际上,当我最近进行求职时,从一次编程挑战中得到的最有价值的反馈之一就是在尝试解决边界情况之前,先从基本功能开始。想到如何编写一个完美工作的整个脚本可能会让人感到无从下手(我可能会争辩说,这几乎是不可能的),但只需稍加练习,你就可以编写一个完全正常的for
循环或字典来完成大部分任务。
我说的是什么意思?考虑一个经典的编程挑战——将罗马数字转换为整数。有一些非常合理的规则,但与其试图一次性考虑所有规则,不如从基础开始,然后增加复杂性。首先编写一些代码,将每个罗马数字翻译为整数(例如 X = 10)。然后弄清楚如何编程处理一个较大值后跟一个较小值的情况(例如 XI = 11)。最后,编写代码处理一个较大值前面有一个较小值的情况(例如 IX = 9)。
发展自信
无论是教别人一门语言、一种乐器,还是任何其他技能,我总是告诉学生这一点:要有自信!你不是仅仅在学习小提琴,你是在演奏它。你不是仅仅在学习俄语,你是在说它。编程也是如此:你不是仅仅在学习编程,你已经在做了。当然,你在不断发展和学习,也许在不同的技能水平上。但即使作为一个初学的小提琴手,我仍然会说我在演奏小提琴,尽管那时的水平远不如今天。编程也是一样。虽然我比 10 年前知道的更多,10 年后我会比现在知道得更多,但这并没有减少我现在作为程序员的事实,就像我在 10 年前开始时一样。这种心态的关键在于它让你有信心去展现自己,去解决困难的问题(或说语言或演奏乐器)。我们通过实践、挑战自己、以及拥有自信来学习。是的,你绝对应该尽可能多地寻求反馈,但不要因为害怕犯错而感到瘫痪。不要因为不知道如何做而给自己找借口不去接受任务。整个要点在于你正在学习,甚至很可能是在工作中学习。
案例研究和结论
当我开始我的第一份数据科学工作时,我给自己设定了一个目标:我想比我对 Excel 的了解更深入地掌握 Python。我在 Excel 方面非常拿手,但即使是使用 VBA,也确实开始遇到一些限制。我们中的大多数人对 Excel 很熟悉,甚至是专家;第二部分的案例研究是一个绝佳的机会,让你通过在 Excel 和 Python 中解决问题来初步涉猎。我希望你不仅能够看到它们的相似之处和优缺点,还能建立起自信。
希望这些对你有所帮助。我知道我们每个人的学习方式不同,你可能会尝试 YouTube 教程或虚拟课堂,并觉得它们是最有价值的。我要表达的观点是,你可以在工作中学习这一宝贵的技能,并且培养出与那些接受过正式编程教育的同行一样的信心。像往常一样,你可以通过LinkedIn与我联系,也可以随时关注我在Towards Data Science上的数据科学案例研究定期更新。
数据科学中的 Python 学习 实战第二部分:练习
原文:
towardsdatascience.com/learning-python-for-data-science-on-the-job-part-2-practice-b4ece80488da
Excel 和 Python 中线性回归的并行案例研究
·发表于 Towards Data Science ·10 分钟阅读·2023 年 1 月 15 日
–
图片由 Hitesh Choudhary 提供,来源于 Unsplash
欢迎阅读这系列关于在工作中或没有正式教育背景下学习 Python 和数据科学的文章的第二部分。第一部分讲述了我过去 10 年在工作中和正式教育环境中学习的经历。如果你对学习的哲学和一些激励自己开始学习的想法感兴趣,可以看看这篇文章。或者,如果你像我一样通过实际操作具体例子来学习,继续阅读吧!
问题定义
所有相关文件可以在我的 Github 上找到。不过,我建议你完全从头开始,按照这里提供的代码块和截图进行操作。
在这个案例研究中,我们将进行一个简单的线性回归。我们有两类输入数据,基于这些输入,我们希望训练一个线性模型来预测一个输出,基于实际观察到的数据。在 data.csv
文件中,这些输入被称为 x1
和 x2
,观察到的数据被称为 y
。模型的形式为 Ax1 + Bx2 + C = y。你可能会注意到 x2 = x1²。这是有意为之的,随着你在数据科学中的进步,你可能会想要记住这个小技巧:你可以通过简单地平方或取已有输入的对数来创建额外的输入(在数据科学中,输入通常被称为特征)。
设置
首先,打开 Excel 电子表格和 Jupyter notebook。通常,你可能会开始将原始数据直接复制并粘贴到 Excel 文件中,但对于这个特定的问题,我们首先要做一些类似于你在 Python 中常做的事情。你需要求解器加载项来解决这个问题。如果你从未使用过求解器加载项,请按照这里的说明进行操作。启用加载项为 Excel 提供了额外的功能,而这些功能不是标准配置的一部分。
在 Excel 中你很少这样做,但在 Python 中你几乎总会做类似的事情。启用额外功能是通过导入库或幕后代码来实现的,这些代码允许你在 Python 中执行更强大和高效的命令。你可以通过输入 import [library_name]
来实现。这告诉 Python 你将使用指定的库。你可以选择为库起一个缩短的名字。例如,你可以说 import pandas as pd
。每次使用 pandas
库的某些功能时,你可以直接输入 pd
代替 pandas
。虽然你可以给库起任何名字,但你会很快发现大多数包都有常见的缩写。
许多库在你下载 Python 时已经预装,就像 Excel 已经有按钮允许你制作图表或执行数学函数一样。你可能不会在导入 pandas
(用于数据处理)和 matplotlib
(用于绘图)时遇到问题。不过,你可能需要使用 pip 安装 scikit-learn
(或 sklearn
)库,就像你需要做一些特别的工作来获取 Excel 求解器加载项一样(巧合的是,sklearn
在这个练习中将以类似于 Excel 求解器加载项的方式使用)。你的第一段代码应如下所示:
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
来自 sklearn
的这一行代码看起来有些不同。这是因为 sklearn
是一个庞大的库(可以查看他们的网站和文档),而我们只会使用其中的一小部分。因此,我们在这一行代码中告诉 Python 只从 scikit-learn 中导入那部分特殊功能,而不是全部。可能会是一个无尽的坑,但请注意,以下代码块做了相同的事情:
import sklearn
lr = sklearn.linear_model.LinearRegression()
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
加载数据
相比于 Excel,设置这些内容需要做很多工作,但这正是让 Python 更加多才多艺的因素之一。现在,你将数据加载到你的程序中。在 Excel 中,你可以直接从 data.csv
文件中复制并粘贴。在 Python 中,你可以将其加载为数据框(想象成一个超级增强的 Excel 表格)。你的下一行代码应如下所示:
df = pd.read_csv('data.csv')
这一行代码告诉 pandas 读取 data.csv
文件中的值,并将其存储在 df
(数据框的缩写)变量中。你应该确保 data.csv
文件在与你的 Jupyter notebook 相同的目录中,否则你需要指定文件的路径。
你可能会对无法实际看到每行代码的运行情况感到沮丧。作为视觉生物,这也许是编程的一个缺陷。然而,当你编写代码时,你可以方便地显示输出。例如,在一个新的代码块中输入 df
并执行(按 ctrl+enter),看看会发生什么。然后尝试 df.head()
。最后,尝试 df.head(3)
。你注意到每个的区别了吗?这就是编码相对于使用电子表格的灵活性和效率的体现。代码简洁而强大,一旦你克服了初始可视化的障碍,你可能会发现编码更为可取。顺便提一句,当你开始处理包含数百万条记录的数据集时,你会更加感激它;在 Excel 中对这些数据集进行操作真的会让它变得非常缓慢,而编码则能保持流畅(直到你处理非常大的数据集)。
模型设置
到目前为止,我们的进展相当缓慢,但希望接下来的部分能真正突出编码相对于电子表格的优势、灵活性和速度。让我们先通过 Excel 进行问题设置,然后看看如何用仅几行 Python 代码做到同样的事情。
在 Excel 中,我们将通过设置平方和系统来找到模型的系数。创建一个新的单元格框来跟踪系数,并对系数做一个猜测值。你可以将所有猜测值初始设置为 1,但有时你的猜测确实对结果有很大影响(Python 更方便,不需要提供初始猜测,虽然它提供了这个选项)。然后,按照截图中的模型编程新列单元格,以进行模型预测。
预测列编程的截图。图片由作者提供
最后,生成一个新列,称为“平方误差”列,按照下面所示进行计算。在打开 Solver 之前的最后一步是求出所有平方误差的总和——因此叫做“平方和”目标,也称为 l2-范数。(你可以通过转到 E23 单元格并输入公式 =SUM(E2:E22) 来完成此操作。)
计算平方误差的公式截图。图片由作者提供
我们终于完成了问题设置。我不知道你在 Excel 中的熟练程度或你是否使用过 Solver,但以这种方式进行练习的目的是展示在 Python 中这个过程有多么简单。这不是关于 Excel Solver、线性回归或平方和为何有效的教程(尽管我可以讨论这些!),所以我不会在这里深入细节。我们可以用仅 3 行代码在 Python 中完成所有设置:
X = df[['x1','x2']].values
y = df['y'].values
model = LinearRegression()
模型解决方案
让我们退一步,记住我们要做什么(我们已经很接近了!)。我们想开发一个模型,允许我们基于两个输入特征 x1
和 x2
预测一个值 y
。我们假设模型是线性回归,形式为 Ax1 + Bx2 + C = y。看起来我们走了一条绕路的路,但我们只差一步。在 Excel 中,打开 Solver 对话框,并按如下方式填写(特别注意确保未选中限制为正值的复选框)。运行程序,你会看到屏幕上的所有变化。你会在对应的单元格中看到你的 A、B 和 C 值。
填写完表格后再按“解决”的截图。图片由作者提供。
我们将回到那个黄色框,展示类似的内容在 Python 中。但为了在 Python 中设置问题,你只需写一行代码即可完成所有工作:
model.fit(X,y)
再次,最明显的区别是你在 Python 中看不到任何不同的内容。但你实际上已经有了解决方案。如果你深入文档,你会发现你实际上可以输出这些值。对于线性回归,你可以通过几个打印语句找到这些值,如下所示:
print('Coefficient A:',model.coef_[0])
print('Coefficient B:',model.coef_[1])
print('Coefficient C:',model.intercept_)
你的值应该匹配!所以迅速回到那个黄色框。它基本上是在问你的 A、B 和 C 系数是否都应该是正数。有时这很重要,特别是当你建模的系统有真实物理意义且系数受到自然现象限制为正数时。如果你在 scikit-learn 的 LinearRegression
文档中找找,你会发现你可以在初始化模型时传递一个参数来做同样的事情。它看起来是这样的:
model = LinearRegression(positive = True)
绕道的重点是展示编程中最不直观的事情之一:选项是存在的,你只需要找到它们!没有像 Excel 中那样简单的可视化复选框,但它们确实存在!文档中告诉你的默认值类似于在打开 Solver 时复选框是否被选中的情况。
模型预测
很好,现在我们有了一个有效的模型。我们怎么进行预测呢?假设我们想知道 x1 = 0.65 和 x2 = 0.65² = 0.4225 的预测值。在 Excel 中,你需要把这些值放在一些新的单元格中,然后将方程编程到另一个单元格中以获得答案,就像下面的截图一样。
编程新的单元格以生成新数据的预测。注意,系数值的单元格已被赋予唯一的名称(稍后讨论)。图片由作者提供。
在 Python 中,你可以通过输入以下代码来做完全相同的事情:
x1_predict = 0.65
x2_predict = x1_predict ** 2 # Careful to not use the ^ symbol to square values!
X_predict = [[x1_predict, x2_predict]]
y_predict = model.predict(X_predict)
这可能看起来有点繁琐,因为我们必须输入变量名。但这里有一个有趣的小事实:你知道你可以给 Excel 单元格唯一的变量名吗?这与定义 Python 变量并在未来的公式中使用它是一样的。谷歌搜索“excel 给单元格命名变量”或类似内容,然后你可以像截图中看到的那样重写你的公式。我几乎在实践中从不这样做,但由于这篇文章是关于将 Excel 与 Python 进行比较的,希望这能给你一个更好的理解。
绘图结果
在这一领域,Excel 可能看起来比 Python 要好很多,但那只是因为它有一个用户界面可以互动。要在 Python 中进行自定义,你必须输入一行代码。
我不会讲解如何在 Excel 中绘图——你可能对此已经很熟练了。在 Python 中,我们将使用 matplotlib,但要注意,还有许多其他选项可以探索,如 plotly、seaborn 和 altair。我想是时候让你自己动手了,所以我不会逐行讲解这段代码。相反,把它当作一个练习,试着理解每一行的作用。然后,查看文档,看看是否可以更改一些输入,使图形成为你自己的!
plt.plot(df['x1'], df['y'], '.', label = 'raw data')
plt.plot(df['x1'], yp, label = 'model prediction')
plt.xlabel('x1', size = 14)
plt.ylabel('y', size = 14)
plt.legend(fontsize = 12, loc = 'lower right')
plt.show()
摘要
你做到了!你完成了其中一个完整的代码,从零开始并最终得到可用的结果。希望你从中获得了很多关于如何学习编程的见解,而不是浪费时间在一个 4 小时的教程上,那种教程通常只是听过就忘。很酷的一点是,这项活动,虽然可能比你期望的时间要长,但在一两个月内你可以在 5 分钟内轻松完成。开发整个过程在 Excel 和 Python 中都花的时间比阅读这篇文章要少。
如果我可以总结一下我预期的最大挑战,那就是:我们是视觉动物,而编程却不是视觉的。Excel 很简单,因为有按钮和图形用户界面可供操作。你必须通过编程即时创建可视化图形。在学习过程中,额外的print
语句、数据图表、数据表格等都不会出错。即使是更高级的程序员,你可能仍然会发现自己在 Excel 中浏览新数据以快速了解它。这是完全正常的!然而,我希望你像我一样,最终更倾向于使用 Python——不仅因为它更强大和多功能,还因为它变得更简单!
一如既往,你可以通过LinkedIn与我联系,也可以在Towards Data Science上关注我,查看我关于数据科学案例研究的定期帖子。如果有些帖子类型比其他帖子更有用或更有趣,我很乐意听到。下次见!