信息检索3-推荐系统
推荐系统
[TOC]
概念
推荐系统的任务:联系用户和物品,解决信息过载的问题;
- 好友(社会化推荐)
- 用户的历史兴趣记录(协同过滤推荐)
- 用户的注册信息
为什么推荐系统收到欢迎:
- 用户:可以帮助用户发现喜欢的新事物
- 商家:提高用户信任度和粘性,增加营收
信息过滤技术比较
- 搜索引擎满足用户有目的地主动查找需求;
- 推荐系统能够在用户没有明确目的时帮助发现感兴趣的新内容;
搜索引擎 | 推荐系统 |
---|---|
由用户主导,包括输入查询词和选择结果,结果不好用户会修改查询再次搜索。 | 由系统主导,系统引导用户发现需要的信息。高质量的推荐系统会使用户对该系统产生依赖。 |
需要用户提供明确的需求,注重结果之间的排序。 | 不需要用户提供明确的需求,通过分析用户的历史行为对用户的兴趣建模,从而主动给用户推荐可能满足他们兴趣和需求的信息。 |
评测方法
一个推荐算法最终上线,必须完成
- 离线实验:在离线指标上优于现有算法
- 用户调查:确定用户满意度较优
- 在线AB测试:确定在关心的指标上较优
离线实验
步骤
- 通过日志系统获得用户行为数据,并按照一定格式生成一个标准的数据集;
- 将数据集按照一定的规则分成训练集和测试集;
- 在训练集上训练用户兴趣模型,在测试集上进行预测;
- 通过事先定义的离线指标评测算法在测试集上的预测结果。
优点
- 实验都是在数据集上完成的,不需要一个实际的系统来供它实验
- 不需要用户参与实验,成本低
- 速度快,可以测试大量算法
缺点:
- 无法计算商业上关心的指标
- 离线实验的指标和商业指标存在差距
用户调查
步骤
- 用户调查需要一些真实的用户,让他们在需要测试的推荐系统上完成一些任务。
- 在他们完成任务时,需要观察和记录用户的行为,并让他们回答一些问题。
- 最后,我们通过分析他们的行为和答案,了解测试系统的性能。
优点:
- 可以获得用户的主观感受指标,出错后容易弥补
缺点:
- 招募测试用户代价较大
- 无法组织大规模的测试用户,统计意义不足
在线实验
在完成离线实验和用户调查之后,可以将系统上线做AB测试,将它和旧算法进行比较。
AB测试通过一定的规则将用户随机分成几组,对不同组的用户采用不同的算法,然后通过统计不同组的评测指标,比较不同算法的好坏。
- 多个方案并行测试;
- 每个方案采用不同的推荐算法;
- 以某种规则优胜劣汰。
优点:
- 可以公平获得不同算法实际在线的性能指标,包括商业上关注的指标;
缺点:
- 周期长,必须进行长期的实验才能得到可靠的结果
- 设计比较复杂
评测指标
- 用户满意度:描述用户对推荐结果对的满意程度,是最重要的指标,问卷调查/监测用户线上行为数据
- 预测准确度:描述推荐系统预测用户行为的能力。对用户$u$,推荐的物品集合为$R(u)$,在测试集上喜欢物品的集合$T(u)$,可用$Precision=\frac{\sum_u |R(u)\cap T(u) |}{\sum_u |R(u)| }$计算
- 覆盖率:描述推荐系统对长尾物品的发掘能力。一般通过所有推荐物品占总物品的比例来计算。比例越大,则覆盖率越大。
- 多样性:描述推荐系统中推荐结果能否覆盖用户不同的兴趣领域。一般用不相似度描述;
- 新颖性:如果用户没有听说过推荐列表中的大部分物品,则说明该推荐系统的新颖性较好,需要做用户调查;
- 惊喜度:如果推荐结果和用户的历史兴趣不相似,但让用户很满意,则可以说这是一个让用户惊喜的推荐。可以用历史兴趣和用户满意度来衡量;
- 信任度:描述用户对推荐系统的信任程度。只能问卷调查了解;
- 实时性:时效性强的物品在进行推荐时必须考虑推荐系统处理物品冷启动的能力,可以采用人工推荐。
- 健壮性:衡量推荐系统抗作弊能力;
- 商业目标:平均一个用户是否能为公司带来盈利;
模块
用户
对象:单用户建模/群组建模
功能:能获取、表示、存储和修改用户兴趣爱好,能够进行推理对用户进行分类和识别,帮助系统更好地理解用户特征和类别,理解用户的需求和任务,从而更好地实现用户所需要的功能
推荐对象
基于内容的方法:从对象本身抽取信息来表示对象,常见TF-IDF方法和加权关键词矢量。
基于分类的方法:将推荐对象放入不同类,这样可以把同类文档推荐给该类文档感兴趣的用户了。分类常用算法Naive-Bayes,KNN,SVM;
潜在问题:
- 文本等对象特征提取技术相对比较成熟,但是网络上广泛存在的多媒体数据等的提取技术不够成熟,自动化的特征提取方法需要结合多媒体内容分析领域的相关技术。
- 推荐系统推荐给用户的对象首先不能与用户看过的对象重复,其次也不能与用户刚刚看过的太相似或是不相关,这就是所谓的模型过拟合问题。
- 推荐系统中出现新的对象时,新对象必须等待一段时间才会有用户查看并进行评价,在此之前推荐系统无法对此对象进行分析和推荐,这就是冷启动问题。
推荐算法
推荐算法很大程度上决定了推荐系统类型和性能的优劣;
基于内容推荐
物品的特征表示
为每个物品抽取出一些特征来表示此物品
- 结构化特征:属性意义比较明确,取值限定在某个范围,一般可以直接使用,如年龄、性别等。
- 非结构化特征:属性意义不明确,取值也没有什么限制,往往要先把它转化为结构化数据后才能在模型里使用。
文章特征表示:
相似度计算:
用户特征学习
利用一个用户过去喜欢(及不喜欢)的物品的特征数据,来学习出此用户的喜好特征。
生成推荐列表
通过比较上一步得到的用户喜好特征与候选物品的特征,为此用户推荐一组相关性最大的物品;
协同过滤推荐
用户行为数据
显性反馈行为 | 隐形反馈行为 | |
---|---|---|
定义 | 用户明确表示对物品的喜好,如评分 | 不能明确反应用户喜好,如浏览记录 |
用户兴趣 | 明确 | 不明确 |
数量 | 较少 | 庞大 |
存储 | 数据库 | 分布式文件 |
实时读取 | 实时 | 有延迟 |
正负反馈 | 都有 | 只有正反馈 |
基于邻域的方法
基于用户(人以群分)
特点:社会化,着重于反应和用户相似度相似的小群体热点;
思路:
- 找到目标用户兴趣相似的用户集合
- 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户;
余弦相似度计算:定义用户$u$对所有物品的评价向量$r_u$
$$
s(u,v)=\frac{r_ur_v}{|r_u||r_v|}
$$皮尔逊相关系数:对于用户可能对某些物品的打分缺省的情况,定义如下
$$
s(u,v)=\frac{\sum_{i\in I_u\cap I_v}(r_u^{(i)}-\overline{r_u})(r_v^{(i)}-\overline{r_v})}{\sqrt{\sum_{i\in I_u\cap I_v}(r_u^{(i)}-\overline{r_u})^2}\sqrt{\sum_{i\in I_u\cap I_v}(r_v^{(i)}-\overline{r_v})^2}}
$$预测分值:记邻居集中对物品$i$有过评分记录的用户集为$N$;
$$
p_{u,i}=\overline{r_u}+\frac{\sum_{v\in N}s(u,v)(r_v^{(i)}-\overline {r_v})}{\sum_{v\in N} |s(u,v)|}
$$生成推荐列表:按照预测的评分进行降序排序
基于物品(物以类聚)特点:更个性化,着重于维护用户的历史兴趣,反映了用户兴趣的历史传承。
思路:
- 计算物品间的相似度。
- 根据物品的相似度和用户的历史行为生成推荐列表。
物品相似度计算:
用$N(i)$表示喜欢物品$i$的人数;
两个物品相似度越高,说明两个物品被很多人共同喜欢,但是要惩罚热门物品以挖掘长尾信息;
$$
w_{ij}=\frac{|N(i)\cap N(j)|}{\sqrt{|N(i)||N(j)|}}
$$预测分数:
用$N_u$表示用户$u$已评分过的物品集合,以此预测那些未评分的物品的分数
$$
r_{ui}=\frac{\sum_{j\in N_u} w_{ij}r_{uj}}{\sum_{j\in N_u} w_{ij}}
$$生成推荐列表:按照预测的评分降序排序
基于模型的方法/隐语义模型(不考)
对于海量的物品,让用户子集给音乐分类并给出子集的偏好不现实,我们需要对用户行为数据分析获得评分矩阵$R$;
在实际应用中,评分矩阵可能相当稀疏,传统的矩阵分解代价太大;
我们需要从评分矩阵中抽取一组潜在的(隐藏的)因子,并通过这些因子向量描述用户和物品;
SVD将评价矩阵分解为3个低秩的矩阵,这3个矩阵的乘积能对原始矩阵进行某种程度的复原,从而可以评估出缺失值。
假设有$n$个用户,$m$个物品,设定$k$个潜在因子
- 用户-潜在因子矩阵$P_{n\times k}$:表示不同用户对于不同因子的偏好程度
- 物品-潜在因子矩阵$Q_{m\times k}$:每种物品含有各种因子的成分
则用户$u$对物品$i$的评分为
$$
p_u\cdot q_i^T = \sum_{j = 1}^k p_{uj}q_{ji}
$$
这样作近似
$$
R \leftarrow \hat{R} = P\cdot Q^T
$$
随机初始化$P,Q$,划分训练集$S$,测试集$T$
误差函数$e(u,i)$,损失函数$l(p,q)$,正则项$r(p,q)$, 目标函数为$C(p,q)$;
$$
e(u,i)=R_{ui}-p_u\cdot q_i^T\
C(p,q)=l(p,q) + \lambda\cdot r(p,q)\
l(p,q)=\sum_{(u,i)\in S}e^2(u,i)\
r(p,q)=\sum_{(u,i)\in S}||p_u||^2+||q_i||^2
$$
引入正则化项的目的是防止过拟合;
引入损失函数的目的用户$u$对物品$i$的真实喜爱程度与推算喜爱程度的均方根误差
测试集的评估也是MSE指标;
在深度学习中一般采用随机梯度下降(SGD)学习
$$
\frac{\part C}{\part p_u}=-2e(u,i)q_i\
\frac{\part C}{\part q_i}=-2e(u,i)p_u\
p_u\leftarrow p_u+\alpha \frac{\part C}{\part p_u}\
q_i\leftarrow q_i+\alpha \frac{\part C}{\part q_i}\
$$
估计出得分矩阵后,将用户已经使用的物品剔除,选择分数最高的物品推荐给用户;
缺点:
- 难以做到实时推荐,隐语义模型的训练需要在用户行为记录上反复迭代才能获得比较好的性能
- 模型的每次训练都很耗时,一般在实际应用中只能每天训练一次,并且计算出所有用户的推荐结果。
冷启动问题
使用协同过滤推荐算法时,新用户或新物品刚加入系统时、系统刚上线时,会因为行为数据的匮乏导致冷启动问题。
用户冷启动
- 利用用户注册信息:尽管是粗粒度的非个性化推荐,但是知道一些基本信息已经可以大大提高精度了;
- 人口统计学信息:年龄,性别,职业,民族,居住地
- 用户兴趣的描述:许多网站会在用户注册时让用户勾选部分感兴趣的标签
- 从其他网站导入的用户站外行为数据
- 选择合适的物品启动用户兴趣:
- 热门:要让用户对一个物品进行反馈的前提是用户知道这个物品是什么东西。
- 区分度强:启动用户兴趣的物品不能是老少皆宜的,这样的物品对用户的兴趣没有区分性。
- 多样性好:用户兴趣的可能性很多,我们需要提供具有很高覆盖率的启动物品集合,这些物品能覆盖大部分主流的用户兴趣。
物品冷启动
网站中时时刻刻都有新加入的物品,而且每个物品必须能够在第一时间展现给用户,否则经过一段时间后,物品的价值就大大降低了。
- 利用物品内容信息的表示
- 物品的内容可以通过向量空间模型表示
- 不过在绝大多数应用中,向量空间模型对于文本的分类、聚类、相似度计算已经可以给出令人满意的结果。
系统冷启动
系统冷启动的解决办法:专家标注
很多系统在建立的时候,既没有用户的行为数据,也没有充足的物品内容信息来计算物品相似度。这种情况下,很多系统都利用专家进行标注。
个性化推荐的挑战
数据稀疏
现在待处理的推荐系统规模越来越大,用户和商品数目动辄上亿,两个用户之间选择的重叠非常少,淘宝网的数据稀疏度在百万分之一以下。
数据非常稀疏导致绝大部分基于关联分析的算法效果都不好。这个问题本质上是无法完全克服的。
多样性与精确性的两难困境
如果要给用户推荐他喜欢的商品,最“保险”的方式就是给他特别流行的商品,因为这些商品有更大的可能性被喜欢。
- 盲目崇拜精确性指标可能会导致用户的视野变得越来越狭窄,难以激发用户新的购物需求。
- 推荐多样的商品与推荐的精确性之间存在矛盾,因为前者风险很大。
一种可行之策是直接对推荐列表进行处理,从而提升其多样性。
一些心怀不轨的用户通过提供一些虚假恶意的行为,故意增加或者压制某些商品被推荐的可能性,需要推荐系统提升鲁棒性;
譬如通过分析对比真实用户和疑似恶意用户之间打分行为模式的差异,提前对恶意行为进行判断,从而阻止其进入系统或赋予疑似恶意用户比较低的影响力。