我们来看下gravityR&D提出的《SESSION-BASED RECOMMENDATIONS WITH RECURRENT NEURAL NETWORKS》。

2.相关工作

2.1 session-based的推荐

推荐系统领域的大多数工作主要关注于建模:当提供一个用户id时,可以为它构建一个明确的user profile。在该setting中,相应的文献主要是MF方法和基于近邻的模型。这些方法可以在session-based recommendation中采用;当缺失user profile时,一个很自然的解决方案是:item-to-item推荐方法。在该setting中,会从提供的session数据中预计算好item-to-item的相似度矩阵,也就是说:经常在sessions中一起被点击的这些items,被认为是相似的。相似矩阵接着在session期间被简单用于:为一个当前用户所点击的项推荐最相似的items。该方法被证明是有效的,并被广泛使用。这些方法只能说明用户的最近点击行为,实际上忽略了过去点击的行为。

对于session-based推荐,一些不同的方法有:Markov决策过程(MDP: Markov Decision Processes)。MDP是顺序随机决策问题的模型。

一个MDP被定义成一个4元组 \(<S, A, Rwd, tr>\),其中:

  • S是状态集(state)
  • A是动作集(action)
  • Rwd是一个reward函数
  • tr是状态转移函数

在推荐系统中,动作(action)等价于推荐,最简单的MPDs本质上是一阶Markov链,其中下一个推荐可以根据item间的转移概率被简单计算。在session-based推荐中使用Markov链的主要问题是:当尝试包含所有可能的用户选择序列时,状态空间很快变成不可管理。

通用因子分解框架(GFF: General Factorization Framework)的扩展版本可以使用session data进行推荐。它会通过将这些事件进行求和(sum)来建模一个session。它使用两种类型的隐表示:一种用于表示item自身,另一种用于将item表示成一个session的部分。session接着被表示成关于part-of-a-session的item表示的feature vectors的平均。然而,该方法不会考虑任何在session中的顺序。

2.2 Deep learning推荐

最近在神经网络文献中的一个相关方法,它使用受限波尔茨曼机(RBM)进行CF计算(Salakhutdinov et al., 2007)。在该工作中,一个RBM被用于建模user-item交互并执行推荐。该模型已经被证明是最好的CF模型之一。Deep模型已经被用于从非结构化内容中(比如:音乐、图片)抽取特征,接着被一起用于更通用的CF模型。在(Van den Oord et al.2013) 中,使用一个CNN来从音乐文件中抽取特征,接着被用在一个因子模型中(factor model)。最近(Wang et al.2015)引入了一个更通用的方法,它使用一个深度网络来从任意类型的items中抽取通用内容特征,这些特征接着被合并到一个标准的CF模型中来增强推荐效果。该方法看起来特别有用,尤其是在没有足够多的user-item交互信息时。

3.使用RNN的推荐

RNN可以建模变长序列数据。在RNN和传统前馈深度模型间的主要不同之处是,在构成网络的units中存在一个内部隐状态(hidden state)。标准RNN会更新它们的隐状态h,它使用以下的更新函数:

\[h_t = g(W x_t + U h_{t-1})\]

…(1)

其中:

  • g是一个平滑边界函数(比如:使用一个logistic sigmoid函数)
  • \(x_t\)是在时间t上unit的input
  • 给定它的当前状态\(h_t\), 一个RNN会输出:关于该序列的下一个元素的一个概率分布

GRU是一个关于一个RNN unit的更精巧的模型。它的目标是,解决梯度消失问题(vanishing gradient problem)。GRU gate本质上会学习何时(when)以及多大(how much)进行更新unit的hidden state。GRU的activation是一个在之前activation和候选activation \(\hat{h_t}\)上的线性插值。

\[h_t = (1-z_t) h_{t-1} + z_t \hat{h}_t\]

…(2)

其中update gate为:

\[z_t = \sigma(W_z x_t + U_z h_{t-1})\]

…(3)

其中,cadidate activation函数\(\hat{h}_t\)以相似方法进行计算:

\[\hat{h}_t = tanh(W x_t + U(r_t \odot h_{t-1}))\]

…(4)

最后,reset gate的\(r_t\)为:

\[r_t = \sigma(W_r x_t + U_r h_{t-1})\]

…(5)

3.1 定制GRU模型

图1: 网络的通用结构。一次只处理事件流中的一个事件(event)

我们在我们的模型中使用GRU-based RNN来进行session-based推荐。网络的输入是该session的实际状态(state),而输出为在session中item的下一个事件(event)。到目前为止,该session的state可以是item的实际event或在session中的events。在前面的case中使用1-of-N的编码,例如,输出向量的长度实际为items数目,只有在对应于实际item的位置上为1,其它为0。后面的setting中会使用一个关于这些表示(representations)的加权和,如果events在更早前发生,那么它会降权(discounted)。出于稳定,输出向量接着会被归一化(normalized)。我们期望这会有帮助,因为它增强了记忆效应(memory effect):而非常局部顺序限制(very local ordering constraints)的增强则并不能被RNN的更长期记忆所捕获。我们也实验了其它方法: 通过增加一个额外的embedding layer,但1-of-N encoding的效果更好。

该网络的核心是:GRU layer(s)、以及额外的feed-forward layers(可以在最后一层和output间进行添加)。输出为items的预测偏好,例如,在session中对于每个item成为下一个被推荐的似然。当使用多个GRU layers时,前一layer的hidden state是下一layer的input。该input也可以可选地被连接到在网络中更深的GRU layers上,我们发现这确实能提升性能。整体架构如图1所示,它描述了单个event在events时间序列中的表示(representation)。

由于推荐系统并不是RNN的主要应用领域,我们修改了基础网络让它更好地适合推荐任务。我们也考虑到实际点以便我们的解决方案可以应用到一个现实环境上。

3.1.1 session-parallel mini-batches

NLP任务中的RNN通常使用in-sequence mini-batches。例如,很常用的是使用一个slide window来滑过句子中的词,并将这些window化的片段相互挨着来构成mini-batches。这种方法对于我们的任务来说不合适,因为:

  • (1) sessions的长度可能非常不同,甚至比句子还要更不同:一些sessions可能只有2个events,而其它可能有上百个;
  • (2) 我们的目标是,捕获一个session在时序上的演进,因此将它们分割成片段可能会没有意义

因此,我们使用session-parallel mini-batches。首先,我们为该sessions创建一个顺序(order)。接着,我们使用前X个sessions的第一个event来形成首个mini-batch的input(期望的output为我们的active sessions的第二个events)。第二个mini-batch会从第二个events来生成,自此类推。如果sessions的任意一个结束,下一个可提供的session会补上它的位置。Sessions被认为是相互独立的,因此,当该切换发生时,我们会重置(reset)合适的hidden state。如图2所示。

图2: session-parallel mini-batch creation

3.1.2 在output上进行sampling

当items数目很大时,推荐系统特别有用。对于一个中级规模(medium-sized)的网上商店来说,它的items范围可能是成千上万,但对于一个更大网络来说,可能有上百万items。在每一step为每个item计算一个score,会让算法与items数和events数的乘积成比例增长。这在实际上是不可行的。因此,我们必须对output进行抽样,只对items某个子集计算score。这也只有一些权重会被更新。除了期望的output之外,我们需要为一些负样本计算scores,并修改权重以便期望的output的排序更靠前。

对于一个任意missing event的天然解释是,用户不知道该item的存在,因而没有任何交互。然而,如果某用户不知道该item并选择不与之交互,是因为她不喜欢(dislike)该item,这种情况的概率很低。item越流行,用户越可能知道它,因此一个missing event更可能会传达dislike的意味。因此,我们应根据它们的流行度成比例抽样。我们并不会为每个训练样本(training example)生成独立(separate)的抽样(samples),而是选择:使用从该mini-batch中的其它训练样本的items来当成负样本。该方法的好处是,我们可以通过跳过抽样(sampling)来进一步减小计算时间。另外,这也可以从实现侧受益,可以让该代码更简单些,以便进行更快的矩阵操作。同时,该操作也是一个基于流行度的抽样(popularity-based sampling),因为一个item成为该mini-batch中的其它训练样本的似然概率(likelihood),与它的流行度成正比。

3.1.3 ranking loss

推荐系统的核心是items的相关度排序(relevance-based)。尽管该任务可以被解释成一个分类任务,l2r方法通常要好于其它方法。ranking可以是pointwise,pairwise和listwise。pointwise ranking会独立的估计items的score或者rank,它的loss定义的目的是相关items的rank应较小(low)。pairwise ranking会比较一个positive和一个negative item pairs的score或rank,该loss会增强:positive item的rank应低于negative item的rank。Listwise ranking使用所有items的scores和ranks,并比较它们的顺序。由于它包含了排序(sorting),通常计算开销更大,并不常使用。同时,如果只有一个相关item(例如:在我们的case中)——listwise ranking可以通过pairwise ranking进行解决。

我们在我们的解决方案中包含了一些pointwise和pairwise ranking losses。我们发现,pointwise ranking对于网络不是稳定的(见第4节)。pairwise ranking losses在其它方法更胜一筹。我们使用以下的两个:

  • BPR:Bayesian Personalized Ranking (Randle et al., 2009)是一个矩阵因子方法,它使用pairwise ranking loss。它会比较一个positive和一个sampled negative item的score。这里,我们比较了positive item与一些sampled items的scores,并使用它们的平均作为loss。在一个session中对于某个结定点的该loss定义如下:
\[L_s = - \frac{1}{N_s} \cdot \sum\limits_{j=1}^{N_s} log(\sigma(\hat{r}_{s,i} - \hat{r}_{s,j}))\]

其中,\(N_s\)是sample size,\(\hat{r}_{s,k}\)是在item k上在该session的给定点的score,i是期望的item(在session中下一item),j是负样本(negative samples)。

  • TOP1: 该ranking loss由我们提出。它是关于相关项的相对rank的正则近似。相关item的相对rank由\(\frac{1}{N_s} \cdot \sum\limits_{j=1}^{N_s} I\lbrace \hat{r}_{s,j} > \hat{r}_{s,i} \rbrace\)给定。我们使用一个sigmoid来近似\(I\lbrace \cdot \rbrace\)。这的最优化可以修改参数,以便i的score能高些。然而,这是不稳定的,因为特定positive items也扮演着负样本的角色,因为scores趋向于变得增长更高。为了避免这种情况,我们希望强制负样本的scores在零周围。这是对negative items的scores的一种自然期望。因而,我们添加到一个正则项到该loss中。很重要的是,在相同范围内的该term作为相对rank很重要,。最终的loss function如下所示:
\[L_s = \frac{1}{N_s} \cdot \sum\limits_{j=1}^{N_s} \sigma(\hat{r}_{s,j} - \hat{r}_{s,i}) + \sigma(\hat{r}_{s,j}^2)\]

4.实验

我们在两个数据集上,对rnn与其它流行的baslines进和对比。

第一个数据集是RecSys Challenge 2015. 该数据集包含了一个商业网站的click-streams,有时以购买事件结尾。我们会使用该比赛的trainset,只保留点击事件。我们过滤掉了长度为1的session。该网络使用〜6个月的数据进行训练,包含了7,966,257 sessions,在37,483个items上的31,637,239 clicks。我们使用后续天的sessions进行testing。每个session被分配给trainset或testset两者之一。由于CF方法的天性,我们会从testset中过滤出那些item点击并不在trainset中的点击。长度为1的Session也会从testset中移除。在预处理后,对于testset,我们留下了大约15324个session,它具有71222个events。该数据集被称为RSC15.

第二个数据集从Youtube-like OTT视频服务平台上收集。我们收集了在一段时间内关于观看vidio的events。只有特定范围会被归到该collection中:最近2个月。在这段时间内,每个视频后的屏幕左侧会提供item-to-item的推荐。这些items由不同算法选择得到,它们受用户行为的影响。预处理阶段与其它数据集相似,会过滤非常长的sessions,因为它们可能由机器生成。训练数据包含了所有,上述周期的最后一天。具有300w的sessions,具有在33w视频上的13w的watch events。testset包含了之前提的,具有~3.7w的sessions,~18w的watch events。该数据集被称为“VIDEO”。

评估(evaluation)通过挨个提供一个session的events,并确认下一event中该item的rank来完成。GRU的hidden state在一个session完成后会被重置为0. items通过它们的score以降序排序,在该list中它们的位置就是它们的rank。对于RSC15数据集, trainset中所有37483个items会被排序。然而,这对于VIDEO数据集是不现实的,因为items的数目很大。这里我们会对期望的item vs. 最流行的30000 items进行排序。这对于evaluation会有很小的影响,很少被访问的items经常获得较低分数。同时,基于流行度的预过滤在实际的推荐系统中很常见。

由于推荐系统一次只会推荐很少的items,一个用户可能选取的实际item应与在列表中的头几个items之中。因此,我们主要的评估指标是recall@20,也就是说,在所有test cases中,所期望item在top20之内的cases的比例。recall不考虑item的实际rank,只需要topN之内即可。这会建模实际场景,其中没有强调推荐,不关心绝对顺序。recall也通常与重要的online KPIs(比如:CTR)相关。第二个在实验中使用的metric是MRR@20 (Mean Reciprocal Rank)。这是关于所期望items的相互排序(reciprocal ranks)的平均。如果该rank超过20, 则reciprocal rank被置为0. MRR会解释该item的rank,在推荐顺序比较关注的情况下,这指标是重要的。(例如:低rank的items只会在滑动后可见)

4.1 Baselines

我们比较了该网络与一些其它baselines。

  • POP: 流行度预测,总是推荐训练集中最流行的items。它通常在特定领域内是一个较强的baseline。
  • S-POP:该baseline会推荐当前session的最流行items。推荐列表会在session期间随着items获得更多events而进行变化。使用全局流行度值可以突破束缚。该baseline在该领域很强,有较高的重复性。
  • Item-KNN:与实际item相似的Item可以通过该baseline被推荐,相似度的定义通过他们sessions向量间的cosine相似度来定义,例如:在sessions中两个items的共现次数,除以各自单个items出现所在的sessions数目的乘积的平方根。可以进行正则化,避免较少访问items的高相似度。该baseline是在实际系统中最常用的item-to-item解决方案,它提供给推荐系统这样的setting:观看了该item的其它人也会观看这些item。尽管它很简单,但它通常是一个较强的baseline。
  • BPR-MF:BPR-MF是一个常用的MF方法。它会为一个pairwise ranking目标函数通过SGD进行最优化。矩阵分解不能直接应用到session-based推荐上,因为新的sessions不会具有预计算好的特征向量。然而,我们可以通过使用在session中出现过的item的feature vectors的平均向量来克服这个问题。换句话说,在一个可推荐item和session的items间的特征向量的相似度进行求平均。

参考

https://arxiv.org/pdf/1511.06939.pdf

我们来看下lightgbm的paper:《LightGBM: A Highly Efficient Gradient Boosting Decision Tree》。

1.

GBDT是流行的机器学习算法,只有少量的高效实现,比如:XGBoost和pGBRT。尽管在这些实现中采用了许多工程优化,但当特征维度很高、数据size很大时,其效率和可扩展性仍不能令人满意。其中一个主要原因是,对于每个特征,他们需要扫描所有数据样本来估计所有可能划分点的信息增益(information gain),这是非常耗时的。为了解决该问题,我们提供了两个新技术:基于梯度的单边采样(GOSS: Gradient-based One-Side Sampling)、独有特征打包(EFB: Exclusive Feature Bundling)。有了GOSS,我们可以使用小梯度来排除大量的样本,只使用剩余部分来估计信息增益。我们通过证明,由于更大梯度的数据样本,通常在计算信息增益时扮演更重要角色,GOSS使用更小的data size即可以获得相当精准的关于信息增益的估计。有了EFB,我们可以将多个独有特征(比如:他们很少会同时采用非零值)进行打包,以减小特征数。我们证明了,发现最优的独有特征bundling是一个NP-hard问题,但一个贪心算法可以达到相当好的近似(这样可以有效减少特征数,同时不伤害split点决策的accuracy)。我们将这种带GOSS和EFB机制的GBDT称为LightGBM。我们的实现在多个公共数据集上做了实验,LightGBM可以加速常用的GBDT训练过程达20倍,而几乎保持相同的accuracy。

1.介绍

由于高效,精准,可解释性强,GBDT被广泛使用。GBDT在许多机器学习任务上都达到了state-of-art的效果。最近几年,随机大数据的出现,GBDT面临着新挑战,尤其是在accuracy和efficiency的权衡上。GBDT的常见实现,需要对每个特征进行扫描所有数据样本来估计所有可能划分点的信息增益。因此,他们的计算复杂度与特征数、以及样本数成比例。这使得这些实现在处理大数据时非常耗时。

为了解决该挑战,一个简单的想法是,减少数据样本数、以及特征数。然而,这被证明是非常有意义(non-trivial)的。例如,如何为GBDT执行数据采样是不明确的。有一些工作开展会根据它们的权重来采样数据,以加速boosting的训练过程[5,6,7]。但它们不能直接被应用在GBDT中,因为在GBDT中根本没有抽样权重(sample weight)。为此,我们提出了两种新技术。

GOSS。在GBDT中对于数据样本没有原始权重(native weight),我们注意到不同梯度的数据样本在计算信息增益时扮演着不同的角色。特别的,根据信息增益的定义,这些带着更大梯度的(例如:under-trained样本实例)样本实例会在计算信息增益时贡献更多。因此,当对这些数据样本做下采样(down-sampling)时,为了保持信息增益的accuracy,我们最好保留这些带有大梯度的样本(例如:比一个预定义阀值要更大,或者在top百分比间),并只随机drop掉那些小梯度的样本实例。我们证明了,这样的处理比均匀随机抽样(uniformly random sampling)可以产生更精准的增益估计,特别是当信息增益的值具有具有较大范围时。

EFB。在真实应用中,尽管具有大量特征数,但特征空间相当稀疏,这提供给我们一个设计一个几乎无损的方法的可能性,来减小有效特征数。特别的,在一个稀疏特征空间中,许多特征是(几乎)独有的,例如,他们很小同时采用非零值。这些样本包含了one-hot特征(例如:文本挖掘中的one-hot词表示)。我们可以很安全地对这些独有特征进行捆绑(bundle)。q我们设计了一个高效算法,它通过会将最优bundling问题缩减到一个图着色问题(graph coloring problem:通过将特征看成是顶点,如果每两个特征间相互排斥就添加一条边),通过一个常数近似率的贪心算法来解决该问题。

我们将这个带有GOSS和EFB的新GBDT算法称为LightGBM。

2.前提条件

2.1 GBDT和它的复杂度分析

GBDT是一个关于决策树的ensemble模型,它会顺序式进行训练。在每轮迭代中,GBDT会通过拟合负梯度(被称为:残差 residual errors)来学习决策树。

GBDT的主要开销在学习决策树中,学习决策树时最耗时的部分,是发现最佳的分割点(split points)。一种最流行的算法是,pre-sorted算法【8,9】,它会在pre-sorted特征值上枚举所有可能的分割点。另一种流行的算法是,histogram-based算法【10,11,12】,如算法1所示。histogram-based算法会将连续特征值进行分桶成(buckets)离散bins,并在训练期间使用这些bins来构建特征的histograms。由于histogram-based算法在内存消耗和训练速度上都更高效,我们基于它进行开发。

算法1、2:

如算法1所示,histogram-based算法会基于特征的histograms去发现最佳split points。它会花费O(#data x #feature)的时间复杂度来进行histogram building,以及花费O(#bin x #feature)来进行split point finding。由于#bin通常要比#data更小很多,histogram building会决定着计算复杂度。如果我们可以缩减#data数或者#feature数,我们将能够实质上加速GBDT的训练。

2.2 相关工作

在文献中有相当少的GBDT实现,包含XGBoost[13], pGBRT[14], scikit-learn[15], R的gbm[16]。sklearn和R-gbm实现使用的是presorted算法,而pGBRT实现了histogram-based算法。XGBoost支持两种实现(pre-sorted和histogram-based)。如[13]所示,XGBoost的效果要好于其它工作包。因而,我们使用XGBoost作为我们实验中的baseline。

为了缩减训练数据的size,常用的方法是对数据样本进行下采样。例如,在[5]中,如果数据样本的权重小于一个固定阀值,它们将会被过滤。SGB[20]会在每轮迭代中使用一个随机子集来训练弱学习器(weak learners)。在[6]中,抽样率在训练过程中会动态调整。然而,除了SGB外的所有其它工作都基于AdaBoost,不能直接应用于GBDT,因为它们对于在GBDT中的数据样本实例来说没有原始权重(native weights)。尽管SGB可以被用于GBDT,但它通常会降低accuracy,因而不是一个理想选择。

相同的,为了缩减特征数,很自然地会过滤弱特征[22,23,7,24]。这通常可以通过PCA或投影来完成。然而,这些方法高度依赖于:假设这些特征包含大量冗余,这在实践中并不总是成立(特征通常会根据它们的独特贡献被设计,移除任意之一都会在一定程序上影响训练的accuracy)。

在实际应用中的大规模数据集通常是相当稀疏的。GBDT会使用pre-sorted算法,通过忽略零值特征来缩减训练开销【13】。而histogram-based GBDT不会对稀疏优化解决方法有影响。原因是,histogram-based算法需要为每个数据样本检索特征的bin值(根据算法1),不管特征值是零或非零。我们更推荐histogram-based算法,它可以有效消除这样的稀疏特性。

为了解决之前的局限性,我们提出了两个新技术:GOSS、EFB。

3 GOSS

3.1 算法描述

在AdaBoost中,sample weight被当成是一个关于数据样本实例重要性的指示器(indicator)。然而,在GBDT中,不存在天然的sample weights,因而像AdaBoost提出的sampling方法不能直接用。幸运的是,我们注意到,对于在GBDT中的每个数据样本,它们的梯度可以为我们提供有用信息来进行数据抽样。也就是说,如果一个实例与一个小梯度有关,该样本的training error很小,并已经过良好训练。一个简单的想法是,抛弃这些小梯度的数据样本。然而,这样做可能会改变数据分布,进而伤害所学模型的accuracy。为了避免该问题,我们提出了一个新方法称为:GOSS。

GOSS会保留所有带大梯度的样本,并在小梯度样本上进行随机抽样。为了对数据分布的影响进行补偿,当计算信息增益时,GOSS会为带小梯度的数据样本引入一个常数乘子(见算法2)。特别的,GOSS首先会根据它们梯度的绝对值来对数据样本进行排序,接着选取top a x 100%的样本。接着它会从其余数据中随机抽样 b x 100%的样本。最后,当计算信息增益时,GOSS会通过一个常数\(\frac{1-a}{b}\)对小度数抽样数据进行放大。通过该方法,我们可以更关注under-trained样本实例,而不需要过多更改原始数据分布。

算法2:

3.2 理论分析

GBDT使用决策树来学习从输入空间\(X^s\)到梯度空间\(\mathcal{G}\)的函数。假设,我们具有一个训练集\({x_1,...,x_n}\),n独立同分布(i.i.d.),其中每个\(x_i\)是一个在空间\(X^s\)上的s维向量。在gradient boosting的每轮迭代中,关于loss函数的负梯度会根据模型的输出被表示为\({g_1, ..., g_n}\)。决策树模型会在最具信息量的特征上分割每个节点(使用最大信息增益)。对于GBDT,信息增益通常会通过在进行分割之后的variance来进行衡量,如下定义。

定义 3.1: 假设O是在决策树的一个确定节点上的训练数据集。在该节点上,分割特征j在点d中的variance gain,定义如下:

\[V_{j|O}(d) = \frac{1}{n_O}()\]

其中,。

定理 3.2

4. EFB

在本部分,我们提出了一种新方法来有效缩减特征数。

算法3,4

高维数据通常非常稀疏。特征空间的稀疏性提供我们一个可能性来设计近科目无损的方法来缩减特征数。特别的,在一个稀疏特征空间中,许多特征相互排斥,例如,他们不会同时采用非零值。我们可以安全地将这些相互排斥的特征打包成单个特征(我们称之为一个“exclusive feature bundle”)。通过一个精心设计的特征扫描算法,我们可以从feature bundles中构建相同的feature histograms来作为从单个特征中计算的histograms。在这种方法中,histogram building的复杂度可以从O(#data x #feature)变为O(#data x #bundle),其中,#bundle « #feature。接着,我们可以在对accuracy无伤的情况下极大加速GBDT的训练。接着,我们会详细展示是如何得到的。

有两个要点要解决。第一个是,决定哪些特征应一起进行加包。第二个是如何构建bundle。

定理 4.1:将特征划分为更小数目的exclusive bundles问题是一个NP-hard问题。

证明:我们会将图着色问题(graph coloring problem)应用到我们的问题上。由于图着色问题是NP-hard的,我们可以推导我们的推论。

给定关于图着色问题的任意样本 \(G = (V,E)\)。我们以如下方式构建一个样本实例。采用关联矩阵G的每一行作为一个feature,接着使用\(\mid V \mid\)个特征来获取一个instance。很容易看到,在我们的问题中,特征的一个exclusive bundle对应于相同颜色的一个顶点集,反之即然。

对于第1个要点,定理4.1证明了:发现最优的bundling策略是一个NP-hard问题。这意味着,在多项式时间内发现一个准确的解是不可能的。为了发现一个好的近似算法,我们首先将optimal bundling问题精减为图着色问题。通过将特征看成是顶点、如果两两特征不相互排斥则在上面添加边。我们使用一个贪心算法来为图着色生成bundles来生成合理的好结果(具有一个常数近似几率)。接着,我们注意到,通常有相当少的特征,尽管它们并不是100%相互排斥的,很少同时采用非零值。如果我们的算法可以允许一定比例的冲突,我们可以获得一个更小数目的feature bundles,并进一步提升计算效率。通过简单计算,随机污染一定比例的特征值会影响训练accuracy,最多达到\(O([(1-\gamma)n]^{-2/3})\),其中\(\gamma\)是在每个bundle中的最大冲突然袭击。因此,如果我们选择一个相对小的\(\gamma\),我们会在accuracy和efficiency上达到较好的平衡。

其于上述讨论,我们为exclusive feature bundling设计了一个算法来,如算法3所示。首先,我们使用一个带权重边来构建一个graph,它们有weights以应于特征间的总冲突。第二,我们通过在图中的度对特征进行降序排序。最后,我们在有序列表中确认每个特征,接着给它们分配一个已存在具有较小冲突的bundle(通过\(\gamma\)控制),或者创建一个新bundle。算法3的时间复杂度是\(O(#feature^2)\),它在训练前仅会处理一次。当特征数不是非常大时,该复杂度是可接受的,但如果有数百万特征时仍会有问题。为了进一步提升效率,我们提出一种更有效的排序策略(ordering strategy),无需构建graph:通过非零值的数目排序,这与通过degree的方式排序相似,因为更多非零值通常会产生更高的冲突率。由于我们只会更改算法3的排序策略,新算法的细节会被忽略以免重复。

对于第二个要点,我们需要一种好方法来将相同bundle中的features合并,以便能缩减相应训练复杂度。关键点是确认原始特征值可以从feature bundles中被确认。由于histogram-based算法会存储离散bins,而非特征的连续值,我们可以通过让排斥特征(exclusive features)落在不同的bins上。这可以通过添加offsets到特征的原始值中来完成。例如,假设我们在一个feature bundle中有两个features。最初,feature A的取值为[0, 10),feature B的取值为[0, 20)。我们接着添加一个offsets为10到feature B中,以便重定义的features取值为[10,30)。这之后,可以安全地合并features A和B,并使用一个范围为[0,30)的feature bundle来替换原始的features A和B。详细情况见算法4.

EFB算法可以将多个排斥特征bundle到更少的dense features上,它可以有效避免不必要的零特征值计算。实际上,我们也可以优化最基本的histogram-based算法,通过为每个特征使用一个表来记录非零值数据来忽略零值。通过扫描该表的数据,对于一个特征,histogram building的开销会从O(#data)变更为O(#non zero data)。然而,该方法需要额外的内存和计算开销来维持这些在整个树增长过程中的per-feature tables。我们在LightGBM中将该优化实现作为一个基本功能。注意,该最优化不会与EFB冲突,因为在当bundles很稀疏时,我们仍可以使用它。

5.实验

本部分,我们会展示实验结果。我们使用了5个不同公共数据集。这些数据集如表1所示。其中,Microsoft Learning to Rank [LETOR]数据集包含了30K的网络搜索queries。该数据集所用的features大多数是dense numerical features。Allstate Insurance Claim数据集和Flight Delay数据集都包含了许多one-hot coding features。最后两个数据集来自于KDD CUP 2010和KDD CUP 2012. 我们直接使用来自NTU的获胜方案的features,它包含了dense和sparse features,这两个数据集都非常大。我们可以使用它们来直接测试算法。

表1

我们的实验环境是Linux server,它具有两个E5-2670 v3 CPUs(共24个核)以及256GB内存。所有实验都在多线程上运行,线程数固定在16个上。

5.1 总体比较

我们在下面提出了总的比较。XGBoost和没有GOSS和EFB的LightGBM(称为lgb_baseline)被用于baselines。对于XGBoost,我们使用两个版本,xgb_exa(pre-sorted算法)和xgb_his(histogram-based算法)。对于xgb_his,lgb_baseline,以及LightGBM,我们使用leaf-wise的树增长策略。对于xgb_exa,由于它只支持layer-wise的增长策略,我们为xgb_exa调整参数,以便让它像其它方法一样增长相似的树。接着,我们朝着在speed和accuracy间更好平衡的方向,为所有数据集调参。我们为Allstate,KDD10和KDD12设置a = 0.05, b=0.05, 为Flight Delay和LEFTOR设置a=0.1, b=0.5. 我们EFB中设置\(\gamma=0\)。所有算法会运行固定迭代次数,我们从该迭代中使用最好的score来获取accuracy结果。

表2

训练时间和测试accuracy在表2和表3中。从这些结果看,我们可以看到LightGBM是最快的,并且几乎与baselines维持着相同的accuracy。xgb_exa是基于pre-sorted算法的,它会比histogram-based算法要慢很多。通过比较lgb_baseline,LightGBM在AllState、Flight Delay、LETOR、KDD10和KDD12数据集上要快21x,6x,1.6x,14x和13x。由于xgb_his相当耗费内存,它在KDD10和KDD12数据集上不能成功运行,会out-of-memory。在其它数据集上,LightGBM会更快,直到在Allstate数据集上能达到9x加速。 加速的计算是通过每轮迭代的训练时间计算得到的,是由于所有算法会在相同迭代数上收敛。为了演示总的训练过程,我们展示各自在图1和图2上,基于wall clock time的训练曲线。

表3:

在所有数据集上,LightGBM可以达到几乎相同的test accuracy作为baselines。这意味着GOSS和EFB在带来大的加速时并不会伤害accuracy。这与第3.2节和第4节的理论分析相一致。

5.2 GOSS分析

首先,我们研究了GOSS的加速能力。从表2中LightGBM和EFB_only的比较来看,我们可以通过使用10%-20%的数据,看到GOSS可以带来接近2x的加速。GOSS可以只使用抽样数据就可以学到trees。然而,它会在整个数据集上保留一些计算,比如:指导预测和计算梯度。这样,我们就可以发现,整个加速与抽样数据的比例是非线性相关的。然而,由GOSS带来的加速仍非常大,该技术可以应用到不同数据集上。

第二,通过比较随机梯度增强(SGB:Stochastic Gradient Boosting),我们评估了GOSS的accuracy。不失一般性,我们使用LETOR数据集进行测试。我们通过选择在GOSS中不同的a和b来调参抽样比例,并为SGB使用相同的整体抽样比例。我们通过使用early stopping来运行这些settings直到收敛。结果如表4所示。我们可以看到,当使用相同的抽样比例(sampling ratio)时,GOSS的accuracy总是好于SGB。这些结果与在3.2节中讨论一致。所有实验演示了GOSS是一个比stochastic sampling更高效的sampling方法。

表4:

5.3 EFB分析

通过比较lgb_baseline和EFB_only,我们确认了EFB对于加速的贡献。结果如表2所示。这里,我们不允许在bundle finding process(例如:\(\gamma=0\))中有冲突。我们发现EFB可以帮助达到在这些大规模数据集上更大的加速。

注意,lgb_baseline对于稀疏特征有优化,EFB可以通过一个较大因子达到训练加速。由于EFB会将许多稀疏特征(one-hot features和隐式exclusive features)合并到更少的特征中。然而,EFB在维持非零数据表上,对于在树学习过程中的每个特征,不会有额外开销。再者,由于许多之前孤立的特征会捆绑到一起,它可以增加spatial locality,并极大提升cache hit rate。因此,在效率上的整体提升是显著的。有以上分析后,EFB是一个非常有效的算法,可以利用在histogram-based算法上的sparse特性,它可以为GBDT训练过程带来一个极大加速。

参考

https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf

我们来看下standford的Aditya Grover的《node2vec: Scalable Feature Learning for Networks》。

1.介绍

node2vec是一种半监督算法,用于在网络中的可扩展特征学习。受之前NLP中工作[21]的启发,我们会使用SGD对一个定制的基于图的(graph-based)目标函数进行优化。直觉上,该方法会返回特征表示,对于在d维空间内的节点,会对它们的网络邻节点的似然进行最大化。我们使用2-order的随机游走来为顶点生成(抽样)网络邻节点。

我们的关键贡献是,为一个顶点的网络邻节点定义了一个灵活的概念。通过选择一个合适的概念,node2vec可以学到网络表示,它们可以基于现在的网络角色,或者属于的社群来进行组织。我们通过开发一个有偏的随机游走(biased random walks)的族谱,它可以有效探索一个给定顶点的邻居分布。结果算法很灵活,提供可调参数给我们以对搜索空间进行控制,而不是之前的方法[24,28]进行严格搜索(rigid search)。相应的,我们的方法可以建模网络等价物。参数管理着我们的搜索策略,具有一个直观解释,会让walk朝着不同的网络搜索策略进行偏移。这些参数在一个半监督学习中,只使用很小比例的带标注数据(labeled data)就可以直接学到。

我们也展示了单独节点的特征表示如何被扩展成节点对(pairs of nodes。比如:边)。为了生成边的特征表示,我们将将学到的特征表示与简单的二元操作相组合。这种组合(compositionality)将node2vec引入到关于节点(或者是边)的预测任务上。

我们的试验集中在两个关于网络的公共预测任务上:一个多标签分类任务,其中每个节点被分配一或多个标签;一个链接预测任务,其中给定一个节点对,预测该边是否存在。我们将node2vec与state-of-art的特征学习方法[24,28]进行对比。并从现实中不同领域中的网络进行实验,比如社交网络,信息网络,以及系统生物学网络。对比起state-of-art的方法,实验演示了nod2vec在多标签分类上要好26.7%,在链接预测的任务上要好12.6%。该算法展示了有竞争力的效果,即使只有10%的带标签数据,对于噪声或缺失边的情况下一样健壮。计算上,node2vec的主要过程是并行化的,它可以扩展到带有数百万节点的大网络上,只需要几个小时的计算量

该paper主要贡献是:

  • 1.提出了nod2vec,一种用于网络特征学习的高效的扩展算法,可以通过一种显著的network-aware,neighborhood preserving objectives,使用SGD方法进行高效优化。
  • 2.我们展示了node2vec如何适应在网络科学中已确立的准则,提供了在发现表示上的灵活性,并有不同的等价物。
  • 3.我们基于neighborhood preserving objectives,扩展了node2vec以及其它特征学习方法,将节点扩展到节点对,来基于边的预测任务。
  • 4.在多个真实数据集上,在多标签分类和链接预测上评估node2vec。

2.

在NLP的表征学习的最近进展上,有新方法对离散目标(比如:词)进行特征学习。特别的,Skip-gram模型是目标就是学习连续的特征向量,通过优化一个(neighborhood preserving likelihood objective). 该算法的处理如下:扫描一个文档的词,对于每个词,它的目标是将它进行嵌入,以便该词的特征可以预测邻近词(例如:在一些上下文窗口中的词)。词的特征表示通过使用SGD、negative sampling对likelihood objective进行优化学习得到。skip-gram目标函数是基于分布式假设:有相似上下文的词,趋向于具有相近的意思。也就是说,相似的词趋向于出现在具有相似词邻居的上下文内。

受skip-gram模型的启发,最近的研究确立了一种网络的类比法,将一个网络表示成一个“文档(document)”。相同的方法是,一个有序的词序列,节点序列需要从底层网络上进行采样,将一个网络转化成一个有序的节点序列。然而,对于节点来说,存在许多可能的抽样策略,会从而学到不同的特征表示。事实上,正如我们展示的,对于所有网络和所有预测任务来说,没有明确可胜出的抽样策略可以适用所有场景。以前的方法的主要缺点是,在从一个网络上进行抽样节点时缺乏灵活性。我们的算法node2vec克服了该限制,通过设计一种灵活的目标函数,它不会绑定一个特定的抽样策略,提供参数来调节探索的搜索空间(见第3节)。

最终,对于基于节点和基于边的预测任务,存在许多监督特征学习方法[15,17,31,39]。这些架构直接最小化loss function,使用多层非线性转换来产生更高的accuracy,但扩展开销高,因为训练时间长。

3.特征学习框架

我们将网络特征学习看成是一个极大似然优化问题。给定一个网络\(G = (V, E)\)。我们的分析是普适性的,可以应用于任何有向(无向)、加权(不加权)的网络。假设:\(f: V -> R^d\)是映射函数,将节点映射到特征表示。这里的d是特征表示的维度。f是一个size为\(\|V\| \times d\)的参数矩阵。对于每个源节点(srouce node)\(v \in V\),我们定义了\(N_S(u) \subset V\)作为节点u的一个网络邻节点,它通过邻节点采样策略S来生成。

我们扩展了Skip-Gram架构来处理该网络。我们对下面的目标函数进行最优化,它会基于它的特征表示,对一个节点u的一个网络邻节点\(N_S(u)\)的log概率进行最大化,f给定:

\(max_f \sum_{u \in V} log Pr(N_S(u) | f(u))\) …(1)

为了让最优化变得可处理,我出做出了两个标准假设:

  • 条件独立性。我们通过假设:给定源节点的特征表示,观察到一个邻节点的似然,与观察到其它邻节点是独立的:
\[Pr(N_s(u) | f(u)) = \prod_{n_i \in N_S(u)} Pr( n_i | f(u))\]
  • 特征空间的对称性。一个源节点和它的邻节点在特征空间中具有对称性的相互影响。因而,我们建模每个(源节点-邻节点)pair的条件似然建模成一个softmax unit,它由它们的特征点积进行参数化:
\[Pr(n_i | f(u)) = \frac{exp(f(n_i)\cdot f(u))} {\sum_{v \in V} exp(f(v) \cdot f(u))}\]

有了以上假设,等式一的目标可以简化为:

\(max_{f} \sum_{u \in V} [ -log Z_u + \sum_{n_i \in N_S(u)} f(n_i) \cdot f(u) ]\) …(2)

每个节点的分区函数:\(Z_u = \sum_{v \in V} exp(f(u) \cdot f(v))\),对于大网络来说计算开销很大,我们可以使用负采样[22]来对它做近似。我们使用SGA(ascent)对等式(2)进行优化.

基于skip-gram的特征学习方法,最早源自于NLP上下文学习。文本本身是线性的,一个邻词可以很自然地使用一个在连续词汇上的滑动窗口进行定义。而对于网络,是非线性的,因而需要更丰富。为了解决这一点,我们提出了一个随机过程,它会对给定源节点u抽样许多不同的邻节点。\(N_S(u)\)不局限于它的立即邻节点(immediate neighbors),具体取决于抽样策略S,有不同的结构。

3.1 经典搜索策略

图1

我们将对一个源节点的邻节点进行抽样的问题看成是一种局部搜索(local search)。图1展示了一个图,其中,给定一个源节点u,我们的目标是生成(抽样)它的邻节点\(N_S(u)\)。重要的是,为了比较不同的抽样策略S,我们将邻节点集合\(N_S\)的size限制为k个节点,接着为单个节点u抽样多个集合。总体上,有两种极限抽样策略来生成k个节点的邻节点集合\(N_S\):

  • 广度优化抽样(BFS:Breadth-first Sampling): 邻节点\(N_S\)被限制到关于源节点的立即领节点上(immediate neighbors)。例如:在图1中,对于一个邻节点的size为 k=3, BFS抽样的节点为:\(s_1, s_2, s_3\)。
  • 深度优化抽样(DFS:Depth-first Sampling):邻节点包含了从源节点开始在增加的距离上按顺序抽样的节点。在图1中,DFS抽样\(s_4, s_5, s_6\)

BFS和DFS表示了根据搜索空间进行探索的两种极限情况。

特别的,在网络上的节点的预测任务通常会是两种类型相似度的混合(shuffle):同质(homophily)等价 和结构(structural)等价。在同质假设下,节点高度交错连接,并且属于同网络聚类或社群,在embedding上更紧密(例如:图1中的节点\(s_1\)和u属于相同的网络社群)。相反的,结构等价假设下,在网络上具有相似结构角色的节点,应该在embedding上更紧密(例如:节点u和\(s_6\)在图1上分演扮演着相应社群中心的角色)。更重要的是,不同于同质等价,结构等价不强调连通性;在网络中的节点可以离得很远,但它们仍具有相近的网络结构角色。在真实世界中,这些等价概念并是排斥的;网络通常具有两者的行为。

我们观察到,BFS和DFS的策略在处理表示时扮演着重要角色,它影响着上述两种等价。特别的,BFS抽样的邻节点会导致embedding与结构等价更紧密。直觉上,我们注意到,为了探明结构等价,通常会对局部邻节点进行精准的描述。例如,基于网络角色(桥接:bridges、中心:hubs)的结构等价可以通过观察每个节点的立即节点(immediate neighborhoods)观察到。通过将搜索限制到邻近节点,BFS达到了这种characterization, 并且获得了关于每个节点的邻近点的微观视角。另外,在BFS中,在抽样邻节点上的节点趋向于重复多次。这很重要,对于。

3.2 node2vec

基于上述观察,我们设计了一种灵活的邻节点抽样策略,它允许我们在BFS和DFS间进行平衡。我们通过开发一种灵活的有偏随机游走(biased random wolk)过程,它可以以BFS和DFS的方式来探索邻节点。

3.2.1 随机游走

给定一个源节点u,我们进行模拟一个固定长度为l的随机游走。\(c_i\)表示在walk中的第i个节点,从起点\(c_0=u\)开始。节点\(c_i\)通过下面的方式生成:

\[P(c_i=x | c_{i-1}=v) = \begin{cases} \frac{\pi_{vx}}{Z} , if(v,x) \in E \\ 0 , otherwise \end{cases}\]

其中\(\pi_{vx}\)是未归一化的节点v和x间的转移概率,而Z是归一化常量。

3.2.2 搜索偏差\(\alpha\)

对我们的随机游走进行bias的最简单方法是,基于一个静态边权重\(w_{vx}\)(例如: \(\pi_{vx} = w_{vx}\))来抽样下一个节点(无权重图则\(w_{vx}=1\))。然而,该种情况不能解释网络结构,并指导搜索过程来探索不同类型的网络邻居。另外,不同于BFS和DFS两个极端,我们的随机游走会兼容两者。真实网络中通常也是两者混合。

图2: 在node2vec中的随机游走过程说明。该walk会从t到v进行转移,并在node v准备出去的下一步进行评估。边的labels表示搜索的bias \(\alpha\)

我们定义了一个2阶随机游走,它具有两个参数p和q来指导walk:考虑到一个随机游走,它穿过边(t,v),现在留在节点v上(图2)。该walk需要决定,在下一步它会评估在边(v,x)上由v产生的转移概率\(\pi_{vx}\)。我们设置未归一化转移概率为\(\pi=\alpha_{pq}(t,x) \cdot w_{vx}\),其中:

\[\alpha_{pq}(t,x) = \begin{cases} \frac{1}{p} , if d_{tx}=0 \\ 1 , if d_{tx}=1 \\ \frac{1}{q} , if d_{tx}=2 \end{cases}\]

其中,\(d_{tx}\)表示在节点t和x上的最短路径距离。注意,\(d_{tx}\)必须是{0, 1, 2}其中之一,因而,两个参数都是必须的,可以充分指导该walk。

直觉上,参数p和q控制着该walk从起始节点u进行探索和离开邻节点的快慢。特别的,该参数允许我们的搜索过程(近似)在BFS和DFS间进行插值,从而影响不同节点等价的紧密关系。

返回(Return)参数:p。参数p控制着在walk中立即访问一个节点的似然。将它设置成一个高值(> max(q,1)),可以确保我们在下两步内对一个已经访问节点进行抽样的可能性变得很小。(除非在walk内的下一个节点没有其它邻居)。这种策略鼓励适度探索,避免在抽样时存在二跳内重复(2-hop redundancy)。另一方面,如果p很小(<min(q,1)),它将导致该walk会回溯(backtrack)一个step(见图2),并且这会让该walk“局部”上保持与起始节点u的接近。

入出(In-out)参数:q。参数q允许搜索在“inward”和”outward”节点间区分。回到图2, 如果q>1, 随机游走会偏向于更接近节点t的节点。这样的walk会根据在walk中各自的起始节点获得一个关于底层graph的局部视图,近似的BFS行为感觉上我们的抽样在一个小的局部内的节点组成。

作为对比,如果 q < 1, 该walk更趋向于访问那些离节点t更远的节点。这样的行为受DFS影响,它会鼓励outward探索。然而,这里的一个基本不同是,我们在随机游走框架内完成DFS-like的探索。因而,被抽中的节点不需要对到给定节点u的距离进行增加才行,反过来,我们受益于对随机游走的回溯预处理和优秀的采样效率。注意,通过将\(\pi_{v,x}\)设置成关于一个在walk t内前继节点的函数,随机游走是2阶markovian。

随机游走的好处。比起纯BFS/DFS方法,随机游走有许多好处。随机游走在时间和空间需求上的计算很高效。在图中为每个节点存储它的立即邻节点的空间复杂度为\(O(\|E\|)\)。对于二阶随机游走,会存储在每个节点的邻节点间的交叉连接,这会引发一个空间复杂度为\(O(a^2 \|V\|)\),其中\(a\)是该graph的平均度,它通常对于现实网络来说很小。比起经典的基于搜索的抽样策略,随机游走的其它核心优点是它的时间复杂度。特别是,通过引入在抽样生成过程中的图连通性,随机游走提供了一个很便利的机制,通过复用跨不同源节点间的样本,来增加有效抽样率。通过模拟一个长度l>k的随机游走,得益于随机游走的马尔可夫性,我们可以为l-k个节点一次生成k个样本。因而,每个样本的有效复杂度为\(O(\frac{1}{k(1-k)})\)。例如,在图1中,我们抽样一个长度为l=6的随机游走 {\(u, s_4, s_5, s_6, s_8, s_9\)},它会产生\(N_S(u)=\left s_4, s_5, s_6 \right\),\(N_S(s_4)=\left s_5, s_6, s_8 \right\),以及\(N_S(s_5)=\left s_6, s_8, s_9 \right\)。注意,在整个过程中,样本复用可能引入一些bias。然而,我们观察到它可以极大提升效率。

3.2.3 node2vec算法

算法1

node2vec的伪代码,详见算法一。在任何随机游走中,由于起始节点u的选择,会有一个隐式偏差(implicit bias)。由于我们为所有节点学习表示,我们会为每个节点通过模拟r个固定长度为l的随机游走来对该bias进行补偿(offset)。在该walk的每一个step,会基于转移概率\(\pi_{vx}\)进行抽样。对于二阶马尔可夫链,转移概率\(\pi_{vx}\)可以被预计算好,因而,当模拟随机游走时,节点的抽样可以很有效地在O(1)时使用alias sampling完成。node2vec的三个阶段(phases),即:预处理计算转移概率、随机游走模拟、使用SGD进行优化,是按顺序进行的。每个phase可以并行化和异步执行,从而做到node2vec整体可扩展性。 node2vec的一个实现:http://snap.stanford.edu/node2

3.3 学习边特征

node2vec算法提供了一个半监督方法来学习网络中节点的丰富特征表示。然而,我们通常对涉及节点对(pairs of nodes)的预测任务感兴趣,而非单个节点。例如,在链接预测上,我们在网络中的两个节点间预测一个链接是否存在。由于我们的随机游走在底层网络上天然地基于节点间的连通结构,我们可以使用一个bootstrap方法来将它们扩展到节点对的特征表示,而非单个节点的特征表示。

给定两个节点u和v,我们定义了一个二元操作o,在相应的特征向量f(u)和f(v),为了生成一个表示g(u,v),比如:\(g: V \times V -> R^d^'\),其中\(d'\)是pair(u,v)的表示的size。我们希望我们的操作对于任意节点对可以进行定义,即使一条边在pair间不存在,因为这样做可以使表示对于连接预测有用,我们的测试集包含了true edges和false edges(不存在)。我们对于操作符o的一些选择,以便\(d'=d\),由表1归纳的。

实验

node2vec: Scalable Feature Learning for Networks

hinton在google提出了《Distilling the Knowledge in a Neural Network》 knowledge distillation。

1.介绍

许多昆虫会有一个幼虫状态,可以最优地从环境中抽取能量和营养;也会有一个成虫状态,以便最优地进行飞行和繁衍。在大规模机器学习中,我们通常在训练阶段和部署阶段使用非常相似的模型来,尽管两个阶段有着非常不同的要求:对于像语音识别和目标识别,训练必须从非常大、高度过剩的数据集中抽取结构,但不能实时地方式运行,它会使用大量计算。然而,部署大量用户通常在时延(latency)和计算资源上具有非常多的严格要求。在昆虫上的类比,建议我们可以去训练非常大的模型(cumbersome models),它可以轻易地抽取来自数据中的结构。cumbersome model可以是独立训练模型的ensemble,或者使用像dropout等强正则方式训练的单个非常大的模型。一旦cumbersome model被训练后,我们可以接着使用一个不同方式的训练,我们称作“distillation”,可以将来自cumbersome model的knowledge进行transfer到一个小模型中,它会更适合部署。该策略的版本已经由Rich Caruana和它的同事一起率先尝试。在他们的重要paper中,他们表示可以由一个大模型的ensemble的knowledge进行transfer到一个小模型中。

一个阻止更多研究这种方法的概念块是:我们趋向于使用已学到的参数值来识别出(identify)在一个已训练模型中的knowledge,这使得它很难看到:在仍会记住相似的knowledge之下,该模型的形式是如何变化的。从knowledge的一个抽象视角看(这会从任何特殊实例中解释出来),是从input vectors到output vectors的一个可学习映射(learned mapping)。对于cumbersome models,可以学习判别许多类,常规的训练目标(normal training loss)是:对正确答案(correct answer)最大化平均log概率,但该学习的一个side-effect是:该训练好的模型会分配概率给所有不正确的答案,即使当这些概率非常小时,其中一些会比其它更大。不正确答案的相对概率告诉我们关于cumbersome model是如何趋向于gnerealize的许多信息。例如,一张关于BMW的照片,可能有少量的机会被误认为是一个垃圾车(garbage truck),但这种错误仍然要比被误认为一个胡萝卜的概率要大许多倍。

这通常是可接受的,对于训练使用的objective function会影响该用户的true objective,使得尽可能接近。尽管如此,模型通常会被训练成在训练数据上最优化,当实际objective是泛化给新数据。它会明显更好地训练模型以便更好泛化,但这需要关于correct way的信息来泛化,该信息通常没有提供。当我们从一个大模型中distill知识给小模型时,我们可以训练该小模型来泛化(正如大模型一样)。例如,如果cumbersome model泛化良好,它是一个不同模型的ensemble,一个小模型会以相同的方式训练用来进行泛化,通常会比正常训练的单个小模型在测试数据上要好。

transfer该cumbersome model的泛化能力的一个直接方式是,使用由cumbersome model生成的类概率(class prob)作为“soft targets”来进行训练小模型。对于transfer阶段,我们可以使用相同的训练集或者一个单独的”transfer” set。当cumbersome model是一个许多更简单模型的ensemble时,我们可以使用一个单一预测分布的算法或者几何平均作为soft targets。当soft targets具有高熵时(high entropy),他们会比hard targets在每个训练case上提供更多信息,并在traning cases间的梯度上具有更小的variance,因此小模型通常会比原始的cumbersome model使用更少数据训练,并使用一个非常更高的learning rate

对于像MNIST这样的任务,它的cumbersome model几乎总是生成具有正确答案,它会具有高置信度、更多关于learned function的信息,在soft targerts中以非常小的概率比(ratios)存在。例如,一个关于2的version,可能会给出一个具有概率\(10^{-6}\)是3,以及\(10^{-9}\)是7,其它version有其它的形式。这是非常有价值的信息,它定义了一个在数据上的丰富的相似结构(例如:2看起来像3,也看起来看7),但它在transfer stage时在cross-entropy cost function上具有非常小的影响,因为该概率会非常接近于0。Caruana和它的同事通过使用该logits(到最终softmax的inputs)来解决该问题,而非由softmax生成的概率作为targets来学习该小模型,并且它们会最小化在logits和cumbersome model间的平方差(squared difference)。我们的更通用解决方案称为“distillation”,会提出关于final softmax的temperature,接到cumbersome model生成一个关于targets的合适soft set。当训练该小模型时,我们接着使用相同的temperature匹配这些soft targets。我们会接着展示:对该cumbersome model进行匹配logits实际是distillation的一个特例。

transfer set被用于训练小模型,可以包括无标记的数据(unlabeled data),或者我们可以使用原始的training set。我们已经发现,使用该原始的training set运行良好,特别是:如果我们添加一个小项到objective function中时,这会鼓励小模型去预测true targets,同时茶杯由cumbersome model提供的soft targets。通常,小模型不能完全匹配soft targets,并且在正常答案上的erring可以是有帮助的。

2.Distillation

许多networks通常会使用一个”softmax” output layer来生成类概率(class probabilities),它会对logits \(z_i\)进行转化,为每个class计算一个probability, \(q_i\),并与其它logits进行相互比较\(z_i\)。

\[q_i = \frac{exp(z_i / T)}{\sum_j exp(z_j / T)}\]

…(1)

其中,T是一个temperature,通常设置为1. 将T设置得更高会生成一个在classes上的softer probability分布。

在distillation的最简形式中,通过在一个transfer set上训练模型,并使用一个对每个case在transfer set中的一个soft target分布(使用cumbersome model并在softmax中使用一个高temperature),knowledge会被转移到distilled model中。当训练该distilled model时,会使用相同高的temperature,但在它被训练后,它会使用一个temperature为1。

当correct labels被所有或部分transfer set知道时,该方法可以极大提升,也可以训练该distilled model来生成correct labels。这样做的一种方式是,使用correct labels来修正soft targets,但我们发现一种更好的方式是:简单使用一个对两个不同objective functions的weighted average。第一个objective function是使用soft targets的cross entropy,该cross entropy使用distilled model的softmax上的相同logits,但temperature=1。我们发现,获得的最好结果,会在objective function上使用一个相当低的weight。由于通过soft targets生成的梯度幅度缩放为 \(1/T^2\),当同时使用hard和osft targets时,乘上\(T^2\)很重要。当实验使用meta-parameters时,如果用于distillation的temperature发生变化,这可以确保hard和soft targets的相对贡献仍然大致不变。

2.1 匹配logits是distillation的一个特征

在transfer set中每个case,对于distilled model的每个logit \(z_i\),贡献了一个cross entropy gradient, \(dC/ dz_i\)。如果cumbersome model具有logits \(v_i\),它会生成soft target probabilities \(p_i\),并且transfer training会在temperature T上完成,我们给出了该gradient:

\[\frac{\partial C}{\partial z_i} = \frac{1}{T} (q_i - p_i) = \frac{1}{T} (\frac{e^{z_i/T}}{\sum_j e^{z_j/T}} - \frac{e^{v_i/T}}{\sum_j e^{v_j/T}})\]

…(2)

如果对于logits的幅值,temperature高,我们可以近似:

\[\frac{\partial C}{\partial z_i} \approx \frac{1}{T}(\frac{1+z_i/T}{N+\sum_j z_j/T} - \frac{1+v_i/T}{N + \sum_j v_j/T}\]

…(3)

如果我们假设:对于每个transfer case,logits已经是独立零均值的,以便\(\sum_j z_j = \sum_j v_j = 0\),等式3简化为:

\[\frac{\partial C}{\partial z_i} \approx \frac{1}{NT^2} (z_i - v_i)\]

…(4)

因此,在高temperature限制下,distilliation等价于最小化\(1/2(z_i - v_i)^2\),提供的logits对于每个transfer case都是独立零均值的。在更低的temperatures上时,distilliation会花费更少的attention来matching logits,以便比平均有更多的negative。这有潜在优势,因为这些logits对于用于训练cumbersome modelcost function几乎完整无限制,因此他们可能非常有noisy。另一方面,非常负的logits可能会传达关于由cumbersome model获取knowledge的有用信息。这些效果占据着哪些是一个经验性问题。我们展示了当distilled model太小,而不能获取cumbersome model中的所有知识,intermediate temperatures会运行最好,会强烈建议忽略掉大的negative logits,这样会有用。

3.在MNIST上的初步实验

4.在语音识别上的实验

5.在非常大数据集上训练ensembles

6.Soft targets作为Regularizers

使用soft targets来替代hard targets的主要目的之一是,在soft targets中携带的一大堆有用的信息,不能使用单个hard target进行编码。在本节中,我们展示了,通过使用相当少的数据来满足baseline语音模型中85M参数,有非常大的影响。表5展示了只有3%的数据(大概20M样本),使用hard targets的baseline model进行训练,会导致严重的overfitting(我们做了early stopping,但在accuracy达到44.5%迅速下降),其中使用soft targets的相同模型可以恢复几乎在完整训练集上的所有信息(大概2%).这十分深刻,注意我们不必做early-stopping:使用soft targets的系统会简单“收敛”到57%。这展示了soft targets是一个非常有效的方式,一个模型在所有数据上训练发现的regularities会与另一个模型相交流(communicating)。

6.1 使用soft targets来阻止specialist避免overfitting

在JFT dataset上,我们在实验上使用的specialists会将所有其它非专家类(non-specialist classes)收缩到单个垃圾类上(dustbin class)。如果我们允许specialists具有一个在所有classes上的full softmax,比起early stopping有一种更好的方式来阻止overfitting。一个specialist会在它的special classes上高度增强的数据上进行训练。这意味着,训练集的有效大小(effective size)会更小,它具有一个很强的趋势来overfit它的special classes。该问题不能通过将specialist变得更小来解决,因为我们会丢掉非常有用来自对所有non-specialist classes建模得到的transfer effects。

我们的实验会使用3%的语音数据,它强烈建议如果一个specialist会使用genrealist的weights进行初始化,我们可以让它保持几乎所有关于non-special classes的知识,通过为non-special classes使用soft targets来训练,另外使用hard targets来训练它。soft targets可以由generalist来提供。我们现在会探索该方法。

7.与MoE(Mixtures of Experts)的关系

使用specialists可以在数据的子集上进行训练,它与MoE(mixtures of experts)具有相似性,它使用一个gating network来计算分配每个样本到每个expert的概率。同时,由于experts会学习来处理分配给它们的样本,gating network会学习选择哪个experts来分配每个样本,基于experts对该样本的相对判别表现(relative discriminative performance)。使用该关于该experts的discriminative performance来判断该学到的分配,会比简单将input vectors进行聚类并为每个cluster分配一个expert的方式要好的多,但它使得训练很难并行化:首先,每个expert的加权训练集(weighted training set)会以依赖于所有其它experts的方式保持变更;第二,gating network需要对比在相同样本上不同experts的表现来知道如何修正它的分配概率。这些难点意味着:MoE(Mixture of experts)很少被用于那些最有收益的地方:具有海量数据集并且包括着不同的子集的任务。

对多个specialists的训练并行化更容易。我们首先训练一个gneralist model,接着使用confusion matrix来定义用于训练specialists的subsets。一旦这些subsets已经被定义,specialists可以完全独立进行训练。在test time时,我们可以使用genralist model的预测来决定,哪个specialists是相关的,并且只有这些specialists需要被运行。

8.讨论

我们已经展示了,distilling可以式作良好,将一个ensemble、或者从一个大的高度复杂的模型的知识进行transfer到一个更小的distilled model上。在MNIST上,当transfer set被用于训练distilled model时,即使缺少一或多个classes,distillation的效果也很好。对于一个更深的语音模型,用于android voice search,我们展示了,几乎所有的提升都通过训练一个dnn的ensemble并将它distilled到相同size的单个neural net上(它更容易部署)来达到。

对于实际的大神经网络(big neural networks),训练一个full ensemble是可行的,但我们发现,单个大网络要训练很久,可以通过学习大量specialist nets来极大提升效果,每个specialist可以学习判断在一个高度confusable cluster中的classes。到目前为上,我们并没有展示,我们可以在specialists中的知识distill到单个大的net上。

参考

yahoo japan在kdd 2017的《Embedding-based News Recommendation for Millions of Users》提出了关于新闻推荐的一些方法:

#

理解文章内容和用户偏好,对于做出有效新闻推荐来说很必要。而基于ID的方法,比如:CF和低秩因子分解,也可以做出推荐,但它们不适用于新闻推荐,因为候选文章会快速超期,在短时内被更新的替代。Word-based方法,常用于信息检索,是很好的候选方法,但它们只与用户历史动作的”queries”同义相关。该paper提出了一种embedding-based方法,它使用分布式表示,以一个3-step end-to-end的方式进行:

  • i) 基于一个denoising autoencoder的变种生成文章的分布式表示
  • ii) 使用一个RNN,将用户浏览历史作为输入序列,生成用户表示
  • iii) 基于内积(inner-product)操作为用户匹配(match)和列出(list)对应文章,并考虑上系统性能。

提出的方法在Yahoo! Japan的主页上的历史访问数据进行评估和实验,并表现良好。我们基于实验结果,在我们实际的新闻分发系统上实现了它,并比较它的在线效果。CTR的提升有23%,总时长(total duration)提升了10%,对比起常用的方法。我们提出的方法已经开放给所有用户,并每天提供推荐给超过1000w个人用户,每月访问次数超10亿。

1.介绍

对于用户来说,读取所有存在的文章的新闻分布是不可能的,这受限于时间。因而,用户喜欢新闻服务可以选择性地提供文章。这种选择通常由编辑人工完成,所选故事的公共集合会在传统媒体上(比如:电视新闻节目、报纸)被提供给用户。然而,在互联网上,我们可以使用以下信息:user ID cookies、单个用户的个性化阅读文章等等,从而对用户进行标识来更好地选择文章。

ID-based方法,比如CF或低秩因子分解,可以很好地做出推荐。然而,[22]建议,这样的方法不适合于新闻推荐,因为候选文章很快会过时。因而,新闻推荐需要有三个关键点:

  • 理解文章内容
  • 理解用户偏好
  • 基于内容和偏好为用户列出挑选的文章

另外,在现实中能快速响应扩展性和噪声并做出推荐很重要[14]。应用也需要在数百ms内返回响应给每个用户。

覆盖上面三个关键点的一个baseline实现如下。一篇文章被看成是关于它的文本的一个词集合(words collection)。一个用户可以看成是他/她浏览的多篇文章的一个词集合(words collection)。该实现会使用文章集和它的浏览历史之间的词共现作为特征来学习点击概率。

该方法有一些实际优点。它可以快速响应最新趋势,因为模型很简单,可以很快进行学习和更新。优先级的估计可以使用已经存在的搜索引擎和词的倒排索引进行快速计算。

出于这些原因,我们的之前版本实现基于该方法。然而,有一些要点可能会对推荐质量有负面影响。

第一个是词的表征(representation of words)。当一个词只当成一个feature使用时,两个具有相同意思的词会被看成是完全不同的feature。该问题会趋向于出现在在新闻文章中当两个提供者对于相同的事件提交文章时。

第二个问题是,浏览历史的处理。浏览历史在该方法中被处理看一个集合(set)。然而,他们实际上是一个序列,浏览的顺序应能表示用户兴趣的转移。我们也必须注意,用户在历史长度上分别很大的,从私人浏览,到那些每小时多次访问。

基于深度学习的方法已经在多个领域取得效果。词的分布式表示可以捕获语义信息。RNN已经为处理不同长度的输入序列提供了有效结果【9,15,17】。

如果我们使用一个RNN来构建一个深度模型来估计用户和文章间的兴趣度,另一方面,很难满足在实时系统中的响应限制。该paper提出了一个embedding-based方法,它使用一个在3-step end-to-end中使用分布式表示的方法,基于相关性和重复性,来为每个用户表示文章列表中的每篇文章。

  • 基于一个denoising autoencoder的变种来生成文章的分布式表示
  • 通过使用一个RNN,使用浏览历史作为输入序列,来生成用户表示
  • 为每个用户基于用户-文章的内积,根据相关性和文章间的去重性,来匹配和列出文章

我们的方法的关键点是估计文章-用户间(article-user)的相关性。我们可以在用户访问足够时间之前,计算文章表示和用户表示。当一个用户访问我们的服务时,我们只选择他/她的表示,它计算候选文章和该表示间的内积。我们的方法可以表达包含在用户浏览历史中的复杂关系,并能满足实时性限制。

提出的方法被用到新闻分发服务中。我们比较了我们的方法和其它方法,结果表明,提出的方法要好于常用方法,不管是在实时服务上还是静态实验数据上,缺点是,增加了学习时间,模型更新延迟,但都在允许范围内。

2.服务和处理流

在该paper中讨论的方法被用在Yahoo!Japan上。第6节描述的在线实验也在该页上进行。

图1: Yahoo!Japan在移动端的主页示例。该paper讨论了关于个性化模块中的文章的方法

图1展示了一个我们的服务的实物,可以在May 2015复现。在顶部header有一个搜索窗口和其它服务的链接。中间部分,称为“Topics module”,提供了在主要新闻上通过人工专家为读者群精心挑选的的6篇文章。底部,称为“个性化模块(Personalized module)”,提供了许多文章和广告,它们对于用户是个性化的。在个性化模块中的用户,可以随着他们的滚动看尽可能多的文章。典型的读者基本上会浏览20篇文章。该paper描述了个性化文章提供的最优化。

会执行5个过程来为数百万用户进行个性化选择文章。

  • Identify:通过用户之前的历史行为计算获取user features
  • Matching:使用user features抽取匹配上的文章
  • Ranking: 以特定优先级对文章列表重排序
  • De-duplication:去重,移除包含相似信息的文章
  • Advertising: 如果有必要,插入广告

从用户发起请求到展示文章,这些过程必须在数百ms内完成,因为文章是经常变化的。事实上,在我们服务中的所有文章,超过24小时就失去了新鲜度,每天会发表上万的新文章,同样的,相同数目的老文章会因为超期被移除。因而,每个过程都会采用较轻计算开销的方法,它会使用预计算好的文章的分布式表示(第3节描述)和用户表示(第4节)。

我们使用一个用户的分布式向量和候选文章向量间的内积,来匹配相关性和选择满意的候选。我们通过考虑额外因子(比如:PV的期望数目,每篇文章的新鲜度,以及匹配的相关度)来决定排序的优先顺序。我们会以贪婪的方式基于分布式表示的cosine相似度去复相似文章。当带有更高优先级的文章的cosine相似度的最大值,超出一定阀值时,我们会跳过该文章。在真实新闻分发服务中这是一个重要的过程,因为相似文章在排序时具有相似的分数。如果相似文章的展示相互挨着,用户满意度会下降,因为在展示时缺少多样性。广告也很重要,但许多研究表明广告与用户满意度间的关系,这里我们省略这一块的讨论。

3.文章表示

第1节介绍了一种使用words作为一篇文章的features的方法,它在特定的关于抽取和去重的cases中不一定能工作良好。这一节会描述一种方法来将文章表示成分布式表示。我们提出了之前的一种方法[12]。

3.1 生成方法

我们的方法会基于一个denoising autoencoder,并使用弱监督的方法来生成分布式表示向量。常见的denosing autoencoder可以公式化:

\[\hat{x} \sim q(\hat{x} | x) \\ h = f(W \hat{x} + b) \\ y = f(w'h+b') \\ \theta = argmin_{W,W',b,b'} \sum_{x \in X} L_R(y,x)\]

其中\(x \in X\)是原始input vector,\(q(\cdot \mid \cdot)\)是加噪声混淆分布(corrupting distribution)。stochastically corrupted vector, \(\hat{x}\),从\(q(\cdot \mid x)\)中获取。隐表示,h,从\(\hat{x}\)映射穿过该网络,它包含了一个激活函数,\(f(\cdot)\),参数矩阵W,参数向量b。在相同的方式下,reconstructed vector,y, 也从h映射,带有参数\(W'\)和\(b'\)。使用一个loss函数,\(L_R(\cdot, \cdot)\),我们学习这些参数来最小化y和x的reconstruction errors。

h通常被用于一个对应于x的向量表示。然而,h只持有x的信息。我们希望解释,如果\(x_0\)与\(x_1\)更相似时,两个表示向量的内积 \(h_0^T h_1\)更大。为了达到该目的,我们使用了一个三元组,\((x_0, x_1, x_2) \in X^3\),作为训练的输入,并修改了目标函数,来维持他们的类目相似性:

\[\hat{x}_n \sim q(\hat{x}_n | x_n) \\ h_n = f(W \hat{x}_n + b) - f(b) \\ y_n = f(W' h_n + b') \\ L_T(h_0, h_1, h_2) = log(1 + exp(h_0^T h_2 - h_0 ^T h_1)) \\ \theta = argmin_{W, W', b, b'} \sum_{(x_0,x_1,x_2) \in T} \sum_{n=0}^2 L_R(y_n, x_n) + \alpha L_T(h_0, h_1, h_2)\]

其中,\(T \subset X^3\), 以至于\(x_0\)和\(x_1\)具有相同或相似的类目,\(x_0\)和\(x_2\)具有不同的类目。在等式(1)中的h满足该属性,\(x=0 \rightarrow h = 0\)。这意味着,这是一篇与其它文章都不相似的文章。该概念,\(L_T(\cdot, \cdot, \cdot)\)是一个关于文章相似度的罚项函数,它对应于类别相似度(categorical similarity),其中\(\alpha\)是一个用于权衡的超参数。图2提供了该方法的一个总览。

图2: 文章三元组有encoder

我们使用elementwise sigmoid 函数,\(\sigma(x)_i = \frac{1}{1+exp(-x_i)}\)作为\(f(\cdot)\),elementwsie cross entropy为\(L_R(\cdot, \cdot)\),masking noise为\(q(\cdot \mid \cdot)\)。我们训练该模型,\(\theta = \lbrace W, W', b, b' \rbrace\),通过使用mini-batch SGD进行最优化。

我们在应用阶段(application phase)通过使用常数衰减来构建\(\hat{x}\),在训练阶段(training phase)则使用stochastic corruption作为替代:

\[\hat{x} = (1-p) x \\ h = f(W \hat(x) + b) - f(b)\]

其中,p是训练阶段的corruption rate。因而,h是应用时唯一确定的。乘以(1-p)对于将输入分布均衡到在middle layer中的每个神经元有影响,在masking noise和没有该noise间进行学习(待)。

我们使用在上述三个应用中生成的h作为文章的表示:

  • (i) 可作为user-state函数的输入
  • (ii) 可以衡量user和article间匹配的相关度
  • (iii) 衡量在去重时文章间的相似度

4.用户表示

本节描述了通过用户浏览历史进行计算用户偏好的多种方法。首先,我们对问题进行公式化,并生成一个简单的基于word的baseline方法。接着描述使用文章的分布式表示的一些方法。

4.1 概念

假设:A是关于文章的所有集合。元素\(a \in A\)的表示依赖于该京城。在4.2节中,a是一个描述的word-based方法的稀疏向量,向量中的每个元素对应于词汇表中的每个词。然而,在4.3节和4.4节中,a是一个关于文章的分布式向量表示。

浏览(Browse)意味着用户访问一篇文章的URL。假设\(\lbrace a_t^u \in A \rbrace_{t=1,...,T_u}\)是用户\(u \in U\)的浏览历史。

会话(Session)意味着用户访问推荐服务并在推荐列表中点击某篇文章。

当用户u点击在我们的推荐服务中的一篇文章时(发生一次会话),他/她会立即访问被点文章的URL(发生一次浏览)。这样,对于浏览\(a_t^u\)和\(a_{t+1}^u\)之间,从不会超过一个session;因此,该session被称为\(s_t^u\)。然而,用户u也可以不经过我们的服务而访问一篇文章的URL,例如:通过一次Web search。因此,\(s_t^u\)并不总是存在。

由于一个session会对应提供给u的列表,我们通过一个文章列表\(\lbrace s_{t,p}^u \in A\rbrace_{p \in P}\)来表示一个session: \(s_t^u\)。\(p \subset N\)是推荐列表位置的集合,它实际上对应于在该session中屏幕上的展示位置。假设:\(P_{+} \subseteq P\)是点击位置,而\(P_{-} = P \backslash P_{+}\)是非点击位置。尽管P, \(P_{+}\), \(P_{-}\)取决于u和t, 我们会忽略这些下标以简化概念。图3展示了这些概念间的关系。

图3: 浏览历史和session

假设\(u_t\)是user state,它取决于\(a_1^u, ..., a_t^u\)等等,\(u_t\)表示在浏览\(a_t^u\)之后u的即时偏好。假设:\(R(u_t, a)\)是user state \(u_t\)与文章 a间的相关度,它表示了用户u在时间t上对于文章a的兴趣强度。我们的目标是,构建user-state function:\(F(\cdot, ..., \cdot)\)以及相关度函数:\(R(\cdot, \cdot)\),它们需满足下面属性:

\(u_t = F(a_1^u, ..., a_t^u) \\ \forall_{s_t^u} \forall_{p_{+} \in P_{+}} \forall_{p_{-} \in P_{-}} R(u_t, s_{t,p_{+}}Yu) > R(u_t, s_{t,p_{-}^u})\) …(2)

我们考虑下:请求量很大的真实新闻分发系统的受限响应时间,\(R(\cdot, \cdot)\)必须是一个简单函数,并能快速计算。对于所有用户\(\lbrace u_t \mid u \in U\rbrace\),以及所有文章\(\brace a \in A \rbrace\),由于候选文章会很频繁更新,对相关得分进行预计算是不可能的。因此,有必要在很短的时间内计算它(从访问我们的服务页面到推荐列表到被展示)。然而,我们具有足够多的时间来计算user state function:\(F(\cdot, ..., \cdot)\)(从浏览一些文章页面到下一次session发生)。

我们的受限相关函数(restrict relevance function):\(R(\cdot, \cdot)\),表示一个简单的内积关系,\(R(u_t, a) = u_t^T a\),出于这些原因,只有对user state function: \(F(\cdot,...,\cdot)\)来最小化目标函数:

\[\sum_{s_t^u} \sum_{p_{+} \in P_{+}, p_{-} \in P_{-}} - \frac{log( \sigma( R(u_t, s_{t,p_{+}}^u) - R(u_t, s_{t,p_{-}^u}))} { |P_{+}| |P_{-}|}\]

…(3)

其中\(\sigma(\cdot)\)是logistic sigmoid function。等式4.1是等式(2)的一个宽松版本。实际上,在点击率上存在一个bias,具体取决于文章的展示位置,我们使用以下包含bias项\(B(\cdot,\cdot)\)的目标函数,来纠正这种影响。尽管\(B(\cdot, \cdot)\)是一个通过学习决定的参数,它的描述在下面会被忽略,因为它是该模型的一个公共项。

\[\sum_{s_t^u} \sum_{p_{+} \in P_{+}, p_{-} \in P_{-}} - \frac{log( \sigma( R(u_t, s_{t,p_{+}}^u) - R(u_t, s_{t,p_{-}}^u) + B(p_{+}, p_{-})))} { |P_{+}| |P_{-}| }\]

4.2 Word-based模型

我们引入第1节所述的word-based模型作为baseline。

回顾下baseline实现的三个steps。

  • 一篇文章通过它的文本中的词集合进行表示
  • 一个用户通过他/她浏览过的文章所包含的词集合表示
  • 用户与文章间的相关度通过关于在两者间的词共现数的一个线性函数表示

如果文件表示为a,用户函数为F,V是词汇表,定义如下:

\[a, u_t \in \lbrace 0, 1 \rbrace ^ V \\ (a)_v = \\ (u_t)_v = (F(a_1^u, ..., a_t^u))_v = a_v max_{1 \leq t' \leq t} (a_{t'}^u)_v\]

…(4)

其中\((x)_v\)是x中的第v个元素。接着,相关函数变为一个关于参数\(\lbrace a_v \rbrace\)简单线性模型:

\[R(u_t, a) = u_t^T a \\ = \sum_{v \in V} (u_t)_v (a)_v \\ = \sum_{v \in V} a_v 1_{v \in u_t \cap a}\]

该模型有两个缺点,略。

4.3 Decaying Model

我们引入了一个简单模型来解决上述缺点。模型的两点改变是:

  • 它会使用由第3节构建的分布式表示作为表示向量,而非纯BOW表示。
  • 它会使用根据浏览历史的加权平均,而非最大值。更特别的,我们会增加最近浏览在权重,减小前些天浏览的权重。

总之,\(u_t\)可以表示为:

\[u_t = \alpha \bigodot \frac{1}{\sum_{1 \leq t' \leq t}} \beta^{t-t'} \sum_{1 \leq t' \leq t} \beta^{t-t'} a_{t'}^u\]

其中,\(\alpha\)是一个参数向量,它与\(a_t^u\)具有相同维度,\(\bigodot\)是两个向量的elementwise乘法,其中\(0 \leq \beta \leq 1\)是一个标量,它是一个用于表示时间衰减的超参数。如果\(\beta\)是1, 就是简单的平均,无需考虑浏览次序。训练参数只有\(\alpha\),它与baseline模型相似。

4.4 Recurrent Models

4.4.1 simple Recurrent Unit.

尽管decaying model要比word-based model要好,它有局限性,与频次、以及受指数衰减限制的遗忘影响成线性关系。

更常见的,\(u_t\)由前一state\(u_{t-1}\),和前一浏览\(a_t^u\)决定:

\[u_t = f(a_t^u, u_{t-1})\]

因而,我们会尝试使用一个RNN来学习该函数。一个简单的RNN可以公式化为:

\[u_t = \phi ( W^{in} a_t^u + W^{out} u_{t-1} + b)\]

其中\(\phi(\cdot)\)是激活函数;因而,我们后续使用双曲正切函数:\(tanh(\cdot)\)。训练参数是个方阵\(W^{in}, W^{out}\),bias vector为b,初始state vector \(u_0\),其中\(u_0\)是公共初始值,并不依赖于u。

我们通过end-to-end minibatch SGD的方式对等式 4.1的目标函数进行学习。然而,当输入序列过长时,简单的RNN很难学习,因为会存在梯度消失和爆炸问题。额外的结构被绑定到hidden layer上,以便减轻该问题。

下一部分会介绍使用这些结构的两个模型。

4.4.2 LSTM Unit

LSTM是一种解决梯度消失和爆炸问题的结构。我们可以将LSTM模型公式化为:

\[gi_t = \sigma(W_{gi}^{in} a_t^u + W_{gi}^{out} u_{t-1} + W_{gi}^{mem} h_{t-1}^u + b_{gi}) \\ gf_t = \sigma(W_{gf}^{in} a_t^u + W_{gf}^{out} u_{t-1} + W_{gf}^{mem} h_{t-1}^u + b_{gf}) \\ enc_t = \phi(W_{enc}^{in} a_t^u + W_{enc}^{out} u_{t-1} + b_{enc} \\ h_t^u = gi_t \bigodot enc_t + gf_t \bigodot h_{t-1} ^u \\ go_t = \sigma(W_{go}^{in} a_t^u + W_{go}^{out} u_{t-1} + W_{go}^{mem} h_t^u + b_{go}) \\ dec_t = \phi(W_{dec}^{mem} h_t^u + b_{dec}) \\ u_t = go_t \bigodot dec_t\]

其中,\(\sigma(\cdot)\)是elementwise logistic sigmoid函数,\(h_t^u\)是一个hidden memory state。图4是LSTM模型的一个网络结构。

图4

center flows是从输入(浏览过的文章)到输出(user state)的最重要的flows。输入,\(a_t^u\),被编码中从文章向量空间到hidden空间(等式5),会合并之前的hidden state(等式6),并编码成文章向量空间(等式7,等式8)作为user state。

另外,该unit具有三个gates,称为input gate(\(gi_t\)),forget gate(\(gf_t\)),output gate(go_t)。我们假设每个gate都会各尽其职。input gate会过滤掉不必要的输入来构建一个user state,比如:由突然兴趣造成的。forget gate表示用户在兴趣上的下降。它可以表示比指数衰减(exponential decay)更复杂的forget影响。output gate会过滤掉在下一个session中不关注的成分。

训练参数是权重矩阵\(W\),bias向量b,初始化state vectors \(u_0\)和\(h_0^u\),其中\(u_0\)和\(h_0^u\)是不依赖于u的公共初始化值。

4.4.3 Gated Recurrent Unit(GRU)

是另一种避免梯度消失和爆炸的方法。公式如下:

\[gz_t = \sigma(W_{gz}^{in} a_t^u + W_{gz}^{mem} h^{t-1} + b_{gz}) \\ gr_t = \sigma(W_{gr}^{in} a_t^u + W_{gr}^{mem} h^{t-1} + b_{gr}) \\ enc_t = \phi(W_{enc}^{in} a_t^u + W_{enc}^{out}(gr_t \bigodot h^{t-1}) + b_{enc}) \\ h_t^u = gz_t \bigodot enc_t + (1-gz_t) \bigodot h_{t-1}^u \\ dec_t = \phi(W_{dec}^{mem} h_t^u + b_{dec}) \\ u_t = dec_t\]

更准确的,该模型使用一个GRU layer和一个fully connected layer来构建,因为等式(1) 在原始GRU配置中不包含。图5展示了GRU-based模型的结构。

图5

除了省略了一些键头,该结构与LSTM-based模型相似。然而,等式(6)和等式(9)有一个重要的不同点。\(gz_t\)gate会扮演在LSTM-based模型的两个gates的角色:\(gi_t\)和\(gf_t\)。

\(sup_{u} \| h_t^u \|_{infty} =\) …(12)

等式11对于非常长的输入序列具有一个较大值;等式(12)从不会超过该常数。因此,我们认为GRU-based模型比LSTM-based模型能更好地解决梯度爆炸问题。

LSTm-based模型在训练时偶尔会失败,归因于我没在实验中没有使用梯度裁减(gradient clipping)从而造成梯度爆炸。然而,GRU-based模型不需要任何前置处理,不会造成梯度爆炸。

5.实验

5.1 训练数据集

首先,抽样了接近1200w的用户,它们在2016年1月到9月间,在Yahoo!Japan主页上有点击文章的动作。我们会为每个用户抽取一个超过两周时间的日志,随机包含至少一次点击。该抽取方法被用于减轻在特定时间内流行文章的影响。

最后产生的结果,在训练数据中,会有16600w个session,10亿次浏览,200w唯一的文章。我们也创建了相同时期内另一个数据集,并使用它作为验证集来最优化参数。

5.2 测试集

抽样了50w sessions,在2016年10月,用户点击文章超过位置20. 我们为每个session抽取前两周的浏览日志。我们使用位置1到20的文章数据来进行评估,忽略是否实际在屏幕中显示过。这基于我们timeline-based UI的观察。用户会从顶划到底,当点击一篇文章时趋向于离开我们的服务。这就是说,如果我们只使用实际展示的数据进行evaluation,安排实际展示按逆序的方式,进行不成比例地评估也佳。

5.3 离线Metrics

AUC、MRR、nDCG

5.5 结果

参考

http://sci-hub.tw/10.1145/3097983.3098108