戳一戳!和我一起走进深度学习的世界
导读
深度学习中,数据集越来越多,大规模深度学习问题亟需更好的解决方案!
本文作者提出分布式深度学习框架DistBelief,在该框架中提到了两个算法:Downpour SGD 和 Sandblaster L-BFGS,与之前的方案相比,在尽可能少时间内获得了更高的精度,训练至相同精度,消耗的时间也更少。
首先先下载原论文一睹为快吧。
Large Scale Distributed Deep Networks
地址:http://papers.nips.cc/paper/4687-large-scale-distributed-deep-networks.pdf
摘要
最近在无监督特征学习(unsupervised feature learning)和深度学习方面的研究表明,能够训练大型模型可以显著提高性能。
本文研究了用上万个CPU核训练具有数十亿参数的深网络的问题。我们已经开发了一个名为 DistBelief 的软件框架,它可以利用具有数千台机器的计算集群来训练大型模型。在此框架内,我们开发了两种大规模分布式训练算法:(i)Downpour SGD,一种支持大量模型副本的异步随机梯度下降(asynchronous stochastic gradient descent)过程;(ii)Sandblaster,一种支持多种分布式批优化(distributed batch optimization)过程的框架,包括L-BFGS的分布式实现。
Downpour SGD和Sandblaster L-BFGS都增加了深度网络训练的规模和速度。我们已经成功地使用我们的系统训练了一个比先前文献报道大30倍的深度网络,并在ImageNet上实现了最先进的(state-of-the-art)性能,这是一个包含1600万张图像和21k个类别的视觉对象识别任务。我们发现,这些相同的技术显著地加速了商业语音识别服务中规模较小的深层网络的训练。尽管我们关注并报告了这些方法在训练大型神经网络时的性能,但底层算法适用于任何基于梯度的机器学习算法。
总结
背景:大型模型可以提升无监督学习及深度学习性能。
工作:本文作者提出包含两个算法的分布式深度学习框架DistBelief。
成果:两个算法实现了规模更大,效率更高的分布式深度学习。
思考
1、DistBelief框架功能?框架结构?实现细节?
2、两种算法各自的功能是什么?解决了现有的什么问题?
3、两种算法具体实现?可以有哪些提升?
4、如何验证两种算法比现有算法更优,优在哪些方面。
5、L-BFGS是什么?
L-BFGS算法是有限内存中进行BFGS算法,L是limited memory;BFGS分别是四位数学家名字首字母。L-BFGS是解无约束非线性规划问题最常用的方法,具有收敛速度快、内存开销少等优点。简单来说,L-BFGS和梯度下降、SGD功能类似,但大多数情况下收敛速度更快,这点在大规模计算中很重要。
1 介绍
深度学习和无监督特征学习在许多实际应用中显示出巨大的前景。从语音识别[1,2]、视觉对象识别[3,4]到文本处理[5,6],已经报道了许多领域的最新性能。
还发现,增加深度学习的规模——训练示例的数量、模型参数的数量,或两者都增加,都可以显著提高最终分类精度[3,4,7]。这些结果引起了人们对扩大这些模型训练和推理算法[8],改进适用的优化程序[7,9]的兴趣。GPU的使用[1,2,3,8]是近年来的一个重大进步,使得适度规模的深层网络的培训变得切实可行。GPU方法的一个已知限制是,当模型不适合GPU内存时(通常小于6GB),训练速度会很小。为了有效地使用GPU,研究人员通常会减少数据或参数的大小,这样CPU到GPU的传输就不是一个显著的瓶颈。虽然数据和参数简化对于小问题(例如语音识别的声学建模)很有效,但对于具有大量示例和维度的问题(例如,高分辨率图像)则不太具有吸引力。
在本文中,我们描述了另一种方法:使用大规模的机器集群在深层网络中分布训练和推理。我们开发了一个名为 DistBelief 的软件框架,该框架支持机器内(通过多线程处理)和跨机器(通过消息传递)的模型并行性,以及由该框架管理的并行性、同步和通信的细节。除了支持模型并行性(model parallelism)之外,DistBelief 框架还支持数据并行(data parallelism),即使用模型的多个副本来优化单个目标。在此框架内,我们设计并实现了两种新的大规模分布式训练方法:(i)Downpour SGD,一种利用自适应学习率并支持大量模型副本的异步随机梯度下降过程;(ii)Sandblaster L-BFGS,一种使用数据并行和模型并行的L-BFGS的分布式实现。与传统的SGD和L-BFGS相比,Downpour SGD和Sandblaster L-BFGS都有显著的速度提升。
我们的实验展现了一些关于大规模非凸优化(nonconvex optimization)的惊人结果。首先,异步SGD,很少应用于非凸问题,在训练深层网络方面非常有效,特别是当与Adagrad[10]自适应学习率相结合时。其次,我们证明了在资源充足的情况下,L-BFGS与SGD的许多变体相比具有竞争性或速度更快。
关于深度学习中的具体应用,我们报告了两个主要发现:我们的分布式优化方法既可以大大加快适度规模模型的训练,也可以训练比预期更大的模型。为了说明第一点,我们证明我们可以使用一组机器来训练一个适度大小的语音模型,使其达到相同的分类精度,所需时间不到GPU所需时间的十分之一。为了说明第二点,我们训练了一个由超过10亿个参数组成的大型神经网络,并使用该网络极大地提高了计算机视觉中最大的数据集之一ImageNet数据集的最新性能。
总结
背景:深度学习与无监督学习用途广泛,增加模型及数据集数量能提升分类精度。GPU在大规模模型中起到重要作用,但是也有内存的限制。
工作:本文作者针对上述背景提出分布式训练与推理模型DistBelief ,包含两种算法:Downpour SGD与Sandblaster L-BFGS。
结果:使用异步SGD与Adagrad结合解决非凸问题。模型框架支持模型并行与数据并行,分布式优化方法加快了适度规模的模型训练,支持大规模模型训练。
思考
1、模型的并行性、同步及通信如何实现?数据并行如何实现?
2、两种算法的提升都体现在哪些方面,具体提升了多少?是因为什么提升的?
3、异步SGD如何应用于非凸优化,如何与Adagrad结合?
4、具体的实验是如何做的?如何进行比较的?
2 相关工作
近年来,商业和学术机器学习数据集以前所未有的速度增长。作为回应,许多作者探索了通过并行化和分布式来扩展机器学习算法[11,12,13,14,15,16,17]。大部分的研究集中在线性凸模型上,其中分布式梯度计算是自然的第一步。在这一领域,一些团体放宽了同步要求,探索凸问题的延迟梯度更新[12,17]。同时,其他研究稀疏梯度问题的小组(在给定的训练例子中,梯度向量的一小部分坐标是非零值的问题)研究了共享内存架构(即单机)上的无锁异步随机梯度下降[5,18]。我们感兴趣的是一种能同时获得两个世界的优点的方法,允许使用一组机器异步计算梯度,但不要求问题是凸的或稀疏的。
在深度学习的背景下,大多数工作都集中在在单个机器上训练相对较小的模型(例如,Theano[19])。扩大深度学习的建议包括使用一个GPU集群来训练许多小型模型的集合,然后对它们的预测取平均值[20],或者修改标准的deep网络,使其本质上更具并行性[21]。我们的重点是向训练非常大的模型的方向扩展深度学习技术,这些模型有几十亿个参数,但不限制模型的形式。在一层主导计算的特殊情况下,一些作者考虑在这一层中分布计算,在其余层中复制计算[5]。但是,在模型的许多层都是计算密集型的情况下,需要具有类似于[22]的精神的完整的模型并行性。然而,要想获得成功,我们认为模型并行性必须与巧妙的分布式优化技术相结合,以利用数据并行性。
我们考虑了许多现有的大型计算工具来解决我们的问题,MapReduce[23]和GraphLab[24]就是值得注意的例子。我们的结论是,为并行数据处理而设计的MapReduce不适合深层网络训练中固有的迭代计算;而GraphLab是为一般(非结构化)图计算而设计的,它不会利用deep网络中典型的结构化图中可用的计算效率。
3 模型并行性
为了便于训练非常大的深层网络,我们开发了一个软件框架DistBelief,它支持神经网络中的分布式计算和分层图形模型。用户定义在模型的每一层的每个节点上进行的计算,以及在计算的上下阶段应该传递的消息。对于大型模型,用户可以将模型划分为多台机器(图1),以便将不同节点的计算任务分配给不同的机器。该框架使用所有可用的core自动并行计算,并在训练和推理过程中管理机器之间的通信、同步和数据传输。
图1:DistBelief框架中模型并行的一个例子。这里显示了一个具有局部连通性的五层深层神经网络,它被划分为四台机器(蓝色矩形)。只有那些边缘跨越分区边界(粗线)的节点才需要在机器之间传输它们的状态。即使在一个节点有多条边跨越一个分区边界的情况下,它的状态也只被发送到该边界另一侧的机器上一次。在每个分区中,各个节点的计算将在所有可用的CPU core上并行化。
将深度网络分布在多台机器上的性能优势取决于模型的连接性结构和计算需求。具有大量参数或高计算需求的模型通常受益于访问更多的CPU和内存,直至通信成本占主导地位。我们已经成功地运行了DistBelief 框架中最多144个分区的大型模型,具有显著的加速效果,而尺寸较小的模型则显示了高达8或16个分区的良好加速。(实验结果见第5节标题“模型并行性基准”下面)。显然,考虑到较低的通信要求,具有本地连接结构的模型比完全连接的结构更容易适应广泛的分布。加速不理想的典型原因是不同机器之间处理时间的差异,导致许多机器等待最慢的机器完成给定阶段的计算。尽管如此,对于我们最大的型号,我们可以有效地使用32台机器,每台机器的平均CPU利用率达到16个核,总共512个CPU核训练一个大型神经网络。当与下一节中描述的分布式优化算法结合使用整个神经网络的多个副本时,可以使用数万个CPU核来训练单个模型,从而显著减少总体训练时间。
总结
DistBelief框架,支持神经网络中的分布式计算和分层图形模型,调用可用core做并行计算、管理机器通信、机器同步、数据传输。
用户,定义模型中节点计算、计算上下阶段传递的消息、划分模型,将不同节点计算任务分给不同模型。
尽可能分布,直到通信成本占主导,该方案取得了令人满意的成果,存在的问题是,有时加速不理想,是因为不同机器处理时间差异不同。
4 分布式优化算法
在 DistBelief 框架内并行计算允许我们实例化和运行比以前报道的大得多的神经网络。但是为了在合理的时间内训练如此大的模型,我们不仅需要在模型的单个实例中并行化计算,而且需要在多个模型实例之间分布训练。在本节中,我们将描述第二层的并行性,在这里我们使用一组不信任的模型实例或副本来同时解决单个优化问题。
我们比较了两种大规模分布式优化方法:在线方法Downpour SGD和批处理方法Sandblaster L-BFGS。这两种方法都利用了集中式分片参数服务器(centralized sharded parameter server)的概念,模型副本使用该服务器共享参数。这两种方法都利用了分布式计算的优势。但最重要的是,这两种方法的设计都能接受不同模型副本处理速度的差异,甚至可以承受模型副本的大规模故障,这些模型副本可能会离线或随机重启。
从某种意义上说,这两种优化算法实现了数据并行的智能版本。这两种方法都允许我们同时处理多个模型副本中不同的训练示例,并定期组合它们的结果以优化我们的目标函数。
A Downpour SGD
随机梯度下降(SGD)可能是训练深层神经网络最常用的优化方法[25,26,3]。不幸的是,传统的SGD公式本身是顺序的,这使得它不适用于非常大的数据集,因为以完全串行的方式移动数据所需的时间是难以承受的。
为了将SGD应用于大数据集,我们引入了一种异步随机梯度下降的变种Downpour SGD,它使用一个 DistBelief 模型的多个副本。基本方法如下:我们将训练数据分成若干子集,并在每个子集上运行模型的副本。模型通过一个集中的参数服务器进行更新通信,该服务器保持模型所有参数的当前状态,并在多台机器上进行分片(例如,如果我们有10个参数服务器分片,则每个分片负责存储并将更新应用于模型参数的1/10)(图2)。这种方法在两个不同的部分是异步的:模型副本彼此独立运行,参数服务器分片也彼此独立运行。
图2:左:Downpour SGD。模型副本异步获取参数w并将梯度∆w推送到参数服务器。右:Sandblaster L-BFGS。单个“协调器”向副本和参数服务器发送小消息,以协调批处理优化。
在最简单的实现中,在处理每个小批量之前,模型副本会向参数服务器服务请求其模型参数的更新副本。因为DistBelief 模型本身是跨多台机器划分的,所以每台机器只需要与参数服务器分片的子集进行通信,这些服务器分片保存与其分区相关的模型参数。在接收到参数的更新副本后,DistBelief 模型副本处理一小批数据以计算参数梯度,并将梯度发送到参数服务器,然后由参数服务器将梯度应用于模型参数的当前值。通过限制每个模型副本仅在每个n_fetch步骤请求更新的参数,并仅在每个n_push步骤发送更新的梯度值(其中n_fetch可能不等于n_push),可以减少Downpour SGD的通信开销。事实上,获取参数、推进梯度和处理训练数据的过程可以在三个只有弱同步的线程中执行(伪代码见附录)。在下面报告的实验中,我们固定了n_fetch=n_push=1,以便于与传统SGD进行比较。
与标准的(同步)SGD相比,Downpour SGD对于机器故障更具鲁棒性。对于同步SGD,如果一台机器发生故障,整个训练过程将被延迟;而对于异步SGD,如果模型副本中的一台机器发生故障,则其他模型副本将继续处理其训练数据并通过参数服务器更新模型参数。另一方面,Downpour SGD中的多种异步处理形式在优化过程中引入了大量额外的随机性。最明显的是,模型副本几乎肯定是基于一组稍微过时的参数来计算其梯度,因为其他一些模型副本可能同时更新了参数服务器上的参数。但除此之外,还有其他几个随机性来源:由于参数服务器分片独立运行,因此无法保证在任何给定时刻,参数服务器的每个分片上的参数都经历了相同数量的更新,或者更新是以相同的顺序应用的。此外,由于模型副本被允许在不同的线程中获取参数和推送梯度,因此参数的时间戳中可能会存在额外的细微不一致。对于非凸问题,这些操作的安全性几乎没有理论依据,但在实践中,我们发现放宽一致性要求非常有效。
我们发现的一种可以大大提高Downpour SGD鲁棒性的技术是使用Adagrad[10]自适应学习速率程序。Adagrad没有在参数服务器上使用单一的固定学习率(图2中的η),而是为每个参数使用单独的自适应学习率。
由于这些学习速率仅从每个参数的平方和梯度中计算,所以Adagrad很容易在每个参数服务器分片中本地实现。γ的值是所有学习速率的常数标度因子,通常比没有Adagrad的最佳固定学习速率大(可能是一个数量级)。Adagrad的使用扩展了能够同时高效工作的模型副本的最大数量,并且结合在释放其他副本之前仅使用单个模型副本的“warmstarting”模型训练实践,它实际上消除了使用Downpour SGD训练深部网络的稳定性问题(见结果)第5节)。
附:Downpour SGD伪码
B Sandblaster L-BFGS
批处理方法已被证明在训练小深度网络方面效果良好[7]。为了将这些方法应用于大型模型和大型数据集,我们引入了Sandblaster批优化框架,并讨论了利用该框架实现L-BFGS。
Sandblaster的一个关键思想是分布式参数存储和操作。优化算法(例如L-BFGS)的核心在于协调进程(图2),它不能直接访问模型参数。相反,协调器发出从一小组操作(例如,点积、缩放、系数加法、乘法)中提取的命令,这些操作可以由每个参数服务器分片独立执行,结果存储在同一个分片上。其他信息,例如L-BFGS的历史缓存,也存储在计算它的参数服务器分片上。这允许运行大型模型(数十亿个参数),而不会产生将所有参数和梯度发送到单个中央服务器的开销。(伪代码见附录)
在L-BFGS的典型并行化实现中,数据分布到许多机器上,每台机器负责计算特定数据示例子集上的梯度。梯度被发送回中央服务器(或通过树[16]聚合)。许多这样的方法等待最慢的机器,因此不能很好地扩展到大型共享集群。为了解决这个问题,我们采用了以下负载平衡方案:协调器为N个模型副本分配一小部分工作,远小于批处理总大小的1/N,并在副本空闲时分配新的部分。使用这种方法,更快的模型副本比速度较慢的副本要做更多的工作。为了在批处理结束时进一步管理缓慢的模型副本,协调器调度未完成部分的多个副本,并使用最先完成的模型副本的结果。这个方案类似于MapReduce(用于大规模数据集并行运算的编程模型)框架中“备份任务”的使用[23]。数据的预读取,以及通过将数据的连续部分分配给同一个worker来支持数据之间的密切关系,使数据访问不成为问题。与需要相对高频、高带宽参数服务器同步的Downpour SGD不同,Sandblaster只在每个批次的开始提取参数(当协调器更新参数时),并且仅每隔几个完成部分发送梯度(以防止复制副本失败和重新启动)。
附:Sandblaster L-BFGS伪码
5 实验
我们通过将优化算法应用于两个不同深度学习问题的训练模型来评估优化算法:静态图像中的目标识别和语音识别的声学处理。语音识别的任务是将一小段音频中的中心区域(或帧)归类为几千种声学状态之一。我们使用了一个五层的深层网络:四个隐藏层,每个层有2560个节点,还有一个softmax输出层,有8192个节点。输入表示是11个连续重叠的25ms语音帧,每个帧由40个对数能量值表示。该网络是完全连接层到层,共有大约4200万个模型参数。我们训练了11亿个弱标记样本的数据集,并在一个保持测试集上进行了评估。关于类似的深层网络配置和训练程序,请参见[27]。
对于视觉对象识别,我们在ImageNet数据集中训练了一个更大的神经网络,该网络包含1600万张图像,我们将每个图像缩放到100x100像素[28]。该网络分为三个阶段,每个阶段包括滤波、池化和局部对比度归一化,滤波层中的每个节点连接到下面一层10x10的块上。我们的基础设施允许许多节点连接到同一个输入块,我们运行了从8到36个相同连接节点的实验。输出层由21000个一一对所有logistic分类器节点组成,每个ImageNet对象类别对应一个。关于类似的深层网络配置和训练程序,请参见[29]。
1 模型并行性基准
为了探索 DistBelief 模型并行性的缩放行为(第3节),我们测量了一个用于简单SGD训练的小批量处理的平均时间作为单个模型实例中使用的分区(机器)数量的函数。
图3:四种不同深度网络的训练速度,作为分配给单个 DistBelief 模型实例的机器的函数。与参数较少的模型相比,具有更多参数的模型从使用额外机器中获益更多。
在图3中,我们通过报告平均训练速度来量化跨N台机器并行化的影响:仅使用一台机器所用的时间与使用N台机器所用时间的比率。这些模型中推理步骤的加速是相似的,这里没有显示。中等规模的语音模型在8台机器上运行最快,比单台机器计算速度快2.2倍。(模型被配置为每台机器使用不超过20个core。)在超过8台机器上划分模型实际上会减慢培训速度,因为在完全连接的网络结构中,网络开销开始占主导地位,并且每台机器使用更多分区执行的工作更少。相比之下,更大的、本地连接的映像模型可以从每个模型副本使用更多的计算机中获益。最大的模型,有17亿个参数,受益最大,使用81台机器时加速超过12倍。对于这些大型机型,使用更多机器继续提高速度,但回报递减。
2 优化方法比较
为了评估所提出的分布式优化过程,我们在各种配置中运行上述语音模型。我们考虑两个基准优化过程:使用传统(单副本)SGD训练一个 DistBelief 模型(在8个分区上),以及使用CUDA在GPU上训练相同的模型[27]。我们将三种分布式优化方法与这些基准方法进行比较:具有固定学习速率的Downpour SGD、具有Adagrad学习速率的Downpour SGD和Sandblaster L-BFGS。
图4:左:不同优化方法的训练精度(在训练集中的一部分)。右:保留测试集的分类精度与训练时间的函数。Downpour 和 Sandblaster 实验使用与简单SGD相同的∼10小时warmstart。
图4显示了这些方法在训练集和测试集中的训练时间函数的分类性能。我们的目标是在最少的训练时间内获得最大的测试集精度,而不考虑资源需求。传统的单副本SGD(黑色曲线)是训练速度最慢的。Downpour SGD有20个模型副本(蓝色曲线)显示出显著改善。Downpour SGD与20个副本加上Adagrad(橙色曲线)速度有一定提升。使用2000个模型副本(绿色曲线)的Sandblaster L-BFGS速度又快了很多。最快的,然而,是Sandblaster SGD加上Adagrad 200模型副本(红色曲线)。在获得足够的CPU资源的情况下,使用Adagrad的Sandblaster L-BFGS和Downpour SGD都可以比高性能GPU更快地训练模型。
尽管我们没有将上述实验局限于固定的资源预算,但是考虑各种方法如何在资源消耗与性能之间进行权衡是很有趣的。我们通过任意选择一个固定的测试集精度(16%)来分析这一点,并测量每种方法达到该精度所需的时间,这是机器和CPU core利用率的函数,如图5所示。每个记录道上的四个点之一对应于图4中所示的训练配置,其他三个点是备用配置。
图5:对于不同的优化策略,达到固定精度(16%)的时间是机器(左)和core(右)数量的函数。
在这个图中,靠近原点的点更可取,因为它们花费的时间更少,而使用的资源更少。在这方面,使用Adagrad的Downpour SGD似乎是最好的折衷方案:对于任何固定预算的机器或core来说,使用Adagrad的Downpour SGD比具有固定学习速率的Downpour SGD或Sandblaster L-BFGS花费更少的时间来达到精度目标。在任何指定的训练时间内,使用Adagrad的Downpour SGD比Sandblaster L-BFGS使用的资源少,而且在许多情况下,固定学习率的Downpour SGD甚至无法在规定的时间内达到目标。Sandblaster L-BFGS系统在增加core的可扩展性方面确实显示出了希望,这表明,如果使用非常大的资源预算(例如,30k个core),它可能最终产生最快的训练时间。
3 应用于ImageNet
先前的实验证明,我们的技术可以加速训练具有数千万个参数的神经网络。然而,我们基于集群的分布式优化方法更显著的优势是它能够扩展到比单机更适合的模型,更不用说单个GPU了。作为探索超大型神经网络能力的第一步,我们使用Downpour SGD在ImageNet对象分类任务上训练了上述17亿参数图像模型。如[29]所述,该网络实现了15%以上的交叉验证分类准确率(cross-validated classification accuracy),与我们所知的21k类别ImageNet分类任务的最佳性能相比,相对提高了60%以上。
6 结论
本文介绍了一种用于深层网络并行分布式训练的框架 DistBelief 。在此框架下,我们发现了几种有效的分布式优化策略。我们发现,Downpour SGD是SGD的一个高度异步的变体,它对于训练非凸的深度学习模型非常有效。Sandblaster L-BFGS是L-BFGS的一个分布式实现,它可以与SGD竞争,并且它更有效地利用网络带宽使其能够扩展到更多并发core,以训练单个模型。这就是说,当计算预算为2000个或更少的CPU时,Downpour SGD和Adagrad自适应学习速率程序的结合成为明显的主导方法。
Adagrad最初并不是设计用于异步SGD的,而且这两种方法都不适用于非凸问题。因此,令人惊讶的是,它们在高度非线性的深部网络上工作得如此之好。我们推测Adagrad在面对大量异步更新时会自动稳定易失性参数,并根据深层网络中不同层的需求自然地调整学习速率。
我们的实验表明,我们的新的大规模训练方法可以使用一组机器来训练甚至是适度规模的深层网络,速度比GPU快得多,而且不受GPU对模型最大规模的限制。为了证明能够训练更大的模型的价值,我们训练了一个具有超过10亿个参数的模型,以在ImageNet对象识别挑战中获得比最先进的性能更好的性能。
AI与区块链技术
长按二维码关注