MIND多兴趣召回实战(二)

接着上一篇文章《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模型的改进优化会在下一篇文章中继续为大家介绍,希望大家能持续关注。

欢迎大家关注微信公众号:计算广告那些事儿,除了原创文章之外,也会不定期和大家分享业内大牛的文章哈!也欢迎大家加入我的知识星球哈!最近知识星球正在推出新服务:免费提供一对一模拟面试指导,有需要的同学可以重点关注下哈!
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值