前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在hadoop2.0上实现深度学习

在hadoop2.0上实现深度学习

作者头像
哒呵呵
发布2018-08-06 17:52:22
9490
发布2018-08-06 17:52:22
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记

又是一篇翻译。

我承认我又偷懒了,只是大概写了下提纲,和完成了第一章节的部分写作。不睡午觉的恶果啊,原本已经写好草稿,讲讲语言和信息的关系,结果,实在是回家后好困。

絮絮叨叨一下,今天偶然看到一篇文章大概是说无人机怎么那么贵,核心论点是明明是这么简单的东西,售价却堪比iphone。想到,有些东西在初看起来是很简单,但是这是在未捅破那层窗户纸之后,比如统计语言模型,看起来只是用到了一些概率论和线代知识,为什么那么多人没想到呢?苦苦地追求规则模型,使得自然语言处理迟迟没有进展,直到那篇草草地博士论文诞生。所以,看起来越简单地东西往往是最难地,但是又是最容易理解的。

在接下来的日子我会不定时更新,大概会讲讲语言和信息,信息的度量,基于统计的自然语言处理,隐马尔科夫模型,矩阵分解,分类算法等等,至于会会讲哪些项目还没想好,不过工具会使用我比较喜欢的R语言。就这样了,最后唠叨一句,所有的熬夜和加班都不值得赞赏,那只是你无效率或者是低能的表现,以此自勉。

在这里,我们讨论如何在一个Hadoop集群中实施和部署深度学习,一个顶尖的机器学习框架,而且提供了该算法如何在分布式系统中适应并运行的细节,并给出了在标准数据集上运行算法的结果。

Deep belief network

Deep belief network(DBN)是通过以贪心,无监督的方式堆积(stacking)和训练(training)限制玻尔兹曼机器(RBM)获得的图模型。DBNs通过训练提取藉由对观察向量x与第一隐藏层hk(hidden layer)的联合分布进行建模的训练数据的深层次表示,公式如下。其中每个隐藏层的分布是紧接它的上一层的条件:

方程式1:DBN分布

输入层和隐藏层之间的关系可以在下图中观察到。在高等级中,第一层被训练为对原始输入x建模的RBM。输入是用稀疏二元矢量去表示已被分类的数据,例如一个数字的二值图像。后续层是使用经过变换的数据(样本或平均激活)作为来自先前层的训练样本进行训练。层数可以凭经验确定以获得最佳模型性能,并且DBN支持任意多个层。

图1:DBN层

以下代码显示了进入RBM的训练。对于提供给RBM的输入数据是经过多次预定义迭代(predefined epochs)之后的。输入数据被分成小批量,并且为每个层计算权重,激活和增量:

在训练所有层之后,使用有监督的训练标准对深度网络的参数进行微调。例如,有监督的训练标准可以被构造为一个分类问题,然后允许使用深度网络来解决分类问题。采用更复杂的监督标准也能提供一些有趣的结果,例如场景分析(比如解释图片中存在什么对象)。

基本架构

深度学习受到了极大的关注,不仅仅因为它可以提供优于其他学习算法的结果,而且还因为它可以在分布式系统上运行并进行处理大规模数据集。深层网络有两个并行的主要级别 - 层级和数据级。对于层级的并行化,许多实现使用GPU阵列来并行计算层激活并且频繁地同步它们。然而,因为高昂的网络成本这种方法不适合于数据可以保留在由网络连接的多个机器上的集群。数据级并行化(训练(training)与数据子集的并行化)更适合这些系统。Paypal的大部分数据存储在Hadoop集群中,因此能够在这些集群中运行算法是我们的首要任务。专用集群的运维也是我们考虑的一个重要因素。然而,由于深层学习本质上是自身的迭代,如MapReduce的经典算法不适合运行这些算法。但随着Hadoop 2.0和基于Yarn的资源管理的出现,我们可以编写迭代应用程序了,因为我们可以很好地控制应用程序正在使用的资源。我们修改了IterativeReduce,这是一个用于在Hadoop YARN中编写迭代算法的简单抽象,并且能够将其部署到运行Hadoop 2.4.1的PayPal集群之一。

方法

我们实现了Hinton的核心深度学习算法。由于我们的要求是分布可用于在多机器集群上运行的算法,所以我们针对这样的设置调整它们的算法。为了在多台机器上分布算法,我们遵循Grazia等人提出的指南。以下是我们实施的详细概要:

  1. 主节点初始化RBM的权重
  2. 主节点将权重和分支推送到工作节点。
  3. 工作者训练1个数据集迭代的RBM层,即完整地遍历整个分支,并将更新的权重发送回主节点。
  4. 主节点平均给定迭代的所有工作者的权重。
  5. 对给定的预定义的迭代集(在我们设置为50)重复步骤3-5。
  6. 在完成步骤6之后,一层训练完。对于后续的RBM层重复这些步骤。
  7. 在训练所有层之后,使用误差反向传播对深度网络进行微调。

下图描述了运行深度学习算法时的单个数据集迭代(步骤3-5)。同时,我们注意到,这个例子可以用于实现大量的机器学习算法,这些算法本质上是迭代的。

图2:训练的单个数据集时代

以下代码段显示了在单个机器中训练DBN所涉及的步骤。数据集首先分为多个批次。 然后,多个RBM层按顺序初始化和训练。在RBM被训练之后,它们被传递到使用误差反向传播的微调阶段。

我们为YARN“管道”的修改了IterativeReduce大部分的执行过程。我们对执行过程进行了重大改进,以使其可用于我们的深度学习实现。IterativeReduce执行过程是为Cloudera Hadoop发行版而编写的,我们重建平台来使其适应标准的Apache Hadoop发行版。我们还重写了实现了标准编程模型。特别是,我们使用YarnClientAPI在客户端应用程序和ResourceManager之间进行通信。 我们还使用AMRMClient和AMNMClient来实现ApplicationMaster和ResourceManager和NodeManager之间的交互。

我们首先使用YarnClient API向YARN资源管理器提交应用程序:

提交应用程序后,YARN资源管理器启动主机程序。主机程序负责根据需要分配和释放工作容器。主机程序使用AMRMClient与资源管理器通信。

主机使用NMClient API从主机程序接收到的容器中运行命令

一旦主机程序启动其需要的工作容器,它就设置一个端口与工作者进行通信。对于我们的深度学习实现,我们添加了所需的参数初始化,逐层训练和微调信号到原始IterativeReduce接口方法。IterativeReduce使用Apache Avro IPC进行Master-Worker通信。

以下代码片段显示了分布式训练中的主工作节点涉及的一系列步骤。主机程序将初始参数发送给工作者,然后工作者在其部分数据上训练RBM。工作者完成训练后,将结果发送回主机程序,最后将结果合并。迭代完成后,主机通过启动反向传播微调阶段完成该过程。

结果

我们使用MNIST手写数字识别来评估深度学习实现的性能。数据集包含手动标记的范围从0-9的手写数字。训练集由60,000个图像组成,测试集由10,000个图像组成。

为了测量性能,DBN首先经过预训练,然后在60,000个训练图像上进行微调。 在上述步骤之后,然后在10,000个测试图像上评价DBN。在训练或评价期间对图像没有进行预处理。错误率通过计算错误分类图像的总数与测试集上的图像的总数之间的比率获得。

当在每个RBM中使用每个都具有500-500-2000个隐藏单元的RBM并使用10节点分布式集群系统时,我们能够实现最佳分类错误率是1.66%。误差率与原始算法的作者(具有500-500-2000个隐藏单位)报告的1.2%的误差率相当。我们注意到,原始实现是在单个机器上,我们的是实现在分布式系统。参数平均步骤会使得性能的轻微降低,尽管在多个机器上分布算法的好处远远超过性能减少。下表总结了在10节点集群上运行时每个层中隐藏单元数的错误率变化。

表1:MNIST性能评估

另外,这是一个任性的不为读者着想的工作号,只为提高和知识的传播。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档