原文:A Machine Learning Approach to Ranking Answers on Quora
作者:KORNéL CSERNAI
译者:杰微刊兼职译者张万程
每天数以百万的用户使用Quora为他们的问题寻找答案,以此做出更明智的决策,找到梦想中的工作,让家庭过得更好,等等。对于我们来说提供一个优秀的阅读体验是非常重要的。根据答案的相关性和有效性做出排名是很关键的一部分,有用的答案应该靠前显示。
在这篇博文中,将介绍我们在Quora如何通过机器学习为答案排名。
前期尝试和基准
简单排名功能(例如比和差)以一个答案收到的好评/差评数量为基准解决答案排名问题。
虽然这样的基准是不错的,但也存在一些缺点:
1、实时性差:在我们收到评价之前无法对答案排
2、富者愈富现象:一些内容获得好评后,容易获得更多好评
3、搞笑答案的干扰:搞笑答案流行度非常高但对问题没有帮助
4、发现性差:新加入Quora的专家没有足够的粉丝让他们的答案得到更多的曝光,导致他们的答案排名低,进而吸粉困难,如此恶性循环
很明显,尽管这样的基准简单,快速,易于理解,但在很多情况下表现真得很糟糕。我们需要探索其他方式,比如浏览统计,但这些模型往往在其他方面是失败的,因为Quora有大量的结构化数据,所以我们想尝试一些更加复杂的模型。
我们自己的排名方式
答案排名是排序问题中的一种。在Quora我们还在解决一些其他排序问题,例如搜索,主页面种子,电子邮件,邀请回答,等等。我们的排序目标是根据相关性对一组文档进行排序。在大多数情况下都有上下文,例如相关用户的浏览记录,进而引入个性化问题。
我们在答案排名上尝试了很多方式,但在这篇博文中我们将专注于非个性化监管,逐步回归方式。监管方式意味着有一个训练集用来做特征提取和模型创建。逐步回归意味着这个模型会为每一个我们用来排名的答案打分。在接下来的几节中,将详情讨论我们如何收集数据,我们如何评估我们的模型,最后我们如何实现整个系统。
真实基础数据集
不管问题如何建模,我们希望能够客观地评估我们的模型。一种模型评价方式是跑A/B测试,测试指标数据。这种方式通常称为在线评估。另一种方式是离线评估,离线评估意味着我们模拟排名然后和一些好的排名做比较。离线评估真得很重要,因为它允许我们对模型做出快速迭代。我们选择了一种模型,它在两种评估中都表现优秀,但最终被选中还是因为在离线评估中的表现,因为了我们基本上相信为正确的事情做优化不是在短期内的用户行为,而是提供高质量的用户产品。
对于离线评估,难点在于不知道好的排名是什么样子。为此,我们不得不创建一些真实的基础数据集并对答案给出正确的排序。这是一个很困难的工作,因为并不是每一个人都对同一个答案有共同的评估,如果把个性化也考虑在内,这个工作就更加困难。在Quora我们认为好的答案要符合如下5原则:
1、对问题做出回答
2、每个对此问题感兴趣的人都能从答案中获取到知识
3、答案有依据支撑
4、论证可信内容属实
5、清晰易懂
从上面的截图中,我们可以看到一个好答案的例子。注意高亮区域,这里显示有大量的结构化数据可以在我们的预测中使用,例如,作者信誉,格式,好评等等。我们还有大量关于作者/好评的历史数据可以用来推断关于特定主题的专业经验和信誉。关于什么是好答案,如果想了解更多,请参考“Quora的好答案标准是什么?什么叫有帮助?”
创建一个好的数据集代价是相当昂贵的,但对于评估离线排序算法是相当有价值的。我们探索过多种方式来获取答案的真实价值。例如,我们又一次考虑使用答案列表,为答案标注好评和差评的比例。对于基础真实数据,相对来说这是一个好的开端。我们已经有大量这样的数据,因为Quora上有成千上万的答案具有差评和好评。但是,和前面提到的差评模型一样,标注数据也具有同样的问题,高流行度但低质量的答案(如搞笑答案)会获得较高的排名。
一些人获得训练数据集的方式是通过用户调查。这个调查可以询问用户他们是否觉得答案是有效答案。我们也可以通过这些信息调整这些用户可以看到的答案,对他们的未来参与度做出推断。所有这些方法都有他们的优缺点,在一个真实的场景下,我们希望尝试多种创造性的方法并将他们组合成一个权威的基础真实数据集。
端到端答案排名系统
特征与模型
在一个监管学习设定下,我们基于从训练集中提供的一些特征创建我们的模型。特征工程就是创建一些功能,可以将我们的样例映射到数值的过程。特征工程是模型成功的关键,同时也是创建一个好的机器学习系统最困难的部分。这和答案排序没有什么区别,我们在选择和实现正确功能上投入了很多。
利用我们对答案质量的直觉判断,我们测试了大量的特征。我们尝试的这些特征大致可分为三类,基于文本的特征,基于经验的特征,和基于作者/评价历史的特征。最初我们使用显示具有高回报率的文本特征,但一段时间之后,我们开始尝试得多一点,更高级一点的概念,如复杂语法。需要注意的一个重点是确保特征要有好的归纳。在这一点上基于文本的特征问题尤其严重。
很多次我们停止使用这些组合特征,重用基本机器学习模型的输出的合理结果。一个综合模型通常比单个特征效果要好,也是一个改善性能的好方法。例如,我们使用一个模型尝试预测用户在给定主题的专业水平,这个模型输出的特征被证实非常有效。
为了解决一般回归问题,我们尝试了几种模型:线性回归,逻辑回归,随机森林,渐变提振树,神经网络。他们大部分表现良好,特别是渐变提振树和一些深度学习方式非常有前途。
然而,对模型的评估可以有多种解释,每一次排序看起来不正确时,我们希望搞明白是什么导致,是不是我们的模型,是不是我们的特征,是不是我们的训练数据集,还是其他什么原因?众所周知,简单的模型更容易解释。例如一个线性回归模型只不过是一组关于特征的权重,但一个神经网络可以具有很多层,而且难于解释和可视化。因此我们也顷向于简单的模型和折衷的性能。
指标
正如”邀请回答Ofir Nachum的机器学习问题““ 里所提到的那样,至关重要的是我们选对了指标。对于我们来说,因为我们选择了逐点排序方式,我们选择了一些高级指标,一些是排序的,一些是逐点的。我们使用以下指标:
排序:NDCG,平均倒数排序,Spearman的Rho,Kendall的Tau
逐点:R2和均方误差
排序指标可以给我们提供很多关于算法的信息,但逐点指标也很重要,它们可以保证我们的分数接近大量训练集,并且不同的问题可以比较。
产品化
在这一节中,我们将讨论将排名实现端到端接入到产品系统时我们遇到的一些有趣的工程挑战。
当时用户将一个新的答案添加到Quora,我们希望可以立即在问题页面对这个新的答案排名,这样可以给用户提供流畅的用户体验。虽然模型的预测延迟非常低,但我们还要为新答案计算一些耗时的特征,我们发现这延迟会导致用户减少回答。所以我们创建了一个完全独立的模型只依赖易于计算的特征,用来为新添加的答案快速提供一个近似分数。一旦新的答案添加完成,我们异步重新计算更精确的分值。
一个关键的挑战使排名工作的实时性可以应对数百万的答案。问题页面可以容纳数以百计的答案。试想一下,一个系统在数百毫秒时间内计算几百个指标。问题页面的加载会持续10多秒时间。在这种情况下答案得分的计算需要更加快速,问题和答案可以缓存,这样问题页面可以在合理时间内加载。但是做为缓存的下游,如果特征值有任何的改动,我们都需要更新这个答案的分数。为了避免运算所有特征带来的昂贵开销,我们存储所有特征值。所有这些数据(数据得分和特征值)都存储在HBase,HBase是一个开源的NoSQL数据存储,可以处理大量数据的读写。
为每一个答案缓存分数,伴随而来的一个问题是当一些问题或用户特征发生改变时,我们需要更新很多答案。试想一个用户在Quora上拥有数十甚至数据千的情况。如果我们依赖于一些指标类似答案作者添加的答案数量,每当这个用户添加一个答案,我们就不得不更新他所有的答案分数。如果一个用户拥有很多答案而且频繁更新,情况就更糟糕了。为了缓解这一个问题带来的影响,我们决定围绕用户和问题对一些数据做整理。另外,我们尝试使用批处理的方式计算这些答案的分数以减少部分工作量。
所有这一切还不足以将更新降低到可控范围,所以我们基于决策树做了另一项优化。如果一个特征值对答案得分无关紧要,我们就停止更新。
所有这些优化组合起来将预测工作降低了70%,并且将模型工作大幅减少到我们可以接受范围。
总结和成果
总体而言,我们发现模型生成的分数比基准更好。同时我们还发现这些分数在不同的应用也很有价值,这要看如何定义好的答案:
1、隐藏答案,如果一个答案得分很低,很可能因为它是一个不好的内容而被隐藏。我们现在甚至在答案得到差评前就通知作者该内容会被隐藏。
2、高质量通知,收到一个低质量答案通知是一个很糟糕的用户体验。
3、改善首页种子排序。
总之,我们采取监管学习的方式预测答案的质量和排名。为了让答案有一个好的排序,我们进行了很多次迭代,我们团队中的很多人都做出贡献。最后,我们不断接近完美排序,在所有指标上超过基准50%,排序看起来好多了。我们成功实现了我们的目标,为读者和作者都提供了绝佳的用户体验。
尽管完成了这些改进,但仍然有大量的工作要做。例如,我们的模型没有考虑个性化。我们可以在答案文本建模的更多高级技术上做投入。我们可以探索可用于词序的回归神经网络(在一些早期实验中已经显示出优势)。或者,我们可以采用能利用更多数据的模型。总的来讲,我们可以在可以帮助我们理解问题或答案文本语义的自然语言处理(NLP)上投入更多。
如果你对答案排序和解决其他ML和NLP挑战感兴趣,我们鼓励你申请NLP工程师的工作