过年前打算学习一下推荐,买了一本国内推荐系统的经典,项亮的《推荐系统实践》,因为封城,导致3月末才拿到这本书,今天好好看了一下。
正式开始内容之前,想说点题外话,第一个是关于为什么要学习推荐系统,关于这个问题是因为结合19年工业界NLP和算法的发展,单纯能把NLP落地的项目已经越来越少了,但是NLP往推荐、搜索、广告方向做,落地的方式还是很广阔的,所以准备往这个方向走。
第二个是关于这本《推荐系统实践》,12年的书,但是现在还是卖得这么好,而且是推荐系统,是实打实能落地的方向,说明两个问题,第一个是推荐领域虽然深度学习有大幅度的运用,但是取得的效果,在某些场景下可能并不太好,老的方法在现在也还能用;第二个说明这本书确实是经典,经典的东西永远不会过时,所以推荐大家看一看。
推荐系统的思考
推荐系统,在之前对这个系统已经有了一个大概的认识。我在网上之前找到一张推荐系统架构的图学了算法肯定会听过协同过滤算法,然而协同过滤也好,还是现在流行的DIN和FM也好,这只是推荐系统算法的一部分,做好一个推荐要考虑的还有很多,针对于现在来说,先从推荐算法这一块入手。
这本书的第一章,写的是如何评价一个推荐系统。里面除了准确率召回率,有两个评价指标我仔细看了一下,新颖性和惊喜度。
- 新颖性:给用户推荐那些他们以前没有听说过的物品
- 惊喜度:如果推荐结果和用户的历史兴趣不相似,但却让用户觉得很满意,那么就可以说推荐结果的惊喜度很高。
我们来回想一下我们经常用的APP的推荐系统,淘宝,豆瓣,头条系APP,知乎。
先说头条系APP和知乎,大家在使用过程中有没有发现,系统的推荐结果都是在历史的关注的行为里面,把相似的结果推荐给你。这就导致了,如果你不看新的话题内容,就一直在老的话题里循环,这就是所谓的马太效应,个人认为这个推荐策略是非常错误的,老是把关注点放到一个内容上,久而久之就是在浪费时间,推荐毫无新颖性和惊喜度。这也是我为什么越来越不喜欢知乎和头条抖音等这些app。
而淘宝、豆瓣不一样,它们的推荐策略会为你提供一些之前没有关注的东西,也就是在它们的推荐系统里有新颖性和惊喜度的考虑,这才是有温度的推荐系统。
协同过滤
协同过滤(CF)是一种基于领域的一种算法,在1992年就被提出,也算老古董了。
1. 基于用户的协同过滤(UserCF)
在用微博的时候应该会注意到,推荐栏里面有 你关注的XXX也关注了XXX。这就是基于用户的协同过滤,把你感兴趣的用户感兴趣的东西推荐给你。
这里我不想把公式复制粘贴出来,因为这个真的很容易理解,这里说一点的就是,如果用户A买了一本《新华字典》,用户B也买了一本《新华字典》,但我们并不能说用户A和用户B他们感兴趣的方向一致,只能说他们都上过小学。所以有一个改进后的基于用户的协同过滤
这个公式里面的分子
惩罚了用户u和用户v共同兴趣列表中热门物品,N(i)代表对物品i有过兴趣的用户集合。
2.基于物品的协同过滤(ItemCF)
在淘宝里面,推荐栏里面有 和该商品类似的商品XXX。这就是基于物品的协同过滤,把你感兴趣的东西的类似属性的东西推荐给你。
这里面蕴含着一个假设:就是假设每个用户的兴趣都局限在某几个方面,因此如果两个物品属于一个用户的兴趣列表,那么这两个物品可能就属于有限的几个领域,而如果两个物品属于很多用户的兴趣列表,那么它们就可能属于同一个领域,因而有很大的相似度。
这里根据这个假设就会出现一个问题,就是如果你粉了一个爱豆,系统会给你推荐和你这个爱豆相似的爱豆,比如你粉蔡徐坤就会给你推荐韩国女团的练习生。但是有一个卖假粉的公司,他们的一个账号会粉无数的爱豆,这就意味着蔡徐坤和无数个爱豆发生了关系有了相似性,这样这个算法会给你推荐其他人了。
这里就有一个排除活跃用户的公式了,因为活跃用户对物品相似度的共现应该小于不活跃的用户。
这个和基于用户的协同过滤惩罚大量相似用户类似。
3.UserCF和ItemCF的比较
项目 | UserCF | ItemCF |
---|---|---|
性能 | 适用于用户较少的场合,如果用户过多,计算用户相似度矩阵的代价交大 | 适用于物品数明显小于用户数的场合,如果物品很多,计算物品相似度矩阵的代价交大 |
领域 | 实效性要求高,用户个性化兴趣要求不高 | 长尾物品丰富,用户个性化需求强烈 |
实时性 | 用户有新行为,不一定需要推荐结果立即变化 | 用户有新行为,一定会导致推荐结果的实时变化 |
冷启动 | 在新用户对少的物品产生行为后,不能立即对他进行个性化推荐,因为用户相似度是离线计算的 新物品上线后一段时间,一旦有用户对物品产生行为,就可以将新物品推荐给其他用户 | 新用户只要对一个物品产生行为,就能推荐相关物品给他,但无法在不离线更新物品相似度表的情况下将新物品推荐给用户 |
推荐理由 | 很难提供 | 可以根据用户历史行为归纳推荐理由 |
针对不同的业务场景,可以用的算法也不同。ItemCF需要维护一张物品相关度的表,当物品量更新速度太快时,此表的维护在技术上有难度,所以对于电商、音乐、图书等网站而言,ItemCF的优势更大。新闻类网站对于新用户可直接推荐热门新闻即可,为了满足实时性,新闻类更适合用UserCF。
但是算法不是万能的,协同过滤有些场景无法覆盖,比如两个不同领域的最热门物品之间往往具有比较高的相似度,仅仅靠用户行为数据是不能解决的,所以就要引入新的特征了。这个下一次再讨论