精排模型的改进
- 推荐系统的精排模型大多长这样
精排模型:基座
- 基座的输入包括离散特征和连续特征,输出一个向量,作为多目标预估的输入
- 改进 1:基座加宽加深,计算量更大,预测更准确。embedding 的参数量特别大,但是全连接层的参数又不够大,所以加宽加深可以让预测更准。由于计算量也加大,所以就有一个投入产出比的问题。如果算力比较强而且工程架构比较先进,那么基座可以大一些,比如 6 个全连接层,否则基座会很小,只有一两层
- 改进 2:做自动的特征交叉,比如 bilinear 和 LHUC
- 改进 3:特征工程,比如添加统计特征,多模态内容特征
精排模型:多目标预估
- 基于基座输出的向量,同时预估点击率等多个目标
- 改进 1:增加新的预估目标,并把预估结果加入融合公式
- 最标准的目标包括点击率,点赞率,收藏率,转发率,评论率等
- 寻找更多目标,比如加入评论区,给他人写的评论点赞等
- 把新的预估目标加入融合公式
- 改进 2:MMoE,PLE 等结构可能有效,但往往无效
- 改进 3:纠正 position bias 可能有效,也可能无效
粗排模型的改进
- 粗排的打分量比精排大 10 倍,因此粗排模型必须够快
- 简单模型:多向量双塔模型,同时预估点击率等多个目标
- 复杂模型:三塔模型效果好,但工程实现难度大
粗精排一致性建模
- 蒸馏精排训练粗排,让粗排和精排更一致
- 方法 1:pointwise蒸馏
- 设 yyy 是用户真实行为,设 ppp 是精排的预估
- 用 y+p2{y+p} \over 22y+p 作为粗排拟合的目标
- 例:
- 对于点击率目标,用户有点击(y = 1),精排预估 p=0.6p=0.6p=0.6
- 用 y+p2=0.8{{y+p} \over 2 }=0.82y+p=0.8 作为粗排拟合的点击率目标
- 方法 2:pairwise 或 listwise 蒸馏
- 给定 k 个候选物品,按照精排预估做排序
- 做 learning to rank(LTR),让粗排拟合物品的序(而非值)
- 例:
- 对于物品 iii 和 jjj ,精排预估点击率为 pi>pjp_i > p_jpi>pj
- LTR 鼓励粗排预估点击率满足 qi>qjq_i >q_jqi>qj,否则有乘法
- LTR 通常用 piarwise logistic loss
- 优点:粗精排一致性建模可以提升核心指标
- 缺点:如果精排出 bug,精排预估值 ppp 有偏,会污染粗排训练数据,让粗排也变差,这个问题是不易被察觉的
用户行为序列建模
- 物品ID 为用户最近交互过的物品 ID
- 最简单的方法是对物品向量取平均,作为一种用户特征
- DIN 使用注意力机制,对物品向量做加权平均
- 工业界目前沿着 SIM 的方向做发展,先用类目等属性筛选物品,然后用 DIN 对物品向量做加权平均
- 改进 1:增加序列长度,让预测更准确。但是会增加计算成本和推理时间。主要看工程架构最多能抗多少的序列长度
- 改进 2:筛选的方法,比如用类目,物品向量表征聚类
- 离线用多模态神经网络提取物品内容特征,将物品表征为向量
- 离线将物品向量聚为 1000 类,每个物品有一个聚类序号,通常用层次聚类
- 线上排序时,用户行为序列中有 n=1,000,000n=1,000,000n=1,000,000 个物品。某候选物品的聚类序号是 70,对 nnn 个物品做筛选,只保留聚类序号为 70 的物品。nnn 个物品只有数千个会被保留下来
- 同时有好几种筛选方法,取筛选结果的并集
- 改进 3:对用户行为序列中的物品,使用 ID 以外的一些特征
- 概括:沿着 SIM 的方向发展,让院士的序列尽量长,然后做筛选降低序列长度,最后将筛选结果输入 DIN
在线学习
全量更新 vs 增量更新
在线学习的资源消耗
- 效果非常好,但是算力消耗非常大
- 既需要在凌晨做全量更新,也需要全天不间断做增量更新,所以需要额外的算力
- 设在线学习需要 10,000 CPU core 的算力增量更新一个精排模型。推荐系统一共需要多少额外的算力给在线学习?
- 为了做 AB 测试,线上同时运行多个不同的模型。每个模型都要做在线学习
- 如果线上有 m 个模型,则需要 m 套在线学习的机器
- 线上有 m 个模型,其中 1 个是 holdout,1 个是推全的模型,m - 2 个测试的新模型
- 推全模型可能与 holdout 相同,也可能不同
- 图中有 4 套精排模型,那么就需要 4 套在线学习的资源。也就是说如果公司给了 4 套在线学习的资源,那么就只能测试两套新模型。想看 7 日留存模型就必须在线上跑 7 天,想看 30 日留存就必须跑 30 天。召回和重排越是同理,每个模型都需要一套在线资源,不过召回和粗排模型小,消耗的资源没那么多
- 线上有 mmm 个模型,其中 1 个是 holdout,1 个是推全的模型,m - 2 个测试的新模型
- 每套在线学习的机器成本都很大,因此 m 数量很小,制约模型开发迭代的效率
- 在线学习对指标的提升巨大,但是会制约模型开发迭代的效率
老汤模型
- 解决不了的话新模型很难超过老模型,影响迭代效率
- 用每天新产生的数据对模型做 1 epoch 的训练
- 久而久之,老模型训练得非常好,很难被超过
- 对模型做改进,重新训练,但是很难追上老模型
- 问题 1:如何快速判断新模型结构是否优于老模型?(不需要追上线上的老模型,只需要判断新老模型谁的结构更诱)
- 问题 2:如何更快追平,超过线上的老模型?(只有几十天的数据,心魔新就能追上训练上百天的老模型)
问题 1:如何快速判断新模型结构是否优于老模型?
- 对于新,老模型结构都随机初始化全连接层
- Embedding 层可以是随机初始化,也可以是复用老模型训练好的参数
- 用 nnn 天的数据训练新老模型(从就到新,训练 1 epoch)
- 如果新模型显著由于老模型,新模型很可能更优
- 只是比较新老模型结构谁更好,而非真正追平老模型
问题 2:如何快速判断新模型结构是否优于老模型?
- 已经得出初步结论,认为新模型很可能优于老模型。用几十天的数据训练新模型,早日追平老模型
- 方法 1:尽可能多地付用老模型训练好的 embedding 层,避免随机初始化 embedding 层(embedding 层是对用户,物品特点的记忆,比全连接层学得慢)
- 方法 2:用老模型做 teacher,蒸馏新模型(用户真实行为是 yyy,老模型预测是 ppp,用 y+p2{y+p} \over 22y+p 作为训练新模型的目标)