[译] Twitter 时间线引入机器学习

写在前面:

翻译这篇文章,是看到后想起之前也试图给SF 优化时间线(已经上线了有好几个月了),相比现在的twitter 确实很简陋。而且也没有把时间线放在醒目位置。事实上,SF 的时间线在我加入之前已经存在很久了,包括上次的优化都在讨论要不要直接提出来作为首页。工具化 or 社交化? 思考了很多之后,还是只作为了实验项目(选择作为首页or not)保留。
而这篇twiiter关于时间线的排序算法优化则“高级”了很多(想来不止twitter,大多数的社交产品都在时间线上花了不止一次的迭代优化算法尝试,总是众口难调,却也总是在为数据优化不断尝试),引入了机器学习算法,让早期的算法通过训练变得更加精准–结尾给出了非常乐观的总结。
于我而言,文章最有用的地方大概是前文关于时间线改版的迭代总结了,个人觉得机器学习那块可能还是翻译的不够准确–也跟自己对机器学习这块了解不够的缘故吧。但也如文末的总结一样,机器学习的潜力和作用长远来看一定是不可估量的。那么,就用最近在读的《机器之心》作者预言的话作为这段啰嗦的结尾吧:

但是到了21世纪,机器将会在这个排他性十足的环境中与人类同行,长久相伴

原文地址 : Using Deep Learning at Scale in Twitter’s Timelines

By: Nicolas Koumchatzky and Anton Andryeyev

译文部分:

一年多的时间里我们都不断在优化呈现给用户的时间线,为了给用户提供更相关和精准的时间线内容我们不断的提高这里面的算法机制。

今天我们将阐述一下如何通过深度神经网络来优化我们的排序算法,这也得益于 Cortex (Twitter 内部 AI 技术团队之一) 的AI平台和建模能力。简言之:这意味着时间线内容与用户的关联度更紧密了,而在未来,这也敲开了我们利用深度学习社区的创新和新技术来更好优化产品的大门,尤其是在自然语言处理(NLP),对话理解和传媒领域。

我们是如何排序我们的时间线的?

在我们的排序算法之前,用户的时间线内容展示方式其实很简单: 所有的推文都是你关注的用户产生的内容,我们会把你上次访问后这些关注用户产生的新内容聚合并以最新到最旧的时间顺序展示出来。尽管概念简单,但因为推特的成千上万的用户体量每秒产生的内容也是巨大的,这对我们的技术架构和运维都是不小的挑战。

而在引入了排序算法之后,我们新增加了一个特征。在聚合了所有推文之后,我们会建立一个相关模型。这个相关模型会给每条推文一个关联分值,用于预测每个用户对于这条推文的感兴趣和关注程度。关联分值高的一些推文就会出现在你的时间线顶部,其它的推文内容则在这些相关推文的下方。考虑到我们给你推荐兴趣推文数量以及你两次访问网站的总时间间隔,我们可能也会向你推送「避免你错过」模型。这个模型仅仅包含一小部分在相关模型中关联分值最高(并也按由高到低)的推文,区别于相关模型中的推荐推文来看,后者都是按时间顺序排序的(对比的,避免错过模型应该不是)。这样做的目的是希望你能第一眼看到你最感兴趣的最佳推文—毕竟时间线内容是很长很长的。

为了能预测到某个你最感兴趣的推文,我们在算法模型中考虑了以下的特征值:

  • 推文本身: 发布时间,是否有媒体附件(图片或视频),所有交互(即 转推量和点赞数)

  • 推文作者:你过去和推文作者的互动,你和他们之间的联系以及你关系链的构成

  • 你: 你过去感兴趣的推文,你使用twitter的频次和留存时长

我们考虑的特征值以及他们之间的关联度都不断的在增长,也提醒了我们需要考虑到更细微差别的行为模式。

每一次你打开应用或者刷新的你的时间线,我们都会通过你上次访问的时间来对你关注的用户发布的推文设置关联分值来决定什么推文会展示在你的时间线顶部。这样的打分步骤需要一个更强的计算能力,因为我们每秒钟要给几千条推文计算分值来满足所有的时间线请求。尽管更丰富的模型已经能满足更匹配的推文质量,但作为一家互联网公司,速度和质量同等重要。这个独特挑战就是需要迅速计算分值并能及时反馈给正在浏览他们时间线的用户。至今我们已拥有了足够优秀的模型来最大可能的满足内容质量以及未来可能需要的改善。

正如你所能看到的,选择正确的方式来构建和运行预测模型对每个使用twitter的用户体验是有非常深远的影响的。

基于ML平台的时间线排序要求

就像上文总结提到的,预测模型必须要有以下约束来满足众多推文请求能及时展示给用户的条件:

  • 预测内容的质量和速度

  • 资源利用

  • 可维护性

我们一般用两天来衡量一个预测模型的质量。首先我们会在训练模型时用一个强定义精准性的公式来评估模型。它会告诉我们模型的表现怎样,尤其是在给感兴趣的推文打高分的情景下。尽管一般最后的模型都会作为一个早期预测指向标,但要预测用户看到这些推送的内容后作何反应仅仅靠这一个模型是远远不够的。

所以我们通常会实施一次或者多次 A/B 测试来监测用户使用不同推送算法的 Twitter 后的行为。并对测试结果进行分析。这里我们通常使用的公式一般直接和使用Twitter 的频次以及感兴趣程度相关的。例如,我们可能会跟踪每个用户参与次数,或者单次停留时长。每次A/B 测试之后,我们不仅可以判断是否新上线的预测模型让用户体验更好,而且也能准确衡量这次改版的改善程度。在Twitter ,像时间线排序这样的大系统项目,一个小的模型质量改善都会在用户体验上产生大的影响。

最后,尽管预期的实时速度能在一个模型中被实现,但发布这个(实时发布)模型也和其它新功能一样需要分析结果。我们会将这个模型的有效作用程度 和 任何可能存在的执行模型时增加的成本
两者之间进行衡量。额外增加的成本可能来自于硬件使用,或者更复杂的执行操作和支持。

除了预测模型本身,一系列请求也会被应用到机器学习框架中— 即,一系列允许用户定义,训练,分析和发布一个预测模型的工具。我们尤其关注于:

  • 在一个非常大的数据集内训练速度和范围能力

  • 对于新技术的扩展能力

  • 容易训练,调试,评估和部署上线的工具

需要注意到的是,在用机器学习技术最开始,找到最佳模型(暂不考虑它是如何产生的)常常是第一考虑要素。毕竟,我们想证明,将所有预测模型一起使用是最有效的。

然而,随着预测方法更加成熟, ML 框架的易用性,扩展性都变得更加重要。如果一个复杂的模型只能由少数几个了解的工程师维护和扩展的话并不是一个长久之计,即便这个模型只是有一些细微的变化。随着越来越多的工作投入到数据挖掘,特征研究以及快速迭代实验,一个系统的核心开发功能特点应该变得至关重要。一个稳定和灵活的框架更有可能带来重复累积收益。随着在 AI 社区逐渐发现的新的优秀的算法和模型框架,找到一个原生支持深度学习的和复杂图表的平台才是这项工作(不断优化模型)的关键。

在时间线排序算法中引入深度学习

基于早期的图文识别技术的成熟,深度学习已经成为了如今许多技术公司一个必备的技术点了。一些大的研究团队已经建立,许多利用深度学习技术的前沿项目也在不同的环境中逐渐发布出来。

所以,已经有许多新的模型框架被创造出来用于解决具体领域的具体问题。人类大脑的处理能力和执行算法之间的差距越来越小。一个关键的理由就在于深度学习本质上就是模块化的。深度学习模型可以以各种方式组合(堆叠,串联等等)来创建一个计算图表。这个图表可以被不断学习训练,典型的场景是在批梯度下降(mini-batches)训练中用到的反向传播算法(back-propagation)和随机梯度下降算法(Stochastic gradient descent)。

低级别的模型在这里是每次使用的片段单位,是作为一种将输入和必要梯度 计算为输出内容的执行方式。事实上,在机器学习领域(torch-autograd, PyTorch,TensorFloe)最常用的一些库类型已经提供了可以处理大量数据的基本操作,典型的就是让使用者根据偏好的tensor操作包来具像化算法,同时也要依赖生成的计算图表。Torch-autograd 和 PyTorch 则要更近一步:计算图表可以动态生成且能从一个批梯度下降到另一个。

这些计算图表都有一个非常惊人的建模能力,学习这些的技术听起来格外吸引人,而最值得一提的是这些训练都是可扩展的。因为这些模型都是从批梯度下降训练中的数据集训练得来的,整个数据集的规格也可以是无限大。

让我们回到手上的问题来。 Tweet 排序算法和大部分研究人员和深度学习算法研究的问题有些不一样。最大的因素是因为 Tweet 的数据量级不大,同时也包括获取能力和请求延迟等因素。当前的数据特征并不能保证是模型正在记录的每一个数据的特征值。

通常这些问题都会用其他算法来解决,例如决策树,逻辑回归和特征crosing 和discretization等算法。这也是我们的时间线排序最初用到的算法。

陈述完上述的原因,我们有理由相信深度学习会让我们做得更好。为了将深度学习引入到产品中,我们必须要确定引入结果不能比之前差,同时模型和训练过程也需要足够快速。

所以Cortex 团队就做出了如下的一些调整和改善来适应这些约束:

  • 一个全新的模型架构和训练内容: 在一段调研和探索期后,我们打算使用以下的技术来优化之前的算法:

    • 离散(Discretization): 稀缺特征值和普通的数据记录完全不同。我们发现一个方法来将这些输入的稀缺特征值离散,再将它们放入到主深度训练网络中

    • 一个自定义的稀缺线性层: 和其他稀缺层相比,线性层有两个特殊的地方:一是防止梯度破坏的在线正常化计划,另一个是 用来区分普通特征或零值特征消失 的每特征偏量

    • 一个带有校验层的样本计划: 当训练数据集包含一堆正反向例子的相似数据的时候,这是深度网络会在寻找解决问题的空间上做得更好。然而,这时人工调试一个训练数据集会导致一个非校正的输出预测。因此我们增加了一个自定义校验层来重校验从而输出正确的概率。

    • 一个训练计划: 以上的补充准备就绪,整个模型训练过程仍需要好几步:离散器矫正,深度网络训练,预测等压校验以及测试。多亏平台的可塑性,有效并有序的执行这些操作都很顺利。

    • 为了保持甚至减少前一个算法的延迟而执行的优化模型。在某种程度上,这些优化模型就是融合在批量处理,多线程和硬件利用上来降低延迟。
      平台的设计优化

  • 易训练性和模型再利用:简单的流程和模型利用会让任务执行和模型收集等等过程更高效和容易

  • 根据资源自动组合最有的交互操作:这些模型需要在推文集群中被训练,研究和测试。平台提供了一个用户透明的相对简单方式来进行这些处理

  • 测试和服务工具: 一旦模型训练完成,就需要大量的实验环节。这就需要在生产环境对模型大量的进行测试—— 并且也需要能够简单部署。所有这些也需要满足能够单行命令就能执行。

影响

所有这些为了构建一个完整的深度学习平台所做的辛苦工作都得到了回报。在时间线排序算法的任务上,深度学习在离线模型的精准预估上取得了巨大的提高。这些增长在常规模型的生命周期上也一直持续着,包括对新功能的介绍环节以及将模型扩展到对新的用户参与度衡量参数。这证明了深度学习方法确实是稳定的,同时它的扩展推广也不错。最重要的是,将它引入到线上的效果显示,在用户参与度和停留时长上都取得了巨大的增长。同时在我们之前的分享中也提到了,更新的时间线在用户增长和参与度上都取到了不可磨灭的作用。

就像已经提到的,另一个值得提及的影响就是点对点框架实现。这个框架的终极设想就是一个非统一,可扩展的快速框架。这个框架可以将许多合适的深度学习技术和以 ML 方法建立的模型融合起来。这样的可塑性能够在以后的时间线排序优化上快速实现,同时也能不断优化迭代使用的模型的质量效果。

随着更多的公司团队将深度学习纳入他们的模型任务,相信这个框架的效果将会不断的优化和提高。

未来

在我们的时间线排序模型组件中使用机器学习方法已经带来了显著的提高。同时,Twitter 使用深度学习技术也是想展示我们对未来新兴技术的开放心态。这几年在机器学习领域,深度学习和 人工智能相关的研究已经产生了空前的(也仍不断在持续的)新创意和算法。我们深信让我们的 ML-驱使 的产品融入这项技术会对以后的获益起到关键作用。而这些可以通过搭建一个原生支持机器学习的可扩展平台来实现。

长远来看,这也能帮助我们更好理解twitter上的每一条推文和每一次互动,而且是实时的。

    原文作者:crisitina
    原文地址: https://segmentfault.com/a/1190000009823288
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞