美文网首页推荐系统浅谈系列
推荐系统浅谈系列(七) - 网易云音乐

推荐系统浅谈系列(七) - 网易云音乐

作者: 产品新人学习路 | 来源:发表于2016-12-27 10:55 被阅读2974次

    提起个性化推荐,不得不提的就是网易云音乐~

    在音乐类app已经步入红海市场的时候,网易云音乐却能脱颖而出,2年半的时间就突破了一亿用户。这其中不得不提到的是网易云音乐的个性化推荐技术~
    网易云音乐具体采用了什么样的推荐技术呢?接下来看一看~
    云音乐使用了3个维度向人们推荐音乐:朋友推荐、人工推荐、智能推荐

    朋友推荐
    云音乐 的第三个主tab,下面分了3个子级tab,“动态”、“附近”、“好友”,三者主要用于朋友推荐。另外,如果分享到微信朋友圈,app可以通过账户对应的id识别联系的好友,而朋友之间的兴趣点极有可能是相似的。

    网易云音乐

    人工推荐
    人工推荐主要指的是歌单和主播电台,这两种形式的节目主要由编辑主导。

    网易云音乐 - 歌单、主播电台

    智能推荐
    就是我们常说的个性化推荐,网易云音乐的个性化推荐主要体现在“私人FM”、“每日歌曲推荐”、“推荐歌单”三部分,另外“推荐MV”部分其实也有体现。
    “每日歌曲推荐”和“推荐歌单”两部分都属于歌单的推荐。

    由于知乎上对网易云音乐的歌单推荐算法讨论的很多,而且易懂。就引用3个回答看一下~

    首先从整体的产品设计角度看~

    作者:沙克
    链接:https://www.zhihu.com/question/26743347/answer/34542247
    来源:知乎著作权归作者所有,转载请联系作者获得授权。

    网易内部怎么做到这么好的推荐?在知乎上面问几乎不会得到正确答案的吧,我的答案只是从我的经验出发: “如果设计产品的话,我会这样思考”。
    一个优秀的推荐系统不仅仅是个性化算法这么简单 -- 基础的也好,fancy的也好 -- 一个完整的推荐系统体系怎能不提及官方团队推荐(Editorial)、UGC(User-Generated Content)和热门推荐(Top Seller/Trending)的协作呢?

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

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

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

    现在一波未平一波又起,假设现在一个非常优秀的Indie歌手,唱的歌也好有周杰伦的早年的范,反正就是非常相关,周杰伦的歌迷肯定会喜欢那种(对不起实在不熟悉国内歌手,幸亏不是做的这行,这位迷一样的歌手大家请自行脑补)。这位迷一样的歌手刚出道,宣传力度不大,也只有少数几个地方能听到他的歌曲,只有被小数的几个周杰伦迷给发掘出来了,现在问题来了,我们该如何使得这个歌手被发掘出来呢?这个基本上与上一个问题相反,这是冷门的优秀推荐很难被发掘。这时候我们可以用点归一化(Normalization)的小伎俩微调一下。值得一提的是,归一化更能给解决一下上一个提及的太过热门的问题,类似tf-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的发展,进入良性循环。

    再来看一下从userCF算法和itemCF算法的层面进行讲解的回答:

    作者:郑昊
    链接:https://www.zhihu.com/question/26743347/answer/65777210
    来源:知乎著作权归作者所有,转载请联系作者获得授权。
    在本文中我们将提到两种方法来实现这个目的,基于用户的协作型过滤和基于物品的协作型过滤。

    基于用户的协作型过滤的流程至少包括以下四个步骤:
    建立评价规则
    搜集用户偏好
    寻找相近的用户
    推荐歌曲

    1.建立评价规则
    下图是我随意做的一个评价规则。评价规则应该根据明确的用户行为来建立。

    评价规则-随意做的
    2.搜集用户偏好
    根据评价规则,我们可以得到每个用户和该用户相关的每首歌的一个得分。 下图也是我随意造的数据。
    用户偏好
    3.寻找相近的用户
    常用的计算相似度评价值的体系有两种:欧几里得距离和皮尔逊相关度。

    4.推荐歌曲
    接下来系统要做的就是,为用户郑昊提供歌曲推荐。我们当然可以查找与郑昊品味最相近的人,从他所喜欢的歌曲中找出一首郑昊可能还未接触过的歌曲。不过,这样的做法未免太随意了。
    目前最通用的做法是,通过一个经过加权的评价值来为歌曲打分,评分结果即排名结果。为此,我们需要取得所有其他用户的分数,借此得到相关系数后,再乘以他们与相关歌曲的分数,求和之后再除以对应的相关系数总计,便能获得一个我们需要的评价值。在下表中我们给出了具体的做法。

    皮尔逊相关度评价

    「相关系数」一列来自于皮尔逊相关度评价。「歌名」对应各用户的得分来自评价规则处理后的结果。将前两者一一对应相乘,便是「歌N*相关系数」的值。如此一来,相比于与我们不相近的人,那些与我们相近的人将会对整体评价值拥有更多的贡献。总计一行给出了所有加权评价值的总和。

    我们可以用总计值来计算歌曲排名,但是我们还需要考虑到,这样人数会对一首歌的得分产生正相关影响。为了避免这一问题,我们需要将总计除以相关系数总计。相关系数总计等于所有对这首歌曲有影响的用户的相关系数之和。表中最后一行就是我们所需要的结果。

    接下来,我们来介绍基于物品的协作型过滤。
    如果将基于用户的协作型过滤简述成如下形式:
    网易云音乐用户甲->偏好相近用户->相关歌曲->推荐列表。
    那么基于物品的协作型过滤也可以简述成如下形式:

    1.歌曲A->相关用户->相关歌曲->推荐列表;
    2.网易云音乐用户甲->偏好歌曲->推荐列表。

    步骤1是对任意一歌曲进行数据抓取,找到相关用户和这些用户的偏好数据,再去得到相关歌曲信息,获取与该歌曲相近的最优推荐。由于与用户无关,所以步骤1可以安排在网络流量不是很大的时候进行,或者在独立于主应用之外的另一台计算机上单独进行。这里的歌曲A可能是任一一首歌。步骤1承担了大部分的运算工作。

    步骤2在用户甲有相关需求时发生,通过获取用户甲的偏好歌曲和步骤1的结果,就能找到给用户甲的歌曲推荐。

    再看一下从 “每日歌曲推荐”“歌单推荐”两个功能角度的回答:

    作者:木易咩咩
    链接:https://www.zhihu.com/question/26743347/answer/34480706
    来源:知乎著作权归作者所有,转载请联系作者获得授权。

    一、每日歌曲推荐:
    ** 好吧这里应该有结论:**
    1、 网易云的推荐算法基础是基于协同过滤,极大可能有通过标签二次过滤。
    2、 推荐系统分析的行为有播放、下载、收藏歌曲。可能存在行为叠加。
    3、 对用户不完整播放的行为不敏感,这个应该算是缺点吧。
    4、 总的来说,推得还算准确。但是推荐算法不算太先进。大家觉得准确,可能是由于网易云使用的用户人群属性较单一,对于推荐算法来说这样的人群是十分理想的。QQ音乐新猜你喜欢,自我颠覆的个性化推荐系统**,有兴趣可以去参考下QQ音乐的推荐系统,在对用户行为的分析上,会更完善。
    推荐的依据,官方声称的是由试听记录、收藏歌曲、收藏歌手进行推荐的。而事实上,能产生用户兴趣的行为,可能会包括:试听歌曲、收藏歌曲、收藏歌手、收藏专辑/歌单、搜索、关注用户、下载歌曲。所以新建了些空白样本在网易云的web端做了个测试。

    空白样本测试

    可以看出,网易收集的用户行为有包括:试听、喜欢、下载。官方声称的根据歌手推荐没有返回结果。
    而当中,有试听的情况,推荐系统的反应是最好的,有推荐歌曲的入口跟推荐的歌单。而下载及收藏歌曲其次,没有推荐入口放出,但是用url访问地址,有推荐的歌曲。所以可以试试判定在行为分析上,网易云的权重是:试听> 喜欢> 下载。
    这有点不符合常理,因为普遍觉得喜欢跟下载,是一种更强烈能反应出用户兴趣的行为。所以截包分析了一下,发现在每次播放结束后,会向服务器传递一个行为记录。当中会对用户兴趣产生影响的有:是否完整播放及播放的时长,歌曲的来源。所以觉得,在推荐行为里面可能的权重为(按用户操作的成本):
    ** 下载+播放 > 喜欢+播放 > 搜索+播放 > 播放 > 下载 > 喜欢**
    然后,再来看一下有推荐结果的行为:


    目测第二天的数据是没上传到给服务器,或者推荐的算法权重判断上,对某些歌曲的播放次数会比是否最近播放更优先。
    再看一组播放数据:

    这次可以确定,用户2第二天的数据是没上传成功了。推荐系统对是否最近播放的反应很敏感,对主动中止播放这个行为不敏感。这里应有吐槽,因为切歌算是一种用户主动不喜欢的行为,理想的推荐结果,应为全部都是纯音乐。

    最后纯喜欢/下载的用户,推荐的歌曲还算准确。但是4个用户的结果加起来,感觉在推荐出来的歌曲风格上十分单一。所以怀疑,推荐系统运转先是基于协同过滤,然后可能存在标签矫正的机制。也有可能是通过歌手这个纬度的矫正,因为这样的成本没标签高。
    二、歌单推荐:
    歌单推荐相对于歌曲推荐算法会简单很多。主要的逻辑会有:

    1、 可能喜欢的歌曲,是经过试听记录去判定的,多次听一首歌,推荐系统就会判定你可能喜欢这首歌。
    2、 其实歌曲,都可以分解成一个很大的标签集的(粤语、摇滚、快歌…),能归类进一个歌单里面,直接通过单曲去索引歌单,对用户兴趣的命中率也很高。QQ的专辑推荐也还是基于这个。
    3、 准不准的结论不好给,推荐给我的歌单,其实在自己常用帐号还是偶尔能发现不错的。起码比QQ的好了。


    下面推荐几篇关于云音乐的文章,感觉可以看一下:

                                               微信公众号: 
                                 产品新人学习路 ( i-pm-road),欢迎交流
                                                 (๑•ᴗ•๑)
    
    产品新人学习路 ( i-pm-road)

    相关文章

      网友评论

        本文标题:推荐系统浅谈系列(七) - 网易云音乐

        本文链接:https://www.haomeiwen.com/subject/rzzjvttx.html