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

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

AI 驱动的洞察:利用 LangChain 和 Pinecone 与 GPT-4

原文:towardsdatascience.com/ai-driven-insights-for-product-managers-vol-1-leveraging-langchain-and-pinecone-with-gpt-4-7755485019f9?source=collection_archive---------6-----------------------#2023-06-19

赋能下一代产品经理

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

·

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

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

高效处理定性数据是产品经理最重要的技能之一;收集数据、分析数据并有效地传达这些数据,提供可行且有价值的洞察。

你可以从许多地方获取定性数据——用户访谈、竞争对手反馈,或使用你产品的人的评论。根据你想要实现的目标,你可能会立即分析这些数据,或者将它们保存起来以备后用。有时,你可能只需要几个用户访谈来验证一个假设。其他时候,你可能需要从一千个用户那里获取反馈以发现趋势或测试想法。因此,你分析这些数据的方法可以根据情况的不同而有所变化。

借助像 GPT-4 这样的大型语言模型和像 LangChain 及 Pinecone 这样的 AI 工具,我们可以更有效地处理各种情况和大量数据。在本指南中,我将分享我与这些工具的经验。我的目标是向产品经理以及其他处理定性数据的人员展示如何利用这些 AI 工具从数据中获取更有用的见解。

在这篇指南风格的文章中,你会发现什么?

  1. 我将首先向你介绍这些 AI 工具,以及大型语言模型(LLMs)的当前限制。

  2. 我将讨论你如何充分利用这些工具来处理现实生活中的使用案例。

  3. 以用户反馈分析为例,我将提供代码片段和示例,以展示这些工具在实践中的应用。

请注意:要使用像 GPT-4、LangChain 和 Pinecone 这样的工具,你需要对数据感到舒适,并具备一些基本的编码技能。了解你的客户并能够将数据洞察转化为实际行动也很重要。对 AI 和机器学习的了解是加分项,但不是必须的。

了解 AI 工具:为什么你可能需要 LangChain 和 Pinecone

假设你已经对 GPT-4 熟悉,了解一些概念是很重要的,因为我们讨论与 LLMs 相关的工具时会用到这些概念。当前 LLMs(如 GPT-4)的一个主要挑战是它们的‘上下文窗口’——这就是它们一次可以处理和记住多少信息。

目前有两个版本的 GPT-4。标准版具有 8k 的上下文,而扩展版具有 32k 的上下文窗口。给你一个概念,32k token 大约是 24,000 个单词,相当于大约 48 页的文本。但请记住,即使你可以访问 GPT-4,32k 版本也不是对所有人开放的。

此外,OpenAI 最近宣布了一个新的 ChatGPT 模型,称为 gpt-3.5-turbo-16k,它的上下文长度是 gpt-3.5-turbo 的 4 倍。在进行洞察分析时,我建议使用 gpt-4,因为它的推理能力优于 GPT-3.5。但你可以尝试一下,看看哪个模型更适合你的使用案例。

为什么我要提到这个?

在处理洞察分析时,如果你有大量数据,或者对不止一个提示感兴趣,那么会遇到一个大挑战。假设你有一个用户访谈。你想更深入地挖掘并从中获取更多的洞察,使用 GPT-4。在这种情况下,你可以直接拿访谈记录并交给 ChatGPT,选择 GPT-4。你可能需要分割一次文本,但仅此而已。你不需要其他复杂的工具。因此,实际上当处理大量定性数据时,你才会需要这些复杂的新工具。让我们了解这些工具是什么,然后我们将转向一些具体的使用案例和示例。

那么 LangChain 是什么?

LangChain 是一个围绕 LLM 的框架,提供了各种功能,如聊天机器人、生成式问答(GQA)和总结。它的多功能性在于将不同组件连接在一起,包括提示模板、LLMs、代理和记忆系统。

提示模板是针对不同情况预制的提示,而 LLMs 处理和生成响应。代理帮助根据 LLM 的输出做出决策,记忆系统则存储信息以供后续使用。

在这篇文章中,我将分享一些我例子中的功能。

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

LangChain 模块的高级概述

Pinecone 是什么?

Pinecone.ai 是一个强大的工具,旨在简化高维数据表示(即向量)的管理。

向量在处理大量文本数据时特别有用,比如当你试图从中提取信息时。考虑一个你在分析反馈并想要了解产品各种细节的情况。仅靠“great”、“improve”或“i suggest”等关键词搜索无法实现这种深度洞察,因为你可能会错过很多上下文。

现在,我不会深入探讨文本向量化的技术细节(这可以是基于词的、基于句子的等)。你需要理解的关键点是,单词通过机器学习模型转换成数字,这些数字然后存储在数组中。

让我们举个例子:

单词 “seafood” 可能被转换为一系列数字,如:[1.2, -0.2, 7.0, 19.9, 3.1, …, 10.2]。

当我搜索另一个词时,该词也会被转换为一系列数字(或向量)。如果我们的机器学习模型正常工作,与“seafood”有类似上下文的单词,其数字系列应该接近于“seafood”的系列。这里有一个例子:

“shrimp” 可能被转换为:[1.1, -0.3, 7.1, 19.8, 3.0, …, 10.5],其中这些数字接近于“seafood”拥有的数字。

使用 Pinecone.ai,你可以高效地存储和搜索这些向量,实现快速而准确的相似性比较。

通过利用其功能,你可以组织和索引来自 LLM 模型的向量,从而开启更深层次的见解,并在广泛的数据集中发现有意义的模式。

简而言之,Pinecone.ai 允许你以便捷的方式存储你的定性数据的向量表示。你可以轻松地在这些向量中进行搜索,并应用 LLM 模型从中提取有价值的见解。它简化了管理数据和从中获取有意义信息的过程。

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

向量数据库的表示

你什么时候实际需要像 LangChain 和 Pinecone 这样的工具?

简短回答:当你处理大量的定性数据时。

让我分享一些我的使用案例,以给你一个了解:

  • 想象一下你有来自产品渠道的数千条书面反馈。你想识别数据中的模式,并跟踪反馈随时间的演变。

  • 假设你有不同语言的评论,你想将它们翻译成你偏好的语言,然后提取见解。

  • 你打算通过分析客户评论、反馈和对竞争对手产品的情感来进行竞争分析。

  • 你的公司进行调查或用户研究,生成大量的定性反馈。提取有意义的见解,发现趋势,并为产品或服务改进提供信息是你的目标。

这些只是 LangChain 和 Pinecone 等工具在处理定性数据的产品经理工作中的一些宝贵应用示例。

示例项目:反馈分析

作为产品经理,我的工作包括改进我们的会议记录和转录功能。为此,我们听取用户对这些功能的评价。

对于我们的会议记录功能,用户给我们质量打分 1 到 5 分,告诉我们他们使用了哪个模板,并发送他们的评论。流程如下:

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

在这个项目中,我密切关注了两件事:用户对我们功能的反馈和他们使用了哪些模板。我处理了大量的数据——超过 20,000 字,当我使用一个特殊工具将其拆分时,变成了超过 38,000 个“令牌”(或数据片段)。这数据量之大,超出了某些高级模型一次性处理的能力!

为了帮助我分析这些大量的数据,我转向了两个高级工具:LangChain 和 Pinecone,并辅以 GPT-4。借助这些工具,让我们更深入地探讨这个项目,看看这些高科技工具使我们能够做些什么。

这个项目的主要目标是从收集的数据中提取见解,这需要:

  1. 创建与数据集相关的特定查询的能力。

  2. 使用 LLMs 处理大量信息。

首先,我会给你一个项目实施的概述。之后,我会分享一些我使用的代码示例。

我们从一组文本文件开始。每个文件包含用户反馈和他们使用的模板名称。你可以处理这些数据以适应你的需求——我在我的项目中需要做一些后处理。记住,你的文件和数据可能不同,所以可以根据自己的项目进行调整。

例如,你想了解用户对会议记录结构的反馈:

query =  "Please list all feedback regarding sentence structures in a table \
in markdown and get a single insight for each one, and give a general summary for all."

这里是一个高层次的图示,展示了在使用 LLM 和 Pinecone 时的流程。你向 GPT-4 提问,或者我们称之为“查询”。与此同时,Pinecone,我们的反馈库,提供了你的查询的上下文,当你将问题本身发送给它(“嵌入查询”)时。它们一起帮助我们高效地理解数据:

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

以下是图示的简化版本:

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

让我们开始吧!在这个脚本中,我们设置了一个管道来使用 OpenAI 的 GPT-4、Pinecone 和 LangChain 分析用户反馈数据。本质上,它导入了必要的库,设置了反馈数据的路径,并建立了处理数据的 OpenAI API 密钥。

import os
import openai
import pinecone
import certifi
import nltk
from tqdm.autonotebook import tqdm
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
from langchain.llms import OpenAI
from langchain.chains.question_answering import load_qa_chain

directory = 'path to your directory with text files, containing feedback'
OPENAI_API_KEY = "your key"

然后我们定义并调用一个函数load_docs(),该函数使用 LangChain 的 DirectoryLoader 从指定目录加载用户反馈文档。然后,它会统计并显示加载的文档总数。

def load_docs(directory):
  loader = DirectoryLoader(directory)
  documents = loader.load()
  return documents

documents = load_docs(directory)
len(documents)

接下来定义并执行split_docs()函数,该函数使用 LangChain 的 RecursiveCharacterTextSplitter 将加载的文档分割成特定大小和重叠的小块。然后,它会统计并打印出结果块的总数。

def split_docs(documents, chunk_size=500, chunk_overlap=20):
  text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
  docs = text_splitter.split_documents(documents)
  return docs

docs = split_docs(documents)
print(len(docs))

要使用 Pinecone,这基本上是一个向量数据库,我们需要从文档中获取嵌入,因此我们应该为此引入一个函数。有很多方法可以做到这一点,但我们使用 OpenAI 的嵌入函数:

# Assuming OpenAIEmbeddings class is imported above
embeddings = OpenAIEmbeddings()

# Let's define a function to generate an embedding for a given query
def generate_embedding(query):
    query_result = embeddings.embed_query(query)
    print(f"Embedding length for the query is: {len(query_result)}")
    return query_result

要将这些向量存储到 Pinecone 中,你需要在那里创建一个帐户并创建一个索引。这个过程非常简单。然后你将从那里获得 API 密钥、环境名称和索引名称。

MY_API_KEY_p= "the_key"
MY_ENV_p= "the_environment"

pinecone.init(
    api_key=MY_API_KEY_p,
    environment=MY_ENV_p
)

index_name = "your_index_name"

index = Pinecone.from_documents(docs, embeddings, index_name=index_name)

下一步是能够找到答案。这就像在可能的答案领域中找到离你的问题最近的点,从而给出最相关的结果。

def get_similiar_docs(query, k=40, score=False):
  if score:
    similar_docs = index.similarity_search_with_score(query, k=k)
  else:
    similar_docs = index.similarity_search(query, k=k)
  return similar_docs

在这段代码中,我们使用 OpenAI 的 GPT-4 模型和 LangChain 设置了一个问答系统。get_answer()函数接受一个问题作为输入,查找类似的文档,并使用问答链生成一个答案。

from langchain.chat_models import ChatOpenAI
model_name = "gpt-4"

llm = OpenAI(model_name=model_name, temperature =0)

chain = load_qa_chain(llm, chain_type="stuff")

def get_answer(query):
  similar_docs = get_similiar_docs(query)
  answer = chain.run(input_documents=similar_docs, question=query)
  return answer

我们来到了问题!或者问题们。你可以问任意多的问题。

query =  "Please list all feedback regarding sentence structures in a table \
in markdown and get a single insight for each one, and give a general summary for all."

answer = get_answer(query)
print(answer) 

实现检索问答链:

要实现检索式问答系统,我们使用 LangChain 中的 RetrievalQA 类。它利用 OpenAI LLM 来回答问题,并依赖于一种“stuff”链类型。检索器连接到一个先前创建的索引,并存储在‘qa’变量中。为了更好地理解,你可以了解更多关于检索技术的信息。

from langchain.chains import RetrievalQA
retriever = index.as_retriever()

qa_stuff = RetrievalQA.from_chain_type(
    llm=llm, 
    chain_type="stuff", 
    retriever=retriever, 
    verbose=True
)

response = qa_stuff.run(query)

所以我们得到了响应,让我们用 Markdown 文本以视觉上更吸引人的格式展示响应变量中存储的内容。这样可以使显示的文本更加有序且易于阅读。

from IPython.display import display, Markdown

display(Markdown(response))

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

示例输出

尝试使用输入文件和查询以获得最佳效果,充分利用这一方法和工具。

结论

总而言之,GPT-4、LangChain 和 Pinecone 使处理大量定性数据变得容易。它们帮助我们深入挖掘这些数据并找到有价值的见解,从而指导更好的决策。本文提供了对它们使用的简要介绍,但它们的功能远不止于此。

随着这些工具的不断进步和普及,现在学习使用它们将为你未来带来显著的优势。因此,继续探索和学习这些工具,因为它们正在塑造数据分析的现在和未来。

请继续关注未来探索这些实用工具的更多方法!

所有图片,除非另有说明,均由作者提供

参考文献

LangChain 文档

Pinecone 文档

LangChain 在 LLM 应用开发中的短期课程

AI 熵:AI 生成内容的恶性循环

原文:towardsdatascience.com/ai-entropy-the-vicious-circle-of-ai-generated-content-8aad91a19d4f?source=collection_archive---------2-----------------------#2023-07-14

理解和缓解模型坍塌

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

·

关注 发布在 Towards Data Science ·10 分钟阅读·2023 年 7 月 14 日

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

照片由作者 — David E Sweenor

简介

想象一下,如果你能克隆自己,同时出现在多个地方,轻松处理所有责任。还记得科幻喜剧电影《多重人格》(1996 年),道格·金尼(迈克尔·基顿 饰)克隆自己来管理工作和个人生活。然而,随着越来越多的道格被创建,每个后续克隆体展现出与前一版本相比的夸张特征和降低的智力。最初旨在减少混乱的克隆体,最终在金尼的生活中造成更多混乱和熵。

在人工智能(AI)的世界中,当大型语言模型(LLM)在由早期版本生成的数据上训练时,会出现类似的现象。就像《多人复制》中的克隆体一样,AI 模型开始失去对原始数据分布的把握,导致混乱和困惑的增加——这在 AI 世界中被称为“模型崩溃”。

模型崩溃现象

就像《多人复制》中 Doug 在创造更多克隆体时面临的混乱一样,当 AI 模型在由早期版本生成的数据上递归训练时,它们面临类似的命运。随着时间的推移,它们变得更加愚蠢和夸张。

什么是模型崩溃?

模型崩溃指的是一个退化过程,随着时间的推移,AI 模型丧失对原始内容(数据)分布的信息。由于 AI 模型是在由其前任生成的数据上训练的,它们开始“遗忘”真实的底层数据分布,导致其生成能力的缩小。

虽然对此的技术解释超出了本博客的范围,但你可能会在一些 AI 图像生成器中注意到这一点——当它们开始生成几乎相同的图像时,可能说明模型已经崩溃。一个更熟悉的例子是 AI 生成的新闻网站、评论和内容农场。这些网站本质上是自动生成事实不准确的文章,并以惊人的速度传播虚假信息。[1]

现在,这其中的一些现象可能与 AI 幻觉有关,但也很可能这些 AI 内容生成器正在从其他 AI 生成的文章中抓取并自动重写。许多这样的内容立即显而易见——通常充满了广告和弹窗,几乎没有有意义的内容。

这就像是《多人复制》中的克隆体每一代变得越来越不智能和夸张。

这是如何发生的?

模型崩溃可能由多种因素引起,比如训练数据的多样性不足、偏见的放大和模型过拟合。当一个 AI 模型在 AI 生成的数据上训练时,它实际上是在学习自己的一种反射。这种反射就像“电话游戏”一样,随着每次迭代变得越来越扭曲。

当我们在 AI 上训练 AI 时,它变得越来越愚蠢。

比如说,看看这张冲浪者的照片。

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

作者照片 — 大卫·E·斯威诺

这是 Midjourney 从照片中创建的四个描述之一:

“在夏威夷檀香山穿着泳衣的冲浪者雕像,风格为浅青铜和粉色,Frank Frazetta,传统的非洲、澳大拉西亚和美洲艺术,对称排列,扭曲的树枝,街头艺术美学,叙事驱动的视觉讲故事 — ar 4:3”

这是我的照片的四个 AI 生成版本:

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

Midjourney 拍摄 — 原始冲浪者照片的第一次迭代

是的,这些确实很粉色,但第一个看起来最接近原始图像,我之前并不知道 Frank Frazetta 是谁,但我要求它描述那张图片,最后选择了第一张。

“一个站在粉色冲浪板上的冲浪者雕像,周围有一些花朵,风格为光线追踪、单色构图、reefwave、低角度拍摄、华丽、多彩的街景,开启 rttx — ar 77:58”

使用上述描述,下面四张图像被生成了。

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

Midjourney 拍摄 — 原始冲浪者照片的第二次迭代

这些确实很有趣,但似乎并没有以任何方式代表原始图像。这仅仅是与原始图像隔了两代……如果我们这样做 100 次、1000 次或 10000 次会怎样?现在,这并不是退化学习的完美示例,而是人工智能熵的一个例子。系统趋向于越来越多的混乱状态。

智慧人士的见解

一篇题为“递归的诅咒:在生成的数据上训练数据使模型遗忘”的研究论文讨论了模型崩溃的技术细节。作者展示了这可能发生在所有模型上,而不仅仅是生成性人工智能模型。

模型变得更蠢(退化学习)

研究中的一个关键见解是“退化学习”的概念。在人工智能模型的背景下,退化学习指的是随着时间的推移,模型失去准确表示原始数据分布的多样性和复杂性的能力。

作者引用了以下示例:

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

研究论文中的模型崩溃示例

正如你所看到的,如果你在基于前几代产生的数据上训练每个模型,它将变得毫无意义。

这发生的原因有几个,包括:

  • 稀有事件的丧失:随着模型在由自身的前一个版本生成的数据上进行训练,它们倾向于关注最常见的模式,并开始忘记稀有或不太可能发生的事件。这类似于模型失去了其“长期记忆”——类似于《多重人格》中的道格。稀有事件通常是数据中的重要信号——无论它们是否代表制造过程中的异常或欺诈交易。理解和维护稀有事件是重要的。例如,在文本分析项目中,常见的做法是去除“垃圾”词——这些可能是代词、定冠词和不定冠词等等。然而,对于欺诈案例来说——代词才是欺诈的信号。欺诈者往往使用第三人称而不是第一人称。

  • 偏见的放大:对人工智能生成的数据进行每次训练都可能放大现有偏见。由于模型的输出基于其训练数据,任何训练数据中的偏见都会随着时间的推移得到强化和夸大——这与多个道格的情况类似。我们已经在传统人工智能领域看到了偏见的放大,这导致了歧视性的招聘、医疗领域的种族偏见或歧视性的推文。我们需要制定控制措施来检测和减轻这些偏见的持续存在。

  • 生成能力的狭窄:随着模型受到自身现实投影的影响变大,生成能力开始变窄。模型开始生成越来越同质化的内容,代表原始数据中多样性和稀有事件的能力降低。当一切开始回归均值和同质状态时,这将导致原创性的丧失(我们已经在食谱网站上看到了这种现象)。对于大规模语言模型而言,变化赋予每个作者或艺术家独特的语调和风格。

  • 功能逼近误差:论文提到,如果函数逼近器表达能力不足,可能会出现功能逼近误差。通过使用更具表达力的模型可以最小化这种误差,但过多的表达力可能会放大噪声并导致过拟合。

退化学习的特点是模型在对人工智能生成内容进行每次训练后,学习和准确表示数据的能力逐渐恶化,形成恶性循环。

这对人工智能模型生成内容的质量和可靠性具有重要影响。

模型崩溃的影响

理解模型崩溃现象很有趣,但同样重要的是认识到其影响。模型崩溃可能会产生深远的后果,影响人工智能生成内容的质量、可靠性和公平性。如果没有适当考虑,你的组织可能会面临风险。

质量和可靠性

随着人工智能模型进行退化学习,它们生成的内容的质量和可靠性可能会显著下降。这是因为模型与原始数据分布的联系丧失,并且更受自身现实投影的影响。例如,用于生成新闻文章的人工智能模型可能开始生成不准确、过于同质化或完全虚假的内容!

公平性和代表性

模型崩溃可能对公平性和代表性产生严重影响。随着模型遗忘稀有事件和生成能力变窄,与边缘化群体或较少见主题相关的内容可能会被低估或误呈现。这可能会加剧偏见和刻板印象,助长某些声音和观点的排斥。

伦理问题

关于模型崩溃的伦理问题是显著的。当 AI 生成的内容用于决策、教育或信息传播时,内容的完整性至关重要。模型崩溃可能导致传播有偏见、不准确或同质化的内容,这可能带来伦理问题,特别是当这些内容影响到人们的生活、观点或机会时。

经济和社会影响

在经济和社会层面,模型崩溃可能会影响对 AI 技术的信任和采纳。如果企业和消费者不能依赖 AI 模型生成的内容,他们可能会更不愿意采纳这些技术。这可能对严重依赖 AI 的行业产生经济影响,并对公众对 AI 的认知和信任产生社会影响。

减轻模型崩溃的策略

模型崩溃具有深远的影响,必须制定策略来减轻其影响。以下是可以用来防止或减轻 AI 系统模型崩溃的一些策略:

保留原始人工生成的数据集

研究论文中的一个关键见解是保留原始人工生成数据集的重要性。定期在这些数据上重新训练模型可以帮助确保模型保持在现实基础上,并继续代表人类经验的多样性和复杂性。最近的一篇来自微软研究院的研究论文建议,在可靠的数据如教科书上训练大型语言模型可能有助于提高其准确性。

引入新的人工生成数据集

除了保留原始数据集之外,将新的、干净的人工生成数据集引入训练过程是有益的。这可以帮助防止模型生成能力的缩小,并确保它继续学习和适应新信息。随着公司开始在其专有企业数据上微调大型语言模型,这可能有助于防止模型性能下降。

监控和定期评估

定期监控和评估 AI 模型的表现至关重要。通过设定评估指标和基准,可以检测到模型崩溃的早期迹象。这允许及时采取干预措施,如调整训练数据或调整模型参数。这与我们传统的模型监控指导没有区别,企业需要实施 MLOps 框架,以持续监控模型和数据的漂移。不仅需要检测这些问题,还需要额外的机制来确保模型不会产生虚假信息,并生成与公司目标一致的结果,这将是许多组织的新能力。

多样化训练数据

确保训练数据的多样性和代表不同观点与经历的特征有助于防止偏见并确保 AI 生成内容的公平性。这包括确保少数群体和稀有事件的代表性。不言而喻,组织需要了解用于训练模型的源数据,以确保其与现实对齐并代表社会的最佳面貌。盲目使用充满负面、偏见和虚假信息的互联网数据是灾难的根源。

社区协调与合作

模型崩溃不仅是技术挑战,也是一项伦理和社会挑战。涉及 AI 公司、内容生产者、研究人员和政策制定者的社区范围内的协调至关重要。共享信息、最佳实践和共同制定标准与指南对于解决模型崩溃问题具有重要作用。尽管指南和框架很重要,但类似于联合国 AI 伦理框架,在地缘政治边界上实施和获得支持将面临挑战。

摘要

Multiplicity中,Doug 试图通过克隆自己来管理责任,结果导致了意想不到的混乱和熵。这一情景在 AI 世界中找到了平行点,即在 AI 生成的数据上训练模型可能导致一种称为模型崩溃的熵。

就像电影中的克隆随着每一代变得更愚蠢和混乱一样,AI 模型在对自身输出进行训练时也可能失去准确代表原始数据多样性和复杂性的能力。

模型崩溃类似于Multiplicity中的熵,对 AI 生成内容的质量、可靠性和公平性具有深远的影响。这提醒我们,无论是电影中的克隆还是 AI 对自身数据的训练,未经控制的复制都可能导致信息丧失和混乱增加。

然而,与Multiplicity中的不受控制的克隆不同,我们拥有管理和缓解 AI 系统模型崩溃的工具和知识。通过保留原始人类生成的数据集、多样化训练数据、定期监控 AI 模型以及促进社区协调,我们可以对抗熵,并确保 AI 保持可靠和有益的工具。

随着 AI 的不断发展,牢记Multiplicity中的教训、熵以及模型崩溃的研究至关重要。通过集体努力,我们可以负责任地使用 AI,确保其保持现实基础,并服务于所有社区的多样化需求,而不陷入混乱。

本质上,通过积极管理 AI 数据的‘克隆过程’并注意其可能产生的熵,我们可以将 AI 发展引导到创新且负责任的方向上。

如果你想了解更多关于人工智能的内容,请查看我的书籍 《人工智能:让 AI 为您的业务服务的高管指南》在亚马逊上

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

《人工智能高管指南》在亚马逊上

[1] Thompson, Stuart A. 2023. “A.I.-生成内容在新闻网站、内容农场和产品评论中被发现。”《纽约时报》,2023 年 5 月 19 日,第技术版。www.nytimes.com/2023/05/19/technology/ai-generated-content-discovered-on-news-sites-content-farms-and-product-reviews.html

AI 前沿系列:人力资源

原文:towardsdatascience.com/ai-frontiers-series-human-resources-fd245fc0c1c?source=collection_archive---------16-----------------------#2023-06-20

人工智能难题的介绍

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

·

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

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

图像由Midjourney生成

回顾我近三年前的第一次“跨行业头脑风暴会议”,我对机器学习概念从曾经被认为雄心勃勃到如今对人力资源部门变得可实现感到惊讶。人工智能的快速发展正在转变各个行业,从制造业到医疗保健。然而,人力资源领域在接受这场数字革命方面却较为迟缓。

尽管人力资源中的定性和定量任务的混合可能表明它不太可能成为人工智能应用的候选者,但这一假设忽视了人工智能为人力资源领域带来的潜力。本文旨在探讨这种尚未开发的潜力。我们将关注人力资源行业的关键挑战、重要绩效指标以及人工智能技术如何帮助克服这些挑战。这与传统人员分析解决方案的局限性形成了鲜明的对比。

前一篇文章讨论的供应链数据问题不同,这里的主要关注点不仅仅是高质量数据的可用性。数据的处理和遵守数据规范同样至关重要。在接下来的章节中,我们将讨论如何解决这些因素,以解锁人工智能在人力资源中的变革力量。

然而,在深入这些用例之前,需要注意的是,你的组织应首先评估其实施这些策略的准备情况,正如 Chowdhury, S., et al.,(2023)所推荐的。此外,正如我不断强调的,检查一些更广泛的要求肯定会大有帮助(你可以参考这篇文章)。

人力资源管理中的挑战

产生有价值的想法的一个简单方法是首先了解与特定行业、领域、公司等相关的关键绩效指标(KPI)。一旦我们对所有这些问题都有了答案,就可以开始考虑其他“可有可无”的解决方案。在这方面,所有人力资源部门都面临相同的一系列挑战,包括人才招聘和留存员工参与绩效管理多样性和包容性以及合规性Pereira, V., et al., 2023)。

一些典型的人力资源关键绩效指标(KPI)包括:

  • 招聘时间(time-to-hire)

  • 成本每次招聘(cost-per-hire)

  • 员工流失率(employee turnover rate)

  • 员工参与评分(employee engagement score)

  • 多样性比例(diversity ratios)

需要强调的是,这些指标所测量的过程需要定量分析与人类理解的微妙平衡。因此,为了充分理解人工智能在人力资源中的潜力,我们必须首先对每个 KPI 测量的过程的现状提出一些问题。请注意,这是你在处理任何机器学习项目时应该遵循的标准程序。在这方面,我们将通过使用一些触发问题来逐步探讨每个过程的步骤。

1. 人才招聘挑战

在招聘新人才时,人力资源专业人士需要发布职位描述,筛选大量简历,进行初步筛选,安排面试,最后根据硬数据和软技能的综合评估做出招聘决策。但他们是否拥有有效且透明地执行这些任务的工具?我们如何确保某些过程没有偏见?让我们来分析整个过程。

1.1. 职位创建与发布

你们公司是否仍然在没有人工智能辅助的情况下编写职位描述?在确定招聘需求后,任何招聘流程的初步步骤包括在自己拥有的平台或第三方平台(如 LinkedIn)上创建并发布职位描述。编写这些描述可能相当费力;然而,这一步骤对于吸引顶尖人才并在当今迅速发展的就业市场中展现专业形象至关重要。此外,鉴于我们将在本文中讨论的解决方案,职位描述的模糊定义可能会在某些用例中限制我们获得的结果质量(我会在稍后详细说明)。

表述不清的职位描述可能会使合格的候选人却步,吸引不适合的人选,并使招聘过程变得复杂。此外,它们还可能损害公司的公共形象,暗示缺乏专业性。模糊的描述可能会因工作期望不明确和潜在的歧视性语言而导致法律问题,侵犯平等就业机会法。相反,精心撰写的职位描述能够吸引顶级人才,加快招聘速度,支持多样性和包容性,并提升公司的声誉。因此,组织必须投入足够的资源来创建全面、准确和包容的职位描述,从而确保有效的招聘、法律合规和增强的公共形象。

一个简单的解决方案是利用人工智能文本生成的强大功能。通过利用前沿的工具——大型语言模型(LLMs),你可以优化职位描述模板,并取得令人印象深刻的结果。

举个例子,考虑一个针对专门从事人力资源工作的高级数据科学家职位,要求精通 AWS。利用人工智能,提示可以在不到 10 秒的时间内编写完成,这不仅高效而且非常有效。

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

作者提供的图片

请注意,我们可以提供更准确的提示,以反映组织的价值观以及在招聘过程其余部分中应评估的主题。

在发布了全面且引人入胜的职位描述后,看到大量的候选人群体以及随之而来的申请激增是很自然的。这一进展无缝地引导我们进入招聘过程的下一阶段:详尽而繁琐的简历分析任务。

1.2. 简历分析

你还在手动筛选每一份进入邮箱的简历吗?你的 HR 人才招聘专员是否在分析数百甚至上千份申请时投入了宝贵的时间,即便已经找到合适的候选人?你是否曾经考虑过你的招聘人员在决策时权衡的具体变量,或者他们如何利用数据库中留下的简历来匹配未来的职位招聘?

如果这些问题曾经困扰过你,那么很明显你已经认识到在数据驱动的时代,手动审阅简历和分析大量申请的传统方法已经不再奏效。

自动化简历解析解决方案确实是一个重大进步,使我们能够相对轻松地从简历中提取相关信息。但这还不是终点。在解析阶段之后,我们面临着一堆看起来令人不知所措和难以处理的数据。仅仅将这些数据分类到表格中并进行基本分析已不再够用。

此外,虽然我们可能假设领先的 HR 平台已经掌握了简历解析的艺术,但现实往往令人失望。当简历偏离常规格式时,它们的表现可能较差,导致关键候选人信息的丢失。

克服这些障碍的一个解决方案是语义匹配。在机器学习中,这一概念指的是理解和比较不同文本或数据的意义或语义的过程。它涉及评估单词、短语、句子甚至整个文档之间的相似性或相关性。目标是确定不同文本在其基本意义上的对齐程度,而不仅仅是依赖表面模式或确切的单词匹配。语义匹配在各种自然语言处理(NLP)任务中扮演着至关重要的角色,如信息检索、问答、情感分析和文本分类。它有助于弥合人类对语言的理解与机器学习模型的计算能力之间的差距。

我们如何在这种情况下使用它?通过总结职位简介、基于解析的数据进行语义匹配职位,可以生成一个评分。这个评分反映了个人简介的每个属性与职位要求的对齐程度。通过语义匹配,你可以有效地根据候选人对所申请职位(以及其他职位)的适配性进行优先排序和评估(全部自动化)。请注意,如果职位定义不明确,结果的质量可能会有所欠缺。

如果语义匹配听起来不够令人信服,仍然有其他替代方案可以在很大程度上解决这个问题。

  • 自动化预筛选:实施机制以筛选出不符合特定标准或最低资格的候选人。这可以通过基于规则的系统或在历史招聘数据上训练的机器学习模型实现。当然,要做到这一点,你应该有一个解析器解决方案。

  • 基于 ML 的排名:开发一个根据各种属性(如技能、经验和资格)自动打分和排名候选人的排名系统。这种方法使数据驱动的决策成为可能,并消除了评估过程中的偏见。

请注意,投资于这些变更的实施可能会比你预期的更具影响力。这些技术可以在多个方面惠及你的 HR 操作:

  • 可扩展性和效率:随着业务的扩展和申请量的增加,手动处理工作负荷变得越来越具挑战性。提到的技术可以通过高效处理和评估大量简历来提供可扩展性,确保对所有申请进行一致和全面的分析。此外,通过自动化简历分析的初始阶段,公司可以显著减少审查不合格候选人所花费的时间和资源。这使 HR 团队可以将精力集中在更具战略性的任务上,如面试和评估最有前途的候选人。

  • 减少偏见:实施描述的解决方案具有减少候选人评估过程中的偏见的巨大潜力。通过关注职位要求和候选人特征之间的语义对齐,评估变得更加客观,不易受到可能影响人工简历筛选的无意识偏见的影响。

  • 持续学习:基于机器学习的方法可以不断学习和改进。通过利用历史数据和招聘人员的反馈,这些系统可以适应组织的特定需求,优化匹配算法,变得更加准确和有效地识别最合适的候选人。因此,现在打下基础将来肯定会带来十倍的好处。

分析完简历后,让我们进入候选人面试的关键阶段。

1.3. 候选人面试 2.0

在面试过程中,招聘人员通常需要帮助来简化流程并确保与候选人之间的有效沟通。为了解决这一需求,我们的团队正在开发一个创新的应用程序,该应用程序采用语音转文本模型和先进的算法。这个应用程序旨在为招聘人员在面试过程中提供实时支持。

通过利用这个应用程序,招聘人员可以增强面试的结构,确保关键问题得到解决。该应用程序利用各种元素,包括职位描述、标准面试问题列表、候选人简历以及对话的实时记录。

通过使用大型语言模型(LLMs),该应用程序分析面试内容并生成相关问题和反馈。招聘人员可以自定义接收这些帮助的频率,以满足他们的偏好和需求。

提供这个应用程序的目的是优化面试过程,为招聘人员和候选人节省时间,同时促进高效且富有洞察力的对话。

1.4. 全流程自动化?

你现在是否计划完全自动化招聘过程?请注意,我从未建议使用 AI 聊天机器人或其他方法来自动化整个招聘过程。为什么?嗯,我不认为我们已经达到那个阶段,我们可以通过保留人为因素获得更多的好处。虽然自动化和先进技术可以大大增强人才获取过程,但认识到人类判断和专业知识的价值也很重要。采用人机协作的方法,其中自动化技术的结果由人工招聘人员审查和验证,可以确保一个平衡且准确的评估,结合了人类智慧和机器学习算法的优点。

作为一个有趣的结尾,我留给你一个值得深思的问题:如果我们通过 AI 聊天机器人等工具来自动化过程,候选人也可以利用 AI 学习如何在一种强化学习过程中说服这些聊天机器人……

2. 人才留任挑战

一旦你成功雇佣了一个候选人,接下来就是拼图中最重要的部分,即留住人才,以避免浪费在招聘过程中付出的所有努力,并避免员工离职对组织造成的损害。关于这个问题,你可以做几件事。

2.1. 员工离职预测

你的组织是否在预测每个员工在下一个季度/学期/年度离开公司的概率?成功的员工留任往往依赖于在问题出现之前采取的主动措施。你的组织有多少次在员工已经决定离职时才提出反报价?可能太多了,难以计算。因此,解决这个挑战至关重要的是,在员工到达离职点之前检测出高风险的员工。

在这种情况下,可以开发玻璃盒子机器学习模型来预测员工在接下来的n个月内离职的可能性,并识别导致这种概率的因素。与黑箱模型不同,玻璃盒子模型提供了可解释性,使我们可以清晰地了解预测背后的原因。这一点至关重要,因为我们处理的是敏感的员工数据,而模型推断推荐的行动可能会对员工的职业轨迹产生重大影响。因此,完全透明和理解模型的工作原理是至关重要的。

有鉴于此,我和我的同事们开发了一个模型,以解决主流“解决方案”中常见的不足之处。要详细了解如何按照正确框架处理这个问题,我推荐参考这篇 文章

2.2. 个性化员工发展

你的组织是否提供定制的职业发展路径?员工通常在竞争力的薪酬和职业成长机会之间寻求平衡。虽然这两个方面都很重要,但例如年轻专业人士可能会优先考虑有机会发展技能并在所选领域中晋升。认识到这一点,组织可以利用个性化学习和发展计划,通过满足这种隐性期望来增强员工的留任率。

AI 驱动的推荐系统在这方面可以发挥重要作用。这些系统利用员工绩效数据,分析个人的优势、劣势和职业目标。它们还考虑了“相似”员工的信息,这些员工在类似角色或职业路径中取得了成功。通过整合这些见解,组织可以为培训和“技能提升”机会制定量身定制的推荐,以符合每位员工的具体需求和期望。

此外,在主流方面,AI 驱动的推荐系统可以通过建议与每位员工的发展计划相一致的相关学习材料、课程、指导机会或网络活动,提供持续的指导。通过适应个人偏好和不断变化的职业路径,这些系统确保员工在与组织的旅程中始终获得相关且有趣的学习体验。

接下来,紧密关联的留任问题就是参与度问题。

3. 员工参与度挑战

员工参与度,即员工对工作环境的情感和实际投入的程度,对于组织的成功至关重要。它有助于提高绩效、工作满意度和留任率。目前,参与度通常通过定期调查与工作满意度一起衡量,但这种方法存在两方面的不足:

  • 频率:这些调查的不频繁性导致了参与度的过时快照。

  • 复杂性:这些评估通常需要多维度分析,这对人类来说是很难准确执行的。

为了应对这些问题,我们提出了一种将组织视为相互作用节点网络的方式,提供了一个全面的视角。

3.1. 组织网络分析

组织网络分析(ONA)使用图论中的技术来系统地探索和理解组织的网络,包括管理结构、人际关系和信息流(Barabási, A. L., 2013)。

要实施组织网络分析(ONA),网络可以通过提名调查或使用工作空间平台的数字足迹(注意数据保护问题)来构建。在建立网络后,可以使用传统图算法来确定每个成员的中心性及其在组织中的影响力。这些指标与员工特征和过去的调查见解相结合,然后可以用来开发一个预测员工参与度的模型。

通过利用 ONA,组织可以获得对内部动态的宝贵见解,识别关键影响者,评估每个个体的角色,并预测员工的参与水平。然而,必须确保在整个过程中数据隐私和保护。数据收集和分析期间应严格遵守数据保护协议和伦理考虑。

请注意 ONA 不是 AI……而是收集相关数据的一种初步步骤,这将使我们能够创建或补充我们当前的模型开发。例如,我们可以提取有关组织内部互动或连接水平的有价值数据,并将这些信息作为流失模型或参与模型的特征,用于预测组织中任何给定时刻的参与水平。对于那些有兴趣深入了解这个话题的人,我建议你参考这篇文章

3.2. AI 参与助手

你是否考虑过从书面满意度表单中提取定量和定性见解?AI 在这里可以发挥关键作用。我们建议将其用于收集关于公司改进机会的匿名反馈,而不是创建监控员工的 AI 助手——这有可能贬低人类因素。这些反馈可以被分析和结构化,供人力资源部门提取可操作的见解,类似于之前提议的面试助手的功能。

这种方法对于更具体的任务也可能很有价值。例如,在寻求关于研讨会的反馈时,不妨鼓励参与者提供详细的书面反馈,而不是使用传统的 1 到 5 评分量表。这些定性数据可以使用大型语言模型(LLM)进行分析,以揭示更深层次、更有意义的见解。

尽管书面反馈有时可能缺乏质量和具体性,但它提供的丰富背景使其成为一个值得探索的途径。

接下来,我们探讨参与度、保留率和绩效管理的相互挑战。

4. 绩效评估挑战

传统的绩效评估流程通常面临质量不均、信息不全和时间消耗等问题。

质量不均:源于经理在提供反馈时写作技巧和沟通能力的差异。构造不良或不清晰的反馈可能无法积极影响员工,未能有效地解决改进领域或认可成就。

信息不全源于在评估期间遗漏的成就或改进领域。这种反馈的缺失可能导致错失引导员工改善表现或认可其成功的机会。

制作详细的绩效评审过程耗时,这可能会将经理们宝贵的时间从更具生产力的活动(如员工培训或指导)中转移出来。

这些挑战需要一种高效、精简的绩效评估方法,以优化资源利用,确保公平,并提高反馈的质量和完整性。

4.1. 评估助手

对于那些在进行多个员工评审时难以记住关键细节的人,解决方案可能在于利用总结模型。事实上,我们已经为此问题构建了一个解决方案

想象一下我们有一个名为“TheBestCompany”的组织。在 TheBestCompany,他们利用 LLMs 模型处理多个数据源并生成员工评审。各种数据源,如反馈、参与的项目和客户反馈,会被汇总并输入 LLM,LLM 然后区分出成就和改进领域,并将这些反馈整合到一个绩效评估模板中,当前的人工评审员可以对其进行修改。

这个自动化评审生成过程节省了时间和资源,最小化了偏见和错误,生成了详细且准确的评审。LLMs 的灵活性允许根据组织需求进行定制,提升绩效评估的准确性、效率和公平性。这一解决方案使组织能够专注于其他重要任务和目标。

5. 解决多样性和包容性挑战

多样性和包容性在许多组织中是持久的挑战,这些挑战不仅存在于招聘过程中,还包括晋升和绩效评估。这些领域中的主观性可能无意中掩盖一个员工的优点和另一个员工的不足(Rodgers, W., et al., 2023)。

有两个策略可以帮助缓解这个问题。第一个策略涉及开发忽略敏感变量(如年龄、性别、种族和宗教)的算法。这些算法侧重于资格、技能和表现,鼓励客观评估,从而减少偏见并确保公平的决策。

第二种策略利用考虑这些敏感变量的模型来理解它们对某些结果的影响。通过分析历史数据,这些模型可以揭示与特定属性相关的潜在偏见,帮助组织主动识别和纠正系统性问题,促进平等机会和包容性。

然而,必须记住,算法和模型应当补充人类的判断和专业知识,而不是替代它们。此外,这些工具应定期进行审计,以确保它们不会无意中延续偏见。

6. 数据质量挑战

数据质量是人力资源中的一个常见障碍,手动输入可能导致潜在错误、不一致的格式或人力资源平台(如 Workday 或 SAP HR)中的不完整记录。这些问题可能会影响机器学习算法的准确性和可靠性,正如“垃圾进,垃圾出”这一短语所概括的。因此,实施细致的 ETL(提取、转换、加载)过程对数据完整性至关重要,同时需要考虑伦理问题和即将到来的数据保护挑战。事实上,几乎 90% 的时间都应该花在 ETL 过程上。

7. 数据保护挑战

人力资源数据通常包含敏感的个人信息,需要强有力的数据保护措施。为了保护这些数据,组织必须采用强大的数据治理实践,包括严格的安全措施、访问控制和数据加密技术(Hamilton, R. H., & Davison, H. K., 2022)。

建立明确的数据处理、存储和共享政策至关重要,只允许授权人员访问。通过优先考虑数据保护和遵守法律法规,组织可以在保护人力资源数据的隐私和机密性的同时,与员工建立信任。

与法律和合规团队密切合作也是必要的,以满足所有适用的法律法规,特别是如欧盟的 GDPR 这样的特定数据保护法律。在所有这些过程中,寻求法律顾问和数据保护专业人士的建议以确保遵守当地法律法规是非常重要的。

结束语

总的来说,我们已经看到,人工智能与人力资源的交集开辟了一个等待探索的可能性领域。在这种情况下,数据科学家和商业专业人士面临的挑战是将这些可能性转化为切实可行的解决方案,从而简化人力资源流程,同时保留宝贵的人文元素。这既涉及利用人工智能的力量,又涉及理解人力资源管理的细微差别。毫无疑问,这种平衡将推动未来,创造一个更有效、更具包容性和同理心的人力资源行业。

敬请关注本系列更多深入的文章,随着我们共同努力通过创新解决方案的民主化来改善世界。

参考文献

[1] Chowdhury, S., Dey, P., Joel-Edgar, S., Bhattacharya, S., Rodriguez-Espindola, O., Abadie, A., & Truong, L. (2023). 通过人工智能能力框架解锁人工智能在人力资源管理中的价值。人力资源管理评论, 33(1), 100899。

[2] Pereira, V., Hadjielias, E., Christofi, M., & Vrontis, D. (2023). 关于人工智能对工作场所结果影响的系统文献综述:一个多过程视角。人力资源管理评论, 33(1), 100857。

[3] Barabási, A. L. 2013. 网络科学。皇家学会 A 卷:数学、物理与工程科学的哲学学报, 371(1987), 20120375。

[4] Rodgers, W., Murray, J. M., Stefanidis, A., Degbey, W. Y., & Tarba, S. Y. (2023). 一种人工智能算法方法在人力资源管理过程中的伦理决策。人力资源管理评论, 33(1), 100925。

[5] Hamilton, R. H., & Davison, H. K. (2022). 人力资源在机器学习中的法律与伦理挑战。员工责任与权利期刊, 34(1), 19–39。

AI 前沿系列:供应链

原文:towardsdatascience.com/ai-frontiers-series-supply-chain-f5fa008570ad?source=collection_archive---------6-----------------------#2023-06-06

对这个巨大行业中当前应用案例和可能性的介绍

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

·

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

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

图片由作者在 Midjourney 生成

最近,我一直在思考如何在我的写作中同时为技术和业务导向的专业人士提供同等的价值。幸运的是,作为数据科学顾问的角色自然提供了丰富的有趣话题。除了编码之外,我们还不断审查文献和文章,这些文献和文章详细描述了各个领域的数据驱动解决方案。这种持续的探索使我们能够评估这些解决方案的可行性、效率和有效性,从而使我们能够使用现有策略或制定定制的算法。

本文标志着一个系列的开始,旨在阐明三个关键领域——供应链、人力资源和零售中的主要挑战、标准解决方案以及新兴的机会和风险。它面向这些行业的专业人士,寻找数据驱动的解决方案,以及希望拓宽视野的数据科学家。正如标题所示,我们的第一次探索是复杂的供应链管理世界。

从管理复杂的物流网络到准确预测需求和优化库存,供应链生态系统提出了许多严峻的挑战。最难解决的挑战之一是在供应商、制造商、分销商、零售商和客户等多样化利益相关者的复杂网络中实现无缝协调和优化操作。此外,原材料供应波动、市场需求、地缘政治紧张局势和环境灾难等不断的干扰因素带来了额外的困难。

我们可以怎么做呢?好在近期 AI 的进展为我们提供了更好回答这些问题的令人兴奋的机会。在本文中,我们将利用我们的经验和引用的研究,简要描述挑战和当前/潜在的解决方案,帮助你将运营提升到新的水平。

供应链管理中的挑战

所有供应链管理问题的根源在于寻找供需平衡。有人以某一价格需求(提供)一种商品,而为了满足这一需求(提供),价格或产品的相关性应足够吸引人。这个在任何经济学入门课程中学到的过于总结化的动态,发展成了最复杂的问题之一。由于问题的广泛性容易使人迷失,我们将从一个接近开端的地方开始。

1. 库存管理问题

高效的库存管理仍然是供应链运营的一个重要部分。管理不善可能会占用大量资本,增加持有成本,并存在过时的风险。相反,不足的库存可能导致销售机会的丧失、客户信任的流失,甚至可能危及生命(在医疗供应短缺的情况下)。因此,找到最佳平衡点成为一个重要的挑战。

为了应对这一挑战,我们首先必须预测需求,然后采取相应的行动。

1.1. 需求预测

精确的需求预测对于确保在正确的地点和时间提供正确的产品至关重要。然而,需求受到多种因素的影响,包括季节性趋势、市场变化和不可预见的事件,使得准确预测变得复杂。幸运的是,机器学习算法可以基于历史销售数据、市场趋势和其他相关因素进行训练,以预测未来需求。例如,亚马逊使用复杂的需求预测模型来优化其库存。他们利用从销售中收集的大量数据,包括历史销售数据、特殊事件、假期甚至天气预报。例如,他们使用机器学习模型来预测在黑色星期五等事件期间不同产品的需求,使他们能够增加高需求商品的库存,避免缺货或过量库存。此外,亚马逊还使用机器学习来优化其仓库,根据需求定位产品,以减少为订单挑选商品所花费的时间。好消息是?你不需要像亚马逊一样大才能实现这一点。任何拥有交易数据库并愿意投资于云服务的人都可以做到这一点。

那么我们应该选择什么模型呢?让我们看看行业如何解决预测问题。

预测解决方案

在这里,大多数企业都使用以下之一:

  • 简单统计:任何形式的 均值或中位数预测。可以作为比较机器学习模型性能的基准,但这些并不是智能预测,因为我们假设选择的时间窗口来计算均值是未来值均值的良好估计。这可能对低方差和静态序列有效,但当我们遇到季节性问题和特殊事件时,我们最终可能会搞砸。

  • 经典时间序列模型自回归模型(ARIMA、SARIMA、SARIMAX、VAR* 等)或 指数平滑(Holt-Winters),当序列稳定时,即方差较低且趋势明确时,这些模型可能会产生良好的结果。当然,这些比使用简单统计更好,但它们没有充分利用每个时间序列的特征以及从类似序列(例如,具有类似销售和特征的产品)中提取的额外信息。此外,如果你有成千上万的由商店-产品组合组成的序列,这些模型的拟合过程将变得非常艰难。

  • 集成/提升算法:如随机森林CatBoostXGBoostLightGBM等模型。在这方面,重要的是要指出这些模型并不是专门为处理时间序列数据而设计的,特别是在多步或多时间范围预测的情况下,其中每个预测应该考虑先前的预测。简而言之,时间序列数据通常包含时间依赖关系,而这些算法并未显式建模。使用这些方法进行多步预测将涉及一步一步地预测,并将每个预测作为下一个预测的输入(即递归预测)。然而,这种方法可能会在预测传播时积累错误……因此,即使考虑到这一点,该过程仍然在概念上存在缺陷且效果不佳。此外,与经典时间序列模型一样,当尝试在由商店-产品组合构成的数千个序列上进行训练时,我们会面临真正的问题,因为这些模型缺乏在如此广泛的类别中学习具体情况的能力。

正如你所猜测的那样,我们不认为这些方法能在我们拥有数百万个观察值、大量序列和高度波动的复杂场景中有效。这正是深度学习模型可以提供显著优势的地方,前提是你有足够的优质数据和计算能力。

在这方面,我们可以实现旨在处理数据序列的神经网络,使其更适合于多时间范围预测等任务,其中未来值的预测依赖于过去和现在的输入。最著名的有:

  • 递归神经网络 (RNNs):设计用于识别数据序列中的模式,如文本、基因组、手写文字或用于预测的时间序列数据。它们被称为“递归”的,因为它们对序列中的每个元素执行相同的操作,输出依赖于先前的计算。这使得它们能够随着时间的推移保持“记忆”。然而,它们可能在保持这种“记忆”方面遇到困难,特别是在长序列中。

  • 长短期记忆网络 (LSTM):一种特殊的 RNN,能够学习长期依赖关系。LSTM 被设计用来解决传统 RNN 中的“梯度消失”问题,这使得网络很难在长序列中保持其“记忆”。LSTM 的关键在于细胞状态,这是贯穿图表顶部的水平线(如果你曾经看到过 LSTM 的示意图)。细胞状态可以在处理链中以最小的变化传递信息,这使得 LSTM 能够沿序列链传递“记忆”。这使得它们在任务中尤为有效,这些任务中未来值的预测依赖于过去和现在的输入。

简而言之,RNN 和 LSTM 适合时间序列预测,因为它们能够处理序列数据并维持“记忆”。然而,LSTM 具有独特的架构,能够更好地处理数据中的长期依赖性,使其成为复杂预测任务的首选。

在这方面,我最近通过使用**Temporal Fusion Transformer (TFT)**模型取得了成功,该模型能够仅通过使用描述每个时间序列的信息(销售、价格、产品类别/子类别、月份、工作日、周末、折扣百分比、store_id、店铺位置、product_id、时间索引、特殊日期、相对时间索引和滚动平均值)来预测多个产品(+400)在不同店铺(+50)上的每日需求。如果有足够的兴趣,我可能会写一篇关于完整实现的文章,直到那时,这里是论文。无论如何,我相信目前这是最强大的多视角预测工具。

下面是一些主要优点,这些优点清楚地表明了其他方法的不足之处。

  1. 处理多个时间序列: TFT 可以处理多个时间序列数据,这在需要预测多个产品在不同店铺的需求时是至关重要的。每个产品和店铺可能具有其独特的特征和时间序列模式,如季节性、趋势和其他因素。TFT 能够捕捉每个独立时间序列的这些模式,从而实现更准确和个性化的预测。请注意,这也是提升算法无法正确处理的问题之一。

  2. 静态和动态协变量的灵活整合: TFT 可以在预测模型中整合不同类型的协变量。例如,关于每个店铺的信息(如位置、规模和客户人口统计)以及每个产品的信息(如类别、子类别、价格和促销活动)可以作为静态协变量输入到模型中。同样,动态协变量如特殊事件、天气或经济条件变化也可以被纳入。

  3. 非线性和复杂的时间依赖性: TFT 特别擅长捕捉数据中的复杂时间依赖性和非线性关系。它使用注意力机制来识别和权衡重要的历史信息,使模型能够学习哪些过去的信息对预测未来值最为相关。请注意,这解决了预测中最常见的问题之一,即选择哪个时间窗口对预测下一个值序列是相关的。

  4. 概率预测:TFT 的一个关键优势是它可以提供概率预测。这在需求预测中尤为重要,因为了解不确定性可以指导决策。例如,了解需求预期范围(具有一定概率)在确定库存政策(如安全库存水平)和避免库存短缺或过剩时非常有用。这是通过使用QuantileLoss函数而不是常用的性能指标(如 RMSE、MAE、MAPE、SMAPE 等)来实现的。

  5. 可解释性:尽管是一个“黑箱”模型,TFT 具有可解释性的机制。模型中的注意力机制可以提供有关历史输入的重要性以及不同协变量如何影响预测的见解。这在商业场景中非常重要,其中理解预测背后的原因与预测本身一样重要。在提到的示例中,我们使用这个功能进行模型的手动调试,以检查不一致性或“训练不佳”的模型。例如,我们发现特殊日子需要一些调整,因为特殊日子之前的几天比特殊日子本身更为相关(来自市中心的移动始于前一天)。

  6. 可扩展性:最后,TFT 也被设计为计算高效。它使用变量选择网络来减少数据的维度,使其可以扩展到大量时间序列。这使得它非常适合我们提到的场景,在这种情况下,我们必须预测数百种产品在几十家商店中的需求。

我建议你查看TFT 及其他更先进模型的实现

1.2. 库存优化

因此,一旦我们预测了下一个运营周期的需求,我们必须确定获取所需货物/组件的最佳方式。但是我们从哪里开始呢?我们可以从识别所有需要分析的内容开始,以实现最佳结果。例如,变量列表可能包括:

  • 供应商替代方案和成本:我有多少个供应商,他们每个单位的供应费用是多少?

  • 产品的展示:你可能预测你会销售 120 块糖果,但这些糖果是以 60 块一箱的形式出售的,所以你需要将所有单位转换为可交付的版本。

  • 仓库容量:我的仓库能容纳多少库存?

  • 交货时间:我需要在什么日期和时间收到库存,以避免货物短缺?

  • 交货时间:每个供应商在订单下达后需要多长时间才能交货?

  • 订单时间:供应商接受和交付订单的日期是什么?供应商可能只在特定的星期几交货。

  • 安全库存:每个仓库对产品的最低库存政策是什么?

  • 储存位置:货物/组件需要送到哪里?

  • 装载运输方法:订单将如何交付,并且与该决定相关的特征是什么?

在考虑这些因素之后,是时候建立一个模型了。这是数据科学超越单纯运行代码实现的地方。我们需要结合领域知识、技术技能和创造力,在线性规划混合整数规划(或其他启发式和元启发式方法)的独特框架内工作。

我已经写了一篇文章讨论这个话题,其中呈现了一个实际问题,所以我不会详细阐述。然而,重点在于这些方法可以帮助我们在多个限制条件(例如,仓库容量、卡车数量、工人)和成本函数(运输方法的可变和固定成本、每位司机的成本、每位供应商的成本等)的基础上,最大化/最小化一个结果(效用函数)。这个框架的主要优势和劣势在于你必须定义你想解决的问题:

  • 如果你缺乏创造力、领域知识和技术技能,你可能会无法明确问题。

  • 但是,你的知识越丰富,你就越有可能定义一个高度特定的问题,这使得问题计算上变得不可解决。

无论如何,始终处于后者的情况是更好的,因为你可以随时减少问题的规格。在此基础上,库存优化的概念引导我们进入供应链网络优化的更广泛问题。

2. 供应链网络优化问题

优化供应链网络是一个多方面的挑战,我们首先假设/预测某种需求,然后确定最有效的路线、运输方式和不同货物的储存设施。在运输方面,这些问题可以根据是否涉及单一模式或多模式物流进一步分类。

  • **单模式物流:**涉及使用单一运输方式,如陆路、海运或空运。每种模式都有其独特的挑战——陆路运输可能面临交通拥堵或道路基础设施问题,海运受到天气条件和港口容量的影响,空运则涉及空域限制和燃料成本等因素。每种模式需要特定类型的变量和独特的问题定义。例如,陆路运输中的一个有趣问题是根据设备类型(如厢式货车、冷藏车或平板车)、司机偏好(例如某些州可能需要避免)、取货和交货时间窗口以及工作限制(如司机的强制休息时间)来优化全国范围内的货物运输;

  • **多模式物流:**涉及协调多种运输方式,例如在同一旅程中使用卡车和船只。这增加了额外的复杂性,因为它要求不同运输方式之间无缝协调,并在不同模式之间转运货物。鉴于这些复杂性,我们可以选择分别处理每个问题,或力求提供全局最优解,这将导致一个包含多个假设的大模型,这些假设可能准确性不足。在这种情况下,最佳方法可能是将所有涉及每个阶段的专家或参与者汇集起来,尽可能准确地起草问题,然后去除非必要的元素。

再次强调,线性规划和混合整数规划等算法可以用来找到分析单峰和多模式业务时出现的问题的部分解决方案。然而,考虑到问题的潜在规模和复杂性,像遗传算法这样的启发式和元启发式算法可能更为合适。

根据我的经验(仅限于单模式物流),处理复杂问题的最佳方法,如带有工作时间窗口约束容量车辆路径问题,是使用启发式方法、传统图论算法和精心设计的数据处理程序(智能过滤和向量化操作)的组合。这种方法可以缩小解决方案的搜索空间,使我们能够避开计算不可行或次优结果的组合,并且最重要的是:在合理的时间内获得解决方案。

但有一个重要的警告:这些具体解决方案通常未公开,形成了提供公司竞争优势的战略算法的一部分。因此,主要的要点是,在急于实施如 Google OR-Tools 等软件包中的求解器之前,考虑是否可以通过启发式/元启发式、图算法和智能数据处理来实现足够的结果。这种方法可能为您的供应链网络优化挑战提供更易于管理且同样有效的解决方案。

3. 风险管理问题

供应链容易受到各种风险的影响,从自然灾害到地缘政治动荡和市场波动。识别、评估和减轻这些风险是供应链管理中的重大挑战。

3.1. 潜在解决方案

近期研究表明,供应链风险管理方面还有很多工作要做(Ganesh, A. D., & Kalpana, P. , 2022)。考虑到这一点,我总结了一些正在讨论的发展可能性:

  • 利用 NLP 进行主动风险监控:最近的自然语言处理(NLP)模型,如 GPT 等,可以用来审查新闻文章和社交媒体帖子中的潜在供应链威胁。这些信息可以生成个性化警报并制定相应的缓解策略。结合先进的分析技术,这可以提供即将发生市场动荡的预测性洞察,从而实现主动风险管理。例如,考虑使用 OpenAI GPT API 创建一个监控特定媒体渠道的机器人。它可以从新闻文章和社交媒体帖子中提取相关数据,并使用 GPT 模型确定某个事件是否可能影响您的操作。例如,在 2021 年的Suez Canal blockage事件中,一个配置良好的 NLP 系统将会识别该事件,并警告相关利益相关者开始考虑替代路线或运输方式。

  • 利用 NLP 和预测工具评估绩效:相同的 NLP 工具结合图论、预测和分类模型,可以根据历史表现评估、分类并推荐供应商/运输商/司机。这有助于提高供应链的效率和透明度,使得低效的实体能够被识别并可能被替换。考虑一个评估供应商交货及时性、产品质量和响应能力的模型。这可以帮助确定他们是否是可靠的合作伙伴,或是否需要考虑替代的采购方案。

  • 预测性维护模型: 预测模型使我们能够预测机械和设备问题,从而增强预防性维护措施。这可以减少停机时间,降低成本,延长设备寿命。例如,预测模型可能会分析一队送货卡车的历史数据,以预测某些组件可能出现故障的时间,帮助安排预防性维护,避免意外故障。

  • 地理空间分析与地理风险: 地理空间分析可以阐明和评估供应链中的地理风险,例如仓库位于洪水易发区,从而可以更好地进行应急规划。

  • 利用物联网和区块链进行实时监控和预测: 将物联网和区块链技术数据与预测模型结合,可以提升实时监控和跟踪能力。此外,它还能够实现实时偏差预测,并附带警报和缓解策略。这提高了透明度和可追溯性,减少了与欺诈、伪造和不合规相关的风险。(Kaur, A., 等,2022 年)

3.2. 在研究潜在解决方案时可以做什么

  • 根据我所看到的,我不能不强调组织应该投入更多资源来开发模拟,以了解各种战略决策的潜在影响。最好的是什么?你只需要纯 Python 和领域知识。

考虑一个假设的零售公司“TheRetail”。TheRetail 正在考虑是否通过单一物流运营商集中供应管理,还是保持与多个供应商的直接关系。为了评估这个决定,他们可以运行模拟以评估每个选项的潜在影响。这些模拟至少应考虑成本效益、交付速度、灵活性和对中断的脆弱性等因素。让我们设想一些情境:

a) 模拟一个物流运营商面临重大延误或停运的情况。TheRetail 可以使用现有库存维持运营多久?这将如何影响他们的销售和客户满意度?

b) 考虑供应商关闭或涨价的影响。物流运营商是否能够迅速找到替代品?这与 TheRetail 在当前系统下更换供应商的能力相比如何?

这些只是简单的示例,展示了通过运行数千甚至数百万个情境,任何公司都可以更好地了解与每种策略相关的潜在风险和收益,同时做出更为明智的决策。

直到现在,我们讨论了解决方案,但还没有提到为什么还有这么多工作要做。别担心,我们接下来会讨论这个问题。

4. 数据问题与供应链的未来

到目前为止,我们已经概述了供应链管理中的三大主要挑战——库存管理、供应链网络优化和风险管理。这些问题相互交织,形成了一个复杂的格局。应对这个格局和解决这些挑战的关键在于数据领域。具体而言,我们需要系统化、干净的数据,符合统一的分类法。正如可能有多位愤怒的物流经理所说,“通过 Excel 电子表格管理供应链的时代必须结束……”

4.1. 解读数据难题

因此,数据驱动的方法对于应对这些挑战是不可或缺的。这意味着我们需要考虑各种数据来源,包括但不限于:用于需求预测的历史销售数据;当前的库存水平及其位置;供应商绩效数据;运输成本和交货时间;市场趋势和客户行为数据;地缘政治数据和新闻更新以进行风险评估;设备使用数据。

通过实施一个能够处理大量多样数据类型的强大数据基础设施,可以克服数据获取和整合的挑战。此外,与数据提供商合作或增强内部数据收集过程可以解决数据稀缺的问题。

除了数据获取,我们还必须确保能够以连贯和逻辑的方式将这些数据互相连接。换句话说,我们需要一个清晰的数据库模式,概述不同的实体及其关系。实质上,我们需要实现端到端(E2E)供应链可视化,并将这大量的信息整合到一个一致的数据库中——这是一个巨大的挑战。然而,确实有一些勇敢(或大胆)的人愿意面对这个任务,并催生供应链管理的新纪元:端到端供应链可视化的时代。但这个概念指的是什么呢?

4.2. 未来——端到端供应链可视化

端到端(E2E)供应链可视化是行业中的一种变革性概念。它要求对供应链的所有过程和数据从开始到结束进行全面、透明的查看。实现这种全面的可视化需要应对多个参与者、复杂的过程和大量的数据点。(Dolgui, A., et al., 2022)。

然而,通过在供应链中整合人工智能(AI),我们可以利用先进的分析和机器学习能力。这些 AI 驱动的技术解释和情境化了供应链活动生成的大量数据,提供了宝贵的见解并提升了整个链条的可视化水平。在此过程中,它们为完全透明奠定了基础。

正如您所猜测的,人工智能不仅实现了端到端的透明度,还在这样的环境中蓬勃发展。通过建立透明度并获取所有相关数据,模型的运作更加高效,提供更准确和有价值的输出。这种协同动态最终促进了供应链管理的更加主动的方式。一旦实现了这种完全透明度,我们在前一部分讨论的所有内容将变得更容易实现。

结论

本概述提供了对人工智能和数据科学技术在供应链行业变革潜力的初步了解。通过解决长期存在的挑战,这些技术承诺在供应链中塑造一个提高效率、韧性和响应能力的未来。当我们站在这一激动人心的前沿时,我们邀请您,我们的读者和同行先锋,继续探索并拥抱数据科学与供应链管理的融合。

请继续关注本系列更多富有洞察力的文章,我们将共同努力通过创新解决方案的普及来改善世界。

参考文献

[1] Dolgui, A., & Ivanov, D. (2022). 5G 在数字供应链和运营管理中的应用:通过物联网促进灵活性、端到端连接性和实时可视性。国际生产研究杂志60(2),442–451。

[2] Ganesh, A. D., & Kalpana, P. (2022). 人工智能的未来及其对供应链风险管理的影响——系统评述。计算机与工业工程,108206。

[3] Kaur, A., Singh, G., Kukreja, V., Sharma, S., Singh, S., & Yoon, B. (2022). 物联网与区块链在食品供应链管理中的适应:基于分析的评述,包括发展、益处和潜在应用。传感器22(21),8174。

[4] Lim, B., Arık, S. Ö., Loeff, N., & Pfister, T. (2021). 用于可解释的多时间尺度时间序列预测的时序融合变换器。国际预测杂志37(4),1748–1764。

[5] Sharma, R., Shishodia, A., Gunasekaran, A., Min, H., & Munim, Z. H. (2022). 人工智能在供应链管理中的作用:领域映射。国际生产研究杂志60(24),7527–7550。

AI 生成的合成数据

原文:towardsdatascience.com/ai-generated-synthetic-data-913b73494062

与 AI 交朋友

用猫咪以最佳方式解释:

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

·发表在Towards Data Science ·阅读时间 4 分钟·2023 年 7 月 21 日

为什么AI 生成的合成数据现在这么受欢迎?在这篇文章中,我将用猫咪来解释我最喜欢的方式!

假设我想从头开始训练一个猫咪-非猫咪分类器,但我只有一张照片可用:

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

作者的猫,赫胥黎。

(以下内容都是对人们如何处理表格数据和文本数据的类比,因此不仅限于图像数据。)

理想情况下,我需要一个包含数千张猫咪和非猫咪照片的数据集。如果我有相机和大量的猫咪,我可以拍摄一堆像我已经拥有的照片一样的照片,确保得到我所设计的数据集我设计的

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

我在伊斯坦布尔的一个公园拍的照片。

但如果我没有相机,并且在月球上没有猫怎么办?我可以从a vendor那里获取我需要的图像,不过我得小心,因为继承的数据比原始数据更危险。

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

感谢,Pixabay,成为一个优秀的(免费的)猫咪照片供应商。

但如果没有供应商愿意卖我一些猫咪照片怎么办?(是的,互联网猫咪照片用尽的情况比在月球上生活更像科幻,但请耐心一点。)

好吧,如果我不能收集它们,也不能购买它们,那么我就得自己制作它们。瞧,这是我的创作:

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

你的作者是一位真正的米开朗基罗

不好?是的,绘画从来不是我的强项。另一种制作假数据的方法是复制现有的数据点,不过这对提供教学多样性帮助不大。

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

这种方法不会欺骗任何人。我目前只有一个有效的数据点。

这就像通过重复相同的例子来教一个人类学生,这样他们学到的就是那一个东西。如果我的数据集包含 30,000 张这张赫胥黎照片和 30,000 个灰色方块,我的模型将不知道如何处理火鸡的照片。

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

我也在Pixabay上找到了这只感恩节火鸡。

如果我有更多的照片,并且不想制作完全相同的副本,我会考虑通过将它们融合在一起来制作一个前所未见的新猫……当人们用表格数据做同样的事时,它的效果就像这个美丽的例子一样拗口:

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

对不起,Pixabay,我对你们的猫做了这样的事。

所以,如果我没有相机、供应商、真实世界的数据集,或者自己生成数据的能力,我就没有其他选择了吗?不。

这正是 AI 发挥作用的地方。

我可以通过站在巨人的肩膀上——这些巨大的猫照片收藏者!——并使用生成性 AI 来创建数据集:

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

使用 Midjourney 创建

使用 AI 可以制作出非常逼真的假货,可能会欺骗人的眼睛。不过,也有一些不会:

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

使用 Midjourney 创建

这些猫来自哪里?你基本上是在模拟 AI 模型从其训练数据中学到的“猫性”分布,这是你希望拥有但却负担不起的无数猫照片。这就像所有那些涉及从统计分布中模拟的统计学内容,它具有许多相同的优缺点,加上一个额外的缺点,就是你实际上对你所绘制的猫的分布了解甚少。*

为什么 AI 生成的合成数据如此令人兴奋?它让你可以利用你无法自己获得的数据(即使这些数据是由其他人处理过的)。由于最近 AI 的进步,机器制造的假货对人类来说非常逼真。不幸的是,即使它们对来说看起来很逼真,当用来训练你自己的 AI 系统时,它们可能有一个你无法用肉眼发现的致命缺陷……

要了解这个缺陷是什么,请继续关注即将发布的合成数据的利弊清单!(别忘了点击订阅按钮,以免错过。)

感谢阅读!要来个课程吗?

如果你在这里玩得很开心,并且你正在寻找一个适合初学者和专家的有趣应用 AI 课程,这是一个我为你的娱乐而制作的:

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

课程链接: bit.ly/funaicourse

附言:你是否尝试过在 Medium 上点击掌声按钮多次,看看会发生什么? ❤️

注脚

我的同行们,统计学家会将这视为模拟他人核密度估计的一个亲戚,而完全不了解他们的基础数据或代码,这太粗糙了。

AI 行动:指导新抗生素的发现以对抗多药耐药细菌

原文:towardsdatascience.com/ai-in-action-guiding-the-discovery-of-new-antibiotics-to-target-multidrug-resistant-bacteria-58fec477d424

人工智能在重要问题上的应用

通过我对一篇新论文的通俗描述,了解人工智能在化学应用中的数据科学

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

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

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

Dall-E-2 对人工智能如何帮助对抗细菌的“看法”。继续阅读以了解这一实际工作如何开始在现实中发生。

发现新抗生素以对抗耐药细菌是一项重大需求,因为细菌对现有抗生素的耐药性不断增加,但这是一项极具挑战性且成本高昂的工作。因此,任何加快新抗生素研发速度和效率的新方法都被非常欢迎。

最近发表在《自然化学生物学》上的一项研究展示了机器学习(ML)在加速抗生素发现中的力量。研究人员使用先进的算法筛选了数千种分子,并识别出一种有前景的化合物,称为 abaucin ,它专门针对一种名为鲍曼不动杆菌的病原体,这种病原体现在对医院常用来治疗感染的大量抗生素有耐药性——这被称为“多药耐药病原体”。在抗生素(搜索和)研究中应用机器学习的这一新突破凸显了人工智能在革命化该领域中的潜力,预示着未来更快、更有信心且成本更低的抗生素开发。

该模型发现的生物学和内容

由于鲍曼不动杆菌的多药耐药性,传统的抗生素筛选方法在发现新抗生素方面效果有限。正如我之前提到的,寻找新药是一个紧迫的问题:

[## 新抗生素的开发困难且昂贵,因此科学家们正在尝试这些替代方案

包括一些用反应性物质激活的水,重新利用已经用于其他用途的药物…

medium.com](https://medium.com/advances-in-biological-science/new-antibiotics-are-hard-and-expensive-to-develop-so-scientists-are-trying-these-alternatives-b4af09ff22f8?source=post_page-----58fec477d424--------------------------------) [## 我们可能终于有了新一类抗生素

它攻击细菌的外壁和内膜

medium.com](https://medium.com/advances-in-biological-science/we-may-finally-have-a-new-class-of-antibiotics-3e99ad02f07d?source=post_page-----58fec477d424--------------------------------) [## 当微生物互相对抗时,我们有机会发现新型抗生素 - 这里有一个新的…

来自自然的例子,以及对抗沙门氏菌的新候选药物

medium.com](https://medium.com/advances-in-biological-science/when-microorganisms-fight-each-other-we-have-a-chance-to-discover-novel-antibiotics-heres-a-new-48ea9d94aa77?source=post_page-----58fec477d424--------------------------------)

在过去几年中,机器学习技术开始通过使用消息传递网络、变压器和扩散模型提供新颖且更高效的化学空间探索方法。这些新方法自然会增加发现有效抗菌分子的机会。在我在自然化学生物学上发表的研究中,研究人员筛选了大约 7,500 种分子,以识别那些在实验室测试中抑制鲍曼不动杆菌生长的分子,并建立了一个预测性的机器学习模型,通过该模型他们提出了新的潜在抗生素 abaucin:

[## 深度学习引导的抗生素发现针对鲍曼不动杆菌 - 自然化学生物学…

鲍曼不动杆菌是一种医院内的革兰氏阴性病原体,通常表现出多重耐药性。发现…

www.nature.com](https://www.nature.com/articles/s41589-023-01349-8?source=post_page-----58fec477d424--------------------------------)

Abaucin 不仅展示了作为潜在抗生素的有希望的特性,而且它还对巴尔曼氏菌表现出选择性活性,使其成为一种窄谱抗生素,对其他细菌物种的影响最小。这种特异性对于最小化对身体自然微生物群(通常存在于我们的皮肤、肠道等地方,并对我们的健康至关重要)的干扰是至关重要的。关于其作为抗生素实际使用的前景更为有希望的是,研究报告显示 abaucin 在小鼠伤口模型中有效控制了巴尔曼氏菌感染,表明其治疗潜力。

数据科学和机器学习在发现背后的作用

在研究的核心,一种消息传递神经网络使用了能够(或不能)抑制巴尔曼氏菌生长的分子数据集进行训练。这个数据集本身是在同一工作中测量和报告的。随后,训练好的模型被用来对药物重定位中心进行预测,这是一个全面的、注释过的 FDA 批准化合物资源,旨在进行研究,将已批准的药物重新用于新的治疗。这里的重点是识别对巴尔曼氏菌有活性的结构新分子。这个过程导致了如上所述的 abaucin 的发现。

机器学习模型利用了分子的图表示,通过消息传递步骤迭代地交换关于原子周围化学环境的信息。学习到的特征与使用 RDKit 计算的固定分子特征相结合。用于训练和预测的数据集包含筛选出对巴尔曼氏菌生长抑制的分子,正是在同一工作中。

模型的关键在于如何将表示每个分子结构的图转换为连续的向量表示,通过在一系列消息传递步骤中迭代地交换相邻原子和键之间的局部化学信息。通过累积各种局部化学区域的向量表示,模型获得了整个化合物的全面表示。为了增强学习到的特征,使用 RDKit 计算了固定的分子特征,RDKit 是化学信息学领域中最重要的库之一。最终的向量结合了学习到的和计算的特征,作为输入用于一个前馈神经网络,该网络经过训练用于预测分子的抗菌属性,作为分类器。

用于训练的数据集包括对 7,684 种小分子进行筛选的结果,评估它们对A. baumannii生长的影响。筛选实验结果显示,480 种分子被分类为“活跃”,7,204 种分子被分类为“非活跃”。该数据集用于训练上述描述的网络,作为一个二分类器来预测结构上新分子的活性。此外,包含 6,680 种分子的药物再利用中心也用于通过十个分类器的集成进行进一步预测。

为了对数据进行编码,作者使用了 SMILES 字符串,这些字符串是化学结构的文本表示,然后使用 RDKit 库中的工具来解释这些 SMILES 字符串并推导相关的原子和键。这种编码方式使得神经网络能够有效地处理和学习分子结构。

训练过程涉及使用十个模型的集成对生长抑制数据集上的消息传递神经网络模型进行训练。所使用的超参数包括消息传递步骤的数量(3),神经网络隐藏层大小(300),前馈层的数量(2),以及丢弃概率(0)。模型的性能通过十折交叉验证进行评估,这是一种将数据集分成十个子集,并使用这些子集的不同组合进行训练和测试的技术。训练和预测数据集中的分子之间的化学关系使用 Tanimoto 相似度进行测量,这是一个通常用来测量两个分子相似性的评分——这是一个完全独立的话题。

## 化学相似性 - 维基百科

切换目录 从维基百科,自由百科全书 化学相似性(或分子相似性)指的是…

化学相似性 - 维基百科

机器学习对现代研究的影响以及最终对我们生活的影响

这项研究强调了机器学习在相关的现代科学研究中的价值,尤其是在生物学和抗生素发现方面,这些领域与临床应用紧密相关。通过利用其快速分析大量化学数据集的能力,机器学习使研究人员能够更高效地识别具有针对性抗菌特性的分子。这种方法不仅加速了药物发现过程,还提高了发现对高度耐药细菌如A. baumannii有效化合物的可能性。

本研究中机器学习的成功为抗生素研究的未来开辟了令人兴奋的可能性。随着高级算法和计算模型的不断发展,科学家们可以优化识别结构多样且功能独特的抗菌线索的过程。通过利用人工智能的力量,我们可能离战胜全球抗生素耐药性挑战更进一步。

进一步阅读和相关材料

文章:

[## 深度学习指导的针对鲍曼氏不动杆菌的抗生素发现 - 自然化学…

鲍曼氏不动杆菌是一种常显示多药耐药性的医院获得的革兰氏阴性病原体。发现…

www.nature.com](https://www.nature.com/articles/s41589-023-01349-8?source=post_page-----58fec477d424--------------------------------)

RDKit,是一个广泛用于这类研究的化学信息学库,软件需要解析和操作分子:

[## RDKit

编辑描述

www.rdkit.org](https://www.rdkit.org/?source=post_page-----58fec477d424--------------------------------)

药物重新利用中心是一个开放资源,对于旨在寻找现有已批准分子新用途的研究项目至关重要:

[## 药物重新利用中心

将药物推向市场的过程包括一个漫长且详尽的旅程,涵盖基础研究、发现和…

www.broadinstitute.org](https://www.broadinstitute.org/drug-repurposing-hub?source=post_page-----58fec477d424--------------------------------)

一些人工智能在化学及相关科学领域的其他酷应用:

## 在击败物理学建模原子和分子之后,机器学习现在正在与…

将两者的优势结合起来

towardsdatascience.com [## 机器学习在蛋白质设计时代的四种关键方法总结

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

机器学习在蛋白质设计中的时代 [## 机器学习对化学和材料科学的影响 - 每个人都感兴趣的综述亮点…

科学家们刚刚为机器学习在化学和材料科学中的未来设立了一个路线图,在一篇文章中…

机器学习对化学和材料科学的影响 [## 新的深度学习工具以高精度设计新型蛋白质

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

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

www.lucianoabriata.com 我撰写并拍摄关于我广泛兴趣领域的一切:自然、科学、技术、编程等。

在这里打赏我成为 Medium 会员 以访问所有故事(这对你没有费用,我会获得一小部分收入)。 订阅以获取我的新故事 通过电子邮件*。 咨询小型工作 请访问我的 服务页面。你也可以 在这里联系我

AI 在物流中的应用:利用计算机视觉优化集装箱装载率

原文:towardsdatascience.com/ai-in-logistics-optimizing-container-fill-rate-with-computer-vision-192b89eea242?source=collection_archive---------4-----------------------#2023-12-24

利用 AI 实现更智能的物流管理,并从数据驱动的角度提升集装箱利用率,最大化效率和投资回报率

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

·

关注 发表在 Towards Data Science ·8 min read·2023 年 12 月 24 日

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

图片由 Elevate 提供,发布在 Unsplash

物流中最明显的低效之一就是空闲空间的问题。集装箱,全球贸易的命脉,往往部分填充,浪费了宝贵的空间和资源。这种低效导致运营成本增加,损害了业务和环境的可持续性。

运输成本增加

承运商根据集装箱的尺寸来收取费用,而不是根据其装载的货物量。这意味着即使是部分填充的集装箱,费用也与完全填满的集装箱相同。举个例子,根据Statista(2018–2023)报道,A.P. Moller — Maersk 在 Covid-19 大流行期间,运费显著上涨。因此,运输部分填充的集装箱实际上就是在为空余空间付费,而不是有价值的货物,这影响了你的投资回报率。

供应链碳足迹增加

将原本可以放入一个容器的负载分开运输意味着需要双倍的运输手段。

货物损坏增加

空间增大使得货物不再紧密堆积。这使得箱子、托盘和货物在运输过程中,特别是由于振动和突然停车,能够更自由地移动。

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

作者提供的图片

为了在集装箱密封并发货之前帮助识别这一根本问题,开发了一种集装箱填充率分析仪,该分析仪使用计算机视觉和人工智能(AI)来了解每层托盘在集装箱中的填充率。集装箱的填充率是指可用空间中被货物占据的百分比。

借助 AI 的计算机视觉技术,可以消除人工判断每张图像的填充率的任务,并将重点放在解决实际问题上。

集装箱填充率 AI Github 代码

门户

  • 方法

  • SAM 自动掩码生成

  • 基于提示的分割

  • 结果

  • 限制

  • 关闭

方法

解决这一挑战的方法有很多。一种方法是使用单次检测器(SSD)或你只看一次(YOLO)模型来检测托盘,然后从中计算填充率。Arcgic 在其文档页面这里详细解释了 SSD 的工作原理。

然而,目的是测试 Meta 的Segment Anything Model (SAM)在这个特定用例中的表现。在 Meta AI 博客这里中,Meta 分享了一个演示平台以及 SAM 的功能概述。这个方法当然不如为这个特定任务训练模型那样领域特定,但通用模型已经取得了长足的进步,值得测试这种任务的可行性。

SAM 非常多才多艺,提供了两种检测方法,一种是自动掩码生成,它会分割图像上的所有内容,另一种是基于提示的分割,其中图像上的坐标引导分割。Meta 在这里分享了 SAM 构建的详细帖子。

SAM 自动掩码生成

# Initialize Segement Anything and pass in the image for auto mask generation
mask_generator = SamAutomaticMaskGenerator(sam)
masks = mask_generator.generate(input_layer_img)

这种方法效果很好,只需 2 行 Python 代码即可轻松设置,所有内容都会在图像中被分割,无需任何指令。

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

异物分割(作者提供的图像)

然而,挑战在于决定奇怪大小的托盘或异物是否属于该层。在上图中,气囊、一些填充包装物和纸板被分割出来,看起来像是一个托盘。

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

多重分割(作者提供的图像)

有时,由于带子或松散的包装,这些也会被分割出来,如上图所示。

基于提示的分割

基于提示的分割需要提示来指导 SAM 了解焦点区域的位置和方式。与自动掩码生成方法相比,基于提示的分割方法对该项目更为可行。

以下是程序执行流程的伪代码和代码片段。

# Read the input image
input_layer_img: np.ndarray = cv2.imread(img_fp)

# Downscale image for performance
input_layer_img = downscale(input_layer_img)

# First, find all the labels in the image
# The label position can help prompt SAM to generate segments better
label_points: list[list[int, int]] = pallet_label_detector(input_layer_img)

# Send the labels position to SAM and get a segment mask
segmented_mask: np.ndarray = prompt_segment(label_points, input_layer_img)

# Draw on the original image with values from the mask
segment_color = np.random.random(3) * 100

segmented_img = input_layer_img.copy()
segmented_img[segmented_mask] = segment_color
mask = cv2.inRange(segmented_img, segment_color - 10, segment_color + 10)

# Based on the segmented image, find the fill rate
fill_rate: float = fill_rate_calculation(label_points, mask, segmented_img)

在这种情况下,可以将每个标签在托盘上的坐标传递给 SAM 进行分割。标签提取可以使用计算机视觉技术完成,例如定义感兴趣区域、颜色过滤和轮廓。这个过程是业务领域特定的,但通常大多数标签接近白色。

更准确的标签检测方式是扫描序列运输容器代码 (SSCC) 条形码,但图像质量不足以检测条形码。

lower_val = np.array([150, 150, 150], dtype=np.uint8)
upper_val = np.array([255, 255, 255], dtype=np.uint8)

# preparing the mask to overlay
mask = cv2.inRange(layer_img, lower_val, upper_val)

# find contours
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]

new_mask = np.ones(img.shape[:2], dtype="uint8") * 255
prompt_points = []

for c in contours:
    x, y, w, h = cv2.boundingRect(c)

    # only select points in our region of interest
    if is_outside_roi(layer_img, x, y):
        continue

    if w * h < 1000:
        continue

    cv2.rectangle(new_mask, (x, y), (x + w, y + h), (0, 0, 255), -1)

    # We calculate the center of the label to be passed for prompting
    prompt_points.append([int(x + (w / 2)), int(y + (h / 2))])

res_final = cv2.bitwise_and(layer_img, layer_img, mask=cv2.bitwise_not(new_mask))
cv2.imshow("Labels only", res_final)

对输入图像应用 150 到 255 之间的颜色滤镜,如上面的 Python 代码所示,掩码从输入图像中提取。

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

选择标签的 res_final 输出(作者提供的图像)

提示标签位置将使 SAM 产生更具领域聚焦的结果。尽管提取的标签尺寸不完全准确,但估计足以让提示分割所需部分。

# prompt_points contains the coordinates of the labels
# [ [x, y], [x, y]...]
input_point_nd = np.array(prompt_points, dtype=np.int32)

# As all the prompt points are labels, we are giving them a category of 1
input_label = np.ones(len(prompt_points), dtype=np.int32)

predictor.set_image(segment_img)
masks, scores, _ = predictor.predict(
    point_coords=input_point_nd,
    point_labels=input_label,
    multimask_output=False,
)

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

另一张图片的 SAM 输出(图片来源于作者)

分割输出如上图所示。采用了一种简单的方法来计算容器的边界,如红色框所示。随后,图像被转换为黑白图像以进行填充率计算。

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

填充率使用输出(图片来源于作者)

# Sum of white pixels
total_white = np.sum(fill_rate_used[tallest:ch, cx: cw] == 255)

# Sum of black pixels
total_black = np.sum(fill_rate_used[tallest:ch, cx: cw] == 0)

# Percentage of white
fill_rate = round(total_white / (total_white + total_black), 2)

估计的填充率将是占用的彩色空间与未占用空间(即容器边界中的黑色像素)的比较。可以应用少量形态学操作,如膨胀,以填补箱子之间的间隙。

结果

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

样本结果(图片来源于作者)

根据个人环境中的当前测试案例,结果接近现实。这显著减少了分析每个容器填充率的人工工作量,并且填充率百分比的判断更加一致。考虑到标签会被检测到,奇形 pallets 也被纳入考量,同时由于标签坐标的提示,减少了不必要的分割。

利用每层加载的结果,公司现在可以分析部分装载的原因,并决定是否存在操作或计划过程中的缺口。在操作上,决定在运输前封闭容器时,也可以将填充率指标作为一个因素。

通过跟踪结果的时间推移,可以建立一个可视化趋势,以查看加载过程是否有所改善。

限制

Pallets 层

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

分层检测(图片来源于作者)

其中一个限制是,如果颜色过于接近,后面的 pallets 有时会与前面的 pallets 被分割在一起。这会导致填充率的错误计算,因为实际情况是隔间被认为是空的。为克服这些限制,基于提示的分割可能不理想,但可以结合自动掩膜生成和标签检测。

异物

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

气囊误检测(图片来源于作者)

另一个挑战是气囊的分割。在某些情况下,气囊与 pallets 融为一体,导致分割被归为一组。

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

最近箱体检测(图片来源于作者)

克服这种限制的一种选择是尽可能绘制框,去除奇形分割。然而,这对奇形 pallets 又带来了另一挑战,比如非折叠椅子的 pallets。

结论

通过使用计算机视觉,公司中的团队和同事可以做出数据驱动的决策,而无需麻烦地手动分析单独的图像。

这个项目有很多扩展的方式。其中一些包括:

  • 装载卡车甚至小型货车(最后一公里配送)

  • 实时估计/从视频中分析装船结束情况

  • 将填充率转化为货币价值和潜在的立方米(m³)损失

  • 基于填充率阈值计算货物损坏的概率

确保良好输出的最大因素是拥有一致且标准化的输入图像或流。这将大大改善容器高度估计和托盘放置检测。最理想的方式是检测 SSCC 条形码,并利用条形码的位置来提示分割,然而这会需要更昂贵的摄像头。

每个人都可以根据container-fill-rate-ai Github的代码进行适配,遵循Meta SAM Apache License。这个项目并不完美,还有很多改进空间。

为自己的业务/用例扩展这个项目可能需要理解代码并调整 Python 文件中的参数。更重要的是,在进入代码之前,了解业务流程的领域知识是必不可少的。这将帮助你理解如何将代码适配到业务中。

要了解更多关于这个项目的信息,请随时联系:

网站:jonathanlawhh.com/

邮箱:jon_law98@hotmail.com

AI 音乐源分离:如何运作以及为何如此困难

原文:towardsdatascience.com/ai-music-source-separation-how-it-works-and-why-it-is-so-hard-187852e54752

源分离 AI 的解释

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

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

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

图片由作者提供。

源分离

什么是源分离?

在信号处理领域,源分离描述了将音频信号拆分成多个源音频信号的任务。这个概念不仅适用于音乐,也适用于语音或机器声音。例如,您可能希望将播客中两个说话者的声音分开,以便可以分别编辑这些声音。

为什么源分离如此困难?

不是每个人都是音乐家。真正对数据和 AI 有兴趣的音乐家更少。通常,当我与非音乐家交谈时,我觉得他们认为你可以简单地“把声音从音频中去除”。这很合理,因为否则为什么专辑的 B 面会有伴奏,或者为什么在每个酒吧都有数以千计的流行歌曲的卡拉 OK 版本呢?事实上,分离人声和伴奏实际上非常简单——当你可以访问混音的单独轨道时…

然而,在现实世界中,我们只有波形。波形是我们能够最接近真实物理音频事件的计算机表示。波形也是将数字音频转回真实声音的前提,例如通过扬声器。这意味着如果你想将一段音乐分离成两个源(人声和乐器),你需要找到一种方法,将组合波形拆分成两个独立的波形,每个波形准确且独占地捕捉一个源。

为了突出这一点,您可以在下面的图中找到三个波形。第一个代表吉他,第二个捕捉到吉他伴奏上的人声。第三个波形是吉他和人声的组合,即整首歌曲。

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

吉他和人声的波形。图片由作者提供。

对于我这个曲目的制作人来说,提供你们人声和乐器的音频是一个微不足道的任务,因为我可以简单地把这两者的原始录音发给你。然而,作为他人创作的音乐的消费者,我们只能接触到合成的波形。这使得提取过程异常困难,因为没有人能够确切说明我们需要对这个波形做什么才能提取出原始音源。每个音乐音符都由多个在不同频率下振荡的声波组成。这意味着,当我们弹奏吉他的六根弦并在其上演唱旋律时,吉他和人声之间的声波重叠,使得几乎不可能重建原始信号。

深度学习如何提供帮助

由于多个音频源的合成波形非常复杂,至今还没有研究团队提出明确的规则集来使计算机重新分离它们。然而,这正是深度学习发挥作用的地方。深度学习是一种机器学习技术,允许计算机从大量数据中学习,以检测高度复杂数据(如文本、图像或音频)中的相关模式,然后用这些模式来进行预测或解决创造性任务。

深度学习在音乐 AI 领域已经使用了超过 10 年。你能否准确描述“摇滚”和“金属”有什么不同,使这些规则能构成一个准确的音乐类型分类器?不能?我也不能。然而,如果我们将 1 万首摇滚曲目和 1 万首金属曲目输入深度学习模型,它将为我们完成这个模式识别任务,并轻松解决问题。不幸的是,这听起来比实际操作要简单得多。

为了教导一个深度学习模型从一段音乐中分离乐器和人声,我们需要一个包含数万首曲目的大数据集(或更多),所有曲目都需要有原始音频源(即乐器和人声)作为独立的波形数据。至今,收集这样一个庞大的数据集仍然是一个巨大的挑战。然而,事实证明,我们可以应用一些技巧来解决这个问题,即使没有这样一个大数据集。这就是 DEMUCS 发挥作用的地方。

源分离的工作原理

DEMUCS — 一个可靠的源分离模型

由于源分离是一个活跃的研究领域,存在几种不同的技术方法。在这篇文章中,我将重点介绍最著名的源分离框架之一:DEMUCS。DEMUCS 于 2019 年首次提出**[1,2],并在随后的几年中逐步改进[3,4]**。这使得它成为一个很好的示例,因为它允许我们首先查看 AI 模型的基本架构和用于训练它的方法,然后再阐述导致研究人员更新 DEMUCS 的趋势和进展。

DEMUCS 是基于哪个数据集训练的?

为了训练深度学习模型,我们通常需要一个真实标签。对于源分离,这意味着我们需要大量的曲目以及它们各自的乐器来源。对于 DEMUCS,作者使用了流行的 MusDB 数据集,其中包含 150 首以 44.1k Hz 采样的歌曲,每首歌曲都有单独的“鼓”、“贝斯”、“人声”和“其他”波形。此外,作者还收集了 150 首更多的乐器来源的曲目,这些曲目很可能来自他们的个人音乐项目(或朋友)。

然而,由于生成音乐模型如 MusicLM 或 MusicGen 是在数千小时的音乐上训练的,300 首曲目显然不足以在源分离上取得突破。不幸的是,这就是他们能够获得的所有数据。这就是为什么作者决定使用一些技巧,以充分利用现有资源。

数据集是如何增强的?

小数据集的问题在于模型无法学习到它在现实世界中会遇到的输入的多样性。300 首歌曲真的能反映人们在 DEMUCS 发布后会使用的所有类型的音乐吗?不能。缓解数据集偏差的常用技术是执行数据增强技术。这意味着对现有曲目进行轻微的信号处理,以便它们听起来不同,同时保持其核心特征。

在原始 DEMUCS 研究中,作者使用了不同的技术组合,如音高移位、时间拉伸/加速或改变单个乐器来源的音量。这样,就能覆盖更广泛的声音范围,而不会引入完全不合理的数据。这就是我们称这些方法为自然数据增强的原因。

然而,在他们 2021 年的后续研究**[3]**中,作者在数据增强方面更进一步。这时,他们开始将不同曲目的乐器来源组合起来,制作全新的歌曲。为了确保一定程度的音乐真实性,他们在将“外来”乐器来源放入现有曲目之前,进行了音高移位、起始点检测和节奏调整。虽然这不是一种自然数据增强形式,但作者通过这种技术在之前的工作基础上取得了改进。

如果数据增强对你有趣,你可能会喜欢我几个月前写的这篇博客:

## 使用 Spotify 的 Pedalboard 进行自然音频数据增强

提供现成的 Python 代码和预设

[towardsdatascience.com

DEMUCS 是什么样的 AI 模型?

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

DEMUCS 的高级模型架构。作者提供的图像。

所有版本的 DEMUCS 都基于一个编码器-解码器神经网络。在上图中,你可以看到这种神经网络的基本结构。本质上,编码器接收音轨作为输入,并将其转换为我们称之为潜在表示(或嵌入) 潜在表示的目的是简单地减少输入音轨的大小。由于一个波形需要数万个数字来存储和处理每秒的音频,因此计算机处理起来很困难。潜在表示具有较低的维度,从而降低了复杂性,同时(希望)保留了所有相关的信息,如乐器、音高、和声、节奏和音色。利用这些压缩的信息,解码器为每个乐器源(低音、鼓、声乐和其他)生成新的波形。

针对技术人员的更技术性描述: 前三个版本的 DEMUCS 基于 Wave-U-Net(2018)[5],而 Wave-U-Net 本身则基于著名的 U-Net(2015)[6]架构。这个网络本质上是一个基于卷积和反卷积的编码器-解码器模型。在 2021 年[3],DEMUCS 通过使用两个神经网络进行了改进,一个处理音轨的波形,另一个处理其声谱图,然后将这两个网络结合以完成最终的源分离步骤。DEMUCS 的最新版本**[4]**用一个变换器编码器层替代了 Wave-U-Net 中的一些卷积层。

DEMUCS 的效果如何?

你可以在这个 HuggingFace 空间上自己试用:huggingface.co/spaces/akhaliq/demucs

不幸的是,这个在线演示有点慢。如果你是编码员,我建议你通过这个GitHub 仓库在本地运行 DEMUCS。

(最后检查时间:2023 年 9 月 16 日。如果有任何链接无法使用,请告知我!)

其他方法

与任何技术一样,重要的是指出 DEMUCS 建立在前人的基础上,他们完成了 DEMUCS 可以构建的所有基础工作——从数据集到评估标准,再到模型架构。此外,其他研究人员最近提出了创造性的方法,提供了源分离的新视角。

在 2023 年 8 月,一篇名为“Separate Anything You Describe”**[7]**的论文引起了音乐 AI 社区的兴奋。这篇论文实现了一个完全基于文本的源分离工具,可以通过自然语言进行查询,并适用于各种音频:语音、声音或音乐。这是通过将源分离过程连接到 AI 模型 CLAP 来实现的,该模型允许你用词汇捕捉声音的意义,反之亦然。

这种方法看起来很有前景,因为当前源分离系统的一个关键限制是它们被绑定到特定的输出结构。例如,DEMUCS 只能将音轨分离为“低音”、“人声”、“鼓”和“其他”。从多乐器混合中提取吉他或钢琴是不可能的。通过自然语言查询,你只需告诉模型从混音中提取“钢琴”、“竖琴”或“背景中的那个有趣的声音”。

另一方面,提取的音源质量仍然低于像 DEMUCS 这样的传统源分离系统。这意味着目前你在质量和灵活性之间进行权衡。因此,一个专门针对特定、常用乐器但又能保持对自然语言查询灵活的混合系统可能是值得期望的。

结论

源分离并非易事,因为以受控和可靠的方式分离一组复杂的声学波形是困难的。通过像 DEMUCS 这样的深度学习方法,近年来我们见证了越来越多能力强大的 AI 模型。此外,自然语言查询已经进入该领域,并可能进一步提高 AI 源分离工具的实用性。

我经常写关于 AI 和音乐的文章。以下是一些你可能也会喜欢的文章:

另外,可以考虑在 Medium 上关注我以获取更多文章,并在 LinkedIn 上关注我以获取有关 AI 和音乐的最新动态。

参考文献

[1] Défossez 等 (2019)。Demucs:使用额外未标记数据混合的深度音乐源提取器。 arxiv.org/abs/1909.01174

[2] Défossez 等 (2019)。波形域中的音乐源分离。 arxiv.org/abs/1911.13254

[3] Défossez (2021)。混合频谱图和波形源分离。 arxiv.org/abs/2111.03600

[4] Rouard, Massa & Défossez (2023)。用于音乐源分离的混合变换器。 arxiv.org/abs/2211.08553

[5] Stoller, Evert, Dickson (2018)。Wave-U-Net:用于端到端音频源分离的多尺度神经网络。 arxiv.org/abs/1806.03185

[6] Ronneberger, Fischer, Brocks(2015). U-Net:用于生物医学图像分割的卷积网络。 arxiv.org/abs/1505.04597

[7] 刘等人(2023). 分离你描述的任何事物。 arxiv.org/abs/2308.05037

AI 驱动的个人语音助手用于语言学习

原文:towardsdatascience.com/ai-powered-personal-voicebot-for-language-learning-5ada0dfb1f9b?source=collection_archive---------2-----------------------#2023-08-28

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

·

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

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

由 Stable Diffusion XL 创建 — 图片由作者提供

掌握一门新语言的最有效方法是什么?就是说出来!但我们都知道,在别人面前尝试新单词和短语可能会很令人畏惧。如果你有一个耐心且理解的朋友来练习,没有评判,没有羞耻感,那会怎么样?

你寻找的那位耐心且理解的朋友可能正是一个由大型语言模型驱动的虚拟语言导师!这可能是掌握一门语言的终极方式,尽在你自己的空间内。

最近,大型语言模型已经进入我们的视野,它们正在改变我们的工作方式。这些强大的工具创建了可以像人类一样回应的聊天机器人,并迅速融入我们生活的各个方面,以数百种不同的方式使用。其中一个特别有趣的用途是在语言学习中,尤其是在口语练习方面。

当我不久前搬到德国时,我意识到学习一门新语言并找到练习口语的机会是多么具有挑战性。课程和语言小组可能昂贵或难以融入繁忙的日程。面对这些挑战,我有了一个想法:为什么不使用聊天机器人进行口语练习呢?单纯的文字交流是不够的,因为语言学习不仅仅涉及写作。因此,通过将 AI 驱动的聊天机器人与语音转文本和文本转语音技术结合起来,我成功创建了一个感觉像与真实人对话的学习体验。

在本文中,我将分享我选择的工具,解释过程,并介绍通过语音命令和语音回应与 AI 聊天机器人进行口语练习的概念。项目流程包括三个主要部分:语音转文本转录、使用语言模型和文本转语音转换。这些将在以下三个标题下进行解释。

1. 语音转文本转录

语言辅导中的语音识别作为用户语音输入与 AI 基于文本的理解之间的桥梁,用于生成回应。它是关键组件,使语音驱动的互动成为可能,从而提供更具沉浸感和有效的语言学习体验。

准确的转录对于与 Chatbot 的顺畅互动至关重要,尤其在语言学习的背景下,发音、口音和语法是关键因素。有各种语音识别工具可用于在 Python 中转录语音输入,如OpenAI 的 WhisperGoogle Cloud 的 Speech-to-Text

在为语言辅导项目选择语音识别工具时,需要考虑准确性、语言支持、成本以及是否需要离线解决方案等因素。

Google 提供了一个 Python API,需要互联网连接,并提供每月 60 分钟的免费转录服务。与 Google 不同,OpenAI 发布了他们的 Whisper 模型,你可以在本地运行它,只要你有足够的计算能力,就不依赖于互联网速度。这就是为什么我选择 Whisper 以尽可能减少转录延迟。

2. 语言模型

语言模型是这个项目的核心。由于我已经非常熟悉 ChatGPT 及其 API,我决定在这个项目中也使用它。不过,如果你有足够的计算能力,你也可以在本地部署 Llama,这将是免费的。ChatGPT 需要花费一些钱,但使用起来更方便,因为你只需几行代码即可运行它。

为了提高响应的一致性并使其符合特定模板,你还可以对语言模型进行微调(例如,如何根据你的使用情况对 ChatGPT 进行微调)。你需要生成示例句子和相应的最佳响应,并将其输入微调训练中。然而,我想要构建的基础教程不需要微调,我将在项目中使用通用的 GPT-3.5-turbo。

我将提供一个 API 调用示例,以方便通过其 API 在 Python 中实现用户与 ChatGPT 之间的对话。首先,如果你还没有一个,你需要开设一个 OpenAI 账户并设置 API 密钥以与 ChatGPT 进行交互。详细说明 在这里

一旦你设置好 API 密钥,就可以使用 openai.ChatCompletion.create 方法开始生成文本。该方法需要两个参数:model 参数,指定要通过 API 访问的特定 GPT 模型,以及 messages 参数,包含与 ChatGPT 对话的结构。messages 参数由两个关键组成部分构成:rolecontent

下面是一个代码片段来说明这个过程:

# Initialize the messages with setting behavior(s).
messages = [{"role": "system", "content": "Enter behaviour(s) here."}]

# Start an infinite loop to continue the conversation with the user.
while True:
    content = input("User: ") # Get input from the user to respond.
    messages.append({"role": "user", "content": content})# Append the user's input to the messages.

    # Use the OpenAI GPT-3.5 model to generate a response to the user's input.
    completion = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=messages
    )

    chat_response = completion.choices[0].message.content # Extract the chat response from the API response.
    print(f'ChatGPT: {chat_response}') # Print the response.

    # Append the response to the messages with the role "assistant" to store the chat history.
    messages.append({"role": "assistant", "content": chat_response})
  • system 角色被定义用来通过在消息列表开头的内容中添加指令来确定 ChatGPT 的行为。

  • 在聊天过程中,user 消息是通过提到的语音识别模型从用户处接收的,以便从 ChatGPT 获取响应。

  • 最后,ChatGPT 的响应被附加到消息列表中的 assistant 角色,以记录对话历史。

3. 文本转语音

在语音转文本转录部分,我解释了用户如何利用语音命令模拟对话体验,仿佛与真实的人交谈。为了进一步增强这种感觉并创建一个更动态和互动的学习体验,下一步涉及使用像 gTTS 这样的文本转语音工具将 GPT 的文本输出转换为可听的语音。这不仅有助于创建一个更具吸引力且易于跟随的体验,还解决了语言学习的一个关键方面:通过听力而不是阅读来理解。通过整合这一听觉组件,我们促进了更全面的实践,更贴近真实世界的语言使用。

有各种 TTS 工具可供选择,例如 Google 的 Text-to-Speech(gTTS)和 IBM Watson 的 Text to Speech。在这个项目中,我选择了 gTTS,因为它超级易于使用,提供了自然的语音质量,而且完全免费。要使用 gTTS 库,你需要有互联网连接,因为该库需要访问 Google 的服务器来将文本转换为语音。

流程的详细说明

在我们深入探讨流程之前,你可能想先查看我在Github页面上的完整代码,因为我将会引用其中的一些部分。

下图解释了 AI 驱动的虚拟语言导师的工作流程,该导师旨在建立一个实时的基于语音的对话学习体验:

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

流程图 — 作者提供的图片

  • 用户通过开始录制他们的语音来启动对话,临时将其保存为.wav 文件。这是通过按住空格键来实现的,录音在释放空格键时停止。下面解释了实现这种按键对话功能的 Python 代码部分。

以下全局变量用于管理录音过程的状态:

recording = False       # Indicates whether the system is currently recording audio
done_recording = False  # Indicates that the user has completed recording a voice command 
stop_recording = False  # Indicates that the user wants to exit the conversation

listen_for_keys函数用于检查键盘的按压和释放。它根据空格键和 esc 按钮的状态设置全局变量。

def listen_for_keys():
    # Function to listen for key presses to control recording
    global recording, done_recording, stop_recording
    while True:
        if keyboard.is_pressed('space'):  # Start recording on spacebar press
            stop_recording = False
            recording = True
            done_recording = False
        elif keyboard.is_pressed('esc'):  # Stop recording on 'esc' press
            stop_recording = True
            break
        elif recording:  # Stop recording on spacebar release
            recording = False
            done_recording = True
            break
        time.sleep(0.01)

callback函数用于处理录音时的音频数据。它检查recording标志以决定是否录制传入的音频数据。

def callback(indata, frames, time, status):
    # Function called for each audio block during recording.
    if recording:
        if status:
            print(status, file=sys.stderr)
        q.put(indata.copy())

press2record函数是主要功能,负责处理当用户按住空格键时的语音录制。

它初始化全局变量以管理录音状态,并确定采样率,还创建一个临时文件来存储录制的音频。

函数随后打开一个 SoundFile 对象来写入音频数据,并使用先前提到的callback函数创建一个 InputStream 对象来从麦克风捕获音频。启动一个线程以监听按键,特别是录制的空格键和停止的’esc’键。在一个循环内,函数检查录制标志,并在录制活动时将音频数据写入文件。如果录制停止,函数返回-1;否则,它返回录制音频的文件名。

def press2record(filename, subtype, channels, samplerate):
    # Function to handle recording when a key is pressed
    global recording, done_recording, stop_recording
    stop_recording = False
    recording = False
    done_recording = False
    try:
        # Determine the samplerate if not provided
        if samplerate is None:
            device_info = sd.query_devices(None, 'input')
            samplerate = int(device_info['default_samplerate'])
            print(int(device_info['default_samplerate']))
        # Create a temporary filename if not provided
        if filename is None:
            filename = tempfile.mktemp(prefix='captured_audio',
                                       suffix='.wav', dir='')
        # Open the sound file for writing
        with sf.SoundFile(filename, mode='x', samplerate=samplerate,
                          channels=channels, subtype=subtype) as file:
            with sd.InputStream(samplerate=samplerate, device=None,
                                channels=channels, callback=callback, blocksize=4096) as stream:
                print('press Spacebar to start recording, release to stop, or press Esc to exit')
                listener_thread = threading.Thread(target=listen_for_keys)  # Start the listener on a separate thread
                listener_thread.start()
                # Write the recorded audio to the file
                while not done_recording and not stop_recording:
                    while recording and not q.empty():
                        file.write(q.get())
        # Return -1 if recording is stopped
        if stop_recording:
            return -1

    except KeyboardInterrupt:
        print('Interrupted by user')

    return filename

最后,get_voice_command函数调用press2record来录制用户的语音命令。

def get_voice_command():
    # ...
    saved_file = press2record(filename="input_to_gpt.wav", subtype = args.subtype, channels = args.channels, samplerate = args.samplerate)
    # ...
  • 在捕捉并保存了语音命令到一个临时的.wav 文件后,我们现在进入转录阶段。在这一阶段,录制的音频将通过 Whisper 转换成文本。下面是一个简单运行.wav 文件转录任务的脚本:
def get_voice_command():
    # ...
    result = audio_model.transcribe(saved_file, fp16=torch.cuda.is_available())
    # ...

这个方法接受两个参数:录制音频文件的路径saved_file和一个可选的标志,用于在 CUDA 可用的情况下使用 FP16 精度以增强兼容硬件上的性能。它简单地返回转录的文本。

  • 然后,转录的文本被发送到 ChatGPT,以在interact_with_tutor()函数中生成适当的回应。相关的代码段如下:
def interact_with_tutor():
    # Define the system role to set the behavior of the chat assistant
    messages = [
        {"role": "system", "content" : "Du bist Anna, meine deutsche Lernpartnerin. 
                                        Du wirst mit mir chatten. Ihre Antworten werden kurz sein.
                                        Mein Niveau ist B1, stell deine Satzkomplexität auf mein Niveau ein. 
                                        Versuche immer, mich zum Reden zu bringen, indem du Fragen stellst, und vertiefe den Chat immer."}
    ]
    while True:
        # Get the user's voice command
        command = get_voice_command()  
        if command == -1:
            # Save the chat logs and exit if recording is stopped
            save_response_to_pkl(messages)
            return "Chat has been stopped."

        # Add the user's command to the message history
        messages.append({"role": "user", "content": command})  

        # Generate a response from the chat assistant
        completion = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=messages
        )  

        # Extract the response from the completion
        chat_response = completion.choices[0].message.content  # Extract the response from the completion
        print(f'ChatGPT: {chat_response} \n')  # Print the assistant's response
        messages.append({"role": "assistant", "content": chat_response})  # Add the assistant's response to the message history
        # ...

interact_with_tutor函数开始时定义 ChatGPT 的系统角色,以塑造其在对话中的行为。由于我的目标是练习德语,我相应地设置了系统角色。我称呼我的虚拟导师为“Anna”,并为她设置了我的语言熟练度,以便她调整她的回应。此外,我指示她通过提问保持对话的吸引力。

接下来,用户转录的语音命令以“user”的角色追加到消息列表中。然后将该消息发送给 ChatGPT。由于对话在一个 while 循环中继续进行,用户命令和 GPT 回应的整个历史被记录在消息列表中。

  • 在每次 ChatGPT 回应后,我们使用 gTTS 将文本消息转换为语音。
def interact_with_tutor():
  # ...
  # Convert the text response to speech
  speech_object = gTTS(text=messages[-1]['content'],tld="de", lang=language, slow=False)
  speech_object.save("GPT_response.wav")
  current_dir = os.getcwd()
  audio_file = "GPT_response.wav"
  # Play the audio response
  play_wav_once(audio_file, args.samplerate, 1.0)
  os.remove(audio_file) # Remove the temporary audio file

gTTS()函数接受 4 个参数:texttldlangslowtext参数被赋予messages列表中最后一条消息的内容(由[-1]表示),你想将其转换为语音。tld参数指定 Google 翻译服务的顶级域。将其设置为"de"意味着使用德语域,这对确保发音和语调适合德语非常重要。lang参数指定文本应以何种语言朗读。在此代码中,language变量设置为'de',意味着文本将以德语朗读。slow=Falseslow参数控制语音的速度。将其设置为False意味着语音将以正常速度朗读。如果设置为True,语音将更慢。

  • ChatGPT 响应的转换语音将保存为临时的.wav 文件,向用户播放,然后删除。

  • 当用户再次按下空格键继续对话时,interact_with_tutor函数会重复运行。

  • 如果用户按下“esc”,对话结束,并且整个对话保存到一个 pickle 文件chat_log.pkl中,您可以稍后用于分析。

命令行用法

要运行脚本,只需在终端中运行以下 Python 代码:

sudo python chat.py

sudo是必需的,因为该脚本需要访问麦克风并使用键盘库。如果您使用 Anaconda,您也可以通过“以管理员身份运行”来启动 Anaconda 终端,以赋予完全访问权限。

这里有一个演示视频展示了代码在我的笔记本电脑上的运行情况。您可以感受一下性能:

作者创建的演示视频

最后的备注

我通过简单设置 ChatGPT 的系统角色并调整 gTTs 函数中的参数,将导师的语言设置为德语。然而,您也可以轻松切换到其他语言。只需几秒钟即可为目标语言配置它。

如果您想要讨论特定主题,您也可以在 ChatGPT 的系统角色中添加它。例如,使用它练习面试可能是一个不错的用例。您还可以指定您的语言水平以调整其响应。

一个重要的备注是,聊天的整体速度取决于您的互联网连接(由于 ChatGPT API 和 gTTS)以及您的硬件(由于 Whisper 的本地部署)。在我的情况下,我的输入后的整体响应时间在 4-10 秒之间。

人工智能搜索算法:深入了解最受欢迎的算法

原文:towardsdatascience.com/ai-search-algorithms-a-deep-dive-into-the-most-popular-ones-2760679368bb

介绍四种最常用的人工智能搜索算法

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

·发布于 Towards Data Science ·阅读时间 11 分钟·2023 年 8 月 23 日

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

Mitchell LuoUnsplash 提供的照片

就好像地球上人类还不够一样,我们已经尝试了多年创造行为类似于我们的机器。我们创建数学模型或代理,行为理性,以便我们不必依赖其他人的决策。

搜索算法曾经是最常用的,但随着机器学习和深度学习的兴起,它们的使用有所减少。然而,我认为所有的数据科学家都应该了解它们,因为它们是一个极其有用的工具集,在许多情况下都能发挥作用。

这些算法可以应用于许多情况,但最具代表性的是游戏:井字棋、迷宫、甚至国际象棋……我们将用这些来解释今天将要讨论的算法。

我们将介绍四种最著名的搜索算法,并将通过一些实用和直观的例子对它们进行详细讲解。

和往常一样,请参阅本文底部的 资源 部分以获取更多信息和代码。

但在此之前,我们需要介绍一些定义,以便理解一些关键术语。

术语

  • 代理:它是与环境互动的人、模型或算法。

  • 状态:在特定时刻表示问题的环境或元素集合。

  • 状态空间:所有可能到达的状态的集合。

  • 目标状态:最终状态,满足特定条件的状态。

  • 动作:代理在给定状态下必须做出的功能或决策,以便转移到下一个状态。

我们可以定义更多术语,但这些是最基本的术语,足以涵盖今天的主题。

表示

人工智能搜索算法通常使用图来解释,今天我们不会改变现状。

这里是一个示例图:

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

我们将用来解释概念的示例图——作者提供的图像

在图中,每个节点是一个状态。我们总是有初始状态(在这个例子中是 A,绿色)和目标状态(我决定是 E,红色)。正是通过我们在前一节中定义的动作,我们的代理才能从一个状态移动到下一个状态,并反复执行,直到达到目标状态。

从 A 到 F 的所有节点定义了状态空间

那么不同之处在于我们从 A 到 E 的算法。这就是我们接下来要开始探索的内容。

深度优先搜索

深度优先搜索(DFS)[1] 算法是非信息型搜索算法之一,其中我们只有在问题定义中提供的信息。

换句话说,在一个非信息型搜索算法中,我们知道我们想要去哪里——我们想达到目标状态 E——但我们不知道距离目标有多近或多远。

深度优先搜索特别是不断向前移动,直到到达叶节点。在每个可能遇到的分叉点,它随机选择一个方向并继续前进。

如果我们到达的叶节点是目标状态,那我们就完成了。但如果不是,那它会再次上升到最后的分叉点,并继续向前移动。这个过程会递归重复,直到我们到达目标状态。

现在我们来看看:

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

第一个应用的动作——作者提供的图像

从初始状态 A,我们只能移动到 B。因此,在动作发生后,我们的代理将处于那个第二个状态。然后到达分叉点,我们需要做出选择。由于 DFS 是一个非信息型算法,它会随机选择,因为我们不知道哪个是最佳选择。假设它选择了 F 而不是 C。

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

DFS 第二次决策——作者提供的图像

由于算法被训练为深入探索,直到探索其他分支,它将不得不再次在 D 和 E 之间做出决定。如果它选择了 E,那我们就完成了。但这次我们运气不好,它随机选择了 D。

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

可能的 DFS 实现——作者提供的图像

此时,算法已经访问了 A、B、F 和 D。处于 D 时,只剩一个方向,它将我们带到 E。在那里,我们就完成了。

这个算法在多个情况下简单有效。它遵循先进后出的策略,这就是为什么可以使用栈来实现它。

在我们的例子中,最优解决方案将我们从 A 到 E 需要 3 步,但这并不保证。事实上,我们遵循的例子用了 4 个动作。

广度优先搜索

广度优先搜索(BFS)[2] 是另一种无信息搜索算法,我们可以说它是深度优先搜索(DFS)的对立面:它不会在探测到前一层所有节点之前进入下一层深度。

当我们在 DFS 中使用栈时,这里我们使用队列:它遵循先进先出策略。

再次,让我们通过图形可视化来看。它从 A 到 B,如我们之前所见,我们没有其他选择。然后我们到达 B 的分叉点,由于这是一个无信息算法,我们只是随机选择 C 和 F 之间的一个。我们基本上会探索两个,只是探测的顺序不同而已。

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

BFS 的第二步:我们已经探索了 A、B、C 和 F——图片由作者提供

我们已经探索了第 1 层(节点 A),第 2 层(节点 B),和第 3 层(节点 C 和 F)。现在我们进入第 4 层,探索最终的叶子节点——E 和 D。

再次,无论我们是先探索 E 还是 D,这完全是一个任意的决定:

  • 如果 C 在 B 的分叉点先被探索,那么我们将紧接着到达 E。

  • 但如果 F 先被探索,那么会随机决定是先探索 D 还是 E。

BFS 和 DFS 都有其潜力,但两者都有缺陷。一个在某些情况下会表现最好,但在其他情况下则效率低下。这些是简单的算法,虽然仍然有用,但我们应当寻求更多。

贪婪最佳优先搜索

这是我们今天要介绍的第一个有信息搜索算法。在这种算法中,我们确实有关于目标状态的信息,我们的任务是利用这些信息在每一步之前做出明智的选择。我们将启发式定义为这段信息,它告诉我们离目标有多近或多远。

贪婪最佳优先搜索(GBFS)[3] 算法很简单:我们只是朝向那些使我们更接近目标节点的节点移动,而启发式 h(x) 是衡量接近度的。

在典型的迷宫游戏中,接近度可以通过我们与目标之间的像素/瓦片距离来表达,无论是垂直方向还是水平方向。

假设一个例子,我们想从 A 到 B,并且已经玩到了一个棘手的决策点。如果我们使用 BFS 或 DFS,选择将是随机的。但我们现在使用的是有信息的算法。

查看以下迷宫,每个瓦片上都有一个数字,定义了我们距离目标的瓦片数量。换句话说,启发式定义了从当前瓦片到目标所需的步数,假设迷宫没有墙壁,我们只能水平或垂直移动:

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

带有接近度启发式值的样本迷宫——图片由作者提供

如果我们使用 GBFS,我们使用的接近启发式建议我们向上移动,因为如果我们向上移动,到达 B 所需的步骤从 2 减少到 1,而如果我们向下移动,则从 2 增加到 3。换句话说,如果我们向上移动,我们离目标更近,而如果我们向下移动,我们则离目标更远。

这并不完美,因为我们只是考虑了离 B 的距离,而没有考虑到我们与目标状态之间的实际障碍。这是 GBFS 无法控制的。

为了保持一致性,让我回到我们一直使用的图形表示,只不过这次会是全新的图。我们仍然想从 A 到 E,但如我们所知,我们现在有关于每个节点的更多信息,了解我们离最终状态的距离。

我们将使用字母 h 来提供启发式的虚拟值。

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

带有启发式的示例图 — 图片由作者提供

提出的示例与迷宫的工作方式相同:从一个状态移动到另一个状态的每一个动作要么使我们离目标更近一单位,要么使我们更远一单位,或者让我们保持不变。最优路径是明确的:从 A 到 C 再到 E。如果有分叉点,那就朝着 h(x) 较小的节点移动。

但情况可能会有所不同。想象一下,如果启发式不仅仅依赖于节点之间最大差异的单位,而是依赖于多个环境因素。如果是这样的话,在我们的例子中最优路径不会改变,因为它非常简单,但在更复杂的图中情况会完全不同。

贪婪最佳优先搜索是一种强大的算法,但它并不完美。虽然它考虑了我们离目标有多近,但它没有考虑到到达这一点的实际费用。

信不信由你,到达一个状态或节点的成本和贪婪搜索的成本同样重要。

为下一个算法做好准备。

A* 搜索

A 搜索算法*[4] 是 GBFS 算法的一种变体,但如前所述,我们考虑了到达每个节点的成本。换句话说,通过不同的边进行遍历可能会有不同的成本。

我们将定义:

  • 前向成本h(x)。这是 GBFS 中使用的相同启发式:当前状态与目标状态之间的距离。

  • 后向成本 — g(x)。这是从初始状态到当前状态的成本。它是一个累积成本,意思是它将所有之前的成本加起来。

A* 搜索的目标是找到一种路径,使得两种费用的总和最小。用数学术语来说,节点 x 的总成本为 f(x) = g(x) + h(x)。

为了说明这一点,我将使用我们已经使用过的初始图。我们仍然想从 A 到 E,现在的费用如下所示:

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

新图以执行 A* 搜索 — 图片由作者提供

花一点时间思考一下这里可能的最佳路径。节点周围的数字是前向成本,靠近线条的数字是后向成本。

现在让我们一步一步解码:

  1. 我们别无选择,只能从 A 到 B。到达 B 的成本是 f(B) = 2 + 2 = 4

  2. 从 B 开始,我们可以选择去 C 或 F。这里我们暂停并检查哪一个更低。我们看到 f© = 7 + 1 = 8f(F) = 3+1 = 4。然后,我们确定F是最佳方案。

  3. 从 F 开始,我们又有两个选择:我们可以去 E 并达到目标状态,或前往 D。大多数人会选择 E,因为不需要额外的步骤,但我们聪明,我们让数学来做工作:f(D) = 6+1 = 7f(E) = 13+0 = 13。因此,D 比 E 更好。

    不过,请记住我们在 B 还有一条未走的路径,我们可以前往 C。但从 B 到 C 的成本是 8,仍高于 7,所以我们仍将继续向 F->D 方向移动。

  4. 从 D 我们只能去 E(或返回 F,这没有意义)。成本是 f(E) = 7+0 = 7。由于它仍然低于 f©,所以我们到此为止。

所以最终的最佳路径是 A->B->F->D->E。

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

使用 A*搜索的最佳路径— 作者提供的图片

结论

把这些知识付诸实践。

我们没有使用任何代码,因为我相信自己动手构建是理解这些算法如何工作的最佳方式。然而,在下面的资源部分你会找到一个我创建的 GitHub 仓库[5]的链接,我在其中实现了今天看到的四种算法中的三种。

我的实现很简单,不是最有效的。提供代码的目的是让你玩转它,并通过将迭代函数改为递归函数、创建更复杂的类等方式改进它。

继续尝试用 DFS、BFS、GBFS 或 A*搜索实现你自己的迷宫解决方案。不要只是复制我的代码,而是将其作为模板使用(你可能会发现一些惊喜)。

要有创造力和资源 fulness,千万不要停下来。尝试其他我们没有覆盖的算法,如 minimax 或 uniform cost search。Google 是你的好帮手。

今天我讲解了这四种算法的基础知识,展示了它们如何通过视觉示例和一系列步骤工作。我使用了简单的示例,但在较大的图上过程是一样的。

关键是,作为数据科学家,要理解这些算法,知道如何使用它们,更重要的是识别它们对我们有用的情况。

搜索算法只是 AI 的一部分,尽管它们已经存在一段时间,但仍然是关键。

继续尝试这些算法吧!

**Thanks for reading the post!** 

I really hope you enjoyed it and found it insightful.

Follow me and subscribe to my mail list for more 
content like this one, it helps a lot!

**@polmarin**

如果你想进一步支持我,可以考虑通过下面的链接订阅 Medium 的会员:这不会额外花费你任何费用,但会帮助我完成这个过程。

[## 通过我的推荐链接加入 Medium - Pol Marin

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

medium.com](https://medium.com/@polmarin/membership?source=post_page-----2760679368bb--------------------------------)

资源

[1] 深度优先搜索 — 维基百科

[2] 广度优先搜索 — 维基百科

[3] 最佳优先搜索 — 维基百科

[4] A* 搜索算法 — 维基百科

[5] AI 搜索算法库 — GitHub

额外资源

AI 初创公司趋势:来自 Y Combinator 最新一批的洞察

原文:towardsdatascience.com/ai-startup-trends-insights-from-y-combinators-latest-batch-282efc9080ae?source=collection_archive---------2-----------------------#2023-07-21

当前 AI 领域中正在构建哪些类型的公司

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

·

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

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

图片由 Proxyclick Visitor Management System 提供,发布在 Unsplash

知名的硅谷初创公司加速器 Y Combinator(YC)最近宣布了他们的 2023 年冬季批次,毫不奇怪的是,约 31%的初创公司 (269 家中有 80 家)有自报的 AI 标签。虽然实际数字可能有偏差,但趋势很明显——利用 AI 的初创公司现在已经成为 YC 批次中的一部分。

对于这一部分,我分析了这一批次中的 20–25 家初创公司,以了解一些较大的趋势,特别是那些利用**LLMs(大语言模型)**的初创公司。这些趋势涵盖了他们如何识别需要解决的问题,他们采取了哪些解决方案,他们做得对的方面以及他们的方法中可能存在的风险。

但在深入探讨趋势之前,让我们从一个通用框架开始,思考科技公司(无论大小)如何通过 AI 创造价值。

AI 价值链

如果你最近关注了科技新闻,就会发现关于 AI 的内容激增,很难始终理解这些新闻在整体格局中的位置。让我们用一个简化的框架来思考这个问题。

AI 是一个非常广泛的术语,包括了从可以预测事物的回归模型,到能够识别物体的计算机视觉,再到最近的 LLMs(大语言模型)等多种技术。为了讨论的目的,我们将重点关注 LLMs,这些模型在 OpenAI 向公众开放 ChatGPT 后备受瞩目,并在公司之间掀起了一场 AI 竞赛。

利用 AI 的科技公司通常在以下三层之一运作:

  • 基础设施 — 这包括硬件提供商(例如,制造 GPU 以支持 AI 模型所需大量计算的 NVIDIA),计算提供商(例如,提供云端处理能力的 Amazon AWS、Microsoft Azure、Google Cloud),AI 模型/算法(例如,提供 LLMs 的 OpenAI、Anthropic),以及 AI 平台(例如,提供模型训练平台的 TensorFlow)。

  • 数据平台/工具层 — 这包括了那些能够收集、存储和处理数据以用于 AI 应用的平台(例如,提供云数据仓库的 Snowflake,提供统一分析平台的 Databricks)。

  • 应用层 — 这涵盖了所有利用 AI 进行特定应用的公司(初创公司、中大型科技公司以及非科技公司)。

根据市场当前的状况以及过去类似情况的发展(例如,云计算市场),基础设施和数据平台层可能会趋向于少数几个相对商品化的玩家。例如:

  • 在硬件玩家中,NVIDIA 目前凭借其 GPU 产品处于领先地位(其股票在 2023 年翻了三倍),我们将看到还有谁能赶上。

  • 计算市场已经趋于集中,AWS、Azure 和 Google Cloud 占据了三分之二的市场份额

  • 在 AI 算法层面,OpenAI 凭借 GPT 模型表现突出,但这是一个竞争激烈的市场,参与者资金雄厚(如谷歌的 Deepmind/Google Brain、Facebook Lambda、Anthropic、Stability AI)——如果你想深入了解,可以参见这个分析。这里有两点需要注意:i) 大多数公司可以访问相同的数据集,如果一家公司的确获得了新的付费数据集(如 Reddit),竞争对手也很可能会获得相同的数据集,ii) GPT 模型位于算法层面,但 ChatGPT 产品位于应用层面(而非算法层面)。

鉴于这种可能的商品化路径,这些层面的公司有两种可能的路径可以追求:

  1. 第一条路径是增强他们的产品,以跨层运作,最近的并购活动就是一个例证——Snowflake(数据平台层的数据仓库公司)最近收购了 Neeva以增强其搜索能力,并可能解锁 LLMs 在企业中的应用,Databricks(数据平台层的分析平台)收购了 MosaicML(在 AI 算法层面)以使*“生成式 AI 对每个组织可及,使他们能够利用自己的数据构建、拥有和保护生成式 AI 模型”*。

  2. 第二条路径是向应用层发展——ChatGPT 就是一个经典例子。OpenAI 在 AI 算法层面上表现强劲,但随着消费者产品的推出,他们现在是几十年来第一个真正与谷歌搜索竞争的对手。

未来从 AI 和 LLMs 中解锁的大多数价值将位于应用层面,包括通过创办新初创公司所创造的价值,这将我们引向 Y Combinator。

Y Combinator(YC)的运作方式

简要介绍一下 YC,然后我们会进入趋势部分。大多数 YC 公司处于非常早期阶段——52%的批次的公司仅凭一个想法被接受,77%的批次在 YC 之前没有任何收入。

YC 非常挑剔(接受率低于 2%),但主要依靠规模运作:

  • 他们在 2023 年投资了 300 多家公司,分为两个批次,在 2022 年投资了 600 多家公司。

  • 公司获得一个标准交易(125,000 美元资金换取 7%的股权)。

  • YC 为初创公司提供了大量的指导以及对包括 YC 校友、投资者等在内的大型网络的访问。

  • 因此,为了成功,YC 只需要几个巨大的成功(类似于任何天使投资),并且一些校友已经取得了极大的成功

总之——YC 是一个很好的“代表性”列表,展示了早期阶段初创公司市场的现状以及刚起步的初创公司利用 AI 的机会。接下来,我们将深入探讨大趋势。

AI 初创公司趋势

1. 专注于特定问题和客户

初创公司正针对特定问题和客户群体,即“通用” AI 解决方案变得越来越少。

一个这样的例子是 Yuma.ai,它专注于帮助那些在处理客户请求和问题时遇到困难的 Shopify 商家(你可以在这里查看演示)。通过利用大型语言模型(LLMs),Yuma.ai 自动生成来自知识库的回复。另一个名为 Speedy 的初创公司致力于支持缺乏时间使用生成 AI 创建营销内容的小型和中型企业(SMBs)。Haven 旨在为物业经理自动化约 50% 的居民互动。OfOne 目标是大型快餐店,帮助它们自动化点餐过程并提高盈利能力。

在所有这些例子中,关注的都是狭窄的问题空间和客户,并在此背景下应用 LLM。

2. 与现有软件的集成

除了仅仅使用 GPT / LLM 并通过 UI 进行展示外,一些初创公司还进一步整合了他们客户已经使用的现有软件。

一个典型的例子是 Lightski,它专注于与客户关系管理(CRM)软件如 Salesforce 集成。他们的目标是让客户通过 Slack 发送自然语言消息来更新 CRM,从而省去浏览用户界面的需要。Yuma.ai 提供一键安装功能,将 LLM 的强大功能与客户自己的知识库结合,生成服务代理的草拟回复。

这些集成已成为解锁新用例的主要驱动力,而这些用例是开箱即用的 LLM 应用如 ChatGPT 无法轻易解决的。

3. 与其他 AI 技术结合利用 LLM

初创公司正在探索通过结合计算机视觉和预测等其他 AI 技术,与 LLM 一起创建差异化的产品。

一个这样的例子是 Automat,其客户提供他们希望自动化的重复 Chrome 过程的视频演示。Automat 然后利用应用于屏幕录制的计算机视觉技术,以及人类自然语言输入来创建所需的自动化。另一个名为 Persana AI 的初创公司则利用 CRM 数据集成和公开数据来预测销售团队的潜在热点线索。他们接着使用 LLM 起草个性化的外发消息给每个识别出的线索,利用有关个人的可用自定义数据(你可以在 这里 查看演示)。

结合多种技术正在帮助这些初创公司创建护城河,并与通用的 LLM 应用程序区分开来。

4. LLM 的定制化

许多初创公司提供基于用户过去数据和语言风格的定制选项,以定制客户使用的 LLM 模型。

例如,Speedy,一个帮助中小型企业生成营销内容的平台,与他们的客户进行品牌研讨会。从这些研讨会中获得的见解被输入到他们的模型中,使 Speedy 能够捕捉并融入每个业务的独特声音和品牌身份到生成的内容中。类似地,Yuma.ai 专注于从以前的帮助台票据中学习写作风格。通过分析这些互动中的模式和语言,Yuma.ai 能够生成符合既定风格的草稿回应,确保客户沟通的一致性和个性化。

5. 创意用户界面

初创公司开始利用的一个被低估的杠杆是构建独特且有用的用户界面,而大多数当前的 LLM 产品(如 chatGPT,Bard)在这方面表现不佳。这些界面,当定制为特定用例时,可以为客户解锁大量新价值,并吸引更多尚未采纳现有产品的用户,因为这些产品难以使用。

Type 是一个有趣的例子——他们构建了一个灵活且快速的文档编辑器,允许用户在编写时通过按 cmd + k 快速调用强大的 AI 命令。Type 的 AI 理解文档的上下文,并随着你写作的增加而调整建议,学习你的风格(你可以在这里查看演示)。

另外几个有趣的例子包括 Lightski 将 Slack 用作更新 CRM 信息的接口,以及 Persana AI 使用 Chrome 扩展程序以便在个人的 LinkedIn 页面上轻松访问外发草稿。

高信息量、高精度用例

这一批初创公司中有一些专注于特定用例,这些用例既需要处理大量信息,又要求对发现的见解具有高度的精确性。

SPRX 直接从你的工资单和会计系统中获取数据,以计算符合 IRS 要求的准确 R&D 信贷。

在医疗保健领域,Fairway Health 利用大型语言模型(LLMs)提高了原本相当手动的流程效率——分析长篇医疗记录以评估患者是否符合某种治疗的资格。这帮助保险公司变得更加高效,并为消费者创造了更少挫败感的体验(你可以在这里查看演示)。

AiFlow 使用 LLMs 从数百份文档分析中提取报价和数据,以帮助私募股权公司进行尽职调查。

数据孤岛化,BYOD 产品用于企业客户

与消费者不同,企业希望控制他们的数据如何被使用和与公司共享,包括 AI 软件的提供商。企业在整合来自不同来源的数据并将其带入内部方面投入了大量精力(这篇文章合作伙伴集成 + 智能系统:今天最深的护城河由同为 Medium 作者的Phani Vuyyuru深入探讨了这一战略)。因此,他们对放弃数据控制的动机较小。他们希望在一个可以将自己的数据(BYOD)带入基线产品并在一个隔离的环境中定制产品的框架下操作。

CodeComplete的想法最初出现是在他们的创始人在 Meta 使用 GitHub Copilot 时,他们的请求因数据隐私考虑在内部被拒绝。CodeComplete 现在是一个 AI 编码助手工具,经过微调以适应客户自己的代码库,提供更相关的建议,这些模型直接部署在客户的本地或自己的云端。

类似地,AlphaWatch AI,一个为对冲基金提供的 AI 副驾驶,帮助客户使用自定义的 LLM,这些 LLM 利用了外部数据源和安全的私人数据。

护城河风险

看到大量 AI 初创公司涌现确实令人兴奋,这有助于个人消费者和组织提高效率。这些产品无疑将在解决问题的生产力和有效性方面带来巨大的解锁。

然而,这些初创公司面临的一个关键风险是可能缺乏长期护城河。鉴于这些初创公司的阶段和有限的公开信息,很难过多地解读,但不难指出其长期防御性的漏洞。例如:

  • 如果一个初创公司基于使用像 GPT 这样的基础 LLM,构建到帮助台软件中的集成以理解知识库和写作风格,然后生成草稿回复,那么是什么阻止一个帮助台软件巨头(比如 Zendesk,Salesforce)复制这个功能,并将其作为他们产品套件的一部分提供?

  • 如果一个初创公司正在为文本编辑器构建一个有助于内容生成的酷炫界面,是什么阻止了已经在试验自动草稿的 Google Docs 和已经在试验 Copilot 工具的 Microsoft Word 去复制它?更进一步,是什么阻止他们提供一个效果差 25%的产品,并与现有产品套件一起免费赠送(例如,Microsoft Teams 接管 Slack 的市场份额)?

那些没有护城河的公司仍然可以在当前形式下取得成功,它们的业务性质使它们成为具有吸引力的收购目标,无论是从功能扩展还是从人才角度来看。然而,对于那些希望将早期想法转化为巨大成功的初创公司来说,建立护城河至关重要。

一种明确的方法是构建一个完整的产品,以解决一个问题领域,并且广泛使用 AI 作为其功能的一部分(而不是仅仅在现有问题领域上增加的 AI 产品)。

例如, Pair AI 专注于帮助创作者以类似 Tiktok 的格式构建更具吸引力的课程,并在其产品中包含一些 AI 功能(如对话式问答)。 KURUKURU 正在构建一个用于创建漫画的 3D 引擎,并且在角色创建方面有一些 AI 功能。

另一种方法是通过利用一些上述趋势(如数据集成、BYOD 模型、支持自定义、与其他 AI 技术结合)来增强产品功能(将 AI 功能扩展为更广泛的产品),从而解决问题领域。

这是一个快速发展的市场,我们距离看到这些初创公司如何发展的结果还有一段距离——看看它们在未来几年如何发展将会很有趣。祝 YC 的 W23 批次好运!

感谢阅读!喜欢这篇文章吗?请考虑订阅 我的每周 Substack 通讯 我每周发布一篇关于当前科技和商业话题的深入分析,阅读时间大约为 10 分钟。你也可以在 Twitter 上关注我 @viggybala。祝好,Viggy。

[## Unpacked | Viggy Balagopalakrishnan | Substack

对当前科技和商业话题的深入分析,将帮助你保持领先。每周送到你的邮箱…

thisisunpacked.substack.com](https://thisisunpacked.substack.com/?source=post_page-----282efc9080ae--------------------------------)

AI 电话 — 多模态模型的对决

原文:towardsdatascience.com/ai-telephone-a-battle-of-multimodal-models-282b01daf044?source=collection_archive---------5-----------------------#2023-06-15

DALL-E2、Stable Diffusion、BLIP 等!

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

·

关注 发表在 Towards Data Science · 14 min 阅读 · 2023 年 6 月 15 日

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

AI 电话游戏的艺术渲染图。图像由作者使用 DALL-E2 生成。

生成式 AI 现在正处于火热阶段。特别是过去几个月,多模态机器学习的爆炸性增长——AI 连接了不同“模态”如文本、图像和音频的概念。例如,Midjourney 是一个多模态文本到图像模型,因为它接受自然语言输入,并输出图像。最近多模态协同的巅峰之作是 Meta AI 的 ImageBind,它可以接受 6 种(!) 类型的输入,并将它们表示在相同的“空间”中。

鉴于所有这些兴奋,我想测试多模态模型,看看它们 实际上 有多好。特别是,我想回答三个问题:

  1. 哪种文本到图像的模型最好?

  2. 哪种图像到文本的模型最好?

  3. 什么更重要——图像到文本,还是文本到图像?

当然,每个模型都有其自身的偏见,从训练数据到模型架构,所以实际上并没有一个最好的模型。但我们仍然可以在一般背景下测试模型!

为了回答这些问题,我决定玩一个 AI 电话游戏,灵感来自于我们全家都喜欢一起玩的棋盘游戏 Telestrations

Telestrations 非常类似于 电话游戏:玩家们围成一个圈,接收来自一侧的人的信息,并将他们的解释传达给另一侧的人。随着游戏的进行,原始信息通常会被改变,甚至完全丧失。然而,Telestrations 的不同之处在于加入了双模态通信:玩家在绘制(或 插图)描述和用文本描述之间交替进行。

鉴于我对 比较 模型更感兴趣,我调整了游戏以适应这一目的。

这是 AI 电话游戏的工作方式:

  1. 每个“游戏”将配对一个图像到文本(I2T)模型和一个文本到图像(T2I)模型

  2. 给定一个初始提示,我们使用 T2I 模型生成一个图像。

  3. 然后我们将这个图像传入 I2T 模型以生成描述。

  4. 我们重复步骤 2 和 3 固定次数 n(在我们的案例中 n=10)。

  5. 最后,我们量化原始提示与最终描述之间的差异。

在这篇文章中,我将带你经历整个过程,这样你也可以玩 AI 电话游戏!最后,我会回答三个激励性的问题。

注意:这个 AI 电话游戏与 循环一致性的概念密切相关。通过在训练过程中在损失函数中加入循环一致性项,可以有效地促使模型最小化电话游戏中的退化现象。据我所知,本实验中考虑的所有模型在训练时并未将循环一致性作为考虑因素。

文章的结构如下:

  1. 选择多模态模型

  2. 生成提示

  3. 创建电话线路

  4. 进行对话

  5. 可视化和分析结果

运行这个实验和玩 AI 电话游戏的所有代码可以在 这里 找到。

要运行这段代码,你需要安装用于数据集策划的 FiftyOne 开源库OpenAI Python 库Replicate Python 客户端

pip install fiftyone openai replicate

DALL-E2 和 BLIP 之间的 AI 电话游戏中的图像进展。

选择竞争者

多模态模型的领域非常庞大:截至撰写时,仅 Hugging Face 就有 4,425 个 T2I 模型和 155 个 I2T 模型。用所有这些模型——甚至是其中一个不可忽视的部分——进行 AI 电话游戏是完全不可行的。我的第一任务是将这些潜在候选者缩减到一个更可管理的竞争者集合。

选择 API

在开始这个项目时,我知道自己将使用许多模型。一些潜在的模型非常大,许多模型需要各自的环境和独特的要求。鉴于我计划将每个 T2I 模型与每个 I2T 模型配对,本地安装这些模型进行 AI 电话游戏会带来潜在的依赖地狱——尤其是因为我使用的是 MacBook Pro M1!

为了绕过这个问题,我决定坚持使用可以通过 API 访问的模型。特别是,我选择了主要使用 Replicate,其简单的接口允许我以即插即用的方式使用 T2I 和 I2T 模型。我使用的几乎每个模型都是开源的,所以如果你比我更勇敢,可以在本地运行这些模型并避免费用。也就是说,总的来说,这个实验花费了不到 15 美元。

文本到图像模型

在选择 T2I 模型时,我从 Replicate 的 Text to image 集合中进行挑选。我的选择标准是模型需要便宜、快速且相对受欢迎(通过 Replicate 上模型的“运行”次数来判断)。此外,模型需要是 通用的,意味着我不会考虑图像扩展、标志生成或动漫风格模型。如果你愿意,完全可以尝试使用这些类型的模型进行 AI 电话游戏!

根据这些要求,我选择了 Stable DiffusionFeed forward VQGAN CLIP。最初,我也尝试了 DALL-E Mini,但在早期测试中对模型的表现感到失望,因此我将模型更换为 OpenAI 的 DALL-E2,通过 OpenAI 的 图像生成端点进行访问。

作为一个附带说明,限制我的关注范围到 API 可访问的模型意味着我没有考虑 Midjourney。没有官方 API,我不想使用非官方 API,也不想逐个在 Discord 中输入提示并一一下载生成的图像。

为了使这个过程尽可能即插即用,我采取了面向对象的方法。我定义了一个基本的 Text2Image 类,暴露了一个 generate_image(text) 方法:

import replicate

class Text2Image(object):
    """Wrapper for a Text2Image model."""
    def __init__(self):
        self.name = None
        self.model_name = None

    def generate_image(self, text):
        response = replicate.run(self.model_name, input={"prompt": text})
        if type(response) == list:
            response = response[0]
        return response

对于 Replicate 模型,只需要设置 model_name 属性,以在 Replicate 上识别模型。例如,对于 Stable Diffusion,类定义如下:

class StableDiffusion(Text2Image):
    """Wrapper for a StableDiffusion model."""
    def __init__(self):
        self.name = "stable-diffusion"
        self.model_name = "stability-ai/stable-diffusion:27b93a2413e7f36cd83da926f3656280b2931564ff050bf9575f1fdf9bcd7478"

对于其他模型,如 DALL-E2,generate_image(text) 方法可以被重载:

import openai
class DALLE2(Text2Image):
    """Wrapper for a DALL-E 2 model."""
    def __init__(self):
        self.name = "dalle-2"

    def generate_image(self, text):
        response = openai.Image.create(
            prompt=text,
            n=1,
            size="512x512"
        )
        return response['data'][0]['url']

这些 T2I 模型中的每一个都会返回生成的图像的 URL,然后我们可以将其直接传递给我们的 I2T 模型。

图像到文本模型

我遵循了类似的过程来确定 I2T 竞争者,评估了 Replicate 的 Image to text 收藏中的候选模型。在查看了收藏中所有模型的示例后,有六个模型脱颖而出:BLIPBLIP-2CLIP prefix captioningFine-grained Image Captioning with CLIP RewardmPLUG-OwlMiniGPT-4。其他模型也很吸引人,比如 CLIP Interrogator,它试图反向工程一个提示,然后你可以用来生成类似的图像。但就 AI 电话而言,这感觉有点像作弊!

在尝试这六个 I2T 候选模型时,我能够迅速淘汰两个模型:BLIP-2 生成的响应总是过短,不够实用,而 CLIP Caption Reward 模型生成的响应往往不连贯。

与 T2I 模型直接类比,我定义了一个基本的 Image2Text 类,暴露了一个 generate_text(image_url) 方法:

class Image2Text(object):
    """Wrapper for an Image2Text model."""
    def __init__(self):
        self.name = None
        self.model_name = None
        self.task_description = "Write a detailed description of this image."

    def generate_text(self, image_url):
        response = replicate.run(
            self.model_name, 
            input={
                "image": image_url,
                "prompt": self.task_description,
                }
            )
        return response 

然后,我为每个模型创建了子类。下面是 BLIP 子类的样子:

class BLIP(Image2Text):
    """Wrapper for a BLIP model."""
    def __init__(self):
        super().__init__()
        self.name = "blip"
        self.model_name = "salesforce/blip:2e1dddc8621f72155f24cf2e0adbde548458d3cab9f00c0139eea840d0ac4746"

所有模型都使用相同的任务描述进行实例化——“写一个关于这张图片的详细描述”。

在 DALL-E2 和 mPLUG-Owl 之间的 AI 电话游戏中的图像进展。

提示

为了尽可能“科学”,我认为最好不要自己生成初始提示。相反,(仅仅为了好玩)我将任务外包给了 ChatGPT。我问:

I'm playing a game of telephone using text-to-image and image-to-text AI models. 
I want to evaluate these models based on their ability to retain complex semantic
information over the course of long conversations. Your job is to give me 10 text
prompts that I can use to run these games of telephone. You must give me one 3 
easy, 3 medium, 3 hard, and 1 ultra-hard prompt

我正在使用文本到图像和图像到文本的 AI 模型进行电话游戏。我希望根据这些模型在长时间对话中保持复杂语义信息的能力进行评估。你的任务是给我 10 个文本提示,我可以用来运行这些电话游戏。你必须给我 3 个简单的、3 个中等的、3 个困难的和 1 个超难(“不可能”)的提示。

这里是一些 ChatGPT 生成的提示:

Easy:

"A red apple sitting on a wooden table with sunlight streaming in from a window."

Medium:

"An astronaut floating in the International Space Station, looking out at Earth through the window, with a space capsule docked in the background."

Hard:

"A bustling marketplace in an ancient Middle Eastern city. Traders haggling over spices and silks, camels carrying goods, the sun setting behind a mosque with a crescent moon visible."

Impossible:

"A panoramic scene of an advanced alien civilization on a distant exoplanet. Interstellar vehicles flying in an indigo sky above towering crystalline structures. Aliens with varying physical features are interacting, engaging in activities like exchanging energy orbs, communicating through light patterns, and tending to exotic, bio-luminescent flora. The planet’s twin moons are visible in the horizon over a glistening alien ocean."

更严格的科学方法会对所使用的提示以及它们的分类更加用心。

我将 ChatGPT 生成的文本提示转化为Prompt对象,其中包含提示的文本,以及 ChatGPT 分配的“难度”级别:

class Prompt(object):
    def __init__(self, text, level):
        self.text = text
        self.level = level

levels = ["easy", "medium", "hard", "impossible"]
level_prompts = [easy_texts, medium_texts, hard_texts, impossible_texts]

def get_prompts():
    prompts = []
    for level, texts in zip(levels, level_prompts):
        for text in texts:
            prompts.append(Prompt(text, level))
    return prompts

AI 电话游戏中 VQGAN-CLIP 与 MiniGPT-4 之间图像的进展。

电话线

玩 AI 电话游戏的最后一个组件是“电话线”本身。我创建了一个TelephoneLine类来封装 T2I 模型和 I2T 模型之间的连接。给定一条电话线,通过调用play(prompt, nturns=10)来进行“游戏”,对话从prompt开始,并进行nturns轮回合。

import os
import hashlib
import fiftyone as fo
from fiftyone import ViewField as F

class TelephoneLine(object):
    """Class for playing telephone with AI."""
    def __init__(self, t2i, i2t):
        self.t2i = t2i
        self.i2t = i2t
        self.name = f"{t2i.name}_{i2t.name}"
        self.conversations = {}

    def get_conversation_name(self, text):
        full_name = f"{self.name}{text}"
        hashed_name = hashlib.md5(full_name.encode())
        return hashed_name.hexdigest()[:6]

    def play(self, prompt, nturns = 10):
        """Play a game of telephone."""
        print(f"Connecting {self.t2i.name} <-> {self.i2t.name} with prompt: {prompt.text[:20]}...")
        texts = [prompt.text]
        image_urls = []

        for _ in range(nturns):
            image_url = self.t2i.generate_image(texts[-1])
            text = self.i2t.generate_text(image_url)
            texts.append(text)
            image_urls.append(image_url)

        conversation_name = self.get_conversation_name(prompt.text)
        self.conversations[conversation_name] = {
            "texts": texts,
            "image_urls": image_urls,
            "level": prompt.level
        }

对于每个进行的游戏,使用唯一名称记录对话,该名称由 T2I 模型名称、I2T 模型名称和提示文本(get_conversation_name()方法)哈希生成。

我还为该类配备了一个save_conversations_to_dataset()方法,该方法将所有游戏中的图像和描述保存到 FiftyOne Dataset中:

 def save_conversations_to_dataset(self, dataset):
        """Save conversations to a dataset."""
        for conversation_name in self.conversations.keys():
            conversation = self.conversations[conversation_name]
            prompt = conversation["texts"][0]
            level = conversation["level"]
            image_urls = conversation["image_urls"]
            texts = conversation["texts"]

            for i in range(len(image_urls)):
                filename = f"{conversation_name}_{i}.jpg"
                filepath = os.path.join(IMAGES_DIR, filename)
                download_image(image_urls[i], filepath)

                sample = fo.Sample(
                    filepath = filepath,
                    conversation_name = conversation_name,
                    prompt = prompt,
                    level = level,
                    t2i_model = self.t2i.name,
                    i2t_model = self.i2t.name,
                    step_number = i,
                    text_before = texts[i],
                    text_after = texts[i+1]
                )

                dataset.add_sample(sample)

AI 电话游戏中 Stable Diffusion 与 CLIP Prefix Captioning 之间图像的进展。

进行对话

所有构建模块到位后,玩 AI 电话游戏简直是小菜一碟!

我们可以实例化 T2I 和 I2T 模型:

## Image2Text models
mplug_owl = MPLUGOwl()
blip = BLIP()
clip_prefix = CLIPPrefix()
mini_gpt4 = MiniGPT4()
image2text_models = [mplug_owl, blip, clip_prefix, mini_gpt4]

## Text2Image models
vqgan_clip = VQGANCLIP()
sd = StableDiffusion()
dalle2 = DALLE2()
text2image_models = [sd, dalle2, vqgan_clip]

然后为每对创建一条电话线:

combos = [(t2i, i2t) for t2i in text2image_models for i2t in image2text_models]
lines = [TelephoneLine(*combo) for combo in combos]

然后我们加载我们的提示:

prompts = get_prompts()

并创建一个 FiftyOne Dataset,我们将用来存储生成的图像以及来自对话的所有相关信息:

import fiftyone as fo

dataset = fo.Dataset(name = 'telephone', persistent=True)
dataset.add_sample_field("conversation_name", fo.StringField)
dataset.add_sample_field("prompt", fo.StringField)
dataset.add_sample_field("level", fo.StringField)
dataset.add_sample_field("t2i_model", fo.StringField)
dataset.add_sample_field("i2t_model", fo.StringField)
dataset.add_sample_field("step_number", fo.IntField)
dataset.add_sample_field("text_before", fo.StringField)
dataset.add_sample_field("text_after", fo.StringField)

然后我们可以运行所有 120 场电话游戏:

from tqdm import tqdm

for line in tqdm(lines):
    for prompt in prompts:
        line.play(prompt, nturns = 10)
    line.save_conversations_to_dataset(dataset)

session = fo.launch_app(dataset)

在 FiftyOne 应用程序中,点击菜单栏中的分割图标,以对话为单位对图像进行分组,从下拉菜单中选择conversation_name,然后将选择器切换到ordered并选择step_number

结果和结论

为了评估对话的质量——纯粹是从最终描述的意义与初始提示的意义的接近程度来看,我决定生成提示和描述的嵌入,并计算两个之间的余弦距离(在[0, 2]范围内)。

from scipy.spatial.distance import cosine as cosine_distance

对于嵌入模型,我希望选择一个能够同时嵌入文本和图像的模型,以适应该任务的多模态特性。最终,我选择了使用 ImageBind,原因有三:

  1. 其他流行的联合图像-文本嵌入模型如 CLIP 和 BLIP 与我在实验中使用的一些模型(BLIP 和 CLIP prefix captioning)有关,我希望避免使用相同类型模型进行评估带来的任何潜在偏差。

  2. 许多文本嵌入模型有一个较小的 max_token_count——即允许在文本中嵌入的最大标记数。例如,CLIP 的 max_token_count=77。我们的一些描述明显比这长。幸运的是,ImageBind 具有更长的最大标记数。

  3. 我一直想尝试 ImageBind,这正是一个绝佳的机会!

我将 Replicate 的 ImageBind API 封装在一个函数 embed_text(text) 中:

MODEL_NAME = "daanelson/imagebind:0383f62e173dc821ec52663ed22a076d9c970549c209666ac3db181618b7a304"
def embed_text(text):
    response = replicate.run(
        MODEL_NAME,
        input={
            "text_input": text,
             "modality": "text"
            }
    )
    return np.array(response)

为了避免冗余计算,我对提示进行了哈希处理,并将提示嵌入存储在字典中。这样,我们只需为每个提示嵌入一次,而不是为每个 12 条电话线路的每个提示嵌入:

import hashlib
def hash_prompt(prompt):
    return hashlib.md5(prompt.encode()).hexdigest()[:6]

### Embed initial prompts
prompt_embeddings = {}
dataset.add_sample_field("prompt_hash", fo.StringField)

## Group samples by initial prompt
## Add hash to all samples in group
prompt_groups = dataset.group_by("prompt")
for pg in prompt_groups.iter_dynamic_groups():
    prompt = pg.first().prompt
    hash = hash_prompt(prompt)
    prompt_embeddings[hash] = embed_text(prompt)
    view = pg.set_field("prompt_hash", hash)
    view.save("prompt_hash")

然后我们可以按对话名称对样本进行分组,迭代这些组,计算每一步的文本嵌入,并记录文本嵌入与初始提示嵌入之间的余弦距离(距离越小越好!):

dataset.add_sample_field("text_after_dist", fo.FloatField)

prompt_groups = dataset.group_by("conversation_name")
for cg in conversation_groups.iter_dynamic_groups(progress=True):
    hash = cg.first().prompt_hash
    prompt_embedding = prompt_embeddings[hash]

    ordered_samples = cg.sort_by("step_number")
    for sample in ordered_samples.iter_samples(autosave=True):
        text_embedding = embed_text(sample.text_after)
        sample["text_embedding"] = text_embedding        
        sample.text_after_dist = cosine_distance(
            prompt_embedding,
            text_embedding
        )

然后,我计算了每个 T2I-I2T 对在特定难度级别下的平均分数,并绘制了结果。在每个视频中,I2T 和 T2I 模型被打印在生成的图像上,以及用于生成该图像的文本(红色),以及从该图像生成的描述(绿色)。

简单

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

对于简单的提示,性能往往最依赖于文本到图像模型。DALL-E2 和 Stable Diffusion 显著优于 VQGAN-CLIP。MiniGPT-4 是这两个顶级表现对中的成员。

以下是上面介绍的简单提示的一些示例:

简单提示的 AI 电话,包括文本到图像和图像到文本模型对。

在使用 MiniGPT-4 的游戏中(以及在稍微小一点程度上的 BLIP),苹果始终保持在中心,而对于涉及 CLIP Prefix 的游戏,苹果随着时间的推移逐渐被淘汰。

中等

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

当提示变得稍微困难时,情况开始发生变化。

中等难度提示的 AI 电话,包括文本到图像和图像到文本模型对。

对于几乎所有的游戏,主题在第四或第五步左右发生变化。早期,MiniGPT-4 具有优势。但到游戏结束时,这种优势似乎完全丧失了。

困难

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

当提示变得具有挑战性时,我们开始看到有趣的现象:在早期步骤中,图像到文本模型最为重要(MiniGPT-4 最佳,CLIP Prefix 通常最差)。但在后期阶段,文本到图像模型变得最为重要。更复杂的是,VQGAN-CLIP 在这里表现最佳!

有人可能担心“更好”只是意味着保持一致性,而没有准确表示原始概念。然而,当我们查看例子时,可以看到情况并非如此。

AI 电话对于一个困难的提示,涉及成对的文本到图像和图像到文本模型。

以视频中突出显示的例子为例,其中最初的提示是上述“繁忙市场”的“困难”提示。虽然 VQGAN-CLIP 生成的图像无疑是颗粒状的,但主题仍然可以辨认出来,并且与原始提示相当接近。

不可能

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

不出所料,我们的竞争对手在这里表现得都不太好。有人可能会争辩说 VQGAN-CLIP 是赢家。但在大多数情况下,这一切只是噪音。在视频中,即使是涉及 VQGAN-CLIP 的游戏,主题也基本上无法识别。

AI 电话对于一个“无法完成”的提示,涉及成对的文本到图像和图像到文本模型。

要点

这次探索远非科学;我只查看了十个提示,没有真正验证它们的难度。我仅将对话进行到十轮往返步骤;而且我只在一个指标上评估了性能。

很明显,哪种 T2I 和 I2T 模型表现最佳在很大程度上取决于提示的复杂性,以及你希望模型对话保持多长时间。然而,值得注意几个关键观察点:

  1. VQGAN-CLIP 对于更具挑战性的提示可能表现更好,但这并不意味着它是一个更好的 T2I 模型。VQGAN-CLIP 生成的图像通常远不如 Stable Diffusion 或 DALL-E2 生成的图像那样连贯和全球一致。

  2. 上述分析全部关于语义相似性——它没有考虑风格。这些图像的风格在 AI 电话游戏过程中可能会变化很多。根据我的经验,I2T 模型如 mPLUG-Owl 的风格更一致,因为它们提供了长描述,而像 BLIP 这样的模型风格则更多地集中在特定主题上。

  3. 到了大约五六轮迭代时,游戏大多数已经收敛到稳定的平衡状态。

  4. 尽管嵌入模型 ImageBind 是多模态的,但连续图像嵌入和文本嵌入之间的距离远大于连续图像或连续描述之间的距离。一般来说,它们遵循相同的趋势,但不那么明显,这也是我没有在图中包含这些的原因。

我希望这能激励你进行自己的生成 AI 实验——无论你是在玩 AI 电话,还是做其他完全不同的事情!

如果你尝试这个变体并获得有趣的结果,请在这个帖子下评论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值