推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第1张图片

本文介绍的论文题目是:《Sampling-Bias-Corrected Neural Modeling for Large Corpus Item Recommendations》
论文下载地址是:https://dl.acm.org/citation.cfm?id=3346996

本文是谷歌工业风论文的新作,介绍了在大规模推荐系统中使用双塔模型来做召回的一些经验,值得细细品读。本文仅对文章内容做一个简单介绍,更多细节建议阅读原论文。

1、背景

大规模推荐系统一般分为两阶段,即召回和排序阶段,本文重点关注召回阶段。

给定{用户,上下文,物品}的三元组,一个通用的方法首先是分别计算{用户,上下文} 和 {物品} 的向量表示,然后通过一定的方式如点积来计算二者的匹配得分。这种基于表示学习的方法通常面临两个方面的挑战:

1)工业界中物品的数量十分巨大。
2)通过收集用户反馈得到的数据集十分稀疏,导致模型对于长尾物品的预测具有很大的方差,同时也面临着物品冷启动的问题。

近几年来,随着深度学习的发展,双塔模型常用来用做召回阶段的模型,双塔模型的一般结构如下:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第2张图片

可以看到,双塔模型两侧分别对{用户,上下文} 和 {物品} 进行建模,并在最后一层计算二者的内积。对于每一个正样本,需要随机采样一些负样本,当物品数量十分巨大的时候,上述结构的双塔模型很难得到充分训练。

那么如何对双塔模型进行一定的改进呢?本文主要提出了以下两个要点:通过batch softmax optimization来提升训练效率和通过streaming frequency estimation来修正sampling bias

2、模型介绍

2.1 batch softmax optimization

假设训练集包含T条,物品数量为M:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第3张图片

x包括了用户特征和上下文特征,y则是物品特征,r是对应的label,x和y经过双塔模型得到对应的向量表示,分别记作u(x,θ)和v(y,θ),并通过内积得到二者的相似性得分:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第4张图片

那么给定一个x,从M个物品中选择对应y的概率可以经由下面的softmax方程得到:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第5张图片

损失函数如下:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第6张图片

上述的做法相当于把该样本中的y作为正样本,其余所有的物品当作负样本。但是当M非常巨大时,使用所有的物品来计算softmax方程并不是十分合适。一种通用的做法是通过随机mini-batch的方式来优化损失函数。假设一个包含B条数据的mini-batch,那么对于任意一条数据,softmax计算公式如下:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第7张图片

这种做法相当于把一个batch中此条数据之外物品当作负样本。但是这种做法存在的缺点就是会因为随机采样偏差而导致模型效果不好。对于热门物品来说,由于采样到的概率非常高,当作负样本的次数也会相应变多,热门物品会被“过度惩罚”。因此基于如下的公式对于x和y的评分进行一定程度的修正:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第8张图片

上式中,pj代表第j条样本对应的物品yj被一个mini-batch采样到的概率,这在下一节会详细介绍。

那么此时,softmax计算公式变为:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第9张图片

而batch的损失函数计算如下:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第10张图片

好了,整个的双塔模型训练过程再来回顾一下:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第11张图片

上图中采样概率的预估算法,就是我们下一节要介绍的内容。

2.2 streaming frequency estimation

由于youtube中不断会有新物品出现,那么使用固定长度的词表不太合适,因此采用hash的方式来对物品的采样概率进行更新。

具体来说,假设有一个散列地址大小为H的hash函数h,对物品ID进行映射。同时使用两个长度为H的数组A和B,通过h(y)来得到其在数组A和B中下标。

那么,A[h(y)]记录上一次物品y被采样到的训练时刻,B[h(y)]记录物品y采样的预估频率(这里频率的意思是预估每过多少步可以被采样到一次,那么倒数就是预估被采样到的概率)。当第t步物品y被采样到,基于如下的公式更新B[h(y)]:

而A[h(y)]则被赋予当前的训练步骤t。当训练完成时,预估的物品y的采样概率是1/B[h(y)]。

完整的过程如下:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第12张图片

既然是hash过程,当H

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第13张图片

2.3 Nearest Neighbor Search

当模型训练完成时,物品的embedding是可以保存成词表的,线上应用的时候只需要查找对应的embedding即可。因此线上只需要计算{用户,上下文}一侧的embedding,而基于hash技术(如局部敏感Hash)得到对应的候选集。

2.4 Normalization and Temperature

文中还介绍了双塔模型在使用时两点工业经验。

1)对两侧输出的embedding进行L2标准化,如:

2)对于内积计算的结果,除以一个固定的超参:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第14张图片

除以超参的效果如下,可以看到softmax的效果更加明显:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第15张图片

超参的设定可以通过实验结果的召回率或者精确率进行微调。

3、双塔模型应用于Youtube推荐

双塔模型应用于Youtube视频推荐的框架如下:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第16张图片

训练Label:这里训练集Label并不是点击即为1,未点击为0。而是当一个视频被点击但是观看时长非常短时,label同样是0。当视频被完整看完时,label才是1。

视频侧特征:视频侧包含的特征既有类别特征如视频ID、频道ID,也有连续特征。类别特征中有分为单值类别特征和多值类别特征,对于多值类别特征,采用对embedding加权平均的方式得到最终的embedding。

用户侧特征:用户侧特征主要是基于用户的历史观看记录来捕获用户的兴趣。比如使用用户最近观看过的k个视频的embedding的平均值。对于类别特征,embedding在模型的两侧是共享的。

实时更新:模型基于Tensorflow实现,并且进行了分布式实现。同时,模型会进行天级别更新。

4、实验结果

接下来,看一下几个关键的实验结果。

4.1 频率预估实验

对于实验设置,这里共有M个物品,每个物品的真实出现概率为qi,所有qi的和为1。在前一万步,qi正比于i2,在后一万步,qi正比于(M-1-i)2。如果每次采样B个物品,那么每个物品被采样到的概率为pi=qi * B,并作为label。而预测的概率则是刚才介绍的公式1/B[h(y)],二者通过MAE计算误差。

使用不同的alpha来更新B,结果如下:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第17张图片

可以看到,当alpha越来越小时,随着训练步数的增加,误差是越来越小的。

当使用不同数量的Hash方程时,误差如下:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第18张图片

可以看到,使用更多的Hash方程数量,误差越小。

4.2 Youtube离线&在线实验

在youtube数据集上进行离线训练,结果如下:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第19张图片

上图中,plain-sfx表示不通过概率对采样偏差进行修正,correct-sfx表示修正采样偏差,可以看到修正后效果更为显著。线上结果同样如此:

推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型_第20张图片

5、总结

本文作为一篇工业实战类型的推荐文章,详细介绍了双塔模型在使用时的一些小技巧,一起简单来回顾下:

1)使用batch softmax optimization来训练模型。
2)使用frequency estimation来修正采样偏差,修正方法基于Multiple Hashings。
3)线上应用时使用hash等技术来提高检索效率。
4)对两侧得到的Embedding进行正则化。
5)通过对得到的内积除以一个超参数,使得softmax结果更加明显。

好了,本文就到这里了,大伙一定要去看原论文哟。

你可能感兴趣的:(推荐系统遇上深度学习(七十二)-[谷歌]采样修正的双塔模型)