知乎推荐系统的实践及重构之路
知乎如何洞察你的真实喜好?首页信息流技术揭秘
前记
架构部分主要是针对业务的发展把召回、排序等模块进行了可配置化和选型梳理
算法部分基本上参考youtube2016和alibaba2018的思路对系统进行了重构,包括召回和排序,也结合自己的业务做了一些优化,值得参考。
系统架构
- 高并发场景从python到golang,利用抽象工厂模式来实现可插拔
- 解决支持多队列混排和支持多路召回
- 具体的召回方式主要是ES + Redis + ANN 的模式进行构建。ES 主要支持相对复杂的召回逻辑,比如基于多种 topic 的混合召回;Redis 主要用于支持热门召回,以及规模相对较小的 CF 召回等;ANN 主要支持 embedding 召回。
- 离线任务和模型的管理问问题
- 离线任务的代码统一到一处管理
- 离线任务管理平台,将所有任务以通用包的形式进行管理
- 任务结果的监控体系
- 特征穿越问题
- 在线代替了离线,通过在线落特征日志,而不是 Raw Data,并统一了特征日志 Proto,如此就可以统一特征解析脚本。
- StatsD + Grafana + InfluxDB 的监控系统,因为召回已经用配置的方式,那么剩下的召回源的比例关系,还有特征分布,ranking 得分分布都可以很方便的获取,而不用一个一个开发
召回
- 多路召回:用户画像、内容标签、内容源信息、关注关系队列、搜索关键词队列、用户兴趣召回感兴趣的内容,根据搜索关键词进行相关推荐
- DNN召回1.0
- 用户 128 维的 Embedding 表示
- 冷启动:看到内容用户的 Embedding 是什么以及点击这些内容用户的 Embedding 是什么,我们可以利用这份数据把这些新产生内容的 Embedding 计算出来更新到 Embedding 库里面去
- 准确度 DNN 比起 ALS 来讲提升了10倍的量级
- DNN召回2.0
- 原始数据比如长度有多少,有没有图片,经过三层的网络之后会生成 Feed Embedding,可以直接得到 Content Embedding,解决新内容的召回机制问题
- 1)User Representation Network 引入 FM Pooling 层,学习用户高频消费行为的交叉特征,会让 Top100 的精确度提高 8%,2)我们把展示未点击的数据作为特征引入到 User Representation Network 里面,其中会用到历史搜索和历史阅读数据。3)展示了但是跳过的内容会在采样的时候加大权重,把它成为负例的概率变得更大,让用户的行为来指导采样。
排序
- GBDT -> DNN -> ATTENTION+LSTM , 强化学习
- 引入 FM 层作为这些类别之间的 Sparse Input 之间的交叉,AUC 提升了 0.2%,CTR提升了 1%。引入 CNN 及 LSTM 分别作为文本Encoder/Last Action Encoder,单用户使用时长提高 50 秒。
- 引入 Attention 机制作为用户 Embedding 和 Candidate Embedding 之间的交叉权重,单用户使用时长增加了 40 秒左右
- 多目标:我们使用了 CTR 预估模型预训练网络,利用 Parameter Hard Sharing,点击和点赞这两层共享之前的权重,会有一个独立的隐藏层 model task 自己的目标,这样能降低前向/反向传播中的计算量。
- 将连续值预测转化成离散值预测:阅读时长的分布,这个分布与正态分布比较类似。所以我们使用了 z-value 来对阅读市场进行离散化,离散化之后会把阅读时长分为五等——没点击、点击了阅读时长低、点击了阅读时长中等、点击了阅读时长偏高、点击了阅读时长非常高
- 修改了 Softmax 函数:如果预测出的档数和实际用户阅读时长档数差太多,我们加一个比较大的修改函数,让这种样本的 loss 加大
模型训练问题和业务问题
- 样本组织:线上进行实时打点避免穿越;正负样本进行不同采样率的实验
- 特征工程:分布范围比较大的特征,有一万个赞也有几万个赞的,做 CTR 预估的过程中赞量的影响会变得非常不平均,所以通常会进行特征的归一化和 boxing,分成不同的段输入
- 模型评估:做了一个 DCG Gain 收益的指标,比AUC具有更高的参考意义
- 多样性问题:一个内容出现几次之后你没有点击,之后都不会推荐相似的内容
- 信息茧房:针对老用户及兴趣比较均匀的用户,适当减少兴趣探测力度,在探测过程中也会尽量使用 Tag 之间的关联信息增强探测效率
总结
- ES也许在我们目前的场景中能发挥用处,而不用人工来进行索引拆解
- DNN来进行召回和排序看起来已经是业界非常通用的方法了,而且ESSM和DIN、DIEN这些ali的方法看起来工业届也是用起来比较合适的
- 特征工程其实有很多统计的工作
- 配置化不仅策略上线方便,监控也方便
有疑问加站长微信联系(非本文作者)