1.介绍

对于词(words)的分布式组成语义的算法开发是一个长期存在的开放性难题。最近几年的算法有:将word vectors映射到sentence vectors(包括recursive networks, recurrent networks, convolutional networks,以及recursive-convolutional方法)。所有的这些方法会生成句子表示,传给一个监督式任务,依赖一个class label来对组成权重(composition weights)做BP算法。因而,这些方法能学到高质量句子表示,但只能对自己的特定任务进行调整。paragraph vector是另一种方法,它通过引入一个分布式句子索引作为模型的一部分,以非监督式学习进行句子表示。

本文中,我们考虑了另一种loss function,可以用于任何组成操作(composition operator)上。考虑以下的问题:是否存在一个任务,它对应的loss允许我们学习高度泛化的句子表示?受使用word vector学习的启发,我们提出了一个目标函数,它从句子级别上抽象了skip-gram模型。也就是说,它不再使用单个word来预测它的上下文,我们会encode一个句子。因而,任何组成操作(composition operator)都适用于一个句子编码器(sentence encoder),只是目标函数被修改了而已。图1展示了该模型,我们会调用我们的skip-thoughts模型和向量。

图1: skip-thoughts模型。给定一个tuple(\(s_{i-1}, s_i, s_{i+1}\)),\(s_i\)表示book中的第i个句子,\(s_i\)被编码并尝试重构前一个句子\(s_{i+1}\)和下一个句子\(s_{i+1}\)。在本例中,输入的句子三元组:I got back home. I could see the cat on the steps. This was strange. 未绑定箭头被连接到encoder output上。颜色表示哪个component共享参数。(与skip-gram有点像)

表1: BookCorpus dataset的统计信息

我们的模型依赖于一个关于连续文本的训练语料。我们选择使用一个小说集合BookCorpus dataset来训练我们的模型。这些书由未出版的作者编写。该dataset具有6种不同的种类:Romance, Fantasy, Science fiction , Teen等。表1高亮了该语料的统计。伴随着故事,书包含着对话,感情(emotion)和广泛的字符交叉。另外,训练集的量很大,不会偏向于任何特定领域或应用。表2展示了该语料中句子的最近邻。该结果展示了skip-thought vectors精确地捕获了编码后的句子的语义和结构。

表2: 在每个样本中,第一个句子是一个query,而第二个句子是它的最近邻。通过从语料中随机抽取5w个句子中,通过计算cosine相似度进行最近邻分数排序。

我们以新的setting评估了我们的向量:在学到skip-thoughts后,冻结模型,使用encoder作为一个泛化的特征抽取器(generic feature extractor)以用于特定任务。在我们的实验中,我们考虑了8个任务:句义相关性,段落检测,图像句子排序以及其它5个标准的分类benchmarks。在这些实验中,我们抽取了skip-thought向量,并训练了线性模型来评估它的表示(representations),没有任何额外的参数fine-tuning。结果说明,skip-thoughts提出的泛化表示对所有任务都很robust。

一个难点是,这样的实验会构建一个足够大的词汇表来编码句子。例如,一个从wikipedia文章中的句子可能包含了与我们的词汇表高度不一样的名词。为了解决这个问题,我们学到了一个mapping:从一个模型传递给另一个模型。通过使用cbow模型预训练好的word2vec表示,我们学到了这样的一个线性映射:将在word2vec空间中的一个词映射到encoder词汇表空间中的一个词上。学到的该mapping会使用所有单词,它们共享相同的词汇表。在训练后,出现在word2vec中的任何word,可以在encoder word embedding空间中获得一个vector。

2.方法

2.1 引入skip-ghought vectors

我们使用encoder-decoder模型框架来对待skip-thoughts。也就是说,一个encoder会将words映射到一个句子向量(sentence vector)上,一个decoder会用于生成周围的句子。在该setting中,一个encoder被用于将一个英文句子映射到一个向量。decoder接着根据该向量来生成一个关于源英文句子(source sentence)的翻译(translation)。已经探索了许多encoder-decoder pair选择,包括:ConvNet-RNN,RNN-RNN,LSTM-LSTM。源句子表示(source sentence representation)也可以通过使用一个attention机制来动态变化,用于说明任何时候只有相关的才用于翻译(translation)。在我们的模型中,我们使用一个带GRU activations的RNN encoder,以及一个conditional GRU的RNN decoder。该模型组合近似等同于神经机器翻译中的RNN encoder-decoder【11】。GRU展示了在序列建模任务中效果比LSTM要好,并且更简单。GRU units只有两个gates,不需要使用一个cell。而我们的模型则使用RNN,只要能在它之上进行BP算法,任何encoder和decoder可以被使用。

假设我们给定了一个句子的tuple:\((s_{i-1}, s_i, s_{i+1})\)。假设\(w_i^t\)表示了句子中的第t个word,\(x_i^t\)表示它的word embedding。我们将模型描述成三部分:encoder,decoder,目标函数。

Encoder:假设\(w_i^1, ..., w_i^N\)是句子\(s_i\)中的words,其中N表示在句子中的words数目。在每个step中,encoder会产生一个hidden state:\(h_i^t\),它可以解释成序列\(w_i^1,...,w_i^t\)的表示(representation)。hidden state:\(h_i^N\)可以表示整个句子。

为了encode一个句子,我们对下面的等式进行迭代(这里去掉了下标i):

\(r^t = \sigma(W_r x^t + U_r h^{t-1})\) … (1)

\(z^t = \sigma(W_z x^t + U_z h^{t-1})\) … (2)

\(\bar{h}^t = tanh(W x^t + U (r^t \odot h^{t-1})\) … (3)

\(h^t = (1-z^t) \odot h^{t-1} + z^t \odot \bar{h}^t\) …(4)

其中 \(\bar{h}^t\)是在时间t提出的状态更新,\(z^t\)是update gate,\(r^t\)是reset gate(\(\odot\))表示一个component-wise product。两个update gates会采用0到1间的值。

Decoder: decoder是一个神经语言模型,它的条件是encoder output \(h_i\)。该计算与encoder相似,除了我们引入了矩阵\(C_z,C_r\),以及C,它们被用于偏置由句子向量计算得到的update gate,reset gate和hidden state。一个decoder会被用于下一个句子\(s_{i+1}\),而第二个decoder被用于前一句子\(s_{i-1}\)。Separate参数被用于每个decoder,除了词汇矩阵V,它的权重矩阵会连接decoder的hidden state,以便计算在词上的一个分布。我们在下一个句子\(s_{i+1}\)上描述decoder,通过一个在前一句子\(s_{i-1}\)上的类似计算得到。假设\(h_{i+1}^t\)表示decoder在时间t的hidden state。对下面的等式进行迭代(丢掉下标i+1):

\(r^t = \sigma(W_r^d x^{t-1} + U_r^d h^{t-1} + C_r h_i)\) …(5)

\(z^t = \sigma(W_z^d x^{t-1} + U_z^d h^{t-1} + C_z h_i)\) …(6)

\(\bar{h}^t = tanh(W^d x^{t-1} + U^d (r^t \odot h^{t-1} + C h_i\) …(7)

\(h_{i+1}^t = (1-z^t) \odot h^{t-1} + z^t \odot \bar{h}^t\) …(8)

给定\(h_{i+1}^t\),单词\(w_{i+1}^t\)的概率给出了前(t-1) words,encoder vector为:

\(P(w_{i+1}^t | w_{i+1}^{<t}, h_i) \propto exp(v_{w_{i+1}^t} h_{i+1}^t )\) …(9)

其中,\(v_{w_{i+1}^{t}}\)表示V的行,对应于word \(w_{i+1}^t\)。对于前面句子\(s_{i-1}\)可以做一个类似的计算。

目标函数。给定一个tuple \((s_{i-1}, s_i, s_{i+1})\),目标优化为:

\(\sum_{t} log P(w_{i+1}^t | w_{i+1}^{<t}, h_i) + \sum_{t} log P(w_{i-1}^t | w_{i-1}^{<t}, h_i)\) …(10)

总的目标函数是对所有这样的training tuples进行求和。

2.2 词汇表膨胀

现在,我们会描述如何将我们的encoder的词汇表扩展到那些在训练期间未见过的词上。假设我们有个被训练的模型引入了词表示(word representations),假设\(V_{rnn}\)表示了RNN的词向量空间。我们假设词汇表\(V_{w2v}\)比\(V_{rnn}\)更大。我们的目标是构建一个mapping f: \(V_{w2v} \rightarrow V_{rnn}\),它由一个矩阵W进行参数化,比如:\(v'=Wv\),其中\(v \in V_{w2v}\), \(v' \in V_{rnn}\)。受[15]的启发,它会学到在词空间转移之间的线性映射,我们为矩阵W求解一个非正则的L2线性回归loss。这样,对于编码中的句子,任何来自\(V_{w2v}\)的词可以被映射到\(V_{rnn}\)。

3 实验

在我们的实验中,我们在BookCorpus dataset上评估了我们的encoder作为一个通用的feature extractor的性能。实验setup如下:

  • 使用学到的encoder作为一个feature extractor,抽取所有句子的skip-thought vectors
  • 如果该任务涉及到计算句子对(pairs of sentences)之间的分数,会计算pairs间的component-wise features。
  • 在抽取的features上训练一个线性分类器,在skip-thoughts模型中没有任何额外的fine-tuning或者backpropagation。

我们限定在线性分类器主要出于两个原因。第一个是为了直接评估计算向量的representation quality。如果使用非线性模型可能会获得额外的性能增益,但这超出了我们的目标。再者,它可以允许更好地分析学到的representations的优点和缺点。第二个原因是,重现(reproducibility)很简单。

3.1 训练细节

为了引入skip-thought vectors,我们在我们的book corpus上训练了两个独立的模型。一个是带有2400维的unidirectional encoder,它常被称为uni-skip。另一个是一个bidirectional model,forward和backward每个各1200维。该模型包含了两个encoder,它们具有不同的参数:一个encoder会给出正确顺序的句子,另一个会给出逆序的句子。输出接着被拼接形成一个2400维的向量。我们将该模型称为bi-skip。对于训练,我们会初始化所有的recurrent矩阵:进行正交初始化。non-recurrent weights则从一个[-0.1, 0.1]的均匀分布上进行初始化。使用mini-batches的size=128, 如果参数向量的norm超过10, 梯度会被裁减(clip)。我们使用Adam算法进行optimization。模型会被训练两周。另外作为一个额外的试验,我们使用一个组合模型导出了试验结果,包含了uni-skip和bi-skip,会生成4800维的向量。我们称该模型为combine-skip。

在被模型被训练后,我们接着使用词汇扩展,将word embedding映射到RNN encoder空间上。会使用公开提供的CBOW word vectors[2]。被训练的skip-thought会有一个词汇size=20000个词。在从CBOW模型中移除多个word样本后,会产生一个词汇size=930911个词。这样,即使被训练的skip-thoughts模型具有20000个词,在词汇表扩展后,我们可以对930991个可能的词进行成功编码。

由于我们的目标是将skip-thoughts作为一个通用的feature extractor进行评估,我们将文本预处理保持最低水平。当编码新句子时,除了基本的tokenization,不会有额外的预处理。这样做可以测试我们的vectors的健壮性。作为一个额外的baseline,我们也会考虑来自uni-skip模型学到的word vectors的平均(mean)。我们将该baseline称为bow。这会决定着在BookCorpus上训练的标准baseline的效果。

3.2 语义相关性

3.3 段落检测

3.4 Image-sentence ranking

3.5 Classification benchmarks

3.6 skip-thoughts可视化

t-sne.

参考

Convolutional Neural Networks for Sentence Classification

《Web Metasearch: Rank vs. Score Based Rank Aggregation Methods》提出了rank fusion的问题。

1.介绍

rank fusion的问题是,给定多个judges的独立ranking偏好(一个ranking是一个items集合的线性顺序),计算一个“一致的(consensus)”ranking。该ranking fusion问题出现在许多情况下,一个著名的场景是metasearch:metasearch会处理由多个search engines对于一个给定query所返回的多个result lists组合,其中,在result list中的每个item对于各自的search engine是有序的,并且有一个相关分值。

搜索引擎们会帮助人们定位与用户信息相关的信息,但仍有一些不足:

  • i) 检索web数据是一个耗时的任务。由于web内容变化很快,每个search engine必须在覆盖率(coverage)间做个trade-off,例如,web文档的数据会与整个web以及更新频率(例如,在完整数据库的后续re-indexing间发生的时间)有关。
  • ii) 有许多信息源
  • iii) 对于一些搜索引擎,广告商付费越多,在search results上的rank会越高,这被称为:“pay-for-placement”,这在precesion上会有平均损失
  • iv) search engines会有作弊(spamming)

由于上述这些限制,必须引入metasearch engines来提升检索效果。

ranking fusion的理想场景是,每个judge(search engine)给出对所有alternative items一个完整顺序。不幸的是,在metasearch中这不太现实,有两个原因:

  • i) search engines的coverage是不同的
  • ii) search engines会限制访问top 100 or 1000个ranked items

因此,rank aggregation必须可以处理具有有限数目个entires的每个ranking。当然,如果rankings间没有重叠项,。。。设计ranking fusion的一个挑战是,当在每个ranking中的top 几百个/上午个items间存在有限个重合项(但non-trivial)。

。。。

2.ranking fusion方法

对于rank-ordered lists进行合并,存在许多方法。最基础的,他们会使用来自ranked lists中已经提供的信息。在大多数情史中,策略依赖于以下信息:

  • i) 顺序排序(irdinal rank):rank list中的一个item分配一个顺序
  • ii) 得分(score):在rank list中分配给每个item的得分

在score-based方法中,items会根据rank lists中的scores进地rank,或者对这些scores做一些转换(transformation)[1,4,8,9,12,13,17,18];而在rank-based方法中,items会根据rank lists中的rank重新排序,或者对这些ranks做一些转换[1,7,12,19]。另一种正交去重的rank fusion方法则依赖于训练数据(比如:Bayes-fuse方法[1],或者线性组合方法[17],或者偏好rank组合方法[8])。基它一些方法基于ranked items的内容。

2.1 前提

首先看一些基本定义。假设:

  • U是一个items集合,称为“universe”。
  • \(\tau\)是一个rank list,它与U有关,是关于子集\(S \subseteq U\)的一个排序,例如:\(\tau = [x_1 \geq x_2 \geq \cdots \geq x_k\),对于每个\(x_i \in S\),\(\geq\)是在S上的顺序关系.

如果 \(i \in U\)出现在\(\tau\)中,写成\(i \in \tau\),\(\tau(i)\)表示i的position或rank。我们假设\(U = \lbrace 1,2,\cdots, \mid U \mid \rbrace\),通过对每个\(i \in U\)分配一个唯一的id,没有对普适性有损失。

。。。

2.2 Fusion方法

本节中,我们将讲述分析的ranking fusion方法。考虑一个包含了n个rankings的集合\(R=\lbrace \tau_1, \cdots, \tau_n \rbrace\)。假设:

  • U表示在\(\tau_1, \cdots, \tau_n\)中的items的union,例如:\(U = \cup_{\tau \in R, i \in \tau} \lbrace i \rbrace\)。
  • \(\hat{\tau}\)表示ranking(被称为fused ranking或fused rank list),它是一个rank fusion方法应用到在R中的rank lists之后得到的结果。

为了彻底说明\(\hat{\tau}\),它足够决定分值\(s^{\tau}(i)\)(称为:fused score)(对于每个item \(i \in U\)),因为\(\hat{\tau}\)会根据\(s^{\hat{\tau}}\)的值递减进行排序。我们认为:

  • 如果两个fused ranking \(\hat{\tau}_1, \hat{\tau}_2\)是相等的(equal),则:\(\hat{\tau}_1 = \hat{\tau}_2\)
  • 如果\(\hat{\tau}_1\)和\(\hat{\tau}_2\)是等价的(equivalent),那么对于\(i \in U\),有\(\hat{\tau}_1(i) = \hat{\tau}_2(i)\)(他们具有相同的顺序)

当然,equality意味着equivalence,但反过来不成立。

2.2.1 线性组合

Fox[9]提出的ranking fusion方法基于对每个item的归一化得分(normalised score)采用不加权(unweighted)的min, max或sum。另外,Lee[12]解决了rank取代score的case。两种方法如下:

\[CombSUM: s^{\hat{\tau}}(i) = \sum\limits_{\tau \in R} w^{\tau}(i) \\ CombMNZ: s^{\hat{\tau}}(i) = h(i, R) \cdot \sum\limits_{\tau \in R} w^{\tau}(i)\]

从[9,12]的测试结果看,CombMNZ被认为是最好的ranking fusion方法,它的效果要稍好于CombSUM。根据Lee的实验,CombMNZ基于该事实:“不同搜索引擎返回(return)相似的相关文档集合,但检索(retrieve)不同的不相关文档集合”。确实,CombMNZ组合函数会对常见文档进行大的加权。

。。。

2.2.1.1 Borda Count

Borda的方法[2,14]是一个基于ranks的voting方法,例如,一个candidate出现在每个voter的ranked list中,则会为相应的ranks分配一个weight。计算上非常简单,因为实现是线性的。Borda Count (BC)方法在rank fusion问题中被引入,并以如下方式运转。每个voter会对一个关于c个candidates的固定集合以偏好顺序进行rank。对于每个voter,会给top ranked candidate为c分,第二个ranked candidate会得到c-1分,以此类推。在unranked candidates间则均匀分配剩余得分。candidates会以总分(total points)的递减顺序进行rank。正式的,该方法与以下过程等价:对于每个item \(i \in U\)以及rank list \(\tau \in R\),Borda归一化权重为\(w^{\tau}(i)\)(定义1)。fused rank list \(\hat{\tau}\)根据Borda score \(s^{\hat{\tau}}\)的顺序排序,其中在\(\hat{\tau}\)中的一个item \(i \in U\)被定义为:

\[s^{\hat{\tau}}(i) = \sum\limits_{\tau \in R} w^{\tau}(i)\]

…(6)

相应的,BC等价于CombSUM方法组合上Borda rank normalisation,(例如:\(\sum.b.0\))。Aslam[1]也考虑过一种Weighted Borda Count,其中,在对归一化Borda weights求和的部分,会使用这些weights的一个线性组合。

2.2.2 Markovchain-based方法

[7]中提出一种关于rank fusion的有意思的方法,它基于Markov chains实现。一个系统的一个(齐次:homogeneous)Markov chain可以通过一个状态集\(S=\lbrace 1,2, \cdots, \mid S \mid \rbrace\)以及一个\(\mid S \mid \times \mid S \mid\)的非负随机矩阵M(例如:每行的求和为1)来指定。该系统从S中的某个状态开始,并在每个step时会从一个state转移到另一个state。转移(transition)通过矩阵M来指导:在每个step上,如果系统从状态i移到状态j的概率为\(M_{ij}\)。如果给定当前状态作为概率分布,下一状态的概率分布通过表示当前状态的该vector与M相乘得到。总之,系统的起始状态(start state)根据在S上的一些分布x被选中。在m个steps后,该系统的状态会根据\(xM^m\)进行分布。在一些条件下,不需要考虑起始分布x,该系统最终会达到一个唯一确定点(状态分布不再变化)。该分布称为“稳态分布(stationary distribution)”。该分布可以通过M的左主特征向量(principal left eigenvector)y给出,例如:\(yM = \lambda y\)。实际上,一个简单的power-iteration算法可以快速获得关于y的一个合理近似。y中的entries定义了在S上的一个天然顺序。我们称这样的顺序为M的马尔可夫排序(Markov chain ordering)

对rank fusion问题使用Markov chains如下所示。状态集合(State Set) S对应于包含待排序(rank)的所有candidates的list(例如:在\(R=\lbrace \tau_1, \cdots, \tau_2 \rbrace\)中的所有items的集合)。在M中的转移概率在某种程度上依赖于\(\tau_1, \cdots, \tau_n\),待估计的\(\hat{\tau}\)是在M上的Markov chain ordering。下面,[7]提出了一些Markov chains(MC):

  • \(MC_1\): 如果当前state为item i,那么,下一state从对应rank >= item i的所有items j的multiset中均匀选中,例如,从multiset \(Q_i^{C_1} = \cup_{k=1}^n \lbrace j: \tau_k(j) \leq \tau_k(i) \rbrace\)中均匀选中下一state。

  • \(MC_2\):如果当前state为item i,下一state的挑选过程如下:首先从所有包含i的\(\tau_1, \cdots, \tau_n\)中均匀选中一个ranking \(\tau\),接着从集合\(Q_{\tau,i}^{C_2} = \lbrace \tau(j) \leq \tau(i) \rbrace\)中均匀选中一个item j

  • \(MC_3\):如果当前state为item i,下一state的挑选过程如下:首先从包含i的所有\(\tau_1, \cdots, \tau_n\)中均匀选择一个ranking \(\tau\),接着均匀选择通过\(\tau\)排序的一个item j。如果\(\tau(j) < \tau(i)\)那么跳到j,否则留在i;

  • \(MC_4\):如果当前state为item i,下一state挑选过程如下:首先从S中均匀选中一个item j。如果\(\tau(j) < \tau(i)\)对于会同时对i和j进行排序的lists \(\tau \in R\)中的大多数都成立,那么跳到j,否则留在i。

注意,Markov chain方法确实只依赖于ranks间的比较,即不考虑scores也不考虑hits。下面是一个示例。

示例1.考虑以下在S={1,2,3}中的三个items的rankings \(R = \lbrace \tau_1, \tau_2, \tau_3 \rbrace\).

图1

它可以展示成关于\(MC_1, MC_2, MC_3, MC_4\)的转移矩阵,分别为:\(M^1, M^2, M^3, M^4\)。

图2

下面,我们会为matrix entries展示一些示例计算。记住\(M_{ij}^k\)是给定当前state(item i)到下一state(item j)的概率。

  • \(M_{13}^1\)是2/6. 确实,\(Q_1^{C_1}\)是\(\lbrace 1,1,3,1,2,3 \rbrace\)(rank<=item 1的case:1; 1,3; 1,2,3)。因此,在\(Q_1^{C_1}\)中均匀选中某一元素的概率为1/6, 选中item 3的概率为2/6.

  • \(M_{21}^2\)是5/18. 均匀选择一个包含item 2的rank list的概率为1/3. 如果\(\tau_1\)被选中,那么\(Q_{\tau_1,2}^{C_2}=\lbrace 2,1 \rbrace\)。因此,选中item 1的概率为1/2. 相似的,有\(Q_{\tau_2,2}^{C_2}=\lbrace 2,1,3 \rbrace\),以及\(Q_{\tau_3,2}^{C_2}=\lbrace 2, 3 \rbrace\)。因此,\(M_{21}^2 = \frac{1}{3} \cdot \frac{1}{2} + \frac{1}{3} \cdot \frac{1}{3} + \frac{1}{3} \cdot 0 = \frac{5}{18}\)

  • \(M_{23}^3\)是2/9. 均匀选中一个包含item 2的概率为1/3. 在一个rank list范围内均匀选择一个item的概率也为1/3. 由于\(\tau_1(3) \nless \tau_1(2), \tau_2(3) < \tau_2(2), \tau_3(3) < \tau_3(2)\), 因此\(M_{23}^3 = \frac{1}{3} \cdot 0 + \frac{1}{3} \cdot \frac{1}{3} + \frac{1}{3} \cdot \frac{1}{3} = \frac{2}{9}\)。

图3

  • \(M_{22}^4\)是1/3. 均匀选中在S中一个item的概率为1/3. 另外,考虑图3中的表:在上表中的每个entry \(a_{ij}\)是满足\(\tau \in R, \tau(j) < \tau(i)\)的lists的count数(例如,有多少rankings满足:item j的rank比item i要好)。由于存在三个lists,因此majority的阀值是2. \(M_{22}^4\)指的是:给定item 2, 在下一step之后我们仍停留在item 2上的概率。由于\(a_{21}, a_{22}, a_{23}\)分别是2、 0、 2, 三种情况中有两种会从item 2进行转移,另一种仍会停留在item 2上。相应的\(M_{22}^4\)是1/3.

最终,rank set R的fused rank list \(\hat{\tau}_k\)是在\(M^k, k=1, \cdots, 4\)上的Markov chain ordering。可以看到所有4种情况都是:\(\hat{\tau}=[3 \geq 2 \geq 1]\)。

3.实验

3.1 数据集

使用Text Retrieval Conference(TREC)数据集。它提供了具有许多rank lists的大的、标准的数据集,准备进行fused。通常,每年会提供一个大的文档数据base S和一个包含 50个querie的list。在ad-hoc和web信息检索大会上,每个系统x会

参考

Joseph A. Konstan教授(coursera.明大.推荐系统课程)在2005年《Improving Recommendation Lists Through Topic Diversification》中提出了主题多样性。虽然这篇paper比较老,但比较经典,值得一看:

1.介绍

推荐系统的目标是:基于用户过往偏好、历史购买、人口统计学信息(demographic information),提供用户关于他们可能喜欢的产品的推荐。大多数成功的系统会利用CF(collaborative filtering),许多商业系统(Amazon.com)利用这些技术来提供个性化推荐列表给他们的顾客。

尽管state-of-the art CF系统的accuracy很出色,实际中已经发现:一些可能的结果会影响用户满意度。在Amazon.com上,许多推荐看起出在内容上很“相似(similar)”。例如,顾客已经购买了许多关于赫尔曼·黑塞(Hermann Hesse)的诗集,可能会获得这样的推荐列表:其中所有top-5的条目都只包含了该作者的书。当纯粹考虑accuracy时,所有这些推荐看起来都是出色的,因为该用户很明显喜欢赫尔曼·黑塞写的书。另一方面,假设,该活跃用户在赫尔曼·黑塞之外还有其它兴趣,比如:历史小说以及世界游行方面的书,那么该item推荐集合就看起来较差了,缺乏多样性。

传统上,推荐系统项目会关注于使用precision/recall 或者MAE等metrics来优化accuracy。现在的一些研究开始关注pure accuracy之外的点,真实用户体验是必不可少的。

1.1 贡献

我们通过关于真实用户满意度,而非pure accuracy,来解决之前提到的不足。主要贡献如下:

  • 主题多样性(topic diversification):我们提出了一种方法,根据该活跃用户的完整范围的兴趣,来平衡top-N推荐列表。我们的新方法会同时考虑:suggestions给出的accuracy,以及在特定主题上的用户兴趣范围。主题多样性的分析包含:user-based CF和item-based CF.
  • Intra-list相似度指标(similarity metric):
  • accuracy vs. satisfaction:

2.CF

3.评估指标

为了判断推荐系统的质量和效果,评估指标是必要的。许多评价只关注于accuracy并忽略了其它因素,例如:推荐的novelty(新奇)和serendipity(意外发现),以及推荐列表items的diversity。

以下给出了一些流行的指标。

3.1 Accuracy Metrics

Accuracy metrics主要有两个:

第1, 为了判断单个预测的accuracy(例如:对于商品\(b_k\)的预测\(w_i(b_k)\)与\(a_i\)的accuracy ratings \(r_i(b_k)\)有多偏离)。这些指标特别适合于,预测会随商品被展示的任务(比如:annotation in context)

3.1.1 MAE

3.1.2 RECALL/Precision

3.2 Accuracy之外

尽管accuracy指标很重要,还有其它不能被捕获的用户满意度特性。non-accuracy metrics与主流的研究兴趣相距较远。

3.2.1 覆盖度(Coverage)

在所有non-accuracy评估指标上,coverage是最常见的。coverage指的是:对于要预测的问题域(problem domain)中元素(elements)部分的百分比。

3.2.2 Noverlty和Serendipity

一些推荐器会生成高度精准的结果,但在实际中没啥用(例如:在食品杂货店中给顾客推荐香焦)。尽管高度精准,注意,几乎每人都喜欢和购买香焦。因此,他们的推荐看起来太过明显,对顾客没啥太多帮助。

Novelty和serendipity指标可以衡量推荐的”非显而易见性(non-obviousness)”,避免“随机选取(cherry picking)[12]”。对于serendipity的一些简单measure,可以采用推荐items的平均流行度。分值越低表示越高的senrendipity。

3.3 Intra-List Similarity

我们提出一个新指标,它的目的是捕获一个list的diversity。这里,diversity指的是所有类型的特性,例如:genre、author、以及其它的有辩识度的特性。基于一个任意函数(arbitrary function):\(c_o: B \times B \rightarrow [-1, +1]\),来衡量在商品\(b_k, b_e\)间的相似度\(c_o(b_k, b_e)\),我们将\(a_i\)的推荐列表\(P_{w_i}\)的intra-list similarity定义如下:

\[ILS(P_{w_i}) = \frac{\sum\limits_{b_k \in \Im P_{w_i}} \sum\limits_{b_e \in \Im P_{w_i}, b_k \neq b_e} c_o(b_k, b_e)}{2}\]

…(5)

分值越高表示越低的diversity。我们会在后面涉及到的关于ILS的一个令人感兴趣的数学特性:排列不敏感(permutation-insensitivity),例如:\(S_N\)是关于在\(N=\|P_{w_i}\|\)的所有排列的对称分组(symetric group):

\[\forall \delta_i, \delta_j \in S_N: ILS(P_{w_i} \circ \delta_i) = ILS(P_{w_i} \circ \delta_j)\]

…(6)

这里,通过在一个top-N list \(P_{w_i}\)上对推荐的位置进行简单重设置,不会影响\(P_{w_i}\)的intra-list similarity。

4.topic diversification

acurracy指标的一个主要问题是,它不能捕获更宽泛的用户满意度,会隐藏在已存在系统中的一些明显缺陷。例如,推荐出一个非常相似items的列表(比如:对于一个很少使用的用户,根据author、genre、topic推出),尽管该列表的平均accuracy可能很高。

该问题在之前被其它研究者觉察过,由Ali[1]创造了新词“投资组合效应(portfolio effect)”。我们相信:item-based CF系统特别容易受该效应的影响。从item-based TV recommender TiVo[1]、以及Amazon.com recommender的个性化体验都是item-based。例如,这篇paper的作者只获得了关于Heinlein的书籍推荐,另一个则抱怨推荐的书籍全是Tolkien的写作。

在用户满意户上的负面分歧的原因暗示着,“protfolio effects”是很好理解的,已经在经济学界被广泛研究,术语为“边际收益递减规律(law of diminishing marginal returns)【30】”。该规律描述了饱和效应(saturation effects):当商品p被不断地获得(acquired)或消费(consumed)时,它的增量效用(incremental utility)会稳定的递减。例如,假设你被提供了你喜欢的酒。假设:\(p_1\)表示你愿意为该商品支付的价格。假设你被提供了第二杯特别的酒,你趋向于花费的的金额\(p_2\)会越来越少,(例如:p_1 > p_2)。以此类推:\(p_3, p_4\)。

我们提出了一种方法“topic diversification”来处理该问题,并便推荐列表更多样化,更有用。我们的方法是现有算法的一个扩展,可以被应用到top推荐列表上。

4.1 Taxonomy-based Similarity指标

函数:\(c^*: 2^B \times 2^B \rightarrow [-1,+1]\),表示在两个商品集合之间的相似度,这构成了topic diversification的一个必要部分。对于taxonomy-driven filtering[33],我们使用我们的指标对\(c^*\)实例化,尽管其它content-based similarity measures可能看起来也适合。在商品集合间的相似度计算指标基于他们的分类(classification)得到。每个商品属于一或多个分类,它们以分类的taxonomies进行层次化排列,以机器可读的方式描述了这些商品。

classification taxonomies存在不同领域。Amazon.com为books/DVSs/CDs/电子产品等制作了非常大的taxonomies。图1表示一个sample taxonomy。另外,在Amazon.com上的所有商品的内容描述与它们的domain taxonomies相关。特征化的主题可以包含:author、genre、audience。

图1

4.2 topic diversification算法

算法1展示了完整的topic diversification算法。

算法1

函数\(P_{w_i *}\)表示新的推荐列表,它由使用topic diversification产生。对于每个list entry \(z \in [2,N]\),我们从候选商品集\(B_i\)中收集了这些商品b,它们不会出现在在\(P_{w_i *}\)中的位置\(o < z\)上,并使用集合\(\lbrace P_{w_i *}(k) \mid k \in [1,z] \rbrace\)来计算相似度,它包含了所有新推荐的前导rank z。

根据\(c^*(b)\)以逆序方式对所有商品b进行排序(sorting),我们可以获得不相似rank(dissimilarity rank) \(P_{c^*}{rev}\)。该rank接着会使用原始推荐rank \(P_{w_i}\)根据多样化因子\(\Theta_F\)进行合并,生成最终rank \(P_{w_i *}\)。因子\(\Theta_F\)定义了dissimilarity rank \(P_{c^*}^{rev}\)应用在总体输出上的影响(impact)。大的\(\Theta_F \in [0.5, 1]\)喜欢多样性(diversification)胜过\(a_i\)的原始相关顺序,而较低的\(\Theta_F \in [0, 0.5]\)生成的推荐列表与原始rank \(P_{w_i}\)更接近。对于实验分析,我们使用diversification因子:\(\Theta_F \in [0, 0.9]\)。

注意,有序的input lists \(P_{w_i}\)必须是大于最终的top-N list。对于我们的后续实验,我们会使用top-50 input lists来产生最终的top-10推荐。

4.3 推荐依赖

为了实验topic diversification,我们假设:推荐商品\(P_{w_i}(o)\)和\(P_{w_i}(p), o, p \in N\),和它们的内容描述一起,会产生一个相互影响,它会被现有方法所忽略:通常,对于推荐列表的items来说,只有相关度加权排序(relevance weight ordering) \(o < p \Rightarrow w_i(P_{w_i}(o)) \geq w_i(P_{w_i}(p))\)必须保持,假设没有其它依赖。

在topic diversification的case中,推荐相互依赖意味着:一个item b与之前推荐间的当前dissimilarity rank,会扮演一个重要角色,可能影响新的ranking。

4.4 渗透压(Osmotic Pressure)类比

dissimilarity效应与分子生物学上的渗透压和选择性渗透(selective permeability)相类似。将商品\(b_o\)(它来自兴趣\(d_o\)的特定领域)稳定插入到推荐列表中,等价于:从来自一个特定物质的分子通过细胞膜传到细胞质中。随着浓度\(d_o\)(它属于膜的选择性通透性)的增加,来自其它物质d的分子b的压力会上升。对于一个给定主题\(d_p\),当压力(pressure)足够高时,它最好的商品\(b_p\)可能“散开(diffuse)“到推荐列表中,尽管他们的原始排序(original rank)\(P_{w_i}^{-1}(b)\)可能不如来自流行域(prevailing domain)\(d_o\)。相应的,对于\(d_p\)的压力会下降,为另一个压力上升的domain铺路。

这里的topic diversification类似于细胞膜的选择性渗透性,它允许细胞来将细胞质的内部组成维持在所需要级别上。

参考

在paper 《Effective rank aggregation for metasearching 》中提出了一种rank aggregation的方法:QuadRank,介绍了一种对多个ranked lists进行merge的方法,我们来了解一下:

3.QuadRank

QuadSearch的缺省ranking fusion算法是一个与位置有关(positional)的方法,可以处理partial ranked list;实际上它会处理来自基于single-crawler的搜索引擎们的top-k lists。我们这样做的原因是因为以下普通并且显著的观察:

  • i) 所有这些都被experts认为是“major”搜索引擎s
  • ii)他们在lifetimes期间是可靠的
  • ii)大多数用户和metasearch engines更偏向于他们来执行它们的搜索

假设\(r_1, r_2, \cdots, r_m\)是m个ranked lists,分别对应于每个component搜索引擎。我们假设:这些lists中的每一个list都包含了固定数目的k个items,整个过程涉及到对总共km个elements进行merge和rank。这里我们所采用的merging过程是:通过移除所有重复的elements,将m个不同的result lists合并到一个single list中。注意,该list仍是unranked,直到对list中的所有elements使用scoring函数。

两个component engines间的重合(overlapping)会随着query的不同而不同,不可预测,因此我们假设:我们最终的result list包含了N个items。在表1中我们描述了要使用的符号。

表1

在结尾我们会表述提出方法的主要思想。特别描述了QuadRank所采用的方法论,以便处理individual rankings和zone weighting,并且我们会检查URL分析的结果的意义。最终我们会讨论不同components是如何被组合到单个scoring公式中的。

3.1 处理individual rankings

每个element会接受由component engines得到的ranking,这对于一个rank aggregation方法来说是非常重要的,大多数提出的ranking算法主要基于这些rankings。相应的,我们必须设计我们的函数,来对达到较高rankings的结果进行reward。因此,对比起在更低位置的entries,具有较高rankings的entries可以被认为是:它们会与一个给定query更相关

因此,对于每个item \(c \in S\),我们引入和评估了该quantity:

\[K(c)=\sum\limits_{i=1}^m (k+1 - r_i(c))\]

…(2)

其中:

  • m: 表示所使用的component engines的数目
  • c: 表示在component list中的单个结果
  • k: 在每个component list中的items数目
  • \(r_i(c)\)是该item被分配给第i个component engine得到的ranking

在特殊情况下,item c没有被list \(r_i\)进行rank,那么我们假设:\(r_i(c)=k+1\)。很明显,一个item可以接收的最好score是km(如果它在每个component list中都排在第一位),最低的score是1 (表示只被一个component list进行rank,并且排到最后一个)

引入的score会对那些接受了多个component engines的high rankings的items进行reward,然而,两或多个结果被分配相等的K(c)值是相对常见的。例如,考虑到以下场景:两个不同的items \(c_1,c_2\),它们会接收到由4个top-10 lists \(r_1,r_2,r_3,r_4\)的rankings。

表2

在表2的示例中,它会有\(K(c_1)=K(c_2)=10\)。然而,我们会坚定认为:\(c_2\)的rank要比\(c_1\)要高。因为:

  • 1.\(c_2\)在更多的input rankings中出现,相应的,根据民主对称性(democratic symmetry) Saari(2000)
  • 2.\(c_2\)在超过一半的input rankings中出现,因此根据孔多塞标准(Condorcet criterion),它是一个spam entry的概率很低

为了处理这样的case,我们必须对以下结果进行reward:该结果被尽可能多的component engines认为是与一个给定query相关。如果\(n_c \leq m\)是结果c出现在各component engines的数目,那么我们引入rank-based score,它由以下等式决定:

\[R(c)=m log(n_c K(c))\]

…(3)

其中m是所使用engines的总数目。注意(3)中所使用的log是为了减小在\(R_i(c)\)可以接受的不同值之间的误差。另外,尽管使用m乘以log没啥差异(因为m对于所有items是一个常数),它可以根据你的目的进行调节,以便让\(R(c)\) score分配更大的值。

参考

我们来看下yahoo的《Product Recommendations at Scale》中提出的prod2vec方法:

1.介绍

世界上许多人在每天都会浏览email收件箱,大多数时间会与它们的通讯录进行联系,还有一部分时间用于账单确认,读取新信息,以及跟踪购买( tracking purchases)。为了对这种流量进行商业化,email客户端通常会在原生email内容的边上以图片的形式展示广告。说服用户切出”email模式”(即连续处理邮件任务),进入一个新模式让人们愿意去点广告是个挑战。通过有效的个性化和定向(targeting),目标是为单个用户发现与他最匹配的广告展示给他,因而广告需要高度相关,以克服用户只关注email任务的倾向。除了获得财务收益外,为每个消费者的口味量身定制的广告也能改善用户体验,可以增加用户的忠诚度和用户粘性。

对于广告定向(ad targeting),收件箱emails仍未被充分进行explored & exploited。最新研究表明,只有10%的收件量表示是人类生成(非机器生成)的emails。这之外的90%流量中,超过22%表示与在线电商有关。假设整体流量中大部分是有商业目的的,定向广告的一种流行形式是电邮重定位(MRT: mail retargeting),其中,广告主会对之前从特定商业网站(web domain)上接收过邮件的用户进行定向。这些电子邮件对于广告定向来说很重要,它们会给出用户感兴趣的相应商品的一个大图(broad picture)进行展示。最新paper[14]利用聚类方法来生成MRT规则,展示了这样的规则比由人类专家生成的要更精准。

图一:Yahoo Mail中的商品推荐

然而,为了超出MRT规则之外,用户和商业网站的交互,广告商需要更多数据(比如:购买过的商品名和价格,通常是email邮件的一部分)。email客户端与商业网络能很好结合,对电子邮件格式进行标准化,产生的schemas通过schema.org社区进行维护。越来越多的商业网站使用标准schemas,email客户端可以提供更个性化的用户通知,比如:包裹跟踪(package tracking)和 航班详情(flight details)。另外,email receipt extraction带来了赚钱机会,基于客户的购买历史将商品广告带给用户。有了从多个商业email domain上的购买数据,比起其它基于单一商业email domain来说,可以更好地将email provider放置到在唯一的位置上,以便能构建更好的推荐系统。特别的,不同于商业网站可以做出这样的推荐:“买了X的顾客,也会买Y”,email providers可以做出这样的推荐:“从生产商V1处购买了X的顾客,也会从生产商V2处购买Y”,允许更强大和更有效的定向解决方案。

在本paper中,我们为Yahoo Mail提供了一种end-to-end的商品广告开发方案。工作包含了开发一个商品级别的购买预测算法,能扩展到数百万的用户和商品。出于该目的,我们提出了一种方法,使用一个神经语言模型,将它应用到用户购买时间序列上,从而将商品嵌入到real-valued,低维的向量空间中。作为结果,具有相近上下文的商品(它们相邻近的购买行为)可以映射到在embedding空间中更接近的地方。关于下一个要购买的商品,为了做出有意义和更多样的建议,我们会进一步将商品向量进行聚类,并建模聚类间的转移概率。来自可能的聚类在向量空间中更接近的商品,会被用于形成最终推荐。

商品预测模型会使用一个大规模的购买数据集进行训练,由2900w用户的2.8亿购买行为组成,涉及210w个唯一的商品。该模型会在一个held-out month上进行评估,其中,我们在收益率(yield rate)上测试了推荐的有效性。另外,我们会评估一些baseline方法,包含展示流行商品给所有用户,以不同用户分组(称为:分群(cohorts),由用户性别、年龄、地域)展示流行商品,以及展示在一个用户最近购买商品之后历史最常购买的商品。为了减轻冷启动问题,在用户的分群(cohort)中的流行商品会被用于补足那些早期没有购买行为的用户的推荐。

3.方法

本节中,我们描述了该商品推荐任务的方法论。为了解决该任务,我们提出了从历史日志中使用自然语言模型学习在低维空间中的表示。商品推荐可以通过最简单的最近邻搜索得到。

更特别的,给定从N个用户中获取的email receipt日志的一个集合S,其中用户的日志为 \(s = (e_1, ..., e_M) \in S\)被定义成一个关于M个receipts的连续序列,每个email recept \(e_m = (p_{m1}, p_{m2}, ..., p_{mT_m})\)包含了\(T_m\)个购买的商品,我们的目标是发现每个商品p的D维实数表示\(v_p \in R^D\),以便相似的商品可以在向量空间中更近的位置。

我们提供了一些方法来学习商品表示。首先提出了prod2vec方法,它会考虑所有已经购买的商品。接着提出了新的bagged-prod2vec方法,它会考虑在email receipts中一起罗列被购买的一些商品,它们会产生更好、更有用的商品表示。最终,我们会利用上学到的representations来分别表示一个prod2prod和user2prod的推荐模型。

3.1 低维商品embeddings

图二:prod2vec skip-gram模型

prod2vec:prod2vec模型会将一个购买序列看成是一个“句子”,在这个序列中的商品看成是“词”。详见图2, 更特殊的,prod2vec使用skip-gram模型来学习商品表示,通过以下的最大化目标函数:

\[L = \sum_{s \in S} \sum_{p_i \in s} \sum_{-c \leq j \leq c, j \neq 0} log p(p_{i+j} | p_i)\]

…(3.1)

其中,来自相同email receipt的商品可以是任意顺序。概率\(P(p_{i+j} \mid p_i)\)表示:给定当前商品\(p_i\),观察到一个邻近商品\(p_{i+j}\)的概率,使用softmax函数进行定义如下:

\[P(p_{i+j}| p_i) = \frac{exp({v_{p_i}^T v_{p_{i+j}}'})} {\sum_{p=1}^P exp{(v_{p_i}^T v_p')}}\]

…(3.2)

其中,。。。。

图3: bagged-prod2vec模型更新

bagged-prod2vec:为了对多个商品同时购买的行为做出解释,我们提出了一个修改版本的skip-gram模型,它引入了一个概念:购物袋(shopping bag)。如图3所示,该模型会在email receipts级别进行操作,而非在商品级别。通过对email序列s上的一个修改版目标函数进行最大化,来学习商品向量表示:

\[L = \sum_{s \in S} \sum_{e_m \in s} \sum_{-n \leq j \leq n, j\neq 0} \sum_{k=1,...,T_m} log P(e_{m+j}| p_{mk})\]

…(3.3)

商品\(P(e_{m+j} \mid p_{mk})\)是从邻近的email receipt \(e_{m+j}\)上观察到商品的概率,\(e_{m+j}=(p_{m+j,1}, ..., p_{m+j, T_m})\),给定从第m个email receipt的第k-th个商品,到一个商品的概率:

\[P(e_{m+j} \mid p_{mk}) = P(p_{m+j,1} \mid p_{mk} ) \times ... \times P(p_{m+j,T_m} \mid p_{mk})\]

每个P的定义使用softmax(3.2)。注意在(3.3)中的第三个求和会随着receipts进行,因而,从相同的email receipt中得到的items在训练期间不会相互预测。另外,为了捕获商品购买的时序特性(temporal aspects),我们提出了使用有向语言模型,我们只使用未来的商品(future product)作为上下文。该修改版允许我们学习商品embeddings来预测将来的购买行为。

learning:该模型使用SGA( stochastic gradient ascent)进行最优化,很适合大规模问题。然而,在(3.1)和(3.3)中的梯度计算\(\Delta L\),很适合词汇size P,实际任务中,计算开销会随着P的增大而变得很昂贵,很容易达到上百万的商品。另一方面,我们使用negative sampling方法,它能显著减小计算复杂度。

3.2 prod-2-prod预测模型

在学习了低维商品表示后,我们考虑了来预测下一商品的购买概率的一些方法。

prod2vec-topK:给定一个购买商品,该方法会为所有在词汇表中的商品计算cosine相似度,并推荐最相似商品的top K

prod2vec-cluster:为了能做出更多样化(diverse)的推荐,我们考虑将相似商品分组成聚类,从与之前购买商品相关的聚类中推荐商品。我们应用K-means聚类算法来在hadoop FS上实现,将商品基于cosine相似度进行聚类。我们假设:在从聚类\(c_i\)上进行一个购买后、再从任意第C个聚类中进行一次购买的行为,符合一个多项式分布(multinomial distribution)\(M_u(\theta_{i1}, \theta_{i2}, ..., \theta_{iC})\),其中\(\theta_{ij}\)是从聚类\(c_i\)中进行一次购买后、接着从聚类\(c_j\)中进行一次购买的概率。为了估计参数\(\theta_{ij}\),对于每个i和j,我们采用一个最大似然方法:

\(\hat {\theta_{ij}} = \frac{c_i购买后跟c_j的次数}{c_i购买的总数}\) …(3.4)

  • count of ci purchases: c_i购买的数目
  • # of times ci purchase was followed by cj: c_i购买后跟c_j的次数

为了给一个购买过的商品p推荐一个新商品,我们首先标识了p属于哪个聚类(例如: \(p \in c_i\))。接着,我们会对所有聚类\(c_j\),通过\(\theta_{ij}\)值进行排序,然后考虑取与聚类\(c_i\)top相关的聚类中的top个商品。最后,从top聚类中的商品通过与p计算cosine相似度进行重排序,取top K进行推荐。

3.3 User-to-product预测模型

除了prod2prod预测外,大多数推荐引擎允许user-to-product方式的预测,为一个用户进行推荐通常会考虑历史购买、或(和)兴趣,使用其它数据源:用户在线行为、社交行为等。在本节中,我们提出了一个新方法来同时学习商品的向量表示、以及给定一个用户,发现在joint embedding space发现K个最近商品的用户推荐。

user2vec:受paragraph2vec算法的启发,user2vec模型会同时学习商品和用户的特征表示,它会将用户当成是一个“全局上下文”。这样的模型如图4所示。训练数据集来自于用户购买序列S,它会包含\(u_n\)和其它已购商品(通过购买时间序排列),\(u_n = (p_{n1}, p_{n2}, ..., p_{nU_n})\),其中\(U_n\)表示用户\(u_n\)购买的items数目。在训练期间,用户向量会被更新,来预测从他的email receipts中的商品,其中,学到的product vectors会预测在上下文中的其它商品。出于表示的简洁性,在下面,我们会表示no-bagged版本的模型,注意,使用bagged版本进行扩展也很方便。

图4: 对用户的User embeddings,进行产品预测

更特殊的,user2vec的目标函数是,最大化所有购买序列的集合S上的似然:

\[L = \sum_{s \in S} (\sum_{u_n \in s} log P(u_n | p_{n1}: p_{nU_n}) + \sum_{p_{n_i} \in u_n} log P(p_{ni}| p_{n,i-c}: p_{n,i+c,u_n}))\]

…(3.5)

其中,c是第n个用户的购买序列上下文长度。\(P(p_{ni} \mid p_{n,i-c}:p_{n,i+c,u_n})\)被定义为使用一个softmax函数:

\(P(p_{ni}|p_{n,i-c}: p_{n,i+c}, u_n) = \frac{e^{\bar{v}^T v_{p_{ni}}'}}{ \sum_{p=1}^{V} e^{\bar{v}^T v_p'}}\) …(3.6)

其中\(v_{p_{ni}}'\)是\(p_{ni}\)的输出向量表示,\(\bar{v}\)是商品上下文的平均向量表示,包含了相应的\(u_n\),定义如下:

\(\bar{v} = \frac{1}{2c+1} (v_{u_n} + \sum_{-c \leq j \leq c ,j \neq 0} v_{p_{n,i+j}})\) …(3.7)

其中,\(v_p\)是p的输入向量表示。相似的,概率\(P(u_n \mid p_{n1}: p_{n U_n})\)定义如下:

\(P(u_n | p_{n1}: p_{nU_n}) = \frac{e^{\bar{v}_n^T v_{u_n}'}} {\sum_{p=1}^V e^{\bar{v}_n^T v_p'}}\) …(3.8)

其中\(v_{u_n}'\)是\(u_n\)的输出向量表示,\(\bar{v}_n\)是用户\(u_n\)的所有商品平均输入向量表示的平均:

\[\bar{v}_n = \frac{1}{U_n} \sum_{i=1}^{U_n} v_{p_{ni}}\]

…(3.9)

user2vec模型的一个主要优点是,商品推荐是基于该用户的购买历史进行量身定制的。然而,缺点是,该需要需要非常频繁地进行更新,不同于product-to-product方法,它可以长期是相关的,而user-to-product推荐需要经常变化来对最近购买行为做出解释。

4.实验及其它

略,详见paper.

4.4 推荐预测商品

我们对推荐商品给用户进行实验,比较以下算法:

  • 1) prod2vec-topK:使用数据集\(D_p\)进行训练,其中,商品向量通过对购买序列s通过极大似然估计进行学习。给定一个商品\(p_i\),通过向量空间计算cosine相似度选择topK个相似商品。
  • 2) bagged-prod2vec-topK:使用\(D_p\)进行训练,其中商品向量通过email序列s通过极大似然估计进行学习。对于给定商品\(p_i\),通过选择在结合向量空间计算cosine相似度选择topK个相似商品。
  • 3) bagged-prod2vec-cluster: 与bagged-prod2vec模型的训练类似,接着将商品向量聚类成C个聚类,并计算它们间的转移概率。接着标识出\(p_i\)属于哪个聚类(例如:\(p_i \in c_i\)),我们根据\(c_i\)的转移概率对各聚类进行排序,取出top个聚类,然后聚出这些top聚类的商品通过计算与\(p_i\)的cosine相似度进行排序,其中每个聚类的top \(K_c\)被用于推荐(\(\sum {K_c} = K\))。 bagged-prod2vec-cluster与 bagged-prod2vec的预测结果如表2所示。可以看到聚类方法多样性更好。
  • 4) user2vec:使用\(D_p\)进行训练,其中商品向量和用户向量通过极大似然估计进行学习。给定一个用户\(u_n\),通过计算\(u_n\)用户向量与所有商品向量的cosine相似度,检索出top K近邻商品。
  • 5) co-purchase:对于每个购买pair:\((p_i, p_j)\),计算频率\(F_{(p_i,p_j)}\),其中\(i=1,...,P, j=1,...,P\),商品\(p_j\)在商品\(p_i\)之后立即购买。接着,给商品\(p_i\)的推荐通过频率\(F_{(p_i,p_j)}, j=1,...,P\)进行排序,取topK商品。

表2: 潜水呼吸管(cressi supernova dry snorkel)的商品推荐

在第\(t_d\)天之前,由于用户\(u_n\)具有多个商品的购买行为,为了在这一天选择最好的K个商品,各种独立的预测( separate predictions)必须达成一致。为了达到该目的,我们提出了时间衰减的推荐评分scoring,在根据最高得分选择top K个商品之后使用。更特别的,给定用户在\(t_d\)天前的商品购买行为以及它们的时间戳(timestamps):\(\lbrace (p_1,t_1), ..., (p_{U_n}, t_{U_n}) \rbrace\),对于每个商品,我们会根据相似得分检索top K个推荐,产生集合\(\brace (p_j, sim_j), j=1, ..., K U_n \rbrace\),其中sim表示cosine相似度。接着,我们为每个推荐商品计算一个衰减得分(decayed score):

\[d_j = sim_j \cdot \alpha^{t_d - t_i}\]

其中\((t_d - t_i)\)是当前天\(t_d\)与产生推荐\(p_j\)的商品购买时间的差,其中\(\alpha\)是衰减因子。最终,按照衰减评分降序,并取topK个商品作为第\(t_d\)天的推荐。

表1:通过bagged-prod2vec模型生成的商品推荐示例

训练细节:神经语言模型会使用一台96GB RAM内存的24core机器。embedding space的维度被设置成d=300, 上下文neighborhood size为5. 最后每个向量更新中使用10 negative samples。与[24]的方法相似,最频繁的商品和用户在训练期间会进行子抽样(subsampled)。为了展示该语言模型的效果,表1给出了使用bagged-prod2vec推荐的样例,可以看到邻居商品与query商品高度相关。(例如:“despicable me 卑鄙的我(动画电影)”,该模型会检索到相似卡通片)

评估细节: 与流行商品的accruracy如何测量类似,我们假设每个用户有一个K=20不同商品推荐。对于\(t_d\)天的预测,会基于先前天的购买进行预测,我们不会考虑在该天期间发生的购买行为来更新第\(t_d\)天的预测。

结果:我们评估了decay factors不同值所对应的prod2vec表现。 在图9中,我们展示了在测试数据\(D_p^{ts}\)(往前看1,3,7,15,30天)上的预测准确率。初始的prod2vec预测会基于在训练数据集\(D_p\)最后用户购买。该结果展示了不同预测对于产生推荐准确率提升的预测的折扣,decay factor=0.9是一个最优选择。

9.png

图9: 不同decay值的prod2vec accuracy

参考