PNN是上海交大Yanru Qu等人提出的:

一、介绍

使用在线广告中的CTR预估做为示例来建模和探索对应的metrics效果。该任务会构建一个预测模型来估计用户在给定上下文上点击一个特定广告的概率。

每个数据样本包含了多个field的类别数据,比如:User信息(City, Hour等),Publisher信息(Domain、Ad slot,等),以及广告信息(Ad creative ID, Campaign ID等)。所有这些信息都被表示成一个multi-field的类别型特征向量,其中每个field(比如:City)是一个one-hot编码的向量。这种field-wise one-hot编码表示可以产生高维且稀疏的特征。另外,field间还存在着局部依赖(local dependencies)和层级结果(hierarchical structures)。

他们探索了一个DNN模型来捕获在multi-field类别型数据中的高阶隐模式(high-order letent patterns)。并想出了product layer的想法来自动探索特征交叉。在FM中,特征交叉通过两个特征向量的内积(inner-product)来定义。

提出的deep-learning模型称为“PNN (Productbased Neural Network)”。在本部分,会详细介绍该模型以及它的两个变种:IPNN(Inner Product-based Neural Network)、OPNN(Outer Product-based Neural Network);其中IPNN具有一个inner-product layer,而OPNN则具有一个outer-product layer。

1.1 PNN

图1: PNN

PNN模型的结构如图1所示。从上到下看,PNN的输出是一个实数值 \(\hat{y} \in (0, 1)\),作为预测CTR:

\[\hat{y} = \sigma(W_3 l_2 + b_3)\]

…(1)

其中,\(W_3 \in R^{1 \times D_2}\) 和 \(b_3 \in R\)是output layer的参数,\(l_2 \in R^{D_2}\)是第二个hidden layer的output,\(\sigma(x)\)是sigmoid激活函数:\(\sigma(x) = 1/(1+e^{-x})\)。其中,我们使用\(D_i\)来表示第i个hidden layer的维度。

第二个hidden layer的输出\(l_2\)为:

\[l_2 = relu(W_2 l_1 + b_2)\]

…(2)

其中\(l_1 \in R^{D_1}\)是第一个hidden layer的输出。relu的定义为:\(relu(x)=max(0,x)\)。

第一个hidden layer是fully_connected product layer。它的输入包含了线性信号\(l_z\)和二阶信号\(l_p\)。\(l_1\)的定义如下:

\[l_1 = relu(l_z + l_p + b_1)\]

…(3)

其中所有的\(l_z, l_p, b_1 \in R^{D_1}\)。

接着,定义tensor的内积(inner product)操作:

\[A \odot B \triangleq \sum_{i,j} A_{i,j} B_{i,j}\]

…(4)

内积会首先对A, B进行element-wise乘积,接着对这些element-wise乘积进行求和得到一个标量(scalar)。之后,\(l_z\)和\(l_p\)会分别通过z和p进行计算:

\[l_z = (l_z^1, l_z^2, ..., l_z^n, ..., l_z^{D_1}), l_z^n = W_z^n \odot z\] \[l_p = (l_p^1, l_p^2, ..., l_p^n, ..., l_p^{D_1}), l_p^n = W_p^n \odot p\]

…(5)

其中\(W_z^n\)和\(W_p^n\)是在product layer中的weights,它们的shapes分别由z和p决定。

通过引入一个”1”常量信号,product layer不仅能生成二阶信号p,也能管理线性信号z,如图1所示。更特殊地:

\[z = (z_1, z_2, ..., z_N) \triangleq (f_1, f_2, ..., f_N)\]

…(6)

\[p = \{ p_{i,j} \}, i=1...N, j=1...N\]

…(7)

其中\(f_i \in R^M\)是field i的embedding vector。\(p_{i,j} = g(f_i, f_j)\)定义了pairwise特征交叉。通过为g设计不同的操作,我们的PNN模型具有不同的实现。在该paper中提出了两个PNN的变种:IPNN和OPNN。

field i的embedding vector:\(f_i\),是embedding layer的ouput:

\[f_i = W_0^i x [start_i : end_i]\]

…(8)

其中x是包含了多个field的输入特征向量,\(x[start_i:end_i]\)表示embedding layer的参数,\(W_0^i \in R^{M \times (end_i - start_i + 1)}\)是与第i个field进行fully_connected。

最后,会使用监督学习来最小化logloss:

\[L(y, \hat{y}) = -y log \hat{y} - (1-y) log(1-\hat{y})\]

…(9)

其中,y是ground truth(1为click,0为non-click),\(\hat{y}\)是我们模型在等式(1)中的预测CTR。

1.2 IPNN

基于内积的神经网络(IPNN)中,我们首先定义了pair-wise特征交叉作为向量内积: \(g(f_i, f_j) = \langle f_i, f_j \rangle\)。

有了常数信号”1”,线性信息z会被保留:

\[l_z^n = W_z^n \odot z = \sum_{i=1}^{N} \sum_{j=1}^{M} (W_z^n)_{i,j} z_{i,j}\]

…(10)

对于二阶信号p,pairwise的内积项\(g(f_i,f_j)\)形成了一个二阶矩阵\(p \in R^{N \times N}\)。回顾下公式(5)的定义,\(l_p^n = \sum_{i=1}^{N} \sum_{j=1}^{N} (W_p^n)_{i,j} p_{i,j}\)和向量内积的交换律,p和\(W_p^n\)是对称的。

这样的pairwise连接扩展了神经网络的能力(capacity),但也极大地增了了复杂性。在这种情况下,在等式(3)中描述的\(l_1\)的公式,具有\(O(N^2(D_1+M))\)的空间复杂度,其中\(D_1\)和M是关于网络结构的超参数,N是input fields的数目。受FM的启发,我们提出矩阵因子分解(matrix factorization)的思想来减小复杂度。

通过引入假设\(W_p^n = \theta^n \theta^{nT}\),其中\(\theta^n \in R^N\),我们可以将\(l_1\)简化成:

\[W_p^n \odot p = \sum_{i=1}^N \sum_{j=1}^N \theta_i^n \theta_j^n \langle f_i, f_j \rangle = \langle \sum_{i=1}^N \delta_{i}^n, \sum_{i=1}^N \delta_i^n \rangle\]

…(11)

其中,出于便利,我们使用\(\delta_i^n \in R^M\)来表示一个特征向量\(f_i\)通过\(\delta_i^n\)来加权,例如,\(\delta_i^n = \delta_i^n f_i\)。以及我们也有\(\delta^n = (\delta_1^n, \delta_2^n, ..., \delta_i^n, ..., \delta_N^n) \in R^{N \times M}\)

在第n个单个结点上进行1阶分解,我们给出了\(l_p\)的完整形式:

\[l_p = (| \sum_i \delta_i^1 |, ..., | \sum_i \delta_i^n |, ..., | \sum_i \delta_i^{D_1} |)\]

…(12)

通过在公式(12)中的\(l_p\)的reduction,\(l_1\)的空间复杂度变成\(O(D_1 M N)\)。总之,\(l_1\)复杂度从二阶降至线性(对N)。这种公式对于一些中间结果可以复用。再者,矩阵操作更容易在GPU上加速。

更普通的,我们讨论了\(W_p^n\)的K阶分解。我们应指出\(W_p^n = \delta_n \delta_n^T\)只对该假设进行一阶分解。总的矩阵分解方法可以来自:

\[W_p^n \odot p = \sum_{i=1}^N \sum_{j=1}^N \langle \delta_n^i, \delta_n^j \rangle \langle f_i, f_j \rangle\]

…(13)

在这种情况下,\(\theta_n^i \in R^K\)。这种通用分解具有更弱的猜想,更具表现力,但会导至K倍的模型复杂度。

1.3 OPNN

向量的内积采用一对向量作为输入,并输出一个标量。不同于此,向量的外积(outer-product)采用一对向量,并生成一个矩阵,在该部分,我们讨论了OPNN。

在IPNN和OPNN间的唯一区别是,二次项p。在OPNN,我们定义了特征交叉:\(g(f_i, f_j) = f_i f_j^T\)。这样对于在p中的每个元素,\(p_{i,j} \in R^{M \times M}\)是一个方阵(square matrix)。

为了计算\(l_1\),空间复杂度是\(O(D_1 M^2 N^2)\),时间复杂度也是\(O(D_1 M^2 N^2)\)。回顾下\(D_1\)和M是网络结构的超参数,N是input fields的数目,实际上该实现很昂贵。为了减小复杂度,我们提出了superposition的思想。

通过element-wise superposition,我们可以通过一个大的step来减小复杂度。特别的,我们重新定义了p公式:

\[p = \sum_i^N \sum_i^N f_i f_j^T = f_{\sum} (f_{sum})^T, f_{\sum} = \sum_{i}^N f_i\]

…(14)

其中\(p \in R^{M \times M}\)变成对称的,这里的\(W_p^n\)也应是对称的。回顾下公式(5) \(W_p \in R^{D_1 \times M \times M}\)。在这种情况下,空间复杂度\(l_1\)变成了\(O(D_1 M(M+N))\),时间复杂度也是\(O(D_1 M(M+N))\).

对比起FNN,PNN具有一个product layer。如果移除product layer的了\(l_p\)部分,PNN等同于FNN。有了内积操作,PNN与FM相当相似:如果没有hidden layer,并且output layer只是简单地使用weight=1进行求和,PNN等同于FM。受Net2Net的启发,我们首先训练了一个PNN来作为初始化,接着启动对整个网络的back propagation。产生的PNN至少和FNN或FM一样好。

总之,PNN使用product layers来探索特征交叉。向量积可以看成是一系列加法/乘法操作。内积和外积只是两种实现。事实上,我们可以定义更通用或复杂的product layers,来在探索特征交叉上获取PNN更好的capability。

类似于电路,加法就像是”OR”门,而乘法则像”AND”门,该product layer看起来是学习规则(rules)而非特征(features)。回顾计算机视觉方法,在图片上的象素是真实世界中的原始特征(raw features),在web应用中的类别型数据是人工特征(artificial features)具有更高级和丰富的含义。Logic在处理概念、领域、关系上是一个很强的工具。这样我们相信,在神经网络中引入product操作,对于建模multi-field categorical data方面会提升网络能力。

实验

详见paper。

参考

我们来看下criteo公司的Flavian Vasile提出的《Meta-Prod2Vec Product Embeddings Using Side-Information for Recommendation》:

1.介绍

Prod2Vec算法只使用由商品序列(product sequences)确立的局部商品共现信息来创建商品的distributed representations,但没有利用商品的元信息(metadata)。Prod2Vec的作者提出了一个算法扩展:以序列结构的方式利用上下文内容信息,但该方法只针对文本元信息,产生的结构是层次化的,因而会缺失一些side informations项。我们结合了在推荐上的工作,使用side information并提出了Meta-Prod2Vec,它是一个通用方法,可以以一种很简单高效的方法,来增加类别型(categorical) side information到Prod2vec模型中。将额外项信息作为side information的用法(例如:只在训练时提供),受推荐系统在实时打分时要保存的特征值数量限制的启发。这种情况下,只在训练时使用的metadata,当提升在线效果时,可以让内存占用量(memory footprint)保持常数(假设一个已经存在的推荐系统会使用item embeddings)。

在30Music的listening和playlists数据集的子集上,我们展示了我们的方法可以极大提升推荐系统的效果,实现开销和集成开销很小。

在第2节,我们会回顾相关工作。第3节,展示Meta-Prod2vec方法。第4节,展示实验实置和30Music数据集上的结果。第5节总结。

3.Meta-Prod2Vec

3.1 Prod2Vec

在Prod2Vec的paper[9]中,Grbovic等人提供了在从电子邮件的商品收据序列上使用Word2Vec算法。更正式的,结定一个商品序列的集合S: \(s = (p_1, p_2, ..., p_M), s \in S\),目标函数是发现一个D维的真实表示\(u_p \in R^D\),以便相似的商品可以在产生的向量空间内更接近。

原算法(Word2Vec)原本是一个高度可扩展的预测模型,用于从文本中学习词向量,属于自然语言神经网络模型。在该领域大多数工作都是基于Distributional Hypothesis[27],它宣称在相同的上下文中出现的词更接近,即使意思不同。

该hypothesis可以被应用于更大的上下文中,比如:在线电商,音乐和媒体消费,这些服务的基础是CF算法。在CF设置中,服务的使用者(用户)被当成上下文使用,在该上下文中哪些商品共现过,从而在CF中产生经典的item 共现(co-occurence)方法。基于co-count的推荐方法和Word2Vec间的相似关系由Omer[16]确定;该作者展示了embedding方法的目标函数与矩阵分解(它包含了局部共现items的the Shifted Positive PMI)很接近,其中PMI表示Point-Wise Mutual Information:

\[PMI_{ij} = log(\frac{X_{ij} \cdot |D|}{X_i X_j})\] \[SPMI_{ij} = PMI(i, j) - log k\]

其中\(X_i\)和\(X_j\)是item频次,\(X_{ij}\)是i和j共现的次数,D是数据集的size,k是由负样本(negatives)与正样本(positives)的比率。

Prod2Vec Objective目标函数

在[23]中作者展示了Word2Vec的目标函数(与Prod2Vec相似),可以被重写成:给定目标商品(Word2Vec-SkipGram模型,通常在大数据集上表现很好),最小化加权交叉熵(期望和建模后的上下文商品的条件分布)。接着,条件分布的预测被建模成一个关于在目标商品和上下文商品向量间内积的softmax。

\[L_{P2V} = L_{J|I}(\theta) = \sum_{ij} (-X_{ij}^{POS} log q_{j|i}(\theta) -(X_i - X_{ij}^{POS} log(1-q_{j|i}(\theta)))) \\ = \sum_{ij} X_i(-p_{j|i} log q_{j|i}(\theta) - p_{\neg j|i} log q_{\neg j|i}(\theta)) \\ = \sum_i X_i H(p_{\cdot | i}, q_{\cdot|i}(\theta))\]

这里,\(H(p_{\cdot \mid i}, q_{\cdot \mid i}(\theta))\)是期望概率\(p_{\cdot \mid i}\)的交叉熵,表示基于输入商品\(i \in I\)和预测条件概率\(q_{\cdot \mid i}\), 在输出空间J上看过的任何商品:

\[q_{j|i}(\theta) = \frac{e^{w_i^T w_j}} { e^{w_i^T w_j} + \sum_{ j' \in (V_{J-j})} e^{W_i^T W_j'}}\]

其中,\(X_i\)表示商品i的输入频次,\(X_{ij}^{POS}\)是商品对(product pair)(i,j)在训练数据中被观察到的频次数目。

图一: Prod2Vec架构

对于Prod2Vec产生的结构,如图1所示,使用一个只有单个hidden layer和一个softmax output layer的NN,位于中心窗口的所有商品的输入空间被训练成用于预测周围商品的值。

然而,由Prod2Vec生成的商品embeddings,只考虑了用户购买序列的信息,也就是局部共现信息(local co-occurrence information)。尽管这比在协同过滤(CF)中的全局共现频次更加丰富,它不会考虑其它类型的item信息(比如:item的metadata)。

例如,假设输入是关于已经被归好类商品的序列,标准的Prod2Vec embeddings不会建模以下的交互:

  • 给定关于商品p(属于类别c)的当前访问,下一个访问的商品\(p'\)更可能属于相同的类别c
  • 给定当前类别c,下一个更可能的访问类别是c,或者一个相关的类别\(c'\)(例如:在购买一件游泳衣后,很可能会有一个防晒油的购买行为,它们属于一个完全不同的商品类目,但相近)
  • 给定当前商品p,下一个类目更可能是c或者一个相关类目\(c'\)
  • 给定当前类别c,被访问的当前商品更可能是p或\(p'\)

前面提取,作者对Prod2Vec算法作为扩展,会同时考虑商品序列和商品文本信息。如果将该扩展方法应用于非文本元数据上,加上商品预列信息,该算法会建模商品元数据和商品id间的依赖,但不会将元数据序列和商品id序列连接在一起。

3.2 Meta-Prod2Vec

在第一节,已经有相关工作使用side information进行推荐,尤其是结合CF和CB的混合方法。在embeddings的方法中,最相关的工作是Doc2Vec模型,其中words和paragraph会进行联合训练(jointly),但只有paragraph embedding会被用于最终的任务中。

我们提出了相似的架构,在NN的输入空间和输出空间中同时包含side information,在嵌入的items和metadata间的交互相互独立进行参数化,如图2所示。

图二: Prod2Vec架构

Meta-Prod2Vec目标函数

Meta-Prod2Vec的loss扩展了Prod2Vec的loss,它会考虑4种涉及item元信息的额外交互项:

\[L_{MP2V} = L_{J|I} + \lambda \times (L_{M|I} + L_{J|M} + L_{M|M} + L_{I|M})\]

其中:M是元数据空间(例如:在30Music数据集中的artist ids),\(\lambda\)是正则参数。我们列出了新的交互项:

  • \(L_{I \mid M}\):给定输入商品的元信息M,所观察到的输入商品ids的条件概率 与 其预测的条件概率间的加权交叉熵。该side-information与其它三种类型不同,因为它会将item建模成关于它的metadata的函数。这是因为,在大多数情况下,该item的metadata与id更通用,可以部分解释指定id的observation。
  • \(L_{J \mid M}\): 给定输入商品的元信息M,所观察到的它的上下文商品id的条件概率 与 其预测的条件概率间的加权交叉熵. 一个架构是,正常的Word2vec loss被看成是,只有该交叉项与Doc2Vec模型提出的很接近,其中,我们可以使用一个更通用类型的item metadata来替代document id information。
  • \(L_{M \mid I}\): 给定输入商品I,它的上下文商品元信息值M的条件概率、与预测的条件概率 间的加权交叉熵。
  • \(L_{M \mid M}\): 给定输入商品的元信息M,它的上下文商品元信息值M的条件概率,与预测的条件概率 间的加权交叉熵。该模型会建模观察到的metadata序列,以及在它内表示关于metadata的Word2Vec-like的embedding。

总之,\(L_{J \mid I}\)和\(L_{M \mid M}\)会分别对items序列和metadata序列的似然建模进行编码loss项。\(L_{I \mid M}\)表示在给定元信息的情况下item id的条件似然,\(L_{J \mid M}\)和\(L_{M \mid I}\)表示在item ids和metadata间的cross-item交叉项。如图3如示,我们展示了由Prod2Vec因子分解出的item matrix,以及另一个由Meta-Prod2Vec分解出的item matrix。

图三:将MetaProd2Vec看成是items和metadata扩展矩阵的矩阵分解

Meta-Prod2Vec的更通用等式,为4种类型的side information(\(\lambda_{mi}, \lambda_{jm}, \lambda_{mm}, \lambda_{im}\))引入了一个独立的\(\lambda\)。

在第4节,我们将分析每种类型的side-information的相对重要性。当使用多种源的metadata时,每种源在全局loss中将具有它自己的项以及它自己的正则参数。

根据softmax正则因子,我们有机会将items的输出空间和metadata的输出空间选择是否进行独立开来。与在Word2Vec中使用的简化假设相似,这允许每个共现的商品对(product pairs)被可以被独立地进行预测(predicted)和拟合(fitted)(因此,给定一个输入商品,在输出商品集上添加一个隐式的相互排斥限制),我们在相同的空间中嵌入该商品和它的metadata,因此允许它们共享归一化限制(normalization constraint)。

Word2Vec算法的一个吸引点是它的可扩展性,它使用Negative Sampling loss在所有可能词的空间上近似原始softmax loss,可以只在正共现上使用抽样的少量负样本来拟合模型,最大化一个修改版本似然函数\(L_{SG-NS}(\theta)\):

\[L_{J|I}(\theta) = \sum_{ij} (- X_{ij}^{POS} log q_{j|i}(\theta) - (X_{ij}^{NEG} log(1 - q_{j|i}(\theta))) \\ \approx L_{SG-NS}(\theta)\]

其中:

\[L_{SG-NS}(\theta) = \sum_{ij} - X_{ij}^{POS} (log \sigma(w_i^T w_j)) - k E_{c_N ~ P_D} log \sigma(-w_i^T w_N))\]

其中,\(P_D\)概率分布用于抽样负上下文样本,k是一个超参数,它指定了每个正样本对应的负样本的数目。side information loss项\(L_{I \mid M}, L_{J \mid M}, L_{M \mid I}, L_{M \mid M}\)根据相同的公式进行计算,其中\(i,j\)分别索引input/output空间。

在Meta-Prod2Vec中,将商品(products)和元信息(metadata)共同嵌入(co-embed)到\(L_{SG-NS}(\theta)\)loss中的影响是,对于任意正样本对(positive pair)潜在的负样本集合,会包含items和metadata值的联合。

最终对推荐系统的影响

由于共享embedding空间,用于Prod2Vec的训练算法保持不变。唯一一不同是,在新版本的训练对(training pairs)的生成阶段,原始item对会得到涉及metadata的额外pairs的协助。在线推荐系统中,假设我们增加一个涉及item embeddings的解决方案,在线系统不会增加任何改变(因为我们只在训练时使用metadata),对在线内存占用没有任何影响。

4.实验

如下。首先描述了评估任务设置,metrics和baselines。接着,我们报告了在30Music开放数据集上的实验。

4.1 Setup

我们评估了在事件预测任务(next event prediction task)上的推荐方法。我们考虑用户与items交叉的时间顺序序列。我们将每个序列分割成训练集、验证集、测试集。我们将拟合Prod2Vec和Meta-Prod2Vec模型的embedding,在每个用户序列的前n-2个元素上,在第n-1个元素上测试超参数效果,最终通过训练前n-1个items,并预测第n个item。

我们使用在训练序列中的最后一个item作为query item,我们使用下述的其中一种方法来推荐最相似的商品。

在第1节所示,由于技术限制,需要让内存占用保持常量,我们只在训练时对item的metadata感兴趣。因此,我们不会与将metadata直接用于预测时的方法做比较,比如:先前的基于内容的推荐(CB)embedding方法,用户和item被表示成item content embeddings的线性组合,其中商品通过关联的图片内容embeddings进行表示。

我们使用以下的评估metrics,对所有用户做平均:

  • K上的点击率(HR@K):如果测试商品出现在推荐商品的top K列表中,它就等于1/K。
  • Normalized Discounted Cumulative Gain(NDCG@K): 在推荐商品列表中,测试商品有更高的ranks。

使用上述metrics,我们比较了以下方法:

  • BestOf:top产品按它们的流行度进行检索。
  • CoCounts: 标准CF方法,它使用共现向量与其它items的cosine相似度。
  • Standalone Prod2Vec: 通过Word2Vec在商品序列上获取的向量进行cosine相似度计算得到推荐结果。
  • Standalone Meta-Prod2Vec: 它增强了Prod2Vec,使用item side information,并使用生成的商品embedding来计算cosine相似度。和Prod2Vec一样,目标是进一步解决冷启动问题。
  • Mix(Prod2Vec,CoCounts): 一个ensemble方法,它返回使用两者线性组合来返回top items。 \(Mix(Prod2Vec, CoCounts)= \alpha * Prod2Vec + (1-\alpha) * CoCounts\)
  • Mix(Meta-Prod2Vec,CoCounts): 一个ensemble方法,\(Mix(MetaProd2Vec, CoCounts)= \alpha * MetaProd2Vec + (1-\alpha) * CoCounts\), 它返回使用两者线性组合来返回top items。

4.2 数据集

30Music dataset:它从Last.fm API中抽取的一个关于listening和playlists的集合。在该数据集上,我们评估了关于推荐下一首歌预测的推荐方法。对于meta-prod2vec算法,我们利用track metadata,命名为artist信息。我们在一个100k用户sessions数据集的样本上运行实验,生成的vocabulary size为433k首歌和67k artists。

4.3 结果

见paper本身。

参考

我们先来看下Google Inc的paper:Wide & Deep Learning for Recommender Systems。

一、介绍

推荐系统可以看成是一个搜索排序系统,其中输入的query是一个用户和上下文的集合,输出是一个item列表。给定一个query,推荐任务就是在数据库中找到相关的items,接着基于目标(比如:点击or购买)去对items进行排序。

推荐系统与常见的搜索排序问题相同的一个挑战是,同时满足Memorization和Generalization。Memorization可以宽泛地定义成学到items或features的共现率,并利用(exploiting)这种在历史数据中的相关关系(correlation)。Generalization则基于相关关系的转移,并探索(explores)在过往很少或从不出现的新的特征组合。基于Memorization的推荐系统通常更局部化(topical),将items与执行相应动作的users直接相关。而基于Generalization的推荐则更趋向于推荐多样化的items。在本papers中,我们主要关注Google Play Stores的推荐问题,方法本身可用于其它场景。

对于工业界大规模的在线推荐和排序系统,常用的线性模型(比如:logistic regression)被广泛使用,因为它的简单性、可扩展性以及可解释性。模型通常在使用one-hot编码的二值化的稀疏特征上。例如,二值化特征”user_installed_app=netflix”,如果用户过去安装(installed)了Netflix,则具有特征值1. 通过在稀疏特征上使用cross-product transformation可以有效地达到Memorization,比如AND(user_installed_app=netflix, impression_app=pandora),如果用户过去安装了Netflix,接着被曝光了Pandora,那么它的值是1. 这可以解释一个特征对(feature pair)的共现率与目标label间的相关关系。通过使用更少(粗)粒度的特征可以添加Generalization,例如:AND(user_installed_category=video, impression_category=music),(注:上面Memorization使用的是具体的app,而此处Generalization使用的仅仅是app的category),但人工的特征工程通常是必需的。(cross-product transformation)的一个限制是,不能泛化到那些在训练数据上没有出现过的query-item特征对。

Embedding-based的模型,比如因子分解机(FM)或深度神经网络,只需要很少的特征工程,通过为每个query和item特征对(pair)学到一个低维的dense embedding vector,可以泛化到之前未见过的query-item特征对,。然而,当底层的query-item矩阵很稀疏和高秩(high-rank)时(比如,用户具有特殊偏好或很少出现的items),很难为query-item pair学到有效的低维表示。在这种情况下,大多数query-item pairs之间是没有交叉的,但dense embeddings会为所有的query-item pairs生成非零的预测,这样会过泛化(over-generalize),并生成不相关的推荐。另一方面,使用交叉特征转换(cross-product features transformations)的线性模型可以使用更少的参数就能记住(memorize)这些“异常规则(exception rules)”。(embedding 优点:泛化,缺点:稀疏时)

在本文中,我们提出了Wide&Deep learning框架来在同一个模型中达到Memorization 和 Generalization,通过联合训练一个如图一所示的线性模型组件和一个神经网络组件。

图1:

本文的主要贡献:

  • Wide & Deep 学习框架,可以用于联合训练带embeddings的feed-forward神经网络以及带特征转换的线性模型,用于带稀疏输入的常见推荐系统中。
  • Wide & Deep推荐系统的实现和评估在Google Play上已经产品化,这个app store具有数十亿的活跃用户、以及上百万的app。
  • 开源,在Tensorflow上提供了一个高级API

思想很简单,我们展示了Wide & Deep框架,它极大地提升了App的获得率(acquisition rate)并且同时满足training和serving的速度要求。

推荐系统总览

app推荐系统如图二所示。一个query,它包含着许多用户和上下文特征,当一个用户访问app store时生成。推荐系统会返回一个app列表(曝光:impressions),用户在此之上会执行特定的动作(点击:click或购买:purchase)。这些用户动作,伴随着queries和impressions,会以日志的形式记录下来。

图2

由于在数据库中有超过百万的app,对于在serving延迟条件之内(通常为O(10)ms)的每一个query,尽可能得对每一个app进行评分是相当困难。因此,上述第一步收到一个query的过程是检索(retrieval)。检索系统会返回一个最匹配query的item的短列表,通常使用机器学习模型和人工定义规则来达到。在数量减至候选池后,排序系统(ranking system)会通过它们的得分对所有items进行排序。得分通常是$ P(y|x) $,对于给定的特征x,一个用户的动作标签y,包括用户特征(比如:国家,语言,人口属性信息),上下文特征(比如:设备,天的小时,周的天),曝光特征(比如:app age, app的历史统计信息)。在本文中,我们只关注在排序系统中使用Wide & Deep 学习框架。

3. Wide & Deep Learning

3.1 Wide组件

wide组件是一个泛化的线性模型,形式为:$ y=w^Tx+b $,如图1(左)所示。y是预测,$ x = [x_1, x_2, …, x_d] $是d维的特征向量, $ w = [w_1, w_2,…, w_d] $是模型参数,其中b为bias。特征集包括原始的输入特征和转换后的特征,一个最重要的转换是,cross-product transformation。它可以定义成:

\[\phi_k(x)=\prod_{i=1}^{d}x_{i}^{c_{ki}}, c_{ki} \in \{0, 1\}\]

…(1)

其中$c_{ki}$为一个boolean变量,如果第i个特征是第k个变换$\phi_k$的一部分,那么为1; 否则为0.对于二值特征,一个cross-product transformation(比如:”AND(gender=female, language=en)”)只能当组成特征(“gender=female” 和 “language=en”)都为1时才会为1, 否则为0. 这会捕获二值特征间的交叉,为通用的线性模型添加非线性。

3.2 Deep组件

Deep组件是一个前馈神经网络(feed-forward NN),如图1(右)所示。对于类别型特征,原始的输入是特征字符串(比如:”language=en”)。这些稀疏的,高维的类别型特征会首先被转换成一个低维的、dense的、real-valued的向量,通常叫做“embedding vector”。embedding的维度通常是O(10)到O(100)的阶。该embedding vectors被随机初始化,接着最小化最终的loss的方式训练得到该值。这些低维的dense embedding vectors接着通过前向传递被feed给神经网络的隐层。特别地,每个隐层都会执行以下的计算:

\[a^{l+1} = f(W^{(l)} a^{(l)} + b^{(l)})\]

…(2)

其中,l是层数,f是激活函数(通常为ReLUs),$a^{(l)}, b^{(l)}和W^{(l)}$分别是第l层的activations, bias,以及weights。

3.3 Wide & Deep模型的联合训练

Wide组件和Deep组件组合在一起,对它们的输入日志进行一个加权求和来做为预测,它会被feed给一个常见的logistic loss function来进行联合训练。注意,联合训练(joint training)和集成训练(ensemble)有明显的区别。在ensemble中,每个独立的模型会单独训练,相互并不知道,只有在预测时会组合在一起。相反地,联合训练(joint training)会同时优化所有参数,通过将wide组件和deep组件在训练时进行加权求和的方式进行。这也暗示了模型的size:对于一个ensemble,由于训练是不联合的(disjoint),每个单独的模型size通常需要更大些(例如:更多的特征和转换)来达到合理的精度。相比之下,对于联合训练(joint training)来说,wide组件只需要补充deep组件的缺点,使用一小部分的cross-product特征转换即可,而非使用一个full-size的wide模型

一个Wide&Deep模型的联合训练,通过对梯度进行后向传播算法、SGD优化来完成。在试验中,我们使用FTRL算法,使用L1正则做为Wide组件的优化器,对Deep组件使用AdaGrad。

组合模型如图一(中)所示。对于一个logistic regression问题,模型的预测为:

\[P(Y = 1 | x) = \sigma(w_{wide}^{T} [x, \phi(x)] + w_{deep}^{T} a^{(l_f)} + b)\]

…(3)

其中Y是二分类的label,$ \sigma(·) $是sigmoid function, $ \phi(x) $是对原始特征x做cross product transformations,b是bias项。$w_{wide}$是所有wide模型权重向量,$w_{deep}$是应用在最终激活函数$a^{(l_f)}$上的权重。

4.系统实现

app推荐的pipeline实现包含了三个stage:数据生成,模型训练,模型serving。如图3所示。

图3

4.1 数据生成

在这一阶段,用户和app的曝光数据在一定时间内被用于生成训练数据。每个样本对应于一个曝光。label为app的获得率(acquisition):如果曝光的app被下载则为1, 否则为0.

词汇表(Vocabularies),它是一个关于将类别特征字符串映射到integer ID上的表,也在该阶段生成。该系统会为至少出现过某个最小次数的所有的string特征计算ID空间。连续的real-valued特征被归一化到[0, 1],通过将一个特征值x映射到它的累积分布函数$P(X <= x)$,将它分成$n_q$份 (quantiles)。对于第i个份(quantiles),对应的归一化值为:$ \frac{i-1}{n_q-1}$。分位数(quantiles)边界在数据生成阶段计算。

4.2 模型训练

我们在试验中使用的模型结构如图4所示。在训练期间,我们的输入层接受训练数据和词汇表的输入,一起为一个label生成sparse和dense特征。wide组件包含了用户安装app和曝光app的cross-product transformation。对于模型的deep组件,会为每个类别型特征学到一个32维的embedding向量。我们将所有embeddings联接起来形成dense features,产生一个接近1200维的dense vector。联接向量接着输入到3个ReLU层,以及最终的logistic输出单元。

图4:

此处做个注解(美食推荐场景FoodIO):wide模型的目的是,记住(memorize)哪些items能更好地对应每个query。因此,你训练带交叉特征转换的线性模型,是为了捕获一个query-item feature pair与相应的目标label(一个item是否被消费、购买)间的共现关系。该模型会预测每个item的消费概率 \(P(consumption \| query, item)\),接着FoodIO会返回最高预测购买率的top item。例如,模型学到了特征:AND(query=”炸鸡(fried chicken)”, item=”鸡肉和华夫饼(chicken and waffles)”)的效果很好,而AND(query=”炸鸡(fried chicken)”, item=”鸡肉炒饭(chicken fried rice)”)这个并不受喜欢,尽管字符上更匹配。换句话说,它可以记住哪些用户喜欢,从而获得更多的交易额。

同理:上述wide中提到的installed app和impressed app可以理解成是上面的item和query。

Wide & Deep模型在超过5000亿的样本上进行训练。每一时刻有新的训练数据集到达时,模型需要重新训练。然而,每次从头到尾重新训练的计算开销很大,数据到达和模型更新后serving间的延迟较大。为了解决该问题,我们实现了一个warm-starting系统,它会使用前一个模型的embeddings和线性模型权重来初始化一个新的模型

在将模型加载到模型服务器上之前,需要做模型的演习,以便确保它不会在serving的真实环境上出现问题。我们在经验上会验证模型质量,对比前一模型做心智检查(sanity check)。

4.3 模型Serving

一旦模型被训练和验证后,我们会将它加载到模型服务器上。对于每个请求,服务器会从app检索系统上接收到一个app候选集,以及用户特征来从高到低排序,接着将app按顺序展示给用户。得分的计算通过在Wide&Deep模型上运行一个前向推断传递(forward inference pass)来计算。

为了在10ms的级别服务每个请求,我们使用多线程并行来优化性能,运行运行更小的batches,而不是在单个batch inference step中为所有的候选app进行scoring。

5.试验结果

为了在真实的推荐系统上评估Wide & Deep learning的效果,我们运行了在线试验,并在两部分进行系统评测:app获得率(app acquisitions)和serving性能。

5.1 App Acquisitions

我们在一个A/B testing框架上做了3周的试验。对于控制组,1%的用户被随机选中,推荐由之前版本的排序系统生成,它是一个高度优化的wide-only logistic regression模型,具有丰富的cross-product特征转换。对于试验组,随机选中1%的用户,使用相同的特征进行训练。如表1所示,Wide & Deep模型在app store的主页上提升了app acquisition rate,对比控制组,有+3.9%的提升。另一个分组只使用deep组件,使用相同的神经网络模型,具有+1%的增益。

表1:

除了在线试验,我们也展示了在held-out离线数据上的AUC。其中Wide & Deep具有更高的离线AUC,在线也更好。一个可能的原因是,曝光和点击在离线数据集上是确定的,而在线系统通过混合generalization和memorization,从新的用户响应学到,生成新的探索推荐。

5.2 Serving Performance

Serving时具有高的吞吐率(throughout)和低延时是很有挑战性的。在高峰期,我们的推荐服务每秒处理1000w个app得分。单个线程上,在单个batch上为所有的候选得进行scoring会花费31ms。我们实现了多线程,并会将每个batch分割到更小的size上,它会将客户端的延迟的延迟减小到14ms上,所图2所示。

表2

6.相关工作

将使用特征交叉转换的wide linear model与使用dense embeddings的deep neural networks,受之前工作的启发,比如FM:它会向线性模型中添加generalization,它会将两个变量的交互分解成两个低维向量的点积。在该paper中,我们扩展了模型的能力,通过神经网络而非点积,来学习在embeddings间的高度非线性交叉(highly nonlinear interactions)。

在语言模型中,提出了RNN和n-gram的最大熵模型的joint training,通过学习从input到output之间的直接权重,可以极大减小RNN的复杂度(hidden layer)。在计算机视觉中,deep residual learning被用于减小训练更深模型的难度,使用简短连接(跳过一或多层)来提升accuracy。神经网络与图模型的joint training被用于人体姿式识别。在本文中,我们会探索前馈神经网络和线性模型的joint training,将稀疏特征和output unit进行直接连接,使用稀疏input数据来进行通用的推荐和ranking问题。

7.Tensorflow

只需要3步,即可以使用tf.estimator API来配置一个wide,deep或者Wide&Deep:

  • 1.选中wide组件的特征:选中你想用的稀疏的base特征列和交叉列特征列
  • 2.选择deep组件的特征:选择连续型的列,对于每个类别型列的embedding维,以及隐层的size。
  • 将它们放置到一个Wide&Deep模型中(DNNLinearCombinedClassifier)

关于更详细的操作,示例代码在:/tensorflow/tensorflow/examples/learn/wide_n_deep_tutorial.py,具体详见tensorflow tutorial。

参考

youtube的基于深度学习的推荐系统,主要分成两大部分:

介绍

Youtube是世界上最大的创建、分享、和发现视频内容的平台。Youtube推荐负责帮助超过十亿用户从不断增长的视频语料中发现个性化内容。在本paper中,我们主要关注深度学习对youtube视频推荐的巨大影响。图1展示了youtube app主页的推荐。

图1

youtube推荐视频极具挑战性,主要有:

  • 规模(Scale):许多已经存在的推荐算法证明只能在小数据集上进行。对于youtube的海量用户和语料来说必须要有高度特定的分布式学习算法和高效的serving系统
  • 新鲜度(Freshness):Youtube具有一个非常动态的语料,每秒钟都有许多视频被上传上来。推荐系统必须对这些新上传的视频内容进行建模,从而被用户快速接受。新内容与播放良好的老视频间的平衡,则通过EE(exploration/exploitation)的角度去理解。
  • 噪声(Noise):由于稀疏性、以及多种不可观察的外部因素,youtube的历史用户行为很难去预测。我们很少能获取真实的用户满意度,只能建模含噪声的隐式反馈信号。更进一步,由于没有一个较好的知识本体(ontology)定义,与内容有关的metadata很难进行组织。我们的算法必须对这些特性足够健壮。

与Google的其它产品领域进行合作,youtube已经迁移到了深度学习作为通用解法。我们的系统构建在google Brain上,它开源了tensorflow。tensorflow提供了一个灵活的框架来实验许多DNN架构。我们的模型可以学习接近10亿参数,在数百亿的样本上进行训练。

对比与MF领域的研究,使用DNN网络进行推荐的工作还相当少。神经网络被用于新闻推荐[17],引文[8],评论评分[20]等。协同过滤也被公式化成DNN[22]和autoencoders[18]。Elkahky等使用深度学习对用户进行跨领域建模。在一个基于内容的设定中,Burges等使用DNN进行用户推荐。

该paper组织如下:第2节讲述系统。第3节描述候选生成模型,包括如何训练以及用于对推荐进行serving。实验结果将展示模型如何从hidden units的deep layers以及额外的异构信号受益。第4节详述了排序模型,包含经典的LR如何被修改来训练一个模型预测期望的观看时长(而非点击概率)。实验结果表明,hidden layer的深度在这种情况下有用。最后,第5节为结论。

2.系统总览

推荐系统的整体结构如图2所示。系统由两个神经网络组成,一个用于候选生成,另一个用于ranking。

图2

候选生成网络会采用youtube用户历史行为作为输入,并从一个大语料中检索出一个视频子集(数百个)。这些候选(candidates)通常与用户高度相关,带有较高的precision。候选生成网络只通过CF提供了宽泛的个性化。用户的相似度被表示成粗粒度特征,比如:视频ID,搜索query tokens和人口统计学信息(demographics)。

在列表中呈现一些“best”推荐,则需要一个细粒度的表示(representation)来在具有较高recall的候选间的区分相对重要性。ranking网络会完成该任务,它会根据一个期望的目标函数,使用用户和视频的丰富特征集合,来为每个视频分配一个分数。根据排序,最高得分的视频会呈现给用户。

这种two-stage推荐方法,允许用户从一个非常大的视频语料(数百万)做出推荐,可确定的是,只有少量视频出现在移动设备中,它们对于用户是个性化、并且是吸引人的。再者,该设计可以允许对由其它源生成的候选进行混合,比如早期描述的工作[3]。

在部署期间,我们使用离线指标(precision, recall, ranking loss等)做了大量评估,来指导我们的系统进行增量改进。然而,对于一个算法或模型的效果最终决定,还是要看真实环境上的A/B testing。在真实环境中,我们会评估在CTR、观看时长、以及其它评估用户参与度的指标上上的细微变化。这很重要,因为真实A/B结果不总是与离线实现相关。

一、候选生成

在候选生成期间,从海量的Youtube语料中晒筛选出数百个与用户相关的视频。以前的推荐系统使用MF方法来根据rank loss训练。我们的神经网络模型的每个迭代会模仿该因子分解行为,它使用只嵌入用户之前观看行为的浅层网络。从该观点上看,我们的方法可以看成是因子分解技术的非线性泛化。

3.1 推荐即分类

我们将推荐当成是一个极端多分类问题(extreme multi-class),其中预测问题变为:视频库V,有上百万的视频,某用户U,在上下文C上,在时间t时的观看行为$w_t$,刚好是某个视频i.

\[P(w_t =i|U,C)=\frac{e^{v_{i} u}}{\sum_{j \in V}{e^{v_{j} u}}}\]

其中u表示一个高维的(user,context)pair的“embedding”, v表示每个候选视频的emdedding。在该假设中,一个emdedding可以简化成一个稀疏实体的映射(视频,用户等各有一个),映射到一个N维的dense vector中。深度神经网络的任务是:学到user embeddings: u,作为用户历史和上下文的函数,这在使用一个softmax分类器对视频进行判别时有用。

使用隐式反馈(观看行为)来训练模型,其中,用户完成一个视频可以认为是一个正例。

Efficient Extreme Multiclass

为了有效地训练这样一个具有上百万分类的模型,我们采用的技术是:从后台分布(“候选抽样candidate sampling”)中抽样负类(negative classes),接着通过按重要性加权(importance weighting)[10]来纠正这些样本。对于每个样本,为true-label和negative-label,学习目标是最小化cross-entropy loss。实际中,会抽样上千个负样本,这种方法可以比传统的softmax快100倍。另一个可选的方法是:hierarchical softmax,但这里我们不去做对比。

在提供服务的阶段(serving time),我们需要计算最可能的N个分类(视频),以便选中其中的top N,来展现给用户。对上百w级的item进行打分,会在10ms左右的延迟内完成。之前的Youtube系统靠hashing技术[24]解决,和这里描述的分类器使用相类似的技术。由于在serving time时并不需要对softmax输出层校准(calibrated)likelihoods,打分问题(scoring problem)可以缩减至在点乘空间中的最近邻搜索问题,可以使用[12]中提供的库来完成。我们发现,在最近邻搜索算法上做A/B test效果并不特别明显。

1.1 模型架构

受语言模型中的CBOW(continuous bag of words)的启发,我们为固定size视频库中的每个视频学习高维emdeddings,接着将这些emdeddings前馈(feed)输入到一个前馈神经网络。一个用户的观看历史,可以被表示成一个关于稀疏视频id的可变长序列,这些id会通过embeddings被映射到一个dense vector representation上。该网络需要固定大小的dense inputs,最后选择对emdeddings的简单平均(simply averaging),因为它在不同策略中(sum, component-wise max,等)效果最好。最重要的,该emdeddings会和其它一些模型参数一起通过常规的梯度下降BP更新即可学到。特征被拼接(concatenate)到一个很宽的第一层上(wide first layer),后面跟着许多层的完全连接的ReLU层[6]。图3展示了整体架构,它带有额外的非视频观看特征(no-video watch features)。

图3:

1.2 多种信号

将DNN作为普通的矩阵分解(MF)的一种泛化,其中一个关键优点是,任何连续的特征和类别特征都可以很方便地加进模型中。搜索历史的处理,可以与观看历史的处理方式相类似 – 每一个查询(query)可以tokenized化成1-gram和2-gram,每一个token都可被嵌入。一旦求平均,用户的tokenized化的嵌入式query,代表了一个总结型的稠密搜索历史(summarized dense search history)。人口统计学特征(Demographic features),对于新用户的推荐很重要。用户的地域和设备信息(device),都可以被嵌入和串联。简单的二元特征和连续特征,比如用户性别,登陆态,年龄,都可以归一化到[0,1]上的实数值,直接输入到该网络。

“样本时限”特征(”Example Age” Feature)

YouTube上,每秒都有许多视频上传上来。推荐这些最新上传的新鲜(“fresh”)内容,对于YouTube产品来说相当重要。我们一致观察到:用户喜欢新鲜内容,尽管并非相关。除了简单的推荐用户想看的新视频所带来的一次传播效果外,还存在着关键的病毒式的二次传播现象。

机器学习系统经常展示出对过往行为存在一个隐式偏差(implicit bias),因为它们通常是基于历史样本的训练,来预测将来的行为。视频流行度分布是高度不稳定(non-stationary)的,我们的推荐系统会生成在视频库上的多项分布(multinomial distribution),将会影响在多周训练窗口上的平均观看似然。为了纠正这一点,我们将训练样本的age,作为一个训练特征进行feed。在serving time时,该特征被置为0(或者为一个微小的负数),反映出模型在训练窗口的最末尾正在做预测。

图4展示了该方法在选择视频上的效果。

图4: 对于一个给定的视频[26],使用样本age作为特征训练的模型能够精准表示数据的上传时间和与时间相关的流行度间的关系。如果没有该特征,模型将会预测在训练窗口上的近似平均似然(baseline)。

1.3 Label和Context选择

需要重点强调的是,推荐(recommendation)通常涉及到求解一个替代问题(surrogate problem),并将结果转换成一个特殊上下文。一个经典的示例是,如果能准确预测rating,会产生有效的电影推荐[2]。我们已经发现,这种代理学习问题(surrogate learning problem)在A/B testing上很重要,但很难在离线试验中进行衡量。

训练样本需要从所有YouTube观看行为(即使嵌入在别的网站上)上生成,而非仅仅只使用我们生成的推荐的观看行为。否则,新内容将很难浮现出来,推荐系统在探索(exploitation)上将过度偏差。如果用户正通过别的方式探索发现视频,而非使用我们的推荐,我们希望能够快速通过协同过滤传播该发现给他人。 一个关键点是,提升live metrics的目的是为每个用户生成一个固定数目的训练样本,有效地在loss function上对我们的用户做平等的加权。这可以防止一少部分高活跃度用户主宰着loss

这在一定程度上与我们的直觉相反,必须注意:为防止模型利用网站布局,以及代理问题造成的过拟合,需要隐瞒分类器信息(withhold information from the classifier)。可以考虑将一个样本看成是用户已经发起的一个查询(query): 比如“taylor swift”。由于我们的问题是预测下一个要看的视频。通过给定该信息,分类器将会预测要观看的最可能的视频,是那些出现在相应搜索结果页中关于”taylor swift”的视频。一点也不惊奇的是,如果再次生成用户最新的搜索页作为主页推荐,效果会很差。通过抛弃顺序信息,使用无顺序的词袋(bag of tokens)表示搜索query,该分类器不再直接认识到label的来源

视频的自然消费模式,通常会导致非常不对称的co-watch概率。连播电视剧(Episodic series)通常被按顺序观看,用户经常发现,对于同一个流派(genre)中的艺术家们(artists),在关注更小众的剧之前,会从最广为流行的剧开始。因此我们发现对于预测用户的下一次观看行为上有着更好的效果,而非去预测一个随机held-out观看(a randomly held-out watch)(见图5)。许多协同过滤系统隐式地选择标签和上下文,通过hold-out一个随机item,然后通过用户历史观看中的其它item来预测它(5a)。这会泄露将来的信息(future information),并忽略任何不对称的消费模式(asymmetric consumption patterns)。相反的,我们通过选择一个随机观看(a random watch),然后“回滚(rollback)”一个用户的历史,只输入用户在hold-out label的watch之前(5b)的动作。

图5: 选择labels和输入上下文给模型,在离线评估时很有挑战性,但对真实的效果有巨大提升。这里,实心事件•表示网络的输入特征,而空心事件◦表示排除在外。我们发现,预测一个将来的观看(5b),在A/B test中效果更好。在(5b)中,example age通过\(t_{max}-t_N\)来表示,其中\(t_{max}\)是训练数据中观察到的最大时间。

1.4 特征和深度的试验

如图6所示,添加特征和深度,可以极大提升在holdout data上的precision。在这些试验中,1M的视频量,和1M的搜索tokens,被嵌入到256个float值上,每个都在一个最大的bag-size:50个最近的watches和50个最近的searches。softmax层输出一个在1M个视频classes、256维的多项分布(可以看成是一个独立的output video emdedding)。这些模型被训练,直接覆盖所有的YouTube用户,对应在数据上的多个epochs上。网络结构按一个公共的”tower”模式,在网络的底部是最宽的,每个后继的隐层,将单元数二等分(与图3相同)。深度为0的网络,是一个有效的线性因式分解模型,它的效果与以往的系统很相似。增加宽度(width)和深度(depth),直到增量的效果越来越小,收敛越来越难:

  • Depth 0: 一个线性层,可简单地将串联层转换成与softmax相匹配的256维.
  • Depth 1: 256 ReLU
  • Depth 2: 512 ReLU -> 256 ReLU
  • Depth 3: 1024 ReLU -> 512 ReLU -> 256 ReLU
  • Depth 4: 2048 ReLU -> 1024 ReLU -> 512 ReLU -> 256 ReLU

图6 在video embeddings之外的features可以提升holdout的Mean Average Precision(MAP)以及layers的深度添加了表现力,以便模通过对这些交互建模来有效使用这些额外特征

二、Ranking

Ranking的主要作用是,针对指定的UI,使用曝光数据来特化和校正候选预测(specialized and calibrate candidate predictions)。例如,用户通常会观看一个probability值较高的视频,但不大可能去点击指定主页上缩略图的曝光。在Ranking时,我们会访问许多描述视频的特征、以及视频与用户关系的特征,因为在候选集生成阶段,只有一小部分的视频被打过分,而非上百w的视频。Ranking对于聚合不同的候选源很重要,因为每个源的得分不能直接对比。

我们使用一个与候选生成阶段相似的架构的深度神经网络,它会使用logistic regression(图7)为每个视频的曝光分配一个独立的值。视频的列表接着会通过该分值进行排序,并返回给用户。我们最终的ranking objective会基于线上的A/B testing结果进行调整,但总体上是一个关于每次曝光的期望观看时长(expected watch time)的简单函数。根据ctr的排序通常会促进视频期诈现象:用户不会播放完整(标题党:点击诱惑”clickbait”),而观看时长(watch time)可以捕获更好的参与度(engagement)[13,25]。

图7: 深度ranking网络架构,描绘了嵌入的类别特征(单值和多值类别都存在),与归一化的连续特征的embeddings和powers共享。所有的层都是完全连接的。惯例上,成百上千的特征都可以输入到网络中。

2.1 特征表示

我们的特征,与传统的类别特征分类,以及连续型/普通特征相互隔离开来。类别型特征,在基数上变化多样–一些是二元的(比如:用户是否登陆),而其它一些则可能有上百万种可能的值(比如:用户最新的搜索query)。特征会根据它们是否是单值(“univalent”),或者多值集合(“multivalent”),再做进一步分割。关于单值类别特征的一个示例是:被打过分的曝光视频id;而相应的多值特征可能是一批(a bag of)关于该用户已经观看过的N个视频id。我们也会根据特征是否描述了item的属性(“impression”)或者user/context的属性(”query”),将特征进行分类。Query特征在每次请求时被计算一次,而impression特征则会为每个评过分的item计算。

特征工程(Feature Engineering)

我们通常在我们的排序模型中使用成百上千的特征,它们被分成类别型和连续型特征。尽管深度学习可以缓和手工建立特征工程的负担,但我们的原始数据天然就不能直接输入到前馈神经网络中。我们仍需要花费可观的工程资源来将用户和视频数据转换成有用的特征。最主要的挑战主要在:表示用户动作的临时顺序,以及如何将这些动作与被打分的视频曝光(impression)相关联。

我们观察到,最重要的信号是,那些描述一个用户与item本身、以及其它相似item的之前交互行为,这与广告排序(randing ads)上的经验相类似。例如,考虑用户的过往历史,以及上传被打分的频道-该用户从该频道观看了多少视频?该用户在该主题上观看一个视频的最近时间是何时?这些连续特征相当强大,它们描述了用户在相关item上的过往动作,因为它们在不同的item上泛化得很好。我们也发现,很重要,从候选生成阶段(Candidate generation)到排序阶段(Ranking)以特征的形式进行信息传递,比如:哪个源被指定给该视频候选?会分配什么分值?

描述过往视频曝光的频率的特征,对于在推荐中引入“搅动(churn)”很重要(连续的请求不会返回相同的列表)。如果一个用户最近被推荐了某个视频,但没有观看它,接着模型将自然地在下一页加载时降级该曝光(impression)。Serving即时曝光和观看历史,是一项工程壮举,超出了本paper的范围,对于产生响应式推荐至关重要。

类别特征embedding (embedding categorical features)

与候选生成阶段相类似,我们使用embeddings,将稀疏的类别型特征映射到dense表征上,更适合于神经网络。每个唯一的ID空间(视频库:”vocabulary”) 都具有一个单独学到的emdedding,它维度的递增与唯一值的数目的log成比例。这些库是简单的look-up table,在训练前由整个数据一次构建。非常大的基数ID空间(视频ID或者搜索query terms)被截断,通过只包含topN,在基于点击曝光的频率排序之后。Out-of-vocabulary的值,可以简单地映射到零嵌入上(zero embdding)。正如在候选生成阶段,多值类别特征的embeddings是被平均化的,在被输入到网络之前。

重要的是,相同ID空间的类别型特征,也共享着底层的embeddbings。例如,存着单个关于视频ID的全局embedding,供许多不同的特征使用(曝光的视频ID,该用户观看的最近视频ID,作为推荐系统”种子”的视频ID等等)。尽管共享emdedding,每个特征独自输入到网络中,因此,上面的层可以学到每个特征的特定表征(representation)。共享嵌入(sharing emdeddings)对于提升泛化、加速训练、及减小内存等相当重要。绝大多数模型参数都是在这些高基数(high-cardinality)的embedding空间中 - 例如,100w的ID,嵌入到32维的空间上,与2048个单元的宽完全连接层多7倍多的参数。

归一化连续特征(Normalizing Continuous Features)

众所周知,神经网络对于输入的归一化和分布是很敏感的[9],其它方法(比如:决策树ensembles)对于独立特征的缩放(scaling)是稳定的。我们发现,对连续特征进行合理的归一化,对于收敛来说很重要。连续特征x,具有分布f,被转换成x^,通过对值进行归一化,比如:特征平均地分布在[0,1)上使用累积分布,$ \hat{x}=\int_{-\infty}^{x}df $。该积分与特征值的分位数的线性插值相近似,在训练开始这,在所有数据上的单个pass中计算。

另外,原始的归一化特征$ \hat{x} $,我们也输入$ \hat{x}^2 $和$ \sqrt{\hat{x}} $,给网络更多有表现力的阶,通过允许它,很容易形成特征的super-linear和sub-linear function。我们发现:输入连续特征的阶,可以提升离线的accuracy。

2.2 对期望的观看时长建模

我们的目标是,给定训练样本:包含正例(曝光的视频被点击)和负例(曝光的视频没被点击),来预测期望的观看时间。正例可以解释成:该用户花费观看该视频的时间量。为了预测期望的观看时间,我们出于该目的,开发并使用加权logistic regression技术。

该模型的训练通过logistic regression和cross-entropy loss进行(图7)。然而,正例(被点的)的曝光,会由视频所观察到的观看时间进行加权。所有负例(未点击)的曝光,都使用单位加权。这种方式下,通过logistic regression学到的差异(odds)是:$ \frac{\sum{T_i}}{N-k} $,其中N是训练样本的数目,k是正例曝光的数目,Ti是第i个曝光的观看时间。假设,正例曝光很小(真实情况就这样),学到的差异(odds)近似为:\(E[T](1+P)\),其中P是点击概率,而E[T]是该曝光所期望的观看时间。由于P很小,该乘积近似为E[T]。为便于推理,我们使用指数函数e^x作为最终的激活函数,来产成这些odds,来近似估计期望的观看时长。

2.3 隐层的试验

表1展示了,我们在下一天的holdout数据上,使用不同的隐层配置所获得的结果。Value展示了每个配置(”加权,每用户的loss”),包括正例和负例,曝光展示给单个页内的某个用户。我们首先使用我们的模型对两种曝光进行打分。如果负例的曝光接受到更高的分值,那么我们会认为,正例的观看时长为:误预测的观看时长(mispredicted watch time)。加权的每用户loss,就是误预测的观看时间的总量,作为一个分数,在heldout曝光pair上的一个总观看时长。

这些结果展示了隐层的width的增加会提升效果,同样depth的增加也会。然而,服务器的CPU时间需要进行权衡下。该配置是一个1024-wide的ReLU,后面跟着一个512-wide的ReLU,再接一个256-wide的ReLU,会给我们最佳的结果,而允许我们在CPU预算范围内。

对于1024->512->256的模型,我们尝试只输入归一化连续特征,而不输入它们的powers,会增加0.2%的loss。相同的隐层配置,我们也训练了一个模型,其中正例和负例的加权相同。不令人惊讶,观看时间加权loss会增加4.1%之多。

表1:在基于观看时长加权的pairwise loss上,更深和更宽的隐ReLU层的效果

参考

- 0.Deep Neural Networks for YouTube Recommendations

我们来看下prod2vec作者Mihajlo Grbovic†等人提出的HDV《Hierarchical Neural Language Models for Joint Representation of Streaming Documents and their Content》中提出的新方法:

介绍

考虑为数据流中的文档学习分布式表示的问题。文档(documents)被表示成低维向量,与word tokens的分布式向量,使用两个embedded神经语言模型的层次结构框架,通过联合学习得到。特别的,我们会利用在streams中的文档内容,并使用一个语言模型来建模文档序列,另一个模型则建模在它们中的词序列。该模型(the models复数)会为word tokens和documents学习两者的连续向量表示,以便语义相近的documents和words在同一向量空间中更接近。我们讨论了该模型的扩展,通过进一步添加user layers到该结构中,就可以被应用于个性化推荐、以及社交关系挖掘中,这样可以学到用户的向量来表示私人偏好。我们在公共电影评分数据集MovieLens和Yahoo News三个月数据集上进行了验证。结果表明,提出的模型可以学到文档和word tokens的有效表示,效果要好于当前state-of-art的方法一大截。

3.层次化语言模型

本节中,提出的算法会对streaming documents和在它内的words进行联合建模,其中学到的documents和words向量表示会在一个共享的、低维的embedding空间内。该方法受[14]的启发。然而,与[13]的不同之处是,我们会利用steaming documents中的时序邻居(temporal neighborhood)。特别的,我们会建模一个特定文档的概率,会考虑上时序上更接近(temporally-close)的文档,另外还会考虑文档内容。

3.1 模型结构

我们假设,训练文档会以序列形式给定。例如,如果该文档是新闻文章,那么document序列可以是:用户根据阅读时间按前后顺序排列的新闻文章序列。更特别的,我们会假设,设置S个document序列的集合\(S\),每个序列\(s \in S\)包含了\(N_s\)个文档,\(s = (d_1, d_2, ..., d_{N_s})\)。接着,在一个stream \(d_m\)中的每个文档是一个由\(T_m\)个词组成的序列,\(d_m = (w_{m_1}, w_{m_2}, ..., w_{m, T_m})\)。我们的目标是,在同一个向量空间中同时学习streaming documents和language words的低维表示,并将每个document和word表示成D维的连续特征向量。如果我们假设,在训练语料中存在M个唯一的文档(doc),以及在词汇表中存在W个唯一的词(words),那么在训练期间,我们的目标是学习\((M+W) \cdot D\)个模型参数。

图1: hierarchical模型结构,有两个embedded神经语言模型(橙色:左:文档向量;绿色/右:词向量)

一个文档序列的上下文和自然语言上下文,会使用提出的HDV方法进行建模,其中documents向量不光只看成是预测周围documents的单元,同时也看成是在它之间包含的word序列的全局上下文。该结构包含了两个embedded layers,如图1所示。upper layer可以学到一个文档序列的时序上下文,基于假设:在文档流(document stream)中时序更接近的文档在统计学上相互依赖性更强。我们注意到,时序不需要指文档的创建时间,而是用户阅读文档的时间,在我们的实验中使用该定义。bottom layer会建模word序列的上下文信息。最后,我们采用paragraph vectors的思想,将这两个layer进行连接,并将每个文档token看成是在该文档内所有词的一个全局上下文。

更正式的,给定文档序列集合S,hierarchical模型的目标函数是:最大化streaming data的log似然:

\(L = \sum_{s \in S} (\alpha \sum_{d_m \in s} \sum_{w_{mt} \in d_m} log P(w_{mt} | w_{m,t-c}: w_{m,t+c}, d) + \\ \sum _{d_m \in s} (\alpha log P(d_m | w_{m1}: w_{mT}) + \sum_{-b \le i \le b, i \neq 0} log P(d_{m+i} | d_m)))\) …(8)

其中,\(\alpha\)是权重,它会在文档序列的log似然、以及词序列的log似然的最小化之间做一个权衡(在实验中会设置\(\alpha=1\)),b是文档序列的训练上下文长度,c是词序列的训练上下文长度。在该特定架构中,我们对于下面的setence layer使用cbow模型,对于上层的document layer使用skip-gram模型。然而,我们注意到,两个模型的任一个可以被用于该hierarchy的任意层上,具体选择取决于目前手头的问题形态。

给定如图1的架构,基于当前文档\(P(d_{m+i} \mid d_m)\),观察到某一周围文档的概率,可以使用下面的softmax函数定义:

\(P(d_{m+i} | d_{m}) = \frac{exp(v_{d_m}^T v_{d_{m+i}}')} {\sum_{d=1}^{M} exp(v_{d_m}^T v_d')}\) …(9)

其中\(v_d\)和\(v_d'\)是文档d的输入和输出向量表示。更进一步,观察到一个词的概率不仅依赖于周围的词,也依赖于该词所属的文档。更准确的,概率\(P(w_{mt} \mid w_{m,t-c} : w_{m,t+c},d_m)\)被定义成:

\(P(w_{mt} | w_{m,t-c}: w_{m,t+c}, d_m) = \frac{exp(\bar{v}^T v_{w_{mt}}')} {\sum_{w=1}^{W} exp(\bar{v}^T v_w')}\) …(10)

其中,\(v_{w_{mt}}'\)是\(w_{mt}\)的输出向量表示,其中\(\bar{v}\)是该上下文(包含指定的文档\(d_m\))的平均向量表示,定义如下:

\(\bar{v} = \frac{1}{2c+1} (v_{d_m} + \sum_{-c \leq j \leq c, j \neq 0} v_{w_{m,t+j}})\) …(11)

最后,我们通过复用等式(10)和(11)来替换合适的变量,定义了以一个相同方式在\(P(d_m \mid w_{m1}: w_{m,{T_m}})\)。

3.2 模型变种

前面提到了一个典型结构,其中我们指定了在hirerachy上每一层的语言模型。然而,在真实应用中,我们会以一种更简单的方式来为不同目的区分语言模型。例如,一个新闻网站可能会对预测即时性感兴趣,即:对于个性化新闻信息流,一个用户在点击了一些其它新闻故事后接下去会阅读什么。接着,它可以使用直接的前馈模型来估计\(P(d_m \mid d_{m-b}: d_{m-1})\),即:给定了它的b个之前文档,在序列中第\(m^{th}\)个文档的概率。或者,相同的,如果我们想建模哪个文档会在读取前面序列后被读取,我们可以使用前馈模型:它可以估计\(P(d_m \mid d_{m+1}: d_{m+b})\),它是给定前b个文档的第m个文档的概率。

另外,很方便扩展该描述,但也很容易具有超过两个layers。假设我们具有一个streaming documents的数据集,它面向一个不同的用户集合(例如:对每个文档我们希望知道哪个用户生成或阅读了该文档)。接着,我们可以构建更复杂的模型, 通过在document layer的顶部添加user layer来同时学习用户的分布式表示。在该setup中,一个用户向量可以看成是指定用户的steaming documents的一个全局上下文, 一个文档向量则看成是指定文档的words的一个全局上下文。更特殊的,我们可以预测一个文档,它基于周围文档和它的内容来预测一个文档,同时也只对某一指定用户。该变种模型\(P(d_m \mid d_{m-b}:d_{m-1},u)\),其中u是对于某一用户的一个指示变量。对于提升个性化服务来说,学习用户的向量表示是一个开放问题,其中个性化会降维到:在联合embedding空间中的最简单的最近邻搜索。

3.3 模型最优化

该模型使用SGA(随机梯度上升法),很适合大规模问题。然而,在(8)中的梯度的计算 \(\delta log P(w_{mt} \mid w_{m,t-c} : w_{m,t+c},d_m)\)与词汇size W成比例,梯度\(\Delta log P(d_{m+i} \mid d_m)\)和\(\Delta log P(d_m \mid w_{m1}: w_{m,T_m})\)与训练的文档数M成比例。这在实例上很昂贵,因为W和M两者都可以很容易达到上百万的规模。

我们使用的一种有效替换方法是,hirarchical softmax,它可以将时间复杂度减小到\(O(R log(W) + bM log(M))\),其中R是在文档序列中的总词汇数。为了计算等式(9)和等式(10)中的求和,我们并不用在每次梯度step期间评估每个不同词或文档,hirarchical softmax会使用两个二叉树,一棵树将不同文档作为叶子,另一棵树将不同的词作为叶子。对于每个叶子节点,从该根节点出发的路径(path)会有一个唯一分配,它使用二进制数字进行编码。为了构建一个树结构,通常用使用Huffman编码,其中,在数据集中更常见的文档(或词)会具有更短的编码。更准确的,hierarchical softmax表示在该序列中当前文档(或词)被观察到的概率,它作不二叉树的概率积,通过文档的Huffman编码如下:

\(P(d_{m+i} \mid d_m) = \prod_l P(h_l \mid q_l, d_m)\) …(12)

其中\(h_l\)是编码中第l位的码,对应于\(q_l\),它是指定树路径\(d_{m+i}\)中的第l个节点。每个二叉树的概率定义如下:

\(P(h_l = 1 \mid q_l, d_m) = \sigma(v_{d_m}^T V_{q_l})\) …(13)

其中\(\sigma(x)\)是sigmoid函数,\(v_{q_l}\)是节点\(q_l\)的向量表示。它可以通过\(\sum_{d=1}^M P(d_{m+i}=d \mid d_m) = 1\)进行验证,因而概率分布的属性会被保留。我们可以以同样的方式计算\(P(d_m \mid w_{m1} : w_{m, T_m})\)。更进一步,我们相似地表示\(P(w_{mt} \mid w_{m,t-c}: w_{m,t+c}, d_m)\),但独立的Huffman树的构建会与词有关。

参考