排行榜
- 排行榜的作用
- 排行榜可以作为解决新用户冷启动问题的推荐策略。这个不难理解,当一 个新用户刚注册时,可以把最近产品中热门的物品推荐给他。
- 排行榜可以作为老用户的兴趣发现方式。即使是老用户,也可以在享受个 性化推荐的同时去浏览热门的物品,从中看看哪些感兴趣,哪些不感兴趣,这些 行为都是补充或者更新用户兴趣的数据来源。
- 排行榜本身就是一个降级的推荐系统。推荐系统本身是一个软件,因此也 会有出现问题的时候,也会有推荐不出来的时候,这个时候考虑到服务的可用性, 用排行榜作为一种兜底策略,可以避免推荐位开天窗。
- 算法
- 最简单的排行榜,就是直接统计某种指标,按照大小去排序。在社交网站上,按 照点赞数、转发数、评论数去排序,这是一种最常见、最朴素的排行榜。
- 问题
- 非常容易被攻击,也就是被刷榜;
- 马太效应一直存在,除非强制替换,否则一些破了纪录的物品会一直占据 在榜单中;
- 不能反映出排行榜随着时间的变化,这一点和马太效应有关。
- 问题
- 优化算法
- 考虑时间因素
- 考虑三种投票
- 考虑好评的平均程度
- 最简单的排行榜,就是直接统计某种指标,按照大小去排序。在社交网站上,按 照点赞数、转发数、评论数去排序,这是一种最常见、最朴素的排行榜。
加权采样
- 问题
- 保留太多的话,每次召回候选集时,计算复杂度可不低
- 只保留少部分吧,那真 是手心手背都是肉,生怕丢弃的标签才是用户的真爱
- 优势
- 大大减少召回时的计算复杂度;
- 可以保留更多的用户标签;
- 每次召回计算时还能有所变化;
- 虽然有变化,但是依然受标签的权重相对大小约束。
- 算法
- 一种是能够已知全部样本的个数
- 这需要遍历整个样本, 比如说用户标签采样输出,那么每次采样时仍然需要遍历所有的标签,来依次决 定每一个标签输出的概率。
- 等概率采样的方法非常简单,任意编程语言中都有伪随机数实现
- 用户标签若干,每一个标签都有个权重 w,权重高低反映了用户 对这个标签的感兴趣程度高低。
- 加权采样方法
- 这需要遍历整个样本, 比如说用户标签采样输出,那么每次采样时仍然需要遍历所有的标签,来依次决 定每一个标签输出的概率。
- 另一种是不知道总量样本是多大,或者总量很大,以至于你不愿意全部遍历之后 再输出采样结果,这样的数据就是数据流,对应的就是流采样。
- 蓄水池采样,算法流程
- 直接先取出前 k 个样本留着,这 k 个就是随时准备最终要输出的;
- 从第 k+1 个开始,每个都以 kn 的概率去替换那留着的 k 个样本中的一个
- 加权蓄水池采 样
- 为每一个样本生成一个分数,分数还是用这个公式 Si=R1wiSi=R1wi;
- 如果结果不足 k 个,直接保存到结果中;
- 如果结果中已经有 k 个了,如果 SiSi 比已有的结果里最小那个分数大, 就替换它。
- 蓄水池采样,算法流程
- 一种是能够已知全部样本的个数
去重是刚需
- 内容源去重
- 对内容做重复检测,直观的思路是分词,然后提取关键词,再两两计算词向量之 间的距离,距离小于一定阈值后就判定为重复。
- 问题
- 这对于海量内容,比如几 千万以上的内容来说简直就是灾难。
- 问题
- Simhash
- Simhash 核心思想也是为每个内容生成一个整数表示的指纹(例如 MD5),然后用这个指纹去 做重复或者相似的检测。
- 算法流程
- 首先,对原始内容分词,并且计算每个词的权重;
- 对每个词哈希成一个整数,并且把这个整数对应的二进制序列中的 0 变 成 -1,1 还是 1,得到一个 1 和 -1 组成的向量;
- 把每个词哈希后的向量乘以词的权重,得到一个新的加权向量;
- 把每个词的加权向量相加,得到一个最终向量,这个向量中每个元素有正 有负;
- 把最终这个向量中元素为正的替换成 1,为负的替换成 0,这个向量变成 一个二进制位序列,也就是最终变成了一个整数。
- 得到每个内容的 Simhash 指纹后,可以两两计算汉明距离,比较二进制位不同 个数,其实就是计算两个指纹的异或,异或结果中如果包含 3 个以下的 1,则 认为两条内容重复。
- Bloomfilter
- 布隆过滤器的原理也要用到哈希函数。它包含两部分:一个很长的二进制位向量, 和一系列哈希函数。
- Bloomfilter 是一个很巧妙的设计,它先把原始要查询的集合 映射到一个长度为 m 的二进制位向量上去,它映射的方法是:
- 设计 n 个互相独立的哈希函数,准备一个长度为 m 的二进制向量,最 开始全是 0;
- 每个哈希函数把集合内的元素映射为一个不超过 m 的正整数 k,m 就 是二进制向量的长度;
- 把这个二进制向量中的第 k 个位置设置为 1;也就是一个元素会在二进 制向量中对应 n 个位置为 1。
- 对内容做重复检测,直观的思路是分词,然后提取关键词,再两两计算词向量之 间的距离,距离小于一定阈值后就判定为重复。
- 不重复给用户推荐
攻防
- 攻击
- 是针对协同过滤的攻击
- 概述
- 所以攻击协同过滤,核心问题在于如何操纵选民:选民有两种,一种是用户,一种是物品,前者是基于用户的协同过滤所需要的,后者是基于物品的协同过滤所需要的。
- 流程
- 首先,攻击者会注册一批用户,这部分用户就是攻击者可以操纵的选民
- 然后让这批用户去做出和被欺骗用户一样的历史评分行为
- 概述
- 被欺骗的用户打高分的物品,这批水军也打高分,这样一来就可以在计算用户相似度时,这一批新注册的用户都和那个用户有较高的相似度,从而就变成了参与推荐算法计算时的选民,也就可以给扶持的物品打高分或者给打压的物品打低分。
- 攻击者会先找到目标用户群体,针对目标用户群体来做这些事,这样一来就可以把扶持的物品推荐给这个群体,让打压的物品从这个群体面前消失。
- 攻击手段包含这些元素
- 目标物品,就是攻击方要扶持或者打压的那个物品。
- 助攻物品,就是用来构造假的相似用户所需要的物品
- 陪跑物品,就是用来掩饰造假的物品
- 攻击分为两种
- 随机攻击
- 构造最外环“陪跑物品”评分时,采用随机打分方式生成。随机打分就是用全局平均分构造一个正态分布,给无关物品打分时,用这个正态分布产生一个随机分值。
- 平均分攻击
- 平均分攻击也是用在最外环物品中,给他们打每个物品的平均分。需要先统计出被打分物品的平均分,然后攻击方给这个物品也打上平均分。
- 随机攻击
- 概述
- 概述
- 热门攻击
- 概述
- 热门攻击就是攻击者会想办法让目标物品和热门物品扯上关系。这样做有事半功倍的效果,热门物品有个特点是:评分用户多。如果和它扯上关系,那就找到了一个数量较大的群体,攻击的影响也会巨大。
- 思路
- 和热门物品扯上关系最常用的就是,使用假用户同时给热门物品和目标物品评上高分,这是针对扶持目标物品的做法,如果要打压,则给热门评高分,给目标物品最低分,陪跑物品就采用随机评分的方式。
- 案例
- 热门攻击,若干年前在某电商网站真实发生过,攻击者想让自己的图书得到更多推荐,于是大量同时购买畅销书以及那本想得到推荐的图书,最后在畅销书页面的相关推荐中就推出了那本书,攻击者目的达成。
- 热门攻击有时候并不是攻击者有意发起的,而是一种群体现象,例如粉丝出征,消费者集体维权,都可能产生出热门攻击的效果。
- 热门攻击有两个“优势”
- 如果是扶持目标物品,则经过热门攻击后,基于物品的协同过滤算法会把目标物品计算为热门物品的相似物品
- 基于用户的协同过滤算法,也会把消费过多个热门物品的用户计算为假用户的相似用户,从而为这些用户推荐出目标物品
- 概述
- 分段攻击
- 概述
- 分段攻击就是想办法把目标物品引入到某个群体中,做法就是攻击者先圈定好用户群体,再列出这个群体肯定喜欢的物品集合,然后同时用假用户给目标物品和这批物品集合评分,做法类似热门攻击。
- 最后的攻击效果就是:如果扶持目标物品,那么这个被圈定的用户群体会看见,如果打压,那么目标物品就会在这群人面前消失。
- 概述
- 是针对协同过滤的攻击
- 防护
- 防护手段按照层级,可以分为下面几种
- 平台级
- 这一层属于在推荐系统之外的防护手段,一面是提高批量注册用户的成本,从攻击者的第一步遏制,比如弹验证码,另一方面是产品教育用户积极参与,并提供真实的反馈,让推荐系统所用的数据真实性比例越高,越不容易被攻击,这是最根本的。
- 数据级
- 数据级别防护重点是从数据中识别出哪些数据是假的,哪些用户是被操纵的选民,一旦识别出来就将这些数据删除。
- 思路
- 做法通常是采用机器学习思路,标注一批假用户或假反馈数据,训练分类器,在线上识别出反馈,将其延后或者排除在推荐计算之外,通常要和反垃圾系统紧密结合。
- 或者对用户数据聚类,假用户产生的数据一定有着和正常用户不一样的分布,因为它目标明确,所以无监督的办法可以找出假用户群体来,一旦确认可以删除整个群体,可以采用的有主成分分析等做法。
- 算法级
- 算法级别就是在推荐算法设计时,要根据情况做一些改进和选择。一般来说基于用户的协同过滤更容易受到攻击,因此需要对基于用户的协同过滤做改进。
- 改进方向包括下面几种
- 引入用户质量,限制对于低质量的用户参与计算,或者限制新用户参与计算;
- 限制每个用户的投票权重,即在计算用户相似度时引入较重的平滑因子,使得用户之间的相似度不容易出现过高的值,也就是变相使得投票时参与用户更多一些,提高攻击者的成本。
- 除此之外,采用多种推荐算法最后再走模型融合之路也是一种提高推荐系统健壮性的有效做法。
- 平台级
- 防护手段按照层级,可以分为下面几种