作者:阿泽
本文是 Google 在 RecSys 2019 上的最新论文,作者采用了目前主流的双塔模型,并基于此设计了一个使用双塔神经网络的建模框架,其中一个塔为 item 塔,编码了 item 大量的内容特征。
这类双塔模型的的优化方法通常是对 mini-batch 进行负采样的方式进行训练,但是这样做会存在问题。比如说,当样本分布出现明显倾斜的时候,潜在的会破坏模型的性能。
为此,作者提出了一种从流数据中评估 item 频率的方法,并通过理论分析和实验结果表明,该算法不需要固定的 item 语料库也能够产生无偏估计,并通过在线更新来适应 item 的分布变化。
随后,作者采用了这种“采样偏差矫正”的方法为 Youtube 建立了一个基于神经网络的大型检索系统,该系统用于从那个包含数千万个视频的语料库中提供个性化服务。
最后在两个真实数据集和 A/B 测试中进行测试,证明了“采样偏差矫正”的有效性。
给定 {user、context、item} 三元组,构建一个可扩展的检索模型通常分为一下两个步骤:
然而,上下文通常是动态的,所以这种方法会遇到两方面的挑战:
所以,系统更需要适应数据的分布变化,从而才能获得更好的表现。
随着深度学习在诸多领域的成功应用,本文将探讨双塔 DNN 在构建检索模型中的应用,下图为双塔模型:
其中,左塔和右塔分别对 {user、context} 和 {item} 进行编码。
MLP 模型通常可以采用从 item 的固定语料库中通过负采样得到训练,但由于双塔模型体系是同时对 item 的结构和内容特进行建模的,两者共享网络参数,所以无法通过类似的方式进行采样训练。
为此,作者提出 batch softmax 的优化方法,item 采样概率会考虑随机批次中的所有 item。但是在实验过程中,作者发现 batch softmax 存在抽样偏差,如果不进行矫正则会影响模型性能(Bengio 指出采样分布应该与模型输出分布相似)。受到 MLP 中重要性采用来减少偏差的工作启发,作者通过估计 item 的频率来纠正 batch softmax 的抽样偏差。但与 MLP 模型中输入固定语料库不同的是,作者针对流数据来评估语料库分布情况。
最后,作者将这种偏差矫正技术应用到 Youtube 的个性化检索系统中,并取得了不错的成绩。
为此,本文的贡献主要有以下几点:
首先,我们的模型目标是对于所给的 query 检索得到 item 的一个子集。我们的目标是构建一个具有两个参数话 Embedding 的函数
,可以将 Query 和候选的 Item 映射到一个 k 维 Embedding 空间中。正如上面的那个双塔模型所示,然后通过内积来求得两个 Embedding 的相似度:
其中,
为模型的参数。
所以我们的目标是通过训练集 T 来更新这个参数,训练集表示为:
其中,
表示 query 和 item 的 pair,
表示该 pair 的权值。
此时这个问题可以被认为是一个多分类问题,给定一个用户 x,从 M 个候选 items 中选择要推荐的 item,多分类 softmax 函数定义为:
其中,
是之前计算的相似度。
损失函数为对数似然函数:
当样本量 M 过大时,计算所有候选样本时非常低效的。一个很常用的方法就是对样本集合 M 进行采样得到子集。但作者是对流数据进行采样,会产生偏差,不会像 MLP 那样可以针对一个固定的数据集进行负采样。只能对 in-batch 的 items 进行负采样。给定一个 mini-batch B,其 softmax 表示为:
in-batch 中的 item 通常是从目标应用中幂律分布中采样得到的。因此上面的公式计算出来的 softmax 是有偏差的(因为频率高的 item 被经常作为负样本,从而过度惩罚导致了偏差)。为此作者通过引入 logit 函数来进行采样修正:
其中,
表示一个从随机的 batch 中采样得到 item j 的概率。后面会对此进行极少。
有了这个修正后,我们后:
带入损失函数后得到:
我们可以用 SGD 进行优化,算法伪代码如下:
给定 Embedding 函数后,我们会用最近邻进行搜索,其中包括两个步骤:首先是利用 Embedding 函数查询 Embedding,然后对该 Embedding 进行最近邻搜索。但是在作者的框架中通常是需要低延迟的,所以其材采用基于哈希技术的高效相似度搜索系统,而不是计算所有 item 之间的点积,从而解决近似最大内积搜索问题(MIPS)。
作者发现通过对向量进行归一化也可以改善模型训练;另外,加上一个超参
可以调节预测准确率:
这一节主要介绍
如何从随机的 batch 中采样得到 item j 的概率。
由于无法使用固定的语料库,所以作者使用散列阵来记录流 id 的采样信息(不过要注意这里可能会引起哈希冲突)。
作者提出的采样概率修正算法,其核心思想在于通过采样频率来估计采样概率,如某 item 的采样频率为 p,则其采样概率为 1/p。在流式计算中,作者会记录两个信息,一个是 item y 的上一次采样时间
,另一个是 item y 的概率估计
,我们会用 A 来协助更新 B:
伪代码如下:
刚刚提到哈希冲突,所以作者也给出了改进算法:
Youtube 神经检索模型由查询网络和候选网络组成,任何时刻系统都能捕捉到用户当前感兴趣的点,其模型体系结构如下图所示:
作者利用了大量的视频和用户观察历史来训练模型:
Youtube 每天都会生成新的训练数据集,其也会以天为单位对模型进行更新,这样模型便能更新最新的数据分布变化。
检索系统的的 index pipeline 定期创建了一个 SaveModel 用于在线服务:
index pipeline 包括三个阶段:
简单看一下实验。
首先是不同
参数下的准确率:
不同数量的 hash 方程的表现情况:
5M 语料库下的离线实验:
10M 语料库下的离线实验:
线上 A/B 测试:
本文 Youtube 工业实战类型的推荐论文,主要介绍了搭建基于双塔模型搭建的神经检索系统的一些 Trick,包括流失数据处理中的采样偏差纠正,利用哈希加快检索效率,归一化提高准确率,加入超参
来微调召回率和精确率。总的来说,还是一篇比较值得细品的论文。