Netflix团队发了篇paper《Is Cosine-Similarity of Embeddings Really About Similarity?》,对cosine相似度做了相应的研究。

摘要

余弦相似度(cosine similarity)是指两个向量间夹角的余弦值,或者等价于:归一化后的点积。一种常见的应用是:通过将余弦相似度应用于学习到的低维特征embedding,来量化高维对象之间的语义相似性。这种方法在实践中可能比未归一化的嵌入向量之间的点积效果更好,但也可能更差。为了深入了解这一经验观察,我们研究了从正则化线性模型派生的embedding,其中闭式解有助于分析洞察。我们从理论上推导了余弦相似度如何产生任意且因此无意义的“相似性”。对于某些线性模型,相似性甚至不是唯一的,而对于其他模型,它们则由正则化隐式控制。我们讨论了超出线性模型的含义:在学习深度模型时采用了不同正则化的组合;当对结果embedding取余弦相似度时,这些正则化具有隐式和非预期的影响,使结果变得不透明且可能是任意的。基于这些见解,我们警告:不要盲目使用cosine相似度,并概述了替代方案。

1.引言

离散实体通常通过学习的映射嵌入到各种领域的稠密实值向量(dense real-valued vector)中。例如,在大语言模型(LLM)中,单词基于其周围上下文进行嵌入,而推荐系统通常根据用户消费的方式学习item(和user)的embedding。这样的embedding有多方面的优点。特别是,它们可以直接作为(冻结或微调的)输入用于其它模型,它们提供了一种数据驱动的(语义)相似性概念,用来表示之前是原子和离散的实体。

虽然“余弦相似度(cosine similarity)”中的相似性指的是:与距离度量中的较大值表示更接近(较小值则相反),但它也已成为衡量感兴趣实体之间语义相似性的非常流行的度量方法。其动机在于,学习到的embedding vector的范数并不如embedding vector间的方向对齐那么重要。尽管有无数的论文报告了余弦相似度在实际应用中的成功使用,但也有人发现它在某些情况下不如其它方法,例如学习embedding间的(未归一化的)点积,参见[3, 4, 8]

在本文中,我们尝试阐明这些不一致的经验观察。我们发现,学习到的embedding余弦相似度实际上可以产生任意结果。我们发现,根本原因不在于余弦相似度本身,而在于学习到的embedding具有一定程度自由度,即使它们的(未归一化的)点积是明确定义且唯一,也可以产生任意的余弦相似度。为了获得更具一般性的见解,我们推导出解析解,这对于线性矩阵分解(MF)模型是可能的——这将在下一节详细概述。在第3节中,我们提出了可能的解决方案。第4节中的实验说明了我们在本文中得出的发现。

2.矩阵分解模型

在本文中,我们关注线性模型,因为它们允许闭式解(closed-form solutions),从而可以从理论上理解应用于学习embedding的余弦相似度度量的局限性。给定:

  • 一个矩阵$X \in R^{n × p}$
  • 包含n个数据点和p个特征(例如,在推荐系统中分别是user和item)

矩阵分解(MF)模型(或等效地在线性自编码器中)的目标是:估计一个低秩矩阵$AB^T \in R^{p×p}$

其中:

  • $A, B \in R^{p×k}, k \leq p$

使得乘积$XAB^⊤$是${X:}^1 X \approx XAB^⊤$的好的近似。

给定:

  • X是一个user-item矩阵
  • B的行:$\overset{\rightarrow}{b_i}$,通常被称为k维的item embedding
  • XA的行:$\overset{\rightarrow}{x_u} \cdot A$,可以解释为user embeddings,其中用户u的embedding是该用户消费的item embeddings $\overset{\rightarrow}{a_j}$的总和。

请注意,该模型是根据user和item embeddings之间的(未归一化的)点积定义的:

\[(XAB^T)_{u,i} = < \overset{\rightarrow}{x_u} \cdot A, \overset{\rightarrow}{b_i} >\]

然而,一旦学习了embedd,常见的做法是:考虑它们之间的余弦相似度,例如:

  • 两个item间:$cosSim(\overset{\rightarrow}{b_i}, \overset{\rightarrow}{b’_i})$
  • 两个user间:$cosSim(\overset{\rightarrow}{x_u} \cdot A, \overset{\rightarrow}{x_u’} \cdot A)$
  • user与item间:$cosSim(\overset{\rightarrow}{x_u} \cdot A, \overset{\rightarrow}{b_i})$

在下文中,我们将展示这可能导致任意结果,并且它们甚至可能不是唯一的。

2.1 训练

影响余弦相似度metric的实效(utility)的一个关键因素是:当在学习A、B的embedding时使用的正则化方法,如下所述。

考虑以下两种常用的正则化方案(它们都有封闭形式的解,见第2.2节和第2.3节):

\[\underset{A,B}{min} ||X − XAB^⊤||^2_F + λ||AB^⊤||^2_F \\ \underset{A,B}{min} ||X − XAB^⊤||^2_F + λ(||XA||^2_F + ||B||^2_F )\]

… (1) (2)

这两个训练目标在L2范数正则化方面显然有所不同:

在第一个目标中,$|AB^⊤|^2_F$ 应用于它们的乘积。在线性模型中,这种L2范数正则化可以证明等同于:使用去噪学习,即在输入层进行dropout,例如,见[6]。 此外,实验发现,在保留的测试数据上得到的预测准确率优于第二个目标的准确率[2]。 不仅在MF模型中,而且在深度学习中,通常观察到去噪或dropout(这个目标)比权重衰减(第二个目标)在保留的测试数据上带来更好的结果。

第二个目标等价于:常规的矩阵分解目标:

\[{min}_W \| X − P Q^T \|^2_F + λ(\|P\|^2_F + \|Q\|^2_F)\]

其中:

  • X被分解为$P Q^⊤$,且P = XA和Q = B。

这种等价性在 [2]中有所概述。这里的关键是,每个矩阵P和Q分别进行正则化,类似于深度学习中的权重衰减。

  • $\widehat{A}$和$\widehat{B}$:是任一目标的解(solution)
  • $R \in R^{k×k}$:任意旋转矩阵

那么众所周知,具有任意旋转矩阵$R \in R^{k×k}$ 的$\widehat{A}R$和$\widehat{B}R$也是解(solution),因为余弦相似度在这种旋转R下是不变的,本文的一个关键见解是:

  • 第一个(但不是第二个)目标对于A和B的列(即嵌入的不同潜在维度)的重缩放也是不变的:如果$\widehat{A} \widehat{B}^⊤$是第一目标的解,那么$\widehat{A}DD^−1 \widehat{B}^⊤$也是,其中D ∈ R k×k 是任意对角矩阵。

因此,我们可以定义一个新的解决方案(作为D的函数)如下:

\[\widehat{A}^{(D)} := \widehat{A}D \\ \widehat{B}^{(D)} := \widehat{B}D^{−1}\]

…(3)

反过来,这个对角矩阵D会影响学习到的user和item embedding(即:行)的归一化:

\[(X\widehat{A}^{(D)})_{(normalized)} = Ω_AX\widehat{A}^{(D)} = Ω_AX\widehat{A}D \\ \widehat{B}^{(D)}_{(normalized)} = Ω_BBˆ(D) = ΩBBDˆ −1,(4)\]

其中$Ω_A$和$Ω_B$是适当的对角矩阵,用于将每个学习到的嵌入(行)归一化为单位欧几里得范数。注意,一般来说这些矩阵不可交换,因此不同的D选择不能(精确地)通过归一化矩阵$Ω_A$和$Ω_B$来补偿。由于它们依赖于D,我们通过$Ω_A(D)$和$Ω_B(D)$明确表示这一点。因此,嵌入的余弦相似性也取决于这个任意矩阵D。

当人们考虑两个项目之间、两个用户之间或用户和项目之间的余弦相似性时,这三种组合分别为:

  • item-item:
\[cosSim(\widehat{B}^(D), \widehat{B}^(D)) = Ω_B(D) \cdot \widehat{B} \cdot D^{−2} \cdot \widehat{B}^T \cdot Ω_B(D)\]
  • user-user:
\[cosSim(X\widehat{A}^(D), X\widehat{A}^(D)) = Ω_A(D) \cdot X\widehat{A}^ \cdot D^2 \cdot (X\widehat{A})^T \cdot Ω_A(D)\]
  • user-item:
\[cosSim(X\widehat{A}^(D), \widehat{B}^(D)) = Ω_A(D) \cdot X\widehat{A} \cdot \widehat{B}^T \cdot Ω_B(D)\]

显然,所有三种组合的余弦相似性都取决于任意对角矩阵D:虽然它们都间接依赖于D,因为它影响了归一化矩阵$Ω_A(D)$和$Ω_B(D)$,但请注意,(特别受欢迎的)item-item余弦相似性(第一行)还直接依赖于D(user-user余弦相似性也是如此,见第二项)。

2.2 First Objective (Eq. 1)详述

当我们考虑全秩MF模型的特殊情况,即k = p时,余弦相似性的任意性在这里变得尤为明显。这可以通过以下两种情况来说明:

第一种:

如果我们选择: \(D = dMat(..., 1/(1+λ/σ^2)^i, ...)^(1/2)\)

那么我们有: \(\widehat{A}_{(1)}^{(D)} = \widehat{A}_{(1)} \cdot D \\ = V · dMat(\cdots, \frac{1}{(1+λ/\sigma_i^2)}, \cdots)\)

\[\widehat{B}_{(1)}^{(D)} = \widehat{B}_{(1)} \cdot D^{-1} = V\]

由于奇异向量矩阵V已经是标准化的(关于列和行),归一化$Ω_B = I$因此等于单位矩阵I。因此,关于item-item余弦相似性,我们得到:

\[cosSim(\widehat{B}_{(1)}^{(D)}, \widehat{B}_{(1)}^{(D)}) = V V^T = I\]

这是一个相当奇怪的结果,因为这意味着任何一对(不同的)项目嵌入之间的余弦相似性为零,即一个item只与自己相似,而不与任何其他item相似!

另一个显著的结果是关于user-item余弦相似性:

\[cosSim(X \widehat{A}_{(1)}^{(D)}, \widehat{B}_{(1)}^{(D)}) = Ω_A \cdot X \cdot V \cdot dMat(\cdots, \frac{1}{1 + λ/\sigma_i^2}, \cdots) · V^T \\ = Ω_A · X · \widehat{A}_{(1)}\widehat{B}_{(1)}^T\]

因为与(未归一化的)点积相比,唯一的区别在于矩阵$Ω_A$,它归一化了行——因此,当我们考虑基于预测分数为给定用户对项目进行排序时,余弦相似性和(未归一化的)点积会导致完全相同的项目的排序,因为在这种情况下行归一化只是一个无关紧要的常数。

第2种:

  • 如果我们选择:
\[D = dMat(\cdots, \frac{1}{(1+λ/σ_i^2)}, \cdots)^{-\frac{1}{2}}\]

那么我们类似于前一种情况有:

\[\widehat{B}_{(1)}^{(D)} = V \cdot dMat(\cdots, \frac{1}{1+λ/σ_i^2}, \cdots)\]

并且$\widehat{A}_{(1)}^{(D)} = V$是正交的。我们现在得到关于user-user余弦相似性:

\[cosSim(X \widehat{A}_{(1)}^{(D)}, X\widehat{A}_{(1)}^{(D)}) = Ω_A · X · X^T · Ω_A\]

即,现在用户相似性仅仅基于原始数据矩阵X,即没有任何由于学习到的嵌入而产生的平滑。关于user-item余弦相似性,我们现在得到:

\[cosSim(X\widehat{A}_{(1)}^{(D)}, \widehat{B}_{(1)}^{(D)}) = Ω_A \cdot X \cdot \widehat{A}_{(1)} \cdot \widehat{B}_{(1)}^T \cdot Ω_B\]

即,现在$Ω_B$归一化了B的行,这是我们在之前选择D时所没有的。同样,item-item余弦相似性

\[cosSim(\widehat{B}_{(1)}^{(D)}, B_{(1)}^{(D)}) = Ω_B · V · dMat(\cdots, \frac{1}{1 + λ/σ_i^2}, \cdots)^2 \cdot V^T \cdot Ω_B\]

与我们之前在D的选择中得到的奇怪结果大不相同。

总的来说,这两种情况表明,对于D的不同选择会导致不同的余弦相似性,即使学习到的模型

\[\widehat{A}_{(1)}^{(D)} \widehat{B}_{(1)}^{(D)T} = \widehat{A}_{(1)} \widehat{B}_{(1)}^T\]

对于D是不变的。换句话说,余弦相似性的结果是任意的,对这个模型来说并不是唯一的。

2.3 关于第二个目标

(公式2)的细节

公式2中的训练目标的解决方案在[7]中推导出来,读作

\[\widehat{A}_{(2)} = V_k \cdot dMat(\cdots, \sqrt{\frac{1}{σ_i} \cdot (1 - λ/σ_i)+}, \cdots)_k \\ \widehat{B}_{(2)} = V_k \cdot dMat(\cdots, \sqrt{σ_i \cdot (1 - λ/σ_i)+}, \cdots)_k\]

… (6)

其中:

  • $(y)+ = max(0, y)$
  • $X =: U \Sigma V^T$: 是训练数据X的SVD
  • $\Sigma = dMat(\cdots, σ_i, \cdots)$

注意,如果我们使用MF中常用的符号,其中:$P = XA$和$Q = B$,我们得到:

\[\widehat{P} = X\widehat{A}_{(2)} = U_k \cdot dMat(\cdots, \sqrt{σ_i \cdot (1 - \frac{λ}{σ_i})+}, \cdots)_k\]

在这里我们可以看到,在公式6中,对角矩阵:

\[dMat(..., \sqrt{σ_i \cdot (1 - \frac{λ}{σ_i})+}, \cdots)_k\]

对于user embedding和item embedding是相同的,这是由于在公式2的训练目标中的L2范数正则化 $|P|_F + |Q|_F$的对称性所预期的。

与第一个训练目标(见公式1)的关键区别在于,这里的L2范数正则化$|P|_F + |Q|_F$是分别应用于每个矩阵的,因此这个解决方案是唯一的(如上所述,直到不相关的旋转),即在这种情况没有办法将任意的对角矩阵D引入到第二个目标的解决方案中。因此,应用于这个MF变体的学习嵌入的余弦相似性产生唯一的结果。

虽然这个解决方案是唯一的,但它仍然是一个悬而未决的问题,这个关于用户和项目嵌入的唯一对角矩阵 $dMat(\cdots, \sqrt{σ_i \cdot (1 - λ/σ_i)+}, \cdots)_k$是否在实践中产生最佳可能的语义相似性。然而,如果我们相信这种正则化使得余弦相似性在语义相似性方面有用,我们可以比较两个变体中对角矩阵的形式,即比较公式6和公式5,这表明在第一个变体中任意的对角矩阵D(见上面的部分)类似地可以选择为: $D = dMat(…, p1/σi, …)k$

3.针对余弦相似性的补救措施和替代方法

正如我们上面分析的那样,当一个模型针对点积进行训练时,其对余弦相似性的影响可能是模糊的,有时甚至不是唯一的。一个显而易见的解决方案是针对余弦相似性训练模型,层归一化[1]可能会有所帮助。另一种方法是避免使用导致上述问题的嵌入空间,并将其投影回原始空间,然后在那里应用余弦相似性。例如,使用上述模型,并给定原始数据X,可以将$X\widehat{A}\widehat{B}^T$视为其平滑版本,将$X\widehat{A}\widehat{B}^T$的行视为原始空间中的user embedding,然后可以应用余弦相似性。

除此之外,同样重要的是要注意,在余弦相似性中,只有在学习了嵌入之后才应用归一化。与在学习之前或期间应用某种归一化或减少流行度偏差相比,这可能会显著降低结果的(语义)相似性。这可以通过几种方式完成。例如,统计学中的一种默认方法是标准化数据X(使每列均值为零且方差为单位)。深度学习中的常见方法包括使用负采样或逆倾向缩放(IPS)来考虑不同项目的流行度(和用户活动水平)。例如,在word2vec [5]中,通过按照它们在训练数据中的频率(流行度)的β = 3/4次幂的概率采样负样本,训练了一个矩阵分解模型,这在当时产生了令人印象深刻的词相似性。

https://arxiv.org/pdf/2403.05440v1.pdf

meta在《AdaTT: Adaptive Task-to-Task Fusion Network for Multitask Learning in Recommendations》提出了AdaTT的多任务建模方法。

摘要

多任务学习(MTL)旨在通过同时在多个任务上训练机器学习模型来提高它们的性能和效率。然而,MTL研究面临两个挑战:

  • 1)有效地建模任务之间的关系以便实现知识共享,
  • 2)共同学习任务特定(task-specific)知识和共享知识

本文提出了一种名为自适应任务融合网络(AdaTT:Adaptive Task-to-Task Fusion Network)的新模型,以解决这两个挑战。AdaTT是一个深度融合网络,具有多个levels上的专有任务单元(task-specific unit)和可选共享融合单元。通过利用一个残差机制(residual)和一个门控机制(gating)来进行任务间融合(task-to-task fusion),这些单元可以自适应地同时学习共享知识和专有任务知识。为了评估AdaTT的性能,我们使用各种任务组在公共基准和工业推荐数据集上进行实验。结果表明,AdaTT明显优于现有的最先进基线。此外,我们的端到端实验表明,与替代方案相比,该模型表现更好。

1.引言

在线推荐系统旨在为用户生成个性化的高质量推荐。这些系统的有效性通常取决于它们准确学习用户偏好的能力,这通常需要同时优化多个目标。例如,一个短视频推荐系统应该考虑用户观看视频(watch)的可能性(likelihood)和他们喜欢视频(like)的可能性(likelihood)。多任务学习(MTL)是这些用例的典型解决方案。通过在单个框架内联合训练多个任务,MTL提供了几个好处:

  • 首先,它增加了计算效率,这对于大规模在线推荐系统非常重要
  • 此外,它通过跨任务正则化(cross-task regularization)知识共享(knowledge sharing),增强了模型表现

然而,MTL也面临着独特的挑战。其中一个主要挑战是建模任务之间的关系。由于每个任务可能与其他任务具有不同程度的相关性,仅仅建模所有任务的一般共性是不够的。这个问题的复杂性随着任务数量的增加而增加。有效的任务关系建模是实现任务自适应知识共享(task-adaptive knowledge sharing)的关键。例如,“分享视频(share)”任务共享的知识可以在类似于“喜欢视频(like)”的任务中得到很大的权重,同时也可以从具有丰富示例的其它任务中吸取不同方面的知识,例如“观看视频(watch)”。另一方面,它会最小化与高度不相关的任务的共享学习(shared learning)。

  • 先前的工作[2、19]通常采用静态共享表示(static shared representations)
  • 其他工作,如cross-stitch network[24](如图2(c)所示),学习矩阵来建模多个子网络之间的关系。然而,权重对于所有样本保持不变,子网络只是松散的特定任务。
  • 最近的方法,如MMoE[22](如图2(b)所示)和PLE[29](如图2(e)所示),使用专门的门控网络(gating networks)来动态组合共享的子模块以实现灵活的共享,但是这些方法建模的任务之间的关系是模糊和间接的。

图片名称

图2 我们实验中使用的MTL模型。在多级MTL模型中,使用两个融合level来说明它们的设计。模块用不同的颜色表示:共享模块为蓝色,任务A特定模块为黄色,任务B特定模块为紫色

除了共享学习,专有任务学习(task-specific learning)也是多任务学习的一个重要组成部分。在两者之间取得适当的平衡对于解决任务冲突(task conflicts)和实现跨任务正则化(cross-task regularization)非常重要。

  • 一方面,MTL可能会遇到,负迁移(negative transfer)的问题:其中对一个任务的优化会对另一个任务的性能产生负面影响,特别是当任务具有冲突的目标时。在这种情况下,MTL模型应该自适应地强调专有任务学习。
  • 另一方面,专有任务学习过度和共享不足可能会导致过拟合,降低跨任务正则化的效益。每个任务的训练数据的数量和分布也会影响学习的重点:具有更多数据的任务可以更多地依赖于它们的专有学习,而那些具有较少数据或高度倾斜数据的任务可以更多地集中于共享学习

考虑到样本之间的差异可以使两者之间的权衡更加动态。因此,自动学习平衡这两种类型的学习非常重要。许多软参数共享模型(soft parameter sharing)可以在不需要繁琐的手动调整[2]或学习所有样本的静态结构。然而,进一步的研究是 需要理解:如何建模在共享任务学习与专有任务学习间的交互,以便提升效果。

3.模型结构

为了共同学习自适应共享表示并增强专有任务学习,我们提出了一个新模型:自适应任务融合网络(AdaTT)。AdaTT利用门控和残差机制来自适应地融合多个融合层中的专家(experts)。考虑一个具有两个预测任务的多任务学习场景。我们使用两个融合层在图1中说明了AdaTT的架构。AdaTT由多层融合网络(multi-level fusion network)任务塔(task towers)组成。融合网络(fusion networks)由任务特定和可选共享融合单元构成,而任务塔建立在融合网络之上,并与最终融合层中的任务特定单元相连。我们的框架是通用的,支持灵活选择专家模块、任务塔网络、门控模块和可配置数量的专家和融合层。 在接下来的章节中,我们首先介绍AdaTT的一个特殊case:称为AdaTT-sp,它仅使用任务特定融合单元(如图1(a)所示)。然后,我们将描述通用的AdaTT设计,如图1(b)所示。

图片名称

图1 AdaTT-sp和具有2个fusion levels的通用AdaTT。任务A和B的特定和共享模块通过颜色区分:A为黄色,B为紫色,共享为蓝色。为了说明,我们为每个任务特定单元使用了2个专家。在通用AdaTT中,我们添加了一个共享融合单元,其中只有一个专家作为示例。请注意,通用AdaTT中的共享模块并不是必需的,因此使用虚线表示。当不存在共享模块时,通用AdaTT会回退到AdaTT-sp。

3.1 AdaTT-sp

AdaTT-sp的详细设计如下所示。给定输入𝑥用于𝑇个任务,任务𝑡(𝑡=1,2,…,𝑇)的预测被公式化为:

\[y_t=h_t(𝑓_𝑡^L(𝑥))\]

…(1)

其中:

  • L:是融合层数量
  • $h_t$:表示任务𝑡的任务塔
  • $𝑓_t^L$:表示在第𝐿个融合层产生任务𝑡的融合单元的函数

这里,$𝑓_𝑡^L(𝑥)$通过使用等式(2)和(3),从底部到顶部应用融合层来计算:

\[𝑓_1^0(𝑥)=𝑓_2^0(𝑥)=\cdots=𝑓_T^0(𝑥)=𝑥\]

…(2)

\[𝑓_𝑡^l(𝑥)=𝐹𝑈_𝑡^l(𝑓_1^{(𝑙−1)}(𝑥), 𝑓_2^{𝑙−1}(𝑥), \cdots, 𝑓_𝑇^{l-1}(𝑥)), 𝑙=1 \cdots L\]

…(3)

这里,FU表示融合单元。

3.1.1 融合单元(fusion unit)

下面我们详细介绍引入等式(3)中的$𝐹𝑈_𝑡^l$的构造。对于任务𝑡,在接收到前一个融合层(fusion level)的所有输出后,我们首先会使用函数$e_{𝑡,𝑖}^l$,和输入$𝑓_t^{l-1}(𝑥)$,来为该任务构造$𝑚_𝑡$个本地专家(naive experts),表示为$𝐸_{𝑡,𝑖}^l$,即:

\[𝐸_{𝑡,𝑖}^l=e_{𝑡,𝑖}^l(f_𝑡^{l-1}(𝑥))\]

…(4)

其中:

  • $i=1,2,\cdots,𝑚_t$
  • $𝐸_{𝑡,𝑖}^l \in R^{1×𝑑^𝑙}$

在第𝑙层,每个专家网络(expert network)会产生长度为$𝑑^𝑙$的向量。为了简化表示,在第𝑙层,我们使用:

  • $𝐸_𝑡^l$:表示属于任务𝑡的experts的所有垂直拼接(vertical concatenation)
  • $𝐸^𝑙$:表示跨任务的所有experts的所有垂直拼接

具体而言,$𝐸_𝑡^l$ 和$𝐸^𝑙$表示为:

\[𝐸_𝑡^l=[𝐸_{𝑡,1}^l, 𝐸_{𝑡,2}^l,\cdots,𝐸_{𝑡,𝑚_t}^l]\]

…(5)

\[𝐸^𝑙=[𝐸_1^l,𝐸_2^l, \cdots, 𝐸_𝑇^l]\]

…(6)

其中:

  • $𝐸_𝑡^l \in R^{𝑚_t \times 𝑑^𝑙}$
  • $𝐸^𝑙 \in R^{(𝑚_1+𝑚_2+…+𝑚_𝑇)×𝑑^𝑙}$

在上述等式中:

  • $[,]$:表示将向量或子矩阵垂直堆叠成较大矩阵的操作。

由于任务可能与其他任务具有不同的相关性,$𝐹𝑈_𝑡^l$直接使用门控模块$𝐴𝑙𝑙𝐸𝑥𝑝𝑒𝑟𝑡𝐺𝐹_𝑡^l$来结合所有任务的专家$𝐸^𝑙$来模拟任务间的知识融合。此外,我们利用轻量级线性组合$𝑁𝑎𝑡𝑖𝑣𝑒𝐸𝑥𝑝𝑒𝑟𝑡𝐿𝐹_𝑡^l$来融合任务𝑡的本地专家,即$𝐸_𝑡^l$。概念上,门控模块模拟共享学习,本地专家的线性组合模拟专有任务学习。具体而言,任务𝑡在第𝑙层的特定单元的输出被公式化为:

\[𝑓_𝑡^l(𝑥) = AllExpertGF_𝑡^l(𝐸^𝑙, 𝐺_𝑡^l) + NativeExpertLF_t^l(𝐸_𝑡^l)\]

…(7)

在公式7中,专家被融合如下:

\[𝑁𝑎𝑡𝑖𝑣𝑒𝐸𝑥𝑝𝑒𝑟𝑡𝐿𝐹_t^l(𝐸_𝑡^l)=(𝑣_𝑡^l)^T 𝐸^{𝑡^l}\]

…(8)

其中:

  • 在𝐴𝑙𝑙𝐸𝑥𝑝𝑒𝑟𝑡𝐺𝐹中,$𝐸^𝑙$ 乘以由一个函数$𝑔_𝑡^l$生成的门控权重$𝐺_𝑡^l \in R^{(𝑚_1+𝑚_2+\cdots+𝑚_𝑇)\times 1}$
  • 在𝑁𝑎𝑡𝑖𝑣𝑒𝐸𝑥𝑝𝑒𝑟𝑡𝐿𝐹中,相似的,$𝐸_𝑡^l$仅由一个可学习的向量$v_𝑡^l \in R^{𝑚_𝑡 \times 1}$组合在一起

当$𝑚_1=𝑚_2=\cdots=𝑚_𝑇=1$时,即所有融合单元仅有一个专家时,为了简化起见,$𝑁𝑎𝑡𝑖𝑣𝑒𝐸𝑥𝑝𝑒𝑟𝑡 𝐿𝐹_𝑡^l(𝐸_t^l)$回退到$𝐸_𝑡^l$,将一个单位权重分配给本地专家。有许多设计选项可用于$𝑔_𝑡^l$。常见的一种是使用由softmax激活的单层MLP:

\[𝑔_𝑡^l(𝑓_𝑡^{𝑙−1}(𝑥))=𝑠𝑜𝑓𝑡𝑚𝑎𝑥(𝑊_𝑡^l 𝑓_𝑡^{𝑙−1}(𝑥)^T)\]

…(10)

这里:

  • $𝑊_𝑡^l \in R^{(𝑚_1+𝑚_2+\cdots+𝑚_𝑇)} × 𝑑^{𝑙−1}$是一个学习的矩阵。

3.1.2 简化

为了实现效率,考虑到公式8和公式9,我们实际上可以用零填充$(𝑣_𝑡^l)^T$以匹配$(𝐺_t^l)^T$的大小,加权并执行单个乘法来组合所有专家。因此,公式7可以简化为:

\[𝑓_𝑡^l(𝑥)=(𝑝𝑎𝑑(𝑣_𝑡^{lT} )+𝐺_𝑡^{lT}) 𝐸^𝑙\]

… (11)

正如我们所看到的,包含线性融合模块会导致计算量的最小增加。

3.2 常规版本的AdaTT

在其一般形式中,如图1(b)所示,AdaTT采用可选的共享融合单元(shared fusion units)。从概念上讲,专有任务模块pairs间的融合模拟了细粒度共享(fine-grained sharing),而专有任务模块和共享模块间的融合则传递了适用于所有任务的广泛知识。这导致了高效灵活的任务间知识共享。通用AdaTT的计算方式与AdaTT-sp类似,除了最后一个fusion level,共享融合单元不执行任何融合操作,只为专有任务融合单元产生专家输出进行处理。

总之,AdaTT明确地学习任务特定知识并自适应地与共享知识融合。融合是任务自适应的,因为:

  • 1.门控模块学习与任务本地专家相关的残差。
  • 2.每个任务特定单元使用特定的门控模块融合专家,该门控模块以输入为条件(从第二个融合级别开始是唯一的)。

通过允许每个任务直接而灵活地从其他任务中学习共享知识,AdaTT相比于仅依赖于共享专家作为媒介的PLE具有更大的灵活性。此外,AdaTT可以选择仅使用任务特定专家。与PLE不同,它在每个融合单元内的不同线性融合模块中单独融合本地专家,而不是在单个门控模块中处理所有选定的专家。这种设计增强了每个融合级别后任务特定学习的鲁棒性。尽管它很简单,但我们的实验表明,它胜过了PLE,后者将选择应用于不同的融合单元中的专家,并使用不同的路由路径来区分这些专家。

4.实验

https://arxiv.org/pdf/2304.04959.pdf

pinterest在《Improving feature interactions at Pinterest under industry constraints》提出了一种特征交叉的新思路。

摘要

在工业环境中采用推荐系统的先进成果常常面临挑战,因为存在独特的约束条件。本文旨在通过特征交互的视角来突出这些约束。特征交互对于准确预测推荐系统和在线广告中的用户行为至关重要。尽管许多新颖的技术在Criteo等基准数据集上显示出优越的性能,但由于模型延迟、GPU内存限制和模型可复制性等约束,它们的直接应用在工业环境中受到阻碍。在本文中,我们分享了在这些约束下改进Pinterest首页排序模型中特征交互的经验。我们提供了遇到的特定挑战、为解决这些挑战而采取的策略以及为平衡性能与实际限制所做的权衡的详细信息。此外,我们展示了一组学习实验,这些实验有助于指导特征交互架构的选择。我们相信这些见解对于有兴趣通过更好的特征交互学习来改进模型的工程师将是有用的。

1 引言

Pinterest是最大的内容分享平台之一,拥有超过5亿的月活跃用户[9]。如图1所示的Homefeed是大多数用户的首要入口点,也是主要的灵感来源,占据了平台上用户参与度的大部分。Pinterest上的用户可以通过保存、放大、隐藏等多样的操作与Pin进行互动。

图片名称

图1

为了增强用户在Homefeed上的体验,我们使用推荐系统确保为用户提供最相关的Pin。我们使用的是基于标准的检索、排名和混合的推荐系统。排序模型负责预测不同用户行为的概率。这是通过多任务建模方法实现的。

我们的排序模型可以分为三个部分:特征预处理、特征交互和任务预测。特征交互是模型的关键部分,对于有效捕捉特征和标签之间的复杂关系至关重要。

近年来[11][14][8][17],提出了许多架构来高效学习这些关系。然而,这些架构通常在基准数据集的离线设置中进行评估,并没有考虑到工业推荐系统面临的现实世界约束。过多的超参数和高内存使用等限制使得这些技术在工业环境中不切实际。应对这些约束是改进我们的模型并为用户提供价值的关键。

本文的核心贡献总结如下:

  • 我们详细描述了工业环境中面临的约束,并将其与学术研究进行对比。
  • 我们提出了一组学习实验,以帮助指导选择合适的交互架构和超参数。
  • 我们分享了在这些特定行业约束下,通过学习实验改进排序模型中特征交互的经验。 本文的其余部分组织如下:第2节回顾相关工作。第3节描述了Homefeed排序模型。我们在第4节详细说明了我们工作的约束。第5节报告了使用不同特征交互层的学习实验和实验结果。最后,我们在第6节总结我们的工作。

2 相关工作

当今大多数工业推荐系统都基于深度神经网络模型,这些模型的大部分关键部分是有效地学习特征交互。像Wide & Deep[1]和DeepFM[5]这样的架构表明,学习低阶和高阶特征交互是有用的。[2]显示,随着更好的特征交互架构的出现,Criteo数据集上的点击率预测逐年变得更好。 多层感知机(MLP)允许隐式建模高阶特征交互。DCN[12]及其后继者DCNv2[13]增加了一个显式的特征交叉来学习更好的交互。同样,xDeepFM[7]使用压缩交互网络(CIN)以显式方式学习低阶和高阶特征交互。AutoInt[10]提出了一个基于注意力的机制,在低维空间中显式建模特征交互。

Masknet[14]使用实例引导的掩码来辅助交互学习。FinalMLP[8]表明,一个经过良好调整的双流MLP模型可以胜过显式交叉。GDCN[11]使用门控来过滤掉嘈杂的特征交互,允许更高阶的特征交互。DHEN[16]提出了一个结合多种特征交互的框架。SDCNv3[6]提出使用浅层和深层交叉网络,整合了低阶和高阶特征交互。尽管这些新架构提高了准确性,但它们增加了模型的延迟和内存消耗,这使得在工业环境中更难使用。

DeepLight[3]提出通过使用一种机制来剪枝神经网络,以减少推理时间同时保持模型性能,从而缓解这个问题。然而,剪枝引入了失去可复制性的风险,这在工业环境中很重要。使用多头注意力机制的Transformer架构已被证明在特征交互学习方面是有效的[4]。

3 首页feeds排序模型(HOMEFEED RANKING MODEL)

Homefeed排序模型是一个深度学习模型,负责预测用户参与度概率的点估计。给定一个用户 u 和一个Pin p,模型预测 K 个概率——每个我们关心的用户行为(如保存、放大、隐藏等)都有一个。我们使用dense特征、sparse特征和嵌入特征的组合来表示用户、Pin和上下文。

  • dense特征被标准化以确保数值稳定性。
  • 我们使用可学习的嵌入来表示sparse特征,并根据特征的基数选择嵌入大小。我们将较大的嵌入特征投影到较小的维度,然后再输入到模型中。
  • 最重要的嵌入特征之一是我们的用户序列嵌入。它是使用基于Transformer的架构[15]学习得到的,输入是用户过去的参与情况。这个Transformer的输出被汇总到一个嵌入特征中

。稀疏和嵌入特征在与dense特征连接成一个单一特征嵌入之前被L2标准化。这个特征嵌入被用作特征交互层的输入。我们使用4个堆叠的全秩DCNv2[13]层来模拟特征交互。我们在将交叉特征嵌入和输入特征嵌入连接后,再传递到MLP层。我们使用一个共享的MLP,它有多个隐藏层,并预测对应于K个任务的K个输出。模型是使用用户过去的参与数据进行训练的,使用加权交叉熵损失。损失中的权重是根据业务需求选择的。我们将图2a中显示的架构作为我们所有实验的基线。

图片名称

图2 Homefeed ranking model

4 约束(CONSTRAINTS)

在迭代工业推荐系统时,考虑排序模型的各种约束至关重要。以下是其中一些约束,特别关注与我们的特征交互实验相关的,并与学术界进行对比。这不是一个详尽的列表,因为它不包括其他重要的考虑因素,如多样性和平衡业务指标。

4.1 内存

为了有效地利用我们的计算资源,我们选择的模型训练batch大小使得模型训练期间分配的最大内存大约是总可用内存的60%。这种分配为系统内存、内存碎片和可能增加内存使用的潜在未来项目留出了空间。尽管我们观察到进一步增加这个比例可以提高我们的模型质量,但如果最大分配内存超过75%,我们在模型重新训练期间会遇到间歇性的内存不足(OOM)错误。为了缓解这个问题,我们可以减少batch大小,但这是以牺牲模型质量和引入实验中的混杂变量为代价的。因此,任何需要大量额外内存的新技术都必须显著提高模型质量,以抵消因减少batch大小而造成的损失。

这通常不是学术研究的考虑因素,在那里batch大小可能被调整以最大化目标指标和训练时间。

4.2 延迟

模型推理延迟是我们整体系统延迟的重要组成部分。任何这种延迟的增加都会降低我们分布式服务系统的吞吐量。因此,我们然后需要增加额外的机器以获得相同的服务吞吐量,导致更高的运营成本。必须确保模型的任何改进都证明这些额外成本是合理的。此外,增加的模型延迟可以延长训练时间,从而影响开发速度。

在学术研究中,5%的延迟增加可能不会有关键影响,但在工业应用中,它会显著增加服务成本。话虽如此,由于可以轻松获得额外的计算资源,这是最容易权衡的约束之一。

4.3 超参数

使用具有众多超参数的模型架构会增加需要训练的模型数量,以确定最优配置。随着我们用户兴趣的变化,我们的数据分布也在变化。这要求我们定期调整这些超参数,以优化模型以适应最新的数据分布。

学术论文通常会进行广泛的超参数调整,以确定表现最佳的变体。由于这是一次性成本,减少模型中的超参数数量通常不是考虑因素。

4.4 可复制性

确保我们的模型可以使用相同的数据重新训练并产生一致的结果至关重要。没有这种一致性,就很难确定观察到的指标变化是给定变化的真实改进,还是模型内的简单变化。因此,任何纳入模型的特征交互都不应降低其可复制性。

我们通过计算使用相同配置的运行中HIT@3/save指标的标准差来衡量可复制性。一个可复制的模型应该有低标准差。

在学术界,可复制性不是一个重要因素。指标通常被报告为使用相同配置的几次运行的指标均值,但标准差通常不被比较。

4.5 稳定性

我们使用分布式训练方法来训练我们的模型,其中数值不稳定性可能导致模型失败。这要求我们从之前的检查点重新开始或完全放弃运行,导致计算资源浪费。任何纳入模型的新特征交互都不应影响其稳定性。

由于我们不断在新数据上重新训练我们的模型,跨不同数据分布的稳定性很重要。学术界通常使用固定的基准数据集来报告指标,所以通常不跟踪稳定性。

5 实验

5.1 指标

我们使用以下指标来评估我们的模型:

  • HIT@3/save指标[15]:尽管我们的模型预测多种行为,我们使用最重要的动作——保存(save),来进行模型的离线评估。我们根据新的预测结果对每个用户会话记录的结果进行排序,并计算前3个Pin中的保存(save)量。我们将这个指标与基线模型进行比较,并以百分比增益或损失的形式报告。
  • 内存:这是训练期间分配的峰值内存,作为总可用GPU内存的百分比。
  • 延迟:这是与基线模型相比,在大量batch中模型推理时间的增加或减少。

5.2 学习实验

在本节中,我们展示了我们进行的一系列学习实验,以确定哪些架构更改对模型有益。这些学习实验的结果在表1中。

表1

5.2.1 交互的顺序

我们评估了模型对增加交互顺序的反应,通过堆叠额外的特征交互层。在我们的实验中,我们成功地使用了多达8个堆叠的DCNv2层,而没有遇到内存不足(OOM)问题,并观察到了指标的改进。这告诉我们,我们的模型从更高阶的交互中受益。

5.2.2 平行交互

我们检查了模型对设计用来学习相似交互的平行层的反应。例如,平行的DCN层可能分别捕获不同的交互模式。在我们的实验中,同时运行多个堆叠的DCNv2层提高了模型性能。这告诉我们,我们的模型从学习同一阶的多个特征交互中受益。

5.2.3 交互的非线性

DCNv2在其架构中不包含非线性。在DCNv2中添加非线性的一种方式是使用低秩(LR)版本,在两个低秩全连接层之间使用非线性。我们将全秩DCNv2层替换为低秩层作为基线,并使用ReLU层作为非线性进行实验。我们比较了具有不同秩值的模型,并观察到我们的模型随着非线性交互的包含而改进。

5.3 变体(Variants)

我们选择了几种声称比DCNv2表现更好的特征交互架构进行实验。我们提供了以下架构的实现细节,并讨论了它们如何适应我们的约束。我们还提到了学习实验的结果如何指导我们进行最终模型选择。这些实验的结果在表2中。不同架构相对于不同约束的性能总结在表3中。

5.3.1 Transformer

要使用Transformer进行特征交互,我们首先将我们的S 个sparse特征投影到共同的维度 D。我们将我们的dense特征分组,并将其C次投影到维度D。我们将嵌入特征投影到维度D。此外,我们将用户序列Transformer的输出U次投影到维度D。这导致最终特征集包含(S+C+U) 个tokens,每个token的维度为 D。

然后我们应用多个Transformer编码器层进行特征交互。Transformer输出token被连接并使用MLP处理。

在我们的实验中,我们设置 C = 4 和 U = 4。我们使用了不同数量的头、令牌维度和层数,如表2所示。Transformer对内存需求很大,因此我们只能训练一个2层Transformer编码器模型而不会遇到OOM错误。这限制了特征交互的顺序为2,这很糟糕,因为我们的模型更喜欢更高阶的特征交互。我们不能减少batch大小以适应更多层,因为参与度指标与基线相比不够高。延迟和超参数的数量也使我们不再进一步探索这种架构。

5.3.2 FinalMLP

我们进行了实验,重点关注调整超参数,如层数、隐藏层的大小和头的数量,即 k。我们在 k 的较小值时遇到了OOM错误。尽管我们的模型更喜欢平行交互,但我们无法使用FinalMLP获得与基线相同的性能。随着我们增加潜在维度,内存使用和延迟都增加了,而性能却没有超过基线。这使我们得出结论,基线方法在学习特征交互方面比多头双线性融合技术要好得多。

5.3.3 GDCN

我们唯一需要调整的GDCN超参数是层数。我们在每个GDCN层中使用的参数数量大约是DCNv2的两倍。这限制了我们可以学习的交互顺序,因为参数使用的额外内存。我们知道我们的模型从更高阶的特征交互中受益,所以GDCN提供的门控并不有用。

5.3.4 Masknet

我们尝试了两种配置:顺序堆叠MaskNet层和并行运行它们。需要调整的关键超参数包括投影比率、块的数量和输出维度。在我们的实验中,我们使用投影比率 = 2.0 和输出维度 = 512,只调整了块的数量。我们知道我们的模型从平行特征交互和交互中的非线性中受益。两者结合,平行MaskNet层的表现超过了基线。

这带来了3个需要调整的超参数而不是一个,但这并不是很限制。我们使用这种架构大大增加了内存消耗和延迟,但模型质量的提高是值得的。

5.3.5 SDCNv3

我们将特征交互层中的4个堆叠DCNv2层替换为声称性能更好的堆叠SDCNv3层。我们堆叠了$ d \times d/2 $特征交叉层,并尝试改变层数。我们注意到,尽管SDCNv3提高了延迟,但它在我们的数据集上收敛得不好,从而降低了save@3的离线评估。我们相信这些特征交互层,如SDCNv3,需要广泛的超参数调整,以使模型性能与我们的基线模型相似,所以我们没有进一步探索它。

5.3.6 DeepLight

DeepLight使用轻量级交互层。为了使比较公平,我们扩大了DeepLight模型的MLP组件。尽管如此,模型无法像基线那样学习有用的表示。此外,我们注意到,该模型报告的延迟数字是在他们论文中指定的剪枝过程之前。我们没有调整所有所需的超参数进行他们指定的剪枝过程,因为未剪枝的模型性能远低于我们的基线。

5.3.7 DHEN

由于我们的模型更喜欢平行交互和更高阶的交互,我们尝试使用DHEN架构结合多个特征交互层。鉴于涉及的超参数数量庞大,在计算预算内进行广泛的搜索是不可行的。我们需要调整的超参数包括层数、每层中使用的具体交互、每层的输出大小,以及与Transformer中使用的类似的输入转换。表2显示了我们尝试的一些变体。配置呈现为列表的列表,其中第一个列表代表每层,第二个列表代表层内的交互。

我们注意到DCNv2层与平行MaskNet层的结合有很好的参与度指标增益。但是DHEN框架很笨重,因为它涉及在模型的每一层之间进行分割和连接。这导致不必要的GPU内存消耗和延迟。我们还遇到了模型稳定性问题,这使我们不再进一步追求这种架构。

5.4 结果

从表3中我们可以看到,运行多个MaskNet层并行实现了所有约束的良好权衡,除了延迟。为了降低模型的延迟,我们停止了在将特征交互层的输入和输出连接后传递给MLP层之前的操作。我们还减少了MLP中隐藏层的大小。这导致指标增益略有减少,与基线相比延迟总体减少。 由于我们知道模型更喜欢更高阶的特征交互,我们在平行MaskNet层之上堆叠了4个DCNv2层。我们调整了MaskNet模型的超参数,以实现延迟不增加和参数数量净零增加,同时只增加5%的绝对内存消耗,使我们能够使用相同的batch大小。我们还使用这种新架构进行了在线A/B测试,结果在表4中。最终配置有3个平行MaskNet块,投影比率为2.0,输出维度为512,如图2b所示。我们确认这种架构不会降低可复制性,并且在我们的任何运行中都没有观察到模型稳定性问题。

https://arxiv.org/pdf/2412.01985

pinterest在《TransAct: Transformer-based Realtime User Action Model for Recommendation at Pinterest》提出了它们的排序模型。

摘要

用于预测下一个动作的编码用户活动的序列模型,已成为构建大规模个性化推荐系统的一种流行设计选择。传统的序列推荐方法要么利用实时用户行为的端到端学习,要么以离线批处理生成的方式单独学习用户表示。本文:

  • (1)介绍了Pinterest的Homefeed排序架构,这是我们的个性化推荐产品和最大的参与度表面;
  • (2)提出了TransAct,一个从用户实时活动中提取短期偏好的序列模型
  • (3)描述了我们的混合排序方法,该方法结合了通过TransAct的端到端序列建模批生成的用户embedding

混合方法使我们能够结合直接在实时用户活动上学习的反应性优势和批用户表示的成本效益,这些用户表示是在更长时间内学习的。

我们描述了消融研究的结果,在产品化过程中面临的挑战,以及在线A/B实验的结果,这些验证了我们混合排序模型的有效性。我们进一步证明了TransAct在其他表面如上下文推荐和搜索方面的有效性。我们的模型已部署在Pinterest的Homefeed、相关Pin、通知和搜索中。

1 引言

近年来在线内容的激增为用户导航创造了压倒性的信息量。为了解决这个问题,推荐系统被用于各种行业,帮助用户从大量选择中找到相关item,包括产品、图片、视频和音乐。通过提供个性化推荐,企业和组织可以更好地服务用户,并保持他们对平台的参与。因此,推荐系统对企业至关重要,因为它们通过提高参与度(engagement)、销售和收入来推动增长。

作为最大的内容分享和社交媒体平台之一,Pinterest拥有数十亿个Pin,拥有丰富的上下文和视觉信息,为超过4亿用户提供灵感。

访问Pinterest时,用户会立即看到图1所示的Homefeed页面,这是主要的灵感来源,占平台总用户参与度的大部分。Homefeed页面由一个3阶段的推荐系统驱动,该系统根据用户兴趣和活动检索、排序和混合内容。在检索阶段,我们根据用户兴趣、关注的板块等多种因素,从Pinterest上创建的数十亿个Pin中筛选出数千个。然后我们使用pointwise排序模型通过预测它们对用户的个性化相关性来对候选Pin进行排序。最后,使用混合层调整排序结果以满足业务需求。

图片名称

图1 Pinterest Homefeed页

实时推荐至关重要,因为它为用户提供快速和最新的推荐,改善了他们的整体体验和满意度。集成实时数据,如最近的用户行为,可以更准确地推荐,并增加用户发现相关item的可能性[4, 21]。更长的用户行为序列可以改善用户表示,从而提高推荐性能。然而,使用长序列进行排序对基础设施提出了挑战,因为它们需要大量的计算资源,并可能导致延迟增加。为了解决这一挑战,

  • 一些方法已经利用哈希和最近邻搜索在长用户序列中[21]
  • 其他工作将用户过去的行为编码为用户嵌入[20],以表示长期用户兴趣。用户嵌入特征通常作为batch特征生成(例如,每天生成),在多个应用中以低延迟服务是成本效益的。

现有序列推荐的局限性在于:它们要么只使用实时用户行为,要么只使用从长期用户行为历史中学习的batch用户表示。

我们引入了一种新颖的实时-批量混合(realtime-batch hybrid)的排序方法,结合了实时用户行为信号和batch用户表示。为了捕捉用户的实时行为,我们提出了TransAct:

  • 一个基于transformer的新模块,旨在编码最近的用户行为序列并理解用户的即时偏好
  • 对于在较长时间内发生用户行为,我们将它们转换为批用户表示[20]

通过结合TransAct的表现力和批用户embedding,这种混合排序模型为用户提供了他们最近行为的实时反馈,同时也考虑了他们的长期兴趣。实时组件和batch组件互补推荐准确性。这导致Homefeed页面上用户体验的整体改善。

本文的主要贡献总结如下:

  • 我们描述了Pinnability,Pinterest的Homefeed生产排序系统的架构。Homefeed个性化推荐产品占Pinterest总用户参与度的大部分。
  • 我们提出了TransAct:一个基于transformer的实时用户行为序列模型,有效地从用户最近的行动中捕获用户的短期兴趣。我们证明了将TransAct与每天生成的用户表示[20]结合到混合模型中,在Pinnability中实现了最佳性能。这种设计选择通过全面的消融研究得到了证明。我们的代码实现是公开可用的1。
  • 我们描述了在Pinnability中实施的服务优化,使得在引入TransAct到Pinnability模型时,计算复杂度增加了65倍成为可能。具体来说,优化是为了使我们以前的基于CPU的模型能够在GPU上服务。
  • 我们描述了使用TransAct在现实世界推荐系统上的在线A/B实验。我们展示了在线环境中的一些实际问题,如推荐多样性下降和参与度衰减,并提出了解决这些问题的方案。

本文的其余部分组织如下:第2节回顾相关工作。第3节描述了TransAct的设计及其生产细节。实验结果在第4节报告。我们在第5节讨论了一些超出实验的发现。最后,我们在第6节总结我们的工作。

2 相关工作

2.1 推荐系统

协同过滤(CF)[12, 18, 24]基于这样的假设进行推荐:用户会偏好其他相似用户喜欢的物品。它使用用户行为历史来计算用户和物品之间的相似性,并基于相似性推荐物品。这种方法受到用户-物品矩阵稀疏性的困扰,并且无法处理从未与任何物品互动过的用户。另一方面,因子分解机[22, 23]能够处理稀疏矩阵。

最近,深度学习(DL)已被用于点击率(CTR)预测任务。例如:

  • 谷歌使用Wide & Deep [5]模型进行应用推荐。wide组件通过捕获特征之间的交互来实现记忆,而deep组件通过使用前馈网络学习分类特征的嵌入来帮助泛化。
  • DeepFM [7]通过自动学习低阶和高阶特征交互进行了改进。
  • DCN [34]及其升级版本DCN v2 [35]都旨在自动建模显式特征交叉。

上述推荐系统在捕捉用户的短期兴趣方面表现不佳,因为只利用了用户的静态特征。这些方法也倾向于忽略用户行为历史中的序列关系,导致用户偏好的表示不足。

2.2 序列推荐

为了解决这个问题,序列推荐在学术界和工业界都得到了广泛研究。序列推荐系统使用用户的行为历史作为输入,并应用推荐算法向用户推荐适当的物品。序列推荐模型能够在长时间内捕捉用户的长期偏好,类似于传统推荐方法。此外,它们还有一个额外的好处,即能够考虑到用户兴趣的演变,从而实现更高质量的推荐。

序列推荐通常被视为下一个物品预测任务,目标是基于用户过去的行为序列预测用户的下一个行动。我们在编码用户过去的行为到dense表示方面受到了先前序列推荐方法[4]的启发。一些早期的序列推荐系统使用机器学习技术,如马尔可夫链[8]和基于会话的K最近邻(KNN)[11]来模拟用户行为历史中交互的时间依赖性。这些模型因为仅通过组合不同会话的信息而无法完全捕捉用户的长期模式而受到批评。最近,深度学习技术,如循环神经网络(RNN)[25]在自然语言处理中取得了巨大成功,并在序列推荐中变得越来越流行。因此,许多基于DL的序列模型[6, 9, 30, 42]使用RNNs取得了出色的性能。卷积神经网络(CNNs)[40]广泛用于处理时间序列数据和图像数据。在序列推荐的背景下,基于CNN的模型可以有效地学习用户最近交互的一组物品内的依赖性,并相应地进行推荐[31, 32]。

注意力机制起源于神经机器翻译任务,该任务模拟输入句子的不同部分对输出词的重要性[2]。自注意力是一种已知的机制,用于衡量输入序列的不同部分的重要性[33]。已经有更多推荐系统使用注意力[43]和自注意力[4, 13, 16, 27, 39]。

许多先前的工作[13, 16, 27]仅使用公共数据集进行离线评估。然而,在线环境更具挑战性和不可预测性。由于问题表述的差异,我们的方法与这些工作不直接可比。我们的方法类似于点击率(CTR)预测任务。深度兴趣网络(DIN)使用注意力机制在CTR预测任务中模拟用户过去行为的依赖性。阿里巴巴的行为序列transformer(BST)[4]是DIN的改进版本,与我们的工作密切相关。他们提出使用transformer从用户行为中捕捉用户兴趣,强调行为顺序的重要性。然而,我们发现位置信息并没有增加太多价值。我们发现其他设计,如更好的早期融合和行为类型嵌入,在处理序列特征时是有效的。

3 方法论

在本节中,我们介绍了TransAct,我们的实时-batch混合排序模型。我们将从Pinterest Homefeed排序模型Pinnability的概述开始,然后描述如何使用TransAct在Pinnability中编码实时用户行为序列特征以进行排序任务。

3.1 预备知识:Homefeed排序模型

在Homefeed排序中,我们将推荐任务建模为pointwise多任务预测问题,可以定义如下:给定用户 $ u $ 和Pin $ p $,我们构建一个函数来预测用户 $ u $ 对候选Pin $ p $ 执行不同动作的概率。不同动作的集合包含正面和负面动作,例如点击、保存和隐藏。

我们构建了Pinnability,Pinterest的Homefeed排序模型,来解决上述问题。高层架构是Wide and Deep学习(WDL)模型[5]。Pinnability模型利用各种类型的输入信号,如用户信号、Pin信号和上下文信号。这些输入可以以不同的格式出现,包括类别型、数值型和嵌入型特征。

  • 我们使用嵌入层(embedding layer)将类别型特征投影到dense特征,并在数值型特征上执行batch归一化
  • 然后,我们应用一个全秩DCN V2[35]的特征交叉来显式建模特征交互
  • 最后,我们使用具有一组输出动作头 $ H = \lbrace h_1, h_2, …, h_k \rbrace $ 的全连接层来预测用户对候选Pin $ p $ 的动作。每个头对应一个动作

如图2所示,我们的模型是一个实时-batch混合模型,通过实时(TransAct)和batch(PinnerFormer)方法编码用户行为历史特征,并针对排序任务[37]进行优化。

图片名称

图2 Pinterest Homefeed ranking model (Pinnability)

每个训练样本是 (x, y),其中:

  • x 表示一组特征,
  • $ y \in \lbrace 0, 1 \rbrace^{ \mid H \mid} $,y中的每个条目对应于H中动作头的label。

Pinnability的loss函数是一个加权交叉熵损失,旨在优化多标签分类任务。我们将损失函数公式化为:

\[L = w_u \sum_{h \in H} \left\{ -w_h [y_h \log f(x)_h + (1 - y_h) (1 - \log f(x)_h)] \right\}\]

…(1)

其中:

  • $ f(x) \in (0, 1)^H $,$ f(x)_h $ 是头 $ h $ 的输出概率。
  • $ y_h \in \lbrace 0, 1\rbrace $ 是头 $ h $ 的真实标签。
  • 权重 $ w_h $ 应用于每个头的输出 $ f(x)_h $ 的交叉熵。
  • $ w_h $ 是根据真实标签 y 和标签权重矩阵 $ M \in \mathbb{R}^{\mid H \mid \times \mid H \mid} $ 计算的:
\[w_h = \sum_{a \in H} M_{h,a} \times y_a\]

标签权重矩阵 $ M $ 作为每个动作对每个头损失项贡献的控制因素。注意,如果 M 是对角矩阵,方程(1)简化为标准的多头二元交叉熵损失。但是选择根据经验确定的标签权重 M 可以显著提高性能

此外,每个训练样本都由用户依赖的权重 $ w_u $ 加权,这由用户属性决定,如用户状态、性别和位置。我们通过乘以用户状态权重、用户性别权重和用户位置权重来计算 $ w_u $:

\[w_u = w_{\text{state}} \times w_{\text{location}} \times w_{\text{gender}}\]

这些权重根据特定业务需求进行调整。

3.2 实时用户行为序列特征

用户过去的行为历史自然是一个可变长度特征——不同用户在平台上的过去行为数量不同。 尽管更长的用户行为序列通常意味着更准确的用户兴趣表示,但实际上,包含所有用户行为是不可行的。因为获取用户行为特征和执行排序模型推理所需的时间也可能大幅增长,这反过来又会影响用户体验和系统效率。考虑到基础设施成本和延迟要求,我们选择包含每个用户最近的100个行为序列。对于少于100个行为的用户,我们用0填充特征到100的长度。用户行为序列特征按时间戳降序排序,即第一个条目是最近的行为

用户行为序列中的所有行为都是Pin级别的行为。对于每个行为,我们使用三个主要特征:

  • 行为的时间戳
  • 行为类型
  • Pin的32维PinSage嵌入[38]:PinSage是一个紧凑的embedding,编码了Pin的内容信息

3.3 我们的方法:TransAct

与静态特征不同,实时用户行为序列特征 $ S(u) = [a_1, a_2, …, a_n] $ 是使用一个名为TransAct的专用子模块处理的。TransAct从用户的历史行为中提取序列模式,并预测 $ (u, p) $ 相关性分数。

3.3.1 特征编码

用户参与的Pin的相关性,可以通过用户行为历史中对它们采取的行动类型来确定。例如:

  • 通常认为用户保存到自己看板的Pin比仅查看的Pin更相关。
  • 如果Pin被用户隐藏,相关性应该非常低。

为了纳入这一重要信息,我们使用可训练的嵌入表将行动类型投影到低维向量。用户行为类型序列随后被投影到用户行为嵌入矩阵 $ W_{\text{actions}} \in \mathbb{R}^{\mid S \mid \times d_{\text{action}}} $,其中 $ d_{\text{action}} $ 是行动类型嵌入的维度。

如前所述,用户行为序列中的Pin内容由PinSage嵌入[38]表示。因此,用户行为序列中所有Pin的内容是一个矩阵 $ W_{\text{pins}} \in \mathbb{R}^{\mid S \mid \times d_{\text{PinSage}}} $。最终编码的用户行为序列特征是$CONCAT (W_{actions} \ , W_{pins}) \in \mathbb{R}^{\mid S \mid \times (d_{PinSage} + d_{action})} $。

3.3.2 早期融合(early fusion)

直接在排序模型中使用用户行为序列特征的一个独特优势是,我们可以显式地建模候选Pin和用户参与的Pin之间的交叉。早期融合(early fusion)在推荐任务中指的是在推荐模型的早期阶段合并用户和物品特征。通过实验,我们发现早期融合是提高排序性能的重要因素。评估了两种早期融合方法:

  • append:将候选Pin的PinSage embedding附加到用户行为序列作为序列的最后一项,类似于BST[4]。使用零向量作为候选Pin的虚拟动作类型
  • concat:对于用户行为序列中的每个动作,将候选Pin的PinSage embedding与用户行为特征连接起来。

我们根据离线实验结果选择concat作为我们的早期融合方法。早期融合的结果序列特征是:一个2维矩阵 $ U \in \mathbb{R}^{\mid S \mid \times d} $,其中 $ d = (d_{\ action} \ + 2d_{\ PinSage}) $。

3.3.3 序列聚合模型

准备好用户行为序列特征 $ U $ 后,下一个挑战是:有效地聚合用户行为序列中的所有信息以表示用户的短期偏好。工业中用于序列建模的一些流行模型架构包括CNN[40]、RNN[25]和最近的transformer[33]等。我们尝试了不同的序列聚合架构,并选择了基于transformer的架构。我们采用了标准transformer编码器,有2个编码器层和一个头。前馈网络的隐藏维度表示为 $ d_{\text{hidden}} $。这里不使用位置编码,因为我们的离线实验表明位置信息是无效的。

3.3.4 随机时间窗口掩码

在用户的所有最近行为上训练可能会导致兔子洞效应(rabbit hole effect),即模型推荐与用户最近参与内容相似的内容。这会损害用户Homefeed的多样性,对长期用户留存有害。为了解决这个问题,我们使用用户行为序列的时间戳构建transformer编码器的时间窗口掩码。该掩码在自注意力机制应用之前过滤掉输入序列中的某些位置。在每次前向传递中,从0到24小时均匀采样一个随机时间窗口 $ T $。在 $ (t_{\text{request}} - T, t_{\text{request}}) $ 内的所有行为都被掩码,其中 $ t_{\text{request}} $ 代表接收排序请求的时间戳。重要的是要注意,随机时间窗口掩码仅在训练期间应用,而在推理时不使用掩码。

3.3.5 transformer输出压缩

transformer编码器的输出是一个矩阵:$ O = (o_0 : o_{\mid S \mid -1}) \in \mathbb{R}^{\mid S \mid \times d} $。我们只取前K列($ o_0 : o_{K-1} $),将它们与最大池化向量 $ \text{MAXPOOL}(O) \in \mathbb{R}^d $ 连接起来,然后将其展平为一个向量 $ \mathbf{z} \in \mathbb{R}^{(K+1) \times d} $。前 $ K $ 列输出捕获了用户最近的兴趣,而 $ \text{MAXPOOL}(O) $ 表示用户对 $ S(u) $ 的长期偏好。由于输出足够紧凑,它可以很容易地使用DCN v2[35]特征交叉层集成到Pinnability框架中。

图片名称

图3 TransAct架构是一种可以插入到任何类似架构中的子模块,比如Pinnability。

3.4 模型产品化

3.4.1 模型重新训练

对于推荐系统来说,重新训练很重要,因为它允许系统不断适应用户行为和偏好随时间的变化。没有重新训练,推荐系统的性能会随着用户行为和偏好的变化而降低,导致推荐准确性下降[26]。当我们在排序中使用实时特征时,这一点尤其正确。模型对时间更敏感,需要频繁重新训练。否则,模型可能在几天内变得过时,导致预测准确性降低。我们每周从头开始重新训练Pinnability两次。我们发现这种重新训练频率对于确保一致的参与率和保持可管理的训练成本至关重要。我们将在第4.4.3节深入探讨重新训练的重要性。

3.4.2 GPU服务

带有TransAct的Pinnability在浮点运算方面比其前身复杂65倍。如果没有模型推理的突破,我们的模型服务成本和延迟将增加相同的规模。GPU模型推理允许我们以中性的延迟和服务成本提供带有TransAct的Pinnability。

在GPU上提供Pinnability的主要挑战是CUDA内核启动开销。在GPU上启动操作的CPU成本非常高,但它通常被延长的GPU计算时间所掩盖。然而,这对于Pinnability GPU模型服务有两个问题。首先,Pinnability和推荐模型通常处理数百个特征,这意味着有大量的CUDA内核。其次,在线服务期间的batch大小很小,因此每个CUDA内核需要的计算量很少。有了大量小CUDA内核,启动开销比实际计算更昂贵。我们通过以下优化解决了技术挑战:

  • 合并CUDA内核。一个有效的方法是尽可能合并操作。我们利用标准深度学习编译器,如nvFuser7,但通常发现需要人为干预许多剩余操作。一个例子是我们的嵌入表查找模块,它由两个计算步骤组成:原始ID到表索引查找和表索引到嵌入查找。由于特征数量众多,这个过程需要重复数百次。我们通过利用cuCollections8支持GPU上的原始ID哈希表,并实现自定义的合并嵌入查找模块,将多个特征的查找合并为一次查找,从而将与稀疏特征相关的数百个操作减少为一个。

  • 合并内存拷贝。每次推理时,数百个特征被作为单独的张量从CPU复制到GPU内存。调度数百个张量拷贝的开销成为瓶颈。为了减少张量拷贝操作的数量,我们在将它们从CPU传输到GPU之前,将多个张量合并为一个连续的缓冲区。这种方法减少了单独传输数百个张量的调度开销,改为传输一个张量。

  • 形成更大的批次。对于基于CPU的推理,更小的批次更受欢迎,以增加并行性和减少延迟。然而,对于基于GPU的推理,更大的批次更有效[29]。这导致我们重新评估我们的分布式系统设置。最初,我们使用scatter-gather架构将请求分割成小批次,并在多个叶节点上并行运行它们以获得更好的延迟。然而,这种设置与基于GPU的推理不兼容。相反,我们直接使用原始请求中的更大批次。为了补偿缓存容量的损失,我们实现了一个使用DRAM和SSD的混合缓存。

  • 利用CUDA图。我们依靠CUDA图9来完全消除剩余的小操作开销。CUDA图将模型推理过程捕获为操作的静态图,而不是单独调度的操作,允许计算作为一个单独的单元执行,没有任何内核启动开销。

3.4.3 实时特征处理

当用户采取行动时,基于Flink10的实时特征处理应用程序会消费前端事件生成的用户行为Kafka11流。它验证每个行动记录,检测并合并重复项,并管理多个数据源的任何时间差异。然后,应用程序将特征具体化并存储在Rockstore[3]中。在服务时间,每个Homefeed日志/服务请求触发处理器将序列特征转换为模型可以使用的格式。

4.实验

附录

https://arxiv.org/pdf/2306.00248

pinterest在《PinnerFormer: Sequence Modeling for User Representation at Pinterest》提出了它们的PinnerFormer方法:

摘要

近年来,序列模型在个性化推荐系统中变得越来越流行。这些传统的方法将用户在网站上的行为建模为一个序列,以预测用户的下一个行为。虽然理论上简单,但这些模型在生产环境中部署起来相当具有挑战性,通常需要流式基础设施来反映最新的用户活动,并可能管理可变数据以编码用户的隐藏状态。在这里,我们介绍了 PinnerFormer,这是一个训练用来预测用户未来长期参与度的用户表示,它基于用户近期行为的序列模型。与之前的方法不同,我们通过我们的新密集全动作损失(dense all-action loss)适应批量基础设施,模拟长期未来行为而不是下一个行为预测。我们展示了这样做可以显著缩小每天生成一次的批量用户嵌入和用户采取动作时生成的实时用户嵌入之间的差距。我们通过广泛的离线实验和消融研究来描述我们的设计理念,并在 A/B 实验中验证了我们方法的有效性,与我们之前用户表示相比,PinnerFormer 在 Pinterest 的用户留存和参与度方面显示出了显著的改进。PinnerFormer 自 2021 年秋季起已在生产环境中部署。

1 引言

每月有超过4亿用户使用Pinterest来从我们数十亿的Pins内容库中发现想法和灵感。一个Pin通常以一张图片开始,经常包括文本、一个网页链接和一个板子,将单个Pin连接到用户策划的Pins集合中。灵感是Pinterest的关键,主要通过我们的搜索和推荐系统实现,使用户能够通过:

  • (a) Homefeed,我们的个性化推荐产品,
  • (b) Related Pins,与查询Pin相关的推荐,
  • (c) Search,与用户文本查询相关的推荐来找到内容

用户通过保存Pins到板子(Repin)、点击底层链接、放大一个Pin(特写)、隐藏不相关内容等互动方式给出反馈。为了实现我们让每个人都能得到创造他们所爱生活灵感的使命,我们需要根据用户的兴趣和上下文个性化我们的内容,考虑到用户在Pinterest旅程中给出的反馈;即,我们需要对我们的用户有一个强大的表示。

学习user embedding(表示)已成为提高推荐质量的越来越流行的方法。这种嵌入已被采用以推动排名和候选生成在行业中,被用来在YouTube[6]、Google Play[26]、Airbnb搜索[8]、JD.com搜索[30]、Alibaba[12, 18]等多个平台上推动个性化推荐。除了学习个性化嵌入的工作外,还有一系列工作集中在直接使用序列信息构建排序模型[4, 18, 19, 31],使推荐基于用户最近的参与度进行个性化。

用户在网站上的行为往往是顺序性的;动作可以按照他们被采取的时间来排序,这自然导致了序列建模方法。已经有多种方法被提出来基于用户的历史互动序列预测未来的参与度[3, 9, 17, 20, 21]。更近的工作已经应用了各种深度学习模型,包括循环神经网络(RNN)和变换器(transformers)来进行这种序列推荐,并取得了有希望的结果[3, 7, 9, 10, 21, 25, 29]。序列模型传统上专注于实时设置,旨在从所有导致该点的动作中预测用户的下一个动作或参与度。

在实践中,将现有的序列建模方法部署到大型网络规模应用中存在两个关键挑战:

  • (a) 计算成本
  • (b) 基础设施复杂性

现有的序列建模方法大致分为两类:无状态模型有状态模型。无状态模型可能具有高计算成本,因为必须在用户采取的每个动作之后从头开始计算嵌入,而有状态模型需要健壮可靠的流式基础设施来处理给定用户模型状态中的潜在错误或数据损坏[18]。

在这里,我们介绍了PinnerFormer,这是一个在Pinterest生产环境中部署的端到端学习的用户表示。与先前关于序列用户建模的工作类似,PinnerFormer直接基于用户过去的Pin参与度学习表示。我们提出了一个密集全动作损失(dense all-action loss),这使我们的嵌入能够捕捉用户的长期兴趣,而不仅仅是预测下一个动作。这使我们的embedding可以在离线、批量设置中计算,并大大简化了基础设施

我们还解决了Pinterest中表现的基础设施复杂性挑战:有数十个排序模型可以从个性化中受益,但为每个模型开发定制解决方案是不可行的。我们选择不针对每个模型生产一个用户嵌入(这将增加复杂性),而是投资于开发一个可以用于多个下游任务的单一高质量用户嵌入。尽管在某些情况下可能会牺牲特定任务的性能,但对于大多数用例来说,复杂性权衡使得共享嵌入更受欢迎。

我们在离线和在线A/B实验中评估PinnerFormer。在离线实验中,我们展示了这种训练目标几乎将每日推断模型和实时推断模型之间的性能差距减半,并且比其他方法更好地反映了用户的长期兴趣。然后,我们展示了PinnerFormer作为特征的效用,证明当它作为多个不同领域排序模型中的特征使用时,它能够实现显著的在线收益。

2 设计选择

我们首先讨论PinnerFormer中的关键设计选择。

设计选择1:单个用户使用单个还是多个嵌入。 大多数生成用户表示的方法产生单个嵌入[3, 7, 9, 10, 21, 25, 29],但有些专注于学习固定或可变数量的用户嵌入[12, 13, 17, 24]。在我们之前用户表示PinnerSage中,我们决定允许一个可变的数量,可能是大量的嵌入,允许模型明确表示用户的多样化兴趣[17]。

尽管使用多个嵌入可以让模型更明确地捕捉用户兴趣,并且在检索中表现良好,但这在使用下游模型时可能会导致问题:在训练数据中存储20+个256维float16嵌入并不具有很好的扩展性,特别是当数据集可能包含数十亿行时,正如排序模型中的情况。此外,这也增加了模型训练和推理的成本;处理5000+个浮点数可能会引入非微不足道的延迟,特别是如果它们在聚合前被转换。在训练时,大型样本也可以增加加载数据所需的时间。为了避免这些问题,在使用PinnerSage进行排序模型时,我们通常会使用用户嵌入的加权聚合作为最终用户表示。因为我们希望PinnerFormer能够轻松用作特征,我们产生一个捕获用户兴趣的单个嵌入,允许在下游模型中无痛使用。在离线评估中,我们展示了我们的单个嵌入能够比PinnerSage更好地反映用户的长期兴趣,同时只需要一小部分存储空间。

设计选择2:实时与离线推理。 大多数关于序列用户建模的先前工作集中在实时或近实时操作的模型上。在实践中,这至少会导致以下之一:

  • 高计算成本: 对于用户采取的每一个动作,系统必须获取用户历史中的所有事件,并经常推断一个可能复杂的模型。
  • 高基础设施复杂性: 用户的隐藏状态或嵌入可以逐步更新,但这需要一个健壮的系统来恢复和预热模型的状态,以防任何数据损坏[18]。

在Pinterest,用户可能在一天内采取数十或数百个动作,因此一个每天最多更新一次用户嵌入的模型只需要同等规模实时模型计算资源的一小部分。在离线评估中,我们展示了我们的损失函数显著减少了实时和每日推断模型之间的差距,并且在A/B实验中,我们展示了PinnerFormer极大地提高了下游排序模型的性能。

3 我们的方法:PinnerFormer

在本节中,我们介绍了自2021年秋季以来在Pinterest生产环境中使用的PinnerFormer,描述了我们的模型(如图1所示)及其部署方式。

图片名称

图1 PinnerFormer架构的概览如下:特征通过带有因果掩蔽的transformer传递,并且在每个timestep返回embedding。需要注意的是,训练窗口(28天)超过了我们未来评估目标窗口(14天)

我们从:

  • 一个庞大的Pins语料库:$P = \lbrace 𝑃_1, 𝑃_2, \cdots, 𝑃_𝑁 \rbrace$,其中:𝑁非常大,大约有数十亿
  • 一组用户:$U = \lbrace 𝑈_1, 𝑈_2, \cdots \rbrace$,其中:$\mid U \mid > 500M$。
  • 对于语料库中的每个Pin,我们有一个PinSage embedding: $𝑝_𝑖 \in R^{256}$,这是Pin $𝑃_𝑖$的视觉、文本和参与度信息的聚合。
  • 对于每个用户,我们有一个用户在网站上采取的动作序列:$A_𝑈 = {𝐴_1, 𝐴_2, …, 𝐴_𝑆}$,按时间戳升序排列。

在这项工作中,我们将动作序列限制为用户对Pins的参与,包括过去一年中对Pin的保存、点击、反应和评论。基于这个假设,动作可以由PinSage嵌入表示,以及一些关于动作的元数据。实际上,对于给定的用户,𝑆可能非常大,对于某些用户来说可能是数千或数万,因此我们使用用户的M个最新动作来计算用户的嵌入。

给定这些定义,我们的目标是:学习一个用户表示$𝑓 : U → R^d$,与某些Pin表示$𝑔 : P → R^d$在余弦相似性下兼容。我们联合学习𝑓和𝑔,使用动作序列$A_𝑈$作为模型的唯一输入特征,并限制为仅最新的M个。

在一个用户的完整动作序列中,可能有许多类型的动作,其中一些是正向的(例如长时间点击),而另一些是中性的或负向的(例如隐藏或短时间点击)。在这项工作中,我们专注于学习预测正向参与的表示,我们将其定义为Pin保存(”Repin”)、持续超过10秒的Pin特写(”Closeup”)或对Pin下链接的长时间点击(>10s)(”Click”)。我们只将Homefeed上的参与视为正向的;在搜索或相关Pins等表面上,查询提供了大量上下文,而在Homefeed上,用户提供了主要的上下文。

我们的主要目标是:学习一个模型,能够预测用户在生成嵌入后的14天内的未来正向参与,而不是传统的序列建模任务,后者的嵌入只会预测下一个动作。换句话说,我们的目标是:学习嵌入$𝑢_𝑖$和$𝑝_𝑖$,使得如果$𝑑(𝑢_𝑘, 𝑝_𝑖) < 𝑑(𝑢_𝑘, 𝑝_𝑗)$,则$𝑝_𝑖$比$𝑝_𝑗$更有可能被$𝑢_𝑘$代表的用户在生成$𝑢_𝑘$后的14天内正向参与。我们选择14天的范围是为了可行性,并假设用户在两周内采取的动作足以代表用户的长期兴趣。图1展示了PinnerFormer架构,我们将在下面更详细地展开每个组件。

3.1 特征编码

对于用户序列中的每个动作,我们有一个PinSage嵌入(256维)[28]和元数据特征:动作类型(action type)、表面(surface)、时间戳(timestamp)和动作持续时间(action duration)。我们使用小型可学习的嵌入表来编码动作类型和表面,这两个分类特征,并丢弃这两个特征中任一的词汇表外术语的序列元素。我们用单个标量值$log(𝑑𝑢𝑟𝑎𝑡𝑖𝑜𝑛)$来编码动作持续时间。

为了表示动作发生的时间,我们使用2个衍生值以及原始的绝对时间戳:自用户采取的最新动作以来的时间,以及动作之间的时间间隔。对于这些时间特征,我们遵循使用不同周期的正弦和余弦变换编码时间的常见做法,类似于Time2vec[11],但使用固定的𝑃周期,而不是学习周期,以及对时间进行对数变换,而不是线性变换。这产生了2𝑃 + 1个特征(来自时间戳的周期变换的2𝑃)。

所有特征被连接成一个单独的向量,结果是一个维度为$𝐷_{in}$的输入向量。对应于动作𝐴𝑖的表示记为$𝑎_𝑖 \in R^{𝐷_{in}}$。

3.2 模型架构

在PinnerFormer中,我们使用transformer模型架构[22]来模拟用户动作序列。我们选择使用PreNorm残差连接,在每个块之前应用层归一化,因为这种方法已被证明可以提高训练的稳定性[16, 23]。我们首先构造输入矩阵$𝐴 = [𝑎_𝑇, …, 𝑎_{𝑇−𝑀+1}]^T \in R^{𝑀×𝐷_{in}}$,使用作为用户序列的导致动作$𝐴_{𝑇+1}$的𝑀个动作。然后,我们将这些投影到transformer的隐藏维度,添加一个完全可学习的位置编码,并应用一个标准transformer,由交替的前馈网络(FFN)和多头自注意力(MHSA)块组成。transformer在每个位置的输出通过一个小型MLP和L2归一化,结果得到一组嵌入$𝐸 = [𝑒_1, … , 𝑒_𝑀]^T \in R^{𝑆×𝐷}$,其中𝐷是最终嵌入维度。

为了表示Pins,我们学习一个MLP,它只接受PinSage作为输入,并L2归一化输出嵌入。我们发现使用L2归一化的嵌入来表示用户和Pins可以带来最稳定的训练,并且不会牺牲离线性能。

3.3 度量学习

为了训练我们的表示,我们需要由用户嵌入和目标Pin嵌入组成的配对${(𝑢1, 𝑝1), …, (𝑢𝐵, 𝑝𝐵)}$,其中用户和Pins可能被重复选择。我们选择不在这项工作中使用显式的负例(即我们没有为负参与,如隐藏,设置损失项)。在设计我们的模型时,有几个考虑因素:

  • (a) 我们如何选择这些配对?
  • (b) 对于给定的$(𝑢_𝑖, 𝑝_𝑖)$配对,我们如何选择负例?
  • (c) 给定一个$(𝑢_𝑖, 𝑝_𝑖)$配对和一组负例,我们如何计算损失?

我们首先描述(b)和(c),然后在3.4节详细讨论(a)。

3.3.1 负例选择。

我们考虑两个来源的负例:批内负例和随机负例。在选择给定用户的批内负例时,我们选择批内所有正例作为负例,遮蔽对该用户有正参与的Pins。这种方法高效简单,但如果天真地实施,可能会导致流行Pin的降级,因为参与度高的Pin比参与度低的Pin更可能出现为负例。批内负例的另一个缺点是负例的分布与用于检索的真实Pins底层分布不同,导致训练和服务之间的差异。第二个负例来源是我们可能展示给Homefeed的所有Pins语料库中均匀采样的负例,但单独使用这些可能导致模型崩溃,因为负例可能太容易。我们考虑的第三个选项是结合随机和批内负例,通过将批内和随机负例池合并为一个,包含批内和随机负例的组合,以利用两者的独特特征[26]。

在实践中,更大的负例池可以提高学习嵌入的质量,因此我们从训练中使用的所有的GPU中收集负例,选择可以舒适地适应GPU内存的最大可能池。

3.3.2 损失函数。

在选择负例来源后,我们可以为给定的用户和正嵌入配对$(𝑢_𝑖, 𝑝_𝑖)$产生一组负嵌入${𝑛_1, \cdots, 𝑛_𝑁}$。我们为每对计算损失,然后计算加权平均值,使得每个GPU上的批内每个用户都有相等的权重。

我们发现最好的损失函数是采样softmax带logQ修正[2, 27],我们根据给定负例在批中出现的概率对每个logit应用修正。我们还学习一个温度$\tau \in [0.01, \infty)$,限制稳定性的下界。如果我们让$𝑠(𝑢, 𝑝) = ⟨𝑢, 𝑝⟩/𝜏$,一个没有样本概率修正的采样softmax损失将被定义如下:

\[L (𝑢𝑖, 𝑝𝑖) = − \log \frac{𝑒^{𝑠(𝑢𝑖,𝑝𝑖)}}{𝑒^{𝑠(𝑢𝑖,𝑝𝑖)} + \sum_{𝑗=1}^{𝑁} 𝑒^{𝑠(𝑢𝑖,𝑛𝑗)}}\]

…(1)

当负例不是均匀分布时,应应用一个修正项𝑄𝑖(𝑣) = 𝑃 (Pin 𝑣在批中 用户𝑈𝑖在批中)来纠正采样偏差,其中𝑣可能是正例或负例。对于单个配对的带样本概率修正的softmax损失然后被定义如下:
\[L (𝑢𝑖, 𝑝𝑖) = − \log \frac{𝑒^{𝑠(𝑢𝑖,𝑢𝑖)−\log(𝑄𝑖(𝑝𝑖))}}{𝑒^{𝑠(𝑢𝑖,𝑢𝑖)−\log(𝑄𝑖(𝑝𝑖))} + \sum_{𝑗=1}^{𝑁} 𝑒^{𝑠(𝑢𝑖,𝑛𝑗)−\log(𝑄𝑖(𝑛𝑗))}}\]

…(2)

为了简化,我们使用计数-最小草图[5]来近似𝑄。

3.4 训练目标

给定我们的损失函数,我们解决如何选择配对$(𝑢_𝑖, 𝑝_𝑖)$的问题。我们的模型应该能够预测三种形式的正向参与:Repins、Closeups和Clicks。这些动作都有价值,而不是像多任务学习文献[1, 14]中常见的那样学习任务特定的头,我们选择以多任务的方式训练单个嵌入,直接学习一个可以有效检索不同类型的正向参与的嵌入。我们不在损失计算函数中显式地对不同参与进行不同的加权。我们考虑的四个训练目标如下描述,并在图2中描绘。

图片名称

图2

3.4.1 下一个动作预测。

序列建模任务的朴素目标是下一个动作预测,我们给定用户序列$\lbrace 𝐴_𝑇, 𝐴_{𝑇−1}, …, 𝐴_{𝑇−𝑀+1} \rbrace$预测$𝐴_{𝑇+1}$(如果$𝐴_{𝑇+1}$是正向参与)。这个目标对于实时序列模型来说很直观,因为在在线设置中,$𝐴_𝑇$总是用户采取的最新动作。SASRec[10]通过在模型的每一步预测下一个动作,而不仅仅是预测最近的正向参与来扩展这个简单的训练目标。我们在实验中稍微修改这一点,只允许正向参与对模型的损失做出贡献。

与这些传统目标不同,我们的目标不是预测用户的下一个即时动作;相反,我们每天推断用户嵌入,并旨在捕捉用户的长期兴趣。为此,我们引入了两个替代训练目标。

3.4.2 所有动作预测。

基于我们不仅希望预测用户将采取的下一个动作的观察,我们构建了一个朴素的训练目标,使用最终用户嵌入𝑒1预测用户在接下来的𝐾天内将采取的所有动作。假设用户在𝑇+3、𝑇+8和𝑇+12的动作中有正向参与,所有这些都落在𝑇的𝐾天窗口内,我们的目标是从用户序列{𝑎𝑇, 𝑎𝑇−1, …, 𝑎𝑇−𝑆+1}预测所有3个动作:𝐴𝑇+3、𝐴𝑇+8、𝐴𝑇+12。这个目标迫使模型学习长期兴趣,而不仅仅关注用户将采取的下一个动作,这应该减少来自每天离线推断的陈旧性效应。为了计算可行性,我们在这个𝐾天时间窗口中为每个用户随机采样多达32个动作。

3.4.3 密集所有动作预测。

为了进一步提高每批提供的信号,我们从SASRec[10]中汲取灵感,修改所有动作预测目标。我们不是使用只有𝑒1的最新用户嵌入在𝐾天窗口内预测动作,而是选择一组随机索引{𝑠𝑖},并对每个𝑒𝑠𝑖,旨在从接下来𝐾天内所有正向参与的集合中预测一个随机选择的正向参与。为确保这种方法从数据的顺序中学习,我们对transformer的自注意力块应用因果掩蔽,以便每个动作只能关注过去或现在的动作,而不能关注未来的动作。我们观察到这种掩蔽在这项任务上显著提高了模型的性能。为了减少内存使用,我们不旨在预测所有正向参与动作,而只是为每个𝑒𝑠𝑖预测一个正向参与动作。

3.5 数据集设计(续)

我们利用压缩格式来存储训练序列。我们观察到,给定单个用户的时间线,可以构建许多独立的用户序列和正例。给定一个完整的用户序列 ( A_U = {Y_1, \ldots, Y_S} ) 和某个最大序列长度 ( M ),我们可以构建多达 ( S - M - 1 ) 个长度恰好等于 ( M ) 的训练样本(假设所有动作都是正向的)。例如,序列 ({Y_5, \ldots, Y_{5+M-1}}) 以及正参与 ({Y_{5+M}, Y_{7+M}}) 可以从完整的时间线 ( A_U ) 中提取出来。存储这些数据的一种潜在方式是提前具体化所有长度为 ( M )(或更短)的相关序列,以及每个序列对应的未来正参与集合。这在尝试不同的采样策略时会遇到问题,因为调整参数将需要重新生成训练数据——这是一个缓慢的过程。为了提高生产力,我们改为将每个用户的序列存储为数据集中的单行,并在训练期间即时采样示例。这明显的好处是允许在训练期间进行定制采样,但代价是减少了训练数据的混洗。

具体来说,我们使用这种策略调整了几个参数,这些参数都显著影响模型的整体性能:

  • 最大序列长度
  • 从用户时间线中采样的可能用户序列的比例
  • 每个用户采样的最大序列数
  • 每个序列作为标签采样的最大正例数

3.6 模型服务

由于我们专注于PinnerFormer的离线、批量设置中的推理,我们在一个每日增量的工作流程中推断模型,如图3所示。

图片名称

图3

这个工作流程为过去一天与任何Pin互动的用户生成新的嵌入,将它们与前一天的嵌入合并,然后上传到键值特征存储中,以便在线服务。因为我们只为最近一天有互动的用户生成新的嵌入,并且在没有延迟限制的情况下离线运行推理,我们能够使用比否则可能的更大的模型,这增加了我们的嵌入可以捕获的信息量。如果输入特征有任何损坏(例如,由于日志记录错误),我们可以轻松地为自损坏以来更新了嵌入的所有用户运行推理,假设上游数据已经修复,第二天的数据将是正确的。

Pin嵌入的计算成本很低,只需要对现有特征进行小型MLP转换,因此我们每天从头开始生成它们,然后编译一个HNSW[15]图,该图可以使用保存在特征存储中用户嵌入在线查询。

4.

附录

https://arxiv.org/pdf/2205.04507