脸书最新新闻--facebook加播放量网站
机器之心报道
Facebook 采用机器学习和次序数学模型给大部份使用者带来最差新体验,比如推送甚么通告,在你的消息推送中放进甚么该文,以及对你想关注的人提些甚么建议。高工作效率的机器学习数学模型对找寻最有关的文本来说很重要。他们检视了大量动态信号以制定最差次序;比如,在过滤器通告的采用情况中,他们检视其他人是否已点选相似的通告,或者对应通告的该文赢得了多少赞。虽然每执行一次就会生成两个新通告推送,所以他们想尽快回到推送通告的重大决策。
更繁杂的数学模型有利于提高预测的精确度,提供更有关的文本。但更繁杂的数学模型须要较长的 CPU 周期(CPU cycles),回到结果的天数也较长。考虑到那些限制,他们做不到对大部份可能的备选数学模型展开评估结果。不过,透过提高数学模型工作效率,他们能做到在完全相同的天数帧运用完全相同的计算能力评价更多的备选数学模型(inventory)。
在责任编辑中,他们比较了势能提高计算机程序(gradient-boosted decision tree ,简称GBDT)这一类预测数学模型的不同实现,并描述了能造成更高工作效率评估结果的 C++ 各方面改进。
计算机程序数学模型
计算机程序被普遍用于预测数学模型,该演算法将关于第一类的特点检视值态射到第一类类的平均速度。虽然其线性和快速解释器的特点,它成为了机器学习、统计数据挖掘和语言学之中最常见的预测数学模型方法之一。在那些抽象化结构中,叶结点表观展开分类条码,而有向边表观造成那些展开分类条码的特点相连。
计算机程序非常强大,但是体能训练统计数据中的小变动能进化为计算机程序中的大变化。这可透过采用一项被称为势能提高(gradient boosting)的技术来解决问题。即,为错误展开分类的体能训练示例提高权重股,从而形成两个捷伊计算机程序。接着对这一关键步骤展开连续多次重复以赢得捷伊计算机程序。最后的分数(scores)是计算机程序上每个叶结点分数的平均数八倍。
数学模型通常很少预览,且体能训练繁杂数学模型须要耗费数小时。不过,在 Facebook 的大规模统计数据上,他们想更频繁地预览数学模型,即按照微秒间距依序运行它们。Facebook 的很多后端服务是用 C++ 写的,因此他们利用这一语言的一些特性做了些改善,以造成只须要更短 CPU 周期展开解释器的高工作效率数学模型。
右图是两个简单的计算机程序,它包含以下特点:
今天其他人 A 点选通告的数量(特点 F[0])
对应通告的该文点赞数量(特点 F[1])
其他人 A 点选通告的总数量(特点 F[2])
在不同的结点,他们查看了上述特点的值,并遍历整棵计算机程序以获取通告点选的概率。
平面树(Flat tree)的实现
计算机程序数学模型的朴素实现是透过两个带有指针的简单二叉树而完成的。不过,结点并不须要连续地存储于内存之中,因为这样二叉树并非很有效。另一方面,计算机程序通常是完整的二叉树(即二叉树的每个结点一定存在零值或两棵子树),它透过采用向量而压缩存储。指针并不须要空间,而每一结点的父结点和子结点可透过数组索引演算法查看。他们将用这一实现对比这一章节的实验。
编译树(Compiled tree)的实现
每两个二叉树都能由两个繁杂的三元表达式表观,而这个表达式能展开编译并链接到可直接在服务中采用的动态库(DLL)。须要注意的是,他们能动态添加或预览计算机程序数学模型,而不须要重启服务。
他们也能利用 C++ 中的 LIKELY/UNLIKELY 注释(annotations)。它们是编译器发出指令的方向,并且能将分支预测更加偏向于跳转指令(jump instruction)「可能」出现的一侧。如果预测是对的,那么就意味着跳转指令将占有 0 个 CPU 周期。他们能根据在批量中次序的或离线分析中的真实样本计算分支预测,这是因为体能训练和评估结果集的分布不应该改变太多。
下列代码表观上述的简单计算机程序的两个实现:
数学模型范围解释器
在典型的次序设置中,他们须要在多个特点向量的示例上评估结果完全相同的已体能训练数学模型。比如,他们须要为了两个给定的人次序 1000 个潜在备选项,并选择最有关的备选项。
一种方法是迭代大部份备选项并逐一次序。而通常情况下,数学模型和大部份备选者都不能组合到 CPU 指令缓存中。而受到提高体能训练(boosted training)的驱动,实际上他们能将数学模型分解到树的范围内(第一批 N 子棵树,第二批 N 棵子树等等)。这样每个范围就能足够小以适应缓存。随后他们能调转评估结果顺序:他们将评估结果每个范围上的大部份样本,而不是评估结果两个样本上的大部份树。采用这种方法,他们能在 CPU 缓存中将整棵树的集合与大部份的特点向量展开合并,并在下一次迭代中仅仅只是替代子树集。这种方法不仅减少了缓存未命中(cache misses)数量,同时还采用区块读/写而不是 RAM。
此外,经常还出现多个数学模型须要评估结果完全相同特点向量的情况。比如,使用者在该文中点选、点赞或评论的概率。这种方法有利于将大部份特点向量储存在 CPU 缓存中,并逐个评估结果数学模型。
另外两个折衷方法能考虑为前 N 棵树次序大部份的备选项,并虽然提高演算法的自然特性,他们能丢弃排名最低的备选项。这样虽然能提高延迟,但精确度也会略微地下降。
普遍特点
有时特点在大部份的特点向量中很普遍。在上述对某个特定个人的示例中,他们须要次序大部份的备选通告。上文描述的特点向量 [F[0]、F[1]、F[2]] 可为:
[0、2、100]
[0、0、100]
[0、1、100]
[0、1、100]
他们很容易发现特点 F[0] 和 F[2] 对备选项是完全相同的。他们能透过聚焦 F[1] 的值显著缩小计算机程序,从而改善解释器的天数。
类属(Categorical features)特点
绝大多数机器学习演算法采用二叉树,并且二叉树可被延伸成 k-ary 树。另一方面,特点中的一些实际上并不能被比较,因而被称为类属特点。比如,如果国家是两个特点,两个人不可能说这个国家的值是否少于或者等于美国(或者两个对应的枚举值)。如果树足够深,那么这个比较可透过采用多个层级实现。但是这里他们已经实现了检查当前特点是否属于一组值的可能性。
这个学习方法并没有改变太多,他们依然在尝试找到可被分割的最优子集,并且其解释器也非常快。基于集的大小,他们采用 in_set C++ 实现,或者仅仅把 if 条件相连起来。这减小了数学模型,对收敛也有所帮助。
计算结果
他们体能训练了两个提高计算机程序(boosted decision tree)数学模型以预测两个采用了 256 个计算机程序、每个树包含 32 个叶结点的通告点选概率。接着,他们比较了特点向量解释器的 CPU 采用率,其中每个批量平均次序 1000 个备选项。批量大小值 N 基于机器 L1/L2 缓存大小展开调整和优化。下面让他们看一下在平面树(flat tree)实现期间的性能提高:
普通编译数学模型:2 倍提高。
带注释的编译数学模型:2.5 倍提高。
带注释、范围和普遍/特殊特点的编译数学模型:5 倍提高。
性能提高对不同的演算法参数(128 或 512 个树,16 或 64 个叶结点)是相似的。
结论
CPU 采用率的提高和附带的加速允许他们增加次序示例的数量,或者在采用完全相同数量资源的情况下增加数学模型的大小。这一方法已被应用于 Facebook 的几个次序数学模型之中,比如通告过滤器、推送次序、建议和使用者关注。他们的机器学习平台在持续进化,更精确数学模型与更高工作效率的数学模型解释器方法的结合将允许他们持续提高次序系统的性能,并为数十亿人带来最差的个人化新体验。