深度召回工程实践

4,772次阅读
没有评论

共计 1529 个字符,预计需要花费 4 分钟才能阅读完成。

新业务线上现在有很多种召回策略,在线和离线都有,使用深度召回期望能召回与用户更相关并且感兴趣的物品。这几天页研究了下当前深度召回的常见方法。

目前主要看了两个算法,一个是谷歌的 Youtube DNN 深度召回 ,另外一个是 DSSM 召回。这两个的原理其实都不是太复杂,还是以工程实践且效果综合判断,这篇主要是从工程实践这块谈下自己的理解。

Youtube DNN

首先贴一下当前的算法模型图

深度召回工程实践

 

Youtube 主要是利用用户的观看历史列表以及搜索信息,还有一些用户的基础属性构建模型的输入,上面最后一层FC层的输出当做用户的Embedding 跟物品的Embedding计算相似度达到召回的目的。

原理看图是很简单,在想想如何实践的时候还是有很多点需要斟酌的。

NO 1  观看序列

理论上这是一个不等长的序列,但是模型的输入要求都是要一致的shape,那怎么处理?之前看有些人说大厂的数据不存在这些问题,意思就是大厂的数据足够丰富可以支撑数据源,但是如果支撑不了咋办?

我的一个解决思路就是做Padding ,做了Padding 相当于用户观看了很多相同的一个没有意义的视频(不同的业务可能是商品或者其他),这样直接喂模型还是会存在问题,好像所有的用户都会习惯看这个未知的视频,实际上它并没有任何的意义。

解决的思路是参考了Bert  的 Padding Mask 方案,你构建了padding 之后其实可以通过mask把它遮挡,不让模型看到,这样可以有效的规避当前不等长序列的问题。

NO 2 物品Embedding

自底向上看 其实物品的Embedding 有两个位置都是可以表示 ,这一点其实是Word2vec 的意思,以前就有人讨论word2vec是应该用输入的权重矩阵还是输出的权重矩阵,最后有个大佬分析了其实两者都可以用,没什么太大的毛病,在这里也是这样子。

当然说道这里这个其实也不是最大的毛病,我的问题还是在冷启动这块,训练的永远是历史的,当天新物品怎么处理?没有任何的数据,你可以做hash来实现,但是感觉不太好。去年看EGES论文时的感触就是借助Side information来刻画新物品。

去看看别人有没有类似的实践经验,果然有人通过这种方式来做的:物品的向量直接使用词向量来代替,然后在模型中不学习,后续的新物品也算是有向量表征,这样就解决了新物品冷启动的问题。

其实我也没实践 深度召回工程实践 上面列的都是思路

NO 3 序列问题

论文里面还是强调了 held out 的对比试验,传统的word2vec会用中间的预测两边的,但是论文里不是这么去学习向量的,给出的解释是存在穿越现象,所以遵从了时间序列的方式构建训练样本。

N0 4 向量匹配

数据匹配也就是向量相似度查询,这个还是要依赖一些开源的方案比如 Faiss

NO  5  胡思乱想

哎,看似DNN ,里面的小细节是真的多,example age 到底值不值得用等等,有点烦躁

 

DSSM

套路也是看下DSSM的网络架构,这个网络早起是用户query/doc召回,后来用于推荐等领域

深度召回工程实践

上面的网络也称为双塔网络,左边和右边两个DNN,看起来像两个塔。

这两天我实践的代码也是这个网络,这个输入和输出很简单,要求给用户的特征和物品的特征就好了,数据集构造简单就是成功了80%,真的会极大的简约工程量。

然后像Youtube DNN 网络遇到的一些问题也都不存在了,挺好用的。

在实践中遇到的一个问题就是,计算余弦相似度后,我自己做了 clip 裁剪将相似度限制在 (-1,1)之间,这个直接去喂模型出现测试和训练指标AUC 0.5 深度召回工程实践  然后我将其cos 值乘以 20倍做了放大,因为后续都是要交听过sigmoid 算交叉熵,你懂的。

小结

其他的就到这了,好困,洗个澡,继续去看 Thinking Fast  and slow

正文完
请博主喝杯咖啡吧!
post-qrcode
 
admin
版权声明:本站原创文章,由 admin 2020-04-15发表,共计1529字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码