接着上一篇文章《MIND多兴趣召回实战(一)》,今天想继续和大家聊聊我们在实战中对于MIND模型的改进优化。
loss优化
虽然我们已经调整过routing_logits的初始化方差(上篇文章有详细说明),但是通过观察打印出来的用户多维兴趣向量,我们还是发现各个向量之间差异度不是很大。于是我们对线上结果进行统计分析,最终发现多个兴趣向量召回回来的结果有40%左右的重复率。因此我们考虑将多兴趣向量间的欧式距离之和加入到loss中,让模型显示学习不同维度兴趣向量之间的差异性。
distance = tf.sqrt(tf.reduce_mean(INTEREST_NUMS * tf.reduce_sum(tf.reduce_sum(tf.pow(user_multi_embedding, 2), axis=1), axis=-1)
-tf.reduce_sum(tf.pow(tf.reduce_sum(user_multi_embedding, axis=1), 2), axis=-1)))
loss = cross_entropy_loss - lamb * distance
其中,cross_entropy_loss是交叉熵的loss,lamb是个超参数。
在对loss进行优化之后,我们的实验结果表明,相对于base版本的模型,实验组模型召回出来的商品的重复率从40%多降到33%左右,ctr,cvr等指标也有较明显的提升。
序列侧优化
MIND召回使用用户行为和用户画像特征来生成用户的多兴趣向量。现实的场景中,用户的画像特征基本上变动不大,用户的正向行为也相对比较稀疏,这样容易造成每次给用户召回的商品的变化不是很大。而用户的负向行为(比如点击不感兴趣的序列和在商详页停留很短的序列)相对来说就会丰富很多,因此,对用户的负向行为建模就很有必要了。
最初我们尝试了两种负向行为建模的方式:
(1).直接将负向序列特征加入到现有模型中去
(2).将负向序列特征单独作为一个模块对应的loss为neg_logit,最终整体的loss用pos_logit-neg_logit来计算。
这两种方法最终的表现都不是特别理想,分析下来,可能是neg样本中未必都是“纯”neg的item,因此对模型的学习产生了一定的干扰。后续我们借鉴了阿里SDM深度召回中融合长短期兴趣的方法,将用户的正向序列和负向序列各自建模一个塔,分别生成用户的正向embedding和负向embedding,对这两个embedding再以其本身生成一个gate,然后用gate将两者加权融合之后生成最终的用户兴趣向量。
。。。。。。
后续内容详见:
MIND多兴趣召回实战(二)
本文主要给大家详细介绍了MIND的基本原理和我们的相关实战经验。另外还有一些对于MIND模型的改进优化会在下一篇文章中继续为大家介绍,希望大家能持续关注。
欢迎大家关注微信公众号:计算广告那些事儿,除了原创文章之外,也会不定期和大家分享业内大牛的文章哈!也欢迎大家加入我的知识星球哈!最近知识星球正在推出新服务:免费提供一对一模拟面试指导,有需要的同学可以重点关注下哈!