推荐系统
推荐系统[1]
-
ALS: 矩阵分解算法,$Q=LR$,交替最小二乘。通过分别固定左右矩阵,依次更新。通过$L=QR^{-1}$,求得另一个矩阵。矩阵通过随机初始化,然后更新到收敛为止。
-
weighted-ALS: 从评分预测问题转化为点击预测,其中浏览越多的权重越高。其中$C$为点击次数,$\alpha$一般为40。
\[\begin{equation} min \sum c_{ui}(r_{ui}-q_u p_i)^2 + \lambda(...) \end{equation}\]\(\begin{equation} c_{ui} = 1+ \alpha C \end{equation}\)
- 负样本采样一般推荐使用热门物品,随机的不是很靠谱。
-
BPR: pair-wise, 评价指标使用AUC较为合适。不适合预测评分,适合预测行为。 \(\begin{align} X_{u1,2} &= X_{u1} - X_{u2} \\ p(1 \gt_u 2 ) &= \frac{1}{1+e^{-X_{u1,2}}} \end{align}\)
- GDBT+LR: 先训练GDBT,生成N棵树。来了新样本之后,走过所有的树,将访问到的叶子结点的值设为1,未访问到的设置为0。这样生成的one-hot特征,再丢到逻辑回归里做预测。
- FM: 就是加入了特征二阶组合的逻辑回归。为什么要二阶组合:例如年龄三十岁的男的对预测很重要,那么,做二阶组合就能提升效果。不做二阶组合达不到这个效果。而直接做二阶组合的话,参数过多,所以引入了参数对应的隐向量。
- FM模型如果仅用用户ID和电影ID的话,那么就是带偏置SVD。
- 如果加上历史观看的电影,那就是SVD++
- 加上时间信息就是time-SVD。
- 所以FM可以在最后做模型融合。
-
FFM:多加了多个隐向量,向量相乘时候选用另一个向量所在领域的向量。
- wide&deep: wide 一般是指以前做推荐一般都是特征工程+逻辑回归。这样的好处是效果挺好,并且工程师可以并行工作,推荐的可解释性较强。但是深度学习出来之后,就希望引入deep的特征自动学习的能力。
- 其中最后一层还是逻辑回归,deep的最后一层隐藏层和wide提取到的特征一起输入逻辑回归。
- 其中数据要进行归一化(要变为正态分布,进行分桶处理)。
- 优化:Google的Wide&Deep模型中,要使用带L1正则化项的FTRL作为wide部分的优化方法,而使用AdaGrad作为deep部分的优化方法
- L1 FTRL会让Wide部分的大部分权重都为0,我们准备特征的时候就不用准备那么多0权重的特征了,这大大压缩了模型权重,也压缩了特征向量的维度。
- Exploration and Exploitation: MAB 多臂老虎机。机会给确定好的选项和不确定的选项。评估指标:累积遗憾
- 汤普森采样算法:根据beta分布来进行选取
- UCB算法:根据进评分公式来选取
-
Epsilon 贪婪算法:$\epsilon$的概率随机选择一个选项,$1-\epsilon$的概率选择平均收益最高的。
- (ridge 回归就是在矩阵对角线加上$I$,使得矩阵不那么病态?)
- Lin-UCB: 给每个臂加上了特征。
- COFIBA: 给Bandit算法加上了协同过滤。?(看不懂)
- 2Vec
- doc2vec: 在预测中间词的时候,附带上了段落id,所以在学习过程中能对段落id对应的embedding进行更新。一个段落有多少个滑动窗口就能更新几次。
- 能用来学习用户的embedding
- doc2vec: 在预测中间词的时候,附带上了段落id,所以在学习过程中能对段落id对应的embedding进行更新。一个段落有多少个滑动窗口就能更新几次。
- 常见算法:
- DeepFM: 将最后wide+deep的中wide的输入换成FM模型。http://d2l.ai/chapter_recommender-systems/deepfm.html
- FNN: 使用提前训练好的FM对应的嵌入,而DeepFM是联合训练。 fm后面再接几层DNN
- NFM: 两两逐元素相乘后求和 https://zhuanlan.zhihu.com/p/75718994
- PNN: 池化层换成向量积+FM??????
- DCN:Cross Network + DNN。考虑数值特征,会将其拼接一起。 \(X_{L+1} = X_0 * X_L^T * W_L + b_L + X_L\)
- 排行榜算法:可以解决冷启动问题,老用户兴趣发现,推荐系统兜底算法。主要是得考虑时间因素,使得排行榜能够不断更新。
- 一般就是 $\frac{投票数}{时间^\alpha}$ 或者 $\frac{投票数}{e^{时间}}$ 加上几个参数罢了。
- 重复检测:
- 布隆过滤器:多个hash函数,将向量对应位置置1。(所以有将不存在的元素判断为存在的风险)
- simhash:文本hash
- 构架:
- 聚合信息流
- 内容采集
- 离线计算:一般是做用户画像,训练模型,也有少部分就输出推荐了。一般用hadoop做数据源。
- 实时计算:在线排序召回
- 日志与监控:
- 社交信息流:
- 动态分发:一般活跃用户用推,不活跃的用拉。信息流存储可以用redis,推送则用Celery。消息队列:kafka
- 推:
- 拉:
- 动态排序:得用RPC,例如Tensor Serving。
- 动态分发:一般活跃用户用推,不活跃的用拉。信息流存储可以用redis,推送则用Celery。消息队列:kafka
- netflix:
- 离线层
- 实时层
- 近线层:流计算:Strom, Spark Streaming, Flink
- 聚合信息流
- 数据采集:
- 日志系统:加埋点,前端后端,无埋点。
- 实时推荐:(难度依次增加)
- 实时给出推荐结果
- 实时特征更新
- 实时模型更新
- 流计算(storm):
- 组件
- spout
- Bolt
- Tuple
- Topology
- 作用:
- 清晰数据
- 合并历史行为
- 更新用户相似度
- 在线更新机器学习模型
- 更新推荐结果
- 组件
- AB实验:
- 需要分层,重叠,从而能同时进行多组实验。
- 重叠实验
- 来自上一层的流量需要合并后均匀分配到下一层,使得上一层的划分对下一层没有影响。
- 每一层分桶时,散列函数需要加上层的ID,使得层和层分桶时独立。
- 取模要一致,使用户体验一致
-
信息流api需要实现幂等,RESTFul API的一个要求,防止请求超时重新请求的时候,给出的推荐结果不一样了。
- 测试:
- 软件测试
- 离线模拟测试
- 在线对照实验
- 人工回访校验
- 指标:
- 个性化程度:增加的物品或用户能否带来等比例的连接增加。或是对比不同用户推荐结果的相似度。
- 基尼系数: 衡量马太效应,流量是不是都倾斜给头部item了
- 多样性:类别分布是不是均衡啊
- 系统安全:
- 攻击:水军,先得选目标用户,打相似评分,然后扶持对应的物品或者打压物品。还得随机打分以掩盖行为
- 防护:防止注册,发现虚假评价,降低权重。
参考文献
-
推荐系统.陈开江. ↩
Written on May 11, 2022