Facebook的Edgerank算法

注册 Vultr VPS 送你10美金 免费玩4个月

Edgerank 是几年前外界对Facebook Newsfeed上的新鲜事排序算法的称呼。

至于是怎么算的,这其实可以出成一道面试题,不妨以知乎为例。题目就是,你觉得应如何对知乎的新鲜事排序?

具体问题描述:
知乎用户刘看山,他关注了100个人,30个专栏,10个话题。在他打开知乎的一瞬间,将有100个最新动态等着他,你要怎么给这100个新鲜事排序?
当然,作为知乎官方,你掌握着几乎所有知乎用户的信息,包括刘看山的。他经常给谁点赞,经常关注哪个话题下面的问题,这些你都知道。
哦,对了,你只有50毫秒时间。超过50毫秒刘看山就会不耐烦了。

你该怎么办?

0. 这些新鲜事对用户而言质量各有高低
如果你让刘看山自己看一遍这100个新鲜事,他大概能说出自己更喜欢哪个,更不喜欢哪个。比如,他更喜欢张佳玮的答案,张公子的回答他基本都会点开看。他不太喜欢抖机灵的回答,即使赞同数很高他也只是扫一眼就过去。
我们要做的,就是用模型化的语言描述这件事。

1. 确定一个变量作为优化目标
这个变量,要能反映新鲜事的质量。一组常用的变量就是互动数:点开,赞同,感谢。好的新鲜事应该能吸引到更多的互动,这样的新鲜事也更应该排在前面。
当然另一方面,用什么变量来定义成功其实不是一个简单的问题。Twitter的创始人之一 Evan Williams 就曾发文警告用单一变量定义成功的危险性。我们在这里也可以考虑其他信号,比如说,被很多用户点选“没有帮助”的新鲜事很可能质量不高,又或者用户花了很长时间在上面的新鲜事很可能质量不错。于是,“没有帮助”数和阅读时长也可以成为我们的优化目标之一。

2. 预测用户在哪个新鲜事上更可能触发我们的目标变量
或者说,在哪个新鲜事上刘看山更可能点开/赞同/收藏/分享/长时间阅读,在哪个新鲜事上更可能选不再显示/没有帮助,前者要排高点,后者排低点。
这就是机器学习(Machine Learning)派上用场的时候了。具体用什么算法是个开放性问题。可以是Logistic Regression,可以是SVM,还可以是别的,各有各的特点。(真要是做ML的面试题,这里会和选手展开讨论一下)
算法不重要,那什么重要?Feature。这就是知乎数据库里的那些数据的作用了。刘看山之前赞过张公子几次,这个回答被总共看了几次并赞了几次,这些都是feature。从历史看未来。Feature是强大的模型的关键。

3. 故事还没有结束
学术上,这个模型已经差不多成型了。然而在实际应用中,很多问题还应付不了。比如说:

  • 刘看山看到张公子赞了别人的一个回答,大概读了下,没意思,就过去了。后来刘看山所关注的张小北也赞了这个回答。这时候这个新鲜事要怎么排序?
  • 刘看山出远门一周没上知乎,回来一上知乎1000个新鲜事可以排序。好不容易排完了,刘看山看了10个就关浏览器了。一个小时之后刘看山再上知乎的时候,之前剩下的990个新鲜事你要怎么办?

你会发现,这个问题,与其说是算法,不如说是涉及产品本身的决策。所以说,好的ranking engineer都是半个PM (还有半个Data Scientist和半个Growth Hacker)。

注册 Vultr VPS 送你10美金 免费玩4个月