我们来看下tensorflow的rnn_cell.DropoutWrapper的实现原理:《A Theoretically Grounded Application of Dropout in Recurrent Neural Networks》,在rnn上使用dropout。

摘要

RNN是深度学习许多研究的前研。这些模型的主要难点是容易overfit,直接在recurrent layers上应用dropout会失败。在Bayesian建模和深度学习的交叉研究上,提供了一种通用深度学习技术(比如:dropout)的Bayesian解释。在approximate Bayesian inference上的dropout基础,提供了一种理论扩展,并提供了在RNN模型上使用dropout的见解。我们在LSTM和GRU模型中基于dropout技术来使用这种新的变分推断(variantional inference),并将它应用于语言建模和语义分析任务上。新的方法要好于已存在的技术,并达到最好的效果。

1.介绍

RNN是基于序列的模型,是NLP、语言生成、视频处理、以及许多其它任务上的关键。模型的输入是一个符号序列,在每个timestep上,会将一个RNN unit应用于单个symbol,该网络的输出会使用来自之前的time step的信息。RNN很强,但很容易overfit。由于在RNN模型中缺乏正则化,使得它很难处理小数据,为了避免overfitting,研究者们通常会使用:early-stopping、或者小模型。

Drop是深度网络中很流行的正则技术,其中在训练期间network units会被随机masked(dropped),但该技术从未在RNNs上成功应用过。经验表明,添加到recurrent layers上的噪声(在RNN units间的connections)会因序列过长而被放大,从而盖过信号本身。因而,一些研究得出结论:该技术只能在RNN的inputs和outputs上使用[4,7,10]。但这种方法在我们的实验中仍会导致overfitting。

最近在Bayesian和深度学习的交叉研究的最新结果提供了:通过Bayesian视角来解释常见的deep learning技术[11-16]。深度学习的Baeysian视度将这些新技术引入到该领域,比如:从深度学习网络中获得原则不确定估计(principled uncertainty estimates)。例如,Gal and Ghahramani展示了dropout可以被解释成一个Bayesian NN的后验的变分近似。这种变化近似分布是两个具有较小方差的高斯分布的混合,其中一个Gaussian的均值固定为0. 在approximate Bayesian inference中的dropout的基础扩展了理论,提供了新的视角来在RNN模型上使用这些技术。

这里我们关注常见的RNN模型(LSTM, GRU),并将它们解释成概率模型,比如:RNN的网络权重看成是随机变量,并定义了likelihood函数。我们接着在这些概率Bayesian模型上执行近似变化推断(我们称之为:Variational RNNs)。使用高斯混合的在权重的后验分布上的近似,会产生一个可跟踪的最优化目标函数。对该objective最优化等同于在各自RNNs上执行一个新的dropout变种。

在新的dropout variant中,我们会在每个timestep上对inputs、outputs、recurrent layers(在每个time step上drop相同的network units)重复相同的dropout mask。与已经存在的专有(ad-hoc)技术相比,在每个timestep上,对inputs、outputs各自采用不同的dropout masks抽样(在recurrent connections上不使用dropout,因为在这些connections上使用不同的masks会导致很差的效果)。我们的方法和与现有技术的关系如图1所示。当使用离散输入(比如:words)时,我们也会在word embeddings上放置一个分布。在word-based模型中的dropout接着会随机drop掉句子中的word types,并被解释成:对于该任务,强制该模型不依赖于单个words。

图1 dropout技术。(左):标准dropout (右): Bayesian解释的dropout. 每个方块表示一个RNN unit,水平键头表示时间依存关系(recurrent connections)。垂直键头表示每个RNN unit的input和output。带颜色的连接(connections)表示dropped-out inputs;不同颜色表示不同的dropout masks。虚线表示没有dropout的标准connections。当前技术(naive dropout, 左)在不同time steps上使用不同的masks,而在recurrent layers上没有dropout。提出的技术(Variational RNN, 右)在每个timestep上使用相同的dropout mask,包括recurrent layers

我们接着研究了相关的文献和资料,将我们的Variational RNN的近似推断进行公式化,产生提出的dropout变种。实验结果在随后给出。

2.相关研究

3.背景

我们会回顾下Bayesian神经网络和近似变分推断的背景知识。基于这些思想,在下一节我们提出了在probabilistic RNN中的近似推断,它会产生一个dropout的新变种。

3.1 Bayesian神经网络

给定:

  • 训练输入:
  • 相应的输出:

在Bayesian(parametrics) regression中,我们希望推断一个函数(用于生成我们的outputs的可能性)的参数w。什么样的参数可能会生成我们的数据?根据Bayesian方法,我们想将一些先验分布放置在参数空间上:。该分布表示了先验,表示哪些参数可能会生成我们的数据。我们进一步需要定义一个likelihood分布。对于分类任务,我们会假设一个softmax likelihood:

或者一个关于regression的高斯似然。给定一个数据集X,Y,我们接着寻找在参数空间上的一个后验:。该分布会捕获多个函数参数生成我们所观察到的数据的可能性。有了它,我们可以为一个新的input point 通过下式连续积分来预测一个output:

…(1)

定义在函数参数集合上的分布的一种方式是:在一个神经网络的权重上放置一个先验分布,生成一个Bayesian NN。对于layer i给定权重矩阵以及bias vectors ,我们经常在该权重矩阵上放置标准矩阵高斯先验分布,,并出于简洁性经常为bias vectors的假设一个点估计(point estimate)。

3.2 Bayesian NN中的近似变分推断

我们感兴趣的是,发现权重矩阵的分布(参数化我们的参数)来生成我们的数据。这也是在给定我们的观察 在权重上的后验。该后验在总体上是不可跟踪的,我们会使用变分推断来近似它。我们需要定义一个近似变分分布,接着最小化在近似分布和完整后验间的KL divergence:

…(2)

我们接着将该近似变分推断扩展到probabilistic RNNs上,并使用一个分布,它会产生在RNNs上的一个dropout新变种。

4.RNN上的变分推断

在本节中,出于概念简洁性,我们将关注在简单RNN模型上。LSTM和GRU与它相类似。给定长度为T的输入序列:,一个简单的RNN通过对函数重复使用来形成。这会在每个timestep t上生成一个hidden state :

为非线性函数。该模型可以定义成:我们将该RNN看成是一个概率模型,将参数看成是随机变量(遵循正态先验分布)。为了使在w上的依赖更清晰些,我们将重写成,同理。我们定义了我们的概率模型的likelihood。在随机变量w的后验是相当复杂的,我们使用变分推断以及近似分布来近似它。

在等式(2)中对每个sum term进行evaluating,我们可以得到:

其中:。我们使用Monte Carlo(MC)积分、并使用单个样本,将它近似为:

会在每个sum term上产生一个无偏估计。

该estimator可以插入到等式(2)中,来获得最小的objective:

…(3)

注意:对于每个序列,我们会抽样一个新的实现,在序列中的每个symbol会通过函数进行传递,并且在每个timestep 上使用相同的weight实现

根据[17],我们定义了我们的近似分布来对权重矩阵和在w中的行进行因式分解(factorise)。对于每个权重矩阵的行,近似分布为

其中:

  • 是变分参数(row vector)
  • p为(dropout probability),事先给定
  • 较小

我们在上最优化;这些对应于在标准视图中RNN的权重矩阵。等式(3)的KL可以被近似成在变分参数上的正则。

样本,评估模型的output 对应于在forward pass期间在每个权重矩阵W上的行进行随机零化(masking)——例如:执行dropout。我们的目标函数L等同于标准RNN。在我们的RNN setting中,对于一个序列input,每个权重矩阵行会被随机masked一次,很重要的是:在所有time steps上会使用相同的mask

预测可以被近似成:即会将每个layer的均值(mean)的传播给下一layer(被称为标准的dropout approximation),或者通过等式(1)中q(w)的后验进行近似:

…(4)

以及,例如,通过在test time时执行dropout并对结果求平均(MC dropout)。

4.1 在RNNs中dropout的实现与关系

实现我们的近似推断等同于以这种方式在RNNs中实现dropout:在每个timestep上drop掉相同的network units,随机drop掉:inputs、outputs、recurrent connections。对比起已经存在的技术:在不同的timesteps上drop掉不同的network units、在recurrent connections上不使用dropout(见图1)。

特定RNN模型,比如:LSTMs和GRUs,在RNN units上使用不同的gates。例如:LSTM使用4个gates来定义:”input”、”forget”、“output”、”input modulation”.

其中:

  • 为权重矩阵
  • 为element-wise product

这里,内部state (被称为cell)被求和式的更新。

该模型可以被重新参数化为:

…(6)

其中:,W是一个2K x 4K的矩阵(K是的维度)。我们将该参数命名为:tied-weights LSTM(对比于等式(5)中的untied-weights LSTM)

尽管这两个参数会产生相同的deterministic模型,它们会产生不同的近似分布。有了第一个参数,对于不同gates可以使用不同的dropout masks(即使当使用相同input 时)。这是因为,近似分布会放在在矩阵上而非inputs上:我们会drop掉一个权重矩阵W中特定的行,并将它应用在上;在另一矩阵上drop掉不同的行,并应用到上。第二个参数,我们会在单个矩阵W上放置一个分布。这会产生一个更快的forward-pass,但是会轻微减弱实验的效果。

在更具体的项上,我们会重写我们的dropout变种,使用第二个参数(等式(6)):

…(7)

其中,会在所有time steps上随机mask(与等式(5)的参数相似)。

作为比较,Zaremba[4]的dropout变种(rnndropout)会将等式(7)中的替代成时间独立的(time-dependent) ,它会在每个time step上重新再抽样(其中:被移除,recurrent connection 不会被drop掉):

另外,Moon[20]的dropout变种则将等式(5)进行变化,会采用internal cell:

其中,在所有time steps上会使用相同的mask 。注意,不同于[20],通过将dropout看成是一个在权重上的operation,我们的技术可以很容易扩展到RNNs和GRUs上。

4.2 Word Embeddings Dropout

在具有连续输入的数据集中,我们经常将dropout应用到input layer上——例如:input vector本身。这等价于在weight matrix上放置一个分布,它跟着input,并能近似对它求积分(该matrix是可优化的,否则会有overfitting的倾向)

但对于离散输入的模型(比如:words,每个word会被映射到一个连续的vector: word embedding中)却很少这样做。有了word embeddings,input可以看成是word embedding或者是一个“one-hot” encoding。one-hot编码的vector与一个embedding matrix 的乘积就给出了一个word embedding。好奇的是,该parameter layer是在大多数语言应用中最大的layer,但它经常不会正则化。因为embedding matrix的优化可能会导致overfitting,因此希望将dropout应用到one-hot encoded vectors。这事实上等同于在输入句子上随机drop掉words。可以解释成:对于它的output,模型不依赖于单个词。

注意,在开始前,我们会将矩阵的行随机设置为0. 因为我们会在每个time step上重复相同的mask,我们会在整个序列上drop掉相同的words——例如,我们随机drop掉word types,而非word tokens(例如:句子“the dog and the cat”可能会变为:“- dog and - cat”或者“the - and the cat”,但不会是“- dog and the cat”)。一种可能无效的实现是,需要对V的Bernoullli随机变量进行抽样,其中V可能很大。这可以通过对长度为T的序列,至多有T个embeddings被drop的方式来解决(其它drop掉的embeddings不会对模型output有影响)。对于,最有效的方式是,首先将words映射到word embeddings上,接着基于它们的word-type将word embedding进行zero-out。

5.评估

略。

#6.DropoutWrapper

这里再说一下tensorflow中的tf.nn.rnn_cell.DropoutWrapper。里面有一个比较重要的参数:variational_recurrent(缺省为False)。

如果设置为True,它就会在每个step上使用相同的dropout mask,如上面的paper描述。如果设置为False,则会在每个timestep上设置一个不同的dropout mask。

注意,缺省情况下(除排提供一个定制的dropout_state_filter),经过DropoutWrapper 的memory state(LSTMStateTuple中的component c)不会被更改。该行为在上述文章中有描述。

参考

我们来看下Wojciech Zaremba和google brain的人在ICLR 2015提出了《recurrent neural network regularization》,在rnn上使用dropout。

摘要

我们发表了一种简单的regularization技术用于LSTM units的RNNs中。Dropout是神经网络正则化中最成功的技术,但它不能与RNNs和LSTMs有效运行。在本paper中,我们展示了如何将dropout正确应用到LSTMs中,并展示了在多个任务上dropout实质上可以减小overfitting。这些任务包含:语言建模、语音识别、图片标题生成、机器翻译。

1.介绍

RNN是神经序列模型,并在多个重要任务上达到了state-of-the-art的效果。我们知道,神经网络的成功应用需要好的正则化(regularization)。不幸的是,对于前馈神经网络最重要的regularzation:dropout(Srivastava 2013),却不能与RNNs有效运行。因而,RNNs的实际应用经常使用很小的模型,因为大的RNNs会趋向于overfit。已经存在的regularization方法对于RNNs的相对提升较小。在本文中,我们展示了正确使用dropout时可以极大减小在LSTMs中的overfitting,并在三个不同问题上进行了evaluate。

本文代码可在:https://github.com/wojzaremba/lstm找到。

2.相关工作

3.LSTM cells RNN的正则化

在本节中,我们描述了deep LSTM。接着,展示了如何对它正则化,并解释了我们的regularization scheme。

我们假设下标表示timesteps,上标表示layers。所有我们的states都是n维的。假设:

  • 是在timestep t时在layer l上的一个hidden state。
  • 是一个仿射变换(Wx+b, 对于一些W和b)。
  • 是element-wise乘法,
  • 是一个在timestep k上的input word vector。

我们使用activations 来预测,因为L是在我们的deep LSTM中的layers数目。

3.1 LSTM units

RNN的动态性可以使用从前一hidden states到当前hidden states上的确定转换(deterministic transitions)来描述。deterministic state transition是一个函数:

对于经典的RNNs,该函数可以通过下式给出:

LSTM具有复杂的动态性,使得它对于可以轻易地“记住(memorize)” 一段时间内的信息。“lont term” memory被存储在memory cells 的一个vector中。尽管许多LSTM的架构在它们的连接结构和激活函数上有所区别,所有的LSTM结构都具有显式的memory cells来存储长期的信息。LSTM可以决定是否overwrite memory cell,或者检索它,或者在下一time step上继续保留它。LSTM的结构如下:

在这些等式中,sigm和tanh是element-wise。图1展示了LSTM的等式。

图1: LSTM memory cells的图形化表示

3.2 使用dropout正则化

该paper的主要贡献是,应用dropout到LSTMs中,并成功地减小了overfitting。主要思想是,将dropout operator只应用在非递回连接(non-recurrent connections)(图2)上

图2: 多层RNN的正则化。虚线键头表示dropout所应用的connections,实线表示不使用dropout的connections

下面的等式可以更精确地描述该过程。其中D是dropout operator,它会将参数的一个随机子集设置为0:

我们的方法如下运行。dropout operator会使得units所携带的信息不纯(corrupts),强制它们更健壮地执行它们的中间计算。同时,我们不希望抹掉来自该units的所有信息。特别重要的是,该units会记住:过去多个timesteps上发生的events。图3展示了,在我们的dropout实现中,信息是如何从timestep t-2发生的event流向在timestep t+2上的预测的。我们可以看到,通过dropout operator所corrupt的信息也哈好是L+1 times,该数目与该信息所经过的timesteps数目是相互独立的。标准的dropout会扰乱(perturb)recurrent connections,这使得它对于LSTM很难学习如何来存储长期信息。通过不在recurrent connections上使用dropout的这种方式,LSTM可以受益于dropout regularization、又可以不牺牲它的记忆特质。

图3 厚线展示了在LSTM中的信息流的一个典型路径。该信息会被dropout影响L+1次,其中L是网络深度

4.实验

5.理论

可以参考:《A Theoretically Grounded Application of Dropout in Recurrent Neural Networks》

参考

Xavier Glorot在2010年的《Understanding the difficulty of training deep feedforward neural networks》提出了xavier glorot intialization,该方法在tensorflow中直接有集成。

介绍

在2006年前,深度多层神经网络不能很成功地进行训练,自那以后,许多方法被成功训练,实验结果表明层度更深的架构要比层度浅的要好。取得的所有这些实验结果,都使用了新的初始化(intialization)或训练机制。我们的目标是,更好理解为什么深度神经网络进行随机初始化(random initialzation)的标准梯度下降,效果会很差;以及更好理解最近的成功算法以及更好地帮助你设计算法。我们首先观察下非线性激活函数的影响。我们发现,logistic sigmoid激活函数对于进行随机初始化的深度网络是不合适的,因为它的均值(mean value)会特别推动top hidden layer进入饱和态(saturation)。令人吃惊的是,我们发现饱和态单元(saturated units)可以自己摆脱饱和态(即使很慢),并解释了在训练神经网络时有时会看到的停滞态(plateaus)。我们发现,一种具有更少的饱和态的新非线性函数会更有意义。最后,在训练期间,我们研究了activations和gradients会随着layers的不同而不同,并认为:当每个layer相关的jacobian的奇异值(singular values)与1相差很大时,训练可能更困难。基于该思想,我们提出了一种新的intialization scheme,它可以带来更快的收敛。

1.DNN介绍

我们的分析受在多layers、跨多个训练迭代上监控activations(观看hidden units饱和态)、gradients的实验所启发。也评估了多种activation函数、intialzation过程上的效果。

2.实验设置和数据集

代码在这部分有介绍:http://www.iro.umontreal. ca/˜lisa/twiki/bin/view.cgi/Public/ DeepGradientsAISTATS2010

2.1 Shapeset-3x2上的在线学习

最近的深度结构研究(bengio 2009)表明,非常大的训练集或在线学习上,非监督预训练上的初始化会产生大幅提升,随着训练样本数的增加,并不会有vanish。online setting也很有意思,因为它主要关注optimization issues,而非在小样本正则化的影响,因此我们决定在我们的实验中包含一个人工合成的图片数据集,并从中抽样多个样本,来测试online学习。

我们称该数据集为Shapeset-3x2 dataset,如图1所示。shapeset-3x2包含了1或2个二维物体(objects),每个都从3个shape类目(三角形、平行四边形、椭圆形)中获取,并使用随机形态参数(相对长度/角度)、缩放、旋转、翻转和灰度化进行放置。

我们注意到,识别图片中只有一个shape的很简单。因此,我们决定抽样带有两个物体(objects)的图片,限制条件是,第二个物体不能与第一个重合超过50%的区域,来避免整体隐藏掉。该任务是预计多个物体(比如:三角形+椭圆、并行四边形+并行四边形),不需要去区分foreground shape和background shape。因此我们定义了九种配置类。

该任务相当困难,因为我们需要发现在旋转、翻转、缩放、颜色、封闭体和相对位置。同时,我们需要抽取变量因子来预测哪个object shapes。

图片的size固定在32x32,以便更有效的进行深度dense网络。

2.2 有限数据集

  • MNIST digits数据集:50000训练图片、10000验证图片、10000测试图片、每个展示了一个关于10个数字的28x28灰度图片。

  • CIFAR-10: 50000训练样本、10000验证图片、10000测试图片。10个类,每个对应于图片上的一个物体:飞机、汽车、鸟、等等。

  • Small-ImageNet:

2.3 实验设置

我们使用1到5个hidden layers、每层1000个hidden units、output ayer上一个softmax logistic regression来优化前馈神经网络. cost function是负log似然,,其中(x,y)是(输入图片,目标分类)对。该网络在size=10的minibatchs上使用随机BP,例如: 的平均g,可以通过10个连续training pairs(x,y)计算,并用于更新在该方向上的参数。learning rate 是一个超参数,它可以基于验证集error来进行最优化。

我们会使用在hidden layers上的多种类型的非线性激活函数:sigmoid,tanh(x),以及softsign 。其中softsign与tanh很相似,但它的尾部是二次多项式,而非指数,比如:它的渐近线更缓慢。

作为对比,我们会为每个模型搜索最好的参数(learning rate和depth)。注意,对于shapeset-3x2, 最好的depth总是5, 而对于sigmoid,最好的深度为4.

我们会将biases初始化为0, 在每一层的weights ,有如下公共使用的启发式方法:

其中,U[-a, a]是在区间(-a,a)上的均匀分布(uniform distribution),n是前一layer的size(列数目为W)。

3.激活函数的效果、训练期间的饱和态

我们希望避免两个事情,它们可以通过激活函数的演化来揭露:激活函数的过饱和(梯度将不会很好地进行传播),过度线性单元(overly linear units;他们有时会计算一些不感兴趣的东西)。

3.1 sigmoid实验

3.2 tanh实验

3.3 softsign实验

4.研究梯度和它们的传播

4.1 cost function的效果

4.2 初始化时的梯度

4.2.1 一种新的归一化初始化理论思考

我们在每一层的inputs biases上研究了BP梯度,或者梯度的cost function。Bradley (2009)发现BP的梯度会随着output layer向input layer方法传递时会更小,在初始化之后。他研究了在每层使用线性激活函数的网络,发现BP梯度的variance会随着我们在网络上进行backwards而减小。我们也通过研究线性状态开始。

对于使用在0处有单位导数(比如:)的对称激活函数(symmetric activation function)f的一个dense的人工神经网络(artificial neural network),如果我们将layer i的activation vector写为,layer i上激活函数的参数向量(argument vector)写为,我们有:。从这些定义中我们可以获得如下:

…(2)

…(3)

方差(variances)各种对应input、output、权重进行随机初始化。考虑到这样的假设:我们在初始化时会在线性状态(linear regime),权重会独立初始化,输入特征方差相同(=Var[x])。接着,我们可以说,是layer i的size,x为input:

…(4)

…(5)

我们将在layer i’上的所有权重的共享标量方差写为。接着对于 d layers的一个网络:

…(6) …(7)

从一个前向传播的角度看,我们可以像以下方式来保持信息流:

…(8)

从一个后向传播的角色,相似的,有:

…(9)

这两个条件(conditions)转换为:

…(10)

…(11)

作为这两个限制条件间的折中,我们希望有:

…(12)

当所有layers具有相同的宽度时,需要注意:如何同时满足这两个限制(constraints)。如果我们为权重(weights)具有相同的初始化,我们可以得到以下有意思的特性:

…(13)

…(14)

我们可以看到,在权重上梯度的方便对于所有layers是相同的,但BP梯度的方差可能仍会随着更深的网络而消失(vanish)或爆炸(explode)。

我们使用等式(1)的标准初始化,它会产生如下特性的方差:

…(15)

其中,n是layer size(假设所有layers都具有相同的size)。这会造成BP梯度的方差依赖于该layer(并递减)。

当初始化深度网络时,由于通过多层的乘法效应(multiplicative effect),归一化因子(normalization factor)可能非常重要,我们建议,以下的初始化过程可以近似满足我们的目标:保持激活函数的方差(activation variances)和BP梯度方差会随着网络上下移动。我们称之为归一化初始化(normalized initialzation):

…(16)

4.2.2 梯度传播研究

为了经验上验证以上的理论思想,我们绘制了一些关于activation values、weight gradients的归一化直方图,在初始化处的BP梯度,使用两种不同的初始化方法。shapeset-3x2的实验结果如图所示(图6,7,8),其它数据集也可以获得相似的结果。

我们会监控与layer i相关的Jacobian矩阵的奇异值:

…(17)

当连续层(consecutive layers)具有相同的维度时,对应于极小量平均比例(average ratio of infinitesimal volumes)的平均奇异值从映射到,而平均激活方差的ratio也会从映射到。有了我们的归一化初始化,该ratio会在0.8周围; 而使用标准初始化,它会降到0.5.

图6

4.3 学习期间的梯度BP

在这样的网络中,学习的动态性是很复杂的,我们想开发更好的工具来分析和跟踪它。特别的,我们在我们的理论分析中不能使用简单的方差计算;因为权重值不再独立于activation values,也会违反线性假设。

正如Bradley(2009)年首次提到的,我们观察到(如图7所示),在训练的开始处,在标准初始化(等式1)后,BP梯度的方差会随着传播的下降而变更小。然而,我们发现,该趋势在学习期间逆转的非常快。使用我们的归一化初始化,我们不会看到这样的减小的BP梯度(如图7底部所示)。

令人吃惊的是,当BP gradients变得更小时,跨layers的weights gradients仍是常数,如图8所示。然而,这可以通过我们上述的理论分析(等式14)进行解释。如图9所示,令人感兴趣的是,关于标准初始化和归一化初始化的权重梯度上的这些观察会在训练期间变化(这里是一个tanh网络)。实际上,梯度初始时粗略具有相同的幅度,随着训练的进度会各自不同(越低层具有更大的梯度),特别是当使用标准初始化时。注意,这可能是归一化初始化的一个优点,因为它在不同的layers上具有非常不同幅值的梯度,可以产生病态性(ill-conditioning),以及更慢的训练。

最终,我们观察到,使用归一化初始化的softsign网络与tanh网络共享相似,我们可以对比两者的activations的演进看到(图3底部和图10)。

5.error曲线和结论

我们关心的最终考虑点是,使用不同策略的训练的成功,这可以使用error curves来展示,它可以展示test error随着训练的过程和渐近而演进。图11展示了在shapeset-3x2上在线学习训练的曲线,其中表1给出了对所有数据集的最终的test error。作为baseline,我们在10w个shapeset样本上使用优化的RBF SVM模型,并获得了59.47%的test error,而在相同的集合上,使用一个深度为5的tanh网络、并使用归一化初始化可以获得50.47%的test error。

结果表明,activation和intialization的选择的效果。作为参考,我们在图11中。

参考

Faster R-CNN由Ross Girshick等人提出。

总览

在目标检测领域的最新进展来源于候选区域法(region proposal methods)基于区域的卷积神经网络(region-based convolutional neural networks)的成功。尽管region-based CNN开销很大,但如果通过跨候选块(proposals)共享卷积,可以极大地减小开销。当忽略掉在候选区域(region proposals)上花费的时间时,Fast R-CNN通过使用极深网络已经达到了接近实时的准确率。现在,在主流的检测系统中,在测试时间上都存在着proposals的计算瓶劲。

候选区域法(Region proposal methods)通常依赖于开销低的特征以及比较经济的inference模式(schemes)。选择性搜索法(Selective Search)是其中一种最流行的方法之一,它会基于已经开发的底层特征(low-level features),对超像素 (superpixels)进行贪婪式合并。当与其它有效的检测网络[paper 2]进行对比时,Selective Search方法会更慢些,在CPU的实现上每张图片需要2秒耗时。EdgeBoxes[6]方法提供了在proposal上的质量和速率上的最佳权衡,每张图片0.2秒。尽管如此,候选区域(region proposal)阶段步骤仍然会像该检测网络一样消耗相当多的运行时(running time)。

有人注意到,fast RCNN(fast region-based CNN)可以利用GPU,而在研究中使用的候选区域法(region proposal methods)则通常在CPU上实现,使得这样的运行时比较变得不公平。很明显,一种用于加速proposal计算的方法就是:在GPU上重新实现。这是一个有效的工程解决方案,但重新实现会忽略下游的检测网络(down-stream detection network),从而失去共享计算的机会。

本paper中展示了一种新方法:使用DNN来计算候选(proposals),来产生一个优雅并有效的解决方案,在给定检测网络的计算下,其中proposal计算的几乎没有开销。我们引入了新的Region Proposal Networks(RPNs)来在最新的目标检测网络[1][2]中共享卷积层。通过在测试时(test-time)共享卷积,计算proposals的边缘开销很小(例如:每张图片10ms)。

我们观察到,由region-based dectectors(例如:Fast R-CNN)所使用的卷积特征图,也可以被用于生成候选区域(region proposals)。在这些卷积特征(convolutional features)之上,我们通过添加一些额外的卷积层(conv layers)构建了一个RPN,这些layers可以对一个常规网格(regular grid)上的每个位置,同时对区域边界(region bounds)进行回归(regression)、以及生成目标得分(objectness scores)。RPN是这样一种完全卷积网络(FCN: fully convolutional network)[7],它可以以end-to-end方式训练,特别适用于生成检测候选(detection proposals)。

图1: 多种scales和sizes下的不同模式(schemes)。(a) 构建图片和feature maps的金字塔,在所有scales上运行分类器 (b) 使用多个scales/sizes的filters,在feature map上运行 (c) 使用在回归函数中参照框(reference box)金字塔

RPN被设计成使用一个较广范围的比例(scales)和高宽比(aspect ratios)来高效地预测region proposals。对比于上面使用图片金字塔(图1,a)的方法或者过滤器金字塔(图1,b),我们引入了新的锚点边框“anchor” boxes,在多个不同尺度和高宽比的情况下充当参照(references)。我们的scheme可以被看成是一个对参照(references)进行回归的金字塔(图1,c),它可以避免枚举多个不同尺度和高宽比的图片或filters。当使用单尺度图片进行训练和测试时,该模型执行很好,并且能提升运行速度。

为了将RPN和Fast R-CNN目标检测网络进行统一,我们提出了一个training scheme,它可以轮流为region proposal任务和目标检测任务进行fine-tuning,并保持proposals固定。该scheme可以快速收敛,并生成一个使用卷积特征(可在任务间共享)的统一网络。

我们在PASCAL VOC benchmarks上进行综合评估,其中使用Fast R-CNN的RPNs准确率比使用Fast R-CNN的Selective Search(baseline)要好。同时,我们的方法没有Selective Search在测试时的计算开销——可以在10ms内有效运行proposals。使用昂贵的极深网络,我们的检测方法在GPU上仍然有5fps(包含所有steps)的帧率,这是一个在速率和准确率上实际可行的目标检测系统。我们也在MS COCO数据集上做了测试,并研究了在PASCAL VOC数据集上使用COCO数据进行提升。代码在:matlab codepython code

该paper的预览版在此前有发布。在此之后,RPN和Faster R-CNN的框架已经被其它方法实现并实现,比如:3D目标检测[13], part-based detection[14], instance segmentation[15],image captioning[16]。我们的快速有效目标检测系统已经在比如Pinterests等商业系统中使用。

在ILSVRC和COCO 2015比赛中,Faster R-CNN和RPN是在ImageNet detection, ImageNet localization, COCO detection, and COCO segmentation等众多领域第1名方法的基础。RPNs可以从数据中学到propose regions,这可以从更深和更昂贵特征中受益(比如101-layer residual nets)。Faster R-CNN和RPN也可以被许多其它参赛者使用。这些结果表明我们的方法不仅是一个有效的解决方案,也是一种有效方法来提升目标检索的准确率。

2.相关工作

候选目标(Object Proposals)法。在object proposal methods中有大量文献。可以在[19],[20],[21]中找到。广泛被使用的object proposal methods中包含了以下方法:

  • 基于grouping super-pixels的方法(Selective Search, CPMC, MCG)
  • 基于滑动窗口的方法(objectness in windows[24], EdgeBoxes [6])。

Object proposal methods被看成是dectectors之外独立的一个模块。

深度网络法:R-CNN法可以训练一个CNN的end-to-end网络来将proposal regions分类成目标类别(object categories)或是背景(background)。R-CNN主要扮演分类器的角色,它不会预测对象的边界(除了通过bounding box regression进行重定义)。它的准确率依赖于region proposal模块的性能。许多papers[25],[9],[26],[27]提出了使用深度网络来预测目标的bounding boxes。在OverFeat方法中[9],会训练一个FC layer来为单个目标的定位任务预测box的坐标。FC-layer接着会转化成一个conv-layer来检测多个特定类别的目标。MultiBox方法[26],[27]会从一个最后一层为FC layer(可以同时预测多个未知类的boxes)的网络中生成region proposals,生成OverFeat方式下的单个box。这些未知类别的boxes可以被用于R-CNN的proposals。对比于我们的fully conv scheme,MultiBox proposal网络可以被用于单个图片的裁减或多个大图片的裁减。

。。。

3.Faster R-CNN

我们的目标检测系统,称为Faster R-CNN,由两个模块组成。第一个模块是深度完全卷积网络,它用于生成候选区域;第二个模块是Fast R-CNN检测器,它会使用这些候选区域。整个系统是一个统一的网络,使用了最近神经网络中的流行术语:attention机制,RPN模块会告诉Fast R-CNN模块去看哪里。在3.1节中,我们介绍了该网络的设计和属性。在3.2节中,我们开发算法来训练两个模块,并共享特征。

3.1 RPN

一个RPN会将一张图片(任意size)作为输入,输出一个矩形候选目标集合,每一个都有一个目标得分(objetness score)。我们使用一个完全卷积网络(fully conv network)将该过程建模,会在该部分描述。由于我们的最终目标是使用一个Fast R-CNN网络来共享计算,我们假设两个网络共享一个公共的卷积层(conv layers)集合。在我们的实验中,我们研究了ZF model[5]:它有5个共享的conv layers;以及VGG16 [3] :它有13个共享的conv layers。

为了生成候选区域(region proposals),我们在由最后一个共享conv layer所输出的conv feature map上滑动一个小网络。该小网络会将一个在input conv feature map上的n x n的空间窗口作为输入。每个滑动窗口被映射到一个更低维的feature(ZF:256-d, VGG: 512-d)上。该feature会被fed进两个相邻的FC-Layer上——一个box-regression layer(reg),另一个是box-classification layer (cls)。在本paper中,我们使用n=3, 注意在输入图片上的有效接受域(effective receptive field)非常大(ZF: 171 pixels, VGG: 228 pixels)。该mini-network如图3(左)所示。注意,由于mini-network以滑动窗口的方式操作,FC-Layers会跨所有空间位置被共享。该结果很自然地使用一个n x n的conv layer进行实现,接着两个同级的1x1 conv layers(reg和cls)

3.1.1 Anchors

在每个滑动窗口位置上,我们同时预测多个候选区域(region proposals),其中每个位置的最大可能候选数量被表示成k。因而reg layer具有4k的输出,它可以编码k个boxes的坐标;cls layer输出2k个得分,它用来估计每个proposal是object还是非object的概率。k个候选(proposals)被相对参数化到k个参考框(reference boxes),我们称之为锚点(anchors)。一个anchor位于当前的滑动窗口的中心,与一个scale和aspect ratio(图3, 左)相关联。缺省的,我们使用3个scales和3个aspect ratios,在每个滑动位置上产生k=9个anchors。对于一个size=W x H(通常~2400)卷积特征图(conv feature map),总共就会有WHk个anchors。

平移不变的Anchors

我们的方法的一个重要属性是:平移不变性(translation invariant), 对于该anchors、以及用于计算相对于该anchors的proposals的该functions都适用。如果在一个图片中移动一个object,该proposal也会平移,相同的函数应能预测在该位置的proposal。这种平移不变特征由方法5所保证。作为比较,MultiBox方法[27]使用k-means来生成800个anchors,它并没有平移不变性。因而,MultiBox不会保证:如果一个object发生平移仍会生成相同的proposal。

平移不变性也会减小模型的size。MultiBox具有一个(4+1) x 800维的FC output layer,其中我们的方法具有一个(4+2) x 9维的conv output layer,anchors数为k=9个。结果是,我们的output layer具有个参数(VGG-16: ),比MultiBox的output layer的参数()要少两阶。如果考虑上特征投影层(feature projection layers),我们的proposal layers仍比MultiBox的参数少一阶。我们希望我们的方法在小数据集上(比如:PASCAL VOC)更不容易overfit。

图3:

Multi-Scal anchors as Regression References

关于anchors的设计,提供了一种新的scheme来发表多个scales(以及aspect ratios)。如图1所示,具有两个流行的方法来进行multi-scale预测。第一种方法基于image/feature 金字塔,比如:DPM和基于CNN的方法。这些图片以多种scales进行resize,在每个scale上计算feature maps(HOG或deep conv features)(如图1(a)所示)。该方法通常很有用,但耗时严重。第二种方法是在feature maps上使用多个scales(或aspect ratios)的滑动窗口。例如,在DPM中,不同aspect ratios的模型使用不同的filter sizes(比如:5x7和7x5)进行单独训练。如果该方法用于解决multi scales,它可以被认为是一个“过滤器金字塔(pyramid of filters)”(如图1(b)所示)。第二种方法通常与第一种方法联合被采纳。

作为比较,我们的基于anchor的方法构建了一个关于anchors的金字塔,它效率更高。我们的方法会进行分类和回归bounding boxes,使用multi scales和aspect ratios的anchor boxes。它只取决于单一尺度的图片和feature maps,以及使用单一size的filters(在feature map上滑动窗口)。我们通过实验展示了该scheme用于解决multiple scales和sizes的效果(表8)。

由于该multi-scale设计基于anchors,我们可以简单地使用在单一尺度的图片上计算得到的conv features,这也可以由Fast R-CNN detector来完成。multi-scale anchors的设计是共享特征的核心关键(无需额外开销来解决scales问题)。

3.1.2 Loss函数

为了训练RPN,我们为每个anchor分配一个二元分类label(是object、不是object)。我们分配一个正向label给两种类型的anchors:

  • (i) 具有与一个ground truth box的IoU(Intersection-over-Union)重合率最高的anchor/anchors
  • (ii) 具有一个与任意ground-truth box的IoU重合度高于0.7的anchor

注意,单个ground-truth box可以分配一个正向label给多个anchors。通常第二个条件足够决定正样本;但我们仍采用了第一个条件,原因是有些罕见的case在第二个条件下会找不到正样本。

假如它的相对所有ground-truth boxes的IoU ratio低于0.3, 我们分配一个负向label给一个非正anchor. 即非正,也非负的anchors对训练目标贡献不大。

有了上述定义,我们根据在Fast R-CNN中的多任务loss来最小化目标函数。一张图片的loss function如下所示:

…(1)

这里,

  • i表示在mini-batch中的一个anchor的索引
  • 表示anchor i是object的预测概率。
  • 如果该anchor为正,ground-truth label 是1;否则为0.
  • 是一个向量,表示要预测的bounding box的4个参数化坐标
  • 是与一个正锚点(positive anchor)相关的ground-truth box。
  • 是分类loss,它是关于两个类别的log loss。
  • 是回归loss,其中R是robust loss function(L1平滑)。
  • 意味着regression loss当为正锚点时()激活,否则禁止(

两个项(term)通过被归一化,通过一个参数进行加权。在我们当前实现中(释出的代码),等式(1)中的cls项通过mini-batch size进行归一化(例如:),reg项通过anchor位置的数目进行归一化(例如:)。缺省的,我们设置,接着cls和reg两项会被加权。通过实验我们发现,结果对于的值在一个宽范围内是敏感的(见表9)。我们也注意到,归一化(normalization)不是必需的,可以简化。

表9

对于bounding box回归,我们采用了以下的4坐标的参数化:

…(2)

其中,x, y, w和h表示box的中心坐标、宽、高。变量x, ,以及分别是预测box,anchor box,ground-truth box(y,w,h也类似)。这可以被认为是从一个anchor box到一个接近的ground-truth box的bounding-box regression。

然而,我们的方法与之前的基于RoI(Region of Interest)的方法不同,通过一种不同的方式达成bounding-box regression。bounding-box regression在由特定size的RoI上的features来执行,该regression weights被所有region sizes共享。在我们的公式中,用于回归的该features在feature maps上的空间size上(3x3)相同。为了应付不同的size,会学到k个bounding-box regressors集合。每个regressor负责一个scale和一个aspect ratio,k个regressors不会共享权重。由于anchors的这种设计,仍然能预测不同size的boxes,即使features是一个固定的size/scale。

3.1.3 训练RPNs

RPN可以通过BP和SGD以end-to-end的方式进行训练。我们根据”以图片为中心(image-centric)”的抽样策略来训练网络。从单个图片中提取的每个mini-batch,包含了许多正负样本锚点。它可以为所有anchors的loss functions进行优化,但会偏向主导地位的负样本。作为替代,我们在一个图片上随机抽取256个锚点,来计算一个mini-batch的loss函数,其中抽样到的正负锚点的比例为1:1。如果在一个图片中正样本数少于128个,我们将将该mini-batch以负样本进行补齐。

我们通过从一个零均值、标准差为0.01的高斯分布中抽取权重,来随机初始化所有new layers。所有其它layers(比如:共享的conv layers)通过ImageNet分类得到的预训练模型进行初始化。接着调整ZF net的所有layers,conv3_1以及来保存内存。我们在PASCAL VOC数据集上,对于mini-batches=60k使用使用learning rate=0.001,对于mini-batch=20k使用learning rate=0.0001. 我们使用一个momentum=0.9, weight decay=0.0005, 代码用Caffe实现。

3.2 为RPN和Rast R-CNN共享特征

我们已经描述了如何去训练一个网络来进行region proposal的生成,无需考虑基于region的目标检测CNN会使用这些proposals。对于检测网络,我们采用Fast R-CNN。接着,我们描述的算法会学到一个统一的网络,它由RPN和Fast R-CNN组成,它们会共享conv layers(如图2)。

图2

如果RPN和Fast R-CNN独立训练,会以不同的方式修改它们的conv layers。因此需要开发一个技术来允许在两个网络间共享conv layers,而非学习两个独立的网络。我们讨论了三种方式来训练特征共享的网络:

  • (i) 交替训练(Alternating training)。在这种方案中,我们首先训练RPN,接着使用这些proposals来训练Fast R-CNN。 该网络会通过Fast R-CNN进行调参,接着被用于初始化RPN,然后反复迭代该过程。这种方案被用于该paper中的所有实验。
  • (ii) 近似联合训练(Approximate joint training)。在这种方案中,RPN和Fast R-CNN网络在训练期间被合并到一个网络中,如图2所示。在每个SGD迭代过程中,forward pass会生成region proposals(当训练一个Fast R-CNN detector时,他们被看成是固定的、预计算好的proposals)。backward propagation会和往常一样进行,其中对于共享的layers来说,来自RPN loss的Fast R-CNN loss的后向传播信号是组合在一起的。该方案很容易实现。但该方案会忽略到关于proposal boxes坐标的导数(derivative w.r.t. the proposal boxes’ coordinates), 也就是网络响应,因而是近似的。在我们的实验中,我们期望发现该求解会产生闭式结果,并减少大约25-50%的训练时间(对比alternating training)。该求解在python代码中包含。
  • (iii) 非近似联合训练(Non-approximate joint training)。根据上述讨论,由RPN预测的bounding boxes也是输入函数。在Fast R-CNN中的RoI pooling layer会接受conv features,以及预测的bounding boxes作为输入,因而一个理论合理的BP解也与box坐标的梯度有关。这些梯度在上面的approximate joint training会被忽略。在非近似方法中,我们需要一个RoI pooling layer,它是box坐标的微分。这是一个非平凡问题,解可以通过一个”RoI warping” layer给出[15]。(超出本paper讨论范围)

4-step Alternating Training

在该paper中,采用了一个实用的4-step training算法来通过alternating优化来学习共享特征。在第一个step中,会如3.1.3节描述来训练RPN。该网络使用一个ImageNet-pre-trained模型来初始化,为region proposal任务来进行end-to-end的fine-tuning。在第二个step中,我们训练了一个独立的Fast R-CNN dectection网络,它会使用由第一步的RPN生成的proposals。该检测网络也使用ImageNet-pre-trained模型初始化。在此时,这两个网络不共享conv layers。在第三个step中,我们使用detector网络来初始化RPN training,但我们会固定共享的conv layers的能数,只对对于RPN唯一的layers进行fine-tune。最后,保持共享的conv layer固定,对Fast R-CNN的唯一layers进行fine-tune。这样,两个网络会共享conv layers,并形成一个统一网络。相类似的alternating training会运行很多次迭代,直到观察到不再有提升。

3.3 实现细节

我们在单一scale的图片上,训练和测试两个region proposal以及目标检测网络。我们re-scale这些图片,以至它们更短的边: s=600 pixels。Multi-scale特征抽取(使用一个图片金字塔image pyramid)可以提升accuracy,但不会有好的speed-accuracy的平衡。在re-scale的图片上,对于ZF和VGG nets来说,在最后一层conv layer上的总stride为16 pixels,在一个典型的PASCAL image上在resizing(~500x375)之前接近10 pixels。尽管这样大的stride会提供好的结果,但accuracy会使用一个更小的stride进行进一步提升。

对于anchors,我们使用3个scales,box areas分别为:个pixels,3个aspect ratios分别为:1:1, 1:2, 2:1. 对于一个特定数据集,这些超参数并不是精心选择的,我们提供了消融实验。我们的解不需要一个图片金字塔或是过滤器金字塔来预测多个scales的regions,节约运行时间。图3(右)展示了在一个关于scales和sapect ratios范围内我们方法的能力。表1展示了对于每个anchor使用ZF net学到的平均proposal size。我们注意到,我们的算法允许预测比底层的receptive field更大。这样的预测是不可能的——如果一个object只有中间部分可见,仍能infer出一个object的其它部分。

该anchor boxes会交叉图片的边界,需要小心处理。在训练期间,我们忽略了所有交叉边界anchors(cross-boundary anchors),因而他们不会对loss有贡献。对于一个典型的1000x600的图片,共有20000 (~60x40x9)个anchors。由于忽略的cross-boundary anchors的存在,训练期每个图片有大约6000个anchors。如果boundary-crossing outliers在训练期被忽略,他们会引入大的、难的来纠正在目标函数中错误项,训练不会收敛。在测试期,我们仍应用完全卷积的RPN到整个图片上。这也会生成cross-boundary的proposal boxes,我们会将image boundary进行裁减。

表2

一些RPN proposals高度相互重叠。为了减小冗余,我们在proposal regions上基于它们的cls分值采用了NMS(non-maxinum suppression)。我们为NMS将IoU阀值固定为0.7,可以为每张图片留下2000个proposal regions。NMS不会对最终的检测accuracy有害,实际上会减小proposals的数目。在NMS后,我们使用top-N排序后的proposal regions进行detection。然后,我们使用2000个RPN proposals训练Fast R-CNN,但在测试时评估不同数目的proposals。

4.实验

4.1 PASCAL VOC

在PASCAL VOC 2007 detection benchmark上进行评估。该数据集包含了5k个trainval images,以及5k个test images,object类别超过20个。我们也提供了PASCAL VOC 2012 benchmark。对于ImageNet pre-trained network,我们使用ZF net的”fast”版本:它具有5个conv layers以及3个FC layers,以及公开的VGG-16 model:它具有13个conv layers以及3个FC layers。我们使用mAP( mean Average Precision)进行评估detection,因为实际的目标验测的metric(而非关注目标的proposal proxy metrics)。

表2展示了使用不同region proposal methords的训练和测试结果。对于Selective Search(SS)[4]方法,我们通过”fast”模式生成了大约2000个proposals。对于EdgeBoxes(EB)[6]方法,我们通过缺省的EB setting将IoU设置为0.7来生成proposals。在Fast R-CNN框架下,SS的mAP具有58.7%,而EB的mAP具有58.6%。RPN和Fast R-CNN达到的完整结果为,mAP具有59.9%,仅使用300个proposals。使用RPN会比SS或EB生成一个更快的检测系统,因为共享卷积计算;更少的proposals也会减小region-wise FC layers的开销(表5)。

RPN上的Ablation实验。为了研究RPN作为proposal method的行为,我们做了一些ablation研究。首先,我们展示了在RPN和Fast R-CNN检测网络间共享卷积层(conv layers)的效果。为了达到这个,我们在第二个step后停止训练过程。使用独立的网络将结果减小到58.7%(RPN+ZF,unshared, 表2)。我们观察到这是因为在第三个step中,当detector-tuned features被用于fine-tune该RPN时,proposal质量会被提升。

接着,我们放开RPN对Fast R-CNN训练的影响。出于该目的,我们训练了一个Fast R-CNN模型,使用2000个SS proposals和ZF net。我们固定该detector,通过更改在测试时的proposal regions,来评估该detection的mAP。在这些ablation实验中,RPN不会与detector共享features。

在测试时,将SS替换成300 RPN proposals会产生mAP=56.8%。在mAP中的该loss是由于在training/testing proposals间的不一致性造成的。该结果会当成baseline。

评测

略,详见paper。

参考

Amazon在hogwild、hogbatch之后,提出了《BlazingText: Scaling and Accelerating Word2Vec using Multiple GPUs 》,利用多GPU来加速word2vec的训练。

介绍

Word2vec是流行的算法。原始google c实现、以及facebook fastText可以利用多核cpu架构来并行化。还有一少部分实现方式则利用GPU并行化,但会牺牲accuracy和可扩展性。本paper提出了BlazingText,一个使用CUDA高度优化的word2vec实现,可以利用多GPU进行训练。BlazingText可以在8GPU上达到43M words/sec的训练速度,达到了8线程CPU实现的9倍,并且对embeddings的质量影响很小。

word2vec的最优化通过SGD完成,它会进行迭代式求解;在每一个step,会选取一个词对(pair of words):一个输入词和一个目标词,它们来自于window或一个随机负样本。接着根据选中的两个词来计算目标函数的梯度,然后基于该梯度值更新两个词的词表示(word representations)。该算法接着使用不同的word pair来处理下一次迭代。

SGD的一个主要问题是,它的顺序性;这是因为它在这一轮迭代的更新、与下一轮迭代的计算之间存在着依赖关系(他们可能遇到相同的词表示),每一轮迭代必须潜在等待前一轮迭代的更新完成。这不允许我们使用硬件并行资源。

然而,为了解决上述问题,word2vec使用Hogwild,它使用不同线程来并行处理不同的word pairs,并忽略任何在模型更新阶段中发生的冲突。理论上,对比起顺序运行,这会让算法的收敛率下降。然而,对于跨多线程更新不可能会是相同的词的这种情况,Hogwild方法已经得到验证能运行良好;对于大词汇表size,冲突相对较少发生,收敛通常不受影响。

Hogwild方法在多核架构上的成功,使得该算法利用GPU成为可能,GPU比CPU提供更强的并行化。在该paper中,我们提出了一种有效的并行化技术来使用GPU加速word2vec。

在深度学习框架中使用GPU加速,对于加速word2vec来说并不是好选择[6]。这些框架通常更适合于“深度网络(deep networks)”,它们的计算量主要由像卷积(conv)以及大矩阵乘法(large matrix multiplications)等重型操作主宰。而word2vec则是一个相对浅层的网络(shallow network),每一个training step包含了一个embedding lookup、梯度计算(gradient computation)、以及最终为word pair进行权重更新(weight updates)。梯度计算和更新涉及很小的点乘操作,使用cuDNN[7]或cuBLAS[8]并不能受益。

深度学习框架的限制导致我们探索CUDA C++ API。我们从头设计了训练算法,以便最优利用CUDA多线程能力,并且防止对GPU并行化的过度利用,从而不伤害输出的accuracy。

最终,我们开发了BlazingText,它处理文本语料的速率能达到数百万 words/sec,我们演示了使用多GPU来执行数据并行训练的可能性。我们对比了开源的工具与BlazingText之间的benchmark。

2.word2vec模型

word2vec有两种不同的模型架构:Contextual Bag-Of-Words (CBOW)以及Skip-Gram with Negative Sampling (SGNS) 。CBOW的目标函数是由给定上下文去预测一个词,而Skipgram则给定一个词去预测它的上下文。实际上,Skipgram会给出更好的效果,我们会在下面描述它。

给定一个大型训练语料,它由一个words序列组成。skipgram模型的目标是最大化log似然:

其中,T是词汇表size,上下文是围绕的词的集合。给定所观察到的一个上下文词的概率可以使用上述的词向量进行参数化。假设我们给定一个得分函数s,它将(word, context)的pairs映射到得分。定义一个上下文词的概率的一个可能的选择是:

然而,这样的模型不适合我们的case中,因为它意味着,给定一个词,我们只能预测一个上下文词

预测上下文词(context words)的问题可以通过构建独立的二分类任务集合来替代。接着,该目标是独立地预测上下文词是否出现。对于在位置t处的词,我们会考虑所有的上下文词作为正例,并从字典中随机抽样负样本。对于一个选中的上下文位置c,使用binary logistic loss,我们可以获取以下的negative log-likelihood:

其中是从词汇表中抽取的负样本的一个集合。通过表示logistic loss function l:,我们可以重写目标函数:

对于在词和它的一个上下文词之间的scoring function s的一个天然参数化方案是,使用词向量(word vectors)。假设在词汇表中的每个词w,定义两个向量。这两个向量有时被称为是输入向量(input vector)和输出向量(output vector)。特别的,我们的向量分别对应于词。接着,score可以使用在该词与上下文向量间的点乘(dot product)来表示:

3.相关工作

一些已经存在的word2vec系统被限制在只能在单机CPU上运行,而一些使用多核cpu多节点来加速word2vec的方式则进行分布式数据并行训练。这些方法包含了Spark MLLib和Deeplearning4j。这些系统在每轮iteration后依赖reduce操作在所有executors间同步模型。将所有的word vectors跨节点广播(broadcast)的这种方式限制了可扩展性,因为通常网络带宽只比CPU内存要低一阶。另外,模型的accuracy会大幅下降,因为使用了更多节点来增加吞吐。

Intel的工作[11]展示了通过基于minibatching和shared negative samples的scheme可在多CPU节点上进行极强地扩展。该方法将level-1 BLAS操作转换成level-3 BLAS矩阵乘法操作,从而有效地利用现代架构的向量乘法/加法指令(vectorized multiply-add instructions)。然而,该方法仍不能利用GPUs,而且他们的实现只能在Intel BDW和KNL处理器上扩展良好,而这些处理器比GPU要昂贵,不会被主流的云服务平台所提供。借鉴他们提出的思想,我们可以通过一个minibatch共享negative samples,并使用高度优化的cuBLAS level-3矩阵乘法核(matrix multiplication kernels),但由于要进行乘法操作的矩阵size很小,CUDA核启动(kernel-launches)的开销会剧烈降低性能和可扩展性。

其它一些工作[12,13]已经利用像tensorflow, keras, theano等深度学习库,但展示出的性能要比fasttext的CPU实现要慢。由于word2vec的一轮迭代计算并不非常密集,需要使用一个很大的batch size来完全利用GPU。然而,对训练数据进行mini-batching会急剧降低收敛率,而如果batch size=1, 训练又会非常慢。

4. 使用CUDA进行GPU并行化

由于GPU架构比CPU cores提供了更强的(多好多阶)并行机制,word2vec看起来能很好地使用GPU进行加速,算法本身展示了可以通过异步SGD(asynchronous SGD)或Hogwild进行很好的并行化。然而,如果使用更多的并行化,不同线程之间在读取和更新词向量时可能会发生冲突,从而对accuracy产生大幅下降。因而,必须仔细考虑,如何在并行化级别上和同步机制间做好权衡。

深度学习框架没有像CUDA C++ API那样,提供在GPU的可扩展性与并行化之间的细粒度控制。有必要对算法设计进行大幅重构,从而允许最大化并行吞吐,而强制同步会阻止accuracy的降低。我们控制了以下两种方法来基于CUDA实现。

4.1 每个词一个线程块(one thread block per word)

原始的word2vec实现按顺序处理一个句子,例如:对于中心词,它会考虑围绕中心词作为目标词的window size(ws)中的所有词,这意味着在所有的词向量,会在一个step中获得更新。相似的在下一step中,对于中心词,在范围内的所有向量都将被更新。这意味着,当处理一个句子时,一个词向量可以被修改2ws+1次,理想的,每个连续的step都应使用被前一step修改更新后的向量(updated vectors)。

从头设计一个CUDA程序需要我们对网格结构(grid)和线程块(thread blocks)做总体规划。在相同线程块中的线程可以相互进行同步,但如果属于不同线程块的线程不能相互通信,使得线程块相互独立。在该方法中,我们选择为每个词分配一个线程块,在一个块内的线程数可以是乘以32, 相当有效。随着在一个块内的线程数与向量维度(通常100)越来越接近,每个线程会映射到一个向量维度上,并做element-wise乘法操作。这种单独的乘法接着使用一个reduce kernel来计算任意2个给定向量间的点乘来进行有效求和。我们探索了一些并行reduction技术,最终使用采用一个高度优化过的completely unrolled reduce kernel。该算法设计采用并行机制能达到峰值,因为每个词会通过一个线程块进行独立处理,在线程块中的线程只有当执行reduce操作时会进行同步(synchronize)。然而,该方法会有一个主要缺点,它能极大地破坏embeddings的质量。不同的线程块可以独立的修改词向量,没有同步机制,它对于accuracy是有害的,因为随着窗口沿着句子进行滑动,每个向量可以更新2w+1次。这会产生大量线程覆盖写(overwrites)和非最新读取(stale reads)。

4.2 每个句子一个线程块

在之前章节讨论过,没有任何同步机制的词向量更新,可以充分利用CUDA并行机制,但是会由于竞争条件(race conditions),会降低embeddings的accurary。随着窗口沿着句子滑动,当处理后一个词时,应使用前面已经更新(updated)的词向量。因而,为了解决顺序依赖(sequential dependency),与前面的方法类似,该方法会将每个句子映射到一个CUDA线程块上,它会将该向量的每一维映射到一个线程上。因此,不同线程块相互并行处理句子,而在一个句子中,线程块会根据词进行循环来顺序更新向量。该方法仍会导致一些竞争条件(race conditions),但由于不同句子通常不会有许多词相同,它实际上不会造成收敛问题。

由于文本语料对于驻在GPU内存中来说可能很大,数据从磁盘到GPU中会流式化(streamed),并且许多句子会进行batch化,以分摊数据在CPU和GPU间传输的开销。为了评估accuracy和throughput间进行平衡,线程块、或者句子被并行处理的最优化数目,通过经验选择。并发处理越多勉励子,会增加throughput,但会产生accuracy的降低,因为不同线程块更新相同的词向量的机率会增加。

一些其它的最优化(optimizations),可以使该方法更有效。如果kernel的执行时间比数据传输时间要少,那么GPU会空闲等待下一batch的句子。为了避免这种情况,我们尝试通过使用多CPU线程和CUDA streams,将数据传输和在GPU上进行kernel execution的过程进行重叠(overlap),它允许数据传输到GPU时仍在忙着运行kernels,这样GPU时间不会空闲。我们使用多CPU线程来从磁盘读取数据,并准备下一batch的句子,它可以使用多个CUDA streams来并发传输数据给GPU。

我们将在第5节描述上述方法的实验。

4.3 在多GPU上的分布式训练

在多GPU分布式系统上扩展BlazingText是很关键的,因为在单GPU上训练一些工业界特别大的数据集时(数T),它仍可能花费数天时间。为了扩展BlazingText,我们探索了不同的分布式训练范式——模型并行化(model parallelism) 和 数据并行化(data parallelism)。由于向量维度通常很小,点乘的规模也不会很大,因而将向量的不同维量进行分布式,不会带来很多的性能增益。因而,我们使用数据并行化,当使用N个GPU时,我们将数据集等分为N份相等的shards。对于词汇表中的所有词,输入向量和输出向量的模型参数,会被复制到每个GPU上;每个设备接着独立处理它所拥有的数据分区,并更新它的局部模型(local model),然后与其它N-1个GPU周期性同步局部模型(local model)。

数据并行化要解决的主要问题是,如何在GPU间有效进行模型同步。它可以使用NVIDIA的NCCL库[15]来有效解决,该库提供了AllReduce方法,它可以基于GPU网络拓朴以一种最优的方法,来处理在GPU间的peer-to-peer数据传输。如果GPU没有通过相同的PCIe swith或者相同的IOH chip进行连接,那么数据会通过host CPU进行传输。由于模型参数的size可能是数百MB,同步机制可能开销很大,因而决定合理的同步间隔十分重要。频繁的同步将产生更好的收敛,但会减慢训练,反之亦然。出于简洁性,我们选择在每轮迭代后进行同步,并在后续会继续探索更有效的同步机制。

5.实验

我们使用上述提到的方法,为单GPU和多GPU系统进行最优化BlazingText。在本节中,我们会展示throughput(单位:百万 words/sec)和所学到的embeddings的accuracy(在标准word similarity和word analogy test上)。我们会对BlazingText和FastText CPU(没有subword embeddings的版本)实现进行benchmark。

硬件:所有的实验都在AWS p2.8xlarge GPU实例上运行,它具有8个NVIDIA K80 GPU卡,以及Intel Xeon CPU E5-2684 v4@2.3GHz 16核(32线程)。

软件:BlazingText使用C++编写,使用CUDA compiler:NVCC v8.0编译。

训练语料:我们使用两个不同语料进行训练:(1) 来自Wikipedia的包含1700w个词的Text8数据集[16],(2) 一个十亿词的benchmark dataset[17]。

测试集:学到的embedding会在word similarity和word analogy任务上进行评估。对于word similarity,我们使用WS-353[18],它是最流行的测试数据集。它包含了人工审核过的相似word pairs。词表示的评估通过根据cosine相似度对这些pairs进行排序,并使用Spearman’s rank相关系数进行评估。我们使用google analogy dataset来进行word analogy评估。

超参数:对于所有的实验,我们展示了使用CBOW和Skipgram算法(negative sampling)和FastText的缺省参数设置(dim=100,window size=5, sampling threold=1e-4, inital learning rate=0.05)。我们为Text8数据集使用20个epochs,One Billion Words Benchmark则使用10个epochs。

5.1 Throughput

图1

图1和图2展示了BlazingText on GPU和FastText on CPU的throughput以百万 words/sec测量。分别跨多GPU和多CPU运行,分别跑SKipgram和CBOW。当扩展到多GPU时,我们的实现达到了接近线性的加速。使用8个GPU,Skipgram可以达到1.32 亿 words/sec,而CBOW可以达到4.25 亿 words/sec,它比32线程的FastText要快3倍。如表1所示,跨多GPU扩展在accuracy上影响很小,因为我们的实现可以有效利用多GPU架构。随着在throughput和accuracy间进行平衡,我们进一步通过降低同步频率来增加throughput,只要accuracy的下降是可接受的。

图2

5.2 Accuracy

表1

我们评估了从fasttext实现以及我们的实现(随GPU数目不同)中训练得到的该模型,并在表1中展示了他们在word similarity和word analogy任务上的预测效果。为了确保我们的实现可以很好泛化,我们会使用2个不同的语料来训练模型——text8和1B words benchmark。

由于GPU并行化,为了消除随机性,我们运行每个实验多次(n=10),并展示了平均结果。如表1所示,BlazingText展示了在多GPU上的效果与FastText CPU上的效果相近。当使用4GPU时,性能几乎相同,在一些情况下比CPU版本要好。如你所料,预测的效果会随着使用更多GPU而减少,但在可接受范围内。对于相似度评估,使用8 GPUs会达到2%更差的accurary,但会比32 CPU线程超过3倍加速。

对于analogy评估,在多GPU和CPU上的不同更显著。在我们的实验中,我们主要关注可扩展性,因而当扩展到更多GPU时,我们不会增加同步频率。增量同步频率可以维持一个可接受的accuracy,但会在扩展性上可降,导致一个sub-linear scaling。然而,取决于终端应用,可以调整同步频率。

参考