1. RecSys-Notes#

记录推荐系统相关的优化经验、学习笔记。

2. 推荐系统适用场景#

信息过载+无明确意图

3. 推荐系统从0到1#

在开始搭建推荐系统前,建议可以看看Google的机器学习最佳实践(共43条)【汉】。里面讲到进行机器学习的基本方法是:

  1. 确保机器学习流程从头到尾都稳固可靠。
  2. 从制定合理的目标开始。
  3. 以简单的方式添加常识性特征。
  4. 确保机器学习流程始终稳固可靠。

上述方法将在长时间内取得很好的效果。只要您仍然可以通过某种简单的技巧取得进展,就不应该偏离上述方法。增加复杂性会减缓未来版本的发布。

从0到1就是要解决冷启动问题,冷启动问题可以用产品的办法解决,也可以在推荐系统内解决。

3.1. 冷启动#

3.1.1. 系统冷启动#

3.1.2. 新用户冷启动#

3.1.3. 新内容冷启动#

3.2. 搭建推荐系统#

一个完整的推荐系统包括:数据采集、数据处理、推荐算法、评估体系。下图把推荐系统的基本结构描述得非常清除了。

来源:jihoo-kim/awesome-RecSys

3.2.1. 数据采集#

数据采集包括了:用户信息采集(人群属性、兴趣问卷),用户行为数据采集(埋点日志),推荐日志,内容打标。

3.2.2. 数据处理#

数据处理包括:样本生成、特征工程、报表

3.2.3. 推荐算法#

经典推荐架构:召回、排序、策略。从0到1的过程中需要特别关注冷启动问题:系统冷启动、用户冷启动、内容冷启动。 - 召回。冷启动阶段没有太多用户行为数据。可以采集用户信息、多利用item标签、捕捉实时信息。热门召回、人群热门召回、用户采集兴趣召回、用户实时兴趣召回。另外需要做召回去重。 - 排序。冷启动阶段最好是用单目标简单模型,把整个流程跑通。 - 策略。黑白名单、调权、频控、打散、保量

有一些开源的推荐系统框架(2022-07-01更新star数):

3.2.4. 评估体系#

评估体系包括:在线评估(ABtest、报表)、离线评估。

4. 推荐系统优化#

4.1. 召回优化#

4.1.1. 召回的评估#

召回率、准确率、hit率、内容覆盖度、基尼指数

4.1.2. 召回算法#

构建item向量索引:

参考: 几款多模态向量检索引擎:Faiss 、milvus、Proxima、vearch、Jina等

4.1.3. 召回负样本处理#

4.1.4. 推荐历史去重#

4.2. 排序优化#

4.2.1. 排序的评估#

  • 线上评估
    • ABtest。留存、时长、ctr、刷帖、点赞、评论、转发等
    • 模型评估指标。在线auc、gauc
  • 离线评估
    • 分类。auc、guac
    • 回归。rmse、mae、mape
  • debug工具
    • 推荐线上服务debug
    • 在推荐的整个留存打印debug信息,然后把debug信息放到debug工具中展示。
    • 模型debug
    • TensorBoard

评估指标

  • MAP (Mean Average Precision)
  • NDCG (Normalized Discounted Cumulative Gain)

4.2.2. 代理指标#

不同业务线的业务目标,用户关键行为都不一样,需要针对性的建模。另外构建一套样本是成本非常大的事情,包括推动前端增改卖点,大数据做好样本关联,数据校验,累计一段时间样本用于训练,整个周期会非常长。所以一般推荐在一开始就把所有能想到的user-item的行为数据都做好埋点。

  • 电商
    • GMV。GMV=DAUCTRCVR下单次数单均价。以上指标一般是uv维度,按照天、周级别统计。无法作为直接排序label
    • item级别行为。曝光、击、加购、下单、成单、评分。电商的行为在时间维度上可能不较长,如成单、评分等动作的延迟甚至可能是几天。
  • 娱乐
    • 用户总停留时长。TotalDur=DAU刷帖数贴均时长=(DNU+DAU留存)刷帖数*贴均时长。
    • item级别行为。
    • 隐式反馈:曝光、点击、时长、完播
    • 显式反馈:点赞、评论、转发
  • 社交
    • 总互动。总互动=DAU匹配率互动数。
    • item级别行为。曝光、点击、关注、互动

排序的迭代路径一般是由一轮排序,到包含粗排、精排的两轮排序。甚至随着候选池的增加,可以增加更多轮排序。由单一目标排序,到多目标融合排序。由简单模型到复杂模型。LR、FM、Wide&Deep、DIN、MMOE、SNR

引入多目标的几种方式: - 样本调权 - 见:街首页推荐多目标优化之reweight实践:一把双刃剑? - 线性加权。Score = a*scoreA + b * scoreB + c * ScoreC + … + m * ScoreM - 乘法加权。一般用在电商场景 Score = pow(ctr+ai, bi) * pow(price+aj, bj)

业界的一些多目标融合的实践: - BIGO | 内容流多目标排序优化 - 爱奇艺:多目标排序在爱奇艺短视频推荐中的应用 - 快手:多目标排序在快手短视频推荐中的实践

4.2.3. 特征工程#

  • 主体维度
    • 用户
    • 人群属性
    • 行为特征
    • 统计特征
    • item
    • 标签
    • 统计特征
    • context
    • 地理位置
    • 时间
    • 推荐tab
  • 时效性维度
  • 批量特征
  • 实时特征

内容理解。通过NLP和CV的能力,给视频、图片的自动打标。做好场景识别、人脸识别、OCR、文本的关键词提取等。 NLP相关:

CV相关

4.2.4. 样本#

样本=label+特征。 label一般来自客户端的埋点,也有用到服务端数据的(比如,点赞、成单等数据服务端也有记录)。一般都会有多个label日志(曝光、点击、时长、点赞等),需要把这些日志关联起来。特征来源于推荐埋点日志或离线批处理特征,最好是把特征都埋在推荐replay日志中,这样可以避免离线在线特征不一致问题。label埋点和推荐replay日志的关联可以通过约定的唯一性id来确定,如:user_id、item_id对,或者唯一性的session_id。

label埋点日志关联,可以在客户端关联,也可以在大数据这里关联。为了减少客户端的复杂性,现在一般都是无代码埋点,只埋事件日志,然后由大数据这边关联。中间存在一些问题:

  • 日志丢失
    • 客户端要做日志的持久化, 会导致日志延迟比较大,不过总比丢了好
    • 日志回传要做好丢包重传等机制
    • 服务端接收后一般是直接到kafka
  • user-itme粒度的日志回传事件跨度大
    • 天级别批处理,要做好跨天的处理
    • 实时关联,一般设定cache时间窗口
    • 负样本cache,skip-above
    • 负样本不cache,会有False Negative问题
      • 样本重要性采样(importance sampling)
      • FN矫正
      • PU loss (Positive-unlabeled loss) 问题是来多个正样本怎么办
      • 延迟反馈 Loss

4.2.5. 模型#

正则:L1、L2、Dropout、BatchNorm、Relu 序列建模:Attention、Transformer、GRU、LSTM 参数共享:gate、routing 优化器:FTRL、Adagrad、Adam

树模型:

  • GBDT
  • Xgboost
    • Introduction to Boosted Trees 1.5h xgboost官网上对BT介绍文章,这个文章降低非常浅显易懂,首先摆出训练时的优化函数=偏差+复杂度,我们要在减少偏差和减少复杂度之间寻求平衡,先讲了CART的结构,然后讲BT是一步步添加树的,然后讲到每次添加一棵树的时候,是如何从众多树里面寻找到最好的那颗树,这里面就是刚刚说的优化函数。最后在讲了单颗的训练过程中也可以尽量去优化。感觉大致懂了,有时间再去深究里面的一些东西吧。  论文 XGBoost: A Scalable Tree Boosting System
    • xgboost 实战以及源代码分析
    • xgboost_code_analysis
    • XGboost核心源码阅读
    • DART booster 在gbtree.cc中看到dart,特性就是通过drop树来解决over-fitting。但是预测会变慢,early-stop可能不稳定。
    • Dropout 解决 overfitting 简单搜了下,在NN中就是drop一些单元,属于一种正则化的手段。
    • Monotonic Constraints 在模型训练中添加单调性约束
    • 模型调参
    • xgboost参数() 这些参数不太懂:gamma 、 max_delta_step、colsample_bylevel、alpha、lambda、 b。 个人理解所有的GB,学出来的都是tree,本质上就是用特征将目标进行分类。一颗树学习得太浅,所以会学出很多颗tree,然后加权到一起,这样可以学得更精细一点,可以对一个特征进行更多次切分,可以试验多种特征组合。 然后由于用于训练的样本是有限的,训练样本级与实际总样本之间可能存在偏差,而我们学到的森林其实是对我们的样本集的统计学特性的模拟,和样本拟合得太匹配,就越容易拟合到其中的偏差部分。所以会通过控制树的深度、叶子节点的样本最小数量等控制精度,以免学得太过了。 由于样本收集的时候可能存在一些不随机的部分,就是有偏差。我们在样本集的基础上,做一些处理,来消除这个不随机的部分。一种是随机的抽一部分样本(随机样本子集),一种是训练的时候只训练一部分特征(随机特征子集)。 还有一种就是我们学习的时候,不要学得太像这个样本了,就是所谓的学习率调低一点,学习得更模糊一点。 另一方面因为是GB,就是梯队推进,就是走一段路看一下调整方向,然后继续继续往前走一步。这个过程中,如果每次走的路短一点,就是增加了对齐方向的次数,就越不容易出现偏差,就不容易过拟合。 如果样本集的正负样本数量差距太大,可能导致正样本被埋没了,所以有必要增加正样本的权重。
    • param_tuning 理解样本偏差,控制过拟合,处理不平衡的数据集。
    • 论XGBOOST科学调参
    • 为什么xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?
    • 机器学习算法中GBDT和XGBOOST的区别有哪些?
    • xgboost如何使用MAE或MAPE作为目标函数?
    • Xgboost-How to use “mae” as objective function?
    • 模型分析
    • xgbfi xgboost特征交互和重要度。里面提到用Gain(特征增益)和Cover(分裂方向的概率)构造出期望增益ExpectedGain,相比于分裂次数更能体现特征的实际作用。另外考虑了如何评估多个特征之间的影响,就是计算一条路径的增益。不过工具还不完善,对评估指标本身也没有进行详细解释。
    • Understand your dataset with XGBoost xgboost提供了特征重要度工具,主要有gain和cover
  • LightGBM

来源:从算法到工程,推荐系统全面总结

从LR到DNN模型:

模型引入图像特征:

推荐的可解释性:

多任务模型结构:

多任务模型的loss设计:

业界实践

4.2.6. 偏置处理#

偏置的类型:

  • 点击位置偏置
  • 视频时长偏置

处理偏置的方法:

4.3. 策略优化#

4.3.1. 打造生态:消费者、生产者、平台三方利益兼顾#

4.3.2. 流量扶持:新内容、新生产者、新品类#

4.3.3. 探索与利用#

缓解回音壁、保持多样性、提供惊喜和新鲜感

4.3.4. 如何缓解头部效应#

4.3.5. 重排模型#

5. 推荐系统的未来#

5.1. 对长期收益建模#

强化学习在推荐的应用:

强化学习的资料:

5.2. 对item组合建模#

5.3. 极致的时效性#

实时特征、实时模型、端上重排

  • 实时特征。这个最容易,时效性可以比模型高。
  • 实时模型
    • 半实时
    • GBDT+LR
    • Wide&Deep
    • 全实时。现在都有ps了,模型本身是可以实时训练的。这里有几个问题
    • 模型的batch大小。为了凑齐batch最长等多久。
    • 更新serving模型的实践间隔。一个是工程问题,大模型参数同步也要实践。另外一个是更新太快不一定有效果。对广告这种特别依赖id,且素材id更新非常频繁的,可能会比较有用。
  • 端上重排

实时优化器。本质上就是要加好正则,避免被少数样本带偏了

- FTRL(Follow The Regularized Leader)
  - [Online Learning算法理论与实践](https://tech.meituan.com/online_learning.html) 主要介绍Online Learning的基本原理和两种常用的Online Learning算法:FTRL(Follow The Regularized Leader)和BPR(Bayesian Probit Regression)。基本原理理解,具体公式推导有点晕。
  - [RDA, FTRL 在线学习算法最初的优化公式是依据什么得到的?](https://www.zhihu.com/question/266462198/answer/309780073)
  - [在线学习(Online Learning)导读](https://zhuanlan.zhihu.com/p/36410780)
  - [Online Learning and Online Convex Optimization](http://www.cs.huji.ac.il/~shais/papers/OLsurvey.pdf) 其中的2.3节讲到FTRL
- MIRA(Margin-infused relaxed algorithm)
  - [浅谈在线机器学习算法](http://yjliu.net/blog/2012/07/14/a-brief-talk-about-online-learning.html) 提到了Perceptron算法用于二分类问题,MIRA算法用于多类问题。
- Online gradient descent: Logarithmic Regret Algorithms for Online Convex Optimization
- Dual averaging: Dual Averaging Methods for Regularized Stochastic Learning and Online Optimization
- Adagrad: Adaptive Subgradient Methods for Online Learning and Stochastic Optimization
- PA(Online Passive-Aggressive Algorithms)
  - [Online Passive-Aggressive Algorithms](https://link.zhihu.com/?target=http%3A//www.jmlr.org/papers/volume7/crammer06a/crammer06a.pdf)  Shai Shalev-Shwartz于[2006]发表,提出了一种基于边界的在线学习算法簇,可以支持多种预测任务。具体来说可以用于二分类、回归、多分类、序列预测等任务,使用hingeloss损失函数。
  - [Online Learning:Theory, Algorithms, and Applications](http://ttic.uchicago.edu/~shai/papers/ShalevThesis07.pdf) Shai Shalev-Shwartz的博士论文,[2007]发表,旨在建立一个支持多种预测任务的在线学习簇。
- 综述性文章
  - [Online Learning and Stochastic Approximations](http://leon.bottou.org/publications/pdf/online-1998.pdf) L´eon Bottou,AT&T实验室,[2018]修订版,在线学习和随机优化的解释文章。
  - [Online Learning and Online Convex Optimization](http://www.cs.huji.ac.il/~shais/papers/OLsurvey.pdf) Shai Shalev-Shwartz于[2011]写的一篇综述性论文

5.4. 更丰富的交互信息#

5.5. 与其他模块的协同#

迁移学习。引入其他人口(如搜索),其他app的用户信息。

5.6. 自动化AutoML#

AutoML工具(2022-07-07更新star数):

6. 学习资源#