网易云音乐在我看来在各方面都是较为出色的音乐APP,网上也有各种体验报告、产品分析,但都比较偏向交互和前端。所以,我决定对其靠后端大功能"推荐音乐和算法"稍作一些探讨。也是因为个人喜好问题,包括我做PD的时候,也喜欢接一些靠后端的项目,所以本文也不太涉及到界面交互方面的东西。 网易云音乐希望面向的受众为85后到90后的年轻听众,且分布于经济发达地区。这类人对新生事物的学习和消费需求较为高涨,也是网易云音乐为何直接将"发现音乐"置于Tool Bar第一位,且大力投入的原因。 在我看来,网易云音乐使用了3个维度向人们推荐音乐:朋友推荐、人工推荐、智能推荐。 朋友推荐 在这三种推荐维度中,先来简单说说朋友推荐。这个功能虽然目前还没有特别火,但并不能否定"朋友推荐"是网易云音乐在音乐APP领域里最大的前沿性尝试,如果真的做起来了,威力不可小觑。我想,这也许是微信要封杀网易云音乐的正真原因。众所周知,让自己的朋友知道自己的品味,甚至得到认可,给予人的成就感激励是巨大的,这也是腾讯没有想到的,所以QQ音乐也立刻在社交方面奋起直追,不过目前仍让人觉得属于仓促之作,期待之后的发力。 人工推荐 而"人工推荐"则是网易音乐编辑人员人工推荐的歌单和电台。人工推荐在网易云音乐中,仍然占着较为主导的作用。原因很简单,私人艺术偏好属于非常感性的问题,有些事情没有专业编辑做推荐确实会略显单调。也许大数据时代是来了,但在人类较感性的问题上,计算机也许还没有什么太好的办法。但"人工推荐"仍有瓶颈,因为编辑这个职业的工作导向,必然导致推荐的歌单非常的大众化,满足的是大部分人,而偏小众品味的用户,则就需要智能推荐来支撑了。 智能推荐 纯算法的"智能推荐",我们并不能说它是一个伪需求,"豆瓣FM"的出现,证明了依托大数据的智能推荐方式并非没有市场。这也是为什么从那以后,类"猜你喜欢"功能也逐渐在各种音乐APP中出现。 而推荐的算法方面,目前主流的有两种方式,一种是以"豆瓣FM"为代表的"以人为本"方式,一种是以"虾米歌曲漫游"为代表的"以歌为本"方式。两种算法拥有互补性,网易云音乐自然也都用在了APP里:"以人为本"算法在"个性化推荐"的"私人FM"和"每日歌曲推荐"中展现,"以歌为本"算法在"个性化推荐"的其余歌单中展现。 这两种算法也各有优缺点,而网易云音乐则聪明地避开了几乎所有缺点。我们先来梳理一下这两种算法及他们的优缺点: "以人为本"算法 "以人为本"最早的应用场景来自于亚马逊的购物推荐,也就是俗称的"喜欢这个商品的人,也喜欢XX"。后来,这个算法被"豆瓣FM"拿来,用在了音乐推荐上。 那么,这个算法到底是怎样的呢?举个非常简单的例子: A喜欢x,y,z三首歌。 B喜欢x,y。那么我可以推断,B一定也喜欢z这首歌。 当然,这也是最为简单的情况了。 还有非常多的case,比如"喜欢"如何定义?用户"不喜欢"怎么办? 也许"喜欢"下的用户行为包括:点击"喜欢"、评论、下载、收藏到歌单、点击"相似推荐"、分享、查看MV、听这首歌的频率、是否播放整曲等。 而"不喜欢"的用户行为有可能包括:5秒内切换、扔进垃圾桶、移出歌单、删除等。 在维度特别多的情况下,我们就需要对用户的每个行为引入权重机制。 "以人为本"的好处是非常明显的,这种算法不需要特别大的人力成本,只需要写好一个基础算法,并不停优化就可以了。而缺点显而易见: 第一个缺点是用户在使用初期会碰到的情况,在用户刚来的时候,对于算法来说用户是一张白纸,那么算法首先会给他一些大部分人喜欢的歌曲,因为这些歌曲喜欢的几率大于其他,但恰巧此用户的品味较为奇葩,左试右试没有匹配到,那么这个用户也许会陷入烦躁,甚至流失。 第二个缺点是用户在使用较久之后会碰到的情况,听到的歌曲风格越来越极度的同质化,就拿我本人来举一个极端的例子,我的品味比较奇怪,又喜欢民谣,又喜欢金属核。那么在算法知道了我喜欢民谣了以后,给我推荐了海量的民谣,我也一一点击了"喜欢",然后我会在风格方面越来越专一。致使我永远无法听到我喜欢的金属核。这种情况在"豆瓣FM"中尤为明显。 第三个缺点是对一个人的品味转移响应速度较慢。再举个极端的例子,比如我初中的时候还喜欢蔡依林,高一的时候忽然爱上了工业金属。而积累了海量"类蔡依林歌曲"曲库的我,在登录后一定会不知所措,也同样会造成我烦躁地一遍一遍的切换着歌曲。 依托于网易云音乐现有的歌曲搜索和收藏功能,"以人为本"的前2个缺点被网易云音乐轻松克服。 至于第三个缺点如何克服呢?我们从生成机制上可以看出,"个性化推荐"下的"私人FM"和"每日歌曲推荐"的这两个歌单的做法略显不同,"私人FM"和"豆瓣FM"的工作原理几乎一致,是在用户切换歌曲的一瞬间,通过用户的听歌历史来决定播放的歌曲,所以在"私人FM"下,无法切换回上一首。 而"每日歌曲推荐"里有一句文案暴露了实现方法,"根据你的音乐口味生成,每天6:00更新"。这说明这个歌单的工作方法,一定是每天在后台数据库通过用户最新的歌曲喜好和相应公式,来生成歌单。并在每天早上的6点放到线上数据库中,呈现给用户看。这种实现方法,也就避免了"以人为本"的第三点缺点-个人品味转移响应速度较慢这个缺点。 "以歌为本"算法 我们再来看以"虾米歌曲漫游"为代表的"以歌为本"的推荐方式。这种算法是将每首歌曲打上Tag: 歌曲A拥有Tag:X,Y 歌曲B拥有Tag:Y,Z 你喜欢歌曲A,因为他有TagY,所以也许你也会喜欢歌曲B。 "以歌为本"这种算法的优点是避免了"以人为本"几乎所有的缺点。但是缺点也同样凸显: 第一个缺点是歌曲推荐同质化较为严重,这也是我经常在虾米使用"歌曲漫游"时碰到的情况,我喜欢同一风格的两首歌,那么,在分别漫游这两首歌的时候,生成的歌单几乎是一模一样的。 第二个缺点是工作量非常巨大,这个世界上所有的歌曲有3500万首,虽然大多数人听的歌都集中在一起,但既然使用了这种算法,你不得不得考虑到小众品味用户的需求。 而网易云音乐对"以歌为本"的算法缺点克服,则做的更为聪明,也非常具有前沿性。 对第一个缺点,也就是歌曲推荐重复情况,网易云音乐的做法是:不像虾米一样在"歌曲"这个维度上进行推荐,转而全部使用"歌单"这个歌曲集合进行推荐,大大增加了容错率。这种聪明做法也立刻被其他音乐APP竞相模仿。 对于第二个缺点,也就是打Tag的工作量巨大问题。网易云音乐也有自己的解决方法:在用户建立歌单时,网易云音乐会让用户自己给自己的歌单打Tag,不得超过3个,且禁止自建Tag,这两个限制也可能暴露了这套机制的实现方法。我认为歌单上的3个Tag会被分配到歌单下的每首歌上,而一首歌经常会被不同的用户分配到不同的歌单中,那么剩下的事情就变得简单了,只要取在这首歌上被分配得最多的几个Tag来参与算法即可。所以我们可以看到"个性化推荐"下,网易云音乐可以通过歌单和歌曲两个纬度来给我们推荐歌曲。这么做不但减轻了工作量,也使歌曲Tag更科学,更具时效性。 其他优化建议 这么看来,网易云音乐确实在算法上下足了功夫。是否还有地方值得优化? 我抛砖引玉一下,先说第一点,也是我经常碰到的烦恼问题,我想大家也一定碰到过。当使用任何一款音乐APP一段时间后,"我喜欢的音乐"里一定塞了上百首上千首风格各异的歌曲,有一天我走在街上,使用随机播放功能播放"我喜欢的音乐"歌单,此时心情是安静的,非常想听一些安静的曲子,但是事与愿违。我不停的切歌,却总是找不到自己想听的歌曲,于是将手机从口袋中掏出,找了半天终于找到了那首我最想听的歌曲,播放完全曲后,没想到随机跳到的下一首歌又是我不想听的暴躁歌曲,不停切换后仍然如此。那么也许此时我的心情便没有刚开始时安静了。我推荐的做法是,在大型歌单中,随机播放模式下,使用"以歌为本"算法,当用户显露出明显的对某些Tag的歌曲表现出不喜欢时,短时间内不再播放这些Tag的歌曲。而对于听完全曲的歌曲,可以把这首歌的类似歌曲,大大提高随机播放到的几率。不过这实现起来可能会比较困难,因为需要把算法和Tag从服务端下载到本地才能实现,但也许还有别的实现方法我没想到。 第二个需要优化的地方相信大家也会碰到,在较大歌单中,我们经常保有一些已经老掉牙早已听腻的歌曲,只是忘记删除,但总是会被随机播放出来,对于这种歌一般都会被立即切换。我们是否能在这一点上进行优化?比如,当网易云音乐发现一首歌已经到达相当的重复播放次数(具体次数可从大数据中分析),并在最后几次播放中被快速切换,就减少随机到该歌曲的几率。也许就可以解决这个问题。 归根结底,对用户体验的追求是永无止尽的,我相信网易云音乐仍然会在用户体验上继续下足功夫,让我们拭目以待吧。