Skip to content

记录推荐系统相关的面试题、优化经验

License

Notifications You must be signed in to change notification settings

zyxdtk/RecSys-Notes

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

引入多目标的几种方式:

业界的一些多目标融合的实践:

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可能不稳定。
    • 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更新非常频繁的,可能会比较有用。
  • 端上重排

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

5.4. 更丰富的交互信息

5.5. 与其他模块的协同

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

5.6. 自动化AutoML

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

6. 学习资源

About

记录推荐系统相关的面试题、优化经验

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published