推荐页请求流程
- 召回
基于话题:获取用户的关注数据,用户行为挖掘;
基于内容:协同过滤的方式 - 排序
基于规则:时间顺序,线性加权;
基于模型:GDBT,DNN - 重排序
提权:比如给视频进行一定的提权;
隔离:相似内容隔开;
强插:高质量的新内容流通
ranking演进
特征介绍
-
用户画像特征
用户属性特征:性别等;
统计特征:用户点赞数等。 -
内容画像
固有特征:文章长度,关键词等;
统计特征:历史点赞数等。 -
交叉特征
用户与内容的交叉特征:比如用用户感兴趣的话题和当前待推荐内容的话题交叉。
CTR模型
DNN
结果:这一版模型的AUC为0.7618
结果:AUC:0.7678,提升0.6%
Deep FM
该DeepFM算法与华为设计的DeepFM不同,改模型将FM层的结果作为DNN的输入。
AUC 提升 0.2%
Last View + DIN
Last view topic 与当前内容的几个 topic 计算 Attention Score,再按权重进行 sum pooling;这个模型参考了阿里的DIN模型,它会把用户看过的东西Embedding,然后根据Attention Score再乘起来,我们的做法有所不同,我们是基于Topic,是过去用户看过那些Topic下的内容进行划分
AUC 提升约 0.2%
Last Display + GRU
过去点击的行为对现在能够产生影响,那么同理,过去展示的内容中没有点击的内容对当下的点击行为同样会产生影响,所以这里面增加了Last Display(包括点击和没点击的所有数据)
Last Display 经过 Embedding 后与是否点击结合,再进入 GRU 模块,最后状态当做 DNN 输入;
AUC 提升约 0.4%
多目标优化
之前所有的模型都是基于CTR为导向来进行设计的,但是这样用户的负反馈可能会比较多一些,因为一些长尾的内容,或者大众化的内容会比较多,影响用户的体验。
后来考虑设计一个多目标模型,一个是基于点击率的模型,一个是基于收藏率的模型,基于点赞率,基于评论率等等,一共设计8个目标。
从性能方面的考虑,我们将底层权重设置成共享的,最后一层会根据不同的目标进行权重的训练
上线后线上表现:点击率基本不变,而其他的几个指标,比如点赞,收藏大幅提升
最终模型结构
经验分享
- 对于随时间变化的统计特征,比如用户和内容画像的统计值,线上 service 应当纪录请求时的值,生成训练样本时直接从纪录的日志里获取,避免特征穿越问题;
- 如果发现线下效果好,比如 AUC 和 NDCG 提升明显,但上线效果不显著,很可能是特征不一致导致的,可重点排查;
- 线上线下最好使用同一套特征抽取框架,只需使用的相同特征配置便可保证一致性,我们 Global Ranking 使用同一套 proto结构和特征抽取模块实现;
- 做特征归一化操作,发现有特别大的值,比如几万或者几十万,要先取 log ,不然会导致这个特征大部分值都趋向0,相当于征失效;
- 输入特征要做非法检查,防止出现 inf,nan,而导致模型训练出现异常的参数;
- 对于线上的每次请求,用户特征都是一样的,可以只计算一遍用户特征相关的 block,避免冗余运算;
- 训练数据量要尽可能大,可以使用 FlatBuffer 结构把训练数据存放在 HDFS 上,训练时直接从 HDFS 读取,边读取边训练;
- 线上模型要能自动更新,过老的模型效果下降严重。
面临问题
- 推荐页与搜索页的特性不同
o 搜索带着 query 来的,结果与之相关性越高越好,不用太关心结果的多样性;
o 推荐页用户没有明确的目的,但是有兴趣偏好和对结果的多样性需求,推荐既要准确又要多样化。
-
CTR 预估模型是 pointwise 模型,没有考虑单个内容与其他内容同时出现的影响。
-
用户对感兴趣的东西会出现审美疲劳,要及时抓住这种特点,比如一个算法工程师看完几个机器学习文章后就不想再看了,这时候要能推荐一些其他话题的内容