暂时忘掉人工智能 (AI) 和所有那些花哨的数学吧。我们来谈谈奶酪。特别是当您创建熟食板时。如果您不熟悉,美国版的熟食板(字面意思)是一块木板或石板,上面涂有肉、奶酪和其他美味的东西。如果你做得对,板上的每块肉都会与特定的奶酪精心搭配,以补充风味、质地和外观(我们是用眼睛吃的,你知道的)。制作一块木板既是一门艺术,也是一种烹饪乐趣。

是什么让一种奶酪比另一种奶酪更好?是什么让一块板比另一块板更好?一些独特的特征可以对所有奶酪进行分类。人们可以利用这些特性来制作完美的电路板。您甚至可以遵循“切达干酪”、“羊奶”或“高对比度”等主题。

如果您花过时间研究机器学习(或人工智能),“分类”一词可能会让您了解我们以奶酪板为例的方向。在机器学习世界中,有关每种奶酪的信息将被称为数据。奶酪的不同特征称为特征。您使用最近邻算法来分析数据和特征,以找到良好的奶酪搭配。

什么是最近邻算法?

假设您想要构建一个 AI 应用程序< /a> 获取棋盘的描述并为其找到补充奶酪。一种补充是具有相似特征的奶酪。具有相似特征的奶酪将是我们对最近邻居的定义。切达干酪具有相似的属性,例如它们的质地以及它们的“臭味”。因此,他们是邻居。

在使用人工智能寻找补充奶酪的道路上,我们将需要大量有关奶酪的数据。因此,我们将为cheese.com 建立索引。这被认为是有关奶酪的事实信息,但也包括许多有关奶酪的固执己见的讨论。所有这些数据加在一起将成为决策的丰富信息。

不会对存储的信息进行“数据管理”。我们不会让奶酪商梳理新的奶酪数据,将每个条目标记为“非常适合这些主题”或“补充这些其他奶酪”。这就是最近邻算法的工作。

最近邻算法如何工作?

奶酪专家会综合考虑所有特征来对给定奶酪进行分类。最近邻算法执行类似的操作,但采用的是自然语言处理 (NLP) 方式。它不知道“臭”这个词是什么意思。相反,它将不同奶酪中的单词(或短语)进行相互比较。根据它们的相似程度,返回概率。单词或短语的相似性称为语义相似性。这是所有最近邻算法的核心属性。

最近邻算法的返回永远不会是确定的:“我确信这些奶酪是完美的选择。”这两种奶酪很可能很适合作为带有从零 (0) 到一 (1) 的一串小数的数字(零是永远不要将这些奶酪放在一起,否则内战会发生)爆发)。

最近邻算法分析每个请求的所有数据。分类、分类以及介于两者之间的一切都将在搜索时发生(即即时结果)。搜索需要能够在任何给定时刻处理未知量的数据和未知量的用户。这是一个很花哨的说法,说它需要非常非常快。如果您曾经尝试过在大型数据集上进行文本比较,您就会知道它根本没有性能。为了克服这个问题,文本被转换为称为向量的数字集合。计算机非常擅长比较数字;)。

最近邻算法绘制多维空间中的所有向量,并使用每个点来查找最近的邻近点。不同类型的最近邻算法以不同的方式考虑相邻点(稍后会详细介绍)。

继续我们的示例应用程序,我们在 S3 存储桶中收集了一堆有关奶酪的数据作为非结构化文本(单个文档)。接下来,每个文档需要转换为数值。

将文本转换为数字的行为称为标记化。通常,数值是相当多的数字,例如每个文本 1562。我们不会在这里深入讨论矢量化过程,但您可以在我们的“什么是向量嵌入?”指南。

通过将奶酪数据“矢量化”并存储在矢量数据库中,现在我们可以计算互补奶酪(也称为最近邻居)。首先,我们将提供的描述作为输入并生成其向量,就像奶酪数据一样。这些生成的向量将作为计算其最近邻居位置的上下文。

所提供的描述中的每个向量都代表有关奶酪的某些内容,因此具有相同(或非常接近)向量的另一种奶酪将是互补奶酪。假设我们向应用程序提供了描述“我想要一块包含布里干酪和胡椒杰克的木板”。忽略“我”、“想要”、“那个”等停用词。这些都会被丢弃。对单词“board”、“brie”和“pepper jack”进行矢量化。数据库中任何具有与这些单词相似向量的东西都可能是邻居——补充奶酪。搜索有望返回切达干酪、羊乳酪等建议,也许还有科尔比。这完全取决于 Cheese.com 如何描述布里干酪和胡椒杰克奶酪以及其他人如何讨论这两种奶酪。

了解了最近邻的基础知识后,让我们看看不同的算法类型以及计算遇到的一些常见难题。

计算最近邻的流行方法

查找最近邻是绘制所有向量的所有维度,然后将向量的上下文集合与它们进行比较的过程。使用简单的坐标系,您可以通过数学方式测量一个点与另一个点的距离(称为它们的距离)。

典型的美国社区由相连的街道和死胡同组成。每条街道上都有一座带有地址的房子。当有人谈到他们的“邻居”时,他们可能指的是隔壁的房子,或者他们可能正在谈论社区另一边的房子。上下文是邻域的边界。社区有各种形状和大小,因此当有人说“我的邻居”时,您需要一些参考或上下文。

根据您的应用在计算最近邻时所需的精度,您可以选择最佳拟合算法(也称为如何建立边界)。

K 最近邻 (KNN)

KNN 的目标通常是针对大量标记数据对某些数据进行分类。标记数据意味着对数据集中的每个项目之前所做的决定。在上面的例子中,数据没有标签,称为无监督数据。你不知道每段文字说了什么,也不知道它如何代表有关奶酪的东西。我们本可以查看这些数据并添加正在讨论的奶酪的标签。那么,它将是监督数据,并且是 KNN 分类的良好候选数据。

如果我们有一张奶酪的图片,并且需要一个人工智能应用程序来找出它属于哪个家族,该怎么办?您可以对一大堆奶酪图片进行矢量化,每张图片上都带有系列标签,并使用它们与您图片的矢量进行比较。

KNN 中的“K”代表边界,意味着您愿意考虑多少张奶酪图片?一旦找到这些照片,哪个家庭在该群体中占多数?这是根据监督数据对文本或图片等内容进行分类的简单方法。

KNN 的返回是对所提供的数据与现有数据标签的拟合程度的预测。通常返回两个值:百分比和分类器。然后,我们的人工智能应用程序需要决定该百分比是否足以应用给定的分类,或者是否需要采取其他措施才能继续。

近似最近邻 (ANN)

上面的奶酪板示例使用人工神经网络来查找与给定奶酪描述相匹配的奶酪。这是最近邻最常见的用途之一,主要是因为它在非标记(无监督)数据上效果很好。当今的人工智能应用程序试图使用尽可能多的数据来做出明智的决策。尽管如此,标记所有内容仍然需要投入时间和精力,因此更容易调整您的算法。

人工神经网络中的“近似值”应该会提示您算法的精度。返回将近似哪些数据与输入密切相关,但幻觉是真实的,所以要小心。

固定半径最近邻

K-最近邻中的“K”是在找到多数点之前您愿意考虑的空间点数量的界限。重点是点数。固定半径是 KNN 的扩展方法,您可以在其中查看点的数量,但它仅限于一定的距离。这伴随着找不到点的可能性。但如果应用程序愿意接受这一点并且可以创建新的分类,那么这是限制要考虑的数据点数量的快速方法。限制要考虑的点数是加快整体计算速度的简单方法。

半径通常与上下文值一起作为固定值提供。上下文值是一个向量,半径是距该向量的距离的度量。

使用k维树(k-d树)进行分区

当数据被标记化(转换为向量)时,会选择维数。您可以根据搜索所需的准确度来选择维度数。但是,就像所有事情一样,需要权衡。嵌入的维度越多,计算最近邻居所需的时间就越长。您必须在您的应用程序中找到两者之间的平衡。

当你有很多维度(可能有数千个或更多)时,k-d 树会非常方便。在单个空间中绘制向量后(在进行最近邻距离比较之前),k-d 树将单个空间分割为多个空间(称为分区)。空格数是名称的“K”部分。如何对空间进行排序(以便它们的共享上下文不会丢失)是一种实现选择(中值查找排序)。

理想情况下,构成树中每个空间的叶子数量是平衡的。这有助于实现统一、可预测的搜索性能。

使用具有最近邻居的 k-d 树的强大之处在于,当找到初始邻居时,算法会在遍历树时获得接近感。有了这些知识,它就可以选择不搜索树的大部分区域,因为它知道那些叶子太远了。这确实可以加快搜索速度。

Comments are closed.