编者按:本文编译自Slate的探秘文章。作者难得探访到了Facebook的动态消息团队,了解到了是谁控制着你在Facebook看到的动态消息,以及为什么它那全球最有影响力的算法要不断改变。篇幅较长,我们将连载刊出。
每当你打开Facebook,全球最有影响力、最具争议、最被误解的算法就开始活跃起来。它会扫描并收集过去一周你每一位朋友、你关注过的每一个人、你所属的每一个小组发表过的东西,还有你点赞过的每一个Facebook页面。对于普通Facebook用户来说,这个数通常超过了1500。如果你的朋友有好几百,那数字可能会高达10000。这之后,在被严加看管和不断调整的公式作用下,Facebook的动态消息(news feed)就会对它们按照(它以为你以为的)帖子的价值程度进行排名。大多数用户永远只会看到前几百。
Facebook以外的人都不知道它是怎么做的,公司内部的人也不会告诉你(倒是有前员工在知乎上解释过动态消息的广告机制)。尽管如此,这种自动排名机制仍然塑造着超过10亿(相当于全球成年人口的1/5)日活跃用户的社交生活和阅读习惯。这种算法的病毒式传播能力颠覆了整个媒体业,把像BuzzFeed和Vox这样的初创企业的影响力推高到了新的高度,而许多百年老店却只能慢慢凋零死去。它给Zynga和LivingSocial这样的公司平步青云(价值10亿美元)提供了动力,所要的回报不过是1、2年后从后者身上吸点氦气—它只用略微调整一下自己的代码,就让别的投资者两袋空空,员工下岗。Facebook的动态消息算法调整一下就能让我们快乐或忧伤,它既能向我们展示新的有挑战性的想法,也能把我们禁锢在泡沫化的意识形态里面。
Facebook的动态消息算法塑造的不仅是我们能读到什么和如何保持接触,还包括如何讲故事来吸引我们的注意力。深悟此道的出版商从一开始就利用了算法的癖好来炮制出病毒式流行的内容。Facebook的工程师则通过不断调整代码贬低某些类型的帖子提升另一些来针锋相对。要想知道媒体病毒式传播成功的公式这些年是如何变化的,只需看看当年流行的帖子是什么样的就行了。
尽管Facebook的动态消息算法有着各种强大,却不优雅得令人吃惊,善变得令人抓狂,不透明得顽固不化。当然它一般不会把我们认为是不关紧要的、令人气愤的、带有误导性或者索然无味的帖子放出来。Facebook知道哪些是这样的帖子。过去几个月,这家社交网络一直在进行着测试,测试内容是挨着高排名的帖子放低排名的,然后让用户选择喜欢看哪个。结果呢?算法的排名“有时候”会根据用户的喜好进行调整,Facebook承认这一点,但拒绝透露更多具体细节。该公司说,一旦不匹配,就意味着“某个地方要改进。”
“有时候”代表的,不是你所预期的值得炫耀和令人恐惧的那点代码的成功率。动态消息过于强大的影响力已经招致了一连串的质疑,说它给人强加了自己的意志—就好像某种神秘形式的智能,在全世界范围扩散,以达到不可告人的目的。随着Facebook等硅谷巨头不断过滤我们的选择并通过机器学习软件引导(诱导)我们做出决策,Elon Musk这样的技术巨头和霍金这样的科学巨匠都发出警告说人工智能会构成存在威胁,算法(参见有没有主宰世界的主算法)这个词本身已经开始产生令人惊骇的影响。在一般人看来,算法是神秘而又强大的实体,象征着技术和现代性所满足我们的每一种渴望以及威胁我们所珍视的价值的一切手段。
一个不断壮大专家测试组已然成为Facebook的Nielsen家族
当然,Facebook的算法也许没那么荒诞,但依旧令人着迷。我最近难得有机会到Facebook总部跟他们的动态消息团队坐在一起,实地看看对算法进行的那些名声有点不太好的、影响市场走势的“调优”—看看他们为什么要这样做,是如何进行的,以及如何确定调整生效了。对算法内部工作的管中窥豹不仅让我理解了Facebook动态消息的机制,也明白了机器学习的局限性,数据驱动决策的陷阱,以及Facebook不断加强的收集和处理用户反馈的举措(其中包括一支不断壮大的专家测试组,这相当于Facebook的Nielsen家族)意义何在。
我所了解到的是,Facebook算法的缺陷不在于系统存在一些故障,而在于从根本上来说,Facebook软件背后的智能其实还是人,而不是像科幻小说迷所幻想的,完美实现的、有意识的算法。是人类决定着放哪些数据进去,如何处置这些数据,以及另一头出来的是什么东西。算法出问题时,该责备的应该是人。算法变了,是因为有一群人读了一堆的表格,开了一堆的会,跑了一堆的测试才决定要把它改得更好。那它不断变得越来越好又怎么说?那是因为另一群人不断告诉他们什么地方做得不够:这群人就是我们。
当我到达Frank Gehry 设计的Facebook总部时,接待我的是一位身材瘦高的人,他那张带孩子气的脸一会儿露出真挚的笑容,一会儿有保持着强烈的专注。37岁的Tom Alison是动态消息团队的工程总监,负责管负责算法的那帮人。
Facebook总部
Alison领着我穿过迷宫一样排列的隔间和开放式小厨房去一间小会议室,他保证到那之后要为我揭开Facebook算法的神秘面纱。途中我意识到自己需要上个厕所,就问他在哪里。他不自觉地做了个鬼脸,然后开始道歉,笑着说“我带你去。”一开始我以为他这么做是为了避免我走失。但当我从里面出来时,发现他还站在外面,我马上意识到他是不会让我一个人乱跑的。
出于同样的理由—Facebook对其商业秘密的严密保护,Alison不能告诉我太多动态消息算法代码构成方面的东西。不过他倒是可以告诉我算法做了什么,为什么要这么做,以及为什么会一直变。就像工程师都会这么干一样,他先从白板开始。
“学计算机科学时,你首先接触的算法就是排序算法,”Alison说着,用白板笔随便写了一串正整数。
4, 1, 3, 2, 5
要做的任务很简单:设计算法对这些数字从小到大进行排序。“人知道怎么做这个,”Alison说:“我们在脑子里面转转就出来了。”
但是计算机却需要你一五一十地告诉它怎么做。而这个需要一个算法:用一组具体的指令来解决特定问题。Alison给我演示的是“冒泡排序”,大概是这么做的:
冒泡排序的优点是简单。缺点是:如果数据集很大计算效率会很低且耗时。出于显而易见的原因,Facebook没有采用冒泡排序。它的确用了排序算法来对所有出现在你的动态消息上面的帖子进行排序。不过这只是微不足道的一部分—主算法里面的一个很小的子算法。哪一块才是重要的?第一时间给所有的帖子赋值的算法。简而言之,这就是动态消息排名团队的工作:设计一个能够给任何Facebook帖子赋予对任何特定用户的“相关性得分”的系统。
这是一个很困难的问题,因为跟你有关的一样东西—比如你的童年好友或者你关注的某位名人的帖子有可能跟我一点关系都没有。对于这一点,Alison解释说,Facebook采用了不同类型的算法,这种算法叫做预测算法。(跟Google的搜索算法或者Netflix的推荐算法一样,Facebook的动态消息算法也是一个由更小算法组成的、不断蔓生的非常复杂的软件。)
“这么说吧,我要你选出一场还没打的比赛的获胜者,比如公牛对湖人,”Alison开始了。“公牛,”我脱口而出。Alison笑了,不过他接着使劲地点了点头。我的大脑已经接受了他的输入并马上产生出了一个语音输出,其根据也许就是它自己的某个恶作剧算法。(人类大脑的算法比硅谷迄今设计的任何算法都要复杂很多,但却也严重依赖于启发,容易上当受骗也是出了名的。)
随便猜一个也不错,如果这么做没什么代价的话,Alison说。不过我们再来假设一下,假如我的胜负预测决定了很多钱的去留,并且每天这样的预测都要做好几百万次,那就得要一个更加系统化的方法。“可能你会先从考察历史数据开始,”他说:“你会先看看每一支球队的胜负记录,每一位球员的记录,谁受伤了,谁保持着连胜。”也许你还会考虑环境因素。谁是主队?某一队是不是休息不够或者刚刚经过长途飞行过来?你的预测算法可能要考虑所有这些或更多的因素。预测得好的话,它不仅能预测出比赛的获胜者,还能告诉你对结果的确信度。
Facebook动态消息算法对你是否喜欢特定帖子的预测跟这个类似。我问Alison Facebook的算法要考虑多少个变量—或者用人工智能的术语来说,“特征”。“几百个,”他回答道。
它预测的不仅仅是根据你过去的行为看你会不会对帖子点赞。它还会预测你会不会看,会不会评论,会不会分享或则隐藏帖子,甚至把它列为垃圾。它会预测每一个的结果,以及结果的确信度,然后再组合来生成一个与你和那个帖子有关的相关性分数。一旦你的动态消息里面的每一个帖子都得到了相关性得分,排序算法就会按照你在屏幕上看见的那样对帖子进行排序。你看到的排在前面的帖子,是从成千上万个帖子里面被抽取出来,最有可能让你笑,让你哭,让你点击让你喜欢,让你分享或者让你评头论足的。
Facebook的动态消息揭秘(二)
Facebook动态消息揭秘(三,完)