NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

如何做好大规模视觉搜索?eBay 基于实践总结出了 7 条建议

  • 2018-12-31
  • 本文字数:3788 字

    阅读完需:约 12 分钟

如何做好大规模视觉搜索?eBay基于实践总结出了7条建议

我们很荣幸于 2018 年 11 月 2 日参加ODSC West 2018的视觉搜索分会讨论,这篇文章是我们对发表在KDD2017上的论文“eBay 视觉搜索(Visual Search at eBay)”的总结。


假设你在一个看起来像一个大仓库的商店中,有许多用正整数标记的通道。eBay 在任何特定时间都有超过 1B 的活跃商品列表。所以,如果 eBay 是这样一家商店,它看起来就像 1999 年的电影《黑客帝国》中的无限储藏室。假设你有一张打印出来的管道零件目录,而你不知道你所寻找的零件的型号。你找到店员,指着纸上的零件图片。店员给你说了几个通道,比如说 183, 5276, 14098 号通道。如果没有这个信息,你必须经过每个通道,然后将管道的图片与通道上的每个项目进行比较才能找到你所要的零件。


如果这些零件看起来非常相似,这个比较任务就会变得非常复杂。在这种情况下,你需要注意每个细节,如颜色、形状、大小、品牌、包装等。如果通道是按商品的类型组织的,那么你可以从每个通道中大致查看一些商品,然后在相关的通道上花更多的时间去寻找。这是一项非常复杂的任务,如果你错过了感兴趣的项目,你可能需要把所有通道查找很多遍才能找到它。对于大规模搜索情况,算法搜索从本质上简化了这个过程。


正如我们的 KDD 论文中提到的,我们训练一个神经网络,从给定的图像中预测叶子类别(如图 1 所示)。这些叶子类别很像我们的“仓库”中不同的通道。这个基于神经网络的分类器就像我们的店员识别商品可能处在的通道位置。我们使用神经网络中Softmax层预测的概率,选择前几个预测概率最高的叶子类别。


图1 列表由层级分类结构组织,其中终端条目称为“叶子类别”。这些标签可以用来训练一个深度神经网络来预测给定图像的叶子类别。


图 1 列表由层级分类结构组织,其中终端条目称为“叶子类别”。这些标签可以用来训练一个深度神经网络来预测给定图像的叶子类别。


一旦我们找到了通道,我们需要知道如何比较两个图像(查询项目和货架上的项目)。我们用一个紧凑的签名来表示每幅图像,这个签名由一组数字组成的矢量表示。这个签名由相同的弱监督神经网络来提取。我们通过训练带有Sigmoid层的网络来预测叶子类别,提取二进制失量(由 1 和 0 组成)。我们发现最好在所有的步骤中尽可能多地使用监督信息。由于对于每一个叶子类别,我们有许多多样的数据,所以我们训练网络来预测叶子类别。


你可以看下 ECCV2018 的“探索弱监督预训练的极限(Exploring the Limits of Weakly Supervised Pretraining)”论文,以了解预训练大型网络并迁移到其他任务的强大能力。这种弱监督以及训练期间的数据扩充(如裁剪、翻转、旋转)能够帮助网络忽略图像背景,并更多地关注图像的关键部分,从而产生紧凑的语义签名。这些签名容易进行对比。在二进制表示的情况下,例如本文的情况,我们可以基于汉明距离来计算匹配的比特位数。汉明距离相似性可以用来排序叶子类别中匹配的项目。匹配的比特位越多,匹配程度越高。


在大规模的商业视觉搜索中我们面临的主要挑战包括:


  • 图像质量和构成不统一

  • 商品存货清单比较大

  • 商品存货清单严重细粒度

  • 需要简单的架构和模型,便于维护

建立大规模视觉搜索系统的建议

下面,我们总结了一些构建大规模的视觉搜索系统的建议。这些建议也适用于非视觉或多模态系统。

1. 理解数据,并使用分层抽样

数据是确定整个过程策略的核心。图像质量可能会引入复杂性,需要谨慎处理。了解目录中的图像以及用户在视觉搜索期间上传的图像非常重要。图 2 给出了 eBay 手提包存货的一个子集的可视化结果。背景的复杂性以及手提包属性的复杂性混合在一起。图 3 表明了另一种情况:当引入相机姿态时,相同的对象可以有许多不同的视角。当我们训练神经网络时,使用多样性的、有代表性的图像集是非常关键的,以使神经网络能够处理数据集中出现的各种情况。


图2 使用t-SNE对eBay的手袋图像的可视化。注意,大约40%的图像具有复杂的背景,略微超过10%的图像具有白色背景。用户上传的图像有更多的变化,比如旋转。


图 2 使用 t-SNE 对 eBay 的手袋图像的可视化。注意,大约 40%的图像具有复杂的背景,略微超过 10%的图像具有白色背景。用户上传的图像有更多的变化,比如旋转。


图3 一个名为“法拉利PUMA~红皮运动鞋~男式8,5号(女式10号)”的eBay商品。同样的商品,非常不同的图片!


图 3 一个名为“法拉利 PUMA~红皮运动鞋~男式 8,5 号(女式 10 号)”的 eBay 商品。同样的商品,非常不同的图片!


训练集的大小由诸如我们想要预测的标签数量、每个标签内数据的多样性、训练结构带来的内存和计算约束,以及训练这种系统的时间预算等因素共同决定。当我们为神经网络创建训练集时,我们对叶子类别、销售商、商品状态、品牌等使用分层抽样,最后去除重复样本,以确保数据丰富的多样性。

2. 数据增强是关键,特别是图像旋转。

当训练数据不能包含真实场景中可能发生的所有变化时,数据扩充是训练神经网络的关键步骤。当用户使用手机拍摄对象时,很可能图像出现被裁剪、旋转、变得模糊或者没有被缩放到合适的尺寸等情况。数据增强(图 4)生成数据中的各种变化,尤其是当这些变化容易出现在真实场景中,但是往往不会出现在 eBay 商品列表训练集中时。举个例子,eBay 商品列表中的图像不太可能旋转。然而,这种情况在用户上传的图像中经常出现。因此,我们发现图像旋转是数据增强中的一个重要操作。图像旋转在数据增强中经常被忽略,但是对于视觉搜索来说是十分重要的。


图4 数据增强使我们能够从单个样本中产生更多的变化。这里展示几个选定的数据增广操作。图像旋转往往被忽略,但实际上它非常重要。


图 4 数据增强使我们能够从单个样本中产生更多的变化。这里展示几个选定的数据增广操作。图像旋转往往被忽略,但实际上它非常重要。

3. 提取语义签名时尽可能多地使用监督信息

正如上文中提到的,尽可能多地使用监督信息是非常重要的。这有助于训练分类器关注信息性内容而忽略其他非信息性区域。当实际任务(测量图像对之间的相似性)没有可用标签时,最好利用低采集成本、数量庞大且多样的数据进行强监督(例如叶子类别的预测结果)。

4. 签名的熵分析

这一步通常会被大型信息检索系统的系统设计所忽略。评估给定的签名容量内是否包括了足够的有效信息是至关重要的。例如,如果我们使用 8 位数字来表示二进制签名,我们可以表示多达 28 个独特的概念。在最佳情况下,每个数位值为 1 的频率为 50%。我们可以通过计算系统的熵,得到系统的有效比特长度,并与实际比特长度进行比较。有些情况下允许系统松弛来包容系统中的冗余不失为一个好办法(图 5),防止某些数位受到噪声和扰动的影响。


图5 最优比特位占用对于最优信息表示是至关重要的。这张图片来自我们的论文,与<a href=


ImageNet 对应。84.1%的数位在 45%到 55%的数据上是激活的(=1)。在系统中有一些冗余是很好的,因此对于所有比特来说频率不完全是 50%。" />


图 5 最优比特位占用对于最优信息表示是至关重要的。这张图片来自我们的论文,与ImageNet对应。84.1%的数位在 45%到 55%的数据上是激活的(=1)。在系统中有一些冗余是很好的,因此对于所有比特来说频率不完全是 50%。

5. 当标签为粗粒度标签时,类内方差是很重要的。

我们使用粗粒度叶子类别标签代替产品 ID 来训练神经网络。部分原因是由于叶子类别虽然是粗粒度的,但是更容易获得。并且在服装和家具等类别中,有些商品没有产品 ID。典型分类系统的目标是最小化类内方差。理想情况是类内方差为 0。此时,一个类的所有样本都会坍塌成一个点(见图 6)。


例如,运动鞋的所有样本都会坍塌到一个点。但是,有很多独特的产品也属于“运动鞋”叶子类别,我们希望能够通过签名相似性找到它们。因此,我们认为,当标签为粗粒度但是需要进行细粒度搜索时,类间方差应该很高,但是类内方差也应该很高。这可以通过计算签名的熵来衡量,正如前面一条建议中所讨论的。


图6 分类器的推荐一般是类内方差小而类间方差大。然而,我们要做到的是更好的细粒度搜索,因此类间方差大、类内方差大是很重要的。当每个聚类簇中的点都坍塌到单个点时,不可能进行细粒度匹配。该图显示了使用二进制签名绘制的ImageNet中的五个类,其中来自相同类的样本属于相同类型(与产品类别相同)。类内方差对于商业的大规模视觉搜索变得更加重要,其中我们使用粗粒度类别标签(叶子类别),目的是细粒度搜索(产品)。


图 6 分类器的推荐一般是类内方差小而类间方差大。然而,我们要做到的是更好的细粒度搜索,因此类间方差大、类内方差大是很重要的。当每个聚类簇中的点都坍塌到单个点时,不可能进行细粒度匹配。该图显示了使用二进制签名绘制的 ImageNet 中的五个类,其中来自相同类的样本属于相同类型(与产品类别相同)。类内方差对于商业的大规模视觉搜索变得更加重要,其中我们使用粗粒度类别标签(叶子类别),目的是细粒度搜索(产品)。

6. 用排除法提高搜索速度和精度

专为高速度和高精度而设计的排除法具有强大的能力。例如,如果输入图像包含运动鞋,那么没有必要搜索裙子、桌子、计算机的库存清单。我们在 KDD 论文中提出,通过使用强分类器来预测前几个可能的叶子类别(通道)来减少搜索空间和提高精度(裙子的签名与鞋的签名不会混淆)是非常有效的。

7. 绝对 vs.累积 top-k 划分

我们使用强分类器,一个使用强叶子类别标签训练的深度神经网络,来预测首选叶子类别(通道)。当首选预测的置信度较高时,则不需要搜索其他分区。然而,当首选预测不确定时,最好包括其他竞争分区。因此,我们建议使用累计 top-k 类别来获得更好的搜索精度,并且只在要求精确匹配的情况下使用绝对 top-k,即使这样做的成本较高。详情请参阅图 7。



图 7 假设我们使用前 5 个预测叶子类别,通过排除法来缩小搜索空间。我们建议使用基于累积分数而不是绝对分数的前 5 位类别。只有当精度没有召回率那么重要时,才使用绝对分数,例如在场景中不计代价查找精确匹配的情况。可以在KDD论文中找到具体细节。我们在这个表格中给出了三个场景,得分阈值为 0.9。当置信度较低时,累积分数使用更多的类别(如 a、c 中的灰色单元格所示),当置信度较高时,累积分数使用较少的类别(如 b 中的灰色单元格所示)。

结论

在这篇文章中,我们介绍了七条构建大规模视觉搜索的建议。此外,我们也建议最小化人工的作用(包括用于评估),周期性地重新训练模型以应对数据分布的变化,并且为了便于维护,将模型的数量保持在最小值。


想了解更多细节,请阅读我们发表在 KDD2017 的论文:“eBay视觉搜索(Visual Search at eBay)”。


查看英文原文:Seven Tips for Visual Search at Scale.


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2018-12-31 08:006077
用户头像

发布了 52 篇内容, 共 28.2 次阅读, 收获喜欢 72 次。

关注

评论 2 条评论

发布
用户头像
沙发
2018-12-31 13:08
回复
用户头像
都没人看吗
2018-12-31 13:07
回复
没有更多了
发现更多内容

个保法一周年:APP监听?算法为洪水猛兽?看看专家如何解读

科技热闻

webpack配置优化,让你的构建速度飞起

Geek_02d948

webpack

Nodejs+Redis实现简易消息队列

coder2028

node.js

JavaScript刷LeetCode拿offer-js版字典

Geek_07a724

JavaScript LeetCode

【鲲鹏BoostKit】OminiRuntime ——高效统一的大数据分析Runtime底座

Geek_2d6073

vue3实战-完全掌握ref、reactive

yyds2026

Vue

js作用域、作用域链和它的一些优化

hellocoder2029

JavaScript

javascript尾递归优化

hellocoder2029

JavaScript

开源代码安全 | 西门子为保护代码安全采取了什么措施?

龙智—DevSecOps解决方案

SCA SCA工具 开源代码安全

简单两步,使用 cache 加快极狐GitLab CI/CD 构建速度

极狐GitLab

DevOps CI/CD cache runner 极狐GitLab

同事每天早下班,原来是用了这8个开发工具

慕枫技术笔记

后端 开发 11月月更

人工智能机器学习之Boosting算法

XiaoChao_AI

人工智能 机器学习 11月月更

人工智能自然语言处理之Transformer阐述

XiaoChao_AI

人工智能 自然语言处理 Transformer 11月月更

Nodejs相关ORM框架分析

coder2028

node.js

在线研讨会报名 | 如何通过自动化测试实现降本、增效与提质

龙智—DevSecOps解决方案

自动化测试 研讨会

技术指南 | 如何集成Perforce版本控制系统Helix Core (P4V) 与软件生命周期管理工具Helix ALM

龙智—DevSecOps解决方案

版本控制 软件开发生命周期 版本管理 ALM

深入分析React-Scheduler原理

xiaofeng

React

为啥不适合,依然有很多人大张旗鼓搞企业内部开源?(下)

laofo

研发效能

webpack热更新原理(面试大概率会问)

Geek_02d948

webpack

webpack模块化的原理

Geek_02d948

webpack

云栖盘点 | 一文 get 云原生峰会的最全发布

云布道师

云原生 云栖大会

Element UI 省市区数据联动

源字节1号

微信小程序 软件开发 前端开发 后端开发

Vue虚拟dom是如何被创建的

yyds2026

Vue

​GOPS演讲 | 如何构建现代运营与支持体系,实现团队的高效协同

龙智—DevSecOps解决方案

gops ITSM ITSM解决方案 GOPS全球运维大会

云栖盘点:2022 云网络产业干货分享

云布道师

云网络 云栖大会

成为web前端工程师培训和自学选择

小谷哥

升级到React-Router-v6

xiaofeng

React

几个你必须知道的React错误实践

xiaofeng

React

vue中的几个高级概念

yyds2026

Vue

Nodejs:ESModule和commonjs,傻傻分不清

coder2028

node.js

javascript 高级编程 之 Array 用法总结

hellocoder2029

JavaScript

如何做好大规模视觉搜索?eBay基于实践总结出了7条建议_文化 & 方法_Fan Yang_InfoQ精选文章