KAN:它为什么以及如何工作?深入探讨
我们能通过 KAN 发现新的物理学吗?
https://saptashwa.medium.com/?source=post_page---byline--1adab4837fa3--------------------------------https://towardsdatascience.com/?source=post_page---byline--1adab4837fa3-------------------------------- Saptashwa Bhattacharyya
·发表于 Towards Data Science ·阅读时长 13 分钟·2024 年 5 月 10 日
–
神经网络能发现新的物理学吗?(由作者使用 DALLE-2 生成)
上周,在我们参加的一个 AI 与物理学会议(EuCAIFCon)上,很多讨论围绕基础模型展开,讨论是否有可能通过 AI 发现潜在的新物理定律,结果不出所料:最近有一篇关于 KAN 的论文¹在 arXiv 上发表,讨论了通过神经网络发现/重新发现物理学和数学模型的可能性。
我在周末有时间阅读了这篇令人着迷的论文的一部分,接下来我们将深入探讨构建 KAN 的数学、公式和背后的思想。我们还将安装 KAN,检查 MIT 研究人员在论文中展示的许多令人惊叹的结果之一。
我们将详细了解数学符号和概念,以便理解为什么这个网络引起了如此大的轰动!
让我们开始吧。
KA 表示定理:
KAN 或 Kolmogorov-Arnold 网络是基于著名数学家 Kolmogorov 和 Arnold 的表示定理。因此,首先让我们回顾一下这个定理。
KA 定理是由这些数学家提出,用于研究 Hilbert 的第十三问题:David Hilbert 提出有必要…
保持梯度流动
优化稀疏神经网络:理解梯度流动以加速训练、提高效率,并在深度学习模型中提升性能
https://medium.com/@cristianleo120?source=post_page---byline--5b9bf0098e3d--------------------------------https://towardsdatascience.com/?source=post_page---byline--5b9bf0098e3d-------------------------------- Cristian Leo
·发布于 Towards Data Science ·22 分钟阅读·2024 年 10 月 9 日
–
人工智能图像生成,展示了神经网络中梯度流动的情况
近年来,人工智能领域一直痴迷于构建越来越大的神经网络,认为更高的复杂度会带来更好的性能。的确,这一方法已经取得了令人难以置信的成果,带来了图像识别、语言翻译以及其他许多领域的突破。
但这里有个问题。就像一个庞大且过于复杂的机器既昂贵又难以维护一样,这些巨大的神经网络也需要大量的计算资源和时间来训练。它们可能训练得很慢,需要大量的内存和计算能力,这使得在资源有限的设备上部署它们变得具有挑战性。此外,它们往往更容易“记住”训练数据,而不是真正理解潜在的模式,从而在未见数据上的表现较差。
稀疏神经网络在一定程度上解决了上述问题。可以将稀疏神经网络看作是经典神经网络的精简版。它们小心地移除不必要的部分和连接,从而形成一个更高效、更加精简的模型,同时仍保持其强大的能力。它们能够更快地训练,需求更少的内存,而且通常更具鲁棒性……
使用 DVC 的实验追踪功能来跟踪你的回测
图片由 Midjourney 生成
本教程第四部分,讲解如何使用 DVC 进行实验追踪,这次是时间序列预测
https://eryk-lewinson.medium.com/?source=post_page---byline--38977cbba4a9--------------------------------https://towardsdatascience.com/?source=post_page---byline--38977cbba4a9-------------------------------- Eryk Lewinson
·发布于 Towards Data Science ·阅读时长 11 分钟·2024 年 1 月 5 日
–
在本系列的前几部分中,我演示了如何使用 DVC 进行实验追踪。只需稍微多一点努力,你就可以停止在纸上或电子表格中记录实验结果了。
你可以在下面找到本系列的前几部分:
-
第一部分: 将 VS Code 打造成机器学习实验的一站式商店
-
第二部分: 通过实时图表提升你的机器学习实验工作流
-
第三部分: DVC 实验追踪的极简主义指南
在前几部分中,我们看到了一些分类问题的实验追踪示例。在时间序列预测中,我们使用不同的方法来验证模型。因此,我们可能还需要追踪更多关于回测的元数据,并保存多个聚合组的得分。
在我上一篇关于回测的文章中 回顾你的预测模型:回测指南,我创建了一个自定义类,使我能够轻松评估我的预测模型。然后,我在 Jupyter Notebook 中运行了多个回测,并将结果存储在一个大的字典中。尽管这种方法…
让你的 AI 代理保持受控:跟踪、指标和日志的入门指南
了解如何实现指标、日志和集中监控,以保持你的 AI 代理稳健且准备好投入生产
https://medium.com/@CVxTz?source=post_page---byline--a731b57b8658--------------------------------https://towardsdatascience.com/?source=post_page---byline--a731b57b8658-------------------------------- Youness Mansar
·发表于Towards Data Science ·10 分钟阅读·2024 年 11 月 14 日
–
图片来自Rostyslav Savchyn提供,Unsplash
构建 AI 代理是一个令人兴奋的挑战,但仅仅部署它们并不足以确保为用户提供顺畅、稳定的体验。一旦部署,AI 应用程序需要有效的监控和日志记录来保持其最佳运行状态。没有适当的可观察性工具,问题可能未被发现,即使是小的 bug 也可能演变成重大生产问题。
在本指南中,我们将带你了解如何为你的 AI 代理设置监控和日志记录,以便你能完全掌握其行为和性能。我们将探讨如何收集必要的指标,收集日志,并将这些数据集中在一个平台上。在本教程结束时,你将拥有一个基础设置,能够及早发现、诊断和解决问题,从而确保 AI 应用程序更加稳定和响应迅速。
完整代码可在这里获取:github.com/CVxTz/opentelemetry-langgraph-langchain-example
介绍关键工具:OpenTelemetry、New Relic 和 LangGraph
Keras 3.0 教程:端到端深度学习项目指南
从头实现一个编码器-解码器递归网络
https://qtalen.medium.com/?source=post_page---byline--3552187e3ff5--------------------------------https://towardsdatascience.com/?source=post_page---byline--3552187e3ff5-------------------------------- Peng Qian
·发布于 Towards Data Science ·12 分钟阅读·2024 年 5 月 18 日
–
Keras 3.0 教程:端到端深度学习项目指南。图片由作者提供
介绍
尽管我在一段时间前就开始使用 Pytorch,但我仍然怀念 Keras 简洁的代码风格,以及那段你可以用几行代码就实现一个神经网络模型的美好时光。
所以,当 Keras 在去年 11 月宣布除了 TensorFlow 之外,它现在还支持 Pytorch 和 Jax 作为后端时,我感到非常兴奋!
然而,事情并不完美:由于 Keras 3.0 是最近发布的,相关的教程和文档还没有赶上,我在代码迁移过程中遇到了一些问题。
幸运的是,在一些努力之后,我现在可以顺利使用 3.0 版本进行各种端到端的模型开发。
在这篇文章中,我将分享一些使用 Keras 3.0 的实际经验,帮助你避免一些弯路。我将使用一个典型的编码器-解码器递归神经网络作为例子,解释如何使用 Keras 3.0 的子类化 API 从零开始完成一个端到端的项目,并讨论在使用 Pytorch 作为后端时需要考虑的细节。
让我们开始吧。
框架安装与环境设置
KernelSHAP 在预测变量相关时可能产生误导
一个具体的案例研究
https://medium.com/@vanillaxiangshuyang?source=post_page---byline--9f64108f7cfb--------------------------------https://towardsdatascience.com/?source=post_page---byline--9f64108f7cfb-------------------------------- Shuyang Xiang
·发表于Towards Data Science ·阅读时长:7 分钟·2024 年 8 月 9 日
–
“像许多其他基于置换的解释方法一样,Shapley 值方法在特征相关时会遭遇不现实数据实例的引入。为了模拟一个特征值在一个联合体中缺失的情况,我们对该特征进行边际化处理……当特征之间存在依赖关系时,我们可能会抽取一些对于当前实例来说不合理的特征值。”—— 可解释机器学习书籍。
SHAP(Shapley 加性解释)值旨在根据合作博弈论中的 Shapley 值概念,公平地分配每个特征对机器学习模型预测的贡献。Shapley 值框架具有几个理想的理论属性,并且原则上可以处理任何预测模型。然而,SHAP 值可能会产生误导,特别是在使用 KernelSHAP 方法进行近似时。当预测变量之间存在相关性时,这些近似值可能会不准确,甚至可能有相反的符号。
在这篇博客文章中,我将展示原始的 SHAP 值如何与SHAP 框架的近似值有显著差异,尤其是 KernelSHAP,并讨论这些差异背后的原因。
案例研究:客户流失率
考虑一个场景,我们旨在预测一个办公楼租赁的流失率,基于两个关键因素:入住率和报告问题的比例。
占用率对流失率有显著影响。例如,如果占用率过低,租户可能会因为办公室未被充分利用而离开。相反,如果占用率过高,租户可能会因为拥挤而离开,寻求更好的选择。
此外,我们假设报告问题的比率与占用率高度相关,具体而言,报告问题的比率是占用率的平方。
我们将流失率函数定义如下:
作者提供的图像:流失率函数
该函数对于这两个变量的表示可以通过以下插图表示:
作者提供的图像:关于两个变量的流失
原始 SHAP 与 Kernel SHAP 之间的差异
使用 Kernel SHAP 计算的 SHAP 值
我们将使用以下代码计算预测变量的 SHAP 值:
# Define the dataframe
churn_df=pd.DataFrame(
{
"occupancy_rate":occupancy_rates,
"reported_problem_rate": reported_problem_rates,
"churn_rate":churn_rates,
}
)
X=churn_df.drop(["churn_rate"],axis=1)
y=churn_df["churn_rate"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = 42)
# append one speical point
X_test=pd.concat(objs=[X_test, pd.DataFrame({"occupancy_rate":[0.8], "reported_problem_rate":[0.64]})])
# Define the prediction
def predict_fn(data):
occupancy_rates = data[:, 0]
reported_problem_rates = data[:, 1]
churn_rate= C_base +C_churn*(C_occ* occupancy_rates-reported_problem_rates-0.6)**2 +C_problem*reported_problem_rates
return churn_rate
# Create the SHAP KernelExplainer using the correct prediction function
background_data = shap.sample(X_train,100)
explainer = shap.KernelExplainer(predict_fn, background_data)
shap_values = explainer(X_test)
上面的代码执行以下任务:
-
数据准备:创建一个名为
churn_df的 DataFrame,包含occupancy_rate、reported_problem_rate和churn_rate列。然后从中创建变量和目标(churn_rate),并将数据拆分为训练集和测试集,训练集占 80%,测试集占 20%。注意,测试集X_test中添加了一个具有特定occupancy_rate和reported_problem_rate值的数据点。 -
预测函数定义:定义了一个函数
predict_fn,使用涉及预定义常量的特定公式计算流失率。 -
SHAP 分析:使用预测函数和来自
X_train的background_data样本初始化一个 SHAPKernelExplainer。然后使用explainer计算X_test的 SHAP 值。
下面,您可以看到一个总结性的 SHAP 条形图,表示X_test的平均 SHAP 值:
作者提供的图像:平均 SHAP 值
特别地,我们看到在数据点(0.8,0.64)处,两个特征的 SHAP 值分别为 0.10 和-0.03,如下图所示的力图所示:
作者提供的图像:单一数据点的力图
原始定义的 SHAP 值
让我们退后一步,根据 SHAP 的原始定义逐步计算确切的 SHAP 值。SHAP 值的一般公式如下所示:
其中:S 是所有特征索引的子集,排除 i,|S|是子集 S 的大小,M 是特征的总数,f(XS∪{xi})是包含 xi 的 S 的特征所评估的函数,而 f(XS)是 S 中缺少 xi 时评估的函数。
现在,让我们计算两个特征的 SHAP 值:占用率(表示为 x1)和报告问题率(表示为 x2),它们在数据点(0.8,0.64)处的值。回想一下,x1 和 x2 之间的关系是 x1 = x2²。
我们得到了数据点处占用率的 SHAP 值:
同样地,对于报告问题率这一特征:
首先,让我们计算数据点处占用率的 SHAP 值:
-
第一项是当 X1 固定为 0.8 且 X2 在其分布上取平均时模型输出的期望值。由于 x1 = x2²的关系,这一期望值导致模型在特定点(0.8, 0.64)处的输出。
-
第二项是模型输出的无条件期望值,其中 X1 和 X2 都在其分布上取平均。可以通过对背景数据集中的所有数据点的输出进行平均来计算这一期望值。
-
第三项是模型在特定点(0.8, 0.64)处的输出。
-
最后一项是当 X1 在其分布上取平均时,给定 X2 固定在特定点 0.64 时模型输出的期望值。同样,考虑到 x1 = x2²的关系,这一期望值与模型在(0.8, 0.64)处的输出相符,类似于第一步。
因此,从原始定义计算的两个特征——占用率和报告问题率在数据点(0.8, 0.64)处的 SHAP 值分别为-0.0375 和-0.0375,这与 Kernel SHAP 给出的值有很大不同。
差异从何而来?
SHAP 值差异的原因
如你所注意到的,两种方法之间的差异主要出现在第二步和第四步,这两步需要计算条件期望。这涉及到在 X1 被固定为 0.8 时,计算模型输出的期望值。
-
精确 SHAP:在计算精确的 SHAP 值时,特征之间的依赖关系(例如我们示例中的 x1=x_2²)被显式考虑。这通过考虑特征交互如何影响模型输出,确保了准确的计算。
-
Kernel SHAP:默认情况下,Kernel SHAP 假设特征之间是独立的,这在特征实际上是相关的情况下会导致不准确的 SHAP 值。根据论文A Unified Approach to Interpreting Model Predictions,这一假设是一个简化。在实际应用中,特征通常是相关的,这使得在使用 Kernel SHAP 时很难获得准确的近似值。
来自论文的截图
潜在的解决方案
不幸的是,基于原始定义直接计算 SHAP 值可能会非常耗费计算资源。以下是一些可供考虑的替代方法:
TreeSHAP
-
专门为树模型(如随机森林和梯度提升机)设计的 TreeSHAP 高效地计算 SHAP 值,同时有效管理特征依赖关系。
-
该方法针对树集成进行了优化,使其比传统的 SHAP 计算更快且更具可扩展性。
-
在 SHAP 框架中使用 TreeSHAP 时,设置参数
feature_perturbation = "interventional"以准确考虑特征之间的依赖性。
扩展 Kernel SHAP 以处理依赖特征
-
为了解决特征之间的依赖性,本文扩展了 Kernel SHAP。一个方法是假设特征向量服从多元高斯分布。在这种方法中:
-
条件分布被建模为多元高斯分布。
-
样本是通过使用来自训练数据的估计,从这些条件高斯分布中生成的。
-
该近似中的积分是基于这些样本计算的。
-
该方法假设特征服从多元高斯分布,但在实际场景中,特征可能展现出不同的依赖结构,因此该假设并不总是适用。
提升 Kernel SHAP 的准确性
- 描述:通过确保用于近似的背景数据集能够代表实际数据分布且特征独立,从而提高 Kernel SHAP 的准确性。
通过使用这些方法,您可以解决计算 SHAP 值时遇到的挑战,并提高它们在实际应用中的准确性。然而,需要注意的是,没有一种解决方案可以在所有场景中都适用。
结论
在这篇博文中,我们探讨了尽管 SHAP 值具有强大的理论基础并且在各种预测模型中具有广泛的适用性,但当预测变量之间存在相关性时,特别是在采用类似 KernelSHAP 这样的近似方法时,SHAP 值可能会出现准确性问题。理解这些局限性对于有效地解释 SHAP 值至关重要。通过识别潜在的差异并选择最合适的近似方法,我们可以在模型中实现更准确可靠的特征归因。
教授 AI 智能体记忆的关键洞察
关于基于对 Autogen“可教智能体”实验的记忆能力构建建议
https://medium.com/@sandibesen?source=post_page---byline--c23deffe7f1a--------------------------------https://towardsdatascience.com/?source=post_page---byline--c23deffe7f1a-------------------------------- Sandi Besen
·发表于 Towards Data Science ·阅读时间:16 分钟·2024 年 9 月 10 日
–
记忆无疑正成为智能体 AI(Agentic AI)中的一个关键组成部分。随着 AI 智能体应用场景的复杂化,这些智能体需要从过去的经验中学习,利用存储的特定业务知识,并根据累积的信息适应不断变化的场景。
在我之前的文章“AI 中的记忆:关键好处与投资考量”中,我探讨了记忆为何对 AI 至关重要,讨论了它在回忆、推理和持续学习中的作用。然而,本文将直接深入记忆的实施,通过在流行智能体框架Autogen中考察其“可教性”功能来分析其影响。
注意*😗 尽管本文具有技术性,但它对技术专业人士和希望评估记忆在智能体 AI 系统中作用的商业领袖同样具有价值。我已将其结构化,以便读者可以跳过代码部分,依然能够理解记忆如何增强 AI 系统的响应。如果你不想深入跟随代码,你可以阅读每个步骤的描述,了解过程的概况……或者直接阅读主要发现与建议部分。
来源:Dalle3 ,提示作者:Sandi Besen
主要发现与建议
我对 Autogen 的可教智能体进行的探索揭示了它们在处理简单和复杂记忆任务时的潜力与局限性。
初步使用时,Autogen 的可教学代理的表现不如预期。该代理的推理能力将记忆混合在一起,产生了低效的结果,而且其内建的检索机制没有设置为适应回答复杂问题所需的多步搜索。这一局限性表明,如果你想使用 Autogen 的可教学代理,必须进行大量定制,以补充推理能力并实现更复杂的记忆检索。
为了构建更强大的记忆能力,实施多步搜索功能至关重要。单一的记忆搜索通常无法提供完成复杂任务所需的全面信息。实施一系列互相关联的搜索可以显著增强代理收集和综合相关信息的能力。
“可教学性”功能虽然强大,但应谨慎使用。持续激活而没有监督会导致数据污染并危及可信信息源。商业领袖和解决方案架构师应考虑实施“人类在环”方法,让用户批准系统学习的内容,而不是将每一个推断视为系统应学习的真实事实。Autogen 当前的可教学代理设计中的这种监督缺失可能会带来与不受控制学习相关的重大风险。
最后,从知识库中进行记忆检索的方法在系统的有效性中起着重要作用。超越简单的最近邻搜索(这是 TeachableAgent 的默认方式),采用更先进的技术,如混合搜索(结合关键词和向量方法),语义搜索或知识图谱的使用,可以显著提高检索信息的相关性和准确性。
描述性代码实现
为了恰当地演示外部记忆如何发挥作用,我为一家汽车零部件制造厂创建了一个虚拟场景。按照下面的代码自行实现一个可教学代理。
场景:一家汽车零部件制造厂需要制定一个应急计划,以应对可能出现的能源限制。该计划需要灵活,并根据工厂能够使用的电力消耗量以及哪些零部件和型号的需求来调整。
步骤 1:
预先设置要求如果你的环境中没有安装 autogen,需要通过 pip 安装 autogen,并创建一个配置 JSON 文件。
一个兼容的配置文件示例,使用 Azure OpenAI 的服务模型 GPT4–o:
[{
"model": "gpt-4o",
"api_key": "<YOUR API KEY>",
"azure_endpoint": "<YOUR ENDPOINT>",
"api_type": "azure",
"api_version": "2024-06-01"
}]
安装 Autogen for python:
pip install pyautogen
步骤 2:
将必要的库导入到你的笔记本或文件中,并加载配置文件。
import autogen
from autogen.agentchat.contrib.capabilities.teachability import Teachability
from autogen import ConversableAgent, UserProxyAgent
config_list = autogen.config_list_from_json(
env_or_file="autogenconfig.json", #the json file name that stores the config
file_location=".", #this means the file is in the same directory
filter_dict={
"model": ["gpt-4o"], #select a subset of the models in your config
},
)
步骤 3:
创建代理。由于 Autogen 框架的工作方式,我们需要创建两个代理。我们使用一个 UserProxyAgent 来执行任务,并与人类进行互动或替代人类参与(具体取决于所需的人工干预程度)。我们还创建一个 Conversable Agent 作为“可教代理”(Teachable Agent),它旨在与其他代理互动(而非用户)。你可以在这里了解更多关于UserProxyAgents和ConversableAgents的信息。
teachable_agent = ConversableAgent(
name="teachable_agent", # the name can't contain spaces
llm_config={"config_list": config_list, "timeout": 120, "cache_seed": None}, # in this example we disable caching but if it is enabled it caches API requests so that they can be reused when the same request is used
)
user = UserProxyAgent(
name="user",
human_input_mode="ALWAYS", #I want to have full control over the code executed so I am setting human_input_mode to ALWAYS. Other options are NEVER and TERMINATE.
is_termination_msg=lambda x: True if "TERMINATE" in x.get("content") else False, #setting a termination message is VERY important because it tells the agent when to finish.
max_consecutive_auto_reply=0, #we don't need this agent to replies multiple times in a row
code_execution_config={
"use_docker": False
}, # If you are planning on running code look into setting use_docker=True. For this example I am not because then I have to walk through the docker setup, but it is safer than running the code directly.
)
步骤 4:
为了建立基准,让我们在“教导”代理之前和之后,向代理提出相同的问题。我故意展示了不同难度级别的问题,以展示在需要单步与多步记忆检索的任务上的表现。要成功解决复杂的多步问题,检索机制必须从两个不同的记忆中提供信息,作为上下文供负责生成最终回应的语言模型使用。
简单问题:“该设施正面临 40% 的电力短缺。需要优先处理哪些型号?”
复杂的多步问题:“该设施正面临 40% 的电力短缺。请为我提供一份详细的机器停用和保留的机器清单。”
正如预期的那样,回复是通用的,并不特别适用于个别业务。
启用长期记忆之前的回应:
SIMPLE QUESTION RESPONSE
===========================
>>>>>>>> USING AUTO REPLY...
teachable_agent (to user):
To address a power shortage of 30% effectively, it's crucial to prioritize models that are essential to critical operations, safety, and those that have the highest impact on productivity. Here are steps to determine which models to prioritize:
1\. **Identify Essential Systems:** Prioritize systems that are vital for safety, security, and essential operations. These might include:
- Emergency lighting
- Security systems (alarms, surveillance)
- Critical environmental controls (e.g., refrigeration for hazardous materials)
- Communication systems
2\. **Evaluate Impact on Core Operations:** Determine which models are crucial to the facility’s core functions. This can include machinery, servers, or any processes that are indispensable for maintaining productivity and operations.
3\. **Energy Efficiency:** Prioritize models and equipment that are more energy-efficient and can operate within the reduced power capacity.
4\. **Downtime Cost:** Consider the cost of downtime for each model. Prioritize those where downtime would result in significant financial losses or production delays.
Based on these principles, here’s a generic prioritization framework:
1\. **Safety and Security Systems:**
- Emergency Lighting
- Fire Alarms and Sprinkler Systems
- Security Cameras and Sensors
2\. **Critical Operational Systems:**
- Essential Production Machinery (that cannot be shut down without major issues)
- Servers and IT Infrastructure (especially those critical for operations and data integrity)
- HVAC Systems (if necessary for maintaining safe operating conditions)
3\. **Support Systems:**
- Backup Power Systems (uninterruptible power supplies, generators)
- Communication Systems (both internal and external communication)
Ensure that non-essential and high energy-consuming equipment is powered down or scheduled to operate during off-peak hours if possible.
Always re-evaluate periodically to ensure that the power allocation aligns with the dynamic needs of the facility. Communication with key stakeholders regarding priorities and decisions is also essential for smooth operations during a power shortage.
COMPLEX MULTISTEP QUESTION RESPONSE
====================================
>>>>>>>> USING AUTO REPLY...
teachable_agent (to user):
To effectively manage a facility experiencing a 30% power shortage, we need to prioritize essential operations and consider the criticality and energy consumption of each machine. Here is a detailed breakdown:
### Step 1: Identify Essential Operations
1\. **Critical Infrastructure**: Safety systems, security systems, and essential IT infrastructure.
2\. **Production Lines**: Machines involved in the primary production process.
3\. **Support Systems**: HVAC systems, lighting, and other ancillary equipment necessary to maintain a safe working environment.
### Step 2: Categorize Machines by Importance and Energy Consumption
#### A. Essential and High-Energy Machines
1\. **Safety and Security Systems**
- Fire alarms and sprinklers
- Surveillance cameras
- Security access controls
2\. **Primary Production Machines**
- Core production lines
- Central processing units or mainframe servers (for IT-heavy operations)
3\. **Critical Support Systems**
- Emergency lighting
- Essential HVAC systems (for maintaining operation-critical temperature and humidity)
#### B. Non-Essential and High-Energy Machines
1\. **Secondary Production Lines**
- Non-primary or non-critical production lines
- Equipment used for non-essential or ancillary processes
2\. **Supplementary IT Infrastructure**
- Servers used for non-essential operations
- Backup systems that are not in immediate use
3\. **Non-Essential HVAC and Lighting**
- HVAC systems for non-critical areas
- Lighting in non-essential zones
#### C. Non-Essential and Low-Energy Machines
1\. **Office Equipment**
- Computers, printers, and copiers in non-essential offices
2\. **Non-essential Lab or Research Equipment**
- Devices not directly linked to current essential tasks
### Step 3: Prioritize Deactivation
#### Immediate Deactivation
1\. **Non-Essential and High-Energy Machines**
- Secondary production lines
- Non-essential backup servers
2\. **Non-Essential HVAC and Lighting**
- HVAC in non-critical areas
- Non-essential lighting
3\. **Non-Essential Office Equipment**
- Printers, non-essential computers, and copiers
#### Limited Usage
1\. **Essential and High-Energy Machines**
- Operate critical production lines at reduced capacity if possible
- Implement rotational operation schedules for essential processes
2\. **Critical Support Systems**
- Optimize HVAC settings (e.g., raising or lowering set points within acceptable ranges)
- Reduce lighting to minimum safety standards
### Step 4: Implement Energy Conservation Measures
1\. **Optimize Operations**
- Utilize energy-efficient settings
- Implement energy-saving protocols and encourage staff to conserve energy
2\. **Scheduled Downtime**
- Plan for downtime during off-peak hours for essential machinery to balance the load
3\. **Regular Monitoring**
- Monitor energy consumption in real-time to make quick adjustments as needed
### Summary
#### Remain Active:
1\. Safety and security systems
2\. Main production lines
3\. Critical IT infrastructure
4\. Essential HVAC and lighting for operational areas
#### Deactivate or Limit Use:
1\. Non-essential production lines
2\. Redundant IT systems
3\. Non-critical HVAC and lighting
4\. Office equipment in non-essential areas
**Note**: These recommendations should be adjusted based on the specific operational requirements of your facility. Additionally, it could be beneficial to communicate these changes to all staff to ensure compliance and understanding.
提问基准问题的代码:
#simple question
user.initiate_chat(teachable_agent, message="The facility is experiencing a power shortage of 40%. What models need to be prioritized?", clear_history=True)
#multistep complex question
user.initiate_chat(teachable_agent, message="The facility is experiencing a power shortage of 30%. Provide me a detailed breakdown of what machines should be deactivated and which machines should remain active.", clear_history=True)
步骤 5:
创建“教导能力”,然后将其添加到代理中。Teachability 类继承自 AgentCapabiliy 类,基本上允许你向代理添加可定制的功能。
Teachability 类有许多可选参数,可以进一步探索这里。
默认的 Teachability 类是为代理添加长期记忆的一种快速便捷的方法,但在生产环境中使用时,可能需要进行定制化修改,正如在关键发现部分所概述的那样。它涉及将消息发送到一个分析代理(Analyzer Agent),该代理会评估用户消息是否适合存储和检索。分析代理寻找可能适用于未来类似任务的建议,然后总结并将任务与建议的对存储在一个二进制数据库中,作为代理的“记忆”。
teachability = Teachability(
verbosity=0, # 0 for basic info, 1 to add memory operations, 2 for analyzer messages, 3 for memo lists.
reset_db=True, # we want to reset the db because we are creating a new agent so we don't want any existing memories. If we wanted to use an existing memory store we would set this to false.
path_to_db_dir="./tmp/notebook/teachability_db", #this is the default path you can use any path you'd like
recall_threshold=1.5, # Higher numbers allow more (but less relevant) memos to be recalled.
max_num_retrievals=10 #10 is default bu you can set the max number of memos to be retrieved lower or higher
)
teachability.add_to_agent(teachable_agent)
步骤 6:
现在,教导代理(teachable_agent)已经配置完成,我们需要向其提供我们希望代理“学习”(存储到数据库并从中检索)的信息。
根据我们的场景,我希望代理对设施有基本的理解,设施内容包括:
-
制造工厂生产的组件类型
-
组件需要制作的汽车型号类型
-
每个组件使用的机器
此外,我还想提供一些关于设施优先事项的操作性指导,这取决于电力约束的程度。这包括:
-
50%以上能源容量约束情况下的指导
-
25-50%能源容量约束情况下的指导
-
0-25%能源容量约束情况下的指导
business_info = """
# This manufacturing plant manufactures the following vehicle parts:
- Body panels (doors, hoods, fenders, etc.)
- Engine components (pistons, crankshafts, camshafts)
- Transmission parts
- Suspension components (springs, shock absorbers)
- Brake system parts (rotors, calipers, pads)
# This manufactoring plant produces parts for the following models:
- Ford F-150
- Ford Focus
- Ford Explorer
- Ford Mustang
- Ford Escape
- Ford Edge
- Ford Ranger
# Equipment for Specific Automotive Parts and Their Uses
## 1\. Body Panels (doors, hoods, fenders, etc.)
- Stamping presses: Form sheet metal into body panel shapes
- Die sets: Used with stamping presses to create specific panel shapes
- Hydraulic presses: Shape and form metal panels with high pressure
- Robotic welding systems: Automate welding of body panels and structures
- Laser cutting machines: Precisely cut sheet metal for panels
- Sheet metal forming machines: Shape flat sheets into curved or complex forms
- Hemming machines: Fold and crimp edges of panels for strength and safety
- Metal finishing equipment (grinders, sanders): Smooth surfaces and remove imperfections
- Paint booths and spraying systems: Apply paint and protective coatings
- Drying ovens: Cure paint and coatings
- Quality control inspection systems: Check for defects and ensure dimensional accuracy
## 2\. Engine Components (pistons, crankshafts, camshafts)
- CNC machining centers: Mill and drill complex engine parts
- CNC lathes: Create cylindrical parts like pistons and camshafts
- Boring machines: Enlarge and finish cylindrical holes in engine blocks
- Honing machines: Create a fine surface finish on cylinder bores
- Grinding machines: Achieve precise dimensions and smooth surfaces
- EDM equipment: Create complex shapes in hardened materials
- Forging presses: Shape metal for crankshafts and connecting rods
- Die casting machines: Produce engine blocks and cylinder heads
- Heat treatment furnaces: Alter material properties for strength and durability
- Quenching systems: Rapidly cool parts after heat treatment
- Balancing machines: Ensure rotating parts are perfectly balanced
- Coordinate Measuring Machines (CMMs): Verify dimensional accuracy
## 3\. Transmission Parts
- Gear cutting machines: Create precise gear teeth on transmission components
- CNC machining centers: Mill and drill complex transmission housings and parts
- CNC lathes: Produce shafts and other cylindrical components
- Broaching machines: Create internal splines and keyways
- Heat treatment equipment: Harden gears and other components
- Precision grinding machines: Achieve extremely tight tolerances on gear surfaces
- Honing machines: Finish internal bores in transmission housings
- Gear measurement systems: Verify gear geometry and quality
- Assembly lines with robotic systems: Put together transmission components
- Test benches: Evaluate completed transmissions for performance and quality
## 4\. Suspension Components (springs, shock absorbers)
- Coil spring winding machines: Produce coil springs to exact specifications
- Leaf spring forming equipment: Shape and form leaf springs
- Heat treatment furnaces: Strengthen springs and other components
- Shot peening equipment: Increase fatigue strength of springs
- CNC machining centers: Create precision parts for shock absorbers
- Hydraulic cylinder assembly equipment: Assemble shock absorber components
- Gas charging stations: Fill shock absorbers with pressurized gas
- Spring testing machines: Verify spring rates and performance
- Durability test rigs: Simulate real-world conditions to test longevity
## 5\. Brake System Parts (rotors, calipers, pads)
- High-precision CNC lathes: Machine brake rotors to exact specifications
- Grinding machines: Finish rotor surfaces for smoothness
- Die casting machines: Produce caliper bodies
- CNC machining centers: Mill and drill calipers for precise fit
- Precision boring machines: Create accurate cylinder bores in calipers
- Hydraulic press: Compress and form brake pad materials
- Powder coating systems: Apply protective finishes to calipers
- Assembly lines with robotic systems: Put together brake components
- Brake dynamometers: Test brake system performance and durability
"""
business_rules_over50 = """
- The engine components are critical and machinery should be kept online that corresponds to producing these components when capacity constraint is more or equal to 50%: engine components
- Components for the following models should be prioritized when capacity constraint is more or equal to 50%: 1.Ford F-150
"""
business_rules_25to50 = """
- The following components are critical and machinery should be kept online that corresponds to producing these components when capacity constraint is between 25-50%: engine components and transmission parts
- Components for the following models should be prioritized when capacity constraint is between 25-50%: 1.Ford F-150 2.Ford Explorer
"""
business_rules_0to25 = """
- The following components are critical and machinery should be kept online that corresponds to producing these components when capacity constraint is between 0-25%: engine components,transmission parts, Brake System Parts
- Components for the following models should be prioritized when capacity constraint is between 0-25%: 1.Ford F-150 2.Ford Explorer 3.Ford Mustang 4.Ford Focus
"""
user.initiate_chat(teachable_agent, message=business_info, clear_history=True)
user.initiate_chat(teachable_agent, message=business_rules_over50, clear_history=True)
user.initiate_chat(teachable_agent, message=business_rules_25to50, clear_history=True)
user.initiate_chat(teachable_agent, message=business_rules_0to25, clear_history=True)
步骤 7:
现在我们已经将重要信息添加到长期记忆中,让我们再问代理相同的问题,并查看它的回答有什么不同。
简单问题:“设施目前面临 40%的电力短缺。需要优先考虑哪些型号?”
复杂的多步骤问题:“设施目前面临 40%的电力短缺。请提供一份详细的机器停用和应保持活动机器的列表。”
实施长期记忆后的结果:
可教代理能够部分回答简单问题。它在需要优先考虑的汽车型号上是正确的,但提供了关于哪些组件需要包括的额外错误信息。
复杂的多步骤问题未能得到充分解决。它错误地将 0-25%和 25-50%容量限制的两个不同业务指南合并为一个泛化的指南,导致了不准确的回答。此外,它仅提供了每个组件生产中应保持活动或应停用的部分机器列表,遗漏了完整操作协议中的关键细节。这表明从多个独立的记忆源中准确检索和综合信息来回答复杂问题的挑战。
SIMPLE QUESTION RESPONSE
===========================
>>>>>>>> USING AUTO REPLY...
teachable_agent (to user):
Given the facility is experiencing a power shortage of 40%, this falls within the 25-50% capacity constraint range. According to your previously established priorities for such a scenario, the following models and components need to be prioritized:
### Components to Prioritize
- Engine components
- Transmission parts
- Brake System Parts
### Models to Prioritize
1\. Ford F-150
2\. Ford Explorer
You should ensure that the machinery necessary to produce these critical components for the Ford F-150 and Ford Explorer is kept online.
COMPLEX MULTISTEP QUESTION RESPONSE
====================================
>>>>>>>> USING AUTO REPLY...
teachable_agent (to user):
In response to the 40% power shortage, let's create a detailed plan to ensure the most critical machinery remains operational while deactivating less essential ones.
### Critical Prioritization (0-50% capacity constraint):
- **Critical Components**:
- Engine components (pistons, crankshafts, camshafts)
- Transmission parts
- Brake System Parts (rotors, calipers, pads)
- **Prioritized Models**:
- Ford F-150
- Ford Explorer
### Machines to Remain Active:
1\. **Engine Component Machines**:
- Engine Block Milling Machine
- Crankshaft Grinding Machine
- Camshaft Milling Machine
2\. **Transmission Part Machines**:
- Transmission Housing Caster
- Gear Cutting Machine
- Transmission Assembly Line
3\. **Brake System Part Machines**:
- Brake Rotor Casting Machine
- Brake Caliper Milling Machine
- Brake Pad Press
### Machines to Deactivate:
1\. **Body Panel Machines**:
- Door Stamping Machine
- Hood Assembly Machine
- Fender Bending Machine
2\. **Suspension Component Machines**:
- Coil Spring Forming Machine
- Shock Absorber Assembly Line
### Detailed Breakdown:
#### Active Machines:
- **Engine Block Milling Machine**:
- Produces critical engine blocks, essential for Ford F-150 and Ford Explorer.
- **Crankshaft Grinding Machine**:
- Ensures high precision crankshafts; crucial for the performance of Ford F-150 and Ford Explorer.
- **Camshaft Milling Machine**:
- Produces camshafts, necessary for Ford F-150 and Ford Explorer engines.
- **Transmission Housing Caster**:
- Important for casting the housing of transmissions used in Ford F-150 and Ford Explorer.
- **Gear Cutting Machine**:
- Precision gears production, vital for Ford F-150 and Ford Explorer transmissions.
- **Transmission Assembly Line**:
- Assembly of complete transmission units for Ford F-150 and Ford Explorer.
- **Brake Rotor Casting Machine**:
- Produces brake rotors, crucial for the safe braking systems in Ford F-150 and Ford Explorer.
- **Brake Caliper Milling Machine**:
- Machining of brake calipers, essential for Ford F-150 and Ford Explorer.
- **Brake Pad Press**:
- Manufacturing of brake pads, necessary for ensuring braking efficiency in Ford F-150 and Ford Explorer.
#### Deactivated Machines:
- **Door Stamping Machine**:
- While important, body panels like doors are less critical than engine and transmission components under current constraints.
- **Hood Assembly Machine**:
- Deactivating hood assembly to free up power for critical components manufacturing.
- **Fender Bending Machine**:
- Non-critical compared to engine and brake components during a significant power shortage.
- **Coil Spring Forming Machine**:
- Suspension springs are lower priorities under current circumstances.
- **Shock Absorber Assembly Line**:
- Suspension components aren’t critical enough to keep operational during this level of power shortage.
This plan ensures that production focuses on maintaining the critical components needed for primary models, the Ford F-150 and Ford Explorer, thereby maximizing the utility of the remaining power while managing production constraints effectively.
代码:
#simple question
user.initiate_chat(teachable_agent, message="The facility is experiencing a power shortage of 40%. What models need to be prioritized?", clear_history=True)
#multistep complex question
user.initiate_chat(teachable_agent, message="The facility is experiencing a power shortage of 30%. Provide me a detailed breakdown of what machines should be deactivated and which machines should remain active.", clear_history=True)
结论
虽然 Autogen 提供了一个关于具有记忆的 AI 系统的直接介绍,但在有效处理复杂任务方面仍显不足。
在开发具有记忆能力的 AI 代理系统时,请考虑专注于以下关键能力*:*
-
实施多步骤搜索以确保全面和相关的结果。这使得代理能够评估搜索结果的有效性,并利用检索到的信息解决查询的各个方面。此外,考虑使用更先进的检索方法,例如语义搜索、混合搜索或知识图谱,以获得最佳结果。
-
为了限制数据中毒的潜力,制定一个深思熟虑的方法,决定谁可以“教”代理以及何时代理应“学习”。根据业务或开发者设定的指南,还可以利用代理推理来判断是否应由谁将某些内容添加到记忆中。
-
通过添加记忆衰减机制,可以消除检索过时信息的可能性,该机制可判断何时记忆不再相关或何时需要用更新的记忆替换它。
-
对于多智能体系统,涉及群聊或智能体之间的信息共享时,探索各种通信模式。确定传递补充知识的最有效方法,并设定限制以防止信息过载。
注:本文中表达的观点仅代表作者个人意见,并不一定反映其所属单位的观点或政策。
如果你还有问题,或者认为某些内容需要进一步澄清,欢迎在Linkedin给我发私信!我总是乐于进行深思并不断完善我的工作。
机器学习中的欺诈预测项目关键角色
开发欺诈预测的机器学习模型需要哪些角色?
https://medium.com/@ebrahimian.mahsaa?source=post_page---byline--565a01c98274--------------------------------https://towardsdatascience.com/?source=post_page---byline--565a01c98274-------------------------------- Mahsa Ebrahimian
·发布于Towards Data Science ·阅读时间:5 分钟·2024 年 6 月 11 日
–
图片来自Marvin Meyer在Unsplash
在开发工业界的机器学习项目时,数据科学家和机器学习工程师通常是最突出的角色。然而,现实情况是,要交付产品需要集体协作。在上一篇文章中,我们讨论了使用机器学习开发欺诈预测产品的步骤。在本文中,我们将探讨此类项目中的各种角色以及每个角色如何为项目的成功做出贡献。免责声明:并非所有项目都会有与下面列出的确切职务相符的团队或个人;根据公司结构,一个人可能会兼任多个角色并履行多个职能。这里,我根据自己参与不同欺诈预测项目的经验,概述了这个结构。
项目经理
项目经理的角色既关键又充满挑战。他们负责项目的规划和执行。在项目开始时,他们帮助定义计划并根据相关方的要求和技术团队的能力设定截止日期。在项目过程中,他们持续监控进度。如果实际任务或交付情况偏离计划,他们需要及时提出并与团队协调。因此,他们大部分时间都在与不同的团队、高层经理和业务相关方进行沟通。他们工作的两个主要挑战是:
-
技术团队之间的相互依赖:这使得角色充满挑战,因为一个团队的输出(例如,数据工程师负责摄取数据)作为另一个团队的输入(例如,数据科学家使用这些数据)。第一步的任何延迟或变化都会影响到第二步。项目经理虽然通常不具备过多的技术背景,但需要意识到这些变化,并确保团队之间的有效沟通。
-
竞争的业务优先级:业务相关方通常会改变优先级,或者不同团队之间可能会有需要对齐的竞争优先级。项目经理必须应对这些变化,并协调各个团队保持项目的进度。
通过有效管理这些挑战,项目经理在机器学习项目的成功交付中发挥了关键作用。
欺诈分析师
欺诈分析师的领域专业知识和经验对欺诈预测模型的开发和评估至关重要。从项目开始时,他们就提供有关当前欺诈趋势、常见欺诈场景、警示信号以及例外或“绿旗”的见解。数据科学家在特征创建/工程阶段将这些知识融入其中。一旦模型投入生产运行,就需要持续监控以保持或提高性能。在这一阶段,欺诈分析师在识别模型的真阳性或假阳性方面至关重要。此识别可以通过对客户历史的详细调查或通过联系客户确认来进行。欺诈分析师的反馈对于反馈循环过程是不可或缺的。
高层管理(合规、战略、营销等的首席官员)
高层管理者和 C 级高管在机器学习/人工智能欺诈项目的成功中起着至关重要的作用。他们的支持对于消除障碍和在项目战略方向上达成共识至关重要。因此,他们需要定期了解项目的进展,以便根据项目的具体需求支持在必要团队、工具和流程上的投资,并确保适当的资源得到分配。此外,他们还负责确保内部和外部各方对数据隐私及符合行业标准的合规性承担责任。通过培育问责文化并提供清晰的领导,他们帮助确保项目实现目标并与组织的整体战略顺利整合。他们的参与对于解决任何监管问题、管理风险以及推动项目成功实施和长期可持续性至关重要。
数据工程师
数据工程师为我们(数据科学家)提供构建模型所需的数据,这是任何机器学习项目中的关键步骤。他们负责设计和维护数据管道,无论是实时数据流还是数据仓库中的批处理流程。数据工程师从项目开始时就参与其中,识别数据需求、数据来源、处理需求以及数据可访问性的服务水平协议(SLA)要求。
他们构建管道以收集、转换和存储来自不同来源的数据,基本上处理 ETL 过程。他们还管理和维护这些管道,解决可扩展性要求、监控数据质量、优化查询和流程以提高延迟,并降低成本。
数据科学家
从理论上讲,数据科学家创建机器学习算法以预测业务的各种信息。实际上,我们在一天中的工作角色是多种多样的。我们首先识别业务问题,理解数据和可用资源,并定义解决方案,将其转化为技术要求。
数据科学家与数据工程师和 MLOps 工程师紧密合作,以实施解决方案。我们还与业务利益相关者合作,传达结果并获取反馈。模型评估是另一项关键责任,涉及选择合适的指标来评估模型的性能,持续监控和报告其表现,并留意性能的衰退。
持续改进的过程是数据科学家角色的核心,确保模型在时间推移中保持准确性和相关性。
Mlops 工程师
一旦数据工程师和数据科学家构建了数据管道和模型,就该将模型投入生产环境。MLOps 工程师在这一阶段发挥着至关重要的作用,他们弥合了开发和运维之间的鸿沟。在欺诈预测的背景下,时效性至关重要,因为业务需要在欺诈发生之前进行防范,这就要求管道过程在不到一秒钟的时间内完成。因此,MLOps 工程师确保模型能够无缝集成到生产环境中,保持可靠性和可扩展性。MLOps 工程师设计和管理部署模型所需的基础设施,实施持续集成和持续部署(CI/CD)管道,并实时监控模型的性能。他们还负责版本控制、自动化测试和模型重新训练过程,以确保模型保持最新。通过解决这些运营挑战,MLOps 工程师能够实现机器学习模型的顺利高效部署,确保它们为业务提供一致且有价值的结果。
最后一句话!
我们讨论了我在工作经验中识别的角色。这些角色根据项目的不同阶段和每个公司的具体情况有所不同。在我看来,在项目的初期,欺诈分析师、高层管理人员和数据科学家会共同合作,定义战略和需求。数据科学家在识别业务问题方面发挥着重要作用。他们与 MLOps 和工程团队合作,将业务问题转化为技术解决方案。数据工程师需要参与进来,讨论所需的管道开发。一个常见的挑战是,当这些团队之间缺乏沟通时,问题往往会在执行阶段显现出来。这可能会影响时间表和交付物的质量。因此,团队之间的整合度越高,实施和交付就会越顺利。
请在下方评论关于你公司中的角色。你的经验中有什么不同吗?
启动你的数据科学之旅——数据科学家入门指南
启动数据科学职业生涯所需的关键技术技能
https://saankhya.medium.com/?source=post_page---byline--96e5072bd19a--------------------------------https://towardsdatascience.com/?source=post_page---byline--96e5072bd19a-------------------------------- Saankhya Mondal
·发表于Towards Data Science ·15 分钟阅读·2024 年 11 月 6 日
–
你对数据科学感到好奇吗?数学和人工智能让你兴奋吗?你想探索数据科学并计划从事数据科学职业吗?无论你不确定从哪里开始,还是刚刚迈出数据科学的第一步,你都来对地方了。相信我,这份指南将帮助你自信地迈出第一步!
非会员可以点击这里阅读完整文章。
数据科学是最令人兴奋的工作领域之一。它是一个多学科的领域,结合了各种技术和工具来分析复杂的数据集,构建预测模型,并在商业、研究和技术中指导决策。
数据科学应用于多个行业,如金融、医疗、社交媒体、旅游、电子商务、机器人、军事和间谍活动。
使用 GPT 4o 生成的图像
关于数据科学的神话与真相
互联网上有大量关于如何开始数据科学的资料,这也导致了关于数据科学的神话和误解。最重要的两个误解是——
知识增强型代理在互动文本游戏中的应用
用知识增强型 AI 代理革命化互动文本游戏
https://medium.com/@prateekchhikara?source=post_page---byline--359e57da5de3--------------------------------https://towardsdatascience.com/?source=post_page---byline--359e57da5de3-------------------------------- Prateek Chhikara
·发表于Towards Data Science ·阅读时长 12 分钟·2024 年 1 月 10 日
–
简介:
通过自然语言进行交流对机器智能至关重要[9]。计算语言模型(LM)的最新进展使得在有限交互的任务上,如问答和程序化文本理解,取得了显著的性能[10]。认识到互动性是交流的一个关键方面,研究界将目光投向了在互动小说(IF)环境中训练和评估代理,比如基于文本的游戏,这为研究语言模型的推理能力以及人工智能(AI)代理在受限环境中执行多步骤现实任务的潜力提供了独特的测试平台。例如,在图 1 中,代理需要在客厅采摘水果,并将其放入厨房的蓝色盒子中。在这些游戏中,代理通过基于文本的输入在复杂环境中进行导航,这要求 AI 代理对自然语言和战略决策做出深刻理解。要在这些游戏中取得成功,代理必须管理其知识、推理并生成基于语言的行动,从而在游戏世界中产生预期且可预测的变化。
图 1. 互动小说(IF)游戏的示意图,其中一个代理需要完成采摘水果(例如苹果)并将其放入厨房的蓝色盒子中的任务。
背景与动机:
先前的研究表明,基于强化学习和语言模型的代理在 IF 环境中推理或解释科学概念时存在困难[1],这引发了关于这些模型是否能够在训练过程中观察到的情境之外的未知情境中进行泛化的问题[2]。例如,虽然像‘获取已知物质的熔点(或沸点)’这样的任务可能相对简单,但‘在特定环境中确定未知物质的熔点(或沸点)’对这些模型来说却可能具有挑战性。为了提高泛化能力,结合世界知识(例如,关于物体的可用性知识)可能是有效的,但迄今为止没有相关研究探索这一方向。此外,现有模型在从环境反馈中有效学习方面仍然存在困难。例如,在检查特定物质的导电性时,代理必须理解它已经获得了必要的电线和特定物质,才能继续寻找电源。因此,亟需一个框架,能够分析和评估不同类型的知识及其注入方法对基于文本的游戏代理的有效性。
我们的论文《增强知识的交互式文本游戏代理》提出了一种新颖的框架,旨在提升 AI 代理在这些 IF 环境中的表现。
已发布版本: dl.acm.org/doi/10.1145/3587259.3627561
我们很高兴地宣布,我们的论文在 KCAP 2023 会议上获得了最佳学生论文奖,这是我们团队创新研究和奉献精神的体现。🏆🏆🏆
核心创新——知识注入框架:
我们的工作提出了一个独特的框架,旨在增强 AI 代理的特定知识。该框架包含两个关键组件:
-
正确行为的记忆 (MCA): 该特性使得 AI 代理能够记住并利用过去的正确行为。通过保持对过去有效行为的记忆,代理可以制定更有效的策略,避免重复犯错。MCA 由环境反馈决定。如果一个行为获得了奖励,那么它就被认为是正确的。因此,正确的行为不能一开始就直接提供给代理,而是随着代理在(训练/测试时间)回合的进行,逐步存储到记忆中。
-
可用性知识 (Aff): 理解游戏世界中与物体的潜在互动至关重要。我们期望可用性能够通过列出与周围物体的可能互动,帮助模型更好地学习。与历史知识不同,环境并不提供这些可用性信息,而是需要从外部资源中获取。为此,我们使用 ConceptNet,并获取其关于给定 IF 游戏回合中物体的 capableOf 和 usedFor 关系。
我们在两种 AI 代理架构中实现了该框架:
-
通过奖励的在线策略优化 (RL 方法)
-
单步离线预测(LM 方法)
1. 在线策略优化通过奖励(RL 方法)
纯 RL 基础模型 — DRRN 3
基线 DRRN 模型仅使用观察、库存和任务描述的输入来计算每个动作的 Q 值。为了增强 DRRN 基线,我们将外部知识注入到模型中,并创建了 DRRN 的三种新变体:
-
aff: 通过使用一个独特的 GRU 编码层,我们将输入中的物体可用性引入到基线模型中。
-
mca: 在该模型中,使用独立的 GRU 编码层将所有先前正确的动作传递给基线模型。
-
aff ⊕ mca: 该架构的编码由代理的先前正确动作和物体可用性作为独立组件组成。
图 2:DRRN 架构,增强了先前正确动作和物体可用性的记忆。
RL 增强型 KG 模型 — KG-A2C [4] (图 3)
作为基线,我们使用 KG-A2C 的修改版,在该版本中,我们利用环境提供的单一黄金动作序列作为目标,尽管可能存在多个可能的黄金序列。我们发现这个目标的表现优于原始的预测有效动作目标。我们设计了以下知识注入策略来整合
KG-A2C 的正确动作和物体可用性知识记忆:
-
mca: 在基线的基础上,我们将所有先前正确的
动作上,通过使用一个独立的 GRU 编码层并将其与
输出向量与其他输出表示一起。
-
aff: KG-A2C 模型中的 KG 组件为我们提供了一个方便的方式来添加更多知识。特别是,我们直接将物体可用性知识作为附加三元组添加到 KG 中,位于
基线模型。例如,给定 KG 中的现有关系
(客厅,hasA,苹果)我们可以添加物体可用性关系:(苹果,
使用了 For,eating)。通过这种方式,KG 编码网络可以生成
游戏状态的更有意义的表示,并可能
引导模型生成更好的动作。在我们的实验中,我们
将这种方法与使用
独立的 GRU 编码层,类似于 DRRN 的情况。
-
aff ⊕ mca: 我们将 KG 中的物体可用性和所有
先前的修正动作使用独立的 GRU 编码层。
图 3:集成了物体可用性和先前正确动作的 KG-A2C 模型架构。
2. 单步离线预测(LM 方法)
预训练语言模型 — RoBERTa 5
在这里,我们将任务视为多选题问答。在每一步,当前的游戏状态被视为问题,模型必须从候选动作集合中预测下一个动作。类似于强化学习(RL)智能体,模型在每一步都会接收到环境观察(𝑜𝑏𝑣)、库存(𝑖𝑛𝑣)和任务描述(𝑑𝑒𝑠𝑐)。然后,我们将其与每个动作拼接在一起,让语言模型选择得分最高的动作。由于可能的动作集合非常庞大,在训练过程中我们仅随机选择𝑛=4 个干扰动作,以减少计算负担,语言模型通过交叉熵损失进行训练,选择正确的动作。在推理时,模型会为所有有效动作分配分数,我们使用 top-p 采样来选择动作,以防止模型陷入动作循环。我们为基准 RoBERTa 模型提出了三种知识注入策略。
-
mca: 在这里,我们通过将过去的正确动作列出为一个字符串并附加到原始输入中,使得语言模型(LM)能够意识到自己的过去正确动作。由于 RoBERTa 的 token 限制,我们使用一个大小为𝐴=5 的滑动窗口,即在每一步,模型最多只能看到过去的
𝐴个正确动作。
-
aff: 我们通过首先在一个包含对象效用的常识知识图子集上对语言模型进行适应,向模型注入效用知识。我们通过一个辅助的问答任务来对模型进行适应,遵循之前的知识注入工作[6]。由于效用知识三元组的数量庞大,无法简单地将其拼接到 RoBERTa 的输入中,因此我们使用预训练而非简单拼接输入。通过辅助问答任务对效用进行预训练可以缓解这一挑战,同时仍能使模型学习到相关知识。接着,我们在增强效用的模型基础上对我们的任务模型进行微调,如基准中所述。
-
aff ⊕ mca: 这种变体仅仅是将 mca 和 aff 结合在一起。
图 4:使用干扰项训练的 RoBERTa 架构。
指令调优语言模型 — Flan T5 [7][8](图 5)
Swift 模型本身集成了前十个动作的历史背景。值得注意的是,与之前检查过的三个仅考虑最后十个正确动作历史的模型不同,Swift 模型遵循其原始设计,涵盖了前十个动作的完整历史。为了建立一个可与之前三种架构中应用的方法相比较的基准模型,我们从 Swift 模型中省略了动作历史。未做更改的 Swift 变体在这里被表示为mca版本。此外,将可供性融入基准模型中,形成了aff model。类似地,将可供性融入 mca 版本后,形成了aff ⊕ mca模型。这些可供性被引入主输入序列,紧随库存数据之后,并位于已访问房间信息之前。
图 5:以 Seq2Seq 方式训练的 Swift 架构。
实验设置
环境: 我们使用了 ScienceWorld [1],这是一个基于文本的复杂虚拟世界,呈现为英文。它拥有 10 个互联的地点,并包含 218 个独特的物品,包括各种仪器、电气组件、植物、动物以及家具和书籍等日常物品。游戏提供了丰富的互动,具有 25 种高级动作和每步最多 200,000 种可能的组合,尽管其中只有少数是实际有效的。ScienceWorld 包含 10 个任务,共有 30 个子任务。由于 ScienceWorld 的多样性,每个任务作为一个独立的基准,具有不同的推理能力、知识要求,并且需要完成目标状态的动作数不同。此外,每个子任务都有一组必须完成的目标(例如,专注于一个非生物物体并将其放入厨房的红色盒子中)。为了实验目的,我们从每个任务中选择了一个代表性的子任务。任务细节见附录(文章末尾)。
奖励与评分系统: ScienceWorld 的奖励系统旨在引导智能体朝着优选的解决方案前进。每个动作执行后,环境都会提供一个数值评分和一个布尔指示器,显示任务是否完成。智能体每个回合最多可以执行 100 步(动作)。最终得分介于 0 到 100 之间,反映了智能体在完成回合目标和子目标方面的表现。当智能体完成任务或达到 100 步限制时,回合结束,并计算累计得分。
实验见解:
-
知识注入有助于文本游戏中的智能体——在 40 个案例中的 34 个中,我们的知识注入策略优于基准模型。
-
可用性知识比正确行动的记忆更有益——可用性模型在 15 个案例中获得了最佳结果,其次是包括 MCA(8 个案例)。将这两种知识类型结合在一起在 11 个案例中取得了最佳结果。
-
就任务的整体影响而言,语言模型变体 RoBERTa 和 Swift 从包含可用性知识中获益最大,分别相对于基线提高了 48%和 8%。图 6 中展示了一个例子,说明了语言模型在加入可用性知识后受益匪浅。
图 6:可用性模型在任务 4 中采取的行动。蓝色=步骤索引,绿色=累积得分,黄色=正确的行动。
-
在任务中的变动效果取决于注入知识与任务的相关性——任务中的变动效果通常是由于注入知识与当前任务的相关性,某些任务(例如电力)从知识注入中受益更多。
-
通过知识图谱注入可用性是最有效的;将其作为原始输入加入会增加模型的学习复杂度——我们探索了将可用性知识注入到 KG-A2C 的多种变体(图 7):通过将其作为输入添加到观察、库存和描述中,为可用性创建一个单独的 GRU 编码层,并将可用性添加到知识图谱本身。我们在三个子任务上评估了每种方法的表现:简单、中等和困难。
图 7:在 KG-A2C 中添加可用性的五种方法的效果。
结论性思考:
我们的研究代表了朝着更复杂的 AI 智能体迈出的重要一步。通过赋予它们从过去的行动中学习并深刻理解环境的能力,我们为 AI 铺平了道路,使其能够在各种生活场景中智能、直观地进行游戏和互动。该框架可以扩展到其他 AI 应用,如虚拟助手或教育工具,在这些应用中,理解和与环境互动至关重要。
大型语言模型的少样本提示最近在推理任务中显示出了潜力,同时互动交流和输入澄清也带来了明显的好处。探索它们在互动任务中的作用,无论是作为需要较少训练数据的解决方案,还是作为能够为知识蒸馏生成合成数据的组件,都是一个有前景的未来方向。
如果你喜欢我们的工作,请引用它 😁
@inproceedings{chhikara,
author = {Chhikara, Prateek and Zhang, Jiarui and Ilievski, Filip and Francis, Jonathan and Ma, Kaixin},
title = {Knowledge-Enhanced Agents for Interactive Text Games},
year = {2023},
doi = {10.1145/3587259.3627561},
booktitle = {Proceedings of the 12th Knowledge Capture Conference 2023},
pages = {157–165},
numpages = {9},
series = {K-CAP '23}
}
参考文献
[1] Ruoyao Wang, Peter Alexander Jansen, Marc-Alexandre Côté, 和 Prithviraj Ammanabrolu. 2022. ScienceWorld: 你的智能体比五年级学生更聪明吗?EMNLP(2022)。
[2] Peter Jansen, Kelly J. Smith, Dan Moreno, 和 Huitzilin Ortiz. 2021. 在多跳推理中评估组合性解释的挑战:相关性、完整性和专家评级。EMNLP 会议论文集。
[3] 何吉, 陈建书, 何晓东, 高剑锋, 李丽红, 邓力, 和 Mari Ostendorf. 2016. 基于自然语言行动空间的深度强化学习. 载《ACL 会议论文集》.
[4] Prithviraj Ammanabrolu 和 Matthew Hausknecht. 2020. 图约束强化学习在自然语言行动空间中的应用. 载《ICLR》.
[5] 刘寅涵, Myle Ott, Naman Goyal, 丁菲杜, Mandar Joshi, 陈丹琪, Omer Levy, Mike Lewis, Luke Zettlemoyer, 和 Veselin Stoyanov. 2019. Roberta: 一种稳健优化的 BERT 预训练方法. (2019).
[6] Filip Ilievski, Alessandro Oltramari, 马凯欣, 张斌, Deborah L McGuinness, 和 Pedro Szekely. 2021. 常识知识的维度. 《基于知识的系统》229 (2021), 107347.
[7] 洪亨元, Le Hou, Shayne Longpre, Barret Zoph, Yi Tay, William Fedus, Eric Li, 王学智, Mostafa Dehghani, Siddhartha Brahma 等. 2022. 扩展指令微调语言模型.
[8] 林育辰, Yicheng Fu, Karina Yang, Prithviraj Ammanabrolu, Faeze Brahman, 黄诗雨, Chandra Bhagavatula, 崔烨金, 和 任翔. 2023. SwiftSage: 一个具有快速与慢速思维的生成性智能体,适用于复杂的交互任务。
[9] 诺姆·乔姆斯基 2014. 句法理论的若干方面. 第 11 卷. MIT 出版社.
[10] 江一凡, Filip Ilievski 和 马凯欣. 2023. 跨常识任务传递程序性知识. 载《ECAI》.
附录
任务描述
-
任务 1 — 物质: 你的任务是将水冻结。首先,聚焦在该物质上。接着,采取行动使其发生状态变化。
物质。
-
任务 2 — 测量: 你的任务是测量巧克力的熔点,巧克力位于厨房的某个地方。首先,聚焦在温度计上。接着,聚焦在巧克力上。如果巧克力的熔点高于 -10.0 摄氏度,聚焦在蓝色盒子上。如果巧克力的熔点低于 -10.0 摄氏度,聚焦在橙色盒子上。这些盒子位于厨房的各个地方。
-
任务 3 — 电学: 你的任务是通过可再生能源电源打开红色灯泡。首先,聚焦在红色灯泡上。接着,创建一个电路将其通电。
-
任务 4 — 分类: 你的任务是找到一个非生物物体。首先,聚焦在这个物体上。然后,把它移到厨房的红色盒子里。
-
任务 5 — 生物学 I: 你的任务是从种子中种植一个苹果植物。种子可以在厨房找到。首先,聚焦在一个种子上。然后,改变环境以促进植物生长,直到它达到繁殖生命周期阶段。
-
任务 6 — 化学: 你的任务是利用化学方法制造物质 ‘盐水’。食谱和一些原料可能在厨房附近找到。完成后,聚焦在盐水上。
-
任务 7 — 生物学 II: 你的任务是找到寿命最长的动物,然后是寿命最短的动物。首先,专注于寿命最长的动物。然后,专注于寿命最短的动物。这些动物位于“外部”位置。
-
任务 8 — 生物学 III: 你的任务是专注于海龟的四个生命周期阶段,从最早到最晚。
-
任务 9 — 力学: 你的任务是确定两个倾斜面(未知材料 C,未知材料 H)中哪一个具有最大的摩擦力。
摩擦力。完成实验后,专注于摩擦力最大的倾斜面。
-
任务 10 — 生物学 IV: 你的任务是确定蓝色种子颜色在未知 E 植物中的遗传方式,是显性还是隐性特征。如果该特征是显性的,专注于红色盒子。如果该特征是隐性的,专注于绿色盒子。
ScienceWorld 游戏示例
任务: 4(找到一个非生物物体)
变化: 239(DRRN 基准)
描述: 你的任务是找到一个非生物物体。首先,专注于该物体。然后,将它移到工作坊中的紫色盒子里。
了解 Kolmogorov–Arnold 网络(KAN)
为什么 KAN 有可能成为 MLP 和当前机器学习格局的替代方案?让我们通过论文来一探究竟。
https://medium.com/@itshesamsheikh?source=post_page---byline--e317b1b4d075--------------------------------https://towardsdatascience.com/?source=post_page---byline--e317b1b4d075-------------------------------- Hesam Sheikh
·发表于Towards Data Science ·10 分钟阅读·2024 年 5 月 7 日
–
一篇名为KAN:Kolmogorov–Arnold 网络的新研究论文在机器学习社区中引发了热议。它为神经网络提供了新的视角,并提出了一个可能替代多层感知机(MLP)的方案,MLP 是当前机器学习的基石。
✨这是付费文章。如果你不是 Medium 会员,你可以在我的通讯中免费阅读此文: Qiubyte.
受Kolmogorov-Arnold 表示定理的启发,KAN 与传统的多层感知机(MLP)不同,它通过将固定激活函数替换为可学习的函数,有效地消除了线性权重矩阵的需求。
如果你对更细节的内容和实验感兴趣,我强烈建议阅读这篇论文。不过,如果你更喜欢简洁的介绍,我已经准备了这篇文章来解释 KAN 的核心要点。
- 注:本文中使用的图片/图形来源于“KAN:Kolmogorov–Arnold 网络”论文,除非另有说明。
理论
这些新型网络的理论支柱是一位由两位苏联数学家弗拉基米尔·阿诺德和安德烈·柯尔莫哥洛夫提出的理论。
在安德烈·科尔莫哥洛夫的指导下,阿诺德在 1957 年证明了任何多个变量的连续函数都可以通过有限个二元函数构造出来,从而解决了希尔伯特第十三问题。(来源:维基百科)
他们所研究并最终发展的理论是基于多变量连续函数的概念。根据这个理论,任何多变量连续函数f都可以写成若干个单变量连续函数的有限组合,并将其相加。
科尔莫哥洛夫–阿诺德表示定理的数学公式。(来源:维基百科)
这个定理如何融入机器学习?
在机器学习中,高效且准确地近似复杂函数是一个重要课题,尤其是在数据维度增加时。当前主流模型,如多层感知器(MLP),通常在处理高维数据时存在困难——这一现象被称为维度灾难。
然而,科尔莫哥洛夫-阿诺德定理为构建能够克服这一挑战的网络(如 KAN)提供了理论基础。
MLP 和 KAN 的概述比较。
KAN 如何避免维度灾难?
这个定理允许将复杂的高维函数分解为更简单的单维函数的组合。通过专注于优化这些一维函数,而不是整个多变量空间,KAN 减少了所需的复杂性和参数数量,从而实现了准确建模。此外,由于处理的是更简单的一维函数,KAN 可以成为简单且可解释的模型。
人工智能模型是否正在朝着统一的现实表现形式发展?柏拉图式表现……
towardsdatascience.com
什么是科尔莫哥洛夫–阿诺德网络(KAN)?
Kolmogorov-Arnold 网络(简称 KAN)是一种受 Kolmogorov-Arnold 表示定理启发的神经网络架构。与使用固定激活函数的传统神经网络不同,KAN 使用可学习的激活函数,这些激活函数位于网络的边缘。这使得 KAN 中的每个权重参数都可以由一个单变量函数替代,通常参数化为样条,从而使其具有高度的灵活性,能够用较少的参数建模复杂的函数,并增强可解释性。
KAN 利用 MLP 的结构,同时受益于样条。
KAN 架构
Kolmogorov-Arnold 网络(KAN)的架构围绕着一个新颖的概念展开,即将传统的权重参数替换为网络边缘上的单变量函数参数。KAN 中的每个节点将这些函数的输出求和,而不应用任何非线性变换,这与包括线性变换后跟非线性激活函数的 MLP 相对立。
KAN 与 MLP 公式对比。
B 样条:KAN 的核心
惊人的是,论文中最重要的图形之一竟然容易被忽视。那就是样条的描述。样条是 KAN 学习机制的核心。它们替代了神经网络中通常使用的传统权重参数。
样条结构的详细视图。
样条的灵活性使得它们能够自适应地建模数据中的复杂关系,通过调整其形状以最小化逼近误差,从而增强网络从高维数据集中学习微妙模式的能力。
在 KAN 上下文中,样条的一般公式可以使用 B 样条表示如下:
这里,𝑠pline(𝑥) 代表样条函数。ci 是在训练过程中优化的系数,𝐵𝑖(𝑥) 是在网格上定义的 B 样条基函数。网格点定义了每个基函数 𝐵𝑖 激活并显著影响样条的形状和平滑度的区间。你可以把它们看作是影响网络准确度的超参数。更多的网格意味着更多的控制和精确度,同时也意味着更多的参数需要学习。
通过多个步骤训练一个 KAN。(来源:GitHub)
在训练过程中,这些样条的ci参数(基函数Bi(x) 的系数)会被优化,以最小化损失函数,从而调整样条的形状,使其最适合训练数据。这个优化通常涉及像梯度下降这样的技术,每次迭代更新样条参数,以减少预测误差。
两全其美
虽然 KAN 基于Kolmogorov-Arnold 表示定理,但它同样受到 MLP 的启发,“利用它们各自的优势,避免它们各自的弱点”。KAN 在外部受益于 MLP 的结构,在内部则受益于样条。
结果是,KAN 不仅能够学习特征(得益于其与 MLP 的外部相似性),还能够优化这些学习到的特征,达到极高的准确性(得益于其与样条的内部相似性)。
网络简化
网络符号化概述。
论文接着解释了一些简化网络的方法和我们对它们的理解。我将仅讨论其中两种方法,它们让我感到非常有趣。
-
符号化:KAN 是通过使用更简单、通常可以解释的函数的组合来近似构造函数的。这使得它们具有独特的能力,可以输出可解释的数学公式,如上图所示。
-
剪枝:论文中讨论的 KAN 的另一个方面是通过去除不重要的节点或连接来优化网络架构,尤其是在网络训练后。这一过程有助于减少复杂性和大小。剪枝的重点是识别并消除对输出贡献最小的部分,从而使网络更轻量化,并有可能变得更加可解释。
KAN 是新的吗?
Kolmogorov-Arnold 表示定理并不新鲜,**那么为什么在机器学习中使用它的实践之前没有被研究过呢?**正如论文所解释的,曾经进行过多次尝试……
然而,大多数工作依然停留在原始的深度为 2、宽度为(2n + 1)的表示形式,并没有机会利用更现代的技术(例如反向传播)来训练网络。
KAN 的可视化表示,由 DALLE-3 创建。
该论文的创新之处在于将这一理念适应并应用于当前机器学习的领域。通过使用任意的网络架构(深度、宽度)并采用反向传播和剪枝等技术,KAN 比以往的研究更接近实际应用场景。
Kolmogorov-Arnold 表示定理在机器学习中基本上被宣判为死刑,被认为是理论上健全,但在实践中无用。
尽管已经有尝试将 Kolmogorov-Arnold 表示定理应用于机器学习,但可以公平地说,KAN 是一种新颖的方法,因为它意识到机器学习今天所处的位置。它是对之前在有限规模上探索过的一个想法的很好更新。
4 个迷人的例子
论文对 KAN 和 MLP 在几个标准上的比较,其中大多数都很吸引人。在这一部分,我将列出一些这些有趣的例子。有关这些例子以及更多详细内容,请参见论文。
合适的符号公式
这是训练各种 MLP 和 KAN 以拟合不同输入维度的某些函数的示例。从下图可以看出,与 MLP 相比,KAN 在可扩展性方面有明显优势(至少在这个参数范围内)。
这突显了更深层 KAN 的更强表达能力,这对于 MLP 也是一样的:更深的 MLP 比浅层的有更强的表达能力。
特殊函数
论文中的另一个例子是比较 KAN 和 MLP 在拟合数学和物理中常见的 15 个特殊函数上的表现。结果表明,在几乎所有这些函数中,KAN 在拥有相同参数数量的情况下,比 MLP 具有更低的训练/测试损失。
持续学习
持续学习是指网络在时间推移中如何适应新信息而不忘记先前学到的知识。这是神经网络训练中的一大挑战,尤其是在避免灾难性遗忘的问题上,当获取新知识时,可能会迅速侵蚀先前建立的信息。
KAN 展示了保持已学信息并适应新数据的能力,而不会发生灾难性遗忘,这得益于样条函数的局部性质。与依赖全局激活(可能无意中影响模型远离部分)的 MLP 不同,KAN 每次新样本仅修改有限的相邻样条系数。这种集中调整保护了样条中其他部分已存储的信息。
偏微分方程求解
偏微分方程求解,一个 2 层宽度为 10 的 KAN 比一个 4 层宽度为 100 的 MLP 准确度高 100 倍(10⁻⁷与 10⁻⁵均方误差)且在参数效率上高 100 倍(102 与 104 个参数)。
论文继续展示更多实验。其中之一是将 KAN 应用于几何结不变量问题,使用一个200参数的 KAN 实现了81.6%的测试准确率,而谷歌 DeepMind 的 MLP 模型在~ 3 * 10⁵个参数下取得了**78%**的准确率。这个实验是在
最终思考
KAN 的炒作值得吗?
这取决于你的视角。之所以目前在讨论 KAN,是因为它可能是机器学习(ML)隧道尽头的一线曙光。我在“人工智能遇到无法突破的瓶颈”中讨论了我们如何需要新的创新来引导我们突破机器学习的未来障碍,即数据和计算。虽然不是有意为之,KAN 可能是走出去的一个途径。
KAN 是以人工智能的科学应用为设计初衷的,但现在人们已经开始将它用于混合各种机器学习(ML)模型,包括多头注意力(Multihead Attention)。
更新:你可以阅读我在 MNIST 数据集上训练 KAN 的实验,以测试它在计算机视觉任务中的表现,不要错过👇
KAN + LLM?
论文主要集中在 Kolmogorov-Arnold 网络(KAN)在人工智能 + 科学应用方面的潜力,因为它们能够有效地建模和发现复杂的科学规律和模式。KAN 特别适用于需要理解和解释基础物理原理的任务,因为它们的结构允许将函数分解成符号化的数学表达式。这使得它们非常适合科学研究,在科学研究中发现这种关系至关重要,而不像大规模语言模型(LLM),后者的主要目标通常是处理庞大的数据集,以进行自然语言理解和生成。
作者注释
我鼓励你也阅读 GitHub 页面上的作者注释。它提供了对 KAN 初衷的视角,以及未来可能的发展。
最近我被问到最多的问题是 KAN 是否会成为下一代 LLM。我对此没有很好的直觉。KAN 是为那些注重高准确性和/或可解释性的应用设计的。我们当然关心 LLM 的可解释性,但可解释性对于 LLM 和科学来说可能意味着截然不同的事情。我们是否关心 LLM 的高准确性?我不知道,缩放法则似乎表明是这样,但可能并不需要非常高的精度。另外,准确性对 LLM 和科学来说也有不同的意义。这种微妙的差异使得我们很难将论文中的结论直接应用于 LLM 或一般的机器学习任务。
“KAN: Kolmogorov–Arnold 网络”论文。
结论
在我看来,最好是从 KAN 本身的角度来看待它,而不是从我们希望它成为的角度来看。并不意味着 KAN 不可能与大规模语言模型(LLM)集成,实际上已经有一个高效的PyTorch 实现 KAN。但需要指出的是,现在称 KAN 为 革命性 或 改变游戏规则 还为时过早。KAN 仍然需要社区专家进行更多的实验。
尽管 KAN 在某些特定情境下提供了显著的优势,但它也有一些限制和考虑因素,需要谨慎对待:
-
复杂性与过拟合: KANs 可能会发生过拟合,尤其是在数据有限的情况下。它们构建复杂模型的能力可能会将噪声当作重要模式捕捉,导致泛化能力差。
-
计算: 由于 KAN 的专业化特性,它们可能面临 GPU 优化的挑战,这可能会破坏并行处理。这种架构可能会导致 GPU 上的操作变慢,迫使进行序列化,导致内存使用效率低下,从而可能使得 CPU 成为这些网络的更合适平台。
-
适用性: KANs 主要设计用于科学和工程任务,在这些任务中,理解潜在功能至关重要。它们可能在需要大规模模式识别或分类的领域(例如图像识别或自然语言处理)中效果不如那些更简单或更抽象的模型。
我必须补充,这篇论文真的很棒,读起来非常令人兴奋。跳出框框思考总是很有趣,而 KAN 无疑做到了这一点。
💬 你如何看待 KAN 的潜力?它会专注于科学领域,还是将在我们的日常 AI 产品中发挥重要作用?
🌟 加入 1000+人一起学习
Python🐍,机器学习/MLOps/人工智能🤖,数据科学📈,以及 LLM 🗯
感谢阅读,
— Hesam
Kolmogorov-Arnold Networks(KAN)用于时间序列预测
了解 Kolmogorov-Arnold Networks(KAN),并使用 Python 将其应用于时间序列预测
https://medium.com/@marcopeixeiro?source=post_page---byline--9d49318c3172--------------------------------https://towardsdatascience.com/?source=post_page---byline--9d49318c3172-------------------------------- Marco Peixeiro
·发表于Towards Data Science ·阅读时长 11 分钟·2024 年 5 月 14 日
–
图片由Eduardo Bergen提供,来源于Unsplash
多层感知器(MLP)是深度学习模型的基础结构之一。它也是许多先进预测模型的构建模块,如 N-BEATS、NHiTS 和 TSMixer。
2024 年 4 月 30 日,论文KAN: Kolmogorov-Arnold Network发表,吸引了许多深度学习领域从业者的关注。在这篇论文中,作者提出了一种替代 MLP 的模型:Kolmogorov-Arnold Network,简称KAN。
KAN 不是使用权重和固定的激活函数,而是使用可学习的函数,这些函数通过样条进行参数化。研究人员认为,KAN 可以在参数较少的情况下比 MLP 更加精确。
在这篇文章中,我们首先探索了样条(splines),因为它们帮助我们理解 KAN 的架构和关键元素。然后,我们深入研究 KAN 的内部工作机制。最后,我们将 KAN 应用于时间序列预测,并与标准的 MLP 和 N-BEATS 模型进行性能评估。
要了解更多关于 KAN 的细节,请务必阅读原始论文。
Kolmogorov-Arnold Networks:神经网络领域的最新进展,简明解释
这种新型网络正在机器学习领域掀起波澜。
https://medium.com/@theo.wolf?source=post_page---byline--f083cf994a85--------------------------------https://towardsdatascience.com/?source=post_page---byline--f083cf994a85-------------------------------- Theo Wolf
·发表于Towards Data Science ·9 分钟阅读·2024 年 5 月 12 日
–
MLP 与 KAN 的比较。图片来自论文。
今年四月,一篇名为:KAN: Kolmogorov–Arnold Networks的论文出现在 arXiv 上。宣布这篇论文的推文获得了大约 5 千个点赞,对于论文的宣布来说,这已经算是相当火爆了。附带的GitHub 仓库已经有 7.6k 个星标,并且还在不断增加。
Kolmogorov-Arnold 网络(KAN)是一种全新的神经网络构建模块。它的目标是比多层感知器(MLP)更具表现力、更不容易过拟合,并且更具可解释性。MLP 在深度学习模型中无处不在。例如,我们知道它们被用在像 GPT-2、3 和(可能)4 等模型的 Transformer 块之间。对 MLP 的改进将对机器学习领域产生广泛的影响。
MLP 简述
MLP 实际上是一种非常古老的架构,起源于 50 年代。其思想是复制大脑的结构;有很多……
为什么你不需要 JS 来制作 3D 图表
在 Python 中可视化犯罪地理数据
https://medium.com/@alexroz?source=post_page---byline--498398c25a39--------------------------------https://towardsdatascience.com/?source=post_page---byline--498398c25a39-------------------------------- Aleksei Rozanov
·发布于 Towards Data Science ·6 分钟阅读·2024 年 6 月 1 日
–
图片来自 作者。
在我看来,地理数据最棒的特点之一就是它能够进行 3D 可视化。然而,由于进行此类计算所需的大量计算资源,这在 Python 中是非常罕见的(通常JavaScript及其相关库被用作替代方案)。在我之前的一篇文章中,我分享了六个 Python 包,可以创建美丽的静态和交互式地图,但仅限于 2D 空间。
每个数据科学家都会在某个时刻面临分析或建模地理空间数据的需求,而这无法在没有…
medium.com](https://medium.com/@alexroz/6-python-libraries-to-make-beautiful-maps-9fb9edb28b27?source=post_page-----498398c25a39--------------------------------)
今天,我想弥合这个差距,与大家一起探讨一个非常时尚且高效的框架,用于高性能的基于 Web 的可视化deck.jl,它也有一个 Python 库 PyDeck。
要在 Python 中充分探索其功能,我们需要一个大型的地理空间数据集。一个理想的候选数据集是Kaggle 上的洛杉矶犯罪数据 2010-2020数据集。幸运的是,它具有开放许可证,因此我们可以自由使用它来进行我们的分析。
作者们分发了两个 csv 文件,我们将把它们合并为一个,同时过滤掉所有除了经纬度(即犯罪发生地点的坐标)以外的列。
🐍完整的 Python 代码: GitHub.
import numpy as np
import pandas as pd
import xarray as xr
import geopandas as gpd
import random
import math
import matplotlib.pyplot as plt
from shapely import Point
import cartopy
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import warnings
warnings.filterwarnings('ignore')
recent = pd.read_csv('./LA Crimes/Crime_Data_from_2020_to_Present.csv')[['LAT', 'LON']]
old = pd.read_csv('./LA Crimes/Crime_Data_from_2010_to_2019.csv')[['LAT', 'LON']]
df = pd.concat([old, recent])
df = df[(df.LON!=0) & (df.LAT!=0)] #zeros are Nans according to meta info
在 pandas 中加载数据后,我想使用 cartopy 做一个静态的二维可视化,只是为了有一个可靠的参考。如果我们仅仅绘制数据,我们将得到一堆数据点,对我们没有任何帮助。
图片来源:作者。
相反,让我们使用 NN 方法进行空间插值(你可以在我的另一篇文章中阅读更多关于它的内容)。
从头开始,在 Python 中
[towardsdatascience.com
基本上,这意味着我们将稀疏的观测数据转化为一个地理网格(PyDeck 将做同样的事情,在这种情况下可以称之为数据聚合)。
def coords(x,y, base=0.01):
x, y = round(base * math.ceil(abs(x)/base),2), round(base * math.ceil(y/base),2)
return (y,x)
def NN(data, LAT, LON):
array = np.zeros((LAT.shape[0], LON.shape[0]),dtype=int)
onGrid = data.apply(lambda row: coords(row.LAT, row.LON, 0.01), axis = 1).value_counts()
for coor in onGrid.index:
lon_idx, lat_idx = np.where(LON==coor[0]), np.where(LAT==coor[1])
array[lat_idx,lon_idx] = int(onGrid[coor])
return array
算法完成后(你需要等一段时间,因为我们有超过 200 万行数据要处理),我们可以将其结果包装成 xarray 数据集并进行映射。
LAT, LON = np.arange(round(df.LAT.min()), round(df.LAT.max()), 0.01).astype(np.float32), np.arange(round(df.LON.min()), round(df.LON.max()), 0.01).astype(np.float32)
crimes = NN(df, LAT, LON)
ds = xr.Dataset(
{'Crimes': (['lat', 'lon'], crimes)},
coords={'lat': LAT, 'lon': LON})
fig, ax = plt.subplots(subplot_kw=dict(projection=ccrs.PlateCarree()), figsize=(16, 9))
ds.Crimes.plot(ax=ax, cmap='Reds')
ax.set_extent([-118.9, -118.1, 33.6, 34.5 ], crs=ccrs.PlateCarree())
ax.gridlines(draw_labels=True,linewidth=2, color='black', alpha=0.5, linestyle='--')
ax.add_feature(cfeature.BORDERS, edgecolor='black', linewidth=1)
ax.add_feature(cfeature.COASTLINE, edgecolor='black', linewidth=1)
ax.add_feature(cartopy.feature.RIVERS, edgecolor='blue', linewidth=0.5)
states_provinces = cfeature.NaturalEarthFeature(
category='cultural', name='admin_1_states_provinces',
scale='10m', facecolor='none')
plt.show()
图片来源:作者。
从我的角度来看,它看起来既不错又具有信息量,但如果你需要将这个项目推销给别人,使用这样的地图你很可能会失败 xD。所以,让我们来安装 PyDeck 并看看它能为我们做些什么!
1. 六边形。
我发现最美的地图图层类型是六边形图层。在创建 PyDeck 的 Layer 变量时你需要指定它。对于我们来说,还有一些其他至关重要的参数:
-
半径(六边形的半径,单位米,即空间分辨率,单位为米);
-
elevation_scale(箱体的缩放因子,值越大,六边形越高);
-
elevation_range(最小和最大高度);
-
可选择(交互式显示值);
-
extruded(单元格高度)。
layer = pdk.Layer(
'HexagonLayer',
df,
get_position=['LON', 'LAT'],
radius=500, #bin radius
auto_highlight=True,
elevation_scale=50, #scale factor for bins (the greater - the higher)
elevation_range=[0, 3000],
pickable=True,
extruded=True,#cell elevation
)
我们需要创建的第二个变量是视图状态。我们需要为它提供:
-
经度和纬度;
-
缩放(初始缩放);
-
min_zoom 和 max_zoom;
-
方位角(左/右视角);
-
pitch(上下视角)。
view_state = pdk.ViewState(
longitude=-118.3,
latitude=34.4,
zoom=8,
min_zoom=6,
max_zoom=15,
bearing=-20,#left/right angle
pitch=20, #up/down angle
)
由于我们有一个大数据集,Google Colab 并不会显示全部数据,因此你有两个选择:
-
从数据集中抽取 N 行样本;
-
将地图保存为 HTML 并在浏览器中打开。
如果你选择第二个,你将得到这个:
图片来源:作者。
说实话,我喜欢六边形的外观,但在任何科学论文/报告/讲座中我都没见过它们,所以我建议大家有意识地使用它们。
2. 列
现在让我们尝试创建一个类似的可视化,但是使用柱状图。但在这种情况下,我们需要将之前创建的 xarray 数据集传递给函数,并指定颜色和要可视化的变量:
layer = pdk.Layer(
'ColumnLayer',
ds.to_dataframe().reset_index(),
get_position=['lon', 'lat'],
get_elevation='Crimes',
elevation_scale=10,
radius=200,
get_fill_color=['Crimes', 220],
pickable=True,
extruded=True,
)
图片由作者提供。
3. 散点图
本质上,散点图是由点云组成的,但 PyDeck 的作者们开发了独特的圆柱体,它们看起来非常与众不同:
图片由作者提供。
layer = pdk.Layer(
'ColumnLayer',
df[:15000],
get_position=['LON', 'LAT'],
auto_highlight=True,
get_radius=200, # Radius is given in meters
get_fill_color=[180, 0, 200, 140], # Set an RGBA value for fill
pickable=True)
图片由作者提供。
4. 地图样式
PyDeck 的一个非常酷的特点是,像 plotly、geemap、folium 等交互式映射工具一样,它允许用户更改底图,这意味着你可以根据项目的背景设计地图:
r = pdk.Deck(layers=[layer],
initial_view_state=view_state,
map_style=pdk.map_styles.LIGHT, # ‘light’, ‘dark’, ‘road’, ‘satellite’, ‘dark_no_labels’, and ‘light_no_labels
)
图片由作者提供。
5. 标题
下一个我认为非常有用的特性是改变交互式数据描述。通过将光标放在某个柱状图/六边形/点上,你可以获取元数据信息,但有时看起来有些荒谬。但在 PyDeck 中,你可以轻松克服这一点:
图片由作者提供。
r = pdk.Deck(layers=[layer],
initial_view_state=view_state,
"html": "<b>Number of crimes:</b> {elevationValue}",
"style": {
"backgroundColor": "yellow",
"color": "black"
}
},
)
图片由作者提供。
6. 视角
最后,这个库最惊人的特性就是你可以通过简单地点击鼠标右键来改变地图的视角:
from ipywidgets import HTML
text = HTML(value='Move the viewpoint')
def filter_by_bbox(row, west_lng, east_lng, north_lat, south_lat):
return west_lng < row['lng'] < east_lng and south_lat < row['lat'] < north_lat
def filter_by_viewport(widget_instance, payload):
west_lng, north_lat = payload['data']['nw']
east_lng, south_lat = payload['data']['se']
filtered_df = df[df.apply(lambda row: filter_by_bbox(row, west_lng, east_lng, north_lat, south_lat), axis=1)]
r.deck_widget.on_click(filter_by_viewport)
图片由作者提供。
我确实很喜欢PyDeck,并计划深入了解deck.jl框架。它的语法既简单又直观,能够让用户在保证能效的前提下构建出令人印象深刻的可视化。Python 在一定程度上限制了这个包的功能,所以你可以查看他们的画廊,真的非常震撼,尤其是他们的实验性 GlobalView 功能…
希望这篇文章对你有启发并且信息量十足!
===========================================
我在 Medium 上的所有出版物都是免费且开放获取的,因此如果你能在这里关注我,我将非常感激!
备注:我对(地理)数据科学、机器学习/人工智能以及气候变化充满极大的热情。如果你想一起合作进行某个项目,请通过LinkedIn与我联系。
🛰️关注我,获取更多更新🛰️
Label Studio 定制化后端用于半自动化图像分割标注
定制化后端;GCP 部署;通过 GCS 集成进行数据版本控制
https://medium.com/@AlisonYuhanYao?source=post_page---byline--324c2310d756--------------------------------https://towardsdatascience.com/?source=post_page---byline--324c2310d756-------------------------------- Alison Yuhan Yao
·发表于Towards Data Science ·13 分钟阅读·2024 年 4 月 20 日
–
作者提供的图像
目录
· 介绍
· 概览
∘ 目标
∘ 为什么是半自动化?
∘ 进入 Label Studio
∘ 1 前端 + 2 后端
· 实现(本地)
∘ 1. 安装 git 和 docker 并下载后端代码
∘ 2. 设置前端以获取访问令牌
∘ 3. 设置后端容器
∘ 4. 连接容器
∘ 5. 快乐标注!
· GCP 部署
∘ 1. 选择项目/创建新项目并设置账单账户
∘ 2. 创建虚拟机实例
∘ 3. 设置虚拟机环境
∘ 4. 跟随前一部分,在虚拟机上设置所有内容
· GCS 集成
∘ 1. 设置 GCS 存储桶
∘ 2. 创建并设置服务账户密钥
∘ 3. 重建后端容器
∘ 4. SDK 从源存储桶上传图像
∘ 5. 设置目标存储
· 致谢
· 参考资料
介绍
为图像分割任务创建训练数据仍然是个人和小团队面临的一大挑战。如果你像我一样是学生研究者,找到一种具有成本效益的方法尤其重要。在这篇文章中,我将分享我在我的毕业设计项目中使用的一种解决方案,我们一个 9 人团队在一周内成功标注了 400+张图像。
多亏了米兰理工大学的吉安弗朗科·费雷研究中心,我们从吉安弗朗科·费雷的档案数据库中获取了成千上万张时装 T 台秀的图像。为了探索、管理、丰富和分析这个数据库,我使用了图像分割进行更智能的分类和精细化研究。T 台秀照片的图像分割也为创建信息丰富的文本描述打下了基础,从而提升搜索引擎和文本生成图像 AI 的效果。因此,本文将详细介绍:
-
如何在现有的Segment Anything 后端基础上,使用label studio创建您自己的后端,以便进行半自动化图像分割标注,
-
如何在 Google Cloud Platform 上托管以便进行小组协作,并且
-
如何使用 Google Cloud Storage 存储桶进行数据版本控制。
本文中的代码可以在这个GitHub 仓库找到。
概述
目标
分割并识别 T 台秀图像中时尚服装项目的名称和类型,如第一张图所示。
为什么是半自动化?
如果某个训练好的分割模型能够完美地识别 T 台秀图像中的每一件服装,那该多好?遗憾的是,目前还没有这样的模型。虽然存在针对时尚或服装图像的训练模型,但没有一个能完美匹配我们的数据集。每个时装设计师都有自己对某些服装款式、颜色和纹理的偏好,因此即使一个分割模型的准确率达到 60%,我们也算是胜利了。然后,我们仍然需要人工干预来纠正分割模型的错误。
进入 Label Studio
Label Studio 提供了一个开源、可定制并且免费的社区版本,适用于各种类型的数据标注。用户可以创建自己的后端,以便将 Label Studio 前端与上述提到的训练分割模型后端连接,从而让标注员进一步改进自动预测结果。此外,Label Studio 已经具备了一个界面,类似于 Photoshop,并且拥有一系列分割工具,可以为我们提供很大的帮助:
-
刷子与橡皮擦
-
用于相似颜色像素选择的魔法棒
-
Segment Anything后端,利用Meta 的 SAM的强大功能,允许你识别你绘制的边界框内的物体。
1 个前端 + 2 个后端
到目前为止,我们希望 2 个后端能够与前端连接。一个后端可以进行分割预测,第二个后端可以在预测错误时加速标注员的修改。
图片来自作者
实现(本地)
现在,让我们在本地启动应用程序。也就是说,你可以在笔记本电脑或本地机器上完全免费地使用这个应用程序,但目前无法邀请你的标注团队在他们的笔记本上协作。我们将在下一节中讨论如何与 GCP 进行团队协作。
1. 安装 git 和 docker & 下载后端代码
如果你的笔记本电脑或本地机器上还没有安装git或docker,请先安装它们。(注意:如果你从这个 GitHub 仓库下载了压缩包,理论上可以跳过安装 git 这一步。如果你这么做,请跳过下面的步骤。)
然后,打开你的终端并将这个仓库克隆到你想要的目录。
git clone https://github.com/AlisonYao/label-studio-customized-ml-backend.git
如果你在代码编辑器中打开label-studio-customized-ml-backend文件夹,你会看到大部分代码都改编自Label Studio ML 后端仓库,但这个目录还包含了改编自Label Studio SDK的前端模板代码和 SDK 代码。
2. 设置前端以获取访问令牌
按照segment anything的官方指南,在终端中执行以下操作:
cd label-studio-customized-ml-backend/label_studio_ml/examples/segment_anything_model
docker run -it -p 8080:8080 \
-v $(pwd)/mydata:/label-studio/data \
--env LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED=true \
--env LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/label-studio/data/images \
heartexlabs/label-studio:latest
接着,打开浏览器,输入0.0.0.0:8080/,你将看到 Label Studio 的前端界面。继续使用你的电子邮件地址注册。现在没有项目,所以我们需要通过点击创建项目来创建我们的第一个项目。为你的项目创建一个名称和描述(可选)。
图片来源:作者
本地上传一些图片。(稍后我们将讨论如何使用云存储。)
图片来源:作者
对于标注设置,点击左侧的自定义模板,并从label-studio-customized-ml-backend/label_studio_frontend/view.html文件中复制粘贴 HTML 代码。如果你不想在标注界面显示图像元数据,可以不需要那四行 Header 代码。你可以根据需要修改此代码,或者点击可视化来添加或删除标签。
图片来源:作者
现在,点击保存,你的标注界面应该准备好了。
图片来源:作者
在右上角,点击用户设置图标,然后点击账户与设置,你应该能够复制你的访问令牌。
图片来源:作者
3. 设置后端容器
在label-studio-customized-ml-backend目录中,感谢 Label Studio 开发者,里面有许多后端。我们将使用定制的./segmentation后端进行分割预测(容器 1),以及./label_studio_ml/examples/segment_anything_model进行更快速的标注(容器 2)。前者将使用 7070 端口,后者将使用 9090 端口,这样可以与前端的 8080 端口区分开来。
现在,将你的访问令牌粘贴到./segmentation和./label_studio_ml/examples/segment_anything_model文件夹中的 2 个docker-compose.yml文件中。
environment:
- LABEL_STUDIO_ACCESS_TOKEN=6dca0beafd235521cd9f23d855e223720889f4e1
打开一个新的终端,像之前那样进入segment_anything_model目录,然后启动分割任何物体容器。
cd label-studio-customized-ml-backend/label_studio_ml/examples/segment_anything_model
docker build . -t sam:latest
docker compose up
然后,打开另一个新的终端,进入segmentation目录,并启动分割预测容器。
cd label-studio-customized-ml-backend/segmentation
docker build . -t seg:latest
docker compose up
到目前为止,我们已经成功启动了所有 3 个容器,你可以再次检查确认。
图片来源:作者
4. 连接容器
之前,我们通过访问令牌连接了容器,所以我们已经差不多完成了。现在,去打开你之前启动的前端,并点击右上角的设置。在左侧点击机器学习,然后点击添加模型。
图片来源:作者
确保使用带有 9090 端口的 URL,并启用交互式预标注功能。点击验证并保存完成添加。
同样,执行相同操作来设置分割预测后端。
图片来源:作者
然后,我喜欢启用加载任务时自动获取预测。这样,每次刷新标注页面时,分割预测将会自动触发并加载。
图片来源:作者
5. 快乐标注!
这是按照上述步骤操作后,你应该看到的演示。
视频来源:作者
如果我们不满意预测结果,比如说裙子的部分,我们可以删除裙子并使用紫色魔法(分割任何物体)快速标注。
视频来源:作者
我相信你能自己搞定刷子、橡皮擦和魔法棒的使用!
如果你是单独工作,那就万事俱备。但如果你在考虑如何与团队协作而又不订阅 Label Studio Enterprise,我们需要将一切托管到云端。
GCP 部署
我选择了 GCP,因为有教育信用,但你可以使用任何你喜欢的云平台。关键是将应用托管在云端,这样你标注团队中的任何人都可以访问并使用你的 Label Studio 应用。
图片来源:作者
1. 选择项目/创建新项目并设置账单账户
如果你没有现有项目,可以前往GCP 控制台创建一个新项目,并按要求设置计费账户信息(不幸的是,云服务是收费的)。在这里,我将使用我创建的Fashion项目来演示。
图片来自作者
2. 创建虚拟机实例
为了给标注团队提供公共 IP 地址,我们需要在 GCP 上创建一个虚拟机(VM)并将一切部署到这里。进入你创建或选择的项目后,在搜索框中搜索计算引擎,第一个弹出的选项应该是VM 实例。点击创建实例,根据需要选择设置。
图片来自作者
默认的 10GB 持久磁盘会给你带来问题,所以请增加磁盘空间。另外,更重要的是,允许 HTTP 流量。
图片来自作者
稍后修改这些设置会有点麻烦,所以在点击创建之前,尽量先想清楚。
3. 设置虚拟机环境
你可以将虚拟机想象成云端的某台计算机,类似于你的笔记本电脑,但你只能通过终端或命令行要求它做事。所以现在,我们需要在虚拟机上像在本地一样设置所有内容(请参见上一部分)。
点击 SSH,授权并打开命令行界面。
图片来自作者
进行常规更新,并安装 docker、docker compose、git 和 Python。
sudo apt-get update
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo docker --version
sudo apt-get install docker-compose-plugin
sudo apt install git
sudo apt install python3-pip
图片来自作者
4. 按照上一部分的步骤,在虚拟机上设置所有内容
现在,你可以按照上一部分的步骤 1–4 进行操作,但有一些变化:
-
当你遇到 docker 权限被拒绝错误时,添加sudo。
-
如果遇到数据权限错误,可以使用类似
sudo chmod -R 777 mydata的命令来修改权限。然后你就应该能够运行前端容器了。 -
服务器不再位于
0.0.0.0:8080。相反,将 0.0.0.0 替换为虚拟机的外部 IP 地址。一个例子是34.1.1.87:8080/。你可以在之前点击的SSH按钮旁边找到外部 IP 地址。然而,你可能仍然无法访问前端。你需要在 GCP 控制台搜索防火墙,然后点击防火墙(VPC 网络),接着点击default-allow-http。现在,修改设置如下,你就应该能够访问前端了。
图片来自作者
4. 编辑docker-compose.yml文件时,除了复制粘贴访问令牌,还要修改LABEL_STUDIO_HOST。同样,将host.docker.internal替换为虚拟机的外部 IP 地址。一个例子是34.1.1.87:8080。
5. 同样,当在前端设置中添加机器学习时,也使用34.1.1.87:9090和 http://34.1.1.87:7070。
然后,你可以导出你的标注结果并根据需要进行定制。
如果你只有几张图片需要标注,或者你愿意从本地上传图片,那完全没问题。但对于我的项目,有成千上万张图片,因此我更倾向于使用 Google Cloud Storage 来自动化数据传输和数据版本控制。
GCS 集成
1. 设置 GCS 存储桶
在 GCP 控制台中搜索存储桶并导航到 Cloud Storage 存储桶。创建 2 个存储桶:一个用于存放图片(源),另一个为空(目标)。第二个存储桶将在开始标注时填充数据。
作者提供的图片
然后,根据官方文档,我们需要为存储桶设置跨域资源共享(CORS)访问权限。点击右上角的激活云终端,然后运行以下命令。
echo '[
{
"origin": ["*"],
"method": ["GET"],
"responseHeader": ["Content-Type","Access-Control-Allow-Origin"],
"maxAgeSeconds": 3600
}
]' > cors-config.json
gsutil cors set cors-config.json gs://ferre-runway # use your bucket name
gsutil cors set cors-config.json gs://ferre-runway-labeled # use your bucket name
如果你希望为标注结果设置数据版本控制,可以点击存储桶并在保护中开启版本控制。
作者提供的图片
2. 创建并设置服务账户密钥
很可能你不希望你的存储桶是公开的,那么 Label Studio 需要认证才能访问这些图片。点击创建服务账户,并授予存储管理员角色,这样我们就可以读写 GCS 存储桶。你应该能够在存储桶的权限列表中看到这个服务账户。
作者提供的图片
现在,点击新创建的服务账户并点击密钥。接着添加一个新密钥,并确保将 JSON 文件下载到安全的地方。
现在,打开你的本地终端并编码 JSON 文件。
base64 -i service_account_key.json -o service_account_key_encoded.txt
cat service_account_key_encoded.txt
你可以看到随机的字符和数字字符串并复制它。现在我们将其作为元数据粘贴到虚拟机中。点击你的虚拟机,点击编辑,并添加你的自定义元数据。例如,我的键是 GOOGLE_APPLICATION_CREDENTIALS_BASE64。
作者提供的图片
我们接着会解码服务账户密钥以便在 Python 代码中进行认证。
3. 重新构建后端容器
由于我们修改了docker-compose.yml文件,因此需要运行新的脚本并重新构建后端容器。
# Check running containers and their IDs, find the backends you need to kill
sudo docker ps
sudo docker kill a5a5e21537cb
sudo docker kill 54e51b0ae78f
# navigate to the right folders like before and build new containers
sudo docker compose up
现在,你应该能看到新的容器。
作者提供的图片
4. SDK 从源存储桶上传图片
如果你只是想上传图片而不带元数据,你可以跳过此部分,直接执行与第 5 步相同的操作(见下文)。所谓元数据,是指每张图片在标注界面上有用的信息,这些信息可能有助于更准确地进行标注。
基于 Label Studio SDK 仓库中的示例,您可以修改./label_studio_sdk/annotate_data_from_gcs.ipynb文件中的元数据内容以及导入方式。运行本地的 Python 笔记本后,您应该能在前端看到您的图片和元数据。
图片来自作者
您还应该查看设置中的源存储桶。请勿点击同步存储(Sync Storage),因为它将直接从存储桶同步,可能会扰乱我们导入的元数据。
图片来自作者
5. 设置目标存储
点击添加目标存储,并根据提示填写信息。将您的服务账户密钥复制粘贴到 Google 应用凭据文本框中,您就完成设置了。
图片来自作者
每次您点击目标云存储中的同步存储时,它将把标注结果以文本格式同步到 GCS 存储桶中。点击同步一次后,提交标注结果时该过程应该会自动触发,但请检查是否需要定期手动同步。
祝您标注愉快!
致谢
很高兴能作为一部分参与Data Shack 2024,与米兰理工大学Gianfranco Ferré研究中心合作。我要感谢Pavlos Protopapas 教授和 Paola Bertola 教授的指导,以及感谢您们使这个项目得以启动。我要感谢Chris Gumb和 Marco Brambilla 教授的技术支持,以及 Federica Vacca 教授和Angelica Vandi 博士在时尚领域的专业知识支持。最后,我要感谢我的队友Luis Henrique Simplicio Ribeiro、Lorenzo Campana和 Vittoria Corvetti 在过程中给予的帮助以及与我一起解决问题。还要特别感谢 Emanuela Di Stefano、Jacopo Sileo、Bruna Pio Da Silva Rigato、Martino Fois、Xinxi Liu 和 Ilaria Trame 的持续支持和辛勤工作。
参考文献
-
11655 Gianfranco Ferré,成衣系列,2004 年秋冬季。由 Gianfranco Ferré研究中心提供。
-
13215 Gianfranco Ferré,成衣系列,春夏 1991. 感谢 Gianfranco Ferré 研究中心提供。
感谢阅读!希望这篇博客对你有所帮助。
本文中的代码可以在这个GitHub 仓库找到。
Lag-Llama:开源时间序列预测基础模型
探索 Lag-Llama 的架构,并学习如何在预测项目中使用 Python 来应用它
https://medium.com/@marcopeixeiro?source=post_page---byline--9afdfaf2bd7c--------------------------------https://towardsdatascience.com/?source=post_page---byline--9afdfaf2bd7c-------------------------------- Marco Peixeiro
·发表于Towards Data Science ·10 分钟阅读·2024 年 2 月 13 日
–
图片由Ray Hennessy提供,来源于Unsplash
2023 年 10 月,我发布了一篇关于TimeGPT的文章,这是首个用于时间序列预测的基础模型之一,具备零-shot 推理、异常检测和符合预测能力。
然而,TimeGPT 是一个专有模型,仅通过 API 令牌进行访问。尽管如此,它激发了对时间序列基础模型的更多研究,因为与自然语言处理(NLP)和计算机视觉相比,这一领域的发展相对滞后。
快进到 2024 年 2 月,我们现在有了一个开源的时间序列预测基础模型:Lag-Llama。
在原始论文中:Lag-Llama:面向概率时间序列预测的基础模型,该模型被提出为一种通用的基础模型,用于单变量的概率预测。它由来自不同机构的大团队开发,这些机构包括摩根士丹利、ServiceNow、蒙特利尔大学、Mila-Quebec 和麦吉尔大学。
在本文中,我们将探索 Lag-Llama 的架构、功能以及它是如何训练的。然后我们将实际在预测项目中使用 Lag-Llama……
LangChain 的内置 AI 输出评估指标:它们有何不同?
https://medium.com/@jonathan.bennion?source=post_page---byline--f9dd75e2de08--------------------------------https://towardsdatascience.com/?source=post_page---byline--f9dd75e2de08-------------------------------- Jonathan Bennion
·发表于 Towards Data Science ·5 分钟阅读·2024 年 5 月 22 日
–
我通常为自己的使用案例创建自定义指标,但在开始使用 RAGAS 和/或 DeepEval 进行 RAG 评估之前,反复遇到 LangChain 内置的这些 AI 工具评估指标,所以最终对这些指标是如何创建的产生了好奇,并进行了快速分析(当然有所有固有的偏见)。
TLDR 来自以下的相关性矩阵:
-
有用性与一致性(0.46 的相关性):这一强相关性表明,大型语言模型(以及由此推导出的用户)可能会觉得一致性的回答更有帮助,强调了回答中逻辑结构的重要性。这只是相关性,但这一关系揭示了这一结论的可能性。*
-
争议性与犯罪性(0.44 的相关性):这表明,即使是有争议的内容也可能被视为犯罪,反之亦然,或许反映了用户偏好那些具有吸引力和发人深省的内容。*
-
一致性与深度: 尽管一致性与有用性相关,但深度并不相关。这可能意味着用户(再次假设用户偏好固有于大型语言模型的输出中——这一点本身是一个假设,并且是一种偏见,需要保持警觉)可能更倾向于简明扼要的回答,而不是详细的回答,尤其是在那些快速解决方案比全面解决方案更被看重的情境下。
内置指标可以在这里找到(移除一个与地面真相相关且更适合在其他地方处理的指标):
# Listing Criteria / LangChain's built-in metrics
from langchain.evaluation import Criteria
new_criteria_list = [item for i, item in enumerate(Criteria) if i != 2]
new_criteria_list
这些指标:
-
简洁性
-
细节
-
相关性
-
一致性
-
有害性
-
冷漠性
-
有用性
-
争议性
-
犯罪性
-
深度
-
创造力
首先,这些意味着什么,为什么要创建这些?
假设是:
- 这些是为了尝试定义可以解释输出与理论用例目标之间关系的度量标准,任何相关性可能是偶然的,但通常尽可能避免。
在看到这里的源代码后,我得出了这个假设。
第二,一些这些似乎相似和/或模糊——那么它们是如何区分的呢?
我使用了标准的 SQuAD 数据集作为基准,评估 OpenAI 的 GPT-3-Turbo 模型输出与该数据集中的真实值之间的差异(如果有的话),并进行比较。
# Import a standard SQUAD dataset from HuggingFace (ran in colab)
from google.colab import userdata
HF_TOKEN = userdata.get('HF_TOKEN')
dataset = load_dataset("rajpurkar/squad")
print(type(dataset))
我获取了一组随机化的行进行评估(由于时间和计算限制,无法对整个数据集进行评估),因此这可能是更多噪音和/或偏差的切入点。
# Slice dataset to randomized selection of 100 rows
validation_data = dataset['validation']
validation_df = validation_data.to_pandas()
sample_df = validation_df.sample(n=100, replace=False)
我定义了一个 LLM,使用了 ChatGPT 3.5 Turbo(为了节省成本,这个过程很快)。
import os
# Import OAI API key
OPENAI_API_KEY = userdata.get('OPENAI_API_KEY')
os.environ['OPENAI_API_KEY'] = userdata.get('OPENAI_API_KEY')
# Define llm
llm = ChatOpenAI(model_name='gpt-3.5-turbo', openai_api_key=OPENAI_API_KEY)
然后迭代遍历抽样行以进行比较——LangChain 在评估标准中使用了未知的‘评分’阈值,但假设这些阈值在所有度量中是相同的。
# Loop through each question in random sample
for index, row in sample_df.iterrows():
try:
prediction = " ".join(row['answers']['text'])
input_text = row['question']
# Loop through each criteria\
for m in new_criteria_list:
evaluator = load_evaluator("criteria", llm=llm, criteria=m)
eval_result = evaluator.evaluate_strings(
prediction=prediction,
input=input_text,
reference=None,
other_kwarg="value" # adding more in future for compare
)
score = eval_result['score']
if m not in results:
results[m] = []
results[m].append(score)
except KeyError as e:
print(f"KeyError: {e} in row {index}")
except TypeError as e:
print(f"TypeError: {e} in row {index}")
然后,我计算了均值和 95%置信区间的置信区间。
# Calculate means and confidence intervals at 95%
mean_scores = {}
confidence_intervals = {}
for m, scores in results.items():
mean_score = np.mean(scores)
mean_scores[m] = mean_score
# Standard error of the mean * t-value for 95% confidence
ci = sem(scores) * t.ppf((1 + 0.95) / 2., len(scores)-1)
confidence_intervals[m] = (mean_score - ci, mean_score + ci)
然后绘制了结果。
# Plotting results by metric
fig, ax = plt.subplots()
m_labels = list(mean_scores.keys())
means = list(mean_scores.values())
cis = [confidence_intervals[m] for m in m_labels]
error = [(mean - ci[0], ci[1] - mean) for mean, ci in zip(means, cis)]]
ax.bar(m_labels, means, yerr=np.array(error).T, capsize=5, color='lightblue', label='Mean Scores with 95% CI')
ax.set_xlabel('Criteria')
ax.set_ylabel('Average Score')
ax.set_title('Evaluation Scores by Criteria')
plt.xticks(rotation=90)
plt.legend()
plt.show()
可能直观地认为‘相关性’比其他指标要高得多,但有趣的是,总体而言它们都很低(可能要感谢 GPT 3.5!),而‘有用性’是下一个最高的指标(可能反映了强化学习技术和优化)。
为了回答我关于相关性的问题,我计算了一个简单的相关矩阵,使用了原始的比较数据框。
# Convert results to dataframe
min_length = min(len(v) for v in results.values())
dfdata = {k.name: v[:min_length] for k, v in results.items()}
df = pd.DataFrame(dfdata)
# Filtering out null values
filtered_df = df.drop(columns=[col for col in df.columns if 'MALICIOUSNESS' in col or 'MISOGYNY' in col])
# Create corr matrix
correlation_matrix = filtered_df.corr()
然后绘制了结果(p 值是通过我的代码中的进一步部分创建的,且均小于 0.05)
# Plot corr matrix
mask = np.triu(np.ones_like(correlation_matrix, dtype=bool))
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, mask=mask, annot=True, fmt=".2f", cmap='coolwarm',
cbar_kws={"shrink": .8})
plt.title('Correlation Matrix - Built-in Metrics from LangChain')
plt.xticks(rotation=90)
plt.yticks(rotation=0)
plt.show()
令人惊讶的是,大多数没有相关性,考虑到 LangChain 代码库中描述的性质——这表明这些内容是经过深思熟虑的,我很高兴这些是内建的可以使用的。
从相关矩阵中,显现出一些显著的关系:
-
有用性与一致性(0.46 相关性): 这一强相关性表明,LLM(作为用户的代理)可能会发现一致的回应更有帮助,这强调了回应中逻辑结构的重要性。尽管这只是相关性,但这种关系为此铺平了道路。
-
争议性与犯罪性(0.44 相关性): 这表明,即使是有争议的内容也可能被视为犯罪,反之亦然,这也许反映了用户对引人深思且富有启发性的材料的偏好。同样,这只是相关性。
主要结论:
-
连贯性与深度在帮助性中的对比: 尽管连贯性与帮助性相关,但深度却没有。这可能意味着用户更倾向于简洁明了的答案而非详细的答案,特别是在那些快速解决方案比全面方案更受重视的场景中。
-
利用争议性: 争议性与犯罪性之间的正相关关系提出了一个有趣的问题:是否可以以非犯罪的方式讨论争议话题?这可能在不牺牲内容质量的情况下增加用户参与度。
-
偏见与模型选择的影响: 使用 GPT-3.5 Turbo 以及度量设计中固有的偏见可能会影响这些相关性。承认这些偏见对于准确解读和应用这些度量标准至关重要。
除非另有说明,本文中的所有图片均由作者创作。
LangChain 的父文档检索器 — 重新审视
仅使用你的向量数据库增强上下文检索
https://medium.com/@omri-levy?source=post_page---byline--1fca8791f5a0--------------------------------https://towardsdatascience.com/?source=post_page---byline--1fca8791f5a0-------------------------------- Omri Eliyahu Levy
·发布于Towards Data Science ·6 分钟阅读·2024 年 7 月 22 日
–
TL;DR — 我们通过使用元数据查询实现与 LangChain 的父文档检索器相同的功能(链接)。你可以在这里查看代码。
RAG 简介
检索增强生成(RAG)目前是 LLM 和 AI 应用领域最热门的话题之一。
简而言之,RAG 是一种将生成模型的响应基于选定知识源进行“立足”的技术。它包括两个阶段:检索和生成。
-
在检索阶段,给定用户的查询,我们从预定义的知识源中检索相关信息。
-
然后,我们将检索到的信息插入到发送给 LLM 的提示中,该模型(理想情况下)根据提供的上下文生成对用户问题的回答。
一种常用的方法来实现高效准确的检索是通过使用嵌入。在这种方法中,我们通过将文档拆分成块(例如页面、段落或句子)来预处理用户的数据(假设为纯文本)。然后,我们使用嵌入模型为这些块创建有意义的数值表示,并将它们存储在向量数据库中。现在,当查询到来时,我们也对其进行嵌入,并使用向量数据库执行相似性搜索,以检索相关信息。
图片由作者提供
如果您完全不熟悉这个概念,我推荐deeplearning.ai的精彩课程,LangChain: 与您的数据对话。
什么是“父文档检索”?
“父文档检索”或其他人所称的“句子窗口检索”,是一种通过提供更广泛的上下文供 LLM 考虑来增强 RAG 检索方法性能的常见方法。
本质上,我们将原始文档分成相对较小的块,嵌入每一个块,并将它们存储在向量数据库中。使用这些小块(一句话或几句话)有助于嵌入模型更好地反映其含义[1]。
然后,在检索时,我们不仅返回由向量数据库找到的最相似块,还返回其在原文档中的周围上下文(块)。这样,LLM 将拥有更广泛的上下文,在许多情况下有助于生成更好的答案。
LangChain 通过父文档检索器[2]支持这一概念。父文档检索器允许您:(1) 检索特定块来源的完整文档,或 (2) 为与父文档关联的每个较小块预先定义一个更大的“父”块。
让我们从LangChains 文档中探讨一个例子:
# This text splitter is used to create the parent documents
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000)
# This text splitter is used to create the child documents
# It should create documents smaller than the parent
child_splitter = RecursiveCharacterTextSplitter(chunk_size=400)
# The vectorstore to use to index the child chunks
vectorstore = Chroma(
collection_name="split_parents", embedding_function=OpenAIEmbeddings()
)
# The storage layer for the parent documents
store = InMemoryStore()
retriever = ParentDocumentRetriever(
vectorstore=vectorstore,
docstore=store,
child_splitter=child_splitter,
parent_splitter=parent_splitter,
)
retrieved_docs = retriever.invoke("justice breyer")
在我看来,LangChains 方法有两个缺点:
-
需要管理外部存储,以便利用这一有用的方法,无论是内存还是其他持久化存储。当然,对于真实的使用案例,多个示例中使用的 InMemoryStore 是不够的。
-
“父文档”检索不是动态的,意味着我们无法动态调整周围窗口的大小。
的确,关于这个问题已经提出了一些问题[3]。
在这里我还要提到,Llama-index 有自己的SentenceWindowNodeParser [4],它通常具有相同的缺点。
接下来,我将介绍另一种方法,以实现这个有用的功能,并解决上述提到的两个缺点。在这种方法中,我们将仅使用已经在使用的向量存储。
替代实现
精确地说,我们将使用支持仅执行元数据查询选项的向量存储,而不涉及任何相似性搜索。在这里,我将为ChromaDB和Milvus呈现一个实现示例。这个概念可以轻松适配任何具备此功能的向量数据库。在本教程的最后,我将以Pinecone为例进行说明。
一般概念
这个概念很简单:
-
**构建:**在每个块旁边,保存其元数据中生成该块的document_id,以及该块的sequence_number。
-
检索: 在执行常规的相似性搜索之后(为了简单起见,假设只返回前 1 个结果),我们从检索到的块的元数据中获取 document_id 和 sequence_number。然后,检索所有具有相同 document_id 的周围序列号的块。
例如,假设你已经将一个名为 example.pdf 的文档分成 80 个块进行索引。那么,对于某个查询,你会发现最接近的向量是具有以下元数据的那个:
{document_id: "example.pdf", sequence_number: 20}
你可以轻松地获取来自同一文档、序列号从 15 到 25 的所有向量。
让我们看看代码。
这里,我使用的是:
chromadb==0.4.24
langchain==0.2.8
pymilvus==2.4.4
langchain-community==0.2.7
langchain-milvus==0.1.2
下面唯一值得注意的是与每个块相关的元数据,这将帮助我们执行搜索。
from langchain_community.document_loaders import PyPDFLoader
from langchain_core.documents import Document
from langchain_text_splitters import RecursiveCharacterTextSplitter
document_id = "example.pdf"
def preprocess_file(file_path: str) -> list[Document]:
"""Load pdf file, chunk and build appropriate metadata"""
loader = PyPDFLoader(file_path=file_path)
pdf_docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=0,
)
docs = text_splitter.split_documents(documents=pdf_docs)
chunks_metadata = [
{"document_id": file_path, "sequence_number": i} for i, _ in enumerate(docs)
]
for chunk, metadata in zip(docs, chunks_metadata):
chunk.metadata = metadata
return docs
现在,让我们在 Milvus 和 Chroma 中实现实际的检索。请注意,我将使用 LangChains 的对象,而不是原生客户端。这样做是因为我假设开发人员可能希望保留 LangChains 的有用抽象层。另一方面,这将要求我们做一些小的修改,以数据库特定的方式绕过这些抽象层,因此你应该考虑这一点。无论如何,概念保持不变。
再次假设为了简化,我们只需要最相似的向量(“前 1 个”)。接下来,我们将提取相关的 document_id 及其序列号。这将帮助我们检索周围的窗口。
from langchain_community.vectorstores import Milvus, Chroma
from langchain_community.embeddings import DeterministicFakeEmbedding
embedding = DeterministicFakeEmbedding(size=384) # Just for the demo :)
def parent_document_retrieval(
query: str, client: Milvus | Chroma, window_size: int = 4
):
top_1 = client.similarity_search(query=query, k=1)[0]
doc_id = top_1.metadata["document_id"]
seq_num = top_1.metadata["sequence_number"]
ids_window = [seq_num + i for i in range(-window_size, window_size, 1)]
# ...
现在,对于窗口/父级检索,我们将在 Langchain 的抽象层下,采用数据库特定的方式进行操作。
对于 Milvus:
if isinstance(client, Milvus):
expr = f"document_id LIKE '{doc_id}' && sequence_number in {ids_window}"
res = client.col.query(
expr=expr, output_fields=["sequence_number", "text"], limit=len(ids_window)
) # This is Milvus specific
docs_to_return = [
Document(
page_content=d["text"],
metadata={
"sequence_number": d["sequence_number"],
"document_id": doc_id,
},
)
for d in res
]
# ...
对于 Chroma:
elif isinstance(client, Chroma):
expr = {
"$and": [
{"document_id": {"$eq": doc_id}},
{"sequence_number": {"$gte": ids_window[0]}},
{"sequence_number": {"$lte": ids_window[-1]}},
]
}
res = client.get(where=expr) # This is Chroma specific
texts, metadatas = res["documents"], res["metadatas"]
docs_to_return = [
Document(
page_content=t,
metadata={
"sequence_number": m["sequence_number"],
"document_id": doc_id,
},
)
for t, m in zip(texts, metadatas)
]
别忘了按序列号排序:
docs_to_return.sort(key=lambda x: x.metadata["sequence_number"])
return docs_to_return
为了方便起见,你可以在这里查看完整代码。
Pinecone(及其他)
据我所知,Pinecone 没有原生方法来执行此类元数据查询,但你可以通过它们的 ID 原生地获取向量(docs.pinecone.io/guides/data/fetch-data)。
因此,我们可以做以下操作:每个块将获得一个唯一 ID,该 ID 本质上是文档 ID 和序列号的连接。然后,给定通过相似性搜索检索到的向量,你可以动态创建周围块的 ID 列表,从而实现相同的结果。
限制
值得一提的是,向量数据库并非为了执行“常规”数据库操作而设计,通常也没有针对这类操作进行优化,并且每个数据库的表现都不相同。例如,Milvus 将支持在标量字段(“元数据”)上建立索引,从而优化这类查询。
同时,请注意,这需要向向量数据库发送额外的查询。首先我们检索到最相似的向量,然后我们执行额外的查询,以获取原始文档中周围的块。
当然,正如上面的代码示例所示,实现是特定于向量数据库的,并且 LangChains 的抽象层本身不支持这种实现。
结论
在这篇博客中,我们介绍了一种实现方式,用于实现句子窗口检索,这是一种在许多 RAG 应用中都非常有用的检索技术。在这个实现中,我们仅使用了已经在使用中的向量数据库,并且还支持动态修改检索到的周围窗口大小的选项。
参考文献
[1] ARAGOG: 高级 RAG 输出评分,arxiv.org/pdf/2404.01037,第 4.2.2 节
[2] python.langchain.com/v0.1/docs/modules/data_connection/retrievers/parent_document_retriever/
[3] 一些相关问题:
[4] docs.llamaindex.ai/en/stable/api_reference/node_parsers/sentence_window/
1608

被折叠的 条评论
为什么被折叠?



