共计 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