写点什么

Facebook 照片搜索技术揭秘

  • 2017-05-24
  • 本文字数:3598 字

    阅读完需:约 12 分钟

今天的人们使用智能手机拍摄的照片数量激增,这对传统的照片分类方式造成了不小的挑战。我们每个人整理自己手机中存储的海量照片尚且如此困难,对我们来说,要为所有人的照片定义一种更有序的分类方式无疑更是困难重重。

每天,人们会将数十亿张照片分享到 Facebook,想想你自己向下滚屏查找几天前发布的照片有多麻烦,如果要找几个月甚至几年前的照片呢?为了帮大家更容易找到自己的照片,Facebook 照片搜索团队使用机器学习技术深入了解照片内容,改善照片的搜索和获取过程。

我们的照片搜索功能基于一种名为 Unicorn 的内存和闪存索引系统构建,这种系统在设计上可以顺利搜索百亿至万亿级别的用户和其他实体。这套诞生于几年前的系统还驱动着能够理解社交图谱的 Graph Search 功能,以每天数十亿笔查询的强大能力为 Facebook 的多个组件提供着支撑。

Graph Search 的诞生是为了能根据不同社交图谱之间的关系获取相关对象,例如“所有住在旧金山的好友”。该功能的效果很不错,但如果要将查询约束在相关子集范围内,并按照相关性对结果进行排序或计分,进而提供最相关的结果,这种操作中该功能的效果很一般。为了继续完善这种技术,照片搜索团队使用深度神经网络,通过照片中的可视内容和可查找文字改善了图片搜索结果的准确性。

关于照片,搜索功能需要了解些什么

虽然 Imagenet Challenge 等竞赛中,图片识别技术的演示已经获得了非常低的错误率,但以 Facebook 的规模来说,理解照片内容是个很难达成的目标。好在相关应用领域的研究已经为我们提供了最先进的深度学习技术,足以在大范围内处理数十亿张照片,从中提取出可搜索的语义学含义。我们会使用一种名为图片理解引擎的分布式实时系统,分析处理发布到 Facebook 且公开展示的每张照片。

图片理解引擎是一种深度神经网络,其中包含数百万种可学习参数。该引擎以先进的深度残差网络(Deep Residual Network) 为基础,使用上千万张带标注照片进行了训练,可自动预测一系列概念,包括场景、物体、动物、景点、着装等。我们可以提前训练模型并将有用的信息存起来,进而以低延迟响应回应用户查询。

这个图片理解引擎为语义特征生成的高维浮点向量需要进行索引和搜索,但以Facebook 的规模来说,这是一种非常繁重的计算密集型任务。通过使用迭代量化和局部敏感哈希技术,该功能可进一步压缩出数量更少,但依然足以代表大部分语义的“位”。这些紧凑的“位”信息将直接嵌入照片中,借此可直接对照片进行评级、检索、去重等操作。搜索查询过程中,可通过嵌入的信息调整结果的展示顺序。这种技术与文档搜索和检索过程中使用的技术极为类似。Unicorn 最初诞生时包含适用于深度神经网络层的多种不同算法,这些算法都是针对大规模图片集的搜索开发而来的。Unicorn 可以用对象标签和嵌入语义创建搜索查询所需的索引。目前我们正在开发该技术的新版本,希望能将这种紧凑嵌入的信息用于低延迟检索。

在建模过程中使用标签和嵌入物

考虑到Facebook 的规模以及用户对快速响应查询的预期,我们无法对整个照片库使用过于复杂的评级模型。因此为标签和嵌入物使用了一种相关性模型,该模型可估算相关性并以极低的延迟提供查询结果。

概念相关性

这个相关性是通过丰富的查询,以及使用相似性函数对比概念集得出的照片概念信号进行评估的。例如,与照片查询中所用的“中央公园”概念直接相关的查询概念,可将与这一话题有关的照片放在首位,并从结果中隐藏所有“离题”的照片。

嵌入物相关性

通常来说,直接衡量查询与结果之间的概念关联性,这种做法不足以准确地预测相关性。我们创建的相关性模型会使用多模态学习(Multimodal learning) 技术了解查询和图片之间的联合嵌入关系。

该模型的输入端为查询的嵌入向量和照片结果,而训练目的在于将分类损失降至最低。每个向量将放在一起训练和处理,这一过程会使用多层次的深度神经网络生成一个二进制信号,结果为正意味着匹配,结果为负意味着不匹配。查询和照片的输入向量分别由各自的网络生成,每个网络可能包含不同数量的层。这种网络可以通过嵌入层的参数进行训练并调优。

嵌入评级损失

上文介绍的这种确定查询和照片之间相关性的方法可以用公式表示为一种分类问题。然而评级的主要目标在于确定照片搜索结果中一系列照片的最佳排序。因此我们在分类公式的基础上使用评级损失(Ranking loss) 进行训练,同时为同一个查询生成相关和不相关结果对。

如下图所示,模型右侧部分是左侧部分的深层复制(Deep copy),也就是说,他们共享了相同的网络结构和参数。在训练过程中,我们会将查询与两种结果分别放入模型的左侧和右侧组件中。对于每个查询,相符图片的评级会高于不相符图片。这种训练方式大幅改善了评级质量。

将对查询的理解应用给照片搜索

Unicorn 的照片语料以及图片理解引擎所应用的嵌入物均是可搜索的。如果应用于嵌入物的查询语义生成了更高概率的相关性,除了用于获取照片的索引,查询与检索之间的其他位图会被打断。理解查询语义过程中所使用的重要信号包括:

查询意图 (Query intents)建议了需要检索哪类场景的照片。例如一个意在检索动物照片的查询需要展示以动物为主题的照片。

语法分析 (Syntactic analysis)帮助我们理解查询语句的语法构造、词类词性、句法关系,以及语义。搜索查询通常无法识别书面语的语法,而这方面现有的解析程序效果并不好。因此我们使用了最先进的技术,对语言标记器(Speech tagger) 中神经网络部分进行有关搜索查询的训练。

实体链接(Entity linking)帮助我们找出有关特定概念的照片,通常会将结果以页面的形式呈现,例如不同的地点或电视节目。

重写查询知识以提取由查询的语义诠释提供的概念。概念不仅可以扩展查询的含义,而且可以弥补查询和结果之间不同词汇造成的差异。

查询嵌入物,这是一种用于代表查询本身的连续向量空间。该技术可在对词汇进行word2vec 向量呈现的基础上通过迁移学习(Transfer learning) 进行学习,借此将类似的查询映射至就近点。

领域和查询重写

当某人输入查询按下搜索键,会生成一个请求并发送到我们的服务器。该请求首先到达Web 层,在这里会收集有关该查询的不同上下文信息。随后查询以及相关上下文会被发送至一个顶级聚合器层,在这里查询会被重写为一个s- 表达式,随后描述该如何从索引服务器获取一系列文档。

根据查询意图,会由一个触发器机制使用神经网络模型决定相关联的领域(Vertical),例如新闻、照片,或视频,这是为了尽可能避免针对相关性较低的领域执行不必要的处理任务。举例来说,如果某人查询“有趣的猫咪”,那么这个意图很明显更希望看到照片领域的结果,此时我们会从搜索结果中排除掉新闻这个领域。

如果查询“万圣节”,此时将同时触发有关公开照片及好友的万圣节变装照片的意图,此时将同时搜索公开和社交圈照片两个领域,进而可同时返回搜索者的好友所分享的照片,以及评级为相关的所有公开照片。此时需要进行两个独立的请求,因为社交照片是高度个性化的,需要进行单独的检索和计分。为了保护照片隐私,我们会对搜索结果应用Facebook 整个系统都在使用的隐私控制机制。下图演示了一个上端为“社交”,下端为“公开”的模块。

第一阶段评级

当索引服务器根据s- 表达式获取到所需文档后,会交给经过机器学习训练的第一阶段评级器处理。随后分数最高,Top M 文档会被发送至Rack aggregator 层,借此对所获得的全部文档进行一定程度的合并,随后将Top N 结果返回至顶级聚合器层。第一阶段评级的主要目的是确保返回至Rack aggregator 的文档与查询依然保持一定的相关性。例如,在查询“狗”时,包含狗的照片无疑会比不包含狗的照片获得更高评级。为了能以毫秒级的速度提供相关照片,我们还对整个复杂的检索和评级阶段的延迟进行了优化。

第二阶段的二次评级

评级后的文档返回顶级聚合器后,会进行另一轮的信号计算、去重和评级。信号描述了整个结果分布情况的计算结果,借此可发现不符的结果。随后会使用图片指纹对视觉方面类似的文档进行去重。随后会通过深度神经网络进行计分和评级,借此生成最终的照片排序结果。评级之后的照片集(也叫做“模块”)会被发送到结果页面的UI 中显示出来。

针对照片搜索优化相关性评级

对查询与照片,以及照片与查询之间的相关性进行评估,这是照片搜索团队所面临最核心的问题,并且已经远远超出了基于文本的查询重写和匹配技术范畴。为此我们需要进一步全面理解查询、照片作者、照片附带贴文,以及照片中的可视内容。先进的相关性模型通常需要包含顶尖的评级、自然语言处理,以及计算机视觉等技术,借此才能提供相关性更高的搜索结果,为我们塑造一种新颖的图片分类系统,在大规模范围内更快速提供相关性更高的搜索结果。

阅读英文原文 Under the hood: Photo Search


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-05-24 19:006011
用户头像

发布了 283 篇内容, 共 113.0 次阅读, 收获喜欢 62 次。

关注

评论

发布
暂无评论
发现更多内容

基于Flink+ClickHouse打造轻量级点击流实时数仓

Apache Flink

flink

区块链来了 职业教育这么干

CECBC

区块链 职业教育

Hive UDF/UDAF 总结

windism

spring-boot-route(十六)使用logback生产日志文件

Java旅途

Java Spring Boot logback

C++函数模板的偏特化

Qing Wang

c++

蚂蚁金服架构师分享一套内部Java并发编程进阶笔记,白嫖太香了

Java架构追梦

Java 学习 架构 面试 并发编程

技术解读丨GaussDB数仓高可用容灾利器之逻辑备份

华为云开发者联盟

数据 容灾 备份

多种方式实现 LazyMan

局外人

大前端 队列 Promise

软件测试人员的职业发展之路

BY林子

软件测试 QA 职业发展

十年Java开发经验,走了五年弯路,整理了一份Java架构师进阶路线及进阶资料!

Java架构之路

Java 程序员 面试 程序人生 编程语言

如何获得工作成就感

滴滴普惠出行

区块链应用众多难题“卡脖子”

CECBC

区块链 金融 供应链融资

媒介狂想曲

善宝橘

媒介 想象

一文带你了解文字识别

华为云开发者联盟

技术 识别 文字

CloudQuery,数据库管理用它就够了!

BinTools图尔兹

数据库 sql 安全 工具软件

高难度对话读书笔记——表达自我

wo是一棵草

anyRTC直播带货解决方案

anyRTC开发者

音视频 WebRTC 直播 RTC

Java之父都需要的一本能够更深入地了解Java编程语言的书

Java架构之路

Java 程序员 面试 编程语言

Java-技术专题-Pattern类与Matcher类详解

码界西柚

通过MapReduce降低服务响应时间

万俊峰Kevin

mapreduce Go 语言

动态代理玩不明白?别紧张,你只是缺少这个demo

小Q

Java 编程 程序员 开发 动态代理

风雨边城

满天星

美食 旅行

SpringBoot-技术专题-Caffeine用法

码界西柚

干掉PPT!现场编码的职级晋升答辩你参加过么?

华为云开发者联盟

软件 开发者 API

血亏!阿里P8轻易把总结了近一年的java高级特性笔记送人了

996小迁

Java 学习 架构 笔记 Java高级特性

工作流引擎,企业运作加速器

Marilyn

敏捷开发 工作流 快速开发

是的,你没看错,自己的APP也能运行微信小程序了

FinClip

小程序flutter, 跨平台 小程序生态 移动开发

区块链的浪潮开始涌动了

CECBC

区块链 期货

比MySQL快839倍!揭开分析型数据库JCHDB的神秘面纱

京东科技开发者

数据库 JCHDB

重新学习面向对象设计之开放-封闭原则

IT老兵重开始

面向对象设计 OCP 开闭原则

Facebook照片搜索技术揭秘_Meta_Shengqi Yang_InfoQ精选文章