网易云音乐的歌单推荐算法是怎样的?

不是广告党,但我却成为网易云音乐的的重度患者,不管是黑红的用户界面,还是高质量音乐质量都用起来很舒服。我喜欢听歌,几乎每周不低于15小时,但其实听得不…
关注者
25,884
被浏览
2,378,998
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

感觉 @邰原朗 的回答的确给出了CF和Item-based Similarity的很浅显解释,的确也是大多“个性化推荐系统(Personalized Recommendations System)“所使用的算法,但是感觉有点离题和缺乏深度,no offense。

网易内部怎么做到这么好的推荐?在知乎上面问几乎不会得到正确答案的吧,我的答案只是从我的经验出发: “如果设计产品的话,我会这样思考”。

一个优秀的推荐系统不仅仅是个性化算法这么简单 -- 基础的也好,fancy的也好 -- 一个完整的推荐系统体系怎能不提及官方团队推荐(Editorial)、UGC(User-Generated Content)和热门推荐(Top Seller/Trending)的协作呢?


相似度矩阵(Similarity Matrix):

大家提的各种算法里面,几乎都是基于相似度的吧 -- 无论是CF还是Content based产生的相似度,前者需要用户的行为数据,后者需要歌曲的元数据(metadata),比如旋律、Tag等等。具体算法就不再复述了,属于计算机科学的基础内容,很多人都说过了,实现起来简单。虽然很多人给出了沙盒的数据,但是这些数据实在是太好了,虽然不知网易数据的“质”和“量”如何,但是应该不至于这么好(?)。所以,凭单一的方法真的大丈夫吗?

我们先从Similarity的问题说起:

大多数用户一开始会先从自己熟悉的歌曲开始,然后一般都会给出非常相关的推荐,比如你听周杰伦的任何歌曲,他的其他热门歌曲肯定都会非常相关,比如周杰伦的《晴天》,周杰伦的《游园会》,周杰伦的《七里香》,也不失为一个好的推荐。但是你会发现全都是周杰伦,单调死了。全是周杰伦的理由很简单,因为很多用户都连着听下去呀,听完一首周杰伦到下一首周杰伦,听完这个专辑听下个专辑。如果你往后再翻翻,估计还能找到别歌手的歌曲,但是请记着:你的屏幕就这么大,坑就这么多,再好的推荐不能在考前的位置被用户看到和消费到终归也还是扯淡。现在我们来尝试解决这个问题,我们先来做个简单的多样化过滤,我们限制来自同一个歌手的推荐数量,这样后面更多歌手的歌去被推上来了,很好。

现在又一个的问题来了,陈奕迅这时候发新砖了,用户一下子蜂拥去听他的新砖了,包括周杰伦的一众拥趸们也跑去观望了一下,这样的情况持续了一个多月,这下好了,用户看到的推荐里面现在几乎都能看到陈奕迅的这些歌了,尽管他这的歌跟周杰伦的歌原本不至于这么相关。而且由于这个效应,更多的人从推荐里面点进去了听陈奕迅的这些歌,造成了一个恶性循环,使得你的Similarity以为他们真的相关,这时候其他真正相关的优质推荐却被挤压到后面了。我们来尝试解决这个问题,最简单的莫过于是计算相似度的时候过滤掉“过于”热门的歌曲了,把这些歌曲推后吧,感觉问题应该也能解决了。

现在一波未平一波又起,假设现在一个非常优秀的Indie歌手,唱的歌也好有周杰伦的早年的范,反正就是非常相关,周杰伦的歌迷肯定会喜欢那种(对不起实在不熟悉国内歌手,幸亏不是做的这行,这位迷一样的歌手大家请自行脑补)。这位迷一样的歌手刚出道,宣传力度不大,也只有少数几个地方能听到他的歌曲,只有被小数的几个周杰伦迷给发掘出来了,现在问题来了,我们该如何使得这个歌手被发掘出来呢?这个基本上与上一个问题相反,这是冷门的优秀推荐很难被发掘。这时候我们可以用点归一化(Normalization)的小伎俩微调一下。值得一提的是,归一化更能给解决一下上一个提及的太过热门的问题,类似tf-idf(en.wikipedia.org/wiki/T–idf)。可以说怎样做Normalization才是各大厂家的杀手锏吧,虽然都可能大同小异,但是不同行业还是需要细分。

先别歇下,更多的问题将要来袭:

Similarity的确是非常natural的推荐算法,事实上当数据足够大、足够干净和精确的时候,Simialrity是很难被打败的。但是设想如果是网易音乐发展初期,没有很多用户数据的情况下呢?又如果是网易音乐急速扩张时期,用户数据很多但是很sparse的时候呢?又从用户角度切入,设想是一个刚加入的新用户,并没有其它用户数据来源来提供推荐的情况下呢?这些冷启动问题,又该如何解决呢?难道就应该放弃这些用户?可能我们可以做更多的Trick来调整我们的算法,也可以去尝试更fancy的其他算法,尝试去做Hybrid、fused的系统,但是首先,产品的研发周期会变长,开发投入变大,系统变复杂维护的消耗更大,然后更糟糕的是因为进展缓慢,用户一直看的就是不咋地的推荐,用户开始流失,数据更加稀疏,最后导致恶性循环。

可以移步参考

@pig pig

的答案(

网易云音乐的歌单推荐算法是怎样的? - pig pig 的回答

),描述的是multi-tenancy和纯Similarity的其他问题。

工程师的尊严并不是钻牛角尖:

...而是拿出creative的思维来跳出盒子,尝试通过别的途径来解决这些问题。

我们先从做一个首页显示热门榜单开始,这是一个非常容易实现的功能,计数、排序、简单分类:中国、欧美、日本和韩国,按流派也行:流行、摇滚、古典,甚至按年龄段或者群体,不外乎是几个数据库搜索的事情。但是这些热门排行榜却作用非凡,用户可以从中发现当前的大趋势(Trending),比如说,现在张杰比周杰伦风头要盛,听听张杰的看看怎样。由此榜单也能帮助用户发现他本来兴趣圈以外的东西。这么容易实现的功能,却也可以带来不少的好处,属于“low hanging fruit”,没有不摘的理由。

然后我们来聘请一批专业的媒体编辑员,让他们根据我们歌曲库里的内容,生成比较专业的榜单,比如:“高逼格小清新”,“喧嚣中,不妨试的调调” 还有 “被遗忘的经典华语女声”。用过其它的歌曲软件的人估计对这个也不陌生,比如说虾米。这个也能很大程度上帮助用户发现兴趣圈以外的东西,而且由专业人员生成的歌单,更有目的性,比如说你喜欢苏打绿是因为“小清新”,那么在“小清新”的歌单里的,就是一大批高质量的,对你而言非常优秀的推荐了。这样的功能也能很快组织和实现起来,好处也是大大的。

最后,看到了知乎的威力以后,我们考虑做UGC。从做一个简单的UGC功能开始,我们现在另开一个数据库,允许用户保存自己的歌单,并在个人主页推荐这些歌单。同时我们在主页中定期置顶一些访问量较大的歌单。功能上非常容易实现。UGC所激发的用户潜能可以使得用户产生与专业编辑员质量相当的、甚至更高的歌单。功能上的实现实在是再简单不过,效果更是不言而喻。

这时候我们的很大一部分问题得到解决,就算是我们的Similarity所产生的推荐并不是那么好的时候,我们的用户并不会由此而失去发现音乐的途径。听歌的人多了,用户保持engaging,老用户们持续产生高质量的数据,我们之前的个性化推荐算法也能有更好数据来调整参数,从而产生更好的音乐推荐,更好好的用户群体也能推动热门榜单与UGC的发展,进入良性循环。

我希望我阐述清楚了一个好的推荐系统“生态圈”的重要性,算法牛逼的当然有,再牛逼的都有,但是你总要trade-off,总会有不足。现实中,估计很少问题被是“一条路走到黑”地,“简单暴力”地方法解决的吧。

现在再来回顾题主的问题:

“网音给我推荐的歌单几乎次次惊艳,而且大多都没听过,或者好久以前听过早就忘记了名字,或者之前不知道在哪听过 只是知道其中一部分旋律,根本不知道名字,等等,听起来整个人逼格大有提升。”

"我想知道网音的歌单推荐是网音项目团队精心挑选制作的,还是众多音乐达人的推荐?即:歌单是网音官方提供,还是UGC?才有如此对口味的歌单推荐?"

我的猜测(因为我永远不知道答案):都有。

我感觉题主描述的就是一个成熟的推荐系统生态圈共同作用的结果,刚刚去看了一下网易云音乐的界面(所幸暂时还没有地区限制),的确也是有这些功能的。(

网易云音乐 听见好时光

题主得到的高逼格推荐,很可能就是最早来源于一个名为“高逼格小清新”专业编辑推荐歌单,有效地引导了兴趣相投的用户去发现这些音乐,大多跟你有相似品味的人都听过并感觉不错,最后还经过fancy算法“沉淀”、“发酵”,产生了很好的相似度,从而生成了了这么优秀的推荐并推送了给了题主。然后题主来知乎发了个帖子,大家被“惊艳”到了,更多的新用户加入,perfect!

最后,如果真的有这么多用户都觉得网易云音乐的推荐都非常“惊艳”的话,那这个产品就实在是太成功了,特别是考虑到“众口难调”的音乐领域。