一篇Netflix在MLSS 2014上的talk,粗略做了一下总结,主要是关于推荐系统的综述知识和一些实际应用例子。虽然有些过时(2014年),但精髓还在。
我主要关注在2、3、4三个部分,也就是推荐方法这一块。
CF
kNN-CF的问题
- 稀疏性问题:矩阵很大,非零元素很少
降维方法:- MF
- 聚类
- PCA
- 可扩展性问题:计算量同时随着用户数和物品数增加,用户/物品量非常大,O(m+n)
聚类方法可能会有帮助
性能
- user-based CF的用户相似度是动态的,预先计算会导致很差的结果。
- item-based CF的物品相速度是静态的,可以预先计算
Model-Based CF
-
Model:
概率(贝叶斯网络)
聚类(聚类用户,基于用户组推荐)
基于规则(关联规则:物品与物品的共同购买行为矩阵)
分类
回归
LDA -
SVD++和RBMS(限制玻尔兹曼机器)
-
LSH局部敏感哈希: 物品高维聚类,主要用在NN
CF的问题
- 冷启动(新用户/新物品)
- 流行偏差
CB
- 推荐建立在单独用户购买的物品的内容上
- 物品内容:显性的属性/特点,文本内容(文本相似度/NLP挖掘特征),物品类型
- 用于推荐基于文本的物品/用户模型多种技术分类
CB优点
- 没有冷启动/稀疏性问题
- 个性化/全面
- 可解释
CB问题
- 需要有意义的特征/有些物品很难找/特征很难找
- 用户的兴趣要可学习
- 难以与其他用户联动
- 过拟合
- 偶然性
Ranking
基于排序学习的推荐
- 从训练数据构建排名模型
- 训练数据为偏序或二值化的数据
- 从得分得到排序结果
- 个性化的关键
- 可以作为一个典型的监督学习问题
指标
- NDCG\MRR\FCP
- 问题:不可导,无法优化模型
- 最近研究点在可以直接优化模型的指标
途径
- Pointwise:单独点的相关性判断,Ordinal regression, Logistic regression, SVM, GBDT, …
- Pairwise:一对点的次序判断,最小化错误次序的数量,二分类问题,RankSVM, RankBoost, RankNet, FRank…
- Listwise:
- 使用间接损失函数:RankCosine、ListNet 对间接损失函数的优化不一定是对IR模型的优化
- 直接优化(不可导时会比较困难)。Genetic Programming遗传编码、Simulated Annealing模拟退火、对目标函数进行平滑化后的GD( CLiMF、TFMAP)、把MAP加入SVM约束(SVM-MAP)、使用 boosting 优化 NDCG(AdaRank)
上下文感知Context-aware
三种途径:pre-filtering/post-filtering/modeling
pre-filtering
- 使用上下文选择最相关的数据交给推荐系统
- 可能导致结果太狭隘、有些情况下上下文的选择没有意义、过滤太多数据导致稀疏性问题
- 总结:
- 多种途径
- 将具体的条件回滚到更高等级
- 使用隐变量方法降维(MF、LDA…)
Post-filtering
- 在最后输出结果时使用上下文信息过滤和排序
- 使用相似性过滤 or 使用社会/协同上下文表现。。。
Modeling
- 多维推荐模型
- 扩充特征的维度,使得R:UxIxD_1xD_2x…xD_n,比如电影推荐的维度:用户、电影、时间、公司、地点等
Tensor Factorization张量分解
-
三维数组以及多位数组,我们称之为张量(tensor)
-
CP分解
如果n阶张量可以被写成n个向量的外积,则此张量为一个秩一张量。
三维为例:分成R个三个一维向量(a_r, b_r, c_r)的乘积。三个方向的向量组成的矩阵称为因子矩阵A,B,C。
χ ≈ ∑ r = 1 R a r ∘ b r ∘ c r \chi \approx \sum_{r=1}^{R} a_r \circ b_r \circ c_r χ≈r=1∑Rar∘br∘cr
∘