microsoft在2016年提出了MV-DNN结构:《A Multi-View Deep Learning Approach for Cross Domain User Modeling in Recommendation Systems》。我们来看下该paper。

介绍

为了解决CF和CB的诸多限制,我们提出了利用user features和item features的推荐方法。为了构建user features,不同于许多user profile-based的方法,我们提出了从浏览记录、搜索历史中抽取丰富特征来建模用户的兴趣。依赖的假设是:用户的历史在线动作会影响用户的背景(background)和偏好(preference),因此提出了一种关于用户会对哪些items和topics感兴趣的更精确看法。例如,一个用户做出的许多查询和网页访问都与婴儿有关,那么她很可能是一个新生儿的母亲。有了这些丰富的在线行为,推荐相关items可以更有效率和有效果。

在我们的工作中,我们提出了一种新的deep learning方法,它扩展了DSSM(Deep Structured Semantic Models),它将users和items映射到一个共享语义空间中,并推荐那些在映射空间中与该用户具有最大相似度的items。为了达到该目的,我们的模型会对users和items进行投影,每一者都通过一个丰富的特征集表示,通过非线性转换层映射到一个完全共享的隐语义空间中,其中user的mapping以及该用户喜欢的items的mappings间的相似度会最大化。这允放该模型学习感兴趣的mappings:比如,访问了fifa.com的用户可能会读取关于世界杯相关的新闻文章、或喜欢关于PC or XBox足球游戏。用户侧的丰富特征可以允许建模用户的行为,从而克服在content-based推荐中的限制。它也可以有效解决用户的冷启动问题,因为模型允许我们从queries和相关推荐items(比如音乐)上捕获用户兴趣,即使它们没有使用音乐服务的历史记录。我们的deep learning模型具有一个ranking-based objective函数,它会将正样本(用户喜欢的items)的排序比负样本的更高。该ranking-based objective对于推荐系统更好。

另外,我们扩展了原始的DSSM模型(它被称为是single-view DNN),因为它从来自单个域的user-features 和items学习模型。我们将新模型命名为“Multi-View DNN”。在文献中,multi-view learning是一个比较成熟的领域,它可以从相互不共享的公共特征空间的数据中进行学习。我们将MV-DNN看成了在multi-view learning setup中一种通用的Deeplearning方法。特别的,在我们的数据集中有News、Apps和Movie/TV logs,我们不需要为这种不同域(domain)构建独立模型,它们可以将user features映射到相同域(domain)的item features上,我们会构建一个新的multi-view模型,它会为在隐空间中的user features发现一个单一映射,可以从所有域中使用items的特征进行联合优化。MV-DNN会利用多个跨域数据来学习一个更好的用户表示(user representation),也会利用全域的用户偏好数据使用以一种规则的方式解决数据稀疏性问题。

3.数据集描述

这部分会介绍数据集。我们描述了数据收集过程,以及每个数据集的特征表示,以及一些基础的数据统计。

在该研究中会使用4个数据集,它们从microsoft的产品中收集,包含:

  • (1) Bing Web vertical搜索引擎日志
  • (2) Bing News vertical的新闻文章浏览历史
  • (3) Windows AppStore的App下载日志
  • (4) XBox的Movie/TV观看日志

所有日志的收集从2013-12 〜 2014 6月,包含了英语系国家:美国、加拿大、英国。

(用户特征: user features):我们从Bings收集了用户的搜索queries和它们的点击urls来形成用户特征。queries首先会被归一化、获取词干、接着将它们split成unigram特征,urls会被简写成domain-level(例如:www.linkedin.com)来减小特征空间。我们接着使用TF-IDF得分来保持最流行和重要(no-trivial)特征。整体上,我们选择了300w的unigram特征和500k的domain特征,来产生一个总长度为3500w的用户特征向量

(新闻特征:News Features):我们收集了从Bing News vertical的新闻文章点击。每个News Item通过三部分特征表示。第一部分是,使用字符tri-gram表示编码的标题特征。第二部分是,使用二值特征编码的News的top-level类目(比如:娱乐)特征。第三部分是,每篇文章的命名实体,使用一个NLP parser抽取得到,同样使用tri-gram进行编码。这会产生一个包含10w维的特征向量

(APP特征):用户APP的下载历史,来自windows AppStore日志。每个App的标题使用字符tri-gram表示,会以二值形式组合上类目特征(比如:游戏)。对于APP描述常变化的特性,我们决定不包含这些特征。这一部分会产生一个5w维的特征向量

(Movie/TV Features):对于Xbox日志,我们为每个XBox用户收集了Movie/TV观看历史。每个item的标题和描述,会组合成文本特征,接着使用字符型tri-gram编码。该genre也使用二值特征编码。这一部分会产生5w维特征向量

在我们的神经网络框架中,user features被映射到user view上,其余被映射到不同的item views上。出于训练目的,每个user view会被匹配到一个item view上,它包含了用户的完整集合。为了这样做,我们对登陆用户的每个user-item view pair, 以及基于id间交叉做了抽样。这会为每个user-item view pair产生不同数目的用户。表1描述了在该paper中的一些统计。

4. 用于建模用户的DSSM

DSSM的引入是为了增强在搜索上下文中的query document matching。

图1 DSSM深度结构语义模型

DSSM的典型结构如图1所示。到DNN的输入(原始文本特征)是一个高维向量,例如,在一个query或一个文档中的terms原始数目(没有归一化)。接着DSSM会将该输入传给两个神经网络,两者都有各自不同的输入,会将它们映射到在一个共享语义空间中的语义向量中。对于网页文档排序,DSSM会计算一个query和一个document间的相关得分(对应两个语义向量间的cosine相似度),并通过相似得分进行文档排序。

更正式的,如果x表示输入的term向量,y表示输出向量,\(l_i, i=1,...,N-1\)表示内部的hidden layers,\(W_i\)表示第i个权重矩阵,\(b_i\)表示第i个bias term,我们有:

\[l_1 = W_1 x \\ l_i = f(W_i l_{i-1} + b_i), i=2,...,N-1 \\ y = f(W_N l_{N-1} + b_N)\]

…(1)

其中,我们使用tanh函数作为在output layer和hidden layers \(l_i\)上的activation函数:

\[f(x)= \frac{1 - e^{-2x}} {1+ e^{-2x}}\]

…(2)

在一个query Q和一个document D间的语义相关得分,接着通过R进行measure:

\[R(Q, D) = cosine(y_Q, y_D) = \frac{y_Q^T y_D} {||y_Q|| \cdot ||y_D||}\]

…(3)

其中,\(y_Q\)和\(y_D\)各自是query和document的语义向量。在Web搜索中,给定query,document会通过它们的语义相关得分进行排序。

惯例上,每个word w通过一个one-hot词向量表示,其它维度对应于词汇表size。然而,词汇表size经常在现实中非常大,one-hot向量的词表示会让模型学习开销很大。因此,DSSM使用word hashing layer通过一个letter-trigram向量来表示一个词。例如:给定一个词(web),在添加了词边界符号后(#web#),该词被分割成ngram序列(#we, web, eb#)。接着,该词被表示成一个关于letter-trigrams的count vector。例如,web的letter-trigram表示为:

在图1中,第一层 matrix \(W_1\)表示letter-trigram矩阵,它从一个term-vector转移到它的letter-trigram count vector上,无需学习。尽管英文words的总数目会增长得相当大,去重后的英文letter-trigrams的总数目通常是有限的。因此,它可以泛化到在训练数据中那些未见过的新词上。

在训练中,假设一个query与该query下被点击的documents相关,DSSM的参数(例如:权重矩阵\(W_i\)),可以使用该信号被训练。例如,给定一个query后一个document的后验概率,可以从两者间的语义相关分数中会通过一个softmax函数进行估计:

\[P(D|Q) = \frac{exp(\gamma R(Q,D))}{\sum\limits_{D' \in D} exp(\gamma R(Q,D'))}\]

…(4)

其中\(\gamma\)是softmax的一个平滑因子,它通常会在一个held-out数据集上进行经验型设置。D表示要排序的候选文档集合。理想的,D应包含所有可能的文档。实际上,对于(query, clicked-document) pair,可以使用\((Q, D^+)\)表示,其中:

  • Q表示一个query
  • \(D^{+}\)表示点击的文档,
  • \(\lbrace D_j^-; j=1, ..., N\rbrace\)来表示: N个随机选中的未点击文档
  • D: 包含\(D^{+}\)和N个随机选中的未点击文档来近似D

在训练中,模型参数被估计成:给定queries,被点击文档的极大似然:

\[L(\Lambda) = \log \prod\limits_{(Q,D^+)} P(D^+ | Q)\]

…(5)

其中,\(\Lambda\)表示神经网络的参数集。

5.MV-DNN

DSSM可以看成是一个multi-learning框架,其中它会将两种不同的数据视图映射到一个共享视图(shared view)中。在某种程度上,它可以被看成是:在一个更通用的setting中来学习两个不同views间的一个共享mapping。

图2: 多域推荐(multiple domain recommendation)的MV-DNN。它使用一个DNN来将高维稀疏特征(例如:users, News, App的原始特征)映射成低维dense特征到一个联合语义空间中(joint semantic space)。第一个hidden layer,有50k units,会完成word hashing。word-hashed features接着通过多个非线性投影投影层被投影。最后一层的activities会形成在语义空间中的特征。注意,在该图中的输入特征维度x(5M和3M)被假设成:每个view可以有任意的特征数。详见文本。

在该工作中,我们提出了一个DSSM的扩展,它具有对数据的多个views,我们称之为Multi-view DNN。在该setting中,我们具有v+1个views,一个主视图(pivot view)称为\(X_u\),其它v个辅助视图(auxiliary views)为:\(X_1, ..., X_v\)。每个\(X_i\)具有它自己的输入域\(X_i \in R^{d_i}\)。每个view也具有它自己的非线性映射层 \(f_i(X_i, W_i)\),它会将\(X_i\)转换到共享语义空间\(Y_i\)上。训练数据包含了一个样本集合。第j个样本具有主view \(X_{u,j}\)的一个实例,以及一个活动辅助视图\(X_{a,j}\),其中a是在sample j中active view的索引。所有其它视图输入\(X_{i:i \neq a}\)被设置为0向量(0 vectors)。该学习目标是(objects)是为每个view(比如:相似的求和)发现一个线性映射,以便最大化相似度(在主视图\(Y_u\) mapping以及其它视图\(Y_1, ..., Y_v\) mapping间的语义空间的相似度)的求和。公式为:

\[p = arg max_{W_u, W_1,...,W_v} \sum\limits_{j=1}^N \frac{e^{\alpha_a cos(Y_u, Y_{a,j}}}{ \sum_{X' \in R^{d_a}} e^{\alpha cos(Y_u, f_a(X', W_a))} }\]

…(6)

MV-DNN的结构如图2所示。在我们的推荐系统设置中,我们将\(X_u\)设置为user features的主视图,并为各种不同的想推荐的items类型创建了辅助视图。

该目标函数是意图是,为users features尝试找到单个mapping(\(W_u\)),可以将users features转换到一个空间中,它与该用户在不同视图/域中所喜欢的所有其它items相匹配(match)。该方法会共享参数,并允许该域(domains)即使没有足够信息也能学习较好的mapping(通过其它带有足够信息的domains数据来学)。

如果假设具有相似新闻文章品味的用户,同时也在其它域(domains)上有相似品味,这意味着这些domains可以从通过News domain学到的user mapping上受益。如果该假设是合法的,那么从任意domain上的样本都可以帮助将相似用户在所有domains上进行更准确的分群。经验结果表明,在该domains上的假设是合理的,我们会在实验章节再做描述。

5.1 训练MV-DNN

MV-DNN可以使用SGD进行训练。实际上,每个训练样本会包含一个输入对(inputs pairs),一个用于用户视图(user view),一个用于其它数据视图。因此,尽管事实上在我们的模型只有一个用户视图(user view),通常采用N个用户特征文件会更方便,每个对应于一个item feature file,其中N是user-item view pairs的总数目。在算法1中,我们会描述训练MV-DNN的高级过程。当各自对所有\(W_i \in \lbrace W_u, W_1, ..., W_v \rbrace\)进行求导时,我们会得到两个非零导数 \(\frac{\partial p }{\partial W_u}\)和 \(\frac{\partial p}{\partial W_a}\),它允许我们应用与DSSM相同的梯度更新规则【9】,使用\(X_u\)来取代q,使用\(X_a\)来取代d。

算法1

5.2 MV-DNN的优点

尽管MV-DNN是从原始的DSSM框架进行扩展而来的,但它具有许多独特的特性比前者更优。首先,原始的DSSM模型用于相同特征维度size的query view和document view的,使用相同的表示(representation)进行预处理(例如:letter tri-gram)。这在特征组合阶段会有巨大限制。由于推荐系统的差异性,很可能user view和item view会有不同的输入特征。同时,许多类型的特征不能使用letter trigram进行最优表示。例如,URL domain feature通常包含了前缀和后缀,(比如:www, com, org),它们会被映射到相同的特征上(如果使用了letter tri-gram)。实际上,我们已经发现,当输入原始文本很短时(例如:原始DSSM模型中的query text和document title),该letter tri-gram表示很理想,但如果建模包含了大量queries和url domains的用户级别特征(user level features)就会变得不合适。新的MV-DNN会移除该限制,来包含类别型特征(比如:电影类型和app类目,地理特征:比如国家和区域),也可以包含原始文本特征(用户输入侧使用1-grams或2-grams来表示)。

第二,MV-DNN可以扩展到许多不同的domains上,原始DSSM框加做不到。通过在每个user-item view pair上执行pair-wise训练(如算法1描述所示),我们的模型可以很方便的采用view pairs的新集合,在训练过程中的任意阶段,它包含了完全独立的users和items集合;例如:添加来自Xbox games的一个新数据集。通过在每个训练迭代过程中选择user-view pairs,我们的模型事实上可以收敛到一个最优的user view embedding上,它通过所有的item views训练得到。注意,尽管理论上我们在不同的item-views上具有不同的user sets,在我们的实验期间,考虑便利性和特征归一化的方便,我们会选择在所有views上保持相同集合的用户。

6.数据降维

实际上,提出的深度学习方法通常需要为user view处理高维特征空间中的海量训练样本。为了扩展系统,我们提出了许多降维技术来减少在user view上特征数。接着,我们提出了一个思想来压缩(compact)和总结(summarize)用户训练样本,它可以将训练数据的数目减少到与users数目成线性倍数上。

6.1 top features

对于user features,一种简单的降维方法是,选择top-k个最常用的特征。。。。

6.2 K-means

6.3 LSH

6.4 减小训练样本数

每个view的训练样本包含了一个关于\((User_i, Item_j)\) pairs集合(表示:\(User_i喜欢Item_j\))。实际上,一个user可能会喜欢许多items,它们有时候会造成训练数据非常大。例如,在我们的新闻推荐数据集上,大概有10亿pairs数目,这会造成训练过程非常慢(当使用最优的GPU实现时)。

为了解决该问题,我们会压缩训练数据,以便它对于每个user每个view都可以包含单个训练样本。特别的,压缩版的训练样本包含了user features 与一个用户在该view中所喜欢的所有items的平均分的 features组成的pairs。

实验

详见paper。

参考

microsoft在2013年提出了DSSM结构:《Learning Deep Structured Semantic Models for Web Search using Clickthrough Data》。我们来看下该paper。

介绍

主要基于在IR上的隐语义模型的两点扩展。第一是以监督方式利用点击数据来学习隐语义模型【10】。第二是引入深度学习方法进行语义建模。

2.1 隐语义模型和点击数据的使用

对于query-document matching来说,在IR社区中使用隐语义模型是一个长期存在的研究主题。流行的模型可以分为两大类:线性投影模型和生成主题模型。

IR领域最著名的线性投影模型是LSA。通过在一个document-term矩阵上使用SVD,一个document(或一个query)可以映射成一个低维概念向量(conecpt vector):\(\hat{D} = A^T D\),其中A是投影矩阵。在文档搜索中,在一个query和一个document间的相关分(可以通过term向量分别表示为Q和D),根据投影矩阵A, 被认为是与概念向量\(\hat{Q}\)和\(\hat{D}\)间的cosine相似度得分成比例:

\[sim_A(Q,D) = \frac{\hat{Q}^T \hat{D}}{ \| \hat{Q} \| \|\hat{D} \|}\]

…(1)

除了隐语义模型,在被点击的query-document pairs上训练的转换模型(translation models)也提供了一种语义匹配的方法[9】。不像隐语义模型,翻译模型可以直接通过在一个document中的一个term和在一个query中的一个term间的转换关系(translation relationships)。最近研究表明,大量的点击数据用户训练,该方法可以非常高效。我们在实验中也进行了比较。

2.2 deep learning

3.DSSM

3.1 DNN用于计算语义特征

图1: DSSM图示。它使用一个DNN将高维稀疏文本特征投影到在语义空间中的低维dense特征。第一个hidden layer具有30k units,会完成word hashing。word-hashed features接着通过多个非线性投影层进行投影,在DNN中的最后一层的activities会形成在语义空间中的特征

通常我们开发的DNN结构,用于将原始文本特征(raw text features)映射到在一个语义空间中的特征(如图1所示)。DNN的输入(raw text features)是一个高维term vector,例如:在query中的terms的原始数目,或者一个没有归一化的文档,DNN输出是在一个低维语义特征空间中的一个concept vector。该DNN模型可以以如下方式用于网页文档排序(Web document ranking):

  • 1) 将term vectors映射到它们相应的语义concept vectors上
  • 2) 计算一个document和一个query间相关分,作为他们相应的语义concept vectors的cosine相似度 等式(3)和(5)

更正式的,如果我们将x表示成input term vector,y表示output vector,\(l_i, i=1, ..., N=1\),表示中间的hidden layers,\(W_i\)表示第i个weight matrix,\(b_i\)表示第i个bias term,我们有:

\[l_1 = W_1 x \\ l_i = f(W_i l_{i-1} + b_i), i=2, ..., N-1 \\ y = f(W_N l_{N-1} + b_N)\]

…(3)

其中,我们使用tanh作为hidden layers和output layer的activation函数:

\[f(x)= \frac{1 - e^{-2x}}{1 + e^{-2x}}\]

…(4)

在一个query Q和一个document D之间的语义相关得分,可以通过下面方式进行衡量:

\[R(Q,D) = cosine(y_Q, y_D) = \frac{y_Q^T y_D}{ \| y_Q \| \| y_D \|}\]

…(5)

其中\(y_Q\)和\(y_D\)分别是query和document的是concept vectors。在web search领域,给定query,document可以通过它们的语义相关得分进行排序。

习惯上,term vector的size,可以被看成是在IR中原始的bag-of-words特征,等同于用于索引web document集合的字典表。字典的size通常非常大。因此,当使用term vector作为输入时,input layer的size对于inference和training来说无法想像。为了解决这个问题,我们开发了一个称为”word hashing”的方法来做为DNN的第一层,如图1的最低端所示。该layer只包含线性隐单元(linear hidden units),在其中有非常大size的权重矩阵不会被学习。在下面章节,我们描述了word hashing方法。

3.2 word hashing

这里描述的word hashing方法,目标是减少bag-of-words term vectors的维度。它基于字母型letter n-gram,该方法特别适合这个任务。给定一个词(比如:good),我们首先会添加起始结束标记(比如:#good#),接着,我们将该词切分成letter n-grams(例如,letter trigrams: #go, goo, ood, od#)。最终,该word会使用一个关于letter n-grams的向量进行表示。

表1

该方法存在的一个问题是冲突(collision),例如,两个不同的词可以具有相同的letter n-gram vector表示。表1展示了关于在两个字典表上word hashing的一些统计。对比起one-hot vector的原始size,word hashing允许我们使用更低维度来表示一个query和一个document。以40k个词的字典作为示例。每个word可以被表示成使用leter-trigrams的一个10306维向量,给定一个4-fold降维会有较少冲突。当该技术应用到一个更大词汇表上时会有更大降维。如表1所示,在500k-word的字典表里,使用letter trigrams通过一个30621维向量来表示每个词, 16-fold的降维会有一个冲突率为0.0044% (=22/5000000)

由于英文单词数目是无限的,而英文(或其它相似语言)中的letter n-grams通常是有限的。另外,word hashing可以将具有不同字形的相同词映射到在letter n-gram空间中比较接近的点上。更重要的,当在训练集中的一个未见词(unseen word)以word-based representation时总是会引起困难,而使用letter n-gram-based representation则不会。唯一的风险是冲突会随着表1中的量而增加。因而,letter n-gram-based word hashing对于out-of-vocabulary问题是健壮的,允许我们将DNN解法扩展到包含极大词表量的Web search任务中。我们会演示第4节中展示该技术的好处。

在我们的实验中,基于word hashing的letter n-gram可以被看成是一个固定的线性转换(例如:非适配的 non-adaptive),通过这种方式,在input layer上的一个term vector可以被投影到在下一layer上的一个letter n-gram vector上,如图1所示。由于letter n-gram vector具有更低的维度,DNN learning可以有效执行。

3.3 DSSM的学习

点击日志包含了一列queries和它对应的点击文档。我们假设一个query与该query对应点击的文档是相关的(至少部分上是)。受语音和nlp领域判别式训练方法的影响(discriminative),我们提出了一个监督式训练方法来学习我们的模型参数,例如:权重矩阵\(W_i\)和bias vector \(b_i\)是DSSM的必要部分,因此学习目标是:给定queries,最大化点击文档的条件似然。

首先,我们会计算给定一个query,一个文档的后验概率,可以通过一个softmax函数:

\[P(D|Q) = \frac{exp(\gamma R(Q,D))}{\sum_{D' \in D} exp(\gamma R(Q,D'))}\]

…(6)

其中,\(\gamma\)是一个softmax的平滑因子,它会根据经验进行设置。D表示待排序的候选文档集合。理想情况下,D应包含所有可能的文档。实现上,对于每个(query, click-document) pair,可以通过\((Q, D^+)\)来表示。其中:

  • Q是一个query
  • \(D^+\)是点击的文档
  • \({D_j^-; j=1, ..., 4}\)表示4个随机选中的未点击文档。

在我们的学习中,当使用不同抽样策略来选择未点击文档时,我们不会观察到任何不同。

在训练阶段,估计的模型参数会对给定queries下的点击文档的似然做最大化。事实上,我们需要最小化以下的loss function:

\[L(\Lambda) = -log \prod\limits_{Q,D^+} P(D^+ | Q)\]

…(7)

其中,\(\Lambda\)表示网络\(\lbrace W_i, b_i \rbrace\)的参数集,由于 \(L(\Lambda)\)对于\(\Lambda\)是可微的,模型的训练使用基于梯度的数值优化算法。

3.4 实现细节

为了决定训练参数以及避免overfitting,我们可以将点击数据分割成不重合的两部分,称为training set和validation set。在我们的实验中,我们使用如图1的三个hidden layers。第一个hidden layer是word hashing layer,它包含了30k节点(如表1所示的letter-trigrams的size)。下二个hidden layers具有300个hidden nodes,output layer具有128个nodes。word hashing会基于一个固定的投影矩阵。相似度会基于128维的output layer进行measure。根据[20],我们会在范围为:\((-\sqrt{6/(fanin+fanout)}, \sqrt{6/(fanin+fanout)})\)间的uniform分布来初始化网络权重,其中fanin和fanout是input和output units的数目。经验上,我们可以通过做layer-wise预训练但没有观察到更好的效果。在训练阶段,我们会使用mini-batch SGD来最优化模型。每个mini-batch包含了1024个训练样本。我们观察到DNN训练通常会在整个训练数据的20 epochs内收敛。

实验

详见paper。

参考

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。

参考