每天数百万人使用Quora寻找问题的答案,做出更好的决策,寻找梦想的工作,更好的照顾自己的家庭,等等。在问题页面提供更好的阅读体验,对我们来说非常重要。做到这点很重要的一步就是,根据与问题的相关性以及答案的价值排序,这样最有用的答案总是排在前面。
在这篇blog文章里,我们将描述,在Quora我们是如何使用机器学习给答案排名的。
早期尝试和基准线
赞成和反对票数量的简单排名函数(百分比,或者差值),可以作为排名问题一个不错的基准线。虽然这个基准线还不错,但是也有一些问题:
- 时间相关:我们在答案收到投票之前无法排名。
- 马太效应:内容一旦收获投票,则更容易收获更多的投票。
- 玩笑答案:玩笑答案往往很热门,但是不见得对问题有任何帮助。
- 可发现性:新加入Quora的专家,可能没有足够多的followers,他们的内容无法被看到,导致她们的回答永远在后面,然后他们就更难获得followers。
非常明显,虽然这样的基准线简单,快速,容易诠释,但是他们经常效果不佳。我们也可以用其他尝试,比如展示数,但是这些模型也各有各的问题。既然Quorayou大量的结构化数据,我们想尝试一些更复杂的模型。
我们的排名方法
回答排序属于一类问题叫做排序问题。我们在Quora还有很多其他的排序问题在解决,搜索,主页流,摘要邮件,邀请回答,等等。在排序问题里,我们的目标是根据相关性预测一组文档。大多数情况下,也包含一些附加的上下文,比如正在看结果的用户,也就是要引入个性化到这个问题里。
我们尝试过很多种回答排序方法,不过在本文,我们讲专注于非个性化supervised item-wise regression方法。一个supervised方法意味着,一个训练数据集,用来抽取特征,建立模型。Item-wise regression就是说模型会给每一个回答一个数值的分数,让我们用来排序。后面的站街,我们将深入细节讨论我们如何收集数据,我们如何验证我们的模型,最后我们如何在生产环境让整个系统循环起来。
基础信任数据集
不管问题如何被建模,我们希望可以客观的验证我们的模型。一个方法是使用A/B测试来验证模型,观察相关的指标。这通常被叫做在线验证。另外一种方法,离线验证,指的是我们模拟排名,然后用它们和一些已知的好的排名比较。离线验证非常重要,可以让我们非常快速的迭代我们的模型。对于答案排序,我们选择了一个模型,在这两种设置下都有最佳的性能,但是最后我们还是决定专注于离线验证,因为我们从根本上相信我们需要做的不是短期的优化用户行为表现,而是提供更高质量的产品。
对离线验证来说,难点在于如何知道好的排名是什么样子。为了达到这个目的,我们构建了一个答案排序正确的基础信任数据集。这非常困难,因为什么是好的答案,每个人想法都不一样,尤其是是当考虑到个性化的时候就更加困难了。在Quora我们定义一个好的答案要拥有如下5个特性:
- 不能答非所问。
- 给任何对这个问题感兴趣的人提供可以复用的知识。
- 答案必须符合基本原理。
- 示范必须可信,基础事实必须正确。
- 清晰,易读。
上面的截图,我们看到了一个好回答的例子。注意高亮区域,他们显示了我们可以用在我们的预测中的结构化信息,例如,作者的可信度,格式,赞同票,等等。我们还有很多作者和投票者的历史数据,来推断主题专业度以及可信度。更多关于好答案是什么样的的信息,参见“什么是Quora上好答案的样子什么叫做’有帮助’”。
创建一个好的数据集可能成本高昂,但是对在离线情况下验证排名算法极端重要。我们使用很多不同的方式来了解答案的真实质量。例如,我们曾经考虑使用一个答案列表,用赞同票和反对票的比例作为标签。这可以作为构建一个基础信任数据的一个不错的起点。这样的数据有很多,因为Quora上有成百万的答案既有赞同票也有反对票。然而,这种标签的问题跟之前反对票标签会遭遇类似的问题。它会把一些非常流行,但是低质量的答案(例如,玩笑答案)排在前面。
另外一种其他人得到训练数据的方法是进行一个用户调查。调查页面可能会问用户是否觉得某个答案有用。我们也可以尝试,结合用户正在看什么答案,以及他们未来参与等级如何,来推测这个信息。
所有这些方法都有它们的长处和缺点,在现实世界的设定下,我们可能想尝试很多种有创意的方法,然后尝试把它们都结合到一个权威的基础信任数据集。
问答排名系统循环
特征和模型
supervised学习设定下,我们使用从训练集抽取的一组特征训练我们的模型。特征选取就是用一组函数把我们的例子转换成数值的流程。
特征选取是一个模型成功的主要贡献者,也常常是构建一个好的机器学习系统最难的部分。在答案排名的案例里也一样,我们花了很大的功夫选择和实现正确的特征抽取。
我们用我们对答案质量的直觉测试了大量的特征。我们尝试过的特征可以大致分为三类:基于文本的特征,基于专业度的特征,基于作者投票者历史行为的特征。我们开始使用效果明显(高ROI,高投资回报率)的基于文本的特征,但是我们实验了一阵子,开始尝试更复杂的概念,比如句法复杂度(syntactic complexity)。很重要的是,观察确保我们的特征很好的泛化(generalize well)。考虑到这里文本特征实际上经常产生问题。
很多时候,我们最后组合特征,并且重用其他机器学习模型的输出,如果它合理的话。一个组合模型往往比单一特征更好,常常是提到性能的强大方法。例如,我们有一个模型尝试去估价一个用户对指定主题的专业度,从这个模型引出的特征结果非常有效。
为了解决这个通用回归(general regression)问题,我们实验了几个模型:linear regression、logistic regression、random forests、gradient boosted trees、 neural networks。很多都不错,特别是gradient boosted trees以及一些深度学习(deep learning)方法,非常不错。
然而,我们很在乎的模型可解释性——任何时候,排名看起来不对,我们想知道问题出在我们的模型,我们的特征,还是我们的训练数据,或者还是其他的原因。大家都知道模型越简单,就越好解释。例如,线性回归就是一组特征的权重,但是神经网络可能有很多层,难以解释和可视化。而且从性能考虑,我们倾向于简单的模型。
度量
“问答作为一个机器学习问题”一文中提到,寻找正确的度量是非常重要的。对于我们的目的,既然我们选择了point-wise排名方法,我们关注很多高级度量,有一些是基于排名的,有一些是point-wise的。我们使用如下的度量方式:
基于排名的:NDCG、Mean Reciprocal Rank、Spearman’s Rho, Kendall’s Tau
point-wise:R2、Mean Squared Error
基于排名的度量给我们关于算法的信息,同时point-wise的确保我们的评分在尺度上接近我们的训练数据,不同问题之间的答案也可以被比较了。
产品化
这个章节我们讨论,在我们的生产系统中,实现排名训练循环,我们面对的工程挑战。
当用户在Quora加上了一个新答案,我们希望尽快在问题页面给这个答案排名,以提供一个平滑的用户体验。虽然预测的延时非常低,但我们仍旧需要为新答案计算一些耗时的特征,然后我们发现这种延时会损害加入答案流程的用户体验。所以,我们创建了一个单独的模型,仅基于那些容易计算的特征,为新加入的答案提供一个还不错的近似评分,来快速排名。一旦答案被添加后,我们会异步的计算一个更准确的评分。
在上百万个答案上实时排名是一个核心的挑战。问题页面可以包含数百个答案。想象一个系统使用数百个特征,需要上百毫秒去计算。问题页面可能需要10秒钟以上去加载。在这种情况下,答案的评分必须更快的产生,所以,把答案评分缓存起来,以便问题页面可以在合理的时间内加载完成。但是,缓存的问题是,如果任何一个特征值变了,我们就可能需要更新答案的分数。为了节约重新计算全部特征的时间,我们也保存了全部的特征值。所有这些数据(答案得分、特征值),都保存在HBase,一个开源的NoSQL数据库,可以支撑大量的数据以及写入。
缓存每个答案的得分带来的一个问题是,当一些问题或者用户的特征改变时,我们需要更新大量的答案。考虑一个可能有上万个答案的用户。如果我们依赖于特征,例如用户的答案数,那么每次他增加一个答案,我们就需要更新他全部答案的评分。答案多的用户,往往添加答案也更频繁,这就更恶化了这个问题。为了缓解这个问题的影响,我们决定把部分用户和问题的数据组织起来。然后,我们尝试批处理计算这些答案的分数,减少重复的计算。
以上一切,仍旧无法把更新量降低到一个可以控制的范围,所以,我们在决策树内部做了其他的优化。如果更新一个特征不会影响到答案的评分,我们就不更新它。
以上全部的优化,把预测工作量降低了70%,我们的模型在我们目前的规模下可以高效的运行。
总结和结果
总体上,我们发现我们模型生成的积分,比基准线准确得多。我们同时发现,这些评分对很多基于好答案定义的应用都很有价值:
折叠答案。如果一个答案的积分太低,它可能是坏的内容,应该被折叠。我们现在还会在作者得到反对票之前,就提示他内容质量不够高,可能会被折叠。
高质量的通知。如果用户收到一个低质量答案的通知,那是一个非常坏的用户体验。
提高首页流的排名效果。
总体来说,我们使用supervised学习方法预测答案的质量和排名。得到一个好的排名效果,我们进行了大量的迭代,是我们团队中很多人的贡献的结晶。最终,我们在全部的度量标准下,相比基准线提高了50%的效果,缩短了和完美排名之间的差距,排名质量看起来很不错。最终,我们成功的通过排名给作者和读者,提供了更好的用户体验。
在这些改进的基础上,还有很多需要去做。例如,我们的模型还不能个性化。我们也可以多花些精力放在用更高的技术来给回答文本建模。我们可以研究Recurrent Neural Networks,它可以处理词序列(早期实验结果很好)。或者,我们可以使用一个可以处理更多数据的模型。总体上,我们会把精力放在更复杂的自然语言处理(Natural Language Processing (NLP))方法上,帮助我们理解问题和回答的语义。
原文:A Machine Learning Approach to Ranking Answers on Quora
来自:cofechina
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。