weixin在《Scenario-Adaptive Feature Interaction for Click-Through Rate Prediction》提出了一种在特征交叉建模中考虑场景信息的方法:SATrans。

一、摘要

传统的点击率(CTR)预测模型通常在单一场景下进行训练和部署。然而,大规模的商业平台通常包含多个推荐场景,其流量特征可能非常不同。最近的研究证明,学习一个统一的模型来服务于多个场景可以有效地提高整体性能。然而,大多数现有方法都各自存在各种限制,例如:区分度建模不足、随着场景增加效率低下、以及缺乏可解释性。更重要的是,据我们所知,现有的多场景建模方法在建模场景差异时没有考虑显式的特征交互(explicit feature interaction),这限制了网络的表现力,从而影响效果。在本文中,我们提出了一个名为SATrans的新型场景自适应特征交互框架(Scenario-Adaptive Feature Interaction framework),将场景差异(scenario discrepancy)建模成特征相关性(feature correlations)模式的差异。具体而言,SATrans建立在Transformer架构上,以学习高阶特征交互,并在自注意力建模中涉及场景信息,以捕捉场景之间的分布变化。我们提供了各种实现我们的框架来提高性能,并在公共和工业数据集上进行实验,结果表明SATrans:

  • 1)显著优于现有的最先进方法进行预测
  • 2)参数效率高,随着场景增加而空间复杂度略微增加
  • 3)在实例级别和场景级别都具有良好的可解释性

我们已经将该模型部署在微信公众号平台上,在三个主要场景中平均在线CTR增加了2.84%。

一、介绍

近年来,多场景点击率(MS-CTR:Multi-Scenario Click-Through Rate)预测[8, 19, 20, 28, 29]已成为在线推荐领域广泛研究的热点,它主要关注于预测在多个场景中的用户-物品对的CTR。在像腾讯和阿里巴巴这样的大型商业公司中,通常存在许多业务场景(例如主页信息流、横幅信息流)[30]。此外,从服务平台收集的日志数据可以根据一些代表性特征(例如性别、国家)分成多个子集。这些子集具有不同的CTR分布,可以被视为场景[29]。不同的场景间可以共享共性(例如重叠的用户或物品、一般性偏好),可以使所有场景的预测受益。同时,用户行为和曝光分布在不同场景下可能会有很大的差异[32]。因此,在估计CTR时建模场景之间的共性和差异非常重要。此外,特征交叉(feature interaction)学习在CTR预测任务中起着至关重要的作用。有效地模拟特征的高阶组合可以提高网络的表达能力,从而有助于提高预测性能[4, 10, 21]。

通常有三种典型的MS-CTR预测方法:

  • (1)利用传统的CTR预测模型[4, 5, 10, 13, 24, 27]和启发式训练策略,例如:为每个场景训练单独的模型、或使用所有场景实例训练共享模型,然后进行微调。这类方法可以自然地继承传统CTR预测模型的所有优点(例如显式特征交互),但它们在知识转移和场景建模方面的能力有限。
  • (2)基于多任务学习(MTL)构建统一框架,将每个场景视为一个任务[2, 8, 20]。这种策略需要为每个场景建立单独的网络模块(例如门控网络、专家或输出塔),随着场景的增加,会消耗过多的参数。更糟糕的是,MTL模型通常将骨干网络或专家网络视为广义深度神经网络(DNN)[11, 17, 22],以位逻辑和隐式方式学习高阶特征交互,受到离散特征交互的梯度不敏感问题的困扰,无法适应POLY函数[14]或简单的点积[16]。尽管可以用因子分解机(FM)[15]或DCN [24]等显式交互模型替换DNN,但特征交互和场景建模的过程是分离的,这限制了模型的可解释性,并可能导致次优的性能。
  • (3)利用辅助编码器(auxiliary encoder)使用场景相关特征作为输入,生成场景自适应单元(SAU),以影响网络[28-30]。这些方法比MTL方法更灵活、参数更有效,可以处理大量场景和多个场景特征字段。然而,这一类现有方法并没有直接、明确地考虑场景特性对特征交互的影响,因此跨场景的特征相关性和组合的差异仍不清楚。

从特征交互的角度来看,来自不同场景的样本可能具有不同的模式。以电子商务推荐为例,性别、位置和品牌可能是三个重要的特征,它们的组合可能会显著影响CTR得分。然而,同一特征组合的重要性在不同场景中是不同的。考虑二阶特征组合,<品牌,位置> 可能对食品推荐场景更有意义,因为用户的食品偏好受地理因素的影响很大,而 <品牌,性别> 在服装推荐中可能更相关,因为这个场景中有特定的性别区分。据我们所知,现有的MS-CTR方法都不能明确地捕捉到这种特征交互的差异,这限制了网络的表达能力,并导致模型的可解释性不足。

为了解决这些限制,本文提出了一种名为Scenario-Adaptive Transformer(SATrans)的MS-CTR预测的显式特征交叉模型,将场景信息纳入特征的相关建模中,以学习每个场景的独特和自适应的高阶特征交互。具体而言,我们利用Transformer [23]作为骨干架构,对输入特征进行高阶交叉和组合建模,该方法已被AutoInt [21]和InterHAt [9]证明是有效的。Transformer中的多头自注意机制允许每个特征字段与所有其他特征交叉,并自动识别相关特征以形成有意义的高阶特征。为了将场景特性纳入特征交叉中,我们:

  • 首先设计了一个场景编码器,将场景相关特征转换为固定长度的场景embedding。
  • 然后利用场景自适应交叉层来测量相关性,使用特征对的embedding和场景embedding作为输入,其中注意力分数通过一个精心设计的场景自适应相关函数计算。

提出的场景自适应自注意机制赋予SATrans许多优点:

  • (1)共性建模:每个交叉层中的共享特征转换矩阵和嵌入层自然地捕捉到共同知识;
  • (2)差异建模:自适应注意力分数编码了场景之间的分布偏移;
  • (3)高可扩展性:网络参数的规模几乎不依赖于场景的数量,使SATrans能够高效地处理数千甚至数百万个场景;
  • (4)良好的可解释性:注意力分数可以衡量特征之间的相关性,提供实例级和场景级的可解释性。

总之,在本文中,我们做出了以下贡献:

  • 我们是第一个从特征交互的角度对MS-CTR预测问题进行建模,并提出了一种新颖的SATrans,它在输入特征上明确地进行场景自适应高阶交叉
  • 我们分别为SATrans设计了三种场景编码器和场景自适应交互模块的实现,相比于基本的自注意力机制,显著提高了特征交互的质量
  • 我们在公共和工业数据集上进行了广泛的实验。在多场景CTR预测任务上的实验结果表明,我们提出的方法不仅在预测方面显著优于现有的最先进方法,而且具有良好的可扩展性和模型可解释性
  • 考虑到MS-CTR预测中开源代码的稀缺性,我们发布了我们模型的实现以及比较基准3,以促进未来的研究

三、问题公式化

点击率(CTR)预测数据集可以表示为:

\[D = \lbrace (𝑥_𝑗,𝑦_𝑗) \rbrace_{j=1}^{|D|}\]

其中:

  • $𝑥_𝑗$和$𝑦_𝑗 \in \lbrace 0,1 \rbrace$:表示第j个样本的特征集和点击label

在现实世界的推荐中,通常存在多个业务场景,这意味着数据集D可以分为多个特定场景的子集 $D^s$(例如:$D = U_s D^s$),其中场景𝑠的子集$D^s= \lbrace(𝑥_𝑖^s,𝑥_i^a,𝑦_𝑖)\rbrace_{𝑖=1}^{\mid D^s \mid}$根据$𝑥_i^s$获得。这里将整个特征集$𝑥_𝑖$分为:

  • 场景相关(scenario-specific)的特征集:$𝑥_𝑖^s$
  • 场景无关(scenario-agnosti)的特征集:$𝑥_𝑖^a$

$𝑥_𝑖^s$中的场景相关特征可以是:业务ID或展示位置ID等上下文特征,也可以扩展为用户配置文件特征(例如,性别,年龄组)或item特征(例如,类别,品牌),这可能会导致不同的行为或曝光分布。将每个场景子集$D^𝑠$拆分为:训练集$D_{train}^s$和测试集 $D_{test}^s$,我们有:$D_{train} = U_s D_{train}^s$和$D_{test} = U_s D_{test}^s$。MS-CTR预测的目标是:基于$D_{train}$构建一个统一的CTR模型,可以为$D_{test}$中的所有场景子集提供准确的CTR预测。

4.方法

4.1 架构总览

为了建模多个场景下特征交互的特殊性,对于MS-CTR预测问题,我们提出了SATrans。

图片名称

图1 SATrans的总体框架。左侧是场景编码器,使用场景相关特征作为输入生成固定大小的嵌入。右侧是由多个SAI层组成的骨干网络。场景编码器和SAI层的实现细节分别在第4.2节和第4.3节中详细说明。

如图1所示,SATrans将基于自注意力的交叉层堆叠作为backbone,并由两个场景相关组件(scenario-specific components):

  • (1) 场景编码器(Scenario Encoder):将特定场景特征转换为固定长度的embedding向量
  • (2) 场景自适应交叉层(Scenario-Adaptive Interaction: SAI layers):通过场景自适应自注意机制进行高阶特征交叉。

给定输入特征集${𝑥_𝑖^s,𝑥_𝑖^a}$,我们首先将其转换为稀疏特征向量:

\[x = [x^s; x^𝑎] = [x_1^s; \cdots; x_𝑀^s; x_1^a; \cdots; x_{𝑁-𝑀}^a]\]

… (1)

其中:

  • 𝑀是场景相关特征(scenario-specific features)的数量
  • 𝑁是所有特征的数量

之后,我们首先将场景相关特征$x^s$输入到场景编码器(scenario encoder)中以获取场景embedding s,然后使用embedding layer将所有特征x投影到相同的低维空间,并获得dense embedding $e = [e_1; \cdots; e_𝑁]$,接着进行多个场景自适应交叉层(scenario-adaptive interacting layers),其中在场景embedding的指导下,通过自注意机制将高阶特征组合在一起。通过堆叠𝑙个交叉层,可以建模多达(𝑙+1)阶的场景自适应特征交叉。最终交叉层的输出被连接,然后经过线性层和sigmoid函数来估计CTR。SATrans的关键在于如何设计有效的场景编码器和场景自适应交互模块。在接下来的部分中,我们将介绍我们提出的方法的详细信息。

图片名称

图2 三种类型的Scenario Encoder

4.2 Scenario Feature Encoder

给定场景相关特征$x^s=[x_1^s;\cdots;x_𝑀^s]$,我们使用一个场景自适应编码器(scenarioadaptive encoder)将场景特征编码为固定长度的场景embedding $s \in R^L$,以指导在每个SAI层中的特征交互,其中维度𝐿取决于SAI层的具体实现。为了提高场景embedding的质量,我们考虑三个信息来源:

  • 1)场景专有信息,区分不同的场景;
  • 2)共享知识,编码场景之间的共性;
  • 3)结构位置,表示场景嵌入在自注意网络中涉及的位置(position)(例如,当前层的深度,查询或键嵌入)。

我们针对不同的信息来源提出了三种实现方式。

  • 独立嵌入(IE: Independent Embedding):该方法首先将场景特征拼接一起稀疏向量$x^𝑠$转换为一个one-hot稀疏特征$x^𝑜$,然后使用嵌入矩阵将其投影到低维向量s中。这种做法将所有场景特征字段的每种可能组合视为一个场景,并使用独立embedding来表示每个场景,这意味着场景之间没有共享知识。更糟糕的是,当特征组合数增加时,嵌入矩阵可能会很大,这将导致参数效率低下和不灵活。

  • 编码网络(EN: Encoding Network):为了更灵活地编码场景特征并涉及共享知识,我们考虑利用共享编码网络来转换场景特征。对于每个场景特征字段,首先使用嵌入矩阵$E_𝑖^s$将稀疏特征向量$x_𝑖^s$投影为低维向量$e_𝑖^s$。我们将每个字段的embedding向量连接起来,得到:$e^𝑠=[e_1^s; e_2^s; \cdots; e_𝑀^s]$,然后通过非线性激活层(例如ReLU [1])将其feed到一个共享的编码网络$𝑓_𝑒(·)$中,以获取最终的场景embedding s。在我们的实验中,我们发现一个简单的矩阵变换已经足够,即:$s=W_𝑠 ReLU(e^𝑠)$。

  • 带有结构位置ID的编码网络(ENP):由于场景embedding在不同的交叉层和backbone自注意力网络中的不同位置(例如,查询或键)上操作,因此生成位置感知的场景嵌入(position-aware scenario embeddings)以提高网络的表达能力是合理的。为此,除了场景特征外,我们还将位置ID作为额外特征馈送到网络中,以为SAI层中的每个结构位置生成唯一的场景embedding。具体而言,我们有:

\[s_{𝑙,ℎ} = W_𝑠 ReLU(Concat(e^𝑠, p_{𝑙,ℎ}))\]

…(2)

其中:

  • $p_{𝑙,ℎ}$是position embedding
  • 𝑙是层深度(layer depth) ID
  • $ℎ \in \lbrace 𝑄,𝐾 \rbrace$

在EN和ENP方案中,每个场景(或场景特征)的单独网络参数只是低维度(在我们的实验中为32)的embedding向量,与每个场景具有独立门控网络、特定专家网络或输出塔的MTL方法相比,这是非常参数有效的,使得SATrans可用于大量场景。我们在实验中比较参数复杂度。在接下来的部分中,我们省略下标𝑙,并使用$s_Q$和$s_K$分别表示查询和键表示的场景嵌入,以简化表示。请注意,对于IE和EN策略,$s_Q=s_K$。

4.3 Scenario-Adaptive Interacting Layer

一旦我们在相同的低维空间中拥有特征embedding: $e=[e1;…;e𝑁]$,和每个交互层中每个位置的场景embedding: $s_{𝑖,𝑗}$,我们就开始建模场景自适应高阶组合特征。假设第𝑖个特征的输入表示为$h_𝑖$,并且在第一个交互层中$h_𝑖=e_𝑖$。

我们首先引入多头自注意机制来确定每个特征组合的重要性。以第𝑖个特征为例,首先,在特定的注意力头ℎ下,第𝑖个特征与第𝑗个特征($𝑖,𝑗 \in \lbrace 1,…,𝑁 \rbrace$)之间的相关性定义为:

\[𝛼_{𝑖,𝑗}^{(ℎ)}=\frac{exp(𝜙(ℎ)(h_𝑖,h_𝑗))}{\sum_𝑘^N exp(𝜙(ℎ)(h_𝑖,h_𝑘))}\]

…(3)

\[𝜙(ℎ)(h_𝑖,h_𝑗)=⟨W_Q^{(ℎ)} h_𝑖, W_K^{(ℎ)} h_𝑗⟩\]

…(4)

其中:

  • $𝜙(ℎ)(·,·)$:是一个attention函数,它定义了在head h下第𝑖个特征和第𝑗个特征之间的未归一化相关性。它可以是一个神经网络或者简单的内积,即⟨·,·⟩。
  • $W_Q^{(h)}, W_K^{(h)} \in R^{𝑑′\times 𝑑}$:是变换矩阵,将原始的embedding空间$R^𝑑$投影到一个新的空间$R^{𝑑′}$。其中$𝑑′=𝑑/𝐻$,𝐻是注意力头的数量。

然后,通过系数$𝛼_{𝑖,𝑗}$聚合其他特征,第𝑖个特征在子空间ℎ中的representation被更新为:

\[\widehat{h}_𝑖^{(ℎ)} = \sum\limits_l^M 𝛼_{𝑖,𝑗}^{(ℎ)} (W_V^{(ℎ)} h_𝑙)\]

…(5)

其中:

  • $W_V^{(ℎ)} \in R^{𝑑′×𝑑}$
  • $\widehat{h}_𝑖^{(ℎ)}$:是在head h下第𝑖个特征及其相关特征的组合。

等式(4)中的相关函数将所有场景的实例视为相同,忽略了不同场景之间的分布差异。为了建模场景之间的分布转移,我们在特征之间的相关系数计算中引入了场景embedding。我们首先将$s_Q、s_K$的场景embedding分成𝐻个部分,即:

\[s_Q=[s_Q^{(1)}, \cdots, s_Q^{(𝐻)}],\\ s_K=[s_K^{(1)}, \cdots, s_K^{(𝐻)}]\]

其中:

  • $s_K^{(h)},s_Q^{(h)} \in R^{𝐿/𝐻}$

然后在head h下改进场景自适应注意力函数,如下所示:

\[𝜙_{𝑠𝑎}^{(ℎ)}(h_𝑖,h_𝑗,s_Q^{(ℎ)},s_K^{(ℎ)})\]

… (6)

现在的问题是:如何设计场景自适应注意力函数$𝜙_{𝑠𝑎}^{(ℎ)}(·,·,·,·)$,它会明显影响交叉质量。基于计算复杂度从低到高的顺序,我们考虑了三种方法,如图3所示。

图片名称

图3 计算scenario-adaptive self-attention的三种策略

SA-Gate(Bit-wise)

SA-Gate是一种直接使用按位转换(bitwise transform)来引入场景embedding的策略是门控机制。具体而言,我们基于场景嵌入生成门控模块,以过滤特征嵌入:

\[𝜙_{𝑠𝑎}^{(ℎ)}(h_𝑖,h_𝑗,s_Q^{(ℎ)}, s_K^{(h)})=⟨\sigma(s_Q^{(h)}) \circ (W_Q^{(h)} h_𝑖), \sigma(s_K^{(h)}) \circ (W_K^{(h)} h_𝑗)⟩\]

…(7)

其中:

  • $\sigma(𝑥)=1/(1+e^{(−𝑥)})$:表示Sigmoid函数
  • $\circ$:表示element-wise乘积

SA-Bilinear(双线性: Bilinear)

这种方法对特征embedding进行双线性变换,由场景感知矩阵S参数化。注意力分数计算为:

\[𝜙_{𝑠𝑎}^{(ℎ)}(h_𝑖,h_𝑗,s_Q^{(ℎ)},s_K^{(ℎ)})=(W_Q^{(ℎ)} h_𝑗)^⊤ S(W_K^{(ℎ)} h_𝑖)\]

…(8)

其中:

  • $S=Reshape(s_Q^{(ℎ)}) \in R^{𝑑×𝑑}$:场景感知矩阵

…(9)

注意:在这种策略中,每层中的$s_Q^{(ℎ)}$和$s_K^{(ℎ)}$是相同的。

SA-MetaNet(非线性)

前两种策略采用按位和双线性变换来引入场景特征,其表达能力有限,可能无法建模场景信息与交互特征之间的复杂关系。为此,我们考虑通过MetaNet机制进行非线性变换,类似于动态权重单元[30]。

以$s_Q^{(ℎ)}$为例,首先将其分成𝑃个slots:$[s_{Q,1}^{(ℎ)};\cdots;s_{Q,𝑃}^{(ℎ)}]$,

生成一个𝑃层Meta Network $𝑓_{s_Q^{(ℎ)}}^m(·)$的投影参数:

\[𝑓_{s_Q^{(ℎ)}}^m=W_1 \sigma(W_2 \sigma(\cdots \sigma(W_𝑃 x)\cdots))\]

其中:

  • $W_𝑝=Reshape(s_{Q,p}^{(ℎ)}),W_𝑝 \in R^{𝑑_{𝑝−1}×𝑑_𝑝}$
  • $𝑑_𝑝$:是第𝑝+1层的输入维度
  • $\sigma$:是非线性激活函数(例如ReLU)

我们使用相同的过程构建$𝑓_{s_K^{(ℎ)}}^m(·)$来处理场景嵌入$s_K^{(ℎ)}$。生成的MetaNet用于在pair-wise交叉前对input特征embedding进行转换。直观地说,$s_Q$和$s_K$的不同slots以及激活函数,可以被视为从低层到高层的场景感知滤波器,对特征嵌入进行处理,赋予网络捕捉场景之间隐含差异的能力。现在,场景自适应注意力得分(scenario-adaptive attention score)计算如下:

\[𝜙_𝑠𝑎^{(ℎ)}(h_𝑖,h_𝑗,s_Q^{(ℎ)},s_K^{(ℎ)})=⟨LN_Q^{(ℎ)}(𝑓_{s_Q^{(ℎ)}}^m (W_Q^{(ℎ)} h_𝑖)), LN_K^{(ℎ)} (𝑓_{s_K^{(ℎ)}}^m (W_K^{(ℎ)} h_𝑗))⟩\]

…(10)

其中:

  • $LN_Q^{(ℎ)}(·)$和$LN_K^{(ℎ)}(·)$:是层归一化层,用于归一化嵌入分布,具有独立的层参数。

我们发现归一化层是必不可少的,因为经过多层非线性变换后,embedding的方差会显著放大,这会严重影响收敛。在实践中,我们将MetaNet与LN层一起移动到多头分区之前,这允许跨不同头部进行信息交互,并在经验上实现了更好的性能。因此,注意力头ℎ下的注意力得分表示为:

\[𝜙_{𝑠𝑎}^{(h)}(h_𝑖,h_𝑗,s_Q,s_K)=⟨[LN_Q(𝑓_{s_Q}^{m}(W_Q h_𝑖))]^h, [LN_K(𝑓_{s_K}^m (W_K h_𝑗))]^ℎ⟩\]

…(11)

其中:

  • $W_Q$和$W_K \in R^{𝑑×𝑑}$:是变换矩阵
  • $[\cdot]^h$:表示分区操作和选择第ℎ个子空间

根据公式5,我们会更新在attention head h下的第𝑖个特征的representation为$\widehat{h}_𝑖^h$,然后将不同子空间的特征聚合如下:

\[\widehat{h}_𝑖 = \widehat{h}_i^1 \oplus \widehat{h}_2^h \cdots \oplus \widehat{h}_𝐻^h\]

… (12)

其中:

  • $\oplus$是concatenation运算符。

接下来,我们使用投影矩阵$W_Agg$将学习到的特征进行转换,并添加标准的残差连接(residual connections)以保留以前学习到的组合特征(combinatorial features),包括原始的个体特征(即一阶特征),接着是一个层归一化层。形式上,第𝑖个特征的输出表示为:

\[h_𝑖^O=LN(W_A \widehat{h}_𝑖 + h_𝑖)\]

…(13)

通过这样一个interacting layer,每个特征表示会被更新到一个新的特征空间中,具有在场景信息的指导下来自其他字段的信息聚合。我们可以堆叠多个这样的层来模拟任意阶的组合特征。我们将最后一层的输出embedding串联起来以获得$h^{Out}=h_1^{Out} \oplus h_2^{Out} … \oplus h_𝑁^{Out}$,并使用带有Sigmoid函数𝜎的线性层来获得最终预测:

\[pCTR=\sigma(W_O h^{Out} +b_O)\]

…(14)

其中:

  • $W_O \in R^{1×𝑁_𝑑}$ 和 $b_O \in R$。

整个网络通过交叉熵损失进行优化。空间和时间复杂度的分析详见附录A。

https://dl.acm.org/doi/pdf/10.1145/3580305.3599936

Vaclav Kosar在《Cross-Attention in Transformer Architecture》这篇文章里提出了一种cross attention方法。其实在很多地方有在用。

介绍

交叉注意力(Cross attention)是:

  • 一种在Transformer架构中的attention机制,可以将两种不同embedding序列进行混合
  • 这两个序列必须具有相同的维度
  • 这两个序列可以是不同的模态(例如文本、图像、声音)
  • 其中一个序列作为Query输入,定义了输出长度。另一个序列则产生Key和Value输入,用于attention计算

交叉注意力机制使得模型能够关注来自两个序列的相关信息,这在图像字幕或多模式机器翻译等任务中非常有用。

Cross-attention应用

Cross-attention vs Self-attention

除了输入之外,cross attention的计算方式与self-attention相同。cross attention以不对称的方式组合了两个相同维度的独立embedding序列,而self-attention的输入是单个embedding序列。其中一个序列作为query输入,而另一个序列作为key和value输入。在SelfDoc中的一种cross attention可选方式是:使用来自一个序列的query和value,而key则来自另一个序列。

前馈层(feed forward layer)与cross-attention相关,不同之处是:前馈层会使用softmax,并且其中一个输入序列是静态的。《[Augmenting Self-attention with Persistent Memory paper]{https://vaclavkosar.com/ml/Feed-Forward-Self-Attendion-Key-Value-Memory}》一文表明,前馈层的计算方式与self-attention相同。

图片名称

图1

Cross-attention算法

  • 假设我们有两个embeddings(token)序列S1和S2
  • 从序列S1中计算键(Key)和值(Value)
  • 从序列S2中计算查询(Queries)
  • 使用Key和Query来计算注意力矩阵(Attention Matrix)
  • 将queries应用于注意力矩阵
  • 输出序列具有与序列S2相同的维度和长度

在一个等式中:

\[softmax((W_Q S_2)(W_K S_1)^T)W_V S_1\]

Cross-attention可选方式

Feature-wise Linear Modulation Layer是一个更简单的可选方式,它不要求:输入必须是个序列,并且是线性计算复杂度的。这可以使用稳定扩散(Stable Diffusion)生成图像。在这种情况下,交叉注意力用于使用文本提示为图像生成器中的UNet层中的变压器进行条件编码。构造函数显示了我们如何使用不同的维度,并且如果您使用调试器逐步执行代码,还可以看到两种模态之间的不同序列长度。

Cross-attention实现

在Diffusers library中的cross attention实现可以使用Stable Diffusion生成图像。在这个case中,cross-attention被用于【使用文本prompt为图像生成器中的UNet层中的condition transformers】。构造函数显示了我们如何使用不同的维度,并且如果您使用调试器逐步执行代码,还可以看到两种模态之间的不同序列长度。

class CrossAttention(nn.Module):
    r"""
    A cross attention layer.

    Parameters:
        query_dim (`int`): The number of channels in the query.
        cross_attention_dim (`int`, *optional*):
            The number of channels in the encoder_hidden_states. If not given, defaults to `query_dim`.
        heads (`int`,  *optional*, defaults to 8): The number of heads to use for multi-head attention.
        dim_head (`int`,  *optional*, defaults to 64): The number of channels in each head.
        dropout (`float`, *optional*, defaults to 0.0): The dropout probability to use.
        bias (`bool`, *optional*, defaults to False):
            Set to `True` for the query, key, and value linear layers to contain a bias parameter.
    """

特别是在这部分中,您可以看到查询(query)、键(key)和值(value)是如何相互作用的。这是编码器-解码器架构,因此query是从encoder的hidden states中创建得到的。

        query = attn.to_q(hidden_states)
        query = attn.head_to_batch_dim(query)

        encoder_hidden_states = encoder_hidden_states if encoder_hidden_states is not None else hidden_states
        key = attn.to_k(encoder_hidden_states)
        value = attn.to_v(encoder_hidden_states)
        key = attn.head_to_batch_dim(key)
        value = attn.head_to_batch_dim(value)

        attention_probs = attn.get_attention_scores(query, key, attention_mask)
        hidden_states = torch.bmm(attention_probs, value)

流行结构中的cross-attention

Transformer Decoder中的cross-attention

图片名称

Stable Diffusion中的cross-attenion

图片名称

Perceiver IO中的Cross-Attention

图片名称

SelfDoc中的Cross-Attention

图片名称

kuaishou在《TWIN: TWo-stage Interest Network for Lifelong User Behavior Modeling in CTR Prediction at Kuaishou》中提出了TWIN的长序列建模方法。

摘要

终身用户行为建模(Life-long user behavior modeling),即从数月甚至数年的丰富历史行为中提取用户的隐藏兴趣,在现代CTR预测系统中起着核心作用。传统算法大多遵循两个级联阶段:一个简单的通用搜索单元(GSU),用于快速和粗略地搜索数万个长期行为,以及一个精确搜索单元(ESU),用于对GSU的少数最终选手进行有效的目标关注(TA)。尽管高效,现有算法大多存在一个关键限制:GSU和ESU之间的目标-行为相关度度量不一致。因此,它们的GSU通常会错过高度相关的行为,但会检索被ESU认为不相关的行为。在这种情况下,ESU中的TA,无论如何分配注意力,都会偏离真实的用户兴趣,从而降低整体CTR预测精度。为解决这种不一致性,我们提出了TWo-stage Interest Network(TWIN),其中我们的Consistency-Preserved GSU(CP-GSU)采用与ESU中TA相同的目标-行为相关度量,使两个阶段成为孪生。具体而言,为了打破TA的计算瓶颈并将其从ESU扩展到GSU,即从行为长度102扩展到长度104-105,我们通过行为特征分割构建了一种新的注意机制。

  • 对于行为的视频固有特征,我们通过高效的预计算和缓存策略计算它们的线性投影。
  • 对于用户-物品交叉特征,我们将每个特征压缩为注意力分数计算中的一维偏置项,以节省计算成本。

两个阶段之间的一致性,加上CP-GSU中有效的TA-based相关度量,为CTR预测的显著性能提升做出了贡献。在快手的460亿规模的真实生产数据集上进行的离线实验和在线A / B测试表明,TWIN优于所有比较的SOTA算法。通过优化在线基础设施,我们将计算瓶颈降低了99.3%,这有助于TWIN在快手上的成功部署,每天为数亿活跃用户提供主要流量服务。

1.介绍

作为中国最受欢迎的短视频分享应用之一,快手强烈依赖于其强大的推荐系统(RS)。每天,RS帮助数亿活跃用户过滤掉数百万个不感兴趣的视频,找到他们感兴趣的内容,留下数十亿的点击日志。这些巨大的数据不仅为RS的训练提供了数据支持,而且推动了技术革命,不断提升了这个平台的用户体验和业务效果。

在现代RS中,一个基本任务是点击率(CTR)预测,旨在预测用户点击一个item/视频的概率[2,10,32]。准确的CTR预测可以指导RS为每个用户提供其喜欢的内容,并将每个视频传递给其感兴趣的受众。为了实现这一目标,CTR模型应该高度个性化,并充分利用稀缺的用户信息。因此,终身用户行为建模,即从丰富的长期历史行为中提取用户的隐藏兴趣,通常作为CTR模型的关键组成部分[7,16,34-36]。

工业终身行为建模算法大多遵循两个级联阶段[19]:(1)通用搜索单元(GSU),对数万个长期行为进行快速粗略搜索,并输出最相关的少数目标行为;(2)精确搜索单元(ESU),对来自GSU的最终候选进行有效的目标关注(TA:Target Attention)。这种两阶段设计的原因有两个原因:

  • 一方面,为了准确捕捉用户的兴趣,TA是强调目标相关行为和抑制目标不相关行为的合适选择
  • 另一方面,TA的高昂计算成本限制了其适用的序列长度最多只有几百个。为此,一个简单快速的GSU作为预过滤器对于截断在短短几个月内就可以轻松达到$10^4-10^5$的工业规模行为序列至关重要。

近年来,出现了许多关于两阶段终身行为建模的新兴研究,它们的主要区别在于GSU策略,即如何粗略选择目标相关行为。例如:

  • SIM Hard [19]:仅从与target item相同的类别中选择行为
  • SIM Soft [19]:通过内积计算预训练item embedding的目标-行为相关度分数,并选择相关度最高的行为
  • ETA:使用局部敏感哈希(LSH)和汉明距离来近似计算相关度分数[3]
  • SDIM:通过多轮哈希碰撞从具有相同哈希签名的行为中采样目标行为,等等。

尽管已经广泛研究,现有的两阶段终身行为建模算法仍然存在一个关键限制:GSU和ESU之间的不一致性(如图11所示)。具体而言,GSU使用的目标-行为相关度量既粗略又与ESU中的TA不一致。因此,GSU可能会错过相关的行为,但会检索被ESU认为不相关的行为,浪费ESU宝贵的计算资源。在这种情况下,ESU中的TA,无论如何分配注意力,都会偏离真实的用户兴趣,从而降低整体CTR预测精度。

为了解决这种不一致性,我们提出了TWIN:TWo-stage Interest Network,用于终身用户行为建模,其中Consistency-Preserved GSU(CP-GSU)采用与ESU中TA相同的目标-行为相关度量,使两个阶段成为孪生。为了将昂贵的TA扩展到CP-GSU中,TWIN通过有效的行为特征分割、简化的TA架构和高度优化的在线基础设施打破了TA的关键计算瓶颈,即所有行为的线性投影。具体而言,对于行为的视频固有特征(例如视频ID、作者、持续时间、主题),这些特征在用户/行为序列之间共享,我们通过高效的预计算和缓存策略加速它们的投影。对于行为的用户-视频交叉特征(例如用户的点击时间戳、播放时间、评分),其中缓存不适用,我们通过将它们的投影压缩为偏置项来简化TA架构。通过优化在线基础设施,我们成功将TA的适用序列长度从ESU中的$10^2$扩展到CP-GSU中的$10^4 ~ 10^5$。两个阶段之间的一致性,加上CP-GSU中有效的基于TA的相关度量,为CTR预测的显著性能提升做出了贡献。

主要贡献:

  • 在我们提出的TWIN中,CP-GSU精确而一致地检索不仅与目标相关,而且ESU认为重要的行为,最大化行为建模的检索效果。据我们所知,我们是第一个成功解决两阶段终身行为建模问题不一致性的团队。
  • 我们通过在快手的460亿规模的工业数据集上进行大量离线实验和在线A/B测试来验证TWIN的有效性。我们通过消融研究验证了我们的有效性,并展示了TWIN带来的显著在线收益。
  • 我们构建了高效的工业基础设施,将TWIN应用于实际在线RS。我们提出了有效的预计算和缓存策略,将TWIN的计算瓶颈,即CP-GSU中行为的线性投影,降低了99.3%,并满足了在线服务系统的低延迟要求。TWIN现已部署在快手的RS上,每天为3.46亿活跃用户的主要流量提供服务。

2.相关工作

我们的工作与两个活跃的研究领域密切相关:CTR预测和长期用户行为建模。

2.1 点击率预测

CTR预测旨在预测用户的个性化兴趣,对于现代RS至关重要。早期的CTR模型是浅层的,主要关注于利用特征交互,例如因子分解机(FM)[22]和场感知因子分解机(FFM)[12]。随着深度学习的成功,深度CTR模型得到广泛研究并成为主流选择。例如,陈等人[2]和张等人[33]首次将深度模型应用于CTR任务。Wide&Deep [5]结合了宽线性模型和深度模型,充分利用特征交互的记忆和深度架构的泛化优势。DeepFM [10]和DCN [26,27]改进了Wide&Deep的宽部分,以增加特征交互能力。xDeepFM [15]和AFM [29]进一步利用类卷积层和注意机制来改进深度部分并提高模型性能。

随着CTR模型变得越来越个性化,用户行为建模,即从历史行为的总结中捕捉用户的隐藏兴趣,成为一个关键模块。由于计算资源的限制,早期的算法大多采用目标无关的方式,因此可以在离线情况下高效地预计算[8,23,31]。为了更好地提取用户对特定item的兴趣,采用了各种TA机制。DIN [36]通过历史行为上的TA表示用户兴趣,强调目标相关行为。DIEN [35]进一步使用ARGRU(经典GRU的基于注意力的变体)引入行为之间的时间关系。DSIN [9]将行为分为多个会话,并在每个会话内进行自注意力计算,以强调会话内关系。MIND [14]和DMIN [30]通过多个向量表示用户兴趣。BST [4]、SASRec [13]和BERT4Rec [24]也使用变压器来提高模型的性能和并行性。

2.2 Long-Term User Behavior Modeling

随着TA和兴趣建模在现代工业RS中的有效性得到确认,研究人员开始对越来越长的行为进行建模。Liu和Zamanian [16]将长期和短期兴趣结合在CTR预测中。MIMN [18]将用户行为存储为用户兴趣中心(UIC)的记忆矩阵,并在新的用户行为到来时更新记忆。然而,MIMN难以扩展到长度超过$10^3$的序列,并为不同的候选项生成相同的记忆矩阵,携带无用的噪声并损害TA。

最近,SIM [19]和UBR4CTR [20,21]引入了两阶段级联框架来解决这些挑战,并在CTR预测中实现了SOTA性能。传统的两阶段算法通常由以下两部分组成:

  • 1)一个简单快速的GSU,从数千个用户行为中检索与目标项最“相关”的item
  • 2)一个注意力ESU,对GSU的最终候选item执行TA

UBR4CTR在其第一阶段中使用BM25作为相关度量。而在原始的SIM中,有两个具有不同GSU设计的实例。SIM Hard的GSU从与目标项相同的类别中选择相关项,而SIM Soft的GSU使用预训练item embedding的内积作为相关度量。尽管两阶段设计迈出了重要一步,但原始的GSU仍面临着高计算负担,并且与ESU具有不同的检索度量,导致两个阶段之间的不一致性。

最近,ETA [3]使用局部敏感哈希(LSH)对由ESU训练的item embedding进行编码,并通过汉明距离(HD)从长期行为中检索相关项。SDIM [1]通过多轮哈希碰撞从具有相同哈希签名的行为项中采样target item,并通过线性聚合这些采样的行为项来获取用户兴趣。ETA和SDIM采用End2End训练是积极的。换句话说,它们的两个阶段共享相同的embedding。然而,在检索策略方面仍存在不一致性,具体而言是网络结构和参数。

在本文中,我们提出将TA结构扩展到GSU,并将embedding和attention参数从ESU同步到GSU,保持端到端训练。结果,在网络结构和模型参数方面实现了一致性,相比于ETA和SDIM,获得了显著的性能提升。我们在表1中详细说明了我们的模型与其他模型的差异。请注意,我们的工作与旨在加速变压器(例如LISA [28])的索引算法不同。它们通过将行为映射到码本并查找距离来近似相关度量计算。而我们的工作以及许多其他两阶段算法使用精确的距离计算,但使用GSU作为预过滤器来减少行为数量。

3 TWIN在快手CTR预测中的应用

首先,在第3.1节中,我们回顾了CTR预测问题的一般基础知识。然后,在第3.2节中,我们描述了快手CTR预测系统的模型架构。接着,在第3.3节中,我们进一步深入探讨了我们提出的保持一致性的终身用户行为建模模块——两阶段兴趣网络(TWIN)。最后,在第3.4节中,我们介绍了必要的加速策略,以确保TWIN成功部署在快手的主流量上。

所使用的符号总结在表2中。

3.1 基础知识

CTR预测的目的是:在给定特定上下文的情况下预测用户点击一个item的概率。准确的CTR预测不仅通过提供首选内容提升用户体验,而且通过吸引感兴趣的受众,有益于内容生产者和平台的业务效益。因此,CTR预测已成为各种工业RS的核心组成部分,特别是像快手这样的短视频推荐平台。

CTR预测通常被公式化为一个二元分类问题,目标是学习一个预测函数 $𝑓: R_d \rightarrow R$,给定:

  • $D=\lbrace (x_1,𝑦_1), \cdots,(x_{\mid D\mid}, 𝑦_{\mid D \mid})\rbrace$: 一个训练数据集。
  • $x_i \in R_d$:是第i个训练样本的特征向量(即用户、item和上下文特征的串联)
  • $𝑦_i \in \lbrace 0,1 \rbrace$:是表示用户是否点击(1)该项或未点击(0)的label

预测的CTR计算公式如下:

\[𝑦^i =\sigma(𝑓(x_𝑖))\]

…(1)

其中:

  • $𝜎(\cdot)$是将𝑓的预测缩放到(0,1)的sigmoid函数

模型的训练通过最小化负对数似然来完成:

\(l(D)=-\frac{1}{|D|} \sum_{𝑖=1}^{|D|} 𝑦_i log(\hat{𝑦}_i)+(1−𝑦_i)log(1−\hat{𝑦}_i)\) … (2)

为简洁起见,当不会引起混淆时,在以下各节中省略训练样本索引𝑖。

3.2 CTR预测的架构

我们现在介绍快手CTR预测系统的架构,详细信息如图2所示。

3.2.1 embedding layer

在底部,我们的模型从一个feature embedding layer开始,它会将训练样本的原始特征转换为embedding向量。

不失一般性,我们假设所有特征在必要的预处理后都是类别型。对于具有词汇表大小为$𝑣_𝐴$的特征𝐴,我们首先将分类信息编码为一个one-hot/multi-hot编码$xA,hot \in {0,1}^{𝑣_𝐴}$。例如:

\[WeekDay=Mon => x_{WeekDay,hot} = [1, 0, 0, 0, 0, 0, 0]^T, \\ Topic={Funny, Pet} => x_{Topic, hot} = [\cdots, 0, 1, 0, \cdots, 0, 1, 0...]^T\]

请注意,在大多数工业系统中,词汇表大小(特别是用户/作者/视频ID的大小)可以轻松扩展到数亿。因此,一种常见的策略是将极高维度的one-hot编码转换为低维度的嵌入向量,

\(x_{A,emb} = 𝐸_𝐴 x_{A,hot}\) …(3)

其中:

  • $𝐸_𝐴 \in R^{𝑑𝐴 \times 𝑣_𝐴}$是特征𝐴的embedding字典
  • $𝑑_𝐴$是embedding维度

在我们的系统中:

  • 对于具有大词汇表的id特征,我们将embedding维度设置为64,
  • 对于其他特征,如视频主题、视频播放时间戳,我们将embedding维度设置为8。

在所有上层中,我们将embedding向量作为输入,因此为简洁起见省略了“emb”下标。

3.2.2 深度网络

我们的CTR预测的总体架构如图2所示。

图2 快手CTR预测系统中的TWIN。与传统的两阶段行为建模算法不同,TWIN在CP-GSU和ESU中采用相同的目标-行为相关度度量,包括相同的网络架构(如左图所示)和相同的参数值(如中下部分所示)。这是具有挑战性的,因为MHTA的计算成本很高,因此只适用于ESU(具有100个行为),而不适用于CP-GSU(具有104个行为)。 我们通过提出以下方法来解决这个挑战:1)高效的特征拆分和投影策略,以不同的方式处理项的固有特征和用户-项交叉特征(如右下图所示);2)简化的目标注意力架构,通过将交叉特征压缩为偏置项来加速目标注意力的效率(如左图所示)。

上层模块由堆叠的神经网络和ReLU组成,作为一个混合器,学习三个中间模块的输出之间的交互作用:

  • TWIN,提出的保持一致性的终身用户行为建模模块,通过两个级联的行为建模子模块提取用户兴趣:
    • 1)保持一致性的一般搜索单元(CP-GSU):从成千上万的长期历史行为中进行粗略搜索,找到100个最相关的行为;
    • 2)精确搜索单元(ESU):对CP-GSU的100个最终选手采用attention机制,捕捉精确的用户兴趣。与通常由“轻量级”GSU和“重量级”ESU组成的传统算法不同,我们提出的CP-GSU采用与ESU相同的相关性评估指标,使得这两个级联阶段成为TWIN。因此,CP-GSU始终检索ESU认为重要的item,最大化了行为建模的效果。
  • 短期行为建模(Short-term behavior modeling):从最近的50个行为中提取用户兴趣。该模块关注用户对最近几天的短期兴趣,是TWIN的强有力补充。
  • 其他任务建模。除了行为建模,我们还将各种其他任务建模的输出连接起来,包括用户的性别、年龄、职业、位置,视频的持续时间、主题、受欢迎程度、质量,以及播放日期、时间戳、页面位置等上下文特征。

3.3 TWIN: 两阶段兴趣网络

我们将提出的算法命名为TWIN,以突出CP-GSU遵循与ESU相同的相关性评估指标。请注意,这种一致性并不是微不足道的,因为:

  • 有效的行为建模算法通常基于多头目标注意力(MHTA)[25],通过强调目标相关行为来精确捕捉用户兴趣。不幸的是,由于计算复杂度高,MHTA适用的行为序列长度大多限制在几百个之内。
  • 为了全面捕捉用户的长期兴趣,CP-GSU应该涵盖最近几个月的用户行为,这可能很容易达到数万个。考虑到在线系统的严格低延迟要求,这个序列长度远远超出了传统MHTA的能力范围。

本节的目的是回答这个关键问题:如何提高MHTA的效率,以便将其从ESU扩展到CP-GSU,或者说从数百个序列长度扩展到至少数万个序列长度?

3.3.1 行为特征分割和线性投影

遵循MHTA [25]的标准符号,我们将长度为𝐿的行为序列$[𝑠_1,𝑠_2,\cdots,𝑠_𝐿]$的特征定义为矩阵𝐾,其中每一行表示一个行为的特征。在实践中,MHTA中注意力得分计算中𝐾的线性投影是阻碍其在极长的用户行为序列上应用的关键计算瓶颈。因此,我们提出以下措施以降低其复杂度。

我们首先将行为特征矩阵𝐾分成两部分:

\(𝐾 ≜ [𝐾_ℎ 𝐾_𝑐] \in R^{𝐿 × (𝐻+𝐶)}\) …(4)

我们将:

  • $𝐾_ℎ \in R^{𝐿×𝐻}$:定义为行为items的固有特征(例如视频id、作者、主题、持续时间),它们独立于特定的用户/行为序列
  • $𝐾_𝑐 \in R^{𝐿×𝐶}$:定义为user-item交叉特征(例如用户点击时间戳、用户播放时间、点击页面位置、用户-视频交互)。这种分割允许高效计算以下线性投影$𝐾_ℎ 𝑊^ℎ$ $和$𝐾_𝑐 𝑊^𝑐$ 。

对于固有特征$𝐾_ℎ$,虽然维度𝐻很大(每个id特征为64),但线性投影实际上并不昂贵。特定项的固有特征在用户/行为序列之间是共享的。通过必要的缓存策略,𝐾ℎ𝑊 ℎ 可以通过查找和聚集过程高效地“计算”。在线部署的详细信息将在第3.4节介绍。 对于用户-项交叉特征𝐾𝑐,缓存策略不适用,因为:1)交叉特征描述了用户和视频之间的交互细节,因此不在用户行为序列之间共享;2)每个用户最多只观看一次视频。也就是说,在投影交叉特征时没有重复计算。因此,我们通过简化线性投影权重来降低计算成本。

对于用户-项交叉特征$𝐾_𝑐$,缓存策略不适用,因为:

  • 1)交叉特征描述了用户和视频之间的交互细节,因此不在用户行为序列之间共享;
  • 2)每个用户最多只观看一次视频。也就是说,在投影交叉特征时没有重复计算。

因此,我们通过简化线性投影权重来降低计算成本。

给定𝐽个交叉特征,每个特征的嵌入维度为8(因为没有具有巨大词汇表大小的id特征)。我们将线性投影简化如下:

\(𝐾_𝑐 𝑊^𝑐 ≜ [𝐾_{𝑐,1} w_1^c, \cdots, 𝐾_{𝑐,𝐽} w_𝐽^c]\) … (5)

其中:

  • $𝐾_{𝑐,𝑗} \in R^{𝐿×8}$: 是𝐾𝑐的第𝑗个交叉特征的按列切片
  • $w_𝑗^c \in R^8$:是其线性投影权重

使用这个简化的投影,我们将每个交叉特征压缩到一个维度,即$𝐾_𝑐 𝑊^𝑐 \in R^{𝐿×𝐽} $ 。请注意,这个简化的投影等价于将$𝑊 _𝑐$ 限制为一个对角块矩阵。

3.3.2 复杂度分析

在传统的MHTA中,线性投影的时间复杂度,即从维度$𝐿×(𝐻+𝐶)$到$𝐿×{d_out}$输出维度的复杂度为𝑂(𝐿×(𝐻+𝐶)×输出维度)。

而在我们的TWIN中的MHTA中,item的固有特征$𝐾_ℎ 𝑊^ℎ$已经预先计算并以𝑂(𝐿)的效率聚合,与维度𝐻无关。而user-item交叉特征$𝐾_𝑐𝑊^𝑐$则被降低为$𝑂(𝐿×𝐶)$的低维计算。 由于𝐶 ≪ 𝐻,且𝐶 ≪ 输出维度,正是这种理论上的加速,使得MHTA在CPGSU和ESU中都能一致地实现。

3.3.3 TWIN中的目标注意力

基于行为的线性投影𝐾ℎ𝑊 ℎ和𝐾𝑐𝑊 𝑐,我们现在定义了目标-行为相关度度量,该度量在CP-GSU和ESU中均匀使用。不失一般性,我们假设用户和目标项之间没有交互,并将目标项的固有特征表示为$q \in R_𝐻$。通过适当的线性投影$𝑊_𝑞$,计算目标项与历史行为之间的相关度分数: $𝜶 ∈ R 𝐿: 𝜶 = (𝐾ℎ𝑊 ℎ ) (q ⊤𝑊 𝑞 ) ⊤ √ 𝑑𝑘

(𝐾𝑐𝑊 𝑐 )𝜷$, (6)

其中$𝑑_𝑘$是查询和键的投影维度。这个相关度分数是通过查询(即目标的固有特征)和键(即行为的固有特征)之间的内积计算的。此外,由于交叉特征被压缩为1维,因此作为偏置项。我们使用𝜷 ∈ R 𝐽作为交叉特征的相对重要性的可学习参数。 在CP-GSU中,这个相关度分数𝜶用于将𝐿 = 104的长期历史行为截断为100个最相关的行为。而在ESU中,我们对最终的100个候选项执行加权平均池化: Attention(q ⊤𝑊 𝑞 , 𝐾ℎ𝑊 ℎ , 𝐾𝑐𝑊 𝑐 , 𝐾𝑊 𝑣 ) = Softmax(𝜶) ⊤𝐾𝑊 𝑣 , (7) 其中𝑊 𝑣是一个投影矩阵。我们稍微滥用了符号,将𝐿 = 100。这个投影𝐾𝑊 𝑣仅在100个行为上执行,因此可以在线高效地进行。我们不需要像计算104个行为的𝜶时那样分割𝐾。 为了共同关注来自不同表示子空间的信息,我们在MHTA中采用了4个头。因此,TWIN的最终输出定义为 TWIN = Concat(head1, …, head4)𝑊 𝑜 , head𝑎 = Attention(q ⊤𝑊 𝑞 𝑎 , 𝐾ℎ𝑊 ℎ 𝑎 , 𝐾𝑐𝑊 𝑐 𝑎 , 𝐾𝑊 𝑣 𝑎 ), 𝑎 ∈ {1, …, 4}, (8) 𝑊 𝑜是一个投影,学习头之间的相对重要性。

google youtube搜索团队在《Regression Compatible Listwise Objectives for Calibrated Ranking with Binary Relevance》中提出了一种RCR方法。

摘要

由于LTR(Learning-to-Rank)方法主要旨在提高ranking质量,因此它们的输出分数在设计上并没有进行比例校准( scale-calibrated)。这从根本上限制了LTR在分数敏感应用(score-sensitive applications)中的使用。虽然有些结合了回归(regression)和排序目标(ranking objective)的简单多目标方法,可以有效地学习比例校准分数(scale-calibrated scores),但我们认为这两个目标不一定兼容,这使得它们之间的权衡不够理想。在本文中,我们提出了一种实用的回归兼容排序(RCR:regression compatible ranking)方法,实现了更好的权衡,其中ranking和regression组件被证明是相互对齐(align)的。虽然同样的思想适用于具有二元(binary)和分级相关性(graded relevance)的排序,但我们在本文中主要关注binary label。我们在几个公共LTR基准测试上评估了所提出的方法,并表明它在回归和排名指标方面始终实现了最佳或有竞争力的结果,并在多目标优化的背景下显著改进了帕累托边界(Pareto frontiers)。此外,我们在YouTube搜索上评估了所提出的方法,并发现它不仅提高了生产环境pCTR模型的ranking质量,还提高了点击预测的准确性。所提出的方法已成功部署在YouTube生产系统中。

1.介绍

LTR(Learning-to-Rank)旨在从训练数据中构建一个排序器(ranker),以便它可以正确地对未见过的对象进行排序。因此,需要ranker在ranking指标(如NDCG)上表现良好。通常情况下,以排序为中心的pairwise或listwise方法(例如RankNet [3]或ListNet [29])比采用pointwise公式的回归方法实现更好的排序质量。

另一方面,这些应用中的现代系统具有多个阶段,下游阶段会消费前面阶段的预测结果。通常希望ranking分数得到很好的校准,并且分布保持稳定。以在线广告为例,需要对pCTR(预测点击率)模型进行良好的校准,因为它会影响下游拍卖和定价模型[6、16、30],尽管广告的最终排序对效果来说最为重要。这表明我们希望ranker不仅在排序指标上表现良好,而且在回归指标上也能够将ranker输出分数校准到某个外部尺度上。流行的回归指标:包括用于分级相关性标签(graded relevance labels)的MSE、和用于二元相关性标签(binary relevance labels)的LogLoss。

毫不奇怪,能力强的ranking方法在regression metrics上会表现差些。因为:

  • 它们的loss函数对于保序(rank-preserving)的分数变换是不变的,并且倾向于学习未经比例校准的回归目标。
  • 这些方法在训练过程中容易出现不稳定,因为所学习的分数可能在连续训练或重新训练中无限发散[30]。

这些因素严重限制了它们在分数敏感应用中的使用。因此,我们别无选择,只能退回到regression-only的方法,即使它们在面向用户的排序指标方面不是最优的。

已经证明,标准的多目标方法可以有效地学习用于ranking的比例校准分数(scale-calibrated scores)[16、25、30、31]。然而,我们认为在这种标准的多目标设置中,regression和ranking目标本质上是相互冲突的,因此最佳权衡可能对其中之一都不理想。在本文中,我们提出了一种实用的回归兼容排序(RCR: regression compatible ranking)方法,其中ranking和regression组件被证明是可以相互对齐的。虽然同样的思想适用于具有二元排序和分级相关性排序,但我们在本文中主要关注二元标签(binary label)。在实证方面,我们在几个公共LTR数据集上进行了实验,并表明所提出的方法在regression和ranking指标方面实现了最佳或竞争结果,并在多目标优化的背景下显著改进了帕累托边界。此外,我们在YouTube搜索上评估了所提出的方法,并发现它不仅提高了生产pCTR模型的ranking能力,还提高了点击预测的准确性。所提出的方法已经在YouTube生产系统中得到了完全部署。

3.背景

学习排序(LTR)关注的问题是:给定一个上下文,学习一个模型来对一个对象列表进行排序。在本文中,我们使用“query”表示上下文,“document”表示对象。在所谓的“打分并排序(score-and-sort)”环境中,学习一个ranker来为每个doc评分,并通过根据分数对docs进行排序来形成最终的ranked list。

更正式地说,假设:

  • $𝑞 \in 𝑄$ 为一个query
  • $𝑥 \in X$ 为一个doc

则打分函数(score function)定义为:

\[𝑠(𝑞, 𝑥; \theta) : 𝑄 \times X → R\]

其中:

  • 𝑄 是query空间
  • X 是doc空间
  • 𝜽 是打分函数𝑠的参数

一个典型的LTR数据集𝐷由表示为元组$(𝑞, 𝑥, 𝑦) \in 𝐷$的样本组成,其中𝑞,𝑥和𝑦分别为query,doc和label。

假设:

  • $q = \lbrace 𝑞 \mid (𝑞, 𝑥, 𝑦) \in 𝐷 \rbrace$:为由𝐷索引的query集合
  • $L_{query}(\theta; 𝑞)$:为与单个查询$𝑞 ∈ 𝑄$相关联的loss函数

根据$L_{query}$的定义方式,LTR技术可以大致分为三类: pointwise, pairwise和listwise。

在pointwise方法中,query loss $L_{query}$表示为共享相同query的doc的loss之和。例如,在LR排序(即使用二元相关性标签的排序)中,每个文档的Sigmoid交叉熵损失(用SigmoidCE表示)定义为:

\[SigmoidCE(𝑠, 𝑦) = −𝑦 log \sigma(𝑠) − (1 − 𝑦) log(1 − \sigma(𝑠))\]

…(1)

其中:

  • $𝑠 = 𝑠(𝑞, 𝑥; \theta)$:是query-doc pair(𝑞,𝑥)的预测分数
  • $\sigma(𝑠) = (1 + exp(−𝑠))−1$:是Sigmoid函数

在文献[30]中表明,SigmoidCE在比例校准方面是可行的,因为当$\sigma(𝑠) \rightarrow E[𝑦 \mid 𝑞, 𝑥]$时,它会达到全局最小值。

在pairwise方法中,query loss $L_{query}$表示为共享相同query的所有doc-doc pair的loss之和。基本的RankNet方法使用pairwise Logistic loss(用PairwiseLogistic表示)[3]:

\[PairwiseLogistic(𝑠_1, 𝑠_2, 𝑦_1, 𝑦_2) = − I(𝑦_2 > 𝑦_1) log \sigma(𝑠_2 − 𝑠_1)\]

…(2)

其中:

  • $𝑠_1$和$𝑠_2$是文档$𝑥_1$和$𝑥_2$的预测分数
  • I是指示函数
  • 𝜎是Sigmoid函数

当$\sigma(𝑠_2 − 𝑠_1) → E[I(𝑦_2 >𝑦_1) \mid 𝑞, 𝑥_1, 𝑥_2]$时,PairwiseLogistic会达到全局最小值,这表明loss函数主要考虑pairwise分数差异,这也被称为平移不变性质(translation-invariant)[30]。

在listwise方法中,query loss $L_{query}$归因于共享相同查询的整个文档列表。流行的ListNet方法使用基于Softmax的Cross Entropy loss(用SoftmaxCE表示)来表示listwise loss[29]:

\[SoftmaxCE(𝑠_{1:𝑁} , 𝑦_{1:𝑁}) = - \frac{1}{C} \sum\limits_{i=1}^N y_i log \frac{exp(s_i)}{\sum\limits_{j=1}^N exp(s_j)}\]

…(3)

其中:

  • 𝑁是list size
  • $𝑠_𝑖$是预测分数
  • $𝐶 = ∑_{𝑗=1}^N 𝑦_𝑗$

在【29】中全局最小值将在以下来实现:

\[\frac{exp(s_i)}{\sum_{j=1}^N exp(s_j)} \rightarrow \frac{E[y_i | q, x_i]}{\sum\limits_{j=1}^N E[y_j | q, x_j]}\]

…(4)

与PairwiseLogistic类似,SoftmaxCE损失是平移不变(translation-invariant)的,并且可能会根据回归指标给出任意更差的分数。

4.REGRESSION COMPATIBLE RANKING

在本节中,我们首先介绍动机,然后正式提出回归兼容排序(RCR)方法。

4.1 动机

文献表明,标准的多目标方法可以有效地学习用于排名的比例校准分数[16、25、30]。以Logistic regression ranking为例,Yan等人将多目标损失定义为SigmoidCE和SoftmaxCE损失的加权和:

\[L_{query}^{MultiObj} (\theta; q) = (1-\alpha) \cdot \sum\limits_{i=1}^N SigmoidCE(s_i, y_i) + \alpha \cdot SoftmaxCE(s_{1:N}, y_{1:N})\]

…(5)

其中:

  • 𝛼 ∈ [0, 1]是权衡权重

为简单起见,我们将这种方法称为SigmoidCE + SoftmaxCE。可以看出,SigmoidCE + SoftmaxCE不再是平移不变的(translation-invariant),并且已被证明对于校准排序(calibrated ranking)是有效的。让我们更深入地了解按照这种简单的多目标公式学习的分数是什么。

给定query 𝑞,设$𝑃_𝑖 = E[𝑦_𝑖 \mid 𝑞, 𝑥_𝑖]$为基于在文档$𝑥_𝑖$条件之上的ground truth点击概率。回想一下,当$\sigma(𝑠_𝑖) → 𝑃_𝑖$时,SigmoidCE会达到全局最小值,这意味着对于SigmoidCE,我们会遵循以下的pointwise学习目标:

\[𝑠_𝑖 \rightarrow log 𝑃_𝑖 − log(1 − 𝑃_𝑖)\]

…(6)

另一方面,当以下公式成立时,SoftmaxCE达到全局最小值:

\[\frac{exp(𝑠_𝑖)}{\sum\limits_{𝑗=1}^𝑁 exp(𝑠_𝑗)} \rightarrow \frac{𝑃_𝑖} {\sum\limits_{𝑗=1}^N 𝑃_𝑗}\]

…(7)

或者等价于:

\[𝑠_𝑖 \rightarrow log 𝑃_𝑖 − log \sum\limits_{𝑗=1}^N 𝑃_𝑗 + log \sum\limits_{𝑗=1}^N exp(𝑠_𝑗)\]

…(8)

其中:

  • log-∑︁-exp项是未知常数,对最终的SoftmaxCE损失的值或梯度没有影响。

在随机梯度下降的背景下,等式(6)和(8)表明,从SigmoidCE和SoftmaxCE组件生成的梯度将分别将分数推向显著不同的目标。这揭示了标准多目标设置中的两个loss本质上是相互冲突的,将无法找到对两者都理想的解决方案。我们如何解决这个冲突呢?

注意到由于$\sigma(𝑠_𝑖)$在pointwise上趋近于$𝑃_𝑖$,如果我们将等式(8)右侧的ground truth概率$𝑃_𝑖$替换为经验近似项$\sigma(𝑠_𝑖)$,并删除常数项,我们正在构建虚拟的logits:

\[𝑠_𝑖' \leftarrow log \sigma(𝑠_𝑖) − log \sum\limits_{𝑗=1}^N \sigma(𝑠_𝑗)\]

…(9)

如果我们进一步在新的 $logits \ 𝑠_i′$上应用SoftmaxCE loss,我们正在建立以下新的listwise学习目标:

\[\frac{exp(𝑠_𝑖')}{\sum\limits_{𝑗=1}^N exp(s_𝑗')} \rightarrow \frac{𝑃_𝑖}{\sum\limits_{𝑗=1}^N 𝑃_𝑗}\]

…(10)

它等价于:

\[\frac{\sigma(𝑠_𝑖)}{\sum\limits_{𝑗=1}^N \sigma(𝑠_𝑗)} \rightarrow \frac{𝑃_𝑖}{\sum\limits_{𝑗=1}^N 𝑃_𝑗}\]

…(11)

很容易看到,等式(6)自动隐含了等式(11),这意味着,作为pointwise regression和listwise ranking目标,它们在实现全局最小值方面是并行对齐的。

4.2 主方法

受上述示例的启发,我们首先定义一种新的listwise交叉熵损失(ListCE),如下所示。

定义1:设𝑁为列表大小,$𝑠_{1:𝑁}$为预测分数,$𝑦_{1:𝑁}$为label。设$𝑇(𝑠):R \rightarrow R+$为分数上的非递减变换(non-decreasing transformation)。使用变换𝑇的ListCE定义为:

\[ListCE(𝑇 , 𝑠_{1:𝑁}, 𝑦_{1:𝑁}) = − \frac{1}{𝐶} \sum\limits_{𝑖=1}^N 𝑦_𝑖 log \frac{𝑇(𝑠_𝑖)}{\sum\limits_{𝑗=1}^N 𝑇(𝑠_𝑗)}\]

…(12)

其中:

  • $𝐶 = \sum\limits_{𝑗=1}^N 𝑦_𝑗$是一个归一化因子

在本文的范围内,我们可以交替使用带有变换𝑇的ListCE,即ListCE(T),或者在没有二义性的情况下使用ListCE。我们立即得到以下命题:

命题1:ListCE(exp)简化为SoftmaxCE。

命题2:当满足以下条件时,ListCE(𝑇)可以达到全局最小值:

\[\frac{𝑇(𝑠_𝑖)}{\sum\limits_{𝑗=1}^N 𝑇 (𝑠_𝑗)} \rightarrow \frac{E[𝑦_𝑖 |𝑞, 𝑥_𝑖]}{\sum\limits_{𝑗=1}^N E[𝑦_𝑗 |𝑞, 𝑥_𝑗]}\]

…(13)

证明。设$\bar{𝑦} = E[𝑦 𝑞, 𝑥]$为query-doc对(𝑞, 𝑥)的期望label。在$(𝑥, 𝑦) \in 𝐷$上应用ListCE损失等价于在期望上将其应用于(𝑥,𝑦)。给定变换𝑇和预测分数$𝑠_{1:𝑁}$,其中$𝑝_𝑖 = \frac{𝑇(𝑠_𝑖)} {\sum_{𝑗=1}^N 𝑇(𝑠_𝑗)}$,我们有:
\[ListCE(𝑇 , 𝑠_{1:𝑁}, 𝑦_{1:𝑁}) = \frac{1} {\sum\limits_{𝑗=1}^N 𝑦_𝑗} \sum\limits_{i=1}^N \bar{y_i} log 𝑝_i\]

…(14)

满足:$\sum_{i=1}^N p_i = 1$.

接着构建以下的Lagrangian的公式化:

\[L (𝑝_{1:𝑁}, \lambda) = \frac{1}{\sum\limits_{𝑗=1}^N \bar{𝑦_𝑗}} \sum\limits_{i=1}^N \bar{𝑦_𝑖} log 𝑝_𝑖 + \lambda ( \sum\limits_{i=1}^N 𝑝_𝑖 1)\]

…(15)

找出等式(14)的极值,接着等价于等式(15)的驻点,它满足:

\[\frac{\partial L (𝑝_{1:𝑁}, \lambda)}{\partial 𝑝_𝑖} = \frac{\bar{𝑦_𝑖}}{𝑝_𝑖 \sum\limits_{𝑗=1}^N \bar{𝑦_j}} + \lambda = 0\]

…(16)

并且:

\[\frac{\partial L (𝑝_{1:𝑁}, \lambda)}{\partial \lambda} = \sum\limits_{𝑖=1}^N 𝑝_𝑖 1 = 0\]

…(17)

注意,等式(16)和(17)给出一个在N+1 unknowns上的关于N+1的系统。很容易看到,相等的解决方案是:

\[p_i = \frac{\bar{y_i}}{\sum_{j=1}^N \bar{y_j}}\]

…(18)

并且\(\lambda=1\)。

这意味着唯的的全局极值在:

\[\frac{𝑇 (𝑠_𝑖)}{\sum_{𝑗=1}^N 𝑇(𝑠_𝑗)} \rightarrow \frac{E[𝑦_𝑖 |𝑞, 𝑥_𝑖]}{\sum\limits_{𝑗=1}^N E[𝑦_𝑗 |𝑞, 𝑥_𝑗]}\]

…(19)

很容易验证这个唯一的全局极值归因于全局最小值,这证明了命题。

在逻辑回归排序(logistic-regression ranking)中,所有标签都是二元化的或在[0,1]范围内。一个自然的点对点目标是SigmoidCE损失。使用SigmoidCE作为点对点组件,然后需要使用Sigmoid函数作为变换,以便可以同时进行优化而不产生冲突。 定义2:适用于逻辑回归排名任务(即使用二元相关标签进行排名)中单个查询的回归兼容排名(RCR)损失定义为:

\[L_{query}^{Compatible} (\theta; 𝑞) = (1 − \alpha) \cdot \sum\limits_{𝑖=1}^N SigmoidCE(𝑠_𝑖 , 𝑦_𝑖) + \alpha \cdot ListCE(\sigma, 𝑠_{1:𝑁}, 𝑦_{1:𝑁})\]

…(20)

其中:

  • \(\sigma\)是sigmoid funciton

为简单起见,我们将这种方法称为SigmoidCE + ListCE(𝜎)。我们有以下命题:

  • 命题3:当$\sigma(𝑠_𝑖) \rightarrow E[𝑦_𝑖 𝑞, 𝑥_𝑖]$时,SigmoidCE + ListCE(𝜎)可以达到全局最小值。
  • 证明:SigmoidCE组件在$\sigma(𝑠_𝑖) \rightarrow E[𝑦_𝑖 \mid 𝑞, 𝑥_𝑖]$时可以达到全局最小值,这意味着:
\[\frac{\sigma(𝑠_𝑖)}{\sum\limits_{𝑗=1}^N \sigma(𝑠_𝑗)} \rightarrow \frac{E[𝑦_𝑖 |𝑞, 𝑥_𝑖]}{\sum\limits_{𝑗=1}^N E[𝑦_𝑗 |𝑞, 𝑥_𝑗]}\]

…(21)

它会最小化ListCE(𝜎)在它的全局最小值上。

#

介绍

字节在《Monolith: Real Time Recommendation System With Collisionless Embedding Table》提出了它们的embedding table实现。

摘要

对于许多依赖于时间敏感客户反馈的业务来说,构建一个可扩展且实时的推荐系统至关重要,例如短视频排序或在线广告。尽管像TensorFlow或PyTorch这样的生产规模深度学习框架被广泛采用,但这些通用框架在推荐场景中的业务需求方面存在多种不足:

  • 一方面,基于静态参数和dense计算调整系统对于具有动态和稀疏特征的推荐是不利的;
  • 另一方面,这些框架设计时将批量训练阶段和服务阶段完全分离,阻止了模型与客户反馈实时互动。

这些问题促使我们重新审视传统方法并探索根本不同的设计选择。在本文中,我们介绍了Monolith1,一个为在线训练量身定制的系统。我们的设计理念受到了我们的应用工作负载和生产环境的观察,这与其他推荐系统有明显的不同。我们的贡献是多方面的:

  • 首先,我们制作了一个无冲突的嵌入表,并进行了诸如可过期嵌入和频率过滤等优化以减少其内存占用;
  • 其次,我们提供了一个具有高容错性的生产就绪在线训练架构;
  • 最后,我们证明了系统可靠性可以与实时学习进行权衡。

Monolith已成功应用于BytePlus Recommend2产品中。

1 引言

过去十年见证了由推荐技术驱动的业务的蓬勃发展。为了追求更好的用户体验,为每个用户实时提供个性化内容是这些商业应用的共同目标。为此,用户最新互动的信息通常被用作训练模型的主要输入,因为它能最好地描绘用户画像,并预测用户的兴趣和未来行为。

深度学习已经在推荐模型中占据主导地位[5, 6, 10, 12, 20, 21],因为海量的用户数据天然适合大规模数据驱动的神经网络模型。然而,在工业级推荐系统中利用深度学习的力量,不断遇到由现实世界用户行为数据的独特特性引发的问题。这些数据在两个方面与用于传统深度学习问题(如语言建模或计算机视觉)的数据截然不同:

  • (1) 特征大多是稀疏的、类别型的并且动态变化的;
  • (2) 训练数据的底层分布是非平稳的,即概念漂移(Concept Drift)[8]

这些差异给从事推荐系统的研究人员和工程师带来了独特的挑战。

1.1 稀疏性和动态性

推荐的数据大多包含稀疏的类别型特征(sparse categorical features),其中一些特征出现的频率很低。将它们映射到高维嵌入空间的常见做法会引发一系列问题:

  • 与单词片段数量有限的语言模型不同,推荐系统中的用户和ranking items的量级要大得多。如此庞大的嵌入表几乎无法适应单个主机内存;
  • 更糟糕的是,随着更多用户和item的加入,嵌入表的大小预计会随着时间增长,而像[1, 17]这样的框架使用固定大小的dense变量来表示嵌入表。

在实践中,许多系统采用低冲突哈希[3, 6]来减少内存占用,并允许ID的增长。这依赖于一个过于理想化的假设,即嵌入表中的ID频率分布均匀,并且冲突对模型质量无害。不幸的是,这对于现实世界的推荐系统很少是真的,其中一小部分用户或item的出现次数明显更多。随着嵌入表大小的自然增长,哈希键冲突的几率增加,导致模型质量恶化[3]

因此,对于生产规模的推荐系统来说,自然需要有能力在其参数中捕获尽可能多的特征,并且还要有能力灵活调整它试图管理的用户和item的数量。

1.2 非平稳分布

视觉和语言模式在几个世纪的时间尺度上几乎不会发展,而对一个话题感兴趣的用户可能在下一分钟就转移他们的热情。因此,用户数据的底层分布是非平稳的,这种现象通常被称为概念漂移[8]。

直观地说,更近期的历史信息可以更有效地预测用户行为的变化。为了减轻概念漂移的影响,服务模型需要尽可能接近实时地从新的用户反馈中更新,以反映用户的最新兴趣。

鉴于这些区别,并观察到我们生产环境中出现的问题,我们设计了一个大规模推荐系统Monolith来解决这些痛点。我们进行了广泛的实验来验证和迭代我们的设计。Monolith能够:

  • (1) 通过设计一个无冲突的哈希表和一个动态特征淘汰机制,为稀疏特征提供完整的表达能力;
  • (2) 通过在线训练,将服务反馈实时循环回训练。

凭借这些架构能力,Monolith在大约相似的内存使用情况下,始终优于采用有冲突的哈希技巧的系统,并实现了最先进的在线服务AUC,而没有过度负担我们服务器的计算能力。

本文的其余部分组织如下。我们首先在第2节详细阐述Monolith如何通过无冲突哈希表和实时训练解决现有挑战的设计细节。第3节将展示实验结果,以及生产测试的结论和对时效性、可靠性和模型质量之间权衡的一些讨论。第4节总结相关工作并与Monolith进行比较。第5节结束本文。

2 设计

Monolith的整体架构通常遵循TensorFlow的分布式Worker-ParameterServer设置(图2)。在Worker-PS架构中,机器被分配不同的角色;Worker机器负责执行图定义的计算,而PS机器存储参数并根据Worker计算的梯度更新它们。

图片名称

图2 Worker-PS架构

在推荐模型中,参数被分为两组:dense和sparse:

  • dense参数是深度神经网络中的权重/变量
  • sparse参数指的是对应稀疏特征的嵌入表

在我们的设计中,dense和sparse参数都是TensorFlow图的一部分,并存储在参数服务器上。

与TensorFlow的密集参数变量类似,我们为稀疏参数设计了一套高效、无冲突且灵活的哈希表操作。作为补充TensorFlow训练和推理分离限制的Monolith,其弹性可扩展的在线训练旨在在短间隔内高效地将参数从【训练-PS】同步到【在线服务-PS】,模型的鲁棒性由容错机制保证。

2.1 哈希表

我们在设计sparse参数表示时的一个首要原则是:避免将不同ID的信息压缩到同一固定大小的嵌入中。使用现成的TensorFlow变量模拟动态大小的嵌入表不可避免地会导致ID冲突,随着新ID的到来和表的增长,这种情况会加剧。

因此,我们没有在变量的基础上构建,而是为我们的sparse参数开发了一个新的键值哈希表

我们的哈希表在底层使用Cuckoo哈希图[16],它支持插入新键而不与现有键冲突。Cuckoo哈希在查找和删除上实现了最坏情况下的𝑂(1)时间复杂度,以及预期的平均𝑂(1)时间复杂度的插入。如图3所示,它维护两个表$𝑇_0,𝑇_1$,具有不同的哈希函数$ℎ_0(𝑥), ℎ_1(𝑥)$,一个元素将被存储在它们中的一个。当尝试将元素𝐴插入$𝑇_0$时,它首先尝试将𝐴放置在$ℎ_0(𝐴)$;如果$ℎ_0(𝐴)$被另一个元素𝐵占用,它会将𝐵从$𝑇_0$中驱逐出去,并尝试使用相同的逻辑将𝐵插入$𝑇_1$。这个过程将重复进行,直到所有元素稳定,或者在插入遇到循环时发生重新哈希

图片名称

图3 布谷鸟哈希(Cuckoo HashMap)

在我们的设计中,内存占用减少也是一个重要考虑因素。简单地将每个新ID插入哈希表会迅速耗尽内存。对真实生产模型的观察导致两个结论:

  • (1) 只出现几次的ID对提高模型质量的贡献有限。一个重要的观察是,ID是长尾分布的,其中流行的ID可能出现数百万次,而不受欢迎的ID出现不超过十次。对应这些不频繁ID的嵌入由于缺乏训练数据而拟合不足,模型将无法基于它们做出良好的估计。归根结底,这些ID不太可能影响结果,因此从这些低频ID中移除不会影响模型质量;
  • (2) 来自遥远历史的陈旧ID很少对当前模型做出贡献,因为它们中的许多从未被访问过。这可能是因为一个不再活跃的用户,或者一个过时的短视频。存储这些ID的嵌入对模型没有任何帮助,只会白白消耗我们的PS内存。

基于这些观察,我们为哈希表设计了几项特征ID过滤启发式方法,以实现更内存高效的实现:

  • (1) 在ID被允许进入嵌入表之前进行过滤。我们有两种过滤方法:首先,我们根据它们出现的次数在它们被插入为键之前进行过滤,出现次数的阈值是一个可调的超参数,每个模型各不相同;此外,我们使用概率过滤器进一步减少内存使用;
  • (2) ID被定时,并在一定时间内不活跃后被设置为过期。过期时间也是每个嵌入表可调的,以允许区分对历史信息敏感度不同的特征。

在我们的实现中,哈希表被实现为TensorFlow资源操作。与变量类似,查找和更新也被实现为原生TensorFlow操作,以便于集成和更好的兼容性。

2.2 在线训练

在Monolith中,训练被分为两个阶段(图1):

图片名称

图1 Monolith在线训练架构

  • (1) 批量训练阶段。这个阶段作为一个普通的TensorFlow训练循环工作:在每个训练步骤中,训练工作器从存储中读取一小批训练样本,从PS请求参数,计算前向和反向传播,最后将更新后的参数推送到training PS。与其他常见的深度学习任务略有不同,我们只对数据集进行一次遍历的训练。批量训练对于我们在修改模型架构并重新训练模型时训练历史数据很有用;
  • (2) 在线训练阶段。模型部署到在线服务后,训练不会停止,而是进入在线训练阶段。训练工作器不是从存储中读取小批量样本,而是实时消费实时数据并更新training PStraining PS定期将参数同步到serving PS,这将立即在用户端生效。这使我们的模型能够根据用户的反馈实时互动适应。

2.2.1 流式引擎

Monolith构建了无缝切换批量训练和在线训练的能力。这是通过我们设计的流式引擎实现的,如图4所示。 在我们的设计中,我们使用一个Kafka队列来记录用户的行为(例如点击一个项目或喜欢一个项目等),另一个Kafka队列用于特征。引擎的核心是一个Flink流式作业在线特征Joiner。在线Joiner将特征与用户行为的标签连接起来,生成训练样本,然后写入Kafka队列。训练样本队列被在线训练和批量训练都消费:

图片名称

图4 Streaming Engine

  • 对于在线训练,训练工作器直接从Kafka队列读取数据;
  • 对于批量训练,数据转储作业首先将数据转储到HDFS;在HDFS中累积了一定量的数据后,训练工作器将从HDFS检索数据并执行批量训练

training PS中更新的参数将根据参数同步计划推送到serving PS。

2.2.2 在线Joiner

在现实世界的应用中,用户行为日志和特征是无时间顺序保证地流式传输到在线Joiner(图5)。因此我们使用每个请求的唯一键,以便用户行为和特征能够正确配对。用户行为的延迟也可能是一个问题。例如,用户可能在几天前他们被展示的项目后决定购买。这对于Joiner来说是一个挑战,因为如果所有特征都保留在缓存中,它将无法适应内存。在我们的系统中,使用磁盘上的键值存储来存储等待超过一定时间周期的特征。当用户行为日志到达时,它首先查找内存缓存,如果缓存缺失,则查找键值存储

图片名称

图5 Online Joiner

在现实世界的应用中出现的另一个问题是,负样本和正样本的分布高度不均匀,前者的数量可能比后者高几个数量级。为了防止正样本被负样本淹没,一个常见的策略是进行负采样。这肯定会改变训练模型的底层分布,将其调整为更高概率的正预测。作为补救措施,我们在服务期间应用对数几率校正[19],确保在线模型是原始分布的无偏估计器。

2.2.3 参数同步

在在线训练期间,Monolith训练集群不断从在线服务模块接收数据并更新training PS上的参数。使在线serving PS能够从这些新训练的参数中受益的一个关键步骤是:同步更新的模型参数。在生产环境中,我们遇到了几个挑战:

  • 在线serving PS上的模型在更新时不能停止服务。我们生产中的模型通常有数TB的大小,因此替换所有参数需要一段时间。在替换过程中停止在线PS服务模型是不可接受的,更新必须即时进行
  • 从training PS到在线serving PS传输数TB的模型将对网络带宽和PS上的内存造成巨大压力,因为这需要双倍的模型大小内存来接受新到达的模型。

为了使在线训练能够扩展到我们业务场景的规模,我们设计了一种增量式的即时定期参数同步机制,基于我们模型的几个显著特征:

  • (1) sparse参数主导了推荐模型的大小;
  • (2) 给定一个短时间窗口,只有一小部分ID会被训练,它们的embedding会被更新;
  • (3) dense变量的变动速度远慢于sparse嵌入。这是因为:在基于动量的优化器(momentum-based optimizers)中,dense变量的动量积累被推荐训练数据的庞大size所放大,而单个数据批次中只有少数sparse嵌入接收更新

(1) 和 (2) 允许我们利用所有特征ID的sparse更新。在Monolith中,我们维护一个被触摸键(touched keys)的哈希集合,代表自上次参数同步以来embedding中被训练的ID。我们以分钟级别的时间间隔将被触摸键集中的稀疏参数子集从training PS推送到在线serving PS。这种相对较小的增量参数更新包对网络传输来说很轻,并且在同步过程中不会导致内存急剧增加。

我们还利用 (3) 进一步减少网络I/O和内存使用,通过为稀疏参数设置更积极的同步计划,而不太频繁地更新密集参数。这可能会导致我们服务的dense参数与sparse部分相比是相对陈旧的版本。然而,由于 (3) 中提到的原因,这种不一致是可以容忍的,因为没有观察到明显的损失

图片名称

图6 DeepFM架构

2.3 容错性

作为一个生产系统中的系统,Monolith被设计为在PS(Parameter Server)失败时能够恢复。容错的一个常见选择是:定期对模型的状态进行快照,并在检测到PS故障时从最新的快照中恢复。快照频率的选择有两个主要影响:

  • (1) 模型质量。直观上,随着快照频率的增加,模型质量受到近期历史丢失的影响较小。
  • (2) 计算开销。对多TB模型进行快照并非没有成本。它会产生大量的内存复制和磁盘I/O。

作为模型质量和计算开销之间的权衡,Monolith每天都会对所有training PS进行快照。尽管在故障情况下PS会丢失一天的更新,但我们通过实验发现性能下降是可以接受的。我们将在下一节分析PS可靠性的影响。

3 评估

为了更好地理解我们提出的设计带来的益处和权衡,我们在生产规模上进行了一系列实验,并使用实时服务流量进行了A/B测试,以从不同方面评估和验证Monolith。我们希望通过实验回答以下问题:

  • (1) 无冲突哈希表能带来多少好处?
  • (2) 实时在线训练有多重要?
  • (3) 在大规模生产场景中,Monolith的参数同步设计是否足够健壮?

在本节中,我们首先介绍我们的实验设置,然后详细讨论结果和我们的发现。

3.1 实验设置

3.1.1 嵌入表

如第2.1节所述,Monolith中的嵌入表实现为无冲突哈希表。为了证明避免嵌入表中冲突的必要性并量化我们无冲突实现的收益,我们在Movielens数据集和我们的内部生产数据集上分别进行了两组实验:

(1) MovieLens ml-25m数据集[11]。这是一个标准的公共电影评分数据集,包含约2500万个评分,涉及约162000名用户和62000部电影。

  • 标签预处理。原始标签是0.5到5.0的评分,而在生产中我们的任务大多是接收用户的二元信号。为了更好地模拟我们的生产模型,我们将刻度标签转换为二元标签

(2) 内部推荐数据集。我们还在生产环境中的推荐模型上进行了实验。这个模型通常遵循多塔架构,每个塔负责学习预测一种专门的用户行为。

  • 每个模型大约有1000个嵌入表,嵌入表的大小分布非常不均匀;
  • 嵌入表的原始ID空间是$2^{48}$。在我们的基线中,我们应用了一种哈希技巧,通过分解来限制嵌入表的大小。具体来说,我们使用两个较小的嵌入表而不是一个巨大的表来为每个ID生成一个唯一的嵌入,通过向量组合:
\[ID_r = ID\ \% \ 2^{24} \\ ID_q = ID\ / \ 2^{24} \\ E = \mathbf{E}_{\text{l}} + \mathbf{E}_{\text{q}}\]

其中:

  • $E_l$, $E_q$ :分别对应于 $I_l$, $I_q$ 的嵌入。

这有效地将嵌入表的大小从$2^{48}$减少到$2^{25}$;

  • 这个模型正在实时生产中服务,这个实验的性能是通过在线AUC和实时服务流量来衡量的。

3.1.2 在线训练

在在线训练期间,我们以分钟级别的间隔用最新的参数集更新我们的在线serving PS。我们设计了两组实验来验证模型质量和系统鲁棒性。

(1) 更新频率。为了调查分钟级更新频率的必要性,我们进行了实验,以不同的间隔从训练模型同步参数到预测模型。

我们使用的是Criteo Display Ads Challenge数据集,这是一个大规模的标准数据集,用于基准测试CTR模型。它包含了7天按时间顺序排列的数据记录特征和点击行为。在这个实验中,我们使用了一个标准的DeepFM模型,如第6节所述。为了模拟在线训练,我们对数据集进行了以下预处理。我们从数据集中取出7天的数据,并将其分为两部分:5天的数据用于批量训练,2天的数据用于在线训练。我们进一步将2天的数据按时间顺序分成N个片段。在线训练通过算法1模拟。因此,我们模拟了以数据片段数量确定的时间间隔将训练参数同步到在线serving PS的过程。我们尝试了N = 10, 50, 100,大致对应于5小时、1小时和30分钟的更新间隔。

图片名称

算法1

(2)实时实验。此外,我们还进行了一个实时实验,使用真实的服务流量进一步展示在线训练在现实世界应用中的重要性。这个A/B实验比较了我们的一个生产广告模型中的在线训练和批量训练。

3.2 结果和分析

3.2.1 嵌入冲突的影响

来自MovieLens数据集和内部推荐数据集的结果都显示,嵌入冲突会危及模型质量。

图片名称

图7 DeepFM模型在MovieLens数据集上的embedding冲突的效果

(1)无冲突哈希表的模型始终优于有冲突的模型。这一结论无论在以下情况下都成立:

  • 训练周期数量的增加。如图7所示,无冲突嵌入表的模型从第一个周期开始就有更高的AUC,并在更高的值处收敛;
  • 由于概念漂移,分布随时间的变化。如图8所示,无冲突嵌入表的模型也随着时间的推移和用户/项目上下文的变化而保持稳健。

图片名称

图8 在生产环境下推荐模型的embedding冲突效果

(2)由无冲突嵌入表引起的数据稀疏性不会导致模型过拟合。如图7所示,无冲突嵌入表的模型在收敛后不会过拟合。

3.2.2 在线训练:

实时性与可靠性的权衡。我们发现,更高的参数同步频率总是有助于提高在线服务AUC,并且在线服务模型对PS(Parameter Server)部分数据丢失的容忍度超出我们的预期。

(1)参数同步频率的影响。在我们使用Criteo Display Ads Challenge数据集进行的在线流式训练实验中,模型质量随着参数同步频率的增加而持续提高,这可以从两个角度明显看出:

图片名称

图9 在Criteo数据集上Online training vs. Batch training,蓝线:online training模型的AUC;黄线:batch training模型的AUC

  • 进行在线训练的模型比没有进行在线训练的模型表现更好。图9a、9b、9c比较了在线训练模型按后续数据片段评估的AUC与批量训练模型按每个数据片段评估的AUC;
  • 参数同步间隔较小的模型比间隔较大的模型表现更好。图10和表2比较了同步间隔为5小时、1小时和30分钟的模型的在线服务AUC。

图片名称

图10 online training中不同同步间隔的比较

在生产环境中,在线训练与批量训练的实时A/B实验也显示在线服务AUC有显著提升(表3)。

受此观察启发,我们将稀疏参数尽可能频繁地同步到生产模型的serving PS(目前是分钟级),以忍受计算开销和系统可靠性的程度。回想第2.2.3节中提到的密集变量需要较不频繁的更新,我们每天更新它们。这样做,我们可以将计算开销降到非常低的水平。假设每分钟有100,000个ID更新,嵌入的维度是1024,需要传输的总数据大小是4KB × 100,000 ≈ 400MB每分钟。

对于密集参数,由于它们是每天同步的,我们选择在流量最低的时候(例如午夜)安排同步。(2)PS可靠性的影响。在分钟级参数同步的情况下,我们最初期望更频繁地对training PS进行快照以匹配实时更新。令人惊讶的是,我们将快照间隔扩大到1天,仍然几乎观察不到模型质量的损失。

在个性化排序系统中,找到模型质量和计算开销之间的正确权衡是困难的,因为用户对推荐质量非常敏感。传统上,大规模系统倾向于为它们的模型设置频繁的快照计划,以牺牲计算资源为代价,以最小化模型质量的损失。我们也在这方面做了很多探索,令人惊讶的是,模型质量比预期的更稳健。在PS机器每天有0.01%的故障率的情况下,我们发现前一天的模型出奇地好用。这个可以通过以下计算来解释:假设一个模型的参数分布在1000个PS上,并且它们每天快照一次。鉴于0.01%的故障率,每10天就会有其中一个故障,我们失去了这个PS上一天的所有更新。假设日活跃用户(DAU)为1500万,用户ID在每个PS上均匀分布,我们每10天就会失去来自15000用户的一天反馈。这是可以接受的,因为:

-(a)对于用户特定的稀疏特征,这相当于失去了0.01% DAU的微小部分; -(b)对于密集变量,由于它们更新缓慢,如我们在2.2.3节中讨论的,失去1000个PS中一天的更新是微不足道的。

基于上述观察和计算,我们大幅降低了快照频率,从而节省了大量的计算开销。

4 相关工作

自从深度学习在工业级推荐系统中最早成功应用以来[6, 10],研究人员和工程师一直在采用各种技术来改善第1节中提到的问题。

为了解决稀疏特征表示的问题,[3, 6]使用固定大小的嵌入表和哈希技巧。还有尝试改进哈希以减少冲突[3, 7]。其他工作直接使用原生键值哈希表,以允许表大小的动态增长[12, 15, 20, 21]。这些实现基于TensorFlow,但依赖于特别设计软件机制[14, 15, 20]或硬件[21]来访问和管理它们的哈希表。与这些解决方案相比,Monolith的哈希表是另一种原生TensorFlow操作。它对开发者友好,具有更高的跨平台互操作性,适合ToB场景。与TensorFlow的有机紧密集成还使得计算性能的优化更容易。

弥补训练和部署之间的差距和缓解概念漂移[8]是另一个感兴趣的话题。为了支持在线更新并避免内存问题,[12]和[20]设计了特征逐出机制,以灵活调整嵌入表的大小。[12]和[14]都支持某种形式的在线训练,其中学习到的参数与传统批量训练相比,以相对较短的时间间隔同步到服务,具有容错机制。Monolith采取了类似的方法来弹性地接纳和逐出特征,同时它有一个更轻量级的参数同步机制来保证模型质量。

参考