问题背景
在推荐流里,首位占据着读者视野内的重要位置,第一条推荐内容的优劣决定着读者的第一印象;同时不同位置点击的统计来看,也是顺位衰减的。现对屏内哪条数据该放到第一条,在模型侧尝试解决下。
基本思路
当一屏数据作为候选集,我们可以获得的是前几屏的行为信息,也有当前候选内容的所有信息,那么该把谁在这些约束下放到第一个上呢?当前新闻的上下文是屏内容,当前屏的上下文是之前session行为,全局还有用户的画像类长期表达,可以自然地想到用Attention结构来作为模型的基本结构。总体思路就一句话:在已知中长短行为下,如何挖掘用户点击屏内的某条新闻概率最大,找到它并置于首位。
模型结构
整体基本结构如下,借鉴下快手的一个图【偷下懒】:
我们对该模型结构做适当调整,
1) 只用数据做输入,仅处理一屏数据,且强化了位置信息。【后期发现弱化掉位置效果更好】
2) 用户ID使用一个向量表达,与新闻序列做位运算。【后期发现,不用这么麻烦也可以】
3) 在每个位置做点击与否的二分预测,然后所有位置做softmax,这样不再是每个位置都用全体候选为潜在目标做预测。
调整之后,我们的模型结构如下【懒不可偷】:
再次改进下模型结构如下【完整版,待实验版】:
用户侧:user的长期行为表达【已训练】 + user中期行为表达【已训练】 + user-当前行为向量【待训练】
与当前屏序列做attention,后面结构如上图。
可优化点:attention层,可以继续优化深度和头数;对稀疏的情况下,也可以优化激活函数;对item的表达,可以更丰富,不仅限于用id2emb的表达。
注意事项
注意1:负样本就是屏内没点击的新闻,正样本就是有点击的新闻。
注意2:为了避免正负样本失衡,现对负样本做遮挡采样,以使得负样本量跟正样本量基本持平。
可以用all_mask = tf.bitwise.bitwise_or(pos_mask, neg_mask)来计算当前使用的样本遮挡位。
注意3:训练时以ID数据训练更快,提供服务时则兼容用ID和原始数据做为输入。
代码附录
Reference
Pei C, Zhang Y, Zhang Y, et al. Personalized re-ranking for recommendation[C]//Proceedings of the 13th ACM Conference on Recommender Systems. 2019: 3-11.