科技网

当前位置: 首页 >手机

手把手教你从零起步构建自己的快速语义搜索

手机
来源: 作者: 2019-03-07 21:39:19

雷锋(公众号:雷锋)按:本文为 AI研习社 编译的技术博客,原标题 The unreasonable effectiveness of Deep Learning Representations,作者为 Emmanuel Ameisen 。

翻译 | 付腾 王飞 汪鹏 校对| 余杭 整理 | MY

训练电脑以人类的方式去看图片

为什么从相似性搜索做起?

一张图片胜千言,甚至千行代码。

很多的产品是基于我们的感知来吸引我们的。比如在浏览服装站上的服装,寻找 Airbnb 上的假期租房,或者领养宠物时,物品的颜值往往是我们做决定的重要因素。想要预测我们喜欢什么样的东西,看看我们对于事物的感知方法大概就能知道了,因此,这也是一个非常有价值的考量。

但是,如何让计算机以人类的视角来理解图片长久以来是计算机科学领域的一大挑战。直到 2012 年,深度学习在某些感知类任务(比如图像分类或者目标探测)中开始慢慢地超过了传统的机器学习方法(比如 方向梯度直方图,HOG)。关于学界的这次转变,一个主要的原因就要归功于深度学习对于在足够大训练数据集上面自动提取出有意义的表征的能力。

Pinterest 中的视觉搜索

这也是为什么很多开发团队,比如 Pinterest,StitchFix 以及 Flickr 等,开始使用深度学习来学习他们获得的图片当中的表征,基于这些提取的表征以及用户对于视觉内容是否欢迎的反馈来为用户提供内容推荐。类似的,insight 的研究员也使用深度学习来建立一系列的模型,比如帮助用户找到适合领养的猫咪,推荐适合购买的太阳镜,或者搜索具体的艺术风格。

许多推荐系统是基于协同过滤的:利用用户关联来提出建议(“喜欢这个物品的用户可能还喜欢···”)。但是,这类模型需要非常大量的数据才能比较准确,而且这类模型在应对新的还未被用户浏览过的新物品的时候会表现不佳。物品表征是另一个解决办法,那就是基于内容的推荐系统,这种推荐系统并不会受到上面提到的未被浏览的新物品问题的影响。

此外,这些表征允许消费者有效地搜索图像库,(通过图像查询)来获取与他们刚拍摄的自拍相似的图像,或者搜索某些特定物品的照片,比如汽车(通过文本查询)。这方面的常见示例包括 Google 反向图片搜索服务以及 Google 图片搜索服务。

根据我们为许多语义理解项目提供技术指导的经验,我们编写了一个教程,让读者了解如何构建自己的表征模型,包括图像和文本数据,以及如何有效地进行基于相似性的搜索。到本文结束时,读者自己应该能够从零起步构建自己的快速语义搜索模型,无论数据集的大小如何。

本文配有一个带有代码注释的 notebook,使用了 streamlit 和一个独立的代码库来演示和使用所有相关技术。代码可以自由使用,请读者自便。

我们的计划是什么?

来聊聊优化吧

在机器学习中,有时也和软件工程一样,方法总比问题多,每种方法都有不同的权衡。如果我们正在进行研究或本地的产品原型设计,我们可以暂时摆脱效率非常低的解决方案。但是如果我们的目标是要构建一个可维护和可扩展的相似图像搜索引擎,我们必须考虑到两点:1. 如何适应数据演变 2. 模型的运行速度。

让我们先想象几种解决方案:

方案 1 的工作流程

方案 1:我们建立一个端对端的模型,这个模型使用了我们所有的模型进行训练。这个模型的输入是一个图片,输出一个数组,这个数组里的每个元素是输入图片和图片训练集中的每一个图片的相似性数值。模型的预测过程运行速度快(因为是单独的前向计算),但是我们每次添加了新的图片到图片训练集中就需要重新训练一个新的模型。我们同样会在模型迭代的过程中碰到一个大问题就是模型的输出包含太多的类,导致模型的正确优化极端困难。这的确是一个很快的方案,但是在可扩展性上有限制,不能扩展到比较大的数据集上。此外,我们还需要手动给我们的训练集进行图片相似性的标定,这将是极其耗时的一项工作。

方案 2 的工作流程

方案 2:另外一种方案是建一个相似性预测模型,这个模型的输入是两张图片,输出是一个落在区间 0 到 1 范围内的相似性配对值。这些模型在大型数据集上也能比较准确,但是却受限于另一个可扩展问题。我们经常需要从一大堆的图片集中找到相似的图片,因此我们需要对我们的数据集中的所有可能图片配对集运行一次相似性模型。假设我们的模型是卷积神经络(CNN),而且我们有不小的图片量,那么整个系统的处理速度就太慢了,简直无法忍受。此外,这种方案只能用于基于图片相似性搜索,不能扩展到基于文本的相似性搜索。这种方案可以扩展到大数据集,但是总体的运行时间太慢了。

方法3的工作流程图

方案 3:有一种更简单的方法,类似于字嵌入。如果我们为图像找到一个很有代表性的表示或者嵌入,我们就可以通过观察它们的矢量彼此之间的距离来计算它们的相似性。这种类型,许多库都实现了快速解决方案(我们将在这里使用 Annoy)。此外,如果我们能提前计算出我们数据库中所有图像的这些向量,那么这种方法便可表现出既快速(一次正向传递,一种有效的相似性搜索),又可扩展的特点。最后,如果我们设法为我们的图像和单词找到常见的嵌入,我们可以使用它们来进行文本到图像的搜索!

由于其简单性和高效性,第三种方法将成为本文的重点。

我们该怎样实现这个过程?

那么,我们该如何在实际中使用深度学习表示来创建搜索引擎?

我们的最终目标是拥有一个搜索引擎,它可以接收图像并输出相似的图像或标签,可以接收文本并输出类似的单词或图像。为实现这一目标,我们将经历以下三个连续的步骤:

为输入图片寻找相似的图片 (图片 → 图片)

为输入的文字寻找相似的文字 (文本 → 文本)

为图像生成标签,并使用文本搜索图像 (图像 ↔ 文本)

为此,我们将使用嵌入 (embeddings),图像和文本的矢量表示。一旦我们有嵌入 (embeddings),搜索只是找到靠近我们的输入向量的向量。

寻找这个向量的方法是计算我们的图像的嵌入和其他图像之间的嵌入之间的余弦相似度。类似的图像将具有类似的嵌入,意味着嵌入之间的高余弦相似性。

让我们从一个数据集开始试验。

数据集

图片

我们的图像数据集由总共 1000 张图像组成,分为 20 个类别,每个类别下 50 张图像。此数据集可在此处找到。您可以随意使用链接代码中的脚本自动下载所有图像文件。另外感谢 Cyrus Rashtchian,Peter Young,Micah Hodosh 和 Julia Hockenmaier 的数据集。

此数据集包含每个图像的类别和一组标题。为了使问题的难度增加,并且为了验证我们的方法的泛化性能,我们将只使用类别,而忽略标题。数据集中总共有 20 个类,如下所示:

图像示例,我们能看到,标签很繁杂

我们可以看到我们的标签非常繁杂:许多照片包含多个类别,标签并不总是来自最突出的标签。例如,在右下角,图像被标记为 chair 而不是 person,虽然 3 人站在图像的中心,椅子几乎看不见。

文本

此外,我们加载已在 Wikipedia 上预训练的单词嵌入(本教程将使用 GloVe 模型中的单词嵌入)。我们将使用这些向量将文本合并到我们的语义搜索中。有关这些单词向量如何工作的更多信息,请参阅我们的 NLP 教程的第 7 步。

图像 - 图像

......

手把手教你从零起步构建自己的快速语义搜索

想要继续阅读,请移步至我们的AI研习社社区:

更多精彩内容尽在 AI 研习社。

不同领域包括计算机视觉,语音语义,区块链,自动驾驶,数据挖掘,智能控制,编程语言等每日更新。

端可以扫描二维码访问:

雷锋雷锋

雷锋雷锋

相关推荐