推荐系统论文阅读(七)-借鉴DSSM构建双塔召回模型
论文原文:
论文题目:《Learning Deep Structured Semantic Models for Web Search using Clickthrough Data》
论文地址:
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/cikm2013_DSSM_fullversion.pdf
一 、背景
DSSM是Deep Structured Semantic Model的缩写,即我们通常说的基于深度网络的语义模型,其核心思想是将query和doc映射到到共同维度的语义空间中,通过最大化query和doc语义向量之间的余弦相似度,从而训练得到隐含语义模型,达到检索的目的。DSSM有很广泛的应用,比如:搜索引擎检索,广告相关性,问答系统,机器翻译等。
先来看看愿论文中的模型:
典型的DNN结构是将原始的文本特征映射为在语义空间上表示的特征。DNN在搜索引擎排序中主要是有下面2个作用:
1.将query中term的高维向量映射为低维语义向量
2.根据语义向量计算query与doc之间的相关性分数
从模型上来看,x是用来表示输入的term向量,y是经过DNN后的输出向量,计算如下:
W,b是模型的参数,f是激活函数,其中f为tahn激活函数:
相似度计算为:
其中, 与是query与doc的语义向量。在搜索引擎中,给定一个query,会返回一些按照相关性分数排序的文档。
可以看到论文中有一个word hashing层,用来解决在实际场景中,词典的大小非常大,如果直接将该数据输入给DNN,神经网络是无法进行训练和预测的问题。
二、推荐广告中的DSSM召回模型
2.1 朴素的双塔模型
在模型训练完毕后,user塔跟item塔各自存储在redis这样的数据库中,线上计算的时候,直接从内存中取到两个向量计算相似度即可。
2.2 百度的双塔模型
“百度的双塔模型分别使用复杂的网络对用户相关的特征和广告相关的特征进行 embedding,分别形成两个独立的塔,在最后的交叉层之前用户特征和广告特征之间没有任何交互。这种方案就是训练时引入更多的特征完成复杂网络离线训练,然后将得到的 user embedding 和 item embedding 存入 Redis 这一类内存数据库中。线上预测时使用 LR、浅层 NN 等轻量级模型或者更方便的相似距离计算方式。这也是业界很多大厂采用的推荐系统的构造方式。”
事实上,不管是前面提到的din还是dien都是隐约的有着双塔模型的影子在,都把user跟item两边的特征分离,构建不同的子塔。
2.3 谷歌的双塔模型
利用双塔模型对 user-item 对的交互关系进行建模,从而学习[用户,上下文]向量和[item]向量的关联。针对大规模流数据,提出 in-batch softmax 损失函数与流数据频率估计方法更好的适应 item 的多种数据分布。
利用双塔模型构建 YouTube 视频推荐系统,对于用户侧的塔根据用户观看视频特征构建 user embedding,对于视频侧的塔根据视频特征构建 video emebdding。
三、DSSM双塔模型实战
用户特征为 user_id , user_age, user_city, user_gender
物品特征为 item_id, item_txt, item_img
3.1 构建embedding层
ps:所有代码均在pytorch下编写
计算特征拼接后的长度:
由于数据集中的txt跟img都是固定长度128的向量,所以直接加128*2=256
3.2 DNN层
这里 hidden_dim = [256, 128, 64],dropout=[0.3, 0.3]
双塔模型中的激活函数一般采用的都是tahn函数,如果用relu激活函数,会导致很多向量都是0。
3.3 输出层
输入的数据x的格式是:每一列代表一个特征,共有batch_size行
3.4 训练
简单的DSSM实战代码到这里就结束啦,本文只是贴了部分核心代码,所有代码等后续放在github上吧
0.o o.0
多谢大家阅读本文,作为一个pytorch小白,还请各位多多指教~。~