• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

深度召回工程实践

Alg admin 4个月前 (04-15) 143次浏览 0个评论 扫描二维码

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

目前主要看了两个算法,一个是谷歌的 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来刻画新物品。

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

其实我也没实践 :cool: 上面列的都是思路

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 :cry:  然后我将其cos 值乘以 20倍做了放大,因为后续都是要交听过sigmoid 算交叉熵,你懂的。

小结

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


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明深度召回工程实践
喜欢 (0)
[@lc@]
分享 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!