训练大规模神经网络的并行计算平台摘要:人工神经网络(ANN )已能成功地应用于各种模式识别和数据挖掘中。
然而,在大规模数据集上训练人工神经网络会导致数据密集和计算密集。
因此,为了获的更高的精度,大规模人工神经网络会有保留的进行耗时训练。
在本文中,我们提出cNeural方法,自定义一个并行计算平台,用逆传算法加速训练大型神经网络。
不同于许多并行神经网络训练系统作用于数千个训练样本,cNeural可以加快训练拥有数百万个训练样本的大规模数据集。
为了实现这个目标,首先, cNeural用HBase存储和并行加载大规模数据集。
第二,为了进行快速迭代训练,它提供了一个并行内存计算框架。
第三,我们选择一个紧凑的事件驱动消息通信模型,而不是传递即时消息的心跳轮询模式。
实验结果表明,cNeural中的数据加载和消息传递的开销时间成本非常低,并且cNeural比基于Hadoop MapReduce解决方案的速度快50倍左右。
它还实现了线性的可伸缩性和良好的负载平衡。
关键字:并行计算;神经网络;大数据;快速训练;分布式存储1 引言人工神经网络(ANN)已应用于各种数据挖掘和模式识别中,如蛋白质结构分析、语音识别、,手写识别、图像和信号处理[1]。
然而, 训练大规模神经网络时会出现计算密集和数据密集。
一方面,整个训练工作流程通常需要进行成千上万次的训练步长迭代,这会导致昂贵的计算。
另一方面,为了得到可靠的结果,大规模训练数据集通常用于应用程序。
因此, 在单一PC机上训练大规模神经网络通常是非常耗时的,有时需要几天或者几周完成,有时甚至不可能完成。
因此,大规模神经网络的低训练速度慢限制了它们处理实际应用中复杂和有价值的问题。
另一方面,现实世界的数据量早在前几年就已经爆炸,并且在许多相关领域里,分析大数据已变得相当受欢迎[2]。
大数据的情况也适用于神经网络[3]。
从直觉讲,大家普遍认为训练大规模样本比训练少量的样本效果好。
因此,对于那些基于神经网络的应用程序,训练大规模神经网络在实现最高精度和结果中起着重要的作用。
在本文中,我们设计和实现cNeural方法,一个为训练大规模神经网络而自定义的并行计算平台。
在cNeural中,训练工作流分为两个阶段: 加载训练数据和执行训练流程。
为了减少数据加载的时间成本,我们把大规模训练数据集存储在HBase中,必要时通过集群会同时加载其中的一个数据到计算节点的内存中。
此外, 为了加快迭代训练会采用一个并行内存计算框架。
在整个训练过程中,为了合作和进一步的处理,计算节点之间需要相互沟通。
在cNeural中,我们采用Apache Avro RPC建立一个事件驱动的消息传递通信框架, Apache Avro RPC有较高的通信效率并且数据结构丰富。
我们的平台可以部署在商品硬件,Amazon EC2,甚至是pc机之间的网络互联。
本文分八个部分。
第二节描述了相关工作。
第三部分,提出基于反向传播训练算法的神经网络的背景。
第四部分,介绍并行训练框架和cNeural算法。
第五部分,描述用于支持快速训练的数据存储机制。
第六部分,说明cNeural中的体系结构概述和主要组成部分。
第七部分作出评估。
第八部分总结全文。
2 相关工作许多研究人员一直致力于在并行或分布式计算系统上实现计算上开销很高的ANN算法。
相关工作可以追溯到上个世纪的70年代并且现在这个领域的研究依然保持增长。
在早期,研究人员喜欢用特殊用途的硬件来提高训练速度,这些硬件被分为神经元硬件和神经计算机[6]。
Glesner和Pochnuller[11] 在他们的书中提出这种特殊用途硬件的概述。
应用特殊用途的硬件可以实现快速和高效的运行。
但是,它们几乎不具有灵活性和可伸缩性。
在上世纪90年代以后,在普通用途的框架上设计并行神经网络成为了主流[12],[13],如并行计算模型或网格计算模型。
这些系统大多应用于集群和多处理器计算机上。
但是,以前的工作在管理大规模训练数据集上并没有做出太多的努力。
他们通常致力于怎样使神经网络训练并行化以及只在数千个训练样本和兆字节大小的数据上执行实验。
近年来,许多研究人员在大数据上研究训练神经网络。
[10] 用HDFS 存储大型数据集并且用MapReduce 方法训练它们。
然而,Hadoop 适用处理离线数据密集型的问题而不适用于处理计算密集型问题。
因此,在Hadoop 上训练神经网络的速度是缓慢的。
GPU 也被用于人工神经网络训练,但是训练数据集的大小受限于GPU 的全局内存[16]。
文献[18] 利用大规模的无监督学习可以从无标签数据中提取特性。
他们在训练算法上花费很多努力,如模型并行机制和异步随机梯度下降。
与以上的研究相比,cNeural 不仅考虑了能加速神经网络训练的并行算法,而且对大数据的管理可以更好地支持并行算法的快速运行作出很多努力。
由于Hadoop 并不适用于迭代处理,很多研究提出了改进的方法,如Twister [19]和HaLoop[20]。
他们试图降低初始化工作中的时间成本以及迭代节点之间的数据缓存。
[21]提出Spark 方法,一个完全新的内存计算的并行分布式系统。
与这些处理引擎相比,cNeural 也实现了并行神经网络训练算法。
cNeural 中底层的处理引擎也支持内存计算。
此外,我们为了更好的支持一流算法和应用程序而采用自定义的执行程序。
3 背景在本节中,简要介绍神经网络训练中的反向传播算法。
利用多层感知器作为一个典型的例子来描述训练算法。
前馈反向传播神经网络[4]是现在最流行的一种神经网络构架[5]。
[4]中证明了被反向传播算法训练的三层前馈神经网络可以逼近任何连续的有任意精度的隐层神经元的非线性函数,如多层感知器。
因此, 本节介绍一个与三层前馈感知器的描述相关的算法。
三层感知器的结构如图1所示。
它包括一个输入层、隐藏层和输出层。
同一层的神经元不相通,而相邻层的神经元的权重和偏差完全相连。
基于梯度递减技术的反向传播(BP)[31]是一种监督训练多层前馈神经网络的算法。
反向传播算法有两个阶段:前期阶段和后期阶段。
在前期阶段中,输入层接收输入信号并且给隐藏层的每个神经元传播信息。
然后,隐藏层局部的处理这些信息,并把这些信息传播给输出层。
例如一个输入向量),,,(21m x x x x ,隐藏层中每个神经元的输入和输出信息,表示为j u 和j h ,定义如(1)和(2)所示。
j i mi ij j x W u θ+=∑=1 q j ,,2,1 = (1))ex p(11)(j j j u u f h -+== q j ,,2,1 = (2) 其中,ij W 表示输入神经元i 和隐藏神经元j 之间的权重,j θ指偏差。
输入层也需要处理从隐藏层得到的输入信息,输入层中每个神经元的输入k l 和输出k c 是用(3)和(4)计算:k l =k j qj jk h V γ+∑=1 n k ,,2,1 = (3))ex p(11)(k k k l l f c -+== n k ,,2,1 = (4) 其中,jk v 是隐藏神经元j 和输出神经元k 之间的权重,k γ是偏差。
这是前期过程中一次性通过信息的结束。
权重W ,V 和偏差θ,在前期阶段γ值不会改变。
如果神经网络的实际输出等于输入向量的预期输出,那么就把一个新的输入向量放入神经网络中并且重新启动前期阶段,否则算法进入后期阶段。
实际输出和预期输出之间的差异被称为误差。
在后期阶段, 输出层中神经元k d 的误差用公式(5)计算。
然后, 隐藏层中神经元j e 的误差用公式(6)计算。
)1()(k k k k k c c c y d --= n k ,,2,1 = (5))1()(1j j nk jk k j h h V d e -=∑= q j ,,2,1 = (6)输出层和隐藏层之间的误差逆向传播并且层与层之间的连接权重用(7)式中的逆向误差更新。
使用(8)式更新隐含层和输入层之间的权重。
j k jk jk h N d N V N V )()()1(1α+=+ (7))()()1(1N d N N k k k αγγ+=+i j ij ij x N e N W N W )()()1(2α+=+ (8))()()1(2N e N N j j j αθθ+=+在上面的公式中,其中m i ,,2,1 =;q j ,,2,1 =;n k ,,2,1 =。
1α和2α是0到1 的学习参数。
N 是训练步长ID .一般来说,BP 算法有两种权重更新模式:在线模式和批处理模式。
在线模式中的训练样本是逐个处理的,而批处理模式的所有训练样本是成批处理的。
在一个训练步长中每个样本生成的W ∆逐渐积累(W ∆表示两个训练步长中W ,V ,θ和γ值的改变)。
在此之后,累计W ∆被用于更新链接层之间的权重。
这个训练工作一直持续到满足终止条件。
采用的主要终止条件是均方误差低于特定的阈值或训练步长所到达的有限值。
为了计算总误差,整个训练数据集需要通过神经网络传播。
这样会使反向传播算法在处理大型训练数据集时出现训练慢速度的结果。
4在CNEURAL 中的并行神经网络训练算法在本节中,我们首先分析了广泛使用的并行训练策略。
然后,介绍cNeural 中的并行训练算法及并行计算框架。
A.分析训练神经网络中的并行化策略有很多并行方法可以加速训练神经网络[6]。
大多数的方法可以分为两类:节点并行性和训练数据集并行性。
节点并行性是神经网络定向的。
这些方法通过映射神经元到不同的计算神经节点而实现并行性。
每个计算节点只负责计算一部分神经网络。
[7],[8],[9] 中提出的方法采用这种方式。
相反地,在训练数据集并行性时,每个计算节点在局部范围类有一个完整的神经网络并且对整个神经网络进行计算。
为了并行计算,训练数据集分成若干子集,而且这些字集被分配成不同的计算节点。
不同的并行化方法适合于不同的场景中。
对于节点的并行性,每一个训练样本需要逐步处理节点之间的计算。
它通常用于小型训练数据集和复杂的神经网络结构。
这种方法适合应用在通信成本较低的多核或众核架构中。
当应用在拥有大量训练样本的分布式系统中,系统承受不起I / O 的超负荷开销和集群网络通信成本。
由于I / O 和网络通信是分布式环境的主要时间成本,因此这种方法不是非常高效的。
因此,可节点并行性方法并不适用于分布式计算环境中。
文献[10]中也得出类似的结论。
在另一方面,对训练数据的并行性来说,每个训练数据子集是一个计算节点上处理的,并且在整个训练过程中不需要传给其他的计算节点。
由于训练数据集并行方法可以减少数据访问和网络通信的成本,因此它适用于处理分布式系统中大规模训练数据集。
B. cNeural 中的并行BP 算法和计算框架cNeural 是一种训练大规模数据集的方法。