网络机器人吧社区

Quora基于机器学习的答案排序方式

技术风向标 2019-01-10 14:22:54


Quora对于问题回答的排序并不是简单的基于其获得的赞同/否定投票数,背后有着一套复杂的机器学习算法。Quora工程师Kornel Csernal撰文详细解释了他们如何解决对回答进行排序的问题。


每天都有数以百万计的人使用Quora来寻找他们问题的答案,来帮助他们做出更明智的决策、找到自己梦想的工作、提升家庭生活品质等等。所以在问题页面为他们提供一个良好的阅读体验非常重要。这其中很重要的一个部分就是将答案根据相关性与有用性进行排序,以便将最有用的答案显示在顶部。


在这篇博文中,我们将讲述在Quora我们如何使用机器学习的方法解决对回答进行排序的问题。

早期尝试和基线

把回答所收到的赞同/反对数进行简单的逻辑排序(例如比或者差),可以作为一个排序基线。尽管这个基线很不错,但仍有一些缺点:

 

  • 时间敏感性:在回答收到投票之前,它们不能被排序;

  • 马太效应:一个回答收到的赞同数越多,那么后续它也更有可能被点赞;

  • 搞怪回答:搞怪回答可能很受欢迎,但不一定有必要在问题页面显示出来;

  • 可发现性:新加入Quora的专家可能没有足够的粉丝,这样他们的回复内容很容易被忽视,导致他们的回答排名很低,于是又阻碍了他们得到更多的粉丝。


显然,这样的基线简单快速易于理解,但在很多情况下它们都表现糟糕。还有其它的方法,比如说使用浏览数,但这些方法往往有其它方面的问题。既然Quora有大量结构化的数据,我们就想到利用这些数据做出一些更复杂的模型。

我们解决排序问题的方式

回答排序属于排序问题的一种。在Quora我们还遇到过许多其它的排序问题,比如搜索、首页反馈、电子邮件摘要等等。


对于排序问题,我们的目标是对一系列文件进行相关性排序的预测。多数情况下,还要考虑其它的内容,比如为问题吸引相关的用户,以便提供个性化的服务。


我们尝试了很多方法来解决回答排序问题,但是这篇博文中,我们将着重讲述一种非个性化的、监督式的元素智能回归方法。监督式方法有一个用于训练的数据库,用来提取特征和创建模型。元素智能回归就是说这个模型将会为每一个回答进行评分,以便我们进行排序。接下来的章节将给出我们收集数据,评估模型,以及最终产品整个系统端对端的实现细节。

基本的真实数据库

不论对问题如何建模,我们都希望能客观地评价我们的模型。一个评价模型的方法是进行A/B测试,然后观察相关的指标,这通常称为在线评估。另一方面,离线评估的意思是我们可以进行模拟排序并将其与已知的好的排序方法进行比较。离线评估非常重要,它允许我们对模型进行快速迭代。


对于答案排序,我们选择了一种在线评估与离线评估都表现很好的模型,但最终重点关注于离线评估上。因为我们认为,真正需要的优化不是为了迎合用户的短期行为,而是真正提升产品的质量。


离线评估的难点在于弄清楚最佳排序应该是什么样子。为此,我们不得不创建一个真实的答案的正确排序。这很困难,因为并不是每个人对优秀答案的标准都一样,而当考虑到个性化的时候,这个问题就更复杂了。在Quora,我们定义优秀答案具有如下五个特征:

 

  • 回答切题,正面回答所提出的问题。

  • 对这个问题有兴趣的其它人,可以重复使用回答中所提供的知识。

  • 回答有理有据。

  • 展示了可信性并且确实是正确的。

  • 清晰易读。




在这个截图中,我们可以看到优秀回答的示例。标记的高光区域显示了有很多可以用来帮助预测的结构化信息,比如作者的可信度、格式标准度和收到的赞同数等。


我们还可以使用关于作者/点赞人的历史数据来推断回答人在特定领域的专业程度和可信度。对于优秀回答定义的更多细节,请查阅“Quora上的优秀回答应该是什么样子?“有帮助的”意味着什么?”一文。

 

创建一个好的数据库代价昂贵,但对评估离线设置的排序算法非常有用。我们探索了很多不同的方法来确定回答的真实质量。比如说,我们再次考虑到按回答收到的赞同与反对的比例进行排序。对于基本的真实的数据,这可以作为一个相对较好的迭代起点。在Quora上已经有数以百万计的回答有了赞同和反对投票。但是,这个方法还会遇到之前提到过的”反对模型”所遇到的问题。它可能会将一些很受欢迎但质量并不高的回答(比如搞怪回答)排序靠前。

 

另外一个得到训练数据的方法是进行用户调查。可以通过调查询问用户觉得这个问题是否有用。我们还可以从人们看了回答后的行为,以及他们之后是否继续寻找回答来推断这些回答是否有用。

 

所有的这些方法都各有优缺点。在现实设置中,我们想要尝试更多更有创意的方法,并且综合利用他们来创建一个权威的基础真实的数据库。



端到端的回答排序系统


特征与模型

在监督式的学习设置中,我们基于从训练模式中得到的特征建立了我们的模型。特征工程是将特定函数从学习示例推广到更大数据的过程。特征工程是建模成功最重要的部分,也通常是建立一个优秀的机器学习系统中最难的部分。在回答排名问题中也是如此,我们为选择和实现正确特征做了大量的工作。


我们根据对答案质量的直觉测试了大量的特征。这些特征大致可以分为三类:


  • 基于文本的特征;

  • 基于专业性的特征;

  • 基于作者/点赞者历史数据的特征。


我们一开始尝试的是具有明显高回报率的基于文本的特征,但一段时间后又尝试了句法复杂度等更先进的特征。重点是确保我们特征的可推广性要好,而基于文本的特征在这方面是有问题的。

 

很多时候,我们都把特征与其它有效的机器学习模型的输出结果结合使用。集合模型通常比仅仅使用单个特征表现更好,这是提高性能的有效方法。比如说,我们有一个模型来估计用户在某个特定领域的专业程度,这个模型的输出(与特征结合起来使用)是相当有效的。

 

为了解决一般回归问题,我们尝试了大量的模型:线性回归、逻辑回归、随机森林、梯度提升决策树、神经网络等。这些方法中的许多都很有效果,尤其是梯度提升决策树和一些深度学习方法非常有前途。

 

然而,我们评价模型需要解释更多——每一次排序看上去不正确的时候,我们都想知道问题出在哪里,是我们的模型、特征、训练数据,还是其他地方出了问题。众所周知,简单的模型更容易被解释。比如说,线性回归模型只是一组特征的权重,但是神经网络可以有很多层,而且很难解释或可视化。因此,我们也倾向于简单的模型,尽管这要牺牲一些性能。

指标

就像Ofir Nachum在Ask To Answer as a Machine Learning Problem提到的,选择正确的指标很重要。我们对目标采用了点方式排序的方法,并考察了很多先进的指标,其中有些是基于等级的,有些是点方式的。我们使用了如下指标:


  • 基于等级的:NDCG, MRR(Mean Reciprocal Rank), 斯皮尔曼等级相关系数, Kendall等级相关系数;

  • 点方式的:R2, 和均方误差。


基于等级的指标能给我们关于算法的很多信息,而点方式的指标也很重要,它确保我们的评分与我们的训练数据很接近,而且不同问题之间的答案也可以进行比较。

产品化

本节将讲一讲我们在产品系统中实现端对端排序时遇到的有意思的工程挑战。

 

当用户在Quora上添加了一个新的答案,为了提供好的用户体验,我们想要尽快在问题页面上把这个答案进行排序。尽管我们预测模型的延迟非常低,我们仍然要为这些新答案计算一些昂贵的特征,我们发现这个延迟不利于添加答案时的用户体验。所以我们创建了一个完全独立的模型,为了能快速地为新回答提供一个大致合适的分数,这个模型只对新回答的特征进行计算。一旦回答已经被添加,我们再通过正式的模型为回答重新计算一个更为精确的分数。


关键点是需要对数百万的回答进行实时排序。问题页面可能包含数百个回答。想象一个系统可以对数百个特征进行计算而只需要一百毫秒。而问题页面可能都需要超过10秒的时间来登陆。在这种情况下,必须尽快地提供回答的分数。把回答的分数缓存起来是有意义的,这样问题页面就可以在合理的时间内加载。但是缓存有个缺点是,如果任意一个特征值发生了变化,我们就需要更新回答的分数。为了避免对所有特征进行重新计算的高昂代价,我们将回答的评分存储在HBase中,这是一个开源的NoSQL数据存储器,可以处理大量的数据与写入。

 

如果我们缓存每个回答的评分,又会出现一个新问题,即当一些问题或者用户特征发生变化时,我们需要更新大量的回答。对那些在Quora上有很多回答的用户尤其如此。如果我们将用户所做的回答数量作为一个特征,那么每一次他们增加新回答的时候,我们都不得不立刻更新他们所有回答的评分。考虑到拥有较多回答的用户更有可能经常添加新的回答时,这种情况尤其不利。为了减轻这个问题的影响,我们决定围绕用户和问题考虑一些新的数据。此外,我们还尝试过以批次的形式计算这些回答的评分,而避免以单个问题进行计算时的重复工作。

 

所有这些仍不足以将更新减少到一个可控的数量,所以我们又做了一个基于内部决策树的优化。我们决定在迭代到特征不再影响答案评分的时候,停止更新这些特征。

 

所有的这些优化结合起来,可以将预测工作量减少约70%,这就使得我们的模型在可接受的范围内工作。

总结和结果

总体而言,我们的模型所产生的评分比基线分数要准确得多。我们还发现在不同的应用环境下,改变对优秀答案的定义,所产生的评分仍然非常有用:


  • 隐藏答案:如果一个回答的评分很低,这可能是因为它的内容较差,应该被隐藏。现在甚至在那些回答收到反对之前,我们就可以告诉那些作者他们的回答可能会被隐藏。

  • 高质量回答的通知:收到一个回答通知,点开后却是一个低质量的回答,这是一个非常糟糕的用户体验。

  • 改善主页反馈排序。

 

总结起来,我们采用监督式学习的方法来预测回答的质量并进行排序。将回答进行有效的排序花费了很多次迭代,这些都归因于我们团队成员的贡献。最终,我们能够达到一个接近完美排序的状态,每一个指标都比基线排序好50%以上,而且排序结果看起来也确实更有质量。总体而言,我们通过排序成功达到了我们的目标,即为提问者与回答者都提供一个更好的用户体验。

 

但是,即便有了这样的改进,我们仍然有许多工作要做。比如说,我们的模型还没有考虑个性化;应用更先进的技术来建立文本模型;探索那些对文字序列有用的循环神经网络(早期实验显示这有很大的潜力);用一个能使用更多数据的模型;或者还可以在复杂的自然语言处理(NLP)方法上增加投入,来帮助我们理解那些问题/答案文本的语义。

推荐阅读
 

1. 分布式消息系统Apache Kafka那些事儿

2. 深入理解git,从研究.git目录开始

3. 艰难的重构:10大常见的重构误区 

4. 性能提升70%,Netflix的网站提速最佳实践  

5. Git常用命令总结

6. 15个你必须知道的Facebook开源项目

7. 深入研究Android推送技术

8. iOS开发神器Injection for Xcode:成吨的提高开发效率


微信公众号"技术风向标",关注IT趋势,承载前沿、深入、有温度的内容。长按下方二维码加关注。

Copyright © 网络机器人吧社区@2017