TowardsDataScience 2023 博客中文翻译(三百一十四)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

使用 SQLAlchemy 进行 UPSERT 的最简单方法

原文:towardsdatascience.com/the-easiest-way-to-upsert-with-sqlalchemy-9dae87a75c35

一个命令同时INSERT新数据和UPDATE数据库中现有的记录

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

·发布于 Towards Data Science ·5 min read·2023 年 3 月 20 日

在这篇短文中,我们将深入探讨如何在 SQLAlchemy 中进行UPSERT:我们将INSERT新数据到数据库中,并用新提供的值UPDATE已经存在的记录。我们将从一个用例开始,准备数据库,然后进行 UPSERT!非常简单!让我们开始编码吧!

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

一行行地进行 UPSERT(图片来源 Tom FiskPexels)

什么时候我需要进行 UPSERT?

Upserting 是将新记录INSERT到数据库表中,同时UPDATE数据集中已经存在的记录。数据库通过比较表的主键列来“知道哪些记录已经存在”。

UPDATE现有记录很重要,以便我们的外键关系保持完整。在下一部分中,我们将通过一个示例清楚地解释我们在实践中的目标。

## 通过简单升级显著提高数据库插入速度

在 Python 中创建超快速数据库连接的 4 个级别

towardsdatascience.com

设置示例

想象一下我们经营一个吉他店的网店。当然,我们必须跟踪哪些吉他有库存、库存数量以及价格。这就是inventory表的作用:

**sku               name                  price   stock** LPTD19HSNH1       Gibson Les Paul        2000       6
1-014-9763-300    Fender Jazzmaster      1799       3
IRONMK1KH80BK     BC Rich Ironbird       1099       4

每一行都基于sku是唯一的:这是表的primary key。主键在插入时非常重要。

我们每天接收到的数据集可能如下所示:

**sku               name                 price   stock** LPTD19HSNH1       Gibson Les Paul       2000       4
1-014-9763-300    Fender Jazzmaster     1700       3
DSV00ANCH1        Gibson Flying V       2499       1

我们的目标是将新数据UPSERTinventory表中:

  • INSERT 新记录(如 Gibson Flying V)

  • UPDATE 现有记录(例如 Fender Jazzmaster 的新价格)

## 用两行代码处理你的 Python 程序

通过同时执行多个操作来加速你的程序

towardsdatascience.com

使用 SQLAlchemy 进行 UPSERT

我们将使用 SQLAlchemy 进行 3 个步骤的 UPSERT。

在这篇文章中,我假设你对 SQLAlchemy 已经有所了解,所以我不会详细讲解,因为这超出了我们当前的范围,但我会提供更多深入解释的文章链接。还可以查看 这个链接 以获取有关 SQLAlchemy 的更多文章。

1. 设置我们的数据库和连接

首先,我们声明一个名为‘Guitar’的模型。这对应于我们库存表中的一行。注意,它有一个名为sku的列,作为主键。

# SQLAlchemy needs a declarative_base when we use declarative models like Guitar
Base = declarative_base()

# Guitar will be one record in our inventory table
class Guitar(Base):
    __tablename__ = 'inventory'
    sku: typing.Optional[str] = sa.Column(type_=sa.String, primary_key=True)
    name: str = sa.Column(type_=sa.String)
    stock:int = sa.Column(type_=sa.Integer)
    price: int = sa.Column(type_=sa.Integer)

    def __repr__(self):
        return f"<{self.name} (price=${self.price} - stock=#{self.stock}>"

# Create a database engine (sqlite in this case)
dbEngine = sa.create_engine(url="sqlite:///inventory_db.db", echo=False)

# Create all tables in the database engine
Base.metadata.create_all(bind=dbEngine)

接下来,我们为我们的 sqlite 数据库创建一个数据库引擎(查看 这篇文章 以获取更多信息),并使用它来创建inventory表。

## 永远不需要再写 SQL:SQLAlchemy 的 ORM 为绝对初学者

使用这个 ORM,你可以创建表格、插入、读取、删除和更新数据,而无需编写一行 SQL

towardsdatascience.com

2. 将数据插入到inventory表中

接下来,我们将创建一些Guitar模型的实例,并使用 SQLAlchemy 的Session对象将它们插入数据库:

with Session(dbEngine) as session:
    session.add_all([
        Guitar(sku="LPTD19HSNH1", name="Gibson Les Paul", price=2000, stock=6),
        Guitar(sku="1-014-9763-300", name="Fender Jazzmaster", price=1799, stock=3),
        Guitar(sku="IRONMK1KH80BK", name="BC Rich Ironbird", price=1099, stock=4),
    ])
    session.commit()

当我们 SELECT * FROM inventory 时,我们可以看到inventory表中的内容:

**sku               name                  price   stock** LPTD19HSNH1       Gibson Les Paul        2000       6
1-014-9763-300    Fender Jazzmaster      1799       3
IRONMK1KH80BK     BC Rich Ironbird       1099       4

接下来,我们将接收一个包含新每日库存的数据集。我们需要插入新的Guitar记录,并更新我们当前inventory中的记录。

## 在 Docker 中开始使用 Postgres

为初学者创建一个 Docker 容器中的 Postgres 数据库

towardsdatascience.com

3. 将数据 UPSERT 到库存表中

最后是 UPSERT 的时候了!开始吧:

# Convert the new stock to a list of Guitar objects
new_stock:[Guitar] = [
    Guitar(sku="LPTD19HSNH1", name="Gibson Les Paul", price=2000, stock=4),      # sold 2 les pauls
    Guitar(sku="1-014-9763-300", name="Fender Jazzmaster", price=1700, stock=3), # lowered price on jazzmaster
    Guitar(sku="DSV00ANCH1", name="Gibson Flying V", price=2499, stock=1),       # new guitar in stock!
]

# Use the session and UPSERT using the "merge" method
with Session(dbEngine) as session:
    for guitar in new_stock:
        session.merge(guitar)
    session.commit()

正如你所见,我们使用 session.merge。此方法分析我们的 new_stock 并检查提供的 sku 值是否已存在于 inventory 表中。如果 sku 存在,它会执行更新,否则它会插入新的吉他。

这是结果表:

**sku               name                  price   stock** LPTD19HSNH1       Gibson Les Paul        2000       4    << stock decreased by 2
1-014-9763-300    Fender Jazzmaster      1700       3    << price lowered by $99
IRONMK1KH80BK     BC Rich Ironbird       1099       4    << no chnages
DSV00ANCH1        Gibson Flying V        2499       1    << new in stock!

一点需要注意的是,merge 方法与 SQL 中的 MERGE 不同,因为它仅执行插入和更新。如果你想要更细粒度的控制,查看 这篇文章,它展示了如何在 SQL 中用一条语句进行删除/更新/插入。

## 使用 OpenCV 进行运动检测 — 初学者的图像分析

如何使用 OpenCV 检测和分析移动物体

towardsdatascience.com

结论

正如我们所见,当使用 SQLAlchemy ORM 时,UPSERT 非常简单。查看我的其他文章 这里,以了解 Python、SQLAlchemy、Docker 和数据库的一些用途!

我希望这篇文章能够如我所期望的那样清晰,但如果不是这种情况,请告诉我我可以做些什么来进一步澄清。同时,查看我关于各种编程相关主题的 其他文章

编程愉快!

— Mike

附言:喜欢我所做的工作吗? 关注我!

[## 通过我的推荐链接加入 Medium - Mike Huls

阅读 Mike Huls 的每个故事(以及 Medium 上其他成千上万的作家的故事)。你的会员费用直接支持 Mike…

mikehuls.medium.com](https://mikehuls.medium.com/membership?source=post_page-----9dae87a75c35--------------------------------)

提示工程的崭新艺术

原文:towardsdatascience.com/the-emerging-art-of-prompt-engineering-b86fa70de6ca?source=collection_archive---------8-----------------------#2023-05-18

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

·

关注 发表在 Towards Data Science · 发送至 通讯 · 3 分钟阅读 · 2023 年 5 月 18 日

现在,即使是最随意的生成式 AI 爱好者也知道,提示的具体性在很大程度上决定了模型输出的质量——无论是现实的图像、相关的段落,还是实际上有效的代码块。

许多行业领袖声称,提示工程——即调整输入以提高模型的任务表现——是一项有着有限有效期的技能,因为 AI 技术发展迅速。这尚待观察;目前以及可预见的未来,设计更好的提示仍然是一项值得数据和机器学习从业者关注的实用技能。

为了帮助您发展提示技能,我们选择了一些关于这一主题的最佳近期文章,涵盖了各种使用案例和经验水平。让我们开始吧!

  • 如果您对与大型语言模型一起工作还很陌生,一个很好的起点是Olivia Tanuwidjaja面向数据分析师的提示工程指南,该指南提供了对常见方法的高层次(但详尽)概述。

  • LLM(大型语言模型)执行未经专门训练的任务的能力依赖于用户的提示创造力和敏捷思维。举个例子:Jye Sawtell-Rickson尝试使用 ChatGPT 进行探索性数据分析

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

Jackie Hope拍摄的照片,来自Unsplash

  • 要展示您新获得的 LLM 知识,Leonie Monigatti提议10 个可以添加到您的作品集的项目想法——并详细介绍了您在此过程中需要使用的各种提示类型。

  • 对于语言模型内部工作原理的更深入理解Scott LundbergMarco Tulio Ribeiro讨论了语言模型使用的“贪婪标记化方法可能会在您的提示中引入微妙而强大的偏见,导致令人困惑的生成结果。”

如果您还没有完全满足于思想深刻、专业呈现的文章,想要超越提示设计,我们为您提供:

  • 从不同(更加不祥)的角度探索 LLM,Parul Pandey审视了有关语言模型对恶意行为者进行毒化攻击的研究作品[/exploring-the-vulnerability-of-language-models-to-poisoning-attacks-d6d03bcc5ecb]。

  • Sachin Date的最新深度探讨是关于随机变量的全面且严肃但又引人入胜的指南,这正是你一直想要的。

  • 在机器学习管道中,保持简单说起来容易,但Hennie de Harder关于构建最简可行产品(MVP)的见解将激励你专注于项目中最重要的元素。

  • 量子计算是否即将颠覆统计学的基础?Tim Lou, PhD 解读了赢得 2022 年物理学诺贝尔奖的工作的意义。

  • 想了解数据导向编程及其与面向对象编程(OOP)的区别,千万不要错过Tam D Tran-The的有用(并且包含代码片段)的解释。

感谢你支持我们的作者!如果你喜欢在 TDS 上阅读的文章,可以考虑成为 Medium 会员——这将解锁我们的整个档案(以及 Medium 上的所有其他帖子)。

直到下一个变量,

TDS 编辑部

蛋白质设计的机器学习时代,概括为四种关键方法

原文:towardsdatascience.com/the-era-of-machine-learning-for-protein-design-summarized-in-four-key-methods-d6f1dac5de96

感谢这些基于人工智能的方法和工具,蛋白质生物技术迎来了如此激动人心的时代

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

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

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

图由作者使用 Dall-E-2 和自定义编辑创建。

蛋白质设计和工程是分子生物学中的重要目标,具有广泛的应用,包括医学、生物技术和材料科学等领域。科学家们已经探索了几十种设计新型蛋白质和工程现有蛋白质以微调其性质的方法。尽管基于物理的方法在找到折叠成特定蛋白质结构的氨基酸序列方面取得了一些成功,但深度学习方法的最新发展显示出了更高的成功率和多样性。在这篇文章中,我将概述四种值得注意的机器学习(ML)工具,用于蛋白质设计和工程,并探讨它们在推动该领域发展中的重要性。

除了这些工具在化学和生物科学领域立即产生的影响之外,它们引入的方法甚至这些项目本身也为数据科学家、机器学习从业者和人工智能研究人员提供了令人兴奋的机会,让他们可以与化学和生物科学家合作,提出新想法和方法,最终将计算机科学应用于有益的领域。实际上,以下我要讨论的工具展示了应用不同种类的深度学习算法来解决生物技术中的复杂挑战的强大能力。通过利用这些工具,数据科学、机器学习和人工智能领域的专业人士也可以为医学、生物技术和材料科学的进步做出贡献,亲眼见证自己领域的直接影响,即使在其领域之外!

简而言之,我将按发布顺序介绍称为 ProteinMPNN、ESM2-InverseFold、RoseTTaFold Diffusion 和 MASIF-Seed 的工具。重要的是,这些模型都在 Deepmind 的 AlphaFold 模型对结构生物学领域产生巨大影响之后开始出名:

[## 一年多的 AlphaFold 2 免费使用及其在生物学中引发的革命

蛋白质结构的自信建模、预测其与其他生物分子的相互作用,甚至蛋白质…

medium.com](https://medium.com/advances-in-biological-science/over-one-year-of-alphafold-2-free-for-everyone-to-use-and-of-the-revolution-it-triggered-in-biology-f12cac8c88c6?source=post_page-----d6f1dac5de96--------------------------------)

ProteinMPNN

ProteinMPNN,由贝克实验室开发,是第一个获得实验测试设计蛋白质的机器学习工具。

这个模型基于编码器-解码器神经网络,是第一个显示生成经过实验验证能按预期折叠的蛋白质序列的工具。两篇论文,“基于深度学习的蛋白质序列设计使用 ProteinMPNN”和“幻想对称蛋白质组装”,发表于Science期刊的 2022 年底,展示了该方法(前者)和该工具在各种蛋白质设计问题中的适用性(后者)。

我专门写了一篇关于 ProteinMPNN 的博客文章,尽管这篇文章已经算“旧”(尽管发布不到一年,展示了领域发展的速度!)。所以我不会在这里多讲,你可以查看我之前的文章:

## 新的深度学习工具高精度设计新型蛋白质

贝克实验室的这款新软件设计的蛋白质在湿实验室中实际有效。你可以用它来…

towardsdatascience.com

ESM-InverseFold

由 Meta 开发的 ESM2-InverseFold 基于 ESMFold 蛋白质语言模型,但其设计目的是从结构生成蛋白质序列,而不是从序列预测结构。

发现 ESMFold 能生成在已知自然序列之外高度多样的蛋白质序列。预印本《语言模型超越自然蛋白质的泛化》描述了其核心功能,并展示了几个成功的设计例子。

要了解更多关于 ESMFold 的信息,请查看我之前的文章:

## 巨大的蛋白质语言模型如何扰乱结构生物学

结构预测的准确性与 AlphaFold 相似,但速度快达 60 倍,并且开发了新的 AI 方法。

[towardsdatascience.com

这是基于此的蛋白质设计工具“ESM-InverseFold”的预印本:

[## 语言模型超越自然蛋白质的一般化

从进化过程中序列中学习蛋白质设计模式可能对生成性蛋白质有潜力。

www.biorxiv.org

ESM-InverseFold 是一个蛋白质设计工具,利用机器学习生成前所未见的新蛋白质。该工具基于语言模型,这些模型通过掩码语言建模在进化过程中对数百万种不同的自然蛋白质进行了训练。这些模型生成的基序将序列与结构设计关联,并能在新的序列和结构背景中应用它们。ESM-InverseFold 提供了两种生成性蛋白质设计任务:固定骨架设计和自由生成。固定骨架设计通过从语言模型指定的条件分布中使用马尔科夫链蒙特卡洛法和模拟退火来生成蛋白质序列。自由生成完全移除结构上的约束,通过从语言模型指定的序列和结构的联合分布中进行采样来生成新蛋白质。ESM-InverseFold 显示出高实验成功率,在 67%的评估蛋白质中通过尺寸排除色谱法产生了可溶解且单体化的物种。正如作者所示,该工具使用的语言模型能够访问超越自然蛋白质的设计空间,基于蛋白质设计的深层模式生成新颖的解决方案,包括自然蛋白质中的结构基序。

RoseTTAFold Diffusion

基于扩散模型的 RoseTTAFold Diffusion 是贝克实验室最新的工具,也已在 bioRxiv 上预印。

[## 广泛适用且准确的蛋白质设计,通过整合结构预测网络和…

最近在使用深度学习方法设计新蛋白质方面取得了相当大的进展[1][1]-[9][2]。尽管…

www.biorxiv.org

来自 Baker 实验室博客,目前 Rosetta 套件中表现最好的蛋白质设计方法是:

## 蛋白质设计的扩散模型

由 Baker 实验室科学家 Joseph Watson、David Juergens、Nate Bennett、Brian Trippe 和 Jason Yim 领导的团队创建了…

www.bakerlab.org

RoseTTaFold Diffusion 是一种基于去噪扩散概率模型的生成模型,利用深度学习从简单的分子规格生成多样、复杂且功能性的蛋白质。它通过在蛋白质结构去噪任务上微调 RoseTTaFold 结构预测网络,获得蛋白质主链的生成模型。RoseTTaFold Diffusion 通过模拟在训练过程中从蛋白质数据银行中采样的结构的噪声过程生成蛋白质结构。该方法通过将先前步骤中的噪声坐标转化为预测结构来生成新的蛋白质结构,这些预测结构以模型的输入为条件,这些输入可以包括部分序列、折叠信息或固定功能基序坐标。该方法使用两种不同策略进行训练:1)类似于“经典”扩散模型的方式,在每个时间步的预测独立于前一个时间步的预测;2)具有自我条件化,模型可以在时间步之间条件化先前的预测。RoseTTaFold Diffusion 可以在没有额外输入的情况下生成蛋白质结构,也可以通过对各种输入进行条件化来生成蛋白质结构,并且能够生成与任何已知蛋白质结构具有较少总体结构相似性的多样蛋白质结构。该方法在蛋白质结构生成方面优于其他深度学习方法,并且在广泛的设计挑战中表现出最先进的性能,包括蛋白质单体设计、蛋白质结合体设计、对称寡聚体设计、酶活性位点支架设计以及治疗性和金属结合蛋白质设计的对称基序支架设计。

MaSIF-seed

MaSIF-seed,由Michael Bronstein实验室和我的机构(EPFL 扩展学院)的 Correia 实验室共同合作,并于本月在Nature上发表,专注于通过学习的蛋白质表面指纹设计蛋白质相互作用:

## De novo design of protein interactions with learned surface fingerprints - Nature

蛋白质之间的物理相互作用对于大多数生命过程至关重要。然而,…

## De novo design of protein interactions with learned surface fingerprints - Nature

该工具在设计蛋白质单体和聚合物方面表现出色,包括目标结合蛋白质和自然界中未见的结构。它基于自身团队的前期工作 Masif,一种从表面特征预测相互作用的机器学习工具。

与其他方法相比,Masif-seed 采用以表面为中心的方法,专注于蛋白质的表面特性及表面斑点之间的相互作用。它的神经网络输出向量指纹描述符,这些描述符在相互作用的蛋白质对的斑点之间是互补的,而在非相互作用的对之间则不同。匹配的表面斑点与目标位点对齐,并用第二个神经网络进行评分,该网络输出界面后对齐分数,以进一步提高表面描述符的区分性能。与其他工具相比,MaSIF-seed 在基于丰富的表面特征区分真实结合物和诱饵方面表现出色。此外,它比其他方法假设上更快且更准确。

介绍该方法的论文描述了多个使用该工具设计全新蛋白质结合物以接触具有挑战性和与疾病相关的蛋白质靶点的例子。使用 MaSIF-seed 的完整蛋白质设计流程包括几个步骤,从识别具有高结合倾向的蛋白质靶点位点开始,然后从源自片段的表面指纹数据库中搜索子集,以寻找可能靶向所选位点的结合种子,然后使用专门的 Rosetta 协议将其移植到与种子的结合模式兼容的蛋白质支架上。最后,优化结合物界面,并在实际应用中,通过突变库实验筛选设计,以微调最终序列。

设计蛋白质序列以折叠并按科学家的需求工作

在所有这四种工具中,模型的输入是一个骨架结构,可能有某些氨基酸身份被限制,模型会在此基础上制作预期按设计折叠的蛋白质序列。虽然这些模型可以生成相互作用的蛋白质序列,但它们无法在设计过程中原生考虑非蛋白质分子。这一限制阻碍了它们在涉及与非蛋白质分子结合的设计中的应用,除非用户根据所需功能手动修正某些残基。尽管这种策略有些低效,因为需要了解感兴趣的系统,但它已在 2023 年初由贝克实验室在酶的设计中取得了成功:

## 从头设计萤光素酶使用深度学习 - Nature

从头设计酶的目标是引入预测能催化反应的活性位点和底物结合口袋…

www.nature.com

就像那个例子一样,这些工具的发展为设计新型蛋白质和工程改造现有蛋白质开辟了激动人心的可能性。这些工具在药物开发、材料科学和生物技术领域特别有用,可以将蛋白质的性质精细调节以满足特定需求。生成经过实验验证的按预期折叠的蛋白质序列的能力,对新治疗方法和疗法的开发具有巨大意义,特别是对于复杂疾病。例如,请参见这种特殊类型的类似疫苗的制剂,它由计算机设计的蛋白质表位混合而成——目前使用的是更传统的物理工具。

此外,这些工具有可能显著减少蛋白质设计和工程所需的时间和资源,使这一研究领域更加可及。它们也更容易部署和运行,这进一步帮助了其使用的民主化。实际上,看看你可以多么轻松地将常规 ESMFold 适配为分析现实蛋白质设计,例如来自 HuggingFace 上运行的 ProteinMPNN,仅在你的网页浏览器中:

## 通过共识方法设计稳定蛋白质的网页应用,使用 JavaScript、ESMFold 创建…

融合现代技术和工具进行高效工作,创建一个实现最简单但如今最…

javascript.plainenglish.io](https://javascript.plainenglish.io/a-web-app-to-design-stable-proteins-via-the-consensus-method-created-with-javascript-esmfold-and-d319d2441ae7?source=post_page-----d6f1dac5de96--------------------------------)

总结来说,我们可以毫不犹豫地声明,在经历了 AlphaFold 的蛋白质结构预测炒作之后,我们现在正处于蛋白质设计的炒作浪潮中,每月都有新方法出现,而我在这里介绍了我认为目前最相关的四种方法——主要因为它们都经过了实验验证。

这些新的蛋白质设计模型展示了令人印象深刻的结果,并且无疑将在不久的将来成为蛋白质生物技术实验室和公司的重要组成部分。尽管仍存在限制,这些工具的潜在应用巨大,预计在未来几年将对医学、生物技术和材料科学产生重大影响。

相关文章

了解计算机建模、模拟和人工智能如何影响蛋白质工程,请查看此内容:

[## 计算机建模、模拟和人工智能如何影响蛋白质工程的…

概述了不同复杂度、成功率和应用的计算方法,并指向关键…

medium.com](https://medium.com/advances-in-biological-science/how-computer-modeling-simulations-and-artificial-intelligence-impact-protein-engineering-in-4d8473bd59ff?source=post_page-----d6f1dac5de96--------------------------------)

在这篇文章中,我探讨了为什么蛋白质设计/工程问题如此困难,即便是针对单一残基:

[## 论文总结:为什么预测稳定性变化如此困难,当一种…

Louis 和 Abriata。分子生物技术 2021 [开放访问这里]

lucianosphere.medium.com](https://lucianosphere.medium.com/why-is-it-so-difficult-to-predict-the-changes-in-stability-that-result-when-a-protein-is-mutated-2df96b2037c5?source=post_page-----d6f1dac5de96--------------------------------)

你可能还会对我关于在科学中平衡机器学习质量和数量的文章感兴趣,其中我特别讨论了与蛋白质设计的 ML 模型相关的内容:

## “ML-一切”?在科学中平衡机器学习方法的数量和质量

对于适当的验证和良好的数据集的需求,客观和均衡,以及预测在现实中有用的…

[towardsdatascience.com

www.lucianoabriata.com 我撰写并拍摄关于我广泛兴趣领域的一切内容:自然、科学、技术、编程等。 成为 Medium 会员 以访问所有故事(平台的会员链接,您无需付费即可获得我少量收入)并 订阅以通过电子邮件获取我的新故事 。要 咨询关于小项目的事宜, 请查看我的 服务页面。您可以 在这里联系我

用一行代码构建一个分割模型

原文:towardsdatascience.com/the-essential-library-to-build-segmentation-models-6e17e81338e

以最快的方式构建和训练图像分割神经网络模型

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

·发表在Towards Data Science ·阅读时间 6 分钟·2023 年 3 月 6 日

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

MartinThoma,CC0,通过 Wikimedia Commons(已编辑)

神经网络模型在解决分割问题上已被证明非常有效,达到了最先进的准确率。它们在医学图像分析、自动驾驶、机器人技术、卫星图像、视频监控等各种应用中取得了显著的改进。然而,构建这些模型通常需要较长时间,但阅读完本指南后,你将能够用仅仅几行代码来构建一个模型。

目录

  1. 介绍

  2. 构建模块

  3. 构建模型

  4. 训练模型

介绍

分割是将图像根据某些特征或属性划分为多个片段或区域的任务。一个分割模型以图像为输入,并返回一个分割掩码:

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

(左)输入图像 | (右)其分割掩码。两张图像均来自PyTorch

分割神经网络模型由两个部分组成:

  • 一个编码器:接受输入图像并提取特征。编码器的例子包括 ResNet、EfficientNet 和 ViT。

  • 一个解码器:提取特征并生成分割掩码。解码器的架构各不相同。例如的架构包括 U-Net、FPN 和 DeepLab。

因此,在为特定应用构建分割模型时,你需要选择一个架构和一个编码器。然而,在不测试多个组合的情况下,很难选择最佳组合。这通常需要很长时间,因为更改模型需要编写大量的样板代码。Segmentation Models 库解决了这个问题。它允许你通过指定架构和编码器在一行代码中创建一个模型。然后,你只需修改该行代码即可更改其中的一个。

要从 PyPI 安装最新版本的 Segmentation Models,请使用:

pip install segmentation-models-pytorch

构建模块

该库为大多数分割架构提供了一个类,每个类都可以与任何可用的编码器一起使用。在下一部分中,你将看到要构建模型,你需要实例化所选架构的类,并将所选编码器的字符串作为参数传递。下图显示了库提供的每个架构的类名称:

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

库提供的所有架构的类别名称。

下图显示了库提供的最常见编码器的名称:

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

库提供的最常见编码器的名称。

目前有超过 400 种编码器,因此不可能一一展示,但你可以在这里找到完整的列表。

构建模型

一旦从上面的图中选择了架构和编码器,构建模型就非常简单:

参数:

  • encoder_name 是所选编码器的名称(例如:resnet50、efficientnet-b7、mit_b5)。

  • encoder_weights 是预训练数据集。如果 encoder_weights 等于 "imagenet",则编码器权重将使用 ImageNet 预训练权重初始化。所有编码器至少有一种预训练模型,完整列表可以在这里找到。

  • in_channels 是输入图像的通道数(如果是 RGB,则为 3)。

    即使 in_channels 不是 3,也可以使用 ImageNet 预训练模型:第一层将通过重用预训练的第一个卷积层的权重来初始化(该过程描述这里)。

  • out_classes 是数据集中的类别数量。

  • activation 是输出层的激活函数。可选的值有 None(默认)、sigmoidsoftmax

    注意: 当使用期望 logits 作为输入的损失函数时,激活函数必须为 None。例如,当使用 CrossEntropyLoss 函数时,activation 必须为 None

训练模型

本节展示了执行训练所需的所有代码。然而,这个库不会改变训练和验证模型的常规流程。为了简化过程,该库提供了许多损失函数的实现,例如Jaccard Loss, Dice Loss, Dice Cross-Entropy Loss, Focal Loss,以及Accuracy, Precision, Recall, F1Score, 和 IOUScore等指标。有关它们及其参数的完整列表,请查阅LossesMetrics部分的文档。

提议的训练示例是使用Oxford-IIIT Pet Dataset进行二分类分割(将通过代码下载)。以下是数据集中的两个样本:

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

Oxford-IIIT Pet Dataset 中的一只猫的样本。

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

Oxford-IIIT Pet Dataset 中的一只狗的样本。

最后,这些是执行此类分割任务的所有步骤:

  1. 构建模型。

根据你将使用的损失函数设置最后一层的激活函数。

  1. 定义参数。

请记住,在使用预训练模型时,输入应通过使用训练预训练模型时的数据的均值和标准差来进行归一化。

  1. 定义训练函数。

这里没有改变,你在不使用库的情况下训练模型时所编写的训练函数。

  1. 定义验证函数。

真阳性、假阳性、假阴性和真阴性从批次中一起求和,仅在批次结束时计算指标。请注意,logits 必须转换为类别后才能计算指标。调用训练函数开始训练。

  1. 使用模型。

这些是一些分割示例:

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

结论

这个库包含了你实验分割所需的一切。构建模型和应用更改非常简单,并且大多数损失函数和指标都已提供。此外,使用这个库不会改变我们习惯的流程。有关更多信息,请参见官方文档。我还在参考文献中包括了一些最常见的编码器和架构。

Oxford-IIIT Pet Dataset创作共用署名-相同方式共享 4.0 国际许可协议下可供下载用于商业/研究目的。版权归图像的原始所有者所有。

所有图像,除非另有说明,均由作者提供。感谢阅读,希望你觉得这些信息有用。

[1] O. Ronneberger, P. Fischer 和 T. Brox, U-Net: 用于生物医学图像分割的卷积网络 (2015)

[2] Z. Zhou, Md. M. R. Siddiquee, N. Tajbakhsh 和 J. Liang, UNet++: 一种嵌套的 U-Net 架构用于医学图像分割 (2018)

[3] L. Chen, G. Papandreou, F. Schroff, H. Adam, 重新思考用于语义图像分割的膨胀卷积 (2017)

[4] L. Chen, Y. Zhu, G. Papandreou, F. Schroff, H. Adam, 用于语义图像分割的编码器-解码器与膨胀可分离卷积 (2018)

[5] R. Li, S. Zheng, C. Duan, C. Zhang, J. Su, P.M. Atkinson, 用于细分辨率遥感图像语义分割的多注意力网络 (2020)

[6] A. Chaurasia, E. Culurciello, LinkNet: 利用编码器表示进行高效的语义分割 (2017)

[7] T. Lin, P. Dollár, R. Girshick, K. He, B. Hariharan, S. Belongie, 用于目标检测的特征金字塔网络 (2017)

[8] H. Zhao, J. Shi, X. Qi, X. Wang, J. Jia, 金字塔场景解析网络 (2016)

[9] H. Li, P. Xiong, J. An, L. Wang, 用于语义分割的金字塔注意力网络 (2018)

[10] K. Simonyan, A. Zisserman, 用于大规模图像识别的非常深的卷积网络 (2014)

[11] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun, 用于图像识别的深度残差学习 (2015)

[12] S. Xie, R. Girshick, P. Dollár, Z. Tu, K. He, 深度神经网络的聚合残差变换 (2016)

[13] J. Hu, L. Shen, S. Albanie, G. Sun, E. Wu, 压缩-激励网络 (2017)

[14] G. Huang, Z. Liu, L. van der Maaten, K. Q. Weinberger, 密集连接卷积网络 (2016)

[15] M. Tan, Q. V. Le, EfficientNet: 重新思考卷积神经网络的模型缩放 (2019)

[16] E. Xie, W. Wang, Z. Yu, A. Anandkumar, J. M. Alvarez, P. Luo, SegFormer: 基于 Transformers 的简单高效语义分割设计 (2021)

设施分布问题:混合整数规划模型

原文:towardsdatascience.com/the-facility-dispersion-problem-mixed-integer-programming-models-98ffdb56cd26?source=collection_archive---------2-----------------------#2023-09-09

关于 p-dispersion 和 maxisum 模型的全面 Python 教程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 布鲁诺·斯卡利亚 C. F. 莱特

·

关注 发表在 数据科学之道 ·10 分钟阅读·2023 年 9 月 9 日

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

Z 提供的照片,来源于 Unsplash

在某些设施选址问题中,需要将设施布置得使得一个设施的影响力不会盖过或对其他设施产生不利影响。无论是出于风险缓解、避免竞争还是其他考虑,掌握这些挑战的解决方案是运筹学工具箱中的一个关键技能。

Kuby(1987)提出了两种不同的混合整数规划(MIP)公式:p-分散问题和 maxisum 问题。在这篇文章中,将使用 Python 库 Pyomo 和 HiGHS 求解器实现这两种问题。

除了这两个模型之外,还将介绍一些有用的建模资源。首先,在线性规划(MIP)背景下线性化二进制变量乘积的策略,尽管考虑到最大化目标,这在本问题中不需要显式说明。其次,一种最大-最小 MIP 公式,旨在最大化比一组项目的任何参数都小的某些东西,如果该项目被选中。最后,一种解决多目标的策略,具有明确的优先级层次结构,结合了这两个模型的元素。

对于尚未熟悉数值优化的人,可以参考我之前关于线性规划分支限界 方法的故事,以帮助理解。

如常,你可以在这个 git 仓库 找到完整的代码。

你会选择哪些位置来放置 5 个设施?

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

设施分散问题中的可能位置。(图片来自作者)。

二进制变量的乘积

在定义此问题的基本元素时,可以使用二进制变量,如果选择了某个位置,则该变量为 1,否则为 0。我们用 xᵢ 来表示这些变量。假设两个位置之间的距离(或其他分散度量)已经计算出来,记作 dᵢⱼ。我们如何计算所选设施对的分散度?

在这种情况下,使用二进制变量 xᵢxⱼ 的乘积来计算它们都包含在解决方案中时的异质性是直观的。这种方法等同于逻辑与(AND)语句。然而,这将导致二次公式,因此无法使用线性求解器。幸运的是,有一种方法可以通过几个约束在 MIP 中公式化二进制变量的乘积。

考虑一个有向图 G(V, A) 和一个新的二进制变量 zᵢⱼ,它指示节点 ij 都被选择。如果 ij 其中之一未被选择,则 zᵢⱼ 必须为 0。这就产生了第一组约束:

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

二进制变量乘积的线性化约束的第一组。(图片来自作者)。

目前,即使选择了 ijzᵢⱼ 仍可以为 0。因此,我们必须包括一个额外的约束,使得当 ij 被选择时,zᵢⱼ 变为 1。

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

线性化形式的二进制变量乘积的第二组约束。(图片由作者提供)。

当最大化与zᵢⱼ成比例的某物时,如maxisum问题,第二组约束是不必要的,因为如果可行的话,不计算与zᵢⱼ成比例的收益是没有意义的。然而,在制定其他 MIP 模型时,这可能是有用的。

在接下来的部分,让我们将这些概念应用于maxisum问题。

maxisum模型

离散maxisum问题必须定义在N个离散节点中p个设施的位置,以最大化计算在所有选定设施对之间的距离(或距离的平均值)的总和。因此,考虑设施是分布在有向图G(V, A)中的节点。每条从ij的弧的权重是已知的距离(离散)度量dᵢⱼ。同时,考虑二进制变量xᵢ表示位置i是否被选择,以及zᵢⱼ表示ij是否都被选择。

目标可以陈述如下:

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

除了前一节中提出的将二进制变量的乘积线性化的约束外,还需要加入一个约束以保证选择了p个位置。

因此,我们可以将问题的约束陈述为:

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

让我们使用 Python 将其转化为代码。为此,我们必须首先导入将要使用的库。numpy库将用于线性代数计算和创建随机坐标点;scipy 中的squareformpdist函数将用于根据坐标矩阵计算距离;matplotlib将作为我们的可视化工具;pyomo则是代数建模语言(AML)(与求解器 HiGHS)。

import numpy as np
from scipy.spatial.distance import squareform, pdist
import matplotlib.pyplot as plt
import pyomo.environ as pyo
from pyomo.contrib.appsi.solvers.highs import Highs

我们必须创建N个点,并定义其中多少个必须被选为设施位置。通过在每次代码执行时固定随机种子(12),应能获得引言中所示的点。

# Fix random seeds
np.random.seed(12)

# Create random points
N = 25
p = 5
coordinates = np.random.random((N, 2))

# Calculate pairwise distances
distances = squareform(pdist(coordinates))

我们现在具备了开始我们的pyomo模型所需的必要元素。

pyomo中建模问题有两种方法:Abstract模型和Concrete模型。在第一种方法中,问题的代数表达式在提供一些数据值之前定义,而在第二种方法中,模型实例在定义其元素时立即创建。你可以在库文档或 Bynum 等(2021 年)的书中找到有关这些方法的更多信息。在本文中,我们将采用Concrete模型形式。

model = pyo.ConcreteModel()

在这个模型中,我们有两个集合:节点和弧。由于我们考虑的是一个完整的有向图,因此每对两个节点之间存在弧,除了从节点到自身的弧。

# Sets of nodes and arcs
model.V = pyo.Set(initialize=range(N))
model.A = pyo.Set(initialize=[(i, j) for i in model.V for j in model.V if i != j])

预先提供的参数是必须选择的节点数量以及节点对之间的距离。

# Parameters
model.d = pyo.Param(model.A, initialize={(i, j): distances[i, j] for (i, j) in model.A})
model.p = pyo.Param(initialize=p)

然后,我们引入决策变量。

# Decision variables
model.x = pyo.Var(model.V, within=pyo.Binary)
model.z = pyo.Var(model.A, within=pyo.Binary)

以及约束条件……

# p nodes are selected
def p_selection(model):
    return sum(model.x[:]) == model.p

# If starting node is not selected, the arc is 0
def dispersion_c1(model, i, j):
    return model.z[i, j] <= model.x[i]

# If ending node is not selected, the arc is 0
def dispersion_c2(model, i, j):
    return model.z[i, j] <= model.x[j]

# Include constraints in model
model.p_selection = pyo.Constraint(rule=p_selection)
model.dispersion_c1 = pyo.Constraint(model.A, rule=dispersion_c1)
model.dispersion_c2 = pyo.Constraint(model.A, rule=dispersion_c2)

最后,我们必须创建目标函数。

def disp_obj(model):
    return sum(model.z[i, j] * model.d[i, j] for (i, j) in model.A)

model.obj = pyo.Objective(rule=disp_obj, sense=pyo.maximize)

现在maxisum模型已经准备好解决了。我们需要实例化一个与pyomo兼容的求解器来处理它。Highs求解器在Pyomo中可用(请查看导入),自 6.4.3 版本起,如果安装了highspy包。所以请确保运行pip install highspy

solver = Highs()
solver.solve(model)

在大约 120 秒的计算时间后,我们得到了以下结果:

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

最大和模型结果。(作者提供的图像)。

请注意,即使总离散度被最大化,左上角的两个设施仍然彼此非常接近,这可能是不希望的。因此,除了maxisum公式之外,我们还有p-离散模型,其中我们最大化任何选定节点对之间的最小距离。

p-离散模型

p-离散模型中,我们需要一个额外的决策变量来计算所有选定节点对之间的最小距离,这也是我们的最大化目标。我们将这个变量称为D。我们必须创建一个大 M 约束,确保如果ij都被选择,D小于或等于dᵢⱼ;否则,我们必须确保D是无限的。如果我们保持zᵢⱼ作为二进制变量的乘积的公式,我们可以将这个额外的约束公式化如下。

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

二进制变量乘积的最大-最小约束。(作者提供的图像)。

在这种公式中,M是一个任意大的固定参数,用于制定一个析取规则。M的选择应该足够大,以保证在zᵢⱼ为零时,约束(i, j)对任何D值都是可行的,但又尽可能小,以使模型的线性松弛版本与整数版本相似,从而使收敛更容易。在这个问题中,dᵢⱼ的最大值可能是一个有趣的替代选择。

尽管这种公式对于这个模型效果很好,但可以使用更简洁的方法,其中变量zᵢⱼ甚至不包含在模型中。

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

节点变量的最大-最小约束。(作者提供的图像)。

在这种公式中,xᵢxⱼ等于零是保证不等式对任何D值有效的充分条件。目标变为简单地最大化D

在接下来的 Python 代码中,考虑到我们有一个新模型,其集合和参数与之前的相同,以及决策变量组x

# Max-min constraint
def maxmin_rule(model, i, j):
    return model.D <= model.d[i, j] + model.M * (1 - model.x[i]) + model.M * (1 - model.x[j])

# New parameter big M
model.M = max(model.d[:, :])

# New variable
model.D = pyo.Var(within=pyo.NonNegativeReals)

# New constraint
model.maxmin_rule = pyo.Constraint(model.A, rule=maxmin_rule)

# Objective
model.obj = pyo.Objective(expr=model.D, sense=pyo.maximize)

调用求解器后,花费了不到 1.2 秒获得以下结果。

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

p-离散模型结果。(作者提供的图像)。

看起来很好,因为位置在空间中分布均匀。

有没有办法改善这种分布?

一种多标准方法

记住 p-离散 模型的目标函数仅依赖于选定节点对之间的最小距离。因此,可以通过定义该距离的两点的组合以及其他距离大于或等于目标本身的点来获得多个解。我们能否通过选择这些替代方案中的最佳来优化我们的解?这导致了 Kuby(1987)提出的 两步 “多标准方法”。

在第一步中,p-离散模型被求解到最优解,当前目标值被存储在参数d_opt中。接着,解决一个带有附加约束的 maxisum 模型,确保 Dd_opt,以获得在 p-离散模型的最优解中,具有最大总离散度的解。

在 Python 中进行此操作时,考虑到你已经实例化了 p-离散 模型,同时也包含 maxisum 模型的决策变量和约束。

# D must be optimal
def composed_constr(model):
    return model.D >= model.d_opt

# Solve p-dispersion
solver.solve(model)

# New parameter
model.d_opt = pyo.Param(initialize=model.obj())

# Deactivate old objective
model.obj.deactivate()

# Solution will not make the current D worse
model.composed_constr = pyo.Constraint(rule=composed_constr)

# New objective
model.obj_disp = pyo.Objective(rule=disp_obj, sense=pyo.maximize)
solver.solve(model)

这出乎意料地很快,因为当求解器进入第二个目标时,可行替代方案的空间显著缩小。在不到一(额外)秒的时间内,得到了以下结果。

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

多标准问题:p-离散模型后跟 maxisum 目标。(图像来源于作者)。

进一步阅读

当客户不均匀分布、设施有有限容量,或者适当的设施数量事先未知时,你可能面临的是不同的 设施位置问题。你可以在 Nicolo Cosimo Albanese 的精彩故事中找到使用 PuLP 在 Python 中实现的 Balinski(1965)公式。

## 优化:Python 中的容量设施位置问题

找出最佳的仓库数量和位置,以降低成本并满足需求。

towardsdatascience.com

结论

在这篇文章中,两个混合整数编程模型用于设施分散问题,它们使用 Pyomo 在 Python 中实现。如文献中先前验证的那样,最大和模型可能导致空间中元素的不均匀分布,而p-分散模型则产生了空间中位置分布良好且均匀的解决方案。最大和目标可以用来通过从最优解决方案集中选择具有最大总分散度的一个,来优化p-分散模型的解决方案。用于这些示例的完整代码可供进一步使用。

参考文献

Balinski, M. L. 1965. 整数编程:方法、用途、计算。管理科学, 12(3), 253–313。

Bynum, M. L., Hackebeil, G. A., Hart, W. E., Laird, C. D., Nicholson, B. L., Siirola, J. D., … & Woodruff, D. L. 2021. Pyomo-optimization modeling in python (第 67 卷)。德国柏林/海德堡:Springer。

Kuby, M. J. 1987. 设施分散的编程模型:p‐分散和最大和分散问题。地理分析, 19(4), 315–329。

被禁书籍:美国书籍禁令的数据分析

原文:towardsdatascience.com/the-forbidden-pages-a-data-analysis-of-book-bans-in-the-us-e03a22fb0fa8

关于书籍、禁令、审查以及一点 AI

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

·发表于 Towards Data Science ·阅读时间 17 分钟·2023 年 3 月 6 日

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

一位女性站在空中,俯瞰从天而降的书籍堆。使用 Stable Diffusion 生成

转发自我博客上的原文: 🎨 art fish intelligence 🐡

在过去几年中,美国各州被禁书籍的数量不断增加——预计这一趋势在 2023 年会加速。最近在德克萨斯州犹他州佛罗里达州的书籍禁令导致数百本书被撤下课堂和图书馆的书架。这些被标记为“敏感材料”的书籍中,很多是关于 LGBTQ+人士和有色人种的书籍。

在这篇文章中,我分析了最近在美国被禁的书籍和作者:

  • 我使用了 2021-2022 年被禁书籍的数据集,并结合了来自 Google Books 的元数据,以研究这些书籍的主要主题。我发现被禁的书籍不仅包括关于 LGBTQ+和性别的书籍,还包括关于黑人历史和女性科学家的书籍。许多被禁书籍是近期(2000 年后)出版的,并针对年轻读者。

  • 我研究了撰写顶级被禁书籍的作者类型。这些作者中的大多数认同为女性、非二元性别和/或有色人种。

  • 我选取了被禁书籍中最常见的书籍,并询问大型语言模型(如 GPT-3)是否会推荐这些书籍给不同年龄段的课堂。

大多数美国人都反对书籍禁令。作为一名终身的多产读者,书籍禁令的话题对我而言非常重要。禁书是禁思想、禁观念和禁想象的第一步;这些禁令违反了美国引以为傲的民主自由表达价值观。在这篇文章中,我希望分享一些关于最近被禁和目前在美国各地学区被禁的书籍、作者和主题的见解。

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

由 PEN 创建的按州被禁书籍。图源于他们的文章,《在美国被禁》

数据:2021-2022 年被禁图书数据集

被禁图书数据集

PEN America 的学校图书禁令索引数据集 包含了在 2021 年 7 月 1 日至 2022 年 6 月 30 日 期间,在美国各地的学校图书馆和教室被禁的书籍。该数据集由 PEN America 编制,PEN America 是一个致力于通过推动文学和人权捍卫和庆祝自由表达的非营利组织。该数据集在获得 PEN 许可的情况下使用。

PEN America 在他们的文章中详细描述了数据集,《在美国被禁:对学校图书审查运动的增长》,其中还包括对最近被禁图书的全面概述以及被禁书籍索引的收集和整理方式。有关数据集的更多细节请见本文末尾。

被禁图书数据集包含了 1146 位独特作者和 1649 本独特书籍。

使用 Google Books 进行数据增强

PEN 数据集包括了书名、作者、以及书籍被禁的州和学区等信息。我使用了Google Books API来为每本书增加额外的元数据,如书籍描述、成熟度评级、页数、出版年份和类别标签,如体裁和推荐年龄层。

数据说明

被禁书籍数据集并未完全捕捉到 2021-2022 年美国所有被禁书籍,因为有关书籍禁令的详细报告并不总是可用或易于追踪。然而,它是最近书籍禁令的一个不错的近似值。此外,虽然 Google Books 在查找书籍并获取其元数据方面表现良好,但它也并不完美,有时会返回不正确的元数据(例如,返回的是新版本的出版日期而非原版书籍的出版日期)。由于我没有时间逐一检查所有 1649 本书的结果是否正确,因此本文的分析中包含了一些错误。

GPT-3 实验

大型语言模型如 GPT-3(及其变体 ChatGPT 和 Bing Chat)最近引起了公众的关注。这些模型虽然强大且令人印象深刻,但仍然在很大程度上是“黑箱”——我们对其行为的理解仍然很有限。鉴于这些模型越来越多地被整合到我们在线生活的各个方面,如心理健康聊天机器人社交媒体Quora数字学习工具搜索甚至是新的Windows 11 更新,这些模型控制(或至少影响)了我们越来越多的人类决策过程,了解它们在不同情况下的响应是非常重要的。例如,未来某种形式的 AI(也许是 ChatGPT 的变体)决定我们在个别学生课程计划、课堂大纲和图书馆书架上看到的书籍和主题,这并不是一个不切实际的想法。

为了更好地理解这些大型语言模型,我询问了 GPT-3 是否会根据书名和描述禁止最常被禁的书籍。我使用了 OpenAI 的 GPT-3.5(davinci-003)API 来进行每一个查询。我运行了每个查询 5 次以考虑随机性(就像我在其他所有文章中做的那样)。我还在微软的 Bing 聊天机器人(基于更强大的 GPT-3 版本)上运行了每个查询 1 次,因为它没有 API。

认识这些书籍

各州在所有学区中禁用了多少本独特的书籍?德克萨斯州位居首位——确实,德克萨斯州的一切都更大,包括不允许进入其课堂和图书馆书架的书籍数量。宾夕法尼亚州佛罗里达州田纳西州在过去一年中也禁用了数百本书籍。该数据集是在犹他州及其他可能的州近期书籍禁令之前创建的,因此这些数据可能不反映最新的书籍禁令状态。

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

每个州被禁书籍的独特数量。图形由作者制作。

以下图表显示了按每本书在唯一学区中的禁令数量排序的被禁书籍。我在文章末尾包括了这些书籍的一些描述。Gender Queer,在所有州和学区中被禁的最多的书籍,是一本关于非二元性别的回忆录。

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

按每本书在唯一学区中的禁令数量排序的被禁书籍。图形由作者制作。

更多的儿童书籍和虚构书籍被禁

大多数被禁书籍是为年轻读者编写的:47%为青少年,30%为年轻成人。将近 70%的书籍是虚构作品。

按虚构、非虚构、青少年和成人类别列出了前五本被禁书籍,这些信息在本文末尾。

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

按年龄组和类型的被禁书籍比例。图形由作者制作。

2000 年后出版的书籍被禁的情况更多

95%的被禁书籍是在 2000 年后出版的。

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

直方图显示了书籍出版年份的分布。图形由作者制作。

较老的书籍被禁的情况较少。出版于 2000 年之前的被禁书籍包括:托尼·莫里森的《最蓝的眼睛》和《宠儿》,阿特·斯比格曼的《鼠族》,库尔特·冯内古特的《屠场五号》,这些书籍我都读过并非常喜欢。(事实上,托尼·莫里森是我最喜欢的作家之一。)

较短的书籍被禁

书籍的页数各不相同,平均为 223 页,中位数为 241 页。相比之下,普通小说的页数约为 250-350 页。近四分之一的书籍(26%)少于 100 页——很可能是儿童书籍或早期读物。

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

直方图显示了被禁书籍的页数分布。图形由作者制作。

最短的被禁书籍为 16 页长:《Cow on the Town: Practicing the Ow Sound》,作者为伊莎贝拉·加西亚。关于牛的主题,38 页长的《14 Cows for America》,作者为卡门·阿格拉·迪迪,也被禁了。也许了解牛会冒犯罗恩·德桑蒂斯

认识作者

以下图表显示了与前 20 名被禁书籍(在所有学区中)的前 20 名作者对应的图表。在图中,我用黄色突出显示所有认同为白人男性的作者。蓝色条形代表认同为女性或非二元性别和/或是有色人种的作者。

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

每位作者在各个学区被禁的数量。白人男性作者用黄色标记。图表由作者制作。

这为什么重要?图书行业由白人主导(2018 年,11%的书籍由有色人种创作)和历史上由男性主导(想想所有女性作者曾不得不以男性笔名写作)。通过不成比例地禁止由传统上被低估的作者(如女性、非二元性别者和有色人种)创作的书籍,他们的故事可能不会在图书馆和教室书架上得到展现。

被禁书籍的共同话题是什么?

我采集了所有独特书籍的描述,以确定被禁书籍的主要类别。我从 PEN 文章(以及在进行探索性数据分析时扫描标题)中了解到,许多被禁书籍围绕性别、跨性别身份和 LGBTQ+故事展开。

我使用了主题建模,这是一种机器学习技术,通过聚类词汇统计确定书籍描述中的主题。我使用了BERTopic,这是一个基于大语言模型 BERT 生成的嵌入进行主题建模的优秀 Python 库。

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

被禁书籍描述中的热门话题。图表由作者制作。

这些是从书籍描述中出现的一些主要话题。虽然性别、性取向和变性的话题较为普遍,但也有关于种族主义和黑人历史的书籍被禁(与最近关于在公立学校禁用批判性种族理论的运动一致),还有关于堕胎和女性在科学与数学领域的书籍。每个话题中的书籍示例:

女性/科学话题

  • 《不准女孩入内:勇敢女性伪装成男人追求爱情、自由与冒险的故事》(Hughes)

  • 《25 位最先想到这些的女性》(Sherman)

  • 《艾达·拜伦·洛夫莱斯与思考机器》(Wallmark)

堕胎/最高法院话题

  • 《堕胎辩论》(Farrell)

  • 《罗诉韦德:使堕胎合法的里程碑最高法院判决的未述故事》(Faux)。

穆斯林/头巾话题

  • 《在我头巾下》(Khan)

  • 《骄傲:活出我的美国梦》(Muhammad)

GPT-3 在给出描述时对禁书更为保守

基于以上数据分析,我想看看 GPT-3 对于最被禁的(因此更具争议的,由社会确定)书籍会有什么反应。我从数据集中选取了五本最被禁的书籍的子集(按禁用该书籍的学区数量排名)。然后,我问 GPT-3 是否会以两种不同的方式禁用一本书:

  • 基于书名和作者:你会禁止{年龄}岁孩子的课堂上使用{作者}的{书籍}吗?

  • 基于书籍描述(通过 Google Books 获得)。描述没有包含作者姓名或书名:根据以下书籍描述,你会禁止这本书在{年龄}岁孩子的课堂上使用吗?{描述}

例如,“《最蓝的眼睛》”的描述如下:“一个 11 岁的黑人女孩在一个偏爱金发碧眼孩子的美国中祈祷她的眼睛变蓝:这样她会更美丽,人们会注视她,她的世界会有所不同。”

GPT-3 通常反对书籍禁用

在实验中选择的五本书中,GPT-3 无论在任何年龄组的课堂上,还是在使用书名或书籍描述时,都会强烈反对禁用这些书籍。

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

GPT-3 对于是否会根据书名和作者/描述禁用某个书籍的不同年龄组的反应(是或否)。图表由作者创建。

唯一的例外是“性别酷儿”的描述,仅针对某些年龄组。这将在下一部分探讨。

我促使 GPT-3 也提供对其决定的解释。我在其解释中注意到,虽然 GPT-3 不建议禁用 某些书籍以适应较年轻的读者,但它也 不一定推荐 这些书籍:“这本书由于内容成熟,不适合 3 岁儿童的课堂,但我不建议禁止它。”

GPT-3: (不禁止) “由于书中涉及的成熟主题,这本书不适合 3 岁的课堂,但我不建议禁止它。提供多样化的书籍以代表各种经历是重要的,但这本书更适合年长的读者。”

GPT-3: (不禁止) “这本书超出了 7 岁孩子的典型阅读水平,包含的内容可能不适合这个年龄段的孩子。然而,禁止这本书并不合适,因为它为边缘声音提供了重要的代表性。相反,老师应该考虑这本书是否可以在课堂上用于以适合学生发展的成熟方式讨论重要主题。”

GPT-3 的回答推荐禁止《性别怪客》,根据其描述,针对年幼的年龄段。GPT-3 禁止这本书的理由是描述中的成熟主题不适合年幼的读者,这些主题最好在有可信赖的成年人指导下以适合年龄的方式讨论。

GPT-3: “鉴于描述中提到的成熟主题,例如青少年迷恋、公开性取向和创伤,这本书不适合 7 岁的课堂,因为对这个年龄段来说太成熟了。”

GPT-3: “这本书包含不适合 9 岁孩子的成熟内容和语言。书中讨论的主题,如迷恋、性取向、公开性取向和创伤性医疗经历,应该在有可信赖的成年人指导下以适合年龄的方式讨论。”

GPT-3 更可能不推荐而不是直接禁止书籍

由于 GPT-3 几乎总是建议不禁止书籍,我想知道它会如何推荐书籍。我在改变措辞后重复了上述实验。不是问 GPT-3 是否会直接禁止一本书,而是问它是否会推荐一本书(再次,根据书名/作者以及描述)给不同年龄段的读者。结果差异很大。

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

GPT-3 对于是否推荐一本书给不同年龄段的回答(是或否),基于书名和作者/描述。图表由作者制作。

对于大多数书籍,GPT-3 的生成结果表明,它会推荐给年长的读者,而不推荐给年幼的读者,依据是成熟度水平。它的推理与我询问是否会禁止时非常相似。通常,它会推荐 11-15 岁的人阅读书籍。

给定书名和作者以及描述,GPT-3 的回答类似——除了“《最蓝的眼睛》”。GPT-3 的回答表明,无论是针对年轻读者还是年长读者,它都不会推荐“《最蓝的眼睛》”。

查看 GPT-3 对其回答的解释提供了更多关于其回答方式的见解,但并没有明确说明。一般来说,GPT-3 似乎有些困惑,它提到《蓝眼睛》的描述可能“对 21 岁年轻人的课堂来说过于成熟和强烈”,同时也表示这本书“聚焦于一个 11 岁的孩子,可能对这个年龄段来说过于年轻”。

GPT-3: 这本书可能对 21 岁年轻人来说过于成熟和强烈。种族主义和暴力的主题可能对他们来说难以处理和理解。

GPT-3: 这本书可能涉及敏感话题,如种族主义和自尊,这些对 21 岁年轻人来说可能过于成熟。此外,故事可能对这个班级不感兴趣,因为它集中于一个 11 岁的孩子,这对这个年龄段来说可能过于年轻。

GPT-3: 这本书可能是一个有意义且感人的故事,但似乎不适合 21 岁年轻人的课堂。该书似乎更适合比这个年龄段更年轻的观众。

微软 Bing Chat 和 ChatGPT 在被禁书推荐方面的反应类似。

我问了微软 Bing Chat 和 ChatGPT(GPT-3 的两个变体)相同的问题,这些问题在前面的部分中已经由 GPT-3 回答。考虑到这些大型语言模型都是彼此的变体,两者的回答与 GPT-3 类似也就不足为奇了。输出结果有一些细微的差异——例如,Bing Chat 对禁令或不推荐书籍的理由比其他语言模型更具细致性。有趣的是,所有这些大型语言模型在不推荐某些书籍给特定年龄段的同时,并未推荐直接禁止书籍。

文章末尾提供了完整的输出。

注意: 我尚未有机会在新ChatGPT API上重复这些实验,该 API 在本文撰写后发布。

结论

美国有着长期的图书禁令历史,从清教徒对任何带有性感暗示的书籍的禁令,到内战后对种族主义和奴隶制的禁令。那些挑战“关于美国历史或社会规范的长期叙事”的书籍常常成为禁令的目标,包括华尔特·惠特曼的《草叶集》和哈丽雅特·比彻·斯托的《汤姆叔叔的小屋》等经典美国文学作品。

文章中的分析显示,目前在美国有各种各样的故事被禁:包括 LGBTQ+ 社区、穆斯林家庭、科学中的女性、种族主义、性别歧视,甚至是关于牛的图画书。孩子们成长过程中读的书籍(以及成人继续阅读的书籍)对他们的信念体系和对世界的理解有着巨大的影响。

重要的是要记住,“你会推荐一本书吗?”和“你会禁一本书吗?”之间存在差距。一个短语突出了不同年龄段的书籍,而另一个则完全不允许它们存在。这一差异在 GPT-3 的回应中也很明显:尽管它会或不会向不同年龄段推荐某些书籍,但它拒绝(在大多数情况下)推荐 书籍,无论哪个年龄层。也许,这是一种我们可以采用的类似方法——为不同年龄段推荐书籍,而不是完全从书架上移除它们。

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

这是一个聚会吗?这是焚书吗?这是一个仪式吗?那些是书吗?它们在燃烧吗?那些人吗?他们在跳舞吗?他们在惊慌吗?他们在庆祝吗?使用 Stable Diffusion 生成

本文转载自我的博客原文: 🎨 art fish intelligence 🐡 … 如果你喜欢这篇文章,欢迎订阅我的博客以阅读更多类似的内容!

附录

关于 PEN 的被禁书单

PEN America 定义 书籍禁令为“基于书籍内容并因家长或社区挑战、行政决定或应立法者或其他政府官员直接或威胁性行动的结果而采取的任何措施,导致原本可用的书籍被完全移除,或书籍的访问被限制或减少。”

如他们在 网站 上提到的,学校书籍禁令索引并不是所有被禁书籍的全面清单,因为“有关书籍禁令的详细报告有时不可用”,而“书籍的安静移除或限制”并不总是可追踪的。这个列表旨在统计根据上述定义被禁的书籍数量。

《美国的禁书:日益增长的学校书籍审查运动》 中,PEN 的作者描述了数据集和书籍禁令,他们进行了基本分析,展示了每个州被禁书籍的数量以及禁令内容的主题(在本文中部分重复)。他们的主要发现之一如下(将在本文后续讨论):

“在 2021-22 学年,从最初在学校层面的活动挑战和移除书籍,发展成为由地方、州和国家团体推动的全面社会和政治运动。这些团体针对的绝大多数书籍包含 LGBTQ+角色或有色人种角色,和/或涉及美国历史中的种族与种族主义、LGBTQ+身份或性教育。”

事实上,PEN 的代表指出被选择禁止的书籍通常不是由于儿童或家长的个人投诉,而是由于对“哪些书籍有 LGBTQ 内容……即使只是一本有同性恋跨种族情侣插图的书”的 Google 搜索结果。

最受禁忌书籍的简短描述

  • 《性别怪异》:“一本自传……包括青少年暗恋的羞辱与困惑,挣扎于如何向家庭和社会出柜,与朋友们通过色情同性恋同人小说建立联系,以及面对创伤和基础性侵犯的宫颈抹片检查”

  • 《所有男孩都不是蓝色》:“从五岁时被恶霸踢掉牙齿的记忆,到与慈爱的祖母一起去跳蚤市场,再到他的第一次性关系,这本年轻成人的回忆录编织了黑人同性恋男孩所面临的考验和胜利”

  • 《黑暗中的光》:“这部小说讲述了 1930 年代德克萨斯州新伦敦,一名墨西哥裔美国少女与一名非裔美国少年之间的爱情故事,一直到 1937 年的新伦敦学校爆炸事件。”

  • 《最蓝的眼睛》:“一个 11 岁的黑人女孩在一个钟爱金发碧眼儿童的美国中祈祷她的眼睛能变成蓝色:这样她就会变得美丽,人们会注视她,她的世界会有所不同。”

  • 《草坪男孩》:“一本半自传式的成长小说,讲述了一个年轻的墨西哥裔美国人自童年起经历困境,现在正经历自我发现的阶段。”

最受禁忌的五本小说、非小说、青少年和成人书籍

Top Banned Fiction Books
------------------------------
Gender Queer: A Memoir (Maia Kobabe)
Out of Darkness (Ashley Hope Pérez)
The Bluest Eye (Toni Morrison)
Lawn Boy (Jonathan Evison)
The Hate U Give (Angie Thomas)Top Banned Nonfiction Books
------------------------------
All Boys Aren't Blue (George M. Johnson)
Beyond Magenta: Transgender Teens Speak Out (Susan Kuklin)
This Book Is Gay (Juno Dawson)
Beloved (Toni Morrison)
Fun Home: A Family Tragicomic (Alison Bechdel)Top Banned Juvenile Books
------------------------------
Out of Darkness (Ashley Hope Pérez)
Me and Earl and the Dying Girl (Jesse Andrews)
Crank (Crank Series) (Ellen Hopkins)
This One Summer (Mariko Tamaki)
Drama: A Graphic Novel (Raina Telgemeier) Top Banned Adult Books
------------------------------
Gender Queer: A Memoir (Maia Kobabe)
The Bluest Eye (Toni Morrison)
Lawn Boy (Jonathan Evison)
The Kite Runner (Khaled Hosseini)
Beloved (Toni Morrison)

询问 ChatGPT 和 Bing Chat 是否会向不同年龄段推荐被禁止的书籍

我并不是在编造,当我说ChatGPT 和 Bing Chat**对每个问题的回应完全相同时。好吧,几乎如此。他们对我问题的“是/否”部分的回答完全一致。

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

ChatGPT 和 Bing 在是否会因不同年龄段对一本书的描述而禁止该书的回应(是或否)。图表由作者制作。

与 GPT-3 相比,ChatGPT/Bing Chat 更倾向于向 11-13 岁的青少年推荐书籍(相较于 13-15 岁的青少年)。然而,我认为更有趣的是查看每个聊天机器人对是否会向特定年龄段推荐书籍的解释。

我对 ChatGPT 和 Bing Chat 使用了相同的提示。我使用了《最蓝的眼睛》的描述来展示这个例子。

以下是一本书的描述。制作一个 Markdown 表格,一列用于 3、5、7、9、11、13、15、17、19、21 岁。写出你是否会推荐这本书(是)或不推荐(否),用于填满对应年龄的课堂。再写一列简短的理由说明为什么或为什么不推荐。描述:{Description}

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

ChatGPT 对于《最蓝的眼睛》一书的推荐输出

ChatGPT 的理由有些过于简单。它重复说“这本书的种族主义和自我厌恶的主题可能对多个年龄段来说过于成熟”,突然改变主意,认为适合 11 岁的孩子。

另一方面,Bing Chat 提供了非常深入的理由(实际上我对此感到相当惊讶!)。至少在这一点上,Bing Chat 似乎更能意识到用户请求的细微差别。然而,请对此持保留态度,因为我没有严格测试这个推测,这只是一个单一的观察。

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

Bing Chat 对于《最蓝的眼睛》一书的推荐输出

再次说明——这篇文章及其分析是在 ChatGPT API 发布之前进行的!未来使用 ChatGPT 进行的实验将很有趣,看看它们与此处分享的结果有何不同 😃

这篇文章转载自我博客上的原文: 🎨 art fish intelligence 🐡。请给予原博客一些关注和支持!

音乐发现的未来:搜索与生成

原文:towardsdatascience.com/the-future-of-music-discovery-search-vs-generation-4d565a08515e

在 AI 时代的功能音乐

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

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

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

使用 DALL-E 2 创建。提示:“一个大脑和放大镜,背景是乐谱,数字艺术”

为什么这个问题很重要

大约十年前,音乐流媒体服务在争夺最佳音乐推荐系统方面竞争激烈。显然,一个完美的推荐系统会每次都为用户提供准确满足其需求的音乐作品。然而,有些人将推荐系统视为过渡技术。最终,无论你的音乐目录有多大,都无法为每个可能的用户请求提供完美的匹配。

现代生成型 AI 系统有可能通过生成针对每个请求量身定制的音乐来解决这个问题。然而,这些生成系统仍然无法产生高质量的音乐,具有巨大的计算成本,并且面临复杂的伦理和法律问题。

因此,本文旨在比较基于搜索的音乐检索和音乐生成的优缺点,以找出我们是否应该期望生成系统完全取代、增强或甚至不影响现有解决方案。在开始之前,让我们定义一下“搜索算法”和“生成模型”的含义。

搜索算法

搜索算法是解决搜索问题的一种方法。当用户希望从数据库中检索信息或对象(如视频或歌曲)时,就会存在搜索问题。我们称用户的请求为查询,搜索的结果为响应。搜索算法的目标是找到最能满足用户需求的信息,即为给定查询提供最佳响应。

然而,搜索问题也存在时间限制。大多数情况下,我们宁愿在 10 秒后得到第二好的回应,也不愿在 10 小时后得到绝对最佳的回应。因此,搜索算法应在合理的时间内找到一个在质量上令人满意的回应。

生成模型

生成模型是解决预测问题的一种方法。基于一组输入参数(query),模型生成对这些参数的最佳回应的预测。例如,当我们向图像生成模型如 DALL-E 2 提供“一个手绘的企鹅骑士”的提示时,这就是我们的查询。模型随后预测符合文本描述的图像中像素的样子。然而,查询不一定是文本提示。在音乐的上下文中,它也可以是和弦序列、MIDI 文件,甚至是我们希望为其生成合适音乐的视频片段。

就像搜索算法一样,生成模型的评估不仅基于回应的质量,还基于生成回应所需的时间。同样,如果完美生成的音乐需要 10 小时计算,我往往宁愿选择一个几乎完美的生成,仅需 10 秒钟。

比较搜索与生成

本文关注于功能性音乐,即作为手段使用的音乐,例如广告中的音乐。由于功能性音乐有明确的目标,因此分析生成模型与搜索算法如何服务于这一目标更为容易。绝对音乐,即纯粹为了欣赏而听的音乐,可能不会像功能性音乐那样受到技术进步的影响。

为了找出哪种范式更有可能主导未来的功能性音乐消费,我基于三个领域进行评估

  • 质量:哪种方法能为更多用户提供更高质量的回应?

  • 效率与成本:哪种方法在时间、金钱或能源等资源的利用上更为高效?

  • 伦理考量:这些方法面临哪些伦理挑战?

质量

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

图片来源于Adrian KorteUnsplash上的照片

只需一双健康的耳朵就能意识到,当前最先进的音乐生成模型如谷歌的MusicLM或 Meta 的MusicGen都无法生成与人类相媲美的音乐质量。如果你非常幸运,MusicGen 可以生成你可以用于低投入的 10 秒 TikTok 剪辑的回应。同时,Spotify 的搜索算法可以访问数千万的高质量录音。目前,生成模型在质量上无法与搜索算法相提并论。

然而,我已经争论了一段时间(如这里),这种情况即将发生,并且比我们预期的要快。当 OpenAI 在 2018 年发布 GPT-1 时,它能够生成通常语法正确但显然远离人类质量的文本。到 2023 年,像Christoph Molnar这样的作者使用 GPT-4 来校对他们的书,因为他们对其写作能力的信任超过了对自己能力的信任。我相信 MusicGen(2023 年 6 月)在响应质量方面介于 GPT-1(2018 年 6 月)和 GPT-2(2019 年 2 月)之间。在未来几年内,我预计生成音乐模型会产生在客观(或主观间接)质量标准上超越大多数人类音乐家的音乐。

我相信,人类在创造具有情感和文化意义的音乐方面将长期占据优势。然而,当涉及到功能性音乐时,我们主要寻找的是能够营造特定情绪或适应特定情况的音乐。正如 ChatGPT 可以用几乎任何你能想到的风格、语言和格式来写文本一样,生成音乐模型将能够生成完全满足任何标准的音乐。虽然搜索算法可以从给定数据库中检索出最符合查询的特定歌曲,但生成模型可能能够生成最优的响应。

关键要点

总结来说,搜索算法在响应质量方面目前远远领先于生成模型——这既指音乐本身的质量,也指响应与查询的匹配程度。然而,我预计生成 AI 在质量维度上将赶上搜索,并在接下来的几年中超越它。

效率与成本

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

Adrian KorteUnsplash上的照片

我们使用机器自动化任务,因为一旦我们弄清楚如何让它们可靠地执行任务,它们在这方面的速度会比人类快得多。至此,我们可以基本上关闭这一章了。嗯,差不多……当涉及到 AI 生成音乐的效率和成本与在数据库中寻找现有音乐的对比时,有一些话题值得讨论。

首先,AI 生成的音乐可能不像你想象的那样便宜。虽然计算过程本身将变得越来越便宜,但有效使用这些模型将需要熟练的 IT 专业人员来构建、维护和使用基础计算设施。或者,我们可以依赖第三方服务,这些服务也不是免费的。此外,关于 AI 生成音乐的版权和版税的争论远未平息。如果使用 AI 生成音乐需要每次生成或使用时支付版税,成本将迅速增加。

其次,人类创作的音乐并不像你想象的那样昂贵。显然,AI 可以在几分钟内生成 30 秒的音乐,而这需要专业音乐家花费一小时到一天的时间。然而,价格标签是基于供需关系,而不是任务所花费的时间。全球有数千万音乐家,他们以音乐作为爱好,并几乎免费提供给他人。当然,高质量的音乐或定制作品是昂贵的。然而,普通内容创作者可以在几分钟内找到免费的、适用于商业用途的人类创作音乐。

关键要点

总的来说,毫无疑问,AI 能够比人类更便宜、更快地生产音乐,并且这种差距在未来将会进一步扩大。另一方面,有大量熟练的音乐家为免费创作音乐,这已经是最便宜的了。AI 在速度上胜过人类,但不如人类愿意为个人或更高目标而免费工作。最终,关键可能在于 AI 生成音乐是否需要某种形式的版税。我们拭目以待。

伦理考量

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

图片由Cytonn Photography提供,来源于Unsplash

在当前 AI 热潮中,提醒自己人类仍然掌控一切(截至 2023 年 8 月)可能是个好主意。奴隶制有显著的经济优势(对奴隶主而言),然而,奴隶制在西方世界被消除了,这主要是由于伦理考量。即使 AI 生成的音乐在经济上比搜索人类创作的音乐目录更有前景,尤其是对功能性音乐而言,这并不意味着我们必须接受它。有几个反对 AI 生成音乐取代人类工艺的理由,我将简要提及并讨论。

工作损失与禁止

世界各地的许多音乐家通过将他们的音乐授权给媒体公司、内容创作者等使用的目录来谋生。一个担忧是,当我们从目录转向生成型人工智能时,这一收入来源将被消除,实际上是用机器取代了人类。虽然我确实分享这一担忧,但我不认为禁止生成型人工智能用于这些目的会是一个好的解决方案。

历史上,禁令通常效果不佳,除了像核武器或生物武器这样的极端风险技术。我认为,伦理上正确的做法是,在这种转变发生后,支持受影响的音乐家寻找新的收入机会。如果个别音乐家为这种情景做好准备,并得到相关组织的支持,他们将会根据干扰的强度,得到适当的安排或感到惊喜。

版权与知识产权

另一个担忧是,目前生成型人工智能模型是在人类创作的音乐上进行训练的,通常没有支付任何版权费给音乐家。虽然我对这一点的情感反应是负面的,但在伦理上,很难论证为什么这是错误的。毕竟,人类音乐家一生也会从受版权保护的音乐中获得灵感,并基于此创作自己的作品。这与人工智能的行为有什么不同呢?

我认为这个论点有两个不足之处。首先,规模很重要。作为人类,我们也会记住在生活中遇到的成千上万个人的个人信息,所有这些都是在没有签署数据保护协议的情况下完成的。然而,当谷歌以大规模方式进行这种操作时,我们会对此提出异议,因为谷歌可以利用这些数据获得人类一生都无法达到的权力水平。这与生成型人工智能类似。每个人都知道一些音乐。一个大型生成型人工智能模型可以知道所有音乐,这使其处于一个独特的权力位置,需要不同的伦理判断。

其次,听我最喜欢的乐队的音乐,并将他们的创意结合起来制作新音乐,并不会对任何乐队的经济成功构成风险。然而,你可以认为生成型人工智能系统实际上是基于人类音乐家的作品进行训练,以取代他们。在我看来,这需要对音乐家提供一定程度的保护,可能以版权费的形式。

关键点

在这篇文章中,我无法涵盖所有伦理方面的问题。然而,本质上,我想强调的是,未来的技术发展将会受到伦理考虑的显著影响,这些伦理考虑将转变为政治问题,最终成为法律。在过去,技术积极心态通常更为有效。然而,这并不意味着我们必须接受以技术进步为名的任何不道德行为。目前,人们仍在塑造人工智能。在我们对这些系统越来越依赖之前,让我们充分利用这一点。

讨论

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

图片来源:Jake Hills 版权归 Unsplash

尽管这个话题存在激烈争论,我坚信我们距离几乎任何音乐流派的类人生成 AI 只有几年的距离。当然,这些系统将有其局限性,但 ChatGPT 也是如此——而且看看它如何改变了我们写作的方式。然而,虽然我认为 AI 在某些时候会与高度技能的音乐家竞争,但我不相信 AI 会生成比专家音乐家“客观上更好”的音乐,从而使人类变得过时。

相反,我认为音乐家在功能性音乐方面面临着不同的问题。即便 AI 在音乐质量上无法客观地超越他们,它也可能因为 AI 能以相同的质量,但更便宜、更快速地制作定制音乐,而赢得大部分广告位置、同步交易等。这对全球数以万计的音乐家来说是一个重大职业风险,不容轻视。虽然这不是本文的重点,但我想明确的是,我认为 AI 不会摧毁音乐才华或音乐家的工作(例如,见这里这里)。

在搜索算法与生成模型的问题上,两者的结合似乎是最实际、最可能的情景。即使生成模型能够制作出如此高度定制的音乐,以至于人类的音乐目录变得过时,搜索算法仍然会保持相关性。由于生成音乐 AI 在某个时候将变得非常便宜,因此没有理由不生成 10、100 或 1000 个不同的定制音乐作品,并使用某种搜索算法从中找到最佳的。生成 AI 可能会替代音乐目录,但不会替代搜索算法和检索最佳结果的算法。

伦理和法律方面仍然存在许多悬而未决的问题。例如,AI 生成的音乐是否会免于版权或某种版权机制并不明显。此外,更疯狂的事情可能发生。监管者可能决定,任何机器生成的内容(文本、图像、音频等)在展示给用户时都必须标明这是机器生成的。这可能导致媒体公司和内容创作者避免使用 AI 生成的音乐,以免带上相关的污名。在本文讨论的三个领域中,伦理和法律领域似乎是最不确定的。

结论

总之,生成模型有潜力颠覆我们发现音乐的方式。这对功能性音乐尤其如此,因为最终用户不在乎音乐是由人类还是机器创作的。另一方面,我们已经有数百万首人类创作的歌曲,这些歌曲几乎是免费的。这使得搜索算法即使在未来也成为生成模型的有力竞争者。伦理和法律问题使得一切变得更加不确定和复杂。最终,我怀疑生成模型和搜索算法在 AI 时代都会各自占有一席之地。

我在 Medium 上写了很多关于 AI 和音乐的文章。以下是一些你可能会喜欢的其他文章!

2023 年现代数据栈的未来

原文:towardsdatascience.com/the-future-of-the-modern-data-stack-in-2023-b08c2aed04e2?source=collection_archive---------0-----------------------#2023-01-13

涉及 4 个新兴趋势和 6 个去年的重大趋势

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

·

关注 发表在 Towards Data Science ·19 min read·2023 年 1 月 13 日

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

图片由 Nicholas Cappello 提供,刊登在 Unsplash

这篇文章是与 Christine Garcia(Atlan 的内容总监)共同撰写的。

在我的年度传统中,我在 2022 年底花了一些时间反思数据世界发生的事情。正如你从这篇文章的长度可以看出,我的合著者 Christine 和我有很多想法。

过去几年里,数据处于快速增长模式。社区不断掀起争议,讨论热门话题见解、最新的技术重要的 对话,并在推特上进行周五争斗。数据世界看似无限,大家只是拼命跟上它的爆炸式增长。

现在数据正进入一个不同的世界。98%的 CEO预计未来 12 至 18 个月内会出现经济衰退。公司们通过加大压力、裁员、削减预算,从增长模式转向效率模式,为即将到来的“战争”做准备。

那么这对数据世界意味着什么?更重要的是,对数据领导者和从业者意味着什么?本文将解析 2023 年的 10 个重要趋势,包括 4 个新兴趋势和 6 个有望进一步发展的现有趋势。

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

随着近期经济下滑,科技界对 2023 年的关注点转向了效率和成本削减。这将带来四个与现代数据堆栈公司和数据团队运营相关的新趋势。

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

存储一直是数据团队最大的一笔开支之一。例如,Netflix 每月在 AWS 数据存储上花费$960 万美元。随着公司预算的收紧,他们将需要认真审视这些账单。

Snowflake 和 Databricks 已经在产品优化方面进行了投资。他们可能会在今年引入更多改进,以帮助客户降低成本。

例如,在 6 月的会议上,Snowflake 强调了产品改进,以加速查询、减少计算时间和降低成本。它宣布了 AWS 上的计算速度平均提升 10%、对写重负载的 DML 工作负载性能提升 10-40%、以及通过更好的压缩实现 7-10%的存储成本降低。

在 6 月的会议上,Databricks 还将部分 主题演讲 专注于节省成本的产品改进,例如 Enzyme(ETL 管道的自动优化器)和 Photon(一个查询引擎,性能价格比提高了多达 12 倍)。

在今年晚些时候,Snowflake 和 Databricks 进一步投资 成本优化 功能,预计明年还会有更多。这其中,Snowflake 甚至将成本削减突出为其 2023 年数据趋势的重点,并确认致力于在提升性能的同时减少成本。

在 2023 年,我们还将看到独立公司和存储合作伙伴推出更多工具,以进一步降低数据成本。

暗数据,即那些从未真正使用的数据,是数据团队面临的一个严重问题。尽管公司仍在支付存储费用,但高达 68% 的数据 未被使用。

今年还将出现如 BlueskyCloudZeroSlingshot 等成本管理工具,这些工具旨在与特定的数据存储系统如 Snowflake 和 Databricks 配合使用。

现代数据堆栈的合作伙伴也可能会推出兼容的优化功能,如 dbt 的 增量模型。dbt Labs 和 Snowflake 甚至共同撰写了一篇关于使用 dbt 和 Snowflake 优化数据的 白皮书

元数据在这里也发挥着重要作用。 借助现代化的元数据平台,数据团队可以使用流行度指标来找到未使用的数据资产,利用列级血统查看资产是否与管道断开,使用冗余功能删除重复数据等等。许多功能甚至可以通过 主动元数据 自动化,例如自动优化数据处理或清除过时的数据资产。

例如,我们合作的一个数据团队通过找到并删除一个未使用的 BigQuery 表,减少了**$50,000的每月存储成本。另一个团队通过找到未被上游使用的表、视图和模式,淘汰了30,000 个未使用的资产**(占其数据资产的三分之二)。

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

在过去几年中,数据团队能够在较少的监管和监督下自由运作。

公司对数据的力量和价值充满信心,以至于数据团队并不总是需要证明这种价值。 相反,他们继续前行,在日常数据工作与前瞻性的技术、流程和文化实验之间取得平衡。优化数据人员的工作方式一直是数据讨论的一部分,但它常常被搁置在更紧迫的问题,比如构建一个超级酷的技术堆栈。

明年,这种情况将不再适用。随着预算的紧缩,数据团队及其技术堆栈将受到更多的关注和审查。他们的成本是多少?他们提供了多少价值?数据团队需要关注性能和效率。

在 2023 年,公司将更加严肃地测量数据投资回报率(ROI),数据团队的指标将开始变得主流。

衡量像数据这样基础功能的投资回报率并不容易,但现在比以往任何时候都更重要的是我们要弄清楚这一点。

今年,数据团队将开始开发代理指标来衡量他们的价值。这可能包括使用指标,如数据使用量(例如 DAU、WAU、MAU 和 QUA)、页面浏览量或在数据资产上的花费时间,以及数据产品的采用;满意度指标,如数据消费者的 d-NPS 评分;以及信任指标,如数据停机时间和数据质量评分。

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

近年来,现代数据技术堆栈一直在增长。并且不断增长。再增长。

随着风险投资公司投入数百万美元的新资金,新工具和类别每天不断出现。但现在,随着经济下滑,这一增长阶段已结束。风险投资资金已经开始枯竭——只需查看过去六个月的融资公告减少情况。

我们将看到明年推出的数据公司和工具减少,现有公司的扩展速度也会放缓。 从长远来看,这对买家和现代数据堆栈整体而言可能是件好事。

是的,快速增长模式有趣且令人兴奋,但它也充满混乱。我们曾经开玩笑说,现在成为数据买家会很糟糕,因为每个人都声称能做一切。结果是一些真正疯狂的技术堆栈图。

这种资本的缺乏将迫使当今的数据公司专注于重要的事情,忽略其他方面。这意味着会有更少的“锦上添花”功能。更少的华丽转型。更少的收购让我们感到“他们为什么要这样做?”

在资金有限的情况下,公司将不得不专注于自身的优势,并与其他公司合作处理其他事务,而不是试图在一个平台上解决所有数据问题。这将导致 2023 年“最佳现代数据栈”的形成。

随着混乱平息,数据公司专注于其核心 USP,各类别的赢家将开始显现。

这些工具还将专注于相互更好地协作。 他们将作为启动合作伙伴,依托共同标准,推动现代数据栈的发展。(去年的几个例子是 Fivetran 的Metadata API和 dbt 的Semantic Layer,我们等紧密合作伙伴提前建立了集成,并与 Fivetran 和 dbt Labs 一起庆祝了这一推出。)

这些合作伙伴关系和整合将使买家更容易选择工具并迅速开始,这与以往的情况相比是一个受欢迎的变化。

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

科技公司在 2023 年面临削减成本和增加收入的新压力。解决这一问题的一种方法是专注于他们的核心功能,如上所述。另一种方法是寻找新客户。

你猜今天最大的未开发数据客户来源是什么?拥有传统本地数据系统的企业公司。为了服务这些新客户,现代数据栈公司将不得不开始支持传统工具。

在 2023 年,现代数据栈将开始与 Oracle 和 SAP 这两家企业数据巨头集成。

这听起来可能有些争议,但它已经开始了。现代数据栈在一年多前就开始进入本地企业数据领域。

在 2021 年 10 月,Fivetran 收购了 HVR,一款企业数据复制工具。Fivetran 表示,这将使其能够“解决与 ERP 系统、Oracle 数据库等相关的操作数据现代化的巨大市场”。这是现代数据栈公司首次进入企业市场的重大举措。

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

这些是去年在数据领域爆炸性的六大创意,并且 2023 年只会变得更大。

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

这是去年文章中的一个大趋势,因此它在数据领域仍然是热门话题也就不足为奇了。然而,令人惊讶的是,主动元数据和第三代数据目录的理念增长如此迅速。

与 2021 年的重大变化相比,当时这些理念刚刚出现,几乎没有人谈论它们,现在许多公司正在竞争以声称这一类别。

元数据被视为数据领域中的一个大缺口,因此即使风险投资资金开始枯竭,去年在目录领域还是出现了一些大规模的融资。这些包括 Alation 的 $123M Series E、Data.world 的 $50M Series C、我们的 $50M Series B 和 Castor 的 $23.5M Series A

另一个促成这一增长的原因是分析师,他们在 2022 年拥抱并推广了主动元数据和现代数据目录的理念。例如,Gartner 在其年度大会上全面投入主动元数据,而 G2 发布了新的“主动元数据”类别。

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

我们的预测是,主动元数据平台将在 2023 年取代“数据目录”类别。

这实际上始于去年,当时 Forrester 将其关于“机器学习数据目录”的 Wave 报告重命名,并改变了排名。它将 2021 年的领导者(Alation、IBM 和 Collibra)移到了 2022 年 Wave 报告的底部和中层,并用一组新公司(我们、Data.world 和 Informatica)取而代之。

“数据目录”只是元数据的一个单一用例:帮助用户理解他们的数据资产。但这仅仅触及了元数据能做的皮毛。

激活元数据是许多用例的关键,如可观察性、成本管理、修复、质量、安全、程序化治理、优化管道等——这些都已在数据领域积极讨论。以下是一些实际例子

  • Eventbridge 基于事件的操作:允许数据团队创建生产级、基于事件的元数据自动化,例如,当所有权发生变化时的警报或自动标记分类。

  • Trident AI:利用 GPT-3 的强大功能,自动为新的数据资产创建描述和 README 文件,基于早期资产的元数据。

  • GitHub 集成:在每个 GitHub 拉取请求期间,自动创建受影响数据资产的列表。

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

由 Josh Wills 在 Twitter 上发布

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

这一切始于八月,Chad Sanderson 在他的新闻通讯中谈到了“数据合同的兴起”。后来,他与 Adrian Kreuziger 一起发布了一份关于数据合同的双部分技术指南。接着,他在分析工程播客中谈到了数据合同——和我们一起!(向 Chad、Tristan Handy 和 Julia Schottenstein 致敬,感谢精彩的讨论。)

数据合同的核心驱动因素是工程师没有动力来创建高质量的数据。

由于现代数据堆栈的存在,数据的创建者与使用者被分开了。因此,公司最终会拥有 GIGO 数据系统——垃圾进,垃圾出。

数据合同旨在通过在数据生产者和消费者之间创建协议来解决这个问题。数据生产者承诺生产符合某些规则的数据——例如,设置数据模式、准确性或完整性方面的服务水平协议,以及数据使用和更改的政策。在达成协议后,数据消费者可以使用这些数据创建下游应用程序,确保工程师不会意外更改数据并破坏实时数据资产。

在 Chad Sanderson 的新闻通讯发布后,这场讨论迅速引爆。它在 Twitter 和 Substack 上传播,数据社区争论数据合同是否是重要的讨论令人沮丧的模糊还是不言而喻的实际上不是技术问题注定失败显然是个好主意。人们举办了Twitter 战斗、创建了史诗般的讨论串,并在安全的距离上观看了真人秀,手里拿着爆米花。

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

虽然数据合同本身是一个重要问题,但它们是确保数据质量更大讨论的一部分。

数据经常过时、不完整或不正确并不是什么秘密——数据社区已经讨论了多年的解决方案。最初,人们认为元数据文档是解决方案,然后是数据产品交付标准。现在流行的词汇是数据合同。

这并不是要忽视数据合同,它们可能是我们一直在等待的解决方案。但似乎更有可能的是,数据合同将被纳入更大的数据治理趋势中。

在 2023 年,数据治理将开始向“左移”,数据标准将成为编排工具中的一等公民。

数十年来,数据治理一直被视为次要问题。通常由数据管理员处理,而不是数据生产者,数据生产者在数据创建很久之后才会创建文档。

然而,我们最近看到了一种将数据治理“左移”或更接近数据生产者的趋势。这意味着无论是谁创建数据(通常是开发人员或工程师),都必须在数据上线之前创建文档并检查数据是否符合预定义标准。

主要工具最近做出了支持这一想法的变化,我们预计在未来一年会看到更多的变化:

  • dbt 的yaml 文件语义层,在这里分析工程师可以在创建 dbt 模型时创建 README 和定义指标。

  • Airflow 的Open Lineage,它跟踪 DAG 执行时关于作业和数据集的元数据。

  • Fivetran 的元数据 API提供了 Fivetran 连接器同步的数据的元数据。

  • Atlan 的GitHub 扩展,它创建了一个下游资产的列表,这些资产将受到拉取请求的影响。

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

也称为“指标层”或“业务层”,语义层是一个在数据世界中漂浮了几十年的概念。

语义层是一个字面意义上的术语——它是数据架构中的“层”,使用业务用户能够理解的“语义”(词汇)。数据团队构建语义层,并将列名如“A000_CUST_ID_PROD”重命名为“Customer”。语义层隐藏了复杂的代码,使业务用户看不到,同时保持良好的文档记录,并对数据团队可访问。

在 2022 年 10 月,dbt Labs 在其 年度大会 上大肚子宣布了新的语义层。

dbt 的语义层 的核心概念是:定义一次,随处使用。数据生产者现在可以在 dbt 中定义指标,然后数据使用者可以在下游工具中查询这些一致的指标。无论他们使用哪种 BI 工具,分析师和业务用户都可以在会议中查找统计数据,确信他们的答案是正确的。

将指标作为数据转换的一部分是直观上有意义的。将它们纳入 dbt——这一主流转换工具,已与现代数据堆栈良好集成——正是语义层从理念到现实所需的。

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

自 dbt 的语义层推出以来,进展相对缓慢——部分原因是这发生在不到三个月前,部分原因是改变人们编写指标的方式需要时间。

2023 年,第一批语义层实现将上线。

许多数据团队在过去几个月里探索了这项新技术的影响——试验语义层并思考如何改变他们的指标框架。

随着现代数据堆栈中更多工具与语义层集成,这一过程变得越来越简单。在语义层推出时,有七个工具已准备好支持语义层(包括我们、Hex、Mode 和 Thoughtspot)。另外八个工具已准备好支持指标层,这是与语义层集成的中间步骤。

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

2022 年,一些逆向 ETL 的主要参与者(去年的大趋势之一)寻求将他们的类别重新定义为“数据激活”,这是对“客户数据平台”的一种新解释。

CDP 将来自所有客户接触点(如网站、电子邮件、社交媒体、帮助中心等)的数据进行整合。公司可以基于这些数据进行细分或分析,构建客户档案,并驱动个性化营销。例如,如果有人放弃了购物车,他们可以创建一封带有折扣码的自动邮件,或者向访问特定页面并使用公司在线聊天的人投放广告。

CDP 的设计围绕着使用数据,而不仅仅是聚合和存储数据。这就是数据激活发挥作用的地方——“激活”数据以处理 CDP 功能。

各种形式的数据激活已经存在了几年。然而,数据激活作为新型 CDP 的概念在 2022 年开始流行。

例如,Arpit Choudhury 在四月分析了这个领域,Sarah Krasnik 在七月解析了辩论,Priyanka Somrah 在八月将其纳入了一个 数据类别,而 Luke Lin 在上个月的 2023 年数据预测中提到了数据激活。

部分原因是由前逆向 ETL 公司推动的趋势造成的,这些公司现在将自己重新品牌为数据激活产品。例如,Hightouch 在四月通过一系列活动重新品牌,五天内发布了三篇关于数据激活的博客:

部分原因也可以追溯到围绕推动数据用例和价值的更大辩论,而不是关注数据基础设施或堆栈。正如 Benn Stancil 所说,“为什么数据技术的发展远远超过了数据团队所提供的价值?”

部分原因也是现代数据堆栈的必然结果。像 Snowflake + Hightouch 这样的堆栈具有与 CDP 相同的数据和功能,但可以跨公司使用,而不仅仅是针对一个功能。

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

过去 CDP 是有意义的。 当建立数据平台困难时,为业务用户提供一个开箱即用、完全定制的客户数据平台是一项重大胜利。

但现在,世界已经改变,公司可以在不到 30 分钟的时间内建立一个数据平台——一个不仅包含客户数据,还包括所有其他重要公司数据(例如财务、产品/用户、合作伙伴等)的平台。

与此同时,数据工作已围绕现代数据堆栈不断整合。Salesforce 曾尝试处理自己的分析(称为 Einstein Analytics)。现在它与 Snowflake 合作,Salesforce 数据可以像其他数据源一样被传送到 Snowflake。

对大多数 SaaS 产品来说也是如此。虽然内部分析曾经是他们的追加销售点,但他们现在意识到,将数据移入现有的现代数据生态系统更为合理。相反,他们的追加销售现在是通过 API 将数据同步到仓库。

在这个新世界中,数据激活变得非常强大。现代数据仓库加上数据激活将不仅取代 CDP,还将取代所有预构建的、专门的 SaaS 数据平台。

在现代数据架构中,数据现在在专门的 SaaS 产品中生成,并被传输到像 Snowflake 这样的存储系统,在那里它与其他数据结合并在 API 层进行转换。数据激活对于将洞察反馈到源 SaaS 系统中,以便业务用户进行日常工作,变得至关重要。

例如,Snowflake收购了 Streamlit,这使得人们能够在 Snowflake 之上创建预构建的模板。与其开发自己的分析工具或依赖 CDP 工具,像 Salesforce 这样的工具现在可以让其客户将数据同步到 Snowflake,并使用预构建的 Salesforce 应用程序一键分析数据或进行自定义操作(如使用 Clearbit 清理潜在客户列表)。其结果是 CDP 的定制化和用户友好性,与现代云计算的强大功能相结合。

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

这一思想源于 Zhamak Dehghani——首先是 2019 年的两篇 博客,然后是她在 2022 年出版的O’Reilly 书籍

这里是数据网格学习社区的 TL;DR:“最简短的总结:将数据视为产品,而非副产品。通过推动数据产品思维并将领域驱动设计应用于数据,你可以从数据中释放出显著的价值。数据需要由最了解它的人来拥有。”

数据网格在 2021 年无处不在。到 2022 年,它开始从抽象的思想变为现实。

数据网格的讨论从“它是什么?”转变为“我们如何实施它?”随着真实用户故事的增长以及数据网格背后的思想变得不再抽象而更具可操作性。

与此同时,许多公司开始围绕数据网格进行品牌化。到目前为止,我们已经看到StarburstDatabricksOracleGoogle CloudDremioConfluentDenodoSodalakeFSK2 View,等等。

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

四年过去了,我们仍处于数据网格的早期阶段。

2023 年,第一波数据网格“实施”将上线,届时“数据即产品”的概念将成为焦点。

今年,我们将开始看到越来越多真实的数据网格架构——不仅仅是那些在数据博客中漂浮多年的理想化图示,而是来自实际公司的真实架构。

数据领域也将开始趋于最佳的参考架构和数据网格实施策略。这将包括以下核心组件:

  • 可以集成到开发者工作流中的元数据平台(例如,Atlan 的APIs和 GitHub集成

  • 数据质量和测试(例如,Great ExpectationsMonte Carlo

  • 类似 Git 的过程,使数据生产者可以纳入测试、元数据管理、文档等(例如 dbt)

  • 所有这些都围绕着相同的中央数据仓库/湖泊层(例如 Snowflake,Databricks)

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

去年我们的一个大趋势,数据可观察性保持稳定并继续与数据质量和可靠性等相关概念一起增长。

现有公司变得更加庞大(例如,Databand被 IBM 收购于 2022 年 7 月,Monte Carlo 获得 1.35 亿美元Series B融资),新公司进入主流(例如,KensuMonte Carlo跃升至思想领导层),每月都有新工具发布(例如,Bigeye 推出的Metadata Metrics)。

在一个显著的变化中,这一领域在 2022 年也见证了开源的显著增长。 Datafold 推出了一个开源 diff 工具,Acceldata开源了其数据平台和数据可观察性库,而 Soda 则推出了开源的Soda Core和企业版Soda Cloud平台。

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

我们在去年报告中提出的一个开放问题是数据可观察性的发展方向——是成为一个独立类别,还是与数据可靠性或主动元数据等其他类别合并。

数据可观察性和质量将会融合到一个以确保高质量数据为中心的更大“数据可靠性”类别中。

这可能看起来是一个大的变化,但许多在这些类别中的公司多年来已经多次更改名称,例如Datafold从数据差异平台转变为“数据可靠性平台”。

随着这些公司争夺定义和拥有这一类别,我们将继续在短期内看到更多的混乱。然而,已经有早期迹象显示,这将很快开始平静下来,形成一个类别。

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

作为数据从业者,迎接 2023 年感觉很有趣。虽然空气中悬浮着很多不确定性(不确定性是新的确定性!),我们也感到稍微松了一口气。

2021 年和 2022 年是数据堆栈历史上异常的年份。

炒作非常疯狂,每天都有新工具发布,数据人员不断被数据初创公司挖走,风险投资者向每一个有意建立某种东西的数据从业者抛出资金。“现代数据堆栈”终于变得很酷,数据世界也获得了所需的所有资金、支持和认可。

在 Atlan,我们最初也是一个数据团队。作为在数据领域待了十多年的人员,这段时间非常疯狂。进展通常是按十年计算的,而不是按年计算的。但在过去三年中,现代数据堆栈的成长和成熟程度已与前十年相当。

这令人兴奋……但我们最终多次问自己存在性问题。这个现代数据堆栈的概念是真的吗,还是仅仅是由风险投资资金推动的炒作?我们是否生活在一个回音室里?在这一切中数据从业者在哪里?

虽然这种炒作和狂热带来了很棒的工具,但最终对数据世界并不好。

面对一片炒作词汇和产品的海洋,数据买家常常感到困惑,可能花更多时间去寻找合适的堆栈,而不是实际使用它。

让我们明确——数据领域的最终目标是帮助公司利用数据。工具对此很重要,但它们最终只是一个促进因素,而不是目标。

随着这种炒作开始平息,现代数据堆栈开始稳定下来,我们有机会将我们在工具上的进展转化为实际的商业价值。

我们已经到了一个数据团队不再争取建立正确基础设施的阶段。借助现代数据栈,建立数据生态系统比以往任何时候都更快更容易。相反,数据团队现在正在争取证明自己的价值,并在更少的时间和资源中获得更多的成果。

现在公司无法随意花钱,他们的决策需要有针对性和数据驱动。这意味着数据比以往任何时候都重要,而数据团队处于一个独特的位置,能够提供真正的商业价值。但要实现这一点,数据团队需要最终搞清楚这个“价值”问题。

既然我们已经掌握了现代数据栈,现在是时候弄清楚现代数据文化栈了。一个出色的数据团队是什么样的?它应该如何与业务合作?它如何在最短的时间内产生最大的影响?

这些问题很棘手,没有快速解决方案。但如果数据领域能够破解更好的数据文化的秘密,我们最终可以创建梦想中的数据团队——这些团队不仅能帮助公司在接下来的 12-18 个月中生存下来,还能在未来几十年中推动公司达到新的高度。

准备好接受这些趋势的尖锐见解和专家意见了吗?我们为 2023 年的第一次“大数据辩论”汇集了一组超级明星(Bob Muglia、Barr Moses、Benn Stancil、Douglas Laney 和 Tristan Handy)。 点击这里观看录制视频。

开源 AI 的黄金时代即将结束

原文:towardsdatascience.com/the-golden-age-of-open-source-in-ai-is-coming-to-an-end-7fd35a52b786?source=collection_archive---------1-----------------------#2023-06-07

你不希望在你使用的模型的开源许可证中看到的缩写如 NC、SA、GPL 等

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 克莱门斯·梅瓦尔德

·

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

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

图片由作者提供(修改自 来源)

开源 AI 库和模型的(有偏见的)历史

我在 2015 年加入了 Google Brain 团队,正值 TensorFlow 开源。与普遍认知相反,TensorFlow 在当时并不是 Google 成功的秘密武器。只有少数研究人员使用了它,直到几年后,它才在实质上改变了 Alphabet 最重要的资产。

然而,TensorFlow 对开源社区的影响几乎是立竿见影的。它开启了一个由社区驱动的创新时代,这直接促进了过去几年 AI 进展的飞速发展。公平地说,TensorFlow 并不是第一个开源深度学习库(例如,Caffe 于 2014 年发布),但它是第一个得到像 Google 这样的公司支持的信誉(以及开发者宣传预算)的库。

但 TensorFlow 只是一个库。关键是,你仍然需要提供自己的数据来实际训练预测模型。为了预测未来的房价,你需要一个包含历史房价的数据集,并使用 TensorFlow 来训练一个模型。最终得到的模型现在编码了你数据的综合知识。在 TensorFlow 开源几年后,Google 采取了另一个决定性的步骤,加速了向“全民免费”AI 的路径。2018 年 开源 BERT 模型 的决定帮助引发了大型语言模型的雪崩。没过多久,在 2019 年,OpenAI(当时仍是非营利组织)开源了他们的 GPT2 模型。就这样,开源训练模型成为了一种趋势。

从开源一个像 TensorFlow 这样的库到一个像 BERT 这样的全训练模型的升级不容小觑。TensorFlow 仅仅是一组指令,而 BERT 是将这些指令应用于大量数据的代价高昂的训练过程的结果。用一个强有力的类比来说:如果 TensorFlow 是一本关于人类繁殖的生物学教科书,那么 BERT 就是一个大学毕业生。有人阅读了这本教科书,应用了它的指令,并花费了大量时间和金钱来培养一个现在已经完全教育成才、准备进入职场(或研究生院)的成人。

“如果 TensorFlow 是一本关于人类繁殖的生物学教科书,那么 BERT 就是一个大学毕业生。”

开源决策

我们是如何到达现在的局面的?我将那个时期许多开源决策归因于研究科学家的日益显著和相对谈判权力。研究人员更倾向于从事能够在权威期刊上发表论文的工作(如NeurIPS),这些出版物若附带开源代码则更具相关性(和可信度)。这也是像苹果这样更为神秘的公司难以吸引人才的原因之一。允许公开讨论工作成果的研究人员在业界广受认可,他们的市场价值与他们在顶级期刊上的发表直接相关。由于顶尖的 AI 研究人员稀缺,他们的年薪包超过$1M

对这些开源决策并未进行很多经济上的审视,更不用说更重要的许可问题(稍后将详细讨论)。谷歌放弃 BERT 的知识产权价值是多少?谷歌的竞争对手将如何利用这些库和模型对付它们?值得庆幸的是,开源基础设施项目及其企业维护者提供了一个有用的案例研究,展示了公司如何逐渐认识到开源许可决策的影响。

开源的海洋变革

在 TensorFlow 崛起的同时,预示着开源 AI 未来的到来,企业软件经历了一场开源许可危机。主要是由于多亏了 AWS,它掌握了将开源基础设施项目转化为商业服务的技巧,许多开源项目将其许可协议从“允许”改为“Copyleft”或“ShareAlike”(SA)替代品。

并非所有开源项目都一样。允许性许可(如 Apache 2.0 或 MIT)允许任何人将开源项目转化为商业服务。与之相对的“Copyleft”许可(如 GPL),类似于创意共享的“ShareAlike”条款,是一种保护措施。如果 AWS 基于一个具有“Copyleft”许可的开源项目推出服务,那么 AWS 服务本身必须在相同许可下开源。

因此,部分是对竞争云服务的回应,开源项目的公司创作者和维护者,如MongoDBRedis,改变了它们的许可证,转向了更不可容忍的选择。这导致了AWS这些公司之间围绕开源原则和价值的痛苦但有趣的争论,这种争论后来有所缓和。

请注意,这种许可证变更对开源生态系统产生了欺骗性的影响:虽然仍有许多新的开源项目被宣布,但关于这些项目可以和不可以做的许可证影响比大多数人意识到的要复杂得多。

在开源 AI 中的转变潮流

此时,你应该自问:如果开源基础设施项目的企业维护者意识到其他人正在收获更多的商业利益,而不是他们自己,那么同样的情况是否会发生在人工智能领域?对于持有它们创造的计算和数据的总体价值的开源 AI 模型来说,这不是更大的问题吗?答案是:是的,是的。

尽管围绕开源人工智能似乎存在一种罗宾汉式的运动,但数据显示情况正朝不同的方向发展。微软等大型企业正在将一些最受欢迎的模型的许可证从可容许转变为非商业(NC)许可证,Meta 开始在所有最新的开源项目(如MMSImageBindDINOv2,都采用 CC-BY-NC 4.0 许可证,以及LLAMA采用 GPL 3.0)。甚至像斯坦福的 Alpaca这样的大学项目,也仅限于非商业使用(继承自其使用数据集的不可容忍属性)。整个公司改变其业务模式,以保护其知识产权并摆脱开源作为其使命的一部分的义务 — 还记得一个名叫 OpenAI 的小型非营利组织转变为有限盈利的事件吗?请注意,GPT2 是开源的,但 GPT3.5 或 GPT4 却没有?

更普遍地说,虽然不透明,但 AI 领域向更严格许可的趋势是显而易见的。下面是对Hugging Face模型许可的分析。从 2022 年中期开始,允许性许可(如 Apache、MIT 或 BSD)的比例持续下降,而不可许可的许可(如 GPL)或限制性许可(如 OpenRAIL)则变得越来越普遍。

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

来源:作者分析

更糟糕的是,最近对大型语言模型(LLMs)的狂热进一步混淆了情况。Hugging Face 维护了一个“开放 LLM 排行榜”旨在突出“开源社区所取得的真正进展”。公平地说,排行榜上的所有模型确实都是开源的。然而,仔细观察会发现几乎没有一个是商业用途许可的*。

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

来源:作者分析

*在这篇文章写作和发布之间,Falcon 模型 的许可已经更改为允许的 Apache 2.0 许可。总体观察仍然有效

如果说有什么值得注意的,那就是开放 LLM 排行榜突出显示了大型科技公司(LLaMA 由 Meta 以非商业许可开源)的创新主导了所有其他开源努力。更大的问题是这些衍生模型在其许可方面不够透明。几乎没有明确声明其许可的模型,你必须自己研究才能发现这些模型及其所基于的数据不允许商业使用。

开源 AI 的未来

社区中有很多虚伪的标榜,主要来自善意的企业家和风险投资者,他们希望有一个不被 OpenAI、谷歌和少数其他公司主导的未来。为什么 AI 模型应该开源并不明显——它们代表了公司多年来开发的辛苦知识产权,涉及数十亿的计算、数据获取和人才投入。如果公司随便将所有东西免费赠送给别人,那就等于欺骗了他们的股东。

“如果我能投资一个知识产权律师 ETF,我会的。”

开源 AI 中向不可许可许可的趋势似乎很明确。然而,新闻的压倒性数量未能指出这些工作的累积好处几乎完全归属于学术界和爱好者。投资者和高管应更加意识到这些影响并加倍小心。我强烈感觉到大多数新兴 LLM 棉花行业的初创公司都是在非商业许可的技术基础上建立的。如果我能投资一个知识产权律师 ETF,我会的。

我的预测是,AI 的价值捕获(特别是对于最新一代的大型生成模型)将类似于其他需要大量资本投资和专业人才积累的创新,如云计算平台或操作系统。一些主要的玩家将会出现,为整个生态系统提供 AI 基础。虽然在这个基础上还有充足的创业公司层,但就像没有开源项目能取代 AWS 一样,我认为开源社区很难产生对 OpenAI 的 GPT 及其后续版本的严肃竞争者。

本文中表达的观点仅代表我个人,不能代表我的雇主的观点。

Clemens Mewald 领导着 Instabase 的产品团队。之前,他在 Databricks 上参与了开源 AI 项目,如 MLflow,在 Google 参与了 TensorFlow。

Pd.Get_Dummies 的利与弊

原文:towardsdatascience.com/the-good-the-bad-and-the-ugly-of-pd-get-dummies-75c87e2aadc9

这是针对 pd.get_dummies 的死忠粉

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 亚当·罗斯·尼尔森

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

大家好 🤠

好的,我明白了。在 Python 中,将分类数据转换为虚拟变量数组最简单的方法之一是使用 Pandas 的 pd.get_dummies()。为什么还要花时间导入 OneHotEncoder 从 sklearn,执行 .fit_transform() 等等?真是繁琐!

这篇文章首先介绍一个简单的数据集,用于演示目的,其中测试集包含在训练集中未发现的分类数据。然后,演示如何使用 pd.get_dummies() 可能会导致演示数据出现问题。最后,展示如何使用 sklearn 的 OneHotEncoder 避免这个问题。

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

图片来源:作者在 Canva 上使用文本到图像的插图。提示:“三只穿着乡村西部牛仔服装的熊猫。”

演示用的简单数据集

这里我们有一个简单的数据集,其中包括一个名为 OS 的分类特征。OS 列列出了计算机操作系统。我们将使用这些虚拟数据进行演示。在 train_df 中包含虚拟演示训练数据,而在 test_df 中包含虚拟演示测试数据。

在我们的虚拟演示案例中,测试集包含在训练集中不存在的分类值。这种不匹配会导致问题。

import pandas as pd

train_df = pd.DataFrame({'OS': ['Windows', 'MacOS', 
                                'Linux', 'Windows', 'MacOS']})
test_df = pd.DataFrame({'OS': ['Windows', 'MacOS', 
                               'Android', 'Unix' 'iOS']})

在我们的训练数据中,我们有三种操作系统:Windows、MacOS 和 Linux。但在我们的测试数据中,还包括 Android、Unix 和 iOS 等额外类别。

使用 pd.get_dummies(train_df) 拟合的模型将无法与 pd.get_dummies(test_df) 的测试数据一起使用。结果将不匹配——因为类别不匹配。

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

图片来源:作者在 Canva 上使用 Canva 库图像创建的插图。艺术用品虚拟模型。

Pd.get_dummies() 的问题

当将pd.get_dummies()函数应用于我们的训练和测试数据集时,你会得到这样的结果。

train_encoded = pd.get_dummies(train_df, columns=['OS'])
test_encoded = pd.get_dummies(test_df, columns=['OS'])

如果你评估train_encodedtest_encoded DataFrames,你会注意到它们的列数不同。这是因为测试集中仅存在的’Android’类别在test_encoded中创建了一个额外的列。这种训练和测试数据集特征数量的不一致可能在构建和评估机器学习模型时造成重大问题,因为这些模型期望两个数据集中的特征空间相同。

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

图片来源:作者的屏幕截图,使用此处显示的代码生成。

使用 OneHotEncoder 的解决方案

现在,让我们看看 sklearn 的OneHotEncoder如何解决这个问题。当使用OneHotEncoder时,编码器在训练数据的.fit().fit_transform()方法期间学习类别。然后,在.transform()方法期间,它为所有学习到的类别创建列。如果在测试数据中发现了新类别,则有两个选项。首先,你可以忽略新的未见类别。

from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder(
    sparse_output=False, 
    handle_unknown='ignore').set_output(transform="pandas")

train_encoded = encoder.fit_transform(train_df[['OS']])
test_encoded = encoder.transform(test_df[['OS']])

注意,我们设置了handle_unknown='ignore'以告诉编码器忽略(而不是抛出错误)在测试集中看到的但在训练集中未见的任何类别。

还要注意,自 2023 年起,sklearn 提供了.set_output(transform="pandas")选项,这将确保编码器返回一个 Pandas DataFrame(具有更易读和解释的列名),而不是更简洁的 NumPy 数组。

通过使用handle_unknown='ignore'处理未知类别,OneHotEncoder确保训练数据和测试数据具有相同的特征空间,无论测试数据中出现了什么类别值。

OneHotEncoder 的附加好处

Sklearn 的OneHotEncoder不仅在处理测试数据中未见类别时非常有用,它还提供了其他一些附加功能,这些功能也可能很有用。以下是其中两个附加选项及其使用方法。

min_frequency

min_frequency是另一个强大的选项,它允许你指定一个最低频率阈值。频率低于此阈值的类别会被重新编码为“罕见”。这在你有一些只出现几次的类别时非常有用,这些类别可能没有足够的信息来帮助模型,可能会使模型复杂化,增加无用的特征,从而降低性能而没有任何预测价值。

这是如何设置min_frequency为 2 的:

encoder = OneHotEncoder(
    sparse_output=False, 
    handle_unknown='infrequent_if_exist').set_output(transform="pandas")
train_encoded = encoder.fit_transform(train_df[['OS']])
test_encoded = encoder.transform(test_df[['OS']])

max_categories

另一个有用的选项是max_categoriesmax_categories参数允许你限制虚拟数组中的输出列数。编码器将选择最常见的类别进行编码。

这个选项在处理具有许多类别的特征时特别有益,这些特征通常会导致维度数目很高。这可能会显著降低训练效率,同时增加模型复杂性,并且几乎没有提高预测能力的价值。简而言之,这减少了数据的维度。

这是限制编码到前 4 个最频繁类别的方法:

encoder = OneHotEncoder(
    sparse_output=False, 
    handle_unknown='ignore', 
    max_categories=4).set_output(transform="pandas")

train_encoded = encoder.fit_transform(train_df[['OS']])
test_encoded = encoder.transform(test_df[['OS']])

结论

从更宏观的角度来看,使用pd.get_dummies()而不是真正的拟合和转换过程,在数据科学领域还有更严重的错误。然而,如果你一直坚持使用pd.get_dummies(),现在你已经了解了它的优点、缺点和不足——阅读完这篇文章后,你应该考虑调整你的做法。

虽然pd.get_dummies()在 Python 中创建虚拟变量是快速且简便的,但当你的测试数据包含在训练数据中未见过的类别时,可能会导致问题。另一方面,sklearn 的OneHotEncoder优雅地处理了这种情况,确保了数据集间一致的特征空间。值得多写几行代码,以避免潜在的陷阱。

感谢阅读

你准备好了解更多数据科学领域的职业了吗?我提供一对一的职业指导,并有每周的电子邮件列表,帮助数据专业的求职者。联系我了解更多

感谢阅读。请把你的想法和建议发给我。你可以只是说声你好。如果你真的需要告诉我哪里做错了,我期待很快与你聊聊。Twitter: @adamrossnelson LinkedIn: Adam Ross Nelson

梯度下降算法及其背后的直觉

原文:towardsdatascience.com/the-gradient-descent-algorithm-4d54e0d446cd?source=collection_archive---------6-----------------------#2023-08-19

对梯度下降方法的技术描述,并配有算法运行的图示

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

·

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

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

亚瑟·叔本华的名言:“一旦你越过山丘,你会开始加速”。照片由作者拍摄。

  1. 引入一些关键定义

在优化方法中,尤其是在一阶算法类型中,您肯定听说过一种被称为梯度下降的方法。它是一阶优化类型,因为它需要一阶导数,即梯度。通过优化,梯度下降旨在最小化“实际”输出和模型预测输出之间的差异,这种差异由目标函数(即成本函数)测量。梯度或斜率被定义为在该函数(弯曲或直线)在给定点处绘制的线的方向。迭代地,梯度下降旨在在不同点对成本函数进行微分,从而推导出这些点上方向变化的程度,并朝向最陡下降的方向,即局部最小值。正如其名字所示,梯度 用作寻找局部最小值的下降方向,在那里优化的成本函数的参数值被最小化,从而达到最低值。

梯度下降主要用于(包括但不限于)训练机器学习模型和深度学习模型,后者基于神经网络结构类型。从线性回归和逻辑回归到神经网络,梯度下降旨在计算函数的最佳参数值。在其最简单的形式中,梯度下降旨在通过推导独立变量的参数的最佳值来最小化下面线性回归的误差项。这是,

y = β0 + β1 * X1 + … βk * Xk + Ɛ

其中,

y 是因变量

k 是独立变量的数量

X 是独立变量

β 参数

Ɛ 是误差项成分

在更复杂的形式中,梯度下降最常被定义为训练深度学习模型时的优化器,特别是在编译阶段。深度学习基于一个互连的网络进行不断的学习和改进,这个网络被称为神经网络。神经网络受到人脑的启发,是由人工神经元(称为节点)组成的高度复杂的网络。在最上层,节点在处理和分析来自前一层节点的数据,并将其传递到下一层节点方面扮演着重要角色。在神经网络中,权重,即优化的参数,是节点之间的联系。它们连接了输入/特征和隐藏层,因此它们表示了特定特征在预测最终输出时的重要性。找到单个权重的最佳值取决于许多权重的值。而这种优化是同时进行的,在深度神经网络中,即使是数百万个权重也可能会大大增加。在这里,梯度下降在涉及大量计算时表现得非常高效,这些计算基于神经网络的三个主要层:1)输入层 2)隐藏层 和 3)输出层。

有大量文献详细阐述和扩展了诸如深度学习方法及估计函数参数值的方法,进而扩展了梯度下降和普通最小二乘法(OLS)之间的差异,例如在线性回归的情况下。由于这不是本文的重点,读者可以进一步调查和扩展,以便更好地理解这些方法论。

2. 计算时间!

为了更好地理解梯度下降,我们需要扩展对可微分函数的定义。一个函数,明确地说是 ƒ(x),当其导数在该函数的曲线上的任意点都可以定义时,该函数就是可微分的。这就是说,对于函数 ƒ(x) 的定义域中的 所有 点。这里,有两个概念支持这个定义:一阶导数和二阶导数。一阶导数公式定义如下:

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

严格来说,函数的一阶导数,记作 ƒ’(x)df(x)/dx,是函数 ƒ(x) 在给定 x 点的斜率。如果斜率为正(负),则表明函数在增加(减少),以及增加(减少)的幅度。正斜率表示随着 x 值的增加,函数 ƒ(x) 也增加。相反,负斜率表示随着 x 值的增加,ƒ(x) 减少。二阶导数是函数 ƒ(x) 的导数的导数。记作 ƒ’’(x)d2f(x)/dx2,二阶导数指示了函数 ƒ(x) 的形状,即该函数是凹的还是凸的。从数学上讲(这一点很重要!!!),二阶导数可以区分相对最大值和相对最小值。

其中,

如果 ƒ’’(x) > 0,则 ƒ(x) 在 x = a 处是凸的。

如果 ƒ’(a) = 0,则 a 是一个临界点,因此是相对最小值。

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

图由作者绘制

其中,

如果 ƒ’’(x) < 0,则 ƒ(x) 在 x = a 处是凹的。

如果 ƒ’(a) = 0,则 a 是一个临界点,因此是相对最大值。

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

图由作者绘制

如果二阶导数等于零,则可能有两种情况:1) 函数 ƒ(x) 处于转折点,即拐点,在该点函数从凹变为凸,或反之;2) 在该点函数未定义(即,不连续)。对于前者:

如果 ƒ’’(x) = 0,则 ƒ(x) 在 x = 2 处是拐点。

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

图由作者绘制

上述内容集中于一个具有单一自变量的函数,即一元函数 y = ƒ(x)。在现实世界中,人们会研究和建模多变量函数,其中研究的变量受到多个因素的影响,这就是两个或更多自变量 y = ƒ(x, z)。为了测量自变量 x 对因变量 y 的影响,并保持 z 不变,需要计算函数关于 x 的偏导数。因此,偏导数计算了因每个输入的变化引起的成本函数的变化率。梯度下降迭代地计算这些成本函数的变化,并在每一步更新这些函数参数的值,直到达到使参数值优化、从而最小化成本函数的最小点。

3. 梯度下降算法的实际应用

斜率的绝对值越大,我们可以迈出的步伐就越大,或者我们可以继续朝着最陡下降的方向迈步,即局部最小值。随着我们接近最低/最小点,斜率减小,因此可以迈出更小的步伐,直到到达斜率为零(0)的平坦表面,即ƒ’(x) = 0,这是下图中红色箭头指向的βi 的最低值。这就是曲线的局部最小值,函数参数的最优值也在此处得出。

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

作者绘制的图表

因此,如果一个函数是严格凸的(凹的),则只有一个临界点。现在,也有可能存在多个局部最小值的情况。在这种情况下,搜索的是函数能够达到的最低值,这被称为全局最小值。

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

作者绘制的图表

以下两个关键问题出现:

  1. 应该朝哪个方向迈步?

  2. 步长应该有多大?

让我们回顾一下到目前为止的内容。梯度下降是一种算法,在模型的训练阶段,通过在每一步向最陡下降的方向(即局部最小值)前进时,对函数的每个输入取其偏导数,从而迭代地调整和优化函数参数的值。如果导数为正,函数值在增加。因此,应该朝相反方向迈步。梯度指示了应该迈步的方向。如果梯度很大,即斜率的绝对值很大,则应该朝着局部最小值迈较大的步伐。实际上,梯度下降在每次迭代中朝着局部最小值方向采取越来越小的步伐,如上图中的蓝色箭头所示。

步长的大小与学习率有关。这决定了算法学习/移动到最陡下降方向的速度。在最高梯度下,即斜率的绝对值最大时,算法学习最快。当接近局部最小值时,步长会变小。因此,学习率作为超参数在尝试不同值后设置,以便成本函数在迭代中减少。如果学习率过大,可能会错过局部最小值。学习率过小可能导致权重更新较小,使模型没有显著改善。如果学习率过小,可能需要时间才能收敛。收敛是指成本函数不再减少。因此,成本函数是算法性能的指标。在多变量函数的世界中,这表示为:

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

其中,

df/dβ 表示成本函数对参数 β 的偏导数。

m 数据点数量。

yi 是第 i 个数据点的实际依赖/目标变量值。

ŷi 是模型预测的第 i 个数据点的依赖/目标变量值。

xi 表示与数据点相关的第 i 个输入。

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

其中,

▽f 表示函数 f(x) 对参数 β 的梯度向量。

df/dβk 表示函数 f(x) 对第 k 个参数 β 的偏导数。

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

其中,

新的 β 表示第 i 个参数 β 的当前值。

旧的 β 表示第 i 个参数 β 的更新值。

n学习率:采取步长的长度!

▽f 是指向函数 f(x) 在参数 β 变化方向上的最陡下降方向的梯度向量,以最小化 f(x)

4. 梯度下降的局限性

梯度下降的一个局限性与上述提到的标准之一有关,即函数必须在其定义域的每一点都可微分。当情况不是这样,算法找到一个未定义的点(即不连续的点)时,算法会失败。

另一个局限性与步长的大小有关,即学习率 (n),即朝着最陡下降方向采取的步伐。如果步长过大,可能会错过局部最小值,甚至可能无法收敛。如果步长过小,则需要更长的时间才能收敛。如果输入数量很大,这种情况会更加严重。

最终,梯度下降可能永远无法找到全局最小值。算法无法区分局部最小值和全局最小值。当算法在寻找局部最小值时,一旦收敛就会停止。局部最小值会把算法困在局部最小值所在的谷底,阻止步伐足够大以便退出。

5. 结论

总结来说,梯度下降是:

  1. 一种迭代的、一阶优化算法类型。

  2. 在每次迭代中,对可微函数的参数进行更新,并最小化成本函数。

  3. 因此,收敛于局部最小值。

基于梯度下降法的局限性,有动机探索不同的、更先进的梯度下降方法,甚至其他类型的优化算法,如二阶方法。然而,这超出了本文的范围,因此我会把它留作我下一篇文章的主题 😊

感谢阅读!

请添加任何你认为能增强该主题知识的评论!

图着色问题:精确解和启发式解

原文:towardsdatascience.com/the-graph-coloring-problem-exact-and-heuristic-solutions-169dce4d88ab?source=collection_archive---------3-----------------------#2023-11-13

通过自定义构造启发式方法和整数规划在 Python 中探索经典的离散优化问题

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

·

关注 发布于 Towards Data Science ·10 分钟阅读·2023 年 11 月 13 日

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

32 节点实例的图着色启发式解。(图片由作者提供)。

图着色理论在离散数学中占据核心地位。它出现在许多看似与着色无关的地方。它处理的是将一组对象根据某些规则划分为类别的基本问题(Jensen & Toft, 1995)。

我们可以将问题总结如下:给定一个无向图G(V, E),为每个节点(顶点)分配颜色,使得相邻节点不共享相同颜色,并且使用的颜色数量最小化。尽管问题陈述简洁明了,但这个问题以其计算复杂性而臭名昭著,属于 NP 难类问题。

由于其组合复杂性,即使使用最佳可用求解器,整数线性规划(ILP)的精确方法可能无法解决大型实例。在这种情况下,启发式算法和元启发式算法可以是有趣的替代方法。虽然无法证明最优性,但这些方法可以提供快速和高质量的解决方案。

在本文中,我们将使用构造启发式算法DSatur(Brélaz, 1979)和整数线性规划模型使用pyomo(Bynum 等,2021),使用 HiGHS 求解器解决图着色问题。至于其他故事,你可以在我的code repository中找到完整的代码。

如果您还不熟悉线性规划,我建议您在继续之前阅读我以前的文章以获得基础知识。

## 线性规划:理论与应用

Python 中的线性优化的主要概念和实现

towardsdatascience.com

现在让我们动手创建像这样的令人惊叹的解决方案。

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

32 个节点实例的图着色启发式解决方案。(作者动画)

构造启发式算法 — DSatur

让我们回顾一下我们的问题定义:

  • 考虑一个无向图G(V, E)。

  • 为每个节点分配颜色,使得相邻节点不共享相同的颜色。

  • 最小化使用的颜色数量。

一个朴素的构造性解决方案可以是依次选择一个空节点,并为其分配一个颜色,确保其邻居中尚未使用该颜色。这可能不是可能的最佳策略,但肯定可以为所需颜色数量提供一个上界。然而,DSatur(Brélaz, 1979)算法包括选择下一个节点和改进该启发式的新元素。

  • 度数:连接到给定节点的边的数量。

  • 饱和度:在邻居中使用的不同颜色数量。

DSatur的算法从一个未着色节点的队列开始,迭代选择一个饱和度度数最大的节点,将其从队列中移除,并为其分配颜色。如果饱和度相等,Brélaz(1979)建议选择任何一个饱和度最大的节点。我们将采用稍微不同的方法,通过选择具有最大整体度数的节点来打破平局。分配给给定节点的颜色应为可用的最低索引颜色。下面给出了伪代码。设N为节点集合,Q为未着色节点队列,引用N本身的相同内存位置,C为已使用颜色集合。

dsatur(N)
  Q = [&n for n in N]
  C = {}
  while |Q| > 0:
    sort(Q) // descending order by saturation and degree
    n = Q.pop(0)
    assign_color(n, C)

函数assign_color应该验证最低索引可用的颜色,如果当前集合中的颜色不可行,则包含一个新的备选颜色并增加集合。

让我们把这部分代码写成 Python 代码。首先是包的导入。我们的启发式算法将用纯 Python 编写,只需导入一些类型提示。

from typing import List, Tuple

现在,让我们定义我们的基本建模元素:ColorsNodes。类Color定义为一个可变的占位符,用于相应实例的索引。在 Python 中,这可能是内存高效的,因为多个变量可以引用相同的内存位置。每次用给定颜色给新节点上色时,都应该调用add_node方法。

class Color:

    index: int
    n_nodes: int

    def __init__(self, index) -> None:
        self.index = index
        self.n_nodes = 0

    def __repr__(self):
        return f"C{self.index}"

    def add_node(self):
        self.n_nodes = self.n_nodes + 1

现在谈谈Node类。每个Node实例都有一个属性neighbors,这是一个节点(指针)的列表。因此,每次修改节点时,我们无需更改其邻居的任何信息。我们可以使用add_neighbor方法添加一个邻居,使用set_color方法设置其颜色,并访问依赖于其邻居当前状态的属性neighbor_colorssaturationdegree

class Node:

    neighbors: List['Node']
    index: int
    color: Color

    def __init__(self, index):
        self.index = index
        self.neighbors = []
        self.color = None

    def __repr__(self) -> str:
        return f"N{self.index}|{self.color}"

    def add_neighbor(self, node: 'Node'):
        if node not in self.neighbors:
            self.neighbors.append(node)

    def set_color(self, color: Color):
        self.color = color
        color.add_node()

    @property
    def neighbor_colors(self):
        return [n.color for n in self.neighbors if n.color is not None]

    @property
    def saturation(self):
        return len(set((n.color for n in self.neighbors if n.color is not None)))

    @property
    def degree(self):
        return len(self.neighbors)

现在进入DSatur算法。为了实现它,将创建一个同名的类。新创建的DSatur实例需要图的节点数n_nodesedges作为参数。然后,它会实例化节点并根据边设置它们的邻居。

class DSatur:

    N: List[Node]
    C: List[Color]
    history: List[Node]

    def __init__(self, nodes: List[int], edges: List[Tuple[int, int]]):
        N = [Node(i) for i in nodes]
        for e in edges:
            i, j = e
            N[i].add_neighbor(N[j])
            N[j].add_neighbor(N[i])
        self.N = N
        self.C = []
        self.history = []

    def find_next_color(self, node: Node) -> Color:
        next_color = None
        for c in self.C:
            if c not in node.neighbor_colors:
                next_color = c
                break
        if next_color is None:
            next_color = Color(len(self.C) + 1)
            self.C.append(next_color)
        return next_color

    def solve(self, save_history=False):
        Q = [n for n in self.N]  # Pool of uncolored nodes
        while len(Q) > 0:
            Q.sort(key=lambda x: (x.saturation, x.degree), reverse=True)
            n: Node = Q.pop(0)
            next_color = self.find_next_color(n)
            n.set_color(next_color)
            if save_history:
                self.history.append(n)
        self.C.sort(key=lambda x: x.n_nodes, reverse=True)

    @property
    def cost(self):
        return len(self.C)

现在,让我们使用它来解决一些具有挑战性的问题!你可以在OR Library中找到几个实例。在那里,它们被标记为“gcolX”。我们可以使用以下代码从这些文件中的一个提取节点和边的数量。

# Open and read file
with open($YOUR_FILE_PATH, mode="r") as file:
    lines = file.readlines()
    header = lines[0].strip().split()
    n_nodes = int(header[2])
    edges = []
    node_set = set()
    for line in lines[1:]:
        if line.startswith('e'):
            _, i, j = line.strip().split()
            edges.append((int(i), int(j)))
            node_set.add(int(i))
            node_set.add(int(j))
nodes = sorted(node_set)
assert len(nodes) == n_nodes, "Wrong number of nodes specified"

然后,我们将这些颜色解析到一个新的DSatur实例中,解决问题(或者至少得到一个高质量的近似解)。

dsatur = DSatur(nodes, edges)
dsatur.solve()

创建介绍中结果的有趣可视化的代码可能过于冗长,不便在这里包含,但你可以在我的代码库中找到。它可以传达处理多个节点时难度的总体概念…

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

图着色启发式解决方案针对 100 个节点实例。(作者动画)。

现在让我们看看如何通过精确方法处理它。

整数线性规划

为了优化我们使用启发式方法得到的解决方案,并尝试证明解决方案的最优性,让我们将图着色问题表述为一个整数线性规划模型。请记住,尽管如此,它可能无法处理大型实例。本节介绍的模型以及其他确切算法均在 Lewis(2021)的第三章中介绍。

让我们定义在这种方法中考虑的Sets

  • C:颜色

  • N:节点(或顶点)

  • E:边

第一个问题已经出现:“我们应该考虑多少种颜色?”在最坏的情况下,所有节点都连接在一起,因此应该考虑与N相同大小的C。然而,这种方法可能通过不必要增加决策变量的数量并恶化模型的线性放松,使我们的解决方案变得更加困难。一个好的替代方法是使用启发式方法(如DSatur)来获取颜色数量的上限。

在这个问题中,我们有两组决策变量:

  • x_{i, c}:是二进制变量,指示节点i使用颜色c着色。

  • y_{c}:是二进制变量,指示使用颜色c

我们还必须创建约束条件以确保:

  • 每个节点必须着色。

  • 如果任何一条边上的节点有颜色,请确保使用该颜色。

  • 每条边上最多只能用一个颜色着色。

  • 打破对称(这不是必须的,但可能有帮助)

最终,我们的目标是最小化使用的总颜色数,这是y的总和。总结我们有以下方程。

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

图着色整数规划模型。(作者提供的图片)。

毫不拖延,让我们为整数编程模型导入pyomo

import pyomo.environ as pyo

pyomo中建模问题有两种方法:抽象具体模型。在第一种方法中,问题的代数表达式在提供某些数据值之前定义,而在第二种方法中,模型实例在其元素定义后立即创建。您可以在库文档或 Bynum 等人(2021)的书中了解更多关于这些方法的信息。在本文中,我们将采用具体模型的形式。

model = pyo.ConcreteModel()

接下来,让我们实例化我们的Sets。直接从dsatur属性NC中解析可迭代对象是有效的,因此可以在initialize关键字参数中使用它们。或者,我将从输入数据中传递原始nodesedges,并从DSatur创建一个范围作为我们颜色的初始化。

model.C = pyo.Set(initialize=range(len(dsatur.C)))  # Colors
model.N = pyo.Set(initialize=nodes)  # Nodes
model.E = pyo.Set(initialize=edges])  # Edges

接下来,我们实例化我们的决策变量。

model.x = pyo.Var(model.N, model.C, within=pyo.Binary)
model.y = pyo.Var(model.C, within=pyo.Binary)

然后是我们的约束条件。

# Fill every node with some color
def fill_cstr(model, i):
    return sum(model.x[i, :]) == 1

# Do not repeat colors on edges and indicator that color is used
def edge_cstr(model, i, j, c):
    return model.x[i, c] + model.x[j, c] <= model.y[c]

# Break symmetry by setting a preference order (not required)
def break_symmetry(model, c):
    if model.C.first() == c:
        return 0 <= model.y[c]
    else:
        c_prev = model.C.prev(c)
        return model.y[c] <= model.y[c_prev]

model.fill_cstr = pyo.Constraint(model.N, rule=fill_cstr)
model.edge_cstr = pyo.Constraint(model.E, model.C, rule=edge_cstr)
model.break_symmetry = pyo.Constraint(model.C, rule=break_symmetry)

你可以尝试包括其他对称破缺约束,并查看哪个在你的可用求解器中效果更好。在我进行的一些实验中,包括使用总节点数的优先级顺序的效果不如忽略它。这可能是由于求解器的本地对称破缺策略。

# Break symmetry by setting a preference order with total assignments
def break_symmetry_agg(model, c):
    if model.C.first() == c:
        return 0 <= sum(model.x[:, c])
    else:
        c_prev = model.C.prev(c)
        return sum(model.x[:, c]) <= sum(model.x[:, c_prev])

最终,目标…

# Total number of colors used
def obj(model):
    return sum(model.y[:])

model.obj = pyo.Objective(rule=obj)

我们的模型已经准备好解决了!为此,我使用了 HiGHS 持久求解器,该求解器在pyomo中可用,前提是你的 Python 环境中还安装了highspy

solver = pyo.SolverFactory("appsi_highs")
solver.highs_options["time_limit"] = 120
res = solver.solve(model)
print(res)

对于大型实例,我们的求解器可能很难改善启发式解。然而,对于在代码仓库中提供的 32 节点实例,求解器能够将使用的颜色数量从 9 减少到 8。值得一提的是,完成执行花费了 24 秒,而对于相同实例的DSatur算法仅花费了 6 毫秒(使用纯 Python,这是一个解释型语言)。

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

32 节点实例的图着色整数规划解。(图片由作者提供)。

进一步阅读

尽管DSatur是一种直观的启发式方法,能提供快速的高质量解,但其他方法可能会带来更好的结果,尤其是在复杂实例上。图着色问题中最著名的元启发式算法之一是Tabucol(Hertz & Werra, 1987)。作者提出了一种从初始解开始的方法,初始解具有k种颜色,并可能存在连接相同颜色节点的边。然后,执行局部移动,改变给定节点的颜色,以最小化冲突,使用禁忌表逃避局部最优。

比本文中所示的图着色问题的更高效的精确方法依赖于Column Generation,使用一种称为Branch & Price的算法。对这个主题感兴趣的读者可以在我的其他 Medium 故事中找到简洁的概述。

## 线性规划中的列生成和切料问题

如何使用 Python 示例解决具有大量决策变量的线性问题

towardsdatascience.com

结论

在这篇文章中,介绍了两种解决图着色问题的方法:构造性启发式DSatur(Brélaz, 1979)和整数线性规划(ILP)模型。启发式方法能够为中等规模的实例提供快速的高质量解,之后的解通过 ILP 模型进一步改进。实现的代码可在公共仓库中进一步使用。

参考文献

Brélaz, D., 1979. 图的顶点着色的新方法。ACM 通讯22(4),251–256。

Bynum, M. L. et al., 2021. Pyomo-优化建模在 Python 中。Springer。

Hertz, A., & Werra, D. D., 1987. 使用禁忌搜索技术进行图着色。计算39(4),345–351。

Jensen, T. R., & Toft, B., 1995. 图着色问题。John Wiley & Sons。

Lewis, R.M.R., 2021. 图着色的高级技术。在:图着色指南。计算机科学文本。Springer,Cham。doi.org/10.1007/978-3-030-81054-2_4

推荐系统指标指南

原文:towardsdatascience.com/the-guide-to-recommender-metrics-c5d72193ea2b

离线评估推荐系统可能是棘手的

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

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

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

图片由 Darius Cotoi 提供,来源于 Unsplash

想象一下 YouTube 主页面,它展示你可能喜欢的视频,或者 Amazon 推荐你购买更多他们销售的产品。这些都是推荐系统的例子,它们试图展示你最可能想要互动的内容。

假设你也用你选择的方法构建了一个推荐系统。问题是:如何离线评估它,在投入生产之前并让它在网站上提供推荐服务?

在这篇文章中,你将确切学到这些!此外,我还会告诉你为什么你需要小心这些指标。

如需更详细的介绍,请参阅我的另一篇文章,该文章还展示了如何使用 TensorFlow 从头构建推荐系统。

## 嵌入式推荐系统简介

学习如何在 TensorFlow 中构建一个简单的矩阵分解推荐系统

towardsdatascience.com

推荐系统的离线评估

首先,让我们为推荐系统找到一个定义,以涵盖你可能设计或在实际中找到的大多数系统。

对我们而言,推荐系统是一个算法,它至少以用户作为输入,并输出一个有序的推荐项列表给该用户。

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

图片由作者提供。

为什么至少要有一个用户?可能还有更多的输入,比如季节时间,这可以帮助模型学习不要在夏天推荐巧克力圣诞老人。

例如,我们构建的水果推荐器R可以做诸如 R(Alice) = [苹果、橙子、樱桃] 这样的事情。

注意: 用户可能是其他的东西,甚至可能是另一篇文章。如果你想为商店里缺货的文章构建一个推荐器,这可能是相关的。所以,你的推荐器将一篇文章作为输入并输出其替代品。不过,我们还是坚持经典的用户-物品推荐。

接下来是你可以用来评估推荐系统质量的离线推荐指标列表。我将向你展示它们的定义以及使用时需要注意的细节。

训练-测试分割

我们将假设已经进行了一些形式的训练-测试分割,以获得有意义的指标。否则,我们将仅衡量推荐系统的过拟合能力。假设我们有如下数据:

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

作者提供的图像。

阅读: 用户A购买/观看/收听了物品X(例如电影或歌曲)。我将在接下来的文章中使用“购买”。

有许多分割选项,你应根据应用场景选择其一。

  1. 随机分割: 你将所有行随机分割为训练集和测试集。

  2. 时间分割: 你选择一个阈值日期,将所有在此日期之前的条目放入训练集中,其余的放入测试集中。

通常,当我有日期列时,我会选择时间分割,因为它完全符合模型的预期用途:我们在过去的数据训练一个模型,并希望它在未来表现良好。不过,思考一下这是否适合你的情况。

好吧,在定义了一些分割之后,让我们继续进行指标的部分!

回归指标

在最佳情况下,你不仅会有类似于用户A购买了物品X的交易数据,还可能会有某种明确的反馈,例如用户评分(1–5 星)。在这种情况下,你不仅可以让你的模型输出一个物品列表,还可以输出它们的预测评分。然后,你可以选择任何回归指标,比如均方误差或平均绝对误差来衡量预测评分与实际评分之间的差距。这没有什么新意,因此我们就此打住。

从隐含反馈中获得的推荐系统对齐指标

从现在开始,我们将假设没有任何明确的反馈,例如星级评分,只有隐含反馈,比如“用户A购买了物品X”。有关隐含反馈的更多信息,请查看我的另一篇文章的介绍部分:

## 使用 TensorFlow 推荐系统进行隐式反馈的推荐系统

当客户没有明确告诉你他们想要什么时

[towardsdatascience.com

准备工作

我们将讨论的所有指标都需要两个要素:

  1. 用户在测试集中购买的项目列表

  2. 对于同一用户,在训练模型后,推荐列表(这是预测结果!)是基于训练集的。

以下指标用于衡量这两个列表的对齐程度。让我们详细看看。

假设我们现在只有一个用户Alice

  • 在测试集中,Alice 购买了以下项目:🍍🍎🍉🍌🍒

  • 推荐系统输出如下:🍌🍐🍒🍈🍇(按照这个顺序)

我们将 Alice 在测试集中获得推荐并实际购买的项目称为相关。在我们的例子中是:🍌 和 🍒。那些被推荐但 Alice 没有购买的项目是不相关的,即 🍐、🍈 和 🍇。

如果我们有多个用户,我们只需计算每个用户的以下指标,并对所有用户取平均值。此外,我们将定义许多带有 **@k 后缀的指标。这仅意味着我们 将推荐列表截断为 k ,然后计算指标。

Precision@k

用文字表述:

在前 (前面) 的 k 个推荐项目中,有多少 % 对 Alice 是相关的?

让我们计算 precision@3。实际上,Alice 购买了 🍍🍎🍉🍌🍒,但推荐系统建议了🍌🍐🍒 作为前三个项目。这三个项目中有多少是相关的?好吧,只有 🍌 和 🍒 出现在测试集中,因此precision@3 = 2/3 ≈ 66.7%

**提醒:**我们的推荐系统向 Alice 推荐了 🍌🍐🍒🍈🍇。

你可以用这种方式计算所有其他 k 的 precision@k:precision@1 = 1/1,precision@2 = 1/2,precision@4 = 2/4,precision@5 = 2/5。一般公式为:

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

作者提供的图片。

这里,rel 是 0 或 1,具体取决于推荐列表中第 i 位的项目是否相关 (1) 或不相关 (0)。

从现在开始,我们只处理 relᵢ,因为这样我们不需要记住哪些水果是相关的,哪些不是。因此,我们将🍌🍐🍒🍈🍇 转换为 [1, 0, 1, 0, 0] ,因为🍌 和 🍒 是相关的。

这个指标很直接,因为你只需要计算多少项目是相关的。不过,这个指标有一些变体。例如,如果我们的推荐系统显示了 5 个项目,但 Alice 在测试集中只购买了 3 个。然后推荐系统无法获得 100% 的分数,最大值将是 3/5 = 60%。如果你觉得这不公平,你可以通过不将总和除以 k,而是 除以 k 或 Alice 在测试集中购买的总项目数(取较小者)来调整指标。

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

total = Alice 在测试集中购买的总项目数。图像由作者提供。

precision@k 的缺点:推荐的顺序被忽略。对于相关性评分为 [1, 0, 1, 0, 0] 的推荐,precision@5 与 [0, 0, 0, 1, 1] 是一样的,尽管将相关项目排在列表前面更为理想。你还希望你的相关搜索引擎结果排在第一位,而不是第七位。

Recall@k

这个问题类似于 precision@k

在所有相关的项目中,有多少 % 被推荐给了 Alice?

让我们计算 recall@2:Alice 总共购买了 5 个项目 🍍🍎🍉🍌🍒,在前两个位置上得到了推荐 🍌🍐。* 只有单一的项目 🍌 被我们的推荐系统覆盖,所以 recall@2 = 1/5。

你还可以计算:recall@1 = 1/5,recall@3 = 2/5,recall@4 = 2/5,recall@5 = 2/5。一般来说:

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

total = Alice 在测试集中购买的总项目数。图像由作者提供。

再次,你可以争论这有时是不公平的。即使是完美的推荐系统也无法覆盖所有的 总共 项目,如果 k < 总数。例如,如果前两个项目是相关的,则 recall@2 的最大值为 2/5。你也可以调整它,结果发现你会得到与调整后的 precision@k 相同的公式。

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

图像由作者提供。

recall@k 的缺点:与之前相同。推荐的顺序被忽略。

NDCG@k

这个问题有点复杂,因为它包括两个部分:DCGIDCG。但在我们开始之前,先提供一个信息:这个指标关注推荐的顺序!所以,让我们看看它是如何工作的:

DCG:这是折扣累计增益的缩写。它的公式是

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

图像由作者提供。

在这里,你可以看到为什么推荐顺序很重要——每个相关性项 rel 都因为在列表中靠后而受到惩罚。rel₁ 被除以 log₂(2) = 1,rel₂ 被除以 log₂(3) ≈ 1.585,rel₃ 被除以 log₂(4) = 2,依此类推。

因此,相关项目最好位于列表的顶部,那里的 折扣(惩罚)项仍然较低。

这个指标本身的问题在于它是无界的。在我们的例子[1, 0, 1, 0, 0]中,DCG@3 是 1/log₂(2) + 0/log₂(3) + 1/log₂(4) = 1 + 0.5 = 1.5。这就是为什么我们现在将通过检查一个完美推荐系统的表现来计算DCG 的上限

IDCG: 这是理想折扣累计增益的缩写。我们输出的相关性模式为[1, 0, 1, 0, 0]的推荐系统并不完美。一个真正的完美推荐系统会将 Alice 在测试集中购买的所有项目放在列表的最上面,即相关性模式将是[1, 1, 1, 1, 1],因为 Alice 购买了 5 件商品。

备注: 如果 Alice 在测试集中只购买了 2 件商品,一个完美的推荐系统将输出[1, 1, 0, 0, 0],因为没有更多相关的项目可以填充推荐列表。

因此,DCG 不能高于所有 5 个推荐项目都相关的情况。我们可以计算 IDCG@3 = 1/log₂(2) + 1/log₂(3) + 1/log₂(4) ≈ 2.131。

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

作者提供的图片。

NDCG: 最后,我们可以定义标准化折扣累计增益 NDCG@k

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

因此,在我们的案例中,NDCG@3 = DCG@3 / IDCG@3 ≈ 1.5 / 2.131 ≈ 0.704

我们可以测试一下如果我们的推荐系统变得更差会发生什么,例如,如果相关性模式为[0, 1, 1]。那么 DCG@3 是 0/log₂(2) + 1/log₂(3) + 1/log₂(4) ≈ 1.131,NDCG@3 ≈ 1.131 / 2.131 ≈ 0.531 < 0.704。

讨论与结论

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

图片由ANIRUDH提供,来源于Unsplash

好的,我们已经讨论了一些常见的指标。我们也看到了这些指标如何衡量推荐系统输出的排名与用户购买的项目的匹配程度。然而,请你思考一下:

这真的是我们想要的吗?

毕竟,用户已经购买了这些项目,即使没有我们推荐系统的帮助(因为我们现在才在开发它!)。所以,我们实际上是在衡量我们的推荐系统能够展示客户本来会购买的商品的能力。

可能我们的推荐系统在生产环境中使用时互动率(点击它的人的比例)会增加。但我不确定这是否是一个成功的标志,因为他们可能本来就会购买很多这些商品。也许我们只是给他们提供了一个在开始页面上的快捷方式。这并不是坏事,因为这可能会转化为更高的客户满意度,这对其他目标可能有好处。但它可能不会对收入产生你希望的重大影响。

要增加收入——这通常是你的终极目标——也许让用户看到他们自己不会购买的商品更有意义。但这在离线环境中很难衡量。你需要实现一个推荐系统,然后在在线环境中测试它,这样你才能看到你的客户真正想要什么。

举个例子,你可以测试一个高多样性的推荐系统,即一个显示来自不同类别商品的推荐系统。或者,你认为总是明智的在 Netflix 上向喜欢喜剧的人推荐 100%的喜剧吗?也许推荐不同的类型也有意义。

正如我所说的,你必须使用A/B 测试在在线环境中进行测试。也许你的用户喜欢被推荐他们本来会购买的东西,但也可能不是这样。

不要猜测,只要测试。

在最好的情况下,你可以观察到你的某一个离线指标与在线 KPI 之间的相关性。然后优化这个离线指标是有意义的。但是,如果你没有这种相关性,丢弃一个模型只是因为它的 NDCG 低于另一个模型的 NDCG 时要小心。

我希望你今天学到了一些新的、有趣的、有价值的东西。感谢阅读!

如果你有任何问题,可以在 LinkedIn上联系我!

如果你想更深入地了解算法的世界,可以试试我的新出版物关于算法的一切!我仍在寻找作者!

[## 关于算法的一切

从直观的解释到深入的分析,算法通过示例、代码和精彩的内容变得生动。

medium.com](https://medium.com/all-about-algorithms?source=post_page-----c5d72193ea2b--------------------------------)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值