傅一洋、VVN、笪洁琼、钱天培编译

看照片挑民宿:Airbnb如何重新训练ResNet50,实现房间图片分类优化

走进Aribnb位于旧金山总部的办公楼,你会看到一个个装修各异的会议室。这些会议室正是Airbnb形形色色民宿的缩影。

Airbnb为数百万的民宿提供了一个平台,也因此囊获了一大批民俗房间细节照片和用户数据。

坐拥百万级别的用户数据,Airbnb的数据团队可谓将数据的价值发挥地淋漓尽致。传统的推荐系统、广告系统自是不用说,深度学习的应用更是让Airbnb的数据有了前所未有的价值。

今天,文摘菌就要分享一篇来自Airbnb数据团队的课题小报告。让我们一起来看看,Airbnb的数据科学家们(Shijing Yao, Qiang Zhu, Phillippe Siclait)是怎么将他们的图片数据玩出花样的。

Airbnb在旧金山总部的会议室

数据真的是新石油么?

如果把这个问题抛给Airbnb的数据团队,那他们一定会给出一个坚定的答复:一点儿没错!

Airbnb为数百万的民宿提供了一个平台。全世界的旅行者都在这个平台上为他们的旅行寻找到最满意的家。而对于这些房屋除了地段和价格外,房屋本身的照片是最能影响用户决策的因素之一了。

然而直到目前,我们对这些照片了解的甚少,Airbnb形态各异的民宿也增加了我们分析这些照片的难度。

当旅行者在浏览一张房屋的照片时,我们暂时无法为用户提供最能准确反映民宿情况的图片,也无法为房东提升照片的吸引力提供指导和建议。

客厅、厨房、卧室、浴室图片示例

得益于如今计算机视觉深度学习的优势,我们终于可以规模化地解决这一问题了。

我们今天的目标是图片分类。这样,一方面我们能将具有相似风格的房源聚集到一起,方便用户浏览。另一方面,分类也可以帮助验证房间数量和房屋信息的准确性。在不久的未来,我们将对这些图片进行更深的研究,预计还能发掘出许多潜在的信息。文章的最后我们会展示一些实例。

图片分类

正确的图片分类对优化提升用户体验是极具意义的。从客户端来讲,分类便于对一系列照片的重新排序,确保最先看到的都是最感兴趣的内容;从房东的角度来讲,分类为审查照片的清单提供了便利,帮助房东确保自身能满足市场的高标准。而精准的照片分类是这些核心功能得以实现的基石。

我们最先进行分类的对象房屋类型包含了卧室、浴室、客厅、厨房、游泳池和园景,我们后期还会根据产品团队的需要,添加房间其他的元素。

房间类型分类问题类似于ImageNet上的图片分类,期望输出的是具有用户个性化的结果。这就使得诸如VGG,ResNet这样的现成又先进的深度神经网络模型(DNN)是没办法直接使用的。

当然,网上有许多很棒的帖子,告诉人们如何使用这些模型来解决这类问题。其中,最基本的两步是:1.修改DNN模型的最顶层以保证输出结果符合要求;2.重新训练DNN网络以确保达到想要的预期。

通过几次实验,我们选取了ResNet50网络作为驱动,由于它在模型性能和计算时间上具有良好的平衡性。同时,为了确保与用例的兼容性,我们加入了两个额外的全连接层和一个Softmax激活函数

相关链接:

https://arxiv.org/abs/1512.03385

重新训练ResNet50模型

修改后的RESNET50的体系结构基础模型图

ResNet50模型的重训练有三种方法:

  1. 保持基础ResNet模型,仅以最小的数据量重新训练新添加的两层。也称作微调。

  2. 同1一样的微调,但数据量更大。

  3. 重新训练整个ResNet50模型。

绝大多数的在线教程会使用第一种方法,计算省时且结果可观。我们也确实通过第一种方法得出了合理的最初结果,然而为了满足分类结果质量的高标准,我们需要更显著地提高模型性能——保证95%+的高精度和80%+的召回率。

为了兼顾精确率和高召回率,我们意识到必然要用到海量的数据对DNN模型进行重训练,然而这里存在两个挑战:1.即使拥有大量来自用户上传的照片数据,我们却无法对其打上精确的标签;2.重新训练ResNet50的DNN模型任务量非常重要—需要2500万训练参数,对GPU要求极高。下面,我们就来详细介绍我们是如何应对这两个挑战的。

图片标题管理

许多公司会依托第三方供应商来获取高质量的图片标签。然而在数以百万计的照片需要标签的情况下,这显然不是最具性价比的解决方案。

为了权衡成本和性能,我们采取一种混合的方案,一方面,委托第三方对少量打标签,通常是成千上万张照片。以这些具有标签的数据作为模型的评估标准,采用随机抽样法来建立这一标准,以确保标准数据的平衡性;另一方面,利用房东上传的照片标题数据作为房屋类型信息的代表,并从中提取标签。

这种方案对我们来说是非常有意义的,明显降低了标签所需的高昂成本。我们仅仅需要一套明智的方法来确保从图片标题中提炼的房屋类型标签准确可靠。

从图像标题中提取房间类型的标签似乎是一种可行的方法:如果某张图片的标签中包含有某种明确的房屋类型关键词,那么图片就该加以相应房屋类型的标签。然而现实情况往往更加复杂:这种方法的结果是令人失望的。太多的情况下,图片标签与图片实际内容相差甚远,如下一些例子:

错误的标签提炼示例

为了筛除这些错误的情况,我们又额外增加了一条规则。经过几轮筛选和检查,标签质量有了明显的提升。以下就是一个实例,展示了我们是如何将标签中含有“厨房”关键字的数据进行筛选,以获得真正描述“厨房”的图片。

代码段:

AND LOWER(caption) like '%kitchen%' AND LENGTH(caption) <= 22 AND LOWER(caption) NOT LIKE '%bed%' AND LOWER(caption) NOT LIKE '%bath%' AND LOWER(caption) NOT LIKE '%pool%' AND LOWER(caption) NOT LIKE '%living%' AND LOWER(caption) NOT LIKE '%view%' AND LOWER(caption) NOT LIKE '%door%' AND LOWER(caption) NOT LIKE '%table%' AND LOWER(caption) NOT LIKE '%deck%' AND LOWER(caption) NOT LIKE '%cabinet%' AND LOWER(caption) NOT LIKE '%entrance%'

由于这些额外的过滤器,我们丢失了许多图片数据。但是这没有明显的不良影响:即便采用了如此激进的筛选方法,我们仍然为每个房屋类型获取了成百上千张照片,累计达几百万张。

而且,通过与标准平衡数据集的对比,我们发现标签的质量显著提升了。这里我们假设数据分布没有随着过滤而改变。究竟是不是这样,那就要看模型在测试数据集上的表现了。

未来,我们希望利用NLP技术对图片标题进行动态聚类,取代目前基于规则的启发式算法。然而就目前而言,还是会继续采用启发式算法。

建模、评估、求解

左:8核并行训练的GPU性能,右:分布式SGD:从Quoc v.Le中引用的图表

要想用几百万张图像重新训练像ResNet50那样的DNN模型需要大量的计算资源。我们在带有英伟达8核K80GPU的AWS P2.8xlarge实例上进行训练,在每个训练步骤中,我们向8个GPU发送一批样本(batch),每一批样本共128张图像。

我们使用Tensorflow作为后端进行并行训练,在并行后进行编译,否则训练无法进行。为了进一步加快训练速度,我们从keras.applications.resnet50.ResNet50中加载已经训练好的图像网络权重,用这些权重对模型权重进行初始化。

经过3个训练时期(epoch),历时约6个小时后,模型达到了最好效果,之后模型便开始过拟合验证集的效果也不再提升了。

值得注意的是,我们对房间做分类时采用的是多个二分类模型,而不是采用一个包括所有房间类型的多分类模型。这么做并不理想,但由于我们的模型主要还是离线(offline)的,多次调用模型造成的额外延迟对我们的影响很小。以后我们很快就会转为训练多分类模型。

我们用精确率(precision)和召回率(recall)对模型进行评估,并用F1分数(F1-score)和准确率(accuracy)等指标对模型进行监控。

这里再重新回顾一下这几个指标的定义:简而言之,精确率描述了预测为正的样本中有多少为真正的正样本,召回率描述了样本中的正例有多少被正确预测了,精确率和召回率通常是互相制约的。

在我们这个例子中,我们对精确率设定了一个比较高的标准(95%),因为当我们说这张照片属于某种房间类型时,我们应该对这个说法有很高的信心。

混淆矩阵与精确率、召回率、F1分数、准确率的定义

混淆矩阵是计算这些矩阵的关键。我们模型的原始输出是对每个图像给出一个范围在0到1内的概率分数,要计算出一组预测值的混淆矩阵,首先要设置一个阈值,将预测分数转换为0或1,然后通过从0到1调整阈值取值,生成精确率-召回率(PR)曲线。原则上,PR曲线的AUC(曲线下面积)越接近1,模型越精确。

人为标记的标签作为真实标签。有趣的是,我们发现不同房间类型的模型准确率不大一样。房间类型为卧室和浴室时的模型是最准确的模型,而房间类型为其他时的模型则不太准确。简洁起见,我们只展示房间类型为卧室和客厅时的P-R曲线,其中虚线的交叉点表示给定某个阈值时的模型效果,图中还展示了此时各个指标的摘要。

房间类型为卧室时的PR曲线

房间类型为客厅时的PR曲线

这里有两个重要的发现:

  • 房间类型为卧室时模型的整体表现远胜于房间类型为客厅时的模型表现。对此有两种可能的解释:1.卧室比客厅更容易分类,因为卧室的布置相对标准,而客厅的布置则相对更加多样化。2.从卧室照片中提取的标签比从客厅照片中提取的标签质量更高,因为客厅照片有时还包括饭厅或厨房。

  • 无论是哪种房间类型,完全重新训练的模型(红色曲线)要比部分重新训练的模型(蓝色曲线)具有更好的表现,而且房间类型为客厅时,这两个模型之间的差距比房间类型为卧室时的更大。这表明重新培训一个完整的ResNet50模型对于不同的房间类型有不同的影响。

在我们训练的6个模型中,精确率一般在95%以上,召回率一般在50%以上,人们可以通过设置不同的阈值对这两个指标进行权衡。这个模型旨在为Airbnb内部的多个产品团队提供多种不同的产品。

用户将我们的结果与一些有名的第三方图像识别API进行了比较。根据他们反映,我们这个对房子内部结构进行分类的模型,总体上优于第三方的模型,这说明当我们做某个自己感兴趣的任务时,通过使用自己的数据,我们也有机会超越业界最先进的模型。

最后,我们想展示一些具体例子来说明这个模型的强大功能。

左边两张照片被正确地预测为卧室,右边两张照片被正确地预测为“不是卧室”

左边两张照片被正确地预测为浴室,右边两张照片被正确地预测为“不是浴室”

左边两张照片被正确地预测为泳池,右边水族馆和海滨的两张照片被正确地预测为“不是泳池”

除了分类以外,我们还做了些别的

在做这个项目时,我们也尝试了一些除了对房间类型进行分类以外的有趣想法。在这里我们想展示两个例子,让人们了解到这些问题有多令人振奋。

非监督的场景分类

在我们刚开始尝试使用预先训练好的ResNet50模型对房间类型进行分类时,我们生成了图像的嵌入向量(维度为2048x1的向量)。为了解释这些向量意味着什么,我们使用PCA技术将这些长向量投影到2D平面上。

令我们惊讶的是,投影后的数据被自然地聚为两类。纵观这两个分类,我们发现左边的分类几乎都是室内的场景,右边的分类则几乎都是户外场景。这意味着无需再进行任何训练,只需在图像嵌入向量的第一个主成分上设置一条切割线,就可以确定室内和室外场景。这一发现为无监督的迁移学习(嵌入)等有趣的领域开启了大门。

室内和室外的照片被自动聚类为第一和第二主成分

目标检测

我们尝试努力的另一个领域是目标检测。预先训练好的Faster R-CNN已经在开放的图像数据集上达到了惊人的效果。

在下面的例子中你会看到,该模型能够检测到门、窗、餐桌及其位置。 通过使用Tensorflow Object Detection API,我们对房主上传的照片做了一些快速评估。使用现成的结果已经可以检测到很多家居设施。

未来,我们计划使用Airbnb定制的便利标签重新训练Faster R-CNN模型。由于开源数据中缺少一些这样的标签,我们可能会自己创建标签。通过用这些算法检测到的设施,我们可以房主上传的图片质量,并帮助客人更方便地找到具有特定环境需求的房屋,这将把Airbnb的照片智能前沿推向更高水平。

门、窗、餐桌被成功检测

结论

以下是一些重要结论,可能会对各位深度学习实践者有用:

首先,深度学习不过是一种特殊的有监督学习,我们不能高估高质量标签对数据的重要性。由于深度学习通常需要大量的训练数据才能达到出色的表现,因此寻找一种有效的标记方法显得至关重要。幸运的是,我们发现了一种经济的、可扩展的且可靠的组合方法。

其次,从零开始训练像ResNet50这样的DNN模型可能会相当复杂。不妨试试以简单快速的方式开始——使用小的数据集只对网络最上面的层进行训练。如果您确实有大量可训练数据集,从头开始重新训练DNN可能能让模型能达到更好的表现。

第三,如果可以的话,进行并行训练。在我们的例子中,我们通过使用8个GPU获得了大约6倍(准线性)的加速。这使得建立复杂的DNN模型在计算上可行,而且也让超参数和模型结构上的迭代变得更加容易。

原作者按

这项工作是与Krishna Puttaswamy、Xiaohan Zeng 和Alfredo Luque合作完成的,整个公司的员工帮忙推出了这个产品的功能。我们还要感谢Keras、Tensorflow、Open Images Data、ImageNet等开源库的贡献者和和ResNet的发明者,我们从这个友好的开源社区获益匪浅。最后,我们要感谢Jeff Feng和Rebecca Rosenfelt在校对方面的热情帮助。

秉承“普及数据思维,传播数据文化,助⼒产业发展”的企业⽂化,我们专注于数据领域的资讯、案例、技术,形成了“媒体+教育+⼈才服务”的良性⽣态,致⼒于打造精准数据科学社区。

入门深度学习AirbnbResNet50图片分类
2
相关数据
激活函数技术
Activation function

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

分类问题技术
Classification

分类问题是数据挖掘处理的一个重要组成部分,在机器学习领域,分类问题通常被认为属于监督式学习(supervised learning),也就是说,分类问题的目标是根据已知样本的某些特征,判断一个新的样本属于哪种已知的样本类。根据类别的数量还可以进一步将分类问题划分为二元分类(binary classification)和多元分类(multiclass classification)。

混淆矩阵技术
Confusion matrix

混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。具体评价指标有总体精度、制图精度、用户精度等,这些精度指标从不同的侧面反映了图像分类的精度。在人工智能中,混淆矩阵(confusion matrix)是可视化工具,特别用于监督学习,在无监督学习一般叫做匹配矩阵。矩阵的每一行表示预测类中的实例,而每一列表示实际类中的实例(反之亦然)。 这个名字源于这样一个事实,即很容易看出系统是否混淆了两个类。

深度神经网络技术
Deep neural network

深度神经网络(DNN)是深度学习的一种框架,它是一种具备至少一个隐层的神经网络。与浅层神经网络类似,深度神经网络也能够为复杂非线性系统提供建模,但多出的层次为模型提供了更高的抽象层次,因而提高了模型的能力。

计算机视觉技术
Computer Vision

计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。目标识别和面部识别也是很重要的研究领域。

超参数技术
Hyperparameter

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

过拟合技术
Overfitting

过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。

推荐系统技术
Recommender system

推荐系统(RS)主要是指应用协同智能(collaborative intelligence)做推荐的技术。推荐系统的两大主流类型是基于内容的推荐系统和协同过滤(Collaborative Filtering)。另外还有基于知识的推荐系统(包括基于本体和基于案例的推荐系统)是一类特殊的推荐系统,这类系统更加注重知识表征和推理。

参数技术
parameter

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

监督学习技术
Supervised learning

监督式学习(Supervised learning),是机器学习中的一个方法,可以由标记好的训练集中学到或建立一个模式(函数 / learning model),并依此模式推测新的实例。训练集是由一系列的训练范例组成,每个训练范例则由输入对象(通常是向量)和预期输出所组成。函数的输出可以是一个连续的值(称为回归分析),或是预测一个分类标签(称作分类)。

迁移学习技术
Transfer learning

迁移学习是一种机器学习方法,就是把为任务 A 开发的模型作为初始点,重新使用在为任务 B 开发模型的过程中。迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务,虽然大多数机器学习算法都是为了解决单个任务而设计的,但是促进迁移学习的算法的开发是机器学习社区持续关注的话题。 迁移学习对人类来说很常见,例如,我们可能会发现学习识别苹果可能有助于识别梨,或者学习弹奏电子琴可能有助于学习钢琴。

验证集技术
Validation set

验证数据集是用于调整分类器超参数(即模型结构)的一组数据集,它有时也被称为开发集(dev set)。

权重技术
Weight

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

深度学习技术
Deep learning

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

张量技术
Tensor

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

准确率技术
Accuracy

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

推荐文章