概述
- 矩阵分解
- 问题
- 物品之间存在相关性,信息量并不随着向量维度增加⽽线性增加;
- 矩阵元素稀疏,计算结果不稳定,增减⼀个向量维度,导致近邻结果差 异很⼤的情况存在。
- 思路
- 上述两个问题,在矩阵分解中可以得到解决。矩阵分解,直观上说来简单,就 是把原来的⼤矩阵,近似分解成两个⼩矩阵的乘积,在实际推荐计算时不再使 ⽤⼤矩阵,⽽是使⽤分解得到的两个⼩矩阵。
- 问题
- 矩阵存储
- 难点
- 只有原始⽤户⾏为⽇志,需要从中构造出矩阵,怎么做?
- 思路
- CSR:这个存储稍微复杂点,是⼀个整体编码⽅式。它有三个组成:数 值、列号和⾏偏移共同编码
- COO:这个存储⽅式很简单,每个元素⽤⼀个三元组表示(⾏号,列号, 数值),只存储有值的元素,缺失值不存储。
- 难点
关系矩阵及矩阵计算
- U - U 矩阵
- 概述
- 计算用户相似度,一般使用Pearson相关系数
- 原理
- 通过计算用户相似度来找到与目标用户行为具有相似性的用户集
- 排序,选取相似度最高的 K 个用户
- 相似度计算流程
- 访问用户最近的行为数据
- 提取用户-视频二维矩阵
- 分别计算用户 i 和 j 对视频的平均评价值
- 寻找用户 i 和 j 共同评价过的视频的集合
- 根据公式计算得到用户 i 和 j 的相似度
- 概述
- V - V 矩阵
- 概述
- 计算物品相似度,一般使用余弦相似度
- 原理
- 计算视频相似度
- 排序,选取相似度最高的 K 个视频
- 相似度计算流程
- 访问用户最近的行为数据
- 提取用户-视频二维矩阵
- 寻找历史上对视频 i 和视频 j 共同评价过的用户的集合
- 分别计算用户对视频 i 和视频 j 的平均评价值
- 根据公式计算得到视频 i 和 j 的相似度
- 概述
- U - V 矩阵
- 概述
- 用户和视频之间的关系
- 矩阵降维
- 奇异值分解(SVD)
- 将用户 - 视频矩阵分解成
- 表示 用户 的矩阵
- 表示 物品 的矩阵
- 表示用户 和 物品 相关性的矩阵
- 将用户 - 视频矩阵分解成
- 主成分分析(PCA)
- 奇异值分解(SVD)
- 概述
矩阵分解算法
- 矩阵分解之后,矩阵的特点
- 每个⽤户对应⼀个 k 维向量,每个物品也对应⼀个 k 维向量,就是所 谓的隐因⼦向量,因为是⽆中⽣有变出来的,所以叫做“隐因⼦”;
- 两个矩阵相乘后,就得到了任何⼀个⽤户对任何⼀个物品的预测评分,具体这个评分靠不靠谱,那就是看功夫了。
- 基础的 SVD 算法
- 算法步骤
- 准备好⽤户物品的评分矩阵,每⼀条评分数据看做⼀条训练样本;
- 给分解后的 U 矩阵和 V 矩阵随机初始化元素值;
- ⽤ U 和 V 计算预测后的分数;
- 计算预测的分数和实际的分数误差;
- 按照梯度下降的⽅向更新 U 和 V 中的元素值;
- 重复步骤 3 到 5,直到达到停⽌条件。
- 交替最⼩⼆乘原理 (ALS)
- 算法流程
- 初始化随机矩阵 Q ⾥⾯的元素值;
- 把 Q 矩阵当做已知的,直接⽤线性代数的⽅法求得矩阵 P;
- 得到了矩阵 P 后,把 P 当做已知的,故技重施,回去求解矩阵 Q;
- 上⾯两个过程交替进⾏,⼀直到误差可以接受为⽌。
- 优点
- 在交替的其中⼀步,也就是假设已知其中⼀个矩阵求解另⼀个时,要优 化的参数是很容易并⾏化的;
- 在不那么稀疏的数据集合上,交替最⼩⼆乘通常⽐随机梯度下降要更快 地得到结果,事实上这⼀点就是我⻢马上要说的,也就是关于隐式反馈的内容。
- 算法流程
- 算法步骤
- 增加偏置信息
- 问题
- 有⼀些⽤户会给出偏⾼的评分,⽐如标准宽松的⽤户;
- 有⼀些物品 也会收到偏⾼的评分,⽐如⼀些⽬标观众为铁粉的电影,甚⾄有可能整个平台 的全局评分就偏⾼
- 思路
- ⼀个⽤户给⼀个物品的评分会由四部分相加:全局平均分、物品的评分偏置、⽤户评分的偏置、⽤户和 物品之间的兴趣偏好
- 问题
- 增加历史⾏为
- 问题
- 有的⽤户评分⽐较 少
- 算法
- 在 SVD 中结合⽤户的隐式反馈⾏为和属性,这套模型叫 做 SVD++。
- 除了假设评分矩阵中的物品有⼀个隐因⼦向 量外,⽤户有过⾏为的物品集合也都有⼀个隐因⼦向量,维度是⼀样的。把⽤ 户操作过的物品隐因⼦向量加起来,⽤来表达⽤户的兴趣偏好。
- 在 SVD 中结合⽤户的隐式反馈⾏为和属性,这套模型叫 做 SVD++。
- 问题
- 在 SVD 中考虑时间因素
- 对评分按照时间加权,让久远的评分更趋近平均值;
- 对评分时间划分区间,不同的时间区间内分别学习出隐因⼦向量,使⽤ 时按照区间使⽤对应的隐因⼦向量来计算;
- 对特殊的期间,如节⽇、周末等训练对应的隐因⼦向量。
隐式反馈
- 概述
- ⽤ 户浏览数据远远多于打分评价数据。也就是说,实际上推荐系统关注的是预测 ⾏为,⾏为也就是⼀再强调的隐式反馈。
- 特点
- 如果把预测⽤户⾏为看成⼀个⼆分类问题,猜⽤户会不会做 某件事,但实际上收集到的数据只有明确的⼀类:⽤户⼲了某件事,⽽⽤户明 确“不⼲”某件事的数据却没有明确表达。所以这就是 One-Class 的由来, One-Class 数据也是隐式反馈的通常特点。
- 算法
- 概述
- 对隐式反馈的矩阵分解,需要将交替最⼩⼆乘做⼀些改进,改进后的算法叫做 加权交替最⼩⼆乘:Weighted-ALS。
- 加权交替最⼩⼆乘这样对待隐式反馈:
- 如果⽤户对物品⽆隐式反馈则认为评分是 0;
- 如果⽤户对物品有⾄少⼀次隐式反馈则认为评分是 1,次数作为该评分 的置信度。
- 问题
- 取值 为 0 的评分就⾮常多
- 描述
- 本身隐式反馈就只有正类别是确定的,负类别是我们假设的,你要知道, One-Class 并不是随便起的名字;
- 这会导致正负类别样本⾮常不平衡,严重倾斜到 0 评分这边。
- 思路
- 挑⼀部分缺失值作为负类别样本即可
- 随机均匀采样和正类别⼀样多(不靠谱)
- 按照物品的热⻔门程度采样(实践检验证明有效)
- 挑⼀部分缺失值作为负类别样本即可
- 描述
- 数据量太多(用户、物品等)
- 描述
- 让⽤户和物品的隐因⼦向量两两相乘,计算点积就可以得到所有的推 荐结果了。但是实际上复杂度还是很⾼,尤其对于⽤户数量和物品数量都巨⼤ 的应⽤,如 Facebook,就更不现实。于是 Facebook 提出了两个办法得到真 正的推荐结果。
- 思路
- 第⼀种,利⽤⼀些专⻔门设计的数据结构存储所有物品的隐因⼦向量,从⽽实现 通过⼀个⽤户向量可以返回最相似的 K 个物品。
- 第⼆种
- 就是拿着物品的隐因⼦向量先做聚类,海量的物品会减少为少量的聚 类。
- 然后再逐⼀计算⽤户和每个聚类中⼼的推荐分数,给⽤户推荐物品就变成 了给⽤户推荐物品聚类。
- 得到给⽤户推荐的聚类后,再从每个聚类中挑选少许⼏个物品作为最终推荐结 果。
- 描述
- 取值 为 0 的评分就⾮常多
- 概述
优化
- point-wise:矩阵分解
- 概述
- 本质上都是在预测⽤户对⼀个物品的偏好程度, 哪怕不是预测评分,只是预测隐式反馈,也难逃这个事实,因为算法展现出来 的⽬标函数就出卖了这⼀切。
- 得到这样的矩阵分解结果后,常常在实际使⽤时,⼜是⽤这个预测结果来排序。
- 这种针对单个⽤户对单个物品的偏好程度进⾏预测,得到结果后再排序的问题, 在排序学习中的⾏话叫做 point-wise
- 缺点
- 只能收集到 正样本,没有负样本,于是认为缺失值就是负样本,再以预测误差为评判标准 去使劲逼近这些样本。
- 逼近正样本没问题,但是同时逼近的负样本只是缺失值 ⽽已,还不知道真正呈现在⽤户⾯前,到底是不喜欢还是喜欢呢?
- 概述
- pair-wise:⻉叶斯个性化 排序,简称 BPR 模型
- 概述
- AUC 全称是 Area Under Curve,意思是曲线下的⾯积,这⾥的 曲线就是 ROC 曲线。
- 算法流程
- 构造样本
- 四元组:⽤户、物 品1、物品2、两个物品相对顺序
- 如果物品 1 是消费过的,⽽物品 2 不是,那么相对顺序取值为 1,是 正样本;
- 如果物品 1 和物品 2 刚好相反,则是负样本;
- 样本中不包含其他情况:物品 1 和物品 2 都是消费过的,或者都是没 消费过的。
- 四元组:⽤户、物 品1、物品2、两个物品相对顺序
- ⽬标函数
- 训练⽅法
- 梯度下降⼜有批量梯度和随机梯度下降两个选择,前者收敛慢,后 者训练快却不稳定。
- 构造样本
- 概述