Minerva:一个可扩展的高效的深度学习训练平台
zoerywzhou@gmail.com
http://www.cnblogs.com/swje/
作者:Zhouwan
2015-12-1
声明
1)本文是关于Minerva简介的一篇译文。具体引用的资料请看参考文献。具体的版本声明也参考原文献。
2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。
3)本人刚接触深度学习方向,专业术语了解甚少,斗胆翻译了这篇文章,有诸多语言不通顺和不准确之处。望与同是入门的朋友分享本文,也希望各界机器学习方面的大神不吝指教!第一次发公开博客,期待大家的宝贵建议,希望能与君共同进步!谢谢!
请联系:zoerywzhou@gmail.com
以下是中文译文,英文原文请自行搜索下载O(∩_∩)O~
摘要
深度学习的工具蓝图被两种工具之间日渐增大的缺口分成碎片,一种是通用的以生产力为导向的工具,这种工具可以使算法开发最优化,另一种则是针对特殊任务的工具,可以使算法开发的速度和规模最优化。这就对将新意的创新带进实际应用中造成了人为的阻碍。Minerva用一种分层的设计解决了这个问题,这种设计在一个统一的框架中同时提供了编程语言的灵活性和执行的高效性。Minerva提出一种基于矩阵的应用程序接口,使得有了简洁的代码和类Matlab的、命令的、程序性的代码风格。代码可以动态地转化为内部的数据流表示法,然后就可以高效地在不同的硬件上运行。同一个用户的代码可以在现代的笔记本电脑上运行,也可以在工作站上运行,可以在高端多核的服务器上运行,也可以在服务器群集上运行,无论有没有GPU提供加速都可以运行,并且在不同平台上运行时,Minerva所具备的性能和可扩展性都要比与已存在的工具好,至少颇具竞争力。
一、绪论
这篇论文考察了一种深度学习的工具,它为将创新带进实际应用中提供了可能。我们注意到在通用型且面向生产率的工具和针对特殊任务的工具之间有很大的缺口。然而,从一个完整的生态系统的角度来看,这两类工具是密切相关的。
首先,我们注意到核心创新本身并不是新的;深度、循环和卷积是很多年前就提出的部分关键要素。深度学习的成功以及留下的大量的谜题激励着在这方面的新的算法创新,也得到了一个完全异于正反馈网络拓扑的模型【1,2,3】。这种新模型通常形成于以生产力为导向的工具,例如Matlab和Octave。由于易于编程加上一个重要的优化和可视化的集合,这种工具在滋生新的创新方面是很理想的。然而,为了和现实应用产生关联,这些创新必须最终能够在真实世界的数据集上进行测试。要想实现这些的关键问题在于,由于大数据计算的趋势,这些工具不能处理大量数据并高效地开发先进的且经济上可行的硬件。
同时,也涌现出越来越多的针对特殊任务的工具。被一些已知的网络结构所吸引,这些工具为了提高速度和规模,牺牲了编程能力。例如,很多图像分类任务通过深度卷积网络的变体完成,大词汇量的演讲识别任务通常采用多层网络【5,6】,那些用自然语言处理的任务通常使用回归结构【7】。这些工具擅长于利用硬件的新品种,包括用于矩阵运算的GPU加速(比如Cuda-Convnet【8】和Caffe【9】),基于CPU的分布式的多核群集(比如Disrbilief【10】)或是GPU 群集【11】。因此,这些工具只能优化特定的网络,而且实现功能时要和其基础的硬件紧密结合,并且为了避免硬件的局限性,网络模型有时会走捷径。比如,论文【10】和【11】中的对象分类模型,它不允许跨机器边界的参数共享,即使当这种参数共享会有效的约束模型避免过拟合的能力。虽然多种多样,特定任务工具的灵活性都受网络重配置的限制。他们的长处是速度嗯哼规模,但是过长的转换时间和难以调试的缺点也使他们不能对算法做出很大的改变。
困境在于我们现在面临一个破碎的管道:在一端产生的创新越来越难在另一端测试。如果争论说这是实用主义进步的结果,应该被接受为事实也是合理的,但是我们想提出疑问,这个结论是否过于肤浅,在生产率和性能之间的明显的缺口是否可调和。我 们认为,在工具链中取代像Matlab这样的工具是不切实际的。相反,我们假设,用一 种有原则的系统构建方法,我们有可能在编程语言的层面上保持面向生产率的工具的可 编程性,并且同时在底层高效地开发现代计算机硬件。
我们已经建立了一个叫做Minerva的系统原型来应对这一挑战,这篇论文报告了我们的进展。Minerva从两类工具中得到启示,并尝试在两者之间搭桥。Minerva提出直接在基于矩阵的应用程序接口上编程,保留了类Matlab的、命令的、程序性的代码风格。这和Theano【12】之类的工具不同。因此,如果需要的话,将Matlab程序迁移到Minerva上更加简单。在运行时,Minerva程序被翻译为一种内在的数据流表示法,这种表示法使得程序可以在不同的硬件上高效地执行。同一个用户的代码可以在现代的笔记本电脑上运行,也可以在工作站上运行,可以在高端多核的服务器上运行,也可以在服务器群集上运行,无论有没有GPU提供加速都可以执行。这种模块化的分层的设计隔离了运行时复杂度和终端用户。我们仔细地设计了这个系统,使得在不同的硬件平台上运行时,它所提供的性能和可扩展性都比已存在的工具效果好,至少颇具竞争力。例如,Minerva的卷积网络实现 和Matlab版本一样简洁,在ImageNet 1K类别分类任务中,达到了42.7% top-1 和 29.9% top-5 的错误率,速度比在ConvNet上运行快2倍,并且和在Caffe上单GPU运行时的速度很相近。针对一个广泛使用的手动调整的单线程的实施,我们在回归神经网络上的实施相比于在16核CPU和GPU上运行的结果,分别提供了28倍和124倍的性能收益。
我们承认可编程性不等于生产率,但是这是一个重要且必要的条件。为了使Minerva发挥它的用处,我们正积极地工作以将Minerva发布成为一个开源项目。在另外的余下部分,我们将描述Minerva的整体架构(第二部分),编程模型的设计(第三部分)和运行时(第四部分)。我们将会在第五部分分享的我们的经验和初步实验结果,最后在第六部分做一个总结。
二、系统概述
Minerva系统的整体架构如图1所示。Minerva进程通过在两个阶段不断交换来执行每一次的训练迭代。第一阶段象征性地(symbolically)执行用户代码来产生数据流表示,而第二阶段具体地求值。数据流表示是平*立的,而且在每一个进程中是完全相同的。这种分层设计将对语言灵活性和运行高效性的支持分离开来。生成数据流图的代价是可以忽略的但是它使系统的其余部分能够集中在提高性能上。
在深度学习中,并行性以相互补充的形式存在(DistBelief【10】)。对于模型并行性,多个进程被分为模型副本训练同一个模型。进程广泛地分割数据流图。每一个进程工作在它自己的部分,同时通过异步地远程过程调用解决进程之间的数据独立性,因此能够最大化地隐藏通信开销。我们执行自动推断导出进程中的近似最优数据布局,当我们运行在机器群集中时这一点很重要。注意到,利用专门设计的编程模型,我们的结构导出数据布局是以一种完全静态和分散的方式,因此可以避免大数据中在其他计算引擎中所需的集中协调(central coordination)【13,14,15】。
对于数据并行性,多个模型副本工作在数据集合的不同部分。每一个副本有一个本地参数服务器,并在参数服务器上更新数据。不同副本的参数服务器异步地交换它们之间的更新啦保持模型的同步,或许是通过一个集中的master。系统上从逻辑上被分为两层(如图1)。上层横跨模型副本运行数据并行性,下层在每个模型副本中利用模型并行性。Minerva进程有两个主要的硬件优势:GPU加速和多核CPU。前者相对简单,如果有GPU的话,数据流图总是在GPU中估值。最小配置是一个模型副本只包含一个进程和一个参数服务器,这个配置可以在笔记本电脑上运行。通过增加更多的副本或者每个副本增加更多的进程,或者兼顾两者,就可以扩展系统。
三、编程模型
一个有效的设计方案是使用图形编程范式来表达模型,因为毕竟神经网络是一个图。确实,我们的第一个原型是利用GraphLab【16】中的聚合或分散或应用的API函数。一个直接的好处是它可以直接表达出算法中固有的所有的并行性。现在问题是,整个的训练程序被分为孤立的顶点程序。这种分裂导致了总体程序流的单调乏味的推断,而且调试也将成为一个噩梦,这将完全破坏用户友好的目的。
然而避免图形编程是有益的。训练项目是由模型的图形表示法引发的一系列矩阵操作。我们的方法结合了模型的图形表示法的优点和矩阵计算接口的优点,可以被概括为“建立一个图,用矩阵编程”。
3.1 Minerva API
Minerva定义了一个API集合(如表1)来涵盖深度学习算法的三个不同阶段:描述模型架构,声明初始矩阵,最后具体说明学习程序。程序设计风格是命令的、过程式的,类似于在Matlab中的算法开发过程。图2展示了一个简单的三层神经网络的代码片段。
Minerva模型有两个实体:图层和连接。用户通过调用model.AddLayer(dim)来声明一个图层,并通过调用model.AddConnection(l1, l2)来实现两个图层之间的连接。其中,dim是一个标量,用来指明神经元的数目,图层连接的方式是全连接。如图2,9-16行代码用来建立模型(partition会在后面解释)。至今,我们发现这两个简单的API函数已经足以描述我们研究的所有模型,包括回归神经网路和多模式网络【3】。这种显式的图形结构作为支架,对所有变量都直接或间接固定。这对Minerva声明和提取并行性是至关重要的,后面我们将会解释这一点。
矩阵是深度学习算法中基本的数据类型。例如,隐层的活动通过y = sigmoid(Wx + b) (第40行)来计算。要想执行这条语句,必须声明矩阵W,x和b。在Minerva中,矩阵既可以直接来源于模型(如矩阵W、b和输入),也可以通过计算得出(如y)。不 过哪种情况,他们都通过显示说明或者程序推理附属于模型。在这个例子中,x附属于 layer1,y和b附属于layer2,W附属于两层之间的连接层(见图3(a))。
写训练程序就很简单了。38-49行代码对应着正反馈传递、反向传播和权重更新。编程的风格类似于我们研究过的深度学习算法中Matlab的实现。表1总结了主要的API函数。最重要的类型是element-wise操作符和一种乘法操作运算符的扩展版本。另外,还有多种聚合操作形式,用于错误率计算和正则化。
CNN(卷积神经网络)需要一些特殊处理。回想一下,CNN中每一层都是一堆特征映射,每一个特征映射都是二维或三维的数据。因此,每一层的输入输出其内部都有一个多维的结构。另外,过滤器在两层之间是重复的和分片式的,而不是全连接。所有这些结构信息都通过一个简单的接口给出,也即AddConvConnect(layer1, layer2,...).然后,像“+”、“*”这样的Matrix类操作符将会自动实现。
3.2 表达并行性
Minerva运行时象征性地执行用户代码从而建立一个内部的数据流图。图4描述了这个对应于正反馈声明语句的数据流片段。个体声明片段会被链接到一起,并且的那个运行到EvalAll()语句时,整个数据流表示就会具体地评估-一种惰性计算的形式。这个数据流表示表达出了训练算法中的固有的潜在并行性。为了进一步提高性能,用户可以选择使用模型并行性(第15行)、数据并行性(30-33行、52-53行),或者兼用两者。这些都是可选的,即使没有这些系统也能正确运行。
模型并行性。通常,算法固有的并行性太低,不能被多核或服务器群集充分利用。可以通过将模型分段来增加并行度的数量,即使用SetPartition(layer, partplan)接口。第15行指令实现将layer1 和layer2 分成两个相等的部分,从而将原始模型分开(图3)。分段之后,相等的数据流图就表现出更多的并行性。注意,那些附属于模型已分开的片段的所有矩阵,都通过程序接口自动分段。这种分裂就是如图3(b)所示的分段方案。
数据并行性。Minerva可以并行地训练多重模型副本,这些副本可以在不同机器集合上执行同样的用户代码,并通过逻辑上集中的参数服务器实现同步。为了保证数据并行性,我们首先同步地将参数集合登记到参数服务器上(30-33行)。用户可以控制更 新和恢复参数集合的步长(52-53行)。更新发送deltas,而恢复则下载整个新的参数 集合。因为权重更新是可交换和有关联的,参数服务器的逻辑很简单。
3.3 User-enabled optimization
为了得到好的性能,最重要的优化就是隐藏各种各样的I/O时延。这些优化经常都是场景和平*立的。我们将展示Minerva是怎样通过仅仅改变几行代码就实现这些优化的。
比如,当数据量过于大而不能放置在内存中时,从磁盘中下载数据应该和计算并行执行。在Minerva中,让一个临时的矩阵从下一批数据中预读取,并在迭代结束时将数据转到内存中,通过这种方式可以实现这种并行性,如图5(a)中所示。
另一个例子是在模型并行性中隐藏网络时延。考虑一个表示某一层神经元活动的矩阵,矩阵在多进程中被分割,并且矩阵有多个和mini-batch大小相等的行。
单一的传播需要这些进程将这个矩阵中它自己的那部分发送给其他的进程,导致突发性和昂贵的数据移动网络。虽然运行时在数据到达的时候已经执行了部分计算,这些开销仍然是不可忽略的。我们通过简单地将mini-batch分成更小的mini-mini-batch处理这个问题,使流水线技术能跨层操作(如图5b)。
四、系统设计
如图1所示,每一个Minerva进程都执行完全相同的流。它首先执行用户代码中的模型建立部分(图2的9-16行),生成一个模型的内部图形表示,这个图形表示将被引用来推断数据布局的决定和后面的并行运行计划。接下来的部分(图2的36-55行)是训练程序。每一次迭代被分解为两个阶段。第一个阶段进程语句构成数据流图,其中既有计算顶点也有数据顶点。当运行到EvalAll()语句时,第一阶段停止,然后具体评估图。按照定义,数据流图的输入是数据顶点,并且这时候已经准备好了(比如,加载训练数据)。计算顶点和其下游数据顶点结合进行计算,并逐步引发数据流图中的下一步计算。所有的已经准备好的顶点排队等候依次由线程池处理。当所有的顶点都被处理完之后,控制器就返回到下一次迭代的符号化执行阶段。
支持异构的硬件。计算顶点是执行预定义操作(见表1)的虚指针。这些指针执行多态性来调用不同的库和引擎。我们使用英特尔的MKI库或英伟达的CUBLAS库分别在多核的CPU和GPU来执行矩阵计算。对于GPU训练来说,模型的状态总是留在GPU,而训练数据则是请求式地从CPU内存中获取。
模型并行性。在一个模型副本中的进程更新并行地相同的模型。注意到,理论上我们可以通过使用更多的分段来分层(使用SetPartition API,见第三部分),来任意地增加数据流图中的并行数量。因为所有的进程都生成完全相同的图,所以并行执行就变成了进程之间的协调的分段的执行计划。
关于并行执行计划需要考虑的重要因素有负载平衡,协调开销和数据局部性。他们很重要,尤其是在群集环境下。均匀地拆分所有层是默认的分段策略,并且这种方式正常情况下能实现负载平衡。通过这种静态的分段政策,协调开销也能因此被完全移除。在进程运行期间,每一个进程都只运行它拥有的计算顶点而跳过其他顶点(见图4的例子)。计算顶点的所属权是由它的输入和输出数据顶点的位置决定的。因此,数据顶点的布局唯一地决定了进程间工作量的分配。理论上,只要顶点的最终位置是确定的,我们可以采取任意一种政策来放置数据顶点,不过想要得到最佳性能也是很棘手的。一个好的解决方案应该是可以最大化局部性的,因此计算顶点大部分时候能有离他们最近的输入(input local to them)。我们的主要观察是,附属于同一层的数据也更有可能一起执行操作。因此我们的布局政策是通过强制那些数据同地协作,并固定剩下的顶点(见图3)。注意到,所有的数据都附属于模型,这就揭示了哪些数据应该同地协作的线索。考虑图2中的第43行,z和labels都附属于layer3,并且如果所有的操作数都是同地协作的,那么“-”和EleWiseProd操作可以极好地并行而不会引发任何的通信。事实上,这些运算符由深度学习算法中的大多数操作组成。通过把这些数据放在一起,大部分的操作就可以在局部找到他们的输入。对于其他的运算符像乘法运算,无论布局算法多么优,他们都是频繁计算并且会引发网络流量。实际上,这种方案比我们已经考虑的其他更复杂的方案工作的更好。对于任何经过进程边界的数据,我们都插入一个指针来远距离发送和接收处于数据流图边缘的调用。当数据生成时,就会引发传递,因此就可以最大化地隐藏通信时延。
处理卷积网络。由于其不同的内部并行性,卷积是一种需要特殊处理的实例。CNN中的并行性通过将输入和输出数据划分为更小的片段,进程本地的滤波器集合作用于这些片段。卷积操作的数据流图构建需要考虑边界条件并且从不同片段中取得数据(见图6)。卷积操作符(图6中的C)采取和论文【11】中一致的最优化方法,即首先将不连续的输入组成一个更大的矩阵,然后执行矩阵乘法运算。虽然由于复制内存开销增大,但乘法运算得到的结果更好,在GPU上运行的结果尤其高效。
数据并行性。在Minerva中,每一个机器都有一个当地的参数服务器,它接收本地更新并同步地将更新与其他参数服务器交换。对于基于GPU的训练,更新的频率很高(比如,在ImageNet训练中,每一个mini-batch的更新频率小于1秒),而且我们发现像DistBelief里执行的主从结构不具备可扩展性。我们开发了一个协议,只要参数服务器能组成无循环的拓扑结构,这个协议就能保证参数共享。这个协议类似贝叶斯网络【17】里的反向传播算法结构。基本地,一个参数服务器将它自己的更新与和它连接的相邻服务器的更新相合并,并将丢失的部分传播给每一个相邻服务器。这个协议被证明可以实现最后的一致性,而且可以容忍动态的失败和任意机器的重组合,并能在模型差异和可扩展性之间灵活调整。例如,所有参数服务器组成一个链的拓扑结构拥有最好的负载平衡性但是传播的最慢,而主从式的拓扑结构传播的很快但是负载平衡性不好而且在高更新率的情况下性能很差。有两个主服务器的拓扑结构则可以在两者之间达到平衡(如图7)。读者可以参考【18】来获取详细的设计方案。
五、经验与评价
我们已经实现了最常见的深度学习网络和很多流行的正则化方案。我们也建立了梯度检查器,以确保我们能够捕捉到很多微小的错误。用户代码和Matlab版本的一样简洁。我们也像其他特定任务的工具一样支持脚本化网络以加速通常的训练,并在Matlab和其他系统上用很多回归测试验证了模型的准确性。在ImageNet 1K的分类任务中,Minerva在CNN模型上【4】实现了42.7% top-1的错误率。关于增量式层次化的学习【19】,我们的研究完全是在Minerva上实现的。
现在我们汇报一下使用三个网络的系统性能(也就是性能和规模)的结果,这三个网络的基线是大家熟悉且通用的。第一个就是用于ImageNet 1K分类的著名的CNN模型【4】,第二个是Speech-Net,它是卷积深度正反馈网络,其基本配置包含1100个输入神经元,8个2K sigmod隐层神经元和一个9K softmax的输出层。这是一个大词汇量的演讲识别模型,我们的同级演讲研究小组就在使用它。最后是RNN,是一个有10K输入(指词汇量大小)、1000个隐层和10K的平输出单元的周期性网络,它的核心训练循环代码不超过60行。
我们已经完成率交叉于不同平台的大量评估。由于空间有限我们只详细地展示一部分结果。关于桌面生产力,在4核工作站上运行时,就Speech-net网络而言,Minerva的性能比在Matlab上快1.5~2倍,比按比例缩减的CNN快15倍。通过定性的分析,我们在Lenovo X1 笔记本电脑上得出了相似的结果。对于每一个运行在CPU上的实验,都会执行模型分段来创建更多的并行性。最佳的分段方案应该满足任务和平*立性,并且经过简单的剖析可以找到各个分区。比如,运行在16核服务器上拥有16路分段的CNN模型比不分段时提高了4.6倍的速度。
纵向扩展。图8展示了CNN相比于ConvNet 和 Caffe的实验结果,实验条件是基于16核的Xeon E5-2665 CPU和GTX Titan GPU,并且mini-batch的大小为128.我们通过改变特征映射的数目来改变模型大小。小模型、中等模型、大模型(默认为中等模型)分别对应3.8亿、10.5亿和39.1亿个连接数。首先关注CPU性能,我们发现模型大小和运行时间几乎成线性。在中等模型的条件下,基于GPU运行时,Minerva运行时间比ConvNet快两倍,和Caffe比较相近(一个是0.75,一个是0.6)。在大模型的条件下,只有Minerva和Caffe可以运行。我们也用了更大的mini-batch大小来估计训练速度。对于小模型来讲,在256个mini-batch和512个mini-batch的条件下,Minerva的速度比Caffe分别快20%和24%。对于中等模型和大模型,Minerva和Caffe的性能比较相近。通过使用论文【9】【20】中提出的解相位技巧,可以进一步地提高性能。
图9展示了在16核的服务器上,分别基于RNNLM和Minerva时RNN的训练性能。其中,hidPart 和 outPart 分别表示隐层和输出层的片段数,bpttBlock表示模型更新周期。不采用模型并行时,Minerva的性能比运行在单核上的RNNLM快6倍,主要的原因是我们在一个训练过程中分批处理了100个句子并运用了矩阵乘法,而RNNLM 只使用了手动调整的矩阵向量乘法。不采用模型并行时,多核性能的提升有一定的限制空间,16核时也只能达到每秒110个单词。在不降低模型准确性的前提下,相继地在隐层、输出层以及隐层和输出层中将模型分段,不断提高模型并行性,其性能可以达到250词每秒,这几乎是在RNNLM上运行速度的18倍。当模型频率比较低时(将bpttBlock设为5),我们能达到380词每秒。最后,同样的代码训练在GPU上可以达到1674词每秒。这比在16核的CPU上训练的结果快了4.4倍,并且比在RNNLM上快了两个数量级(也就是124倍)。
在CPU上,将模型规模增大到50倍,100倍,500倍和1000倍个输入输出单元,可以成比例地将吞吐量分别降低到94词每秒、47词每秒、9.3词每秒和4.5词每秒。这主要是由于隐层输出层之间计算的代价与输入输出层的大小成比例。GPU可以获得比CPU快7.3倍的加速比,但是当配置达到50万的时候就不可以了,因为此时模型大小超过了GPU 的内存容量。
图10描述了不同mimi-batch大小情况下Speech-net的运行结果。CPU的性能维持在1K个样本数每秒,而大一些的mini-batch将会提高GPU的利用率,当有8K个mini-batch时,可以达到7K个样本数每秒。这个结果和我们同级演讲研究小组用手动调整的GPU实验的结果非常匹配。
横向扩展。使用用户级网络I/O优化mini-mini-batch(见第三部分),CNN在4核群集上的加速性能如图11所示。在8个机器上可以获得将近四倍的加速度。与在DistBelief【10】中的调查结果一致,由于多对多连接引起的密集的交叉机器之间的通信,speech-net尺度相对差一些。从论文【11】看,64-GPU的群集已经在模型并行性中取得了更好的可扩展性。主要的差异在于,系统中使用的基准是一个带有当地可接收域的稀疏auto-encoder,在机器边界没有权重共享。CNN是一个带有三层全连接分层的分类器,平行于这种网络的模型仍然是一个开放的挑战。
六、总结与正在进行的工作
Minerva是一个特定领域的引擎而非特定任务的引擎。他们的区别很小但是很重要。我们要解决的模块化和分层设计的挑战是在一个统一的框架中同时提供编程语言的灵活性和执行的高效性。
我们现在正在进行的工作是多层面的。我们非常接近让GPU数据并行工作。GPU模型并行在NVidia显卡中使用GPU转换数据时遇到了性能问题,不过我们相信这个问题不久后就可以解决。更有问题的是由分段的全连接分层引起的密集的通信量。一个比较好的替代方案是部分全连接的分层不分离CIA采用流水线的方式。Minerva允许这种灵活性,我们也打算实验之。
我们正在实施跟家先进的深度学习算法和优化方案,包括Quasi-Newton方法,共轭梯度下降方法和Hessian Free方法。如果我们想让Minerva有用处,算法工作中还有很大一部分需要完善。我们认识到,这需要社会的共同努力,并且我们在积极工作以使Minerva能作为开源项目发行。
References
[1] Kihyuk Sohn, Guanyu Zhou, Chansoo Lee, and Honglak Lee. Learning and selecting features jointly
with point-wise gated fBg oltzmann machines. In Proceedings of the 30th International Conference on
Machine Learning (ICML-13), pages 217–225, 2013.
[2] Yichuan Tang, Ruslan Salakhutdinov, and Geoffrey Hinton. Robust boltzmann machines for recognition
and denoising. In Computer Vision and Pattern Recognition (CVPR), 2012 IEEE Conference on, pages
2264–2271. IEEE, 2012.
[3] Nitish Srivastava and Ruslan Salakhutdinov. Multimodal learning with deep boltzmann machines. In
Advances in Neural Information Processing Systems 25, pages 2231–2239, 2012.
[4] Alex Krizhevsky, Ilya Sutskever, and Geoff Hinton. Imagenet classification with deep convolutional
neural networks. In Advances in Neural Information Processing Systems 25, pages 1106–1114, 2012.
[5] Abdel-rahman Mohamed, Dong Yu, and Li Deng. Investigation of full-sequence training of deep belief
networks for speech recognition. In INTERSPEECH, pages 2846–2849, 2010.
[6] Frank Seide, Gang Li, and Dong Yu. Conversational speech transcription using context-dependent deep
neural networks. In INTERSPEECH, pages 437–440, 2011.
[7] Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient estimation of word representations
in vector space. arXiv preprint arXiv:1301.3781, 2013.
[8] Alex Krizhevsky. High-performance c++/cuda implementation of convolutional neural networks.
[9] Yangqing Jia. Caffe: An open source convolutional architecture for fast feature embedding. http:
//caffe.berkeleyvision.org/, 2013.
[10] Jeffrey Dean, Greg Corrado, Rajat Monga, Kai Chen, Matthieu Devin, Quoc V. Le, Mark Z. Mao,
Marc’Aurelio Ranzato, Andrew W. Senior, Paul A. Tucker, Ke Yang, and Andrew Y. Ng. Large scale
distributed deep networks. In NIPS, 2012.
[11] Adam Coates, Brody Huval, TaoWang, DavidWu, Bryan Catanzaro, and Ng Andrew. Deep learning with
cots hpc systems. In Proceedings of the 30th International Conference on Machine Learning (ICML-13),
pages 1337–1345, 2013.
[12] James Bergstra, Olivier Breuleux, Fr´ed´eric Bastien, Pascal Lamblin, Razvan Pascanu, Guillaume Desjardins,
Joseph Turian, DavidWarde-Farley, and Yoshua Bengio. Theano: a cpu and gpu math expression
compiler. In Proceedings of the Python for Scientific Computing Conference (SciPy), volume 4, 2010.
[13] Jeffrey Dean and Sanjay Ghemawat. Mapreduce: simplified data processing on large clusters. Communications
of the ACM, 51(1):107–113, 2008.
[14] Zhengping Qian, Xiuwei Chen, Nanxi Kang, Mingcheng Chen, Yuan Yu, Thomas Moscibroda, and Zheng
Zhang. Madlinq: large-scale distributed matrix computation for the cloud. In Proceedings of the 7th ACM
european conference on Computer Systems, pages 197–210. ACM, 2012.
[15] Matei Zaharia, Mosharaf Chowdhury, Tathagata Das, Ankur Dave, Justin Ma, Murphy McCauley,
Michael Franklin, Scott Shenker, and Ion Stoica. Resilient distributed datasets: A fault-tolerant abstraction
for in-memory cluster computing. In Proceedings of the 9th USENIX conference on Networked
Systems Design and Implementation, pages 2–2. USENIX Association, 2012.
[16] Yucheng Low, Joseph Gonzalez, Aapo Kyrola, Danny Bickson, Carlos Guestrin, and Joseph M Hellerstein.
Graphlab: A new framework for parallel machine learning. arXiv preprint arXiv:1006.4990, 2010.
[17] Judea Pearl. Probabilistic reasoning in intelligent systems: networks of plausible inference. Morgan
Kaufmann, 1988.
[18] Minjie Wang, Hucheng Zhou, Minyi Guo, and Zheng Zhang. A scalable and topology configurable protocol
for distributed parameter synchronization. In Proceedings of 5th Asia-Pacific Workshop on Systems,
page 13. ACM, 2014.
[19] Xiao Tianjun, Zhang Jiaxing, Yang Kuiyuan, Peng Yuxin, and Zhang Zheng. Error-driven incremental
learning in deep convolutional neural network for large-scale image classification. In ACM Multimedia,
2014.
[20] Patrice Simard, David Steinkraus, and John C Platt. Best practices for convolutional neural networks
applied to visual document analysis. In ICDAR, volume 3, pages 958–962, 2003.