原文html
全文目录算法
相关性召回+点击率排序
架构
推荐逻辑流程架构
根本任务: 匹配
app
匹配过程步骤:函数
- 相关性召回, 对用户作360度全方位扫描, 尽可能多的描述和覆盖用户
可能感兴趣
的高质量
的物品;
- 候选集融合, 重点关注多样性和相关性的均衡, 召回算法的优先级等问题;
- 结果排序, 按照某一肯定目标进行排序;
- 业务干预

分层明确的逻辑架构, 有利于项目总体的并行化和效果调优的并行化;学习
召回算法的基本逻辑
匹配的经常使用计算路径:大数据
- 直接计算用户与物品的相关性;
- 用户到物品的行为权重+物品与物品的相关性 => 用户与物品的相关性; (基于物品的协同过滤(Item-based CF)算法)
- 用户与用户的相关性+用户到物品的行为权重 => 用户与物品的相关性; (基于用户的协同过滤(User-based CF)算法)
- 用户与标签的相关性+标签与物品的相关性 => 用户与物品的相关性;
相关性
, 由算法计算出的相关性, 认为是一种复杂相关性
或静态相关性
;优化
行为权重
, 根据用户与物品之间产生的行为关系计算出的一种时效性较短的相关性, 认为是一种简单相关性
或动态相关性
;网站
经常使用的基础召回算法
用户与物品的相关性
基于矩阵分解的算法, 隐语义模型(Latent Factor Model, LFM)
, 将用户与物品之间的关系, 建模为 "用户到隐特征 + 隐特征到物品" 的链条, 而后经过求解隐特征信息来求解整个链条;spa
矩阵 \(R\) 表示用户对物品行为的原始矩阵
\[R = \left\{ \begin{matrix} r_{1,1} & r_{1,2} & \cdots & r_{1,I} \\ r_{2,1} & r_{2,2} & \cdots & r_{2,I} \\ \vdots & \vdots & \ddots & \vdots \\ r_{U,1} & r_{U,2} & \cdots & r_{U,I} \\ \end{matrix} \right\} \]
每一行表示一个用户, 每一列表示一个物品, 每一个元素 \(R_{u,i}\) 表示用户 \(u\) 对物品 \(i\) 的行为;
矩阵分解则是分解为:
\[R \approx X^T×Y \\ X =\left\{ \begin{matrix} x_{1,1} & x_{1,2} & \cdots & x_{1,U} \\ x_{2,1} & x_{2,2} & \cdots & x_{2,U} \\ \vdots & \vdots & \ddots & \vdots \\ x_{K,1} & x_{K,2} & \cdots & x_{K,U} \end{matrix} \right\}, Y =\left\{ \begin{matrix} y_{1,1} & y_{1,2} & \cdots & y_{1,I} \\ y_{2,1} & y_{2,2} & \cdots & y_{2,I} \\ \vdots & \vdots & \ddots & \vdots \\ y_{K,1} & y_{K,2} & \cdots & y_{K,I} \end{matrix} \right\} \]
X 矩阵每一列表示一个用户, Y 矩阵每一列表示一个物品; 每一行均表示一个隐类别;
优势:
- 发现人工没有找出的类别;
- 更好适应数据变化; 根据用户的行为以及行为之间的关系找到隐类别, 时效性比较强;
- 将用户, 物品与隐类别之间的关系进行量化;
缺点: 隐特征缺少直接的解释, 致使隐变量这个中间数据难易复用, 有效数据只有最终的用户和物品的数据;
LFM 思路: 先获得用户和物品的原始行为矩阵, 而后借助矩阵中有值(有行为)的元素来计算求解两个隐变量矩阵的值, 再用隐变量反过来求解缺失值元素的值, 从而获得推荐结果;
衍生出的相关模型: pLSA, LDA, 词嵌入, 句嵌入, 文档嵌入等;
LFM 求解 X, Y 转化为如下式子的优化问题(损失函数):
\[L = || R_{sample} - (X^T×Y)_{sample} ||_F^2 \]
\(||M||_F^2\) 是矩阵 \(M\) 的 Frobenius 范数(F-范数)的平方, 表示矩阵中每一个元素的平方和;
\[M = [a_{i,j}]_{m×n}\\ ||M||_F = \sqrt{\sum_{i,j}{a_{i,j}^2}} \]
sample 下标表明矩阵中的样本集;
目标: 损失函数 L 取得最小值的 \(x_{u,k}\), \(y_{i,k}\):
\[L = \sum_{u,i \in sample }(r_{u,i} - \sum_{k}(x_{u,k} × y_{i,k}))^2 \]
单纯优化上式可能会出现过拟合现象, 因此加入正则化项:
\[L = \sum_{u,i \in sample }(r_{u,i} - \sum_{k}(x_{u,k} × y_{i,k}))^2 + \lambda(\sum{x_{i,j}^2}+\sum{y_{i,j}^2}) \]
其中, \(\lambda\) 是正则化参数, 表明正则化力度;
求解方法有两种:
基于梯度降低的方法
随机梯度降低法(Stochastic Gradient Descent, SGD)
, 每次随机找一条训练样本, 求得其梯度, 而后将参数向梯度的反方向前进一步, 不断重复该过程, 求得一组结果稳定的参数值;
求两组参数 \(x_{u,k}\) 和 \(y_{i,k}\) 的偏导数:
\[\frac{\Delta L}{\Delta x_{u,k}} = -2(r_{u,i}-\sum(x_{u,k} \times y_{i,k}))y_{i,k} + 2\lambda x_{u,k} \\ \frac{\Delta L}{\Delta y_{i,k}} = -2(r_{u,i}-\sum(x_{u,k} \times y_{i,k}))x_{u,k} + 2\lambda y_{i,k} \]
根据上面的梯度求得参数的前进方向:
\[x_{u,k} = x_{u,k} + \alpha((r_{u,i} - \sum(x_{u,k} \times y_{i,k}))y_{i,k} - \lambda x_{u,k}) \\ y_{i,k} = y_{i,k} + \alpha((r_{u,i} - \sum(x_{u,k} \times y_{i,k}))x_{u,k} - \lambda y_{i,k}) \]
能够先将 \(x_{u,k}\) 和 \(y_{i,k}\) 随机初始化, 而后按上面公式不断迭代;
其中三个参数 \(\lambda\)(正则化系数) , \(\alpha\)(学习率) , \(K\)(隐特征) 都须要反复试验来肯定最优值;
不基于梯度的交替最小二乘法
交替最小二乘法(ALS), 将两组参数交替保持一组固定不变, 来优化另一组;
引入新变量: \(c_{u,i} = 1+\alpha r_{u,i}\)
优化目标变动为:
\[L = \sum_{u,i} c_{u,i} (r_{u,i} - \sum(x_{u,k} \times y_{i,k}))^2 + \lambda(\sum{x_{i,j}^2}+\sum{y_{i,j}^2}) \]
- 增长 \(c_{u,i}\) 参数, 让每条样本都有不一样的权重;
- 全部数据参与计算, 移除 sample 下标;
改写向量形式:
\[L = \sum_{u,i}c_{u,i}(r_{u,i} - x_u^Ty_i)^2 + \lambda(\sum_u{||x_u||^2 + \sum_i{||y_i||^2}}) \\ L = \sum_{u=0,i=0}^{u=m,i=n}(c_{u,i}(r_{u,i} - x_u^Ty_i)^2 + \lambda({||x_u||^2 + {||y_i||^2}})) \]
经过微积分运算求得解析解:
\[x_u = (YC^uY^T + \lambda I)^{-1}YC^uR_u \\ y_i = (XC^iX^T + \lambda I)^{-1}XC^iR_i \]
物品与物品的相关性
从根本逻辑上划分算法:
- 基于行为的算法
- 以余弦类似度为表明的类似度算法
- 以 Apriori 与 FP-Growth 为表明的关联规则算法
- 基于内容的算法(后面介绍)
关联规则算法是对数据作了严格限制, 好比限制分析一次购物涉及的物品之间的关系, 计算出的数据相关性会更强, 因为使用了更少的数据而致使覆盖率较差;
类似度算法则是分析一段时间内购买行为数据, 相关性上有所牺牲, 但会有更好的多样性和覆盖率;
能够说类似度算法是一种广义的关联规则算法;
两个 N 维向量 X (\(X=(x_1, x_2, \dots, x_N)^T\))和 Y (\(Y=(y_1, y_2, \dots, y_N)^T\)) 的余弦类似度:
\[consine(X, Y) = \frac{XY}{||X||||Y||} = \frac{\sum_{i=1}^NX_iY_i}{\sqrt{\sum_{i=1}^N X_i^2}\sqrt{\sum_{i=1}^N Y_i^2}} \]
大数据稀疏状况下会形成两个层面的浪费:
- 物品对层面的浪费: 每一个用户只会对少许物品产生行为;
- 点积层面的浪费: 少许用户同时对两个物品产生行为;
采用剪枝优化
,
- 分子, 同时对物品 i 和物品 j 产生过行为的用户数, intersect(i, j);
- 分母, 物品 i 和物品 j 对应的向量长度, 即对物品 i 和物品 j 产生过行为的用户数, count(i), count(j);
优化后的计算流程:
- 将用户到物品的行为原始数据转为物品到用户的倒排表;
- 遍历倒排表获得全部的 intersect(i, j), 和全部的 count(i);
- 使用 intersect(i,j) 和 count(i) 计算物品 i 和物品 j 之间的非零类似度;
用户与用户的相关性
同物品与物品的相关性计算方法, 将用户和物品位置互换便可;
通常网站, 用户数的量级要比物品数的量级大, 增长了用户之间相关性计算的复杂度; 因此要考虑业务特色和规模;
小结
以上介绍的方法都是基于用户行为的召回算法, 存在以下问题:
- 依赖用户行为, 扩展能力差(冷启动和时效性);
- 缺少抽象, 知其然不知其因此然;
- 长尾挖掘能力差与滞后性, 直接依赖用户行为的算法, 也称
基于记忆的算法
, 对于新物品或长尾物品不利;
如下介绍基于用户画像(标签)的算法;
用户与标签的相关性
用户标签来源:
- 根据行为分析; => 行为权重+时间衰减;
- 根据行为分析+相关性; => 在1基础上再考虑标签的相关性;
- 不直接依赖用户行为, 用户自己属性; => 用户主动填写高权重, 算法推测低权重;
标签与物品的相关性
- 类别到物品, 经常使用方法是在召回热品, 新品或质量高的物品时, 加入一些品类下的重点物品; 过程当中最好加入一些随机因素;
- 语义主题到物品, LDA, 经过贝叶斯公式获得每一个主题下不一样物品的几率 \(P(doc_i|topic)=\frac{P(topic|doc_i)P(doc_i)}{\sum_k{P(topic|doc_k)P(doc_k)}}\)
- 搜索词到物品;
将用户与物品的关系拆解为多个中间相关性的组合;
冷启动场景下的推荐
- 用户维度冷启动, 用户没有在系统中留下足够的行为;
- 物品维度冷启动, 新物品, 尚未足够多的用户对其产生行为;
解决方法: 基于内容的推荐算法, 或直接推荐畅销热品或新品;
冷启动时期推荐系统的责任:
- 给出推荐结果;
- 尽快探测用户的兴趣, 推荐种类丰富的物品, 增大命中用户兴趣的可能性;
解决冷启动问题, 在推荐系统中称为 Exploration & Exploitation 问题(EE问题)
, 即探索与利用问题;
参考文章
- ALS交替最小二乘法推导