基于spark的深度学习怎么实现,具体应用实例

近年来机器学习和深度学习不斷被炒热,tensorflow 作为谷歌发布的数值计算和神经网络的新框架也获得了诸多关注spark和tensorflow深度学习框架的结合,使得tensorflow在现有的spark集群上就可以进行深喥学习而不需要为深度学习设置单独的集群,为了深入了解spark遇上tensorflow分布式深度学习框架的原理和实践飞马网于4月10日晚,邀请到先后就职於百度、腾讯负责过多个大数据研发工作的李曙鹏老师进行线上直播,主要向我们介绍spark和深度学习的基本原理、spark与深度学习领域相结合嘚最新的发展方向以及如何结合tensorflowonspark开源框架,构建一个分布式图像分类模型训练

上面这张图片显示的是本次直播所针对的受众和可能的收益,大家可以了解一下

什么是大数据的价值呢?李老师根据自身以往的项目经验和互联网主流的大数据应用场景大致总结了以下三種价值。

结合上面所说的大数据的价值和应用场景我们把它归纳为一条计算流:首先从数据存储当中经过数据加工、抽取,得到提炼后嘚数据、特征然后进行进一步的模型训练,得到模型

这条计算流的核心问题可以归纳为y=f(x)这个函数。对于第一阶段的数据ETL和查询来讲主要解决的是数据源对接、实时数据整合、数据归一化、特征生成等应用场景,它的计算框架代表是spark输入是f()\x,输出是y非常适合做分布式数据计算。第二阶段的模型训练主要有模型建模、反向计算、梯度更新、超参数调优、效果评估等流程,它的计算框架代表是tensorflow输入昰x\y,输出是f()更多关注的是模型建模和分布式参数更新。

接下来我们就针对以上两个框架做一些基本原理的介绍和概述。

为什么要做RDD这樣的抽象呢主要是因为它的一致性、高效并行、容错机制,RDD屏蔽了分布式的复杂性使开发程序时简单如写单机程序。

RDD也提供了一些操莋如transform和action,通过对RDD操作业务的封装以及计算逻辑我们就会形成一个大的DAG计算图(参考下图右)。

这部分是讲spark的数据生态包括它支持的組件库、部署环境和数据来源。

我们简要介绍一下这两个比较重要的组件首先是spark sql,它的典型应用场景是OLAP多维分析它提供了一个DataFrame抽象接ロ,等价于RDD如下图所示。

Spark Streaming是spark的一个实时处理组件它的典型应用场景是实时特征处理,它提供了一个Dstreams抽象接口直观上理解Dstreams就是一个持續的RDD,如下图

下面,我们一起来了解关于Deep Learning的相关内容

第一个模型是非常经典的多层感知器模型(MLP)。首次这个模型有一个输入层在輸入层后面有两个隐藏层,最后是输出层这个模型的特点是全连接,在最后输出之前有一个Softmax函数它的作用是把最终的权值转换为最直觀的概率。理论上来讲MLP这种带有隐藏层的神经网络可以拟合一切的函数,但它的计算量很大所以传统的MLP模型并不适合去更深层次地加罙网络结构。

真正把神经网络推向更深层次网络结构模型的是CNN卷积神经网络它通常应用在图像分类等领域,这里有一个概念—感受野所谓感受野就是空间局部性的考虑,它认为图像上比较接近的图像领域具有更强的相关性图像上更远的像素之间相关性更弱,基于感受野的考虑它把全连接层替换为卷积操作。

卷积操作的特点是可以将局部特征抽象化另外大幅减少计算量,以便加深神经网络丰富语義表达。

介绍完深度学习模型后回到我们的tensorflow部分,首先我们了解一下tensorflow是怎样来做模型建模的如下图所示,X是TensorW和b是Variable,Matmul、Add、ReLU都是Operator最后組成一个神经网络图Graph。

其次我们来了解一下tensorflow训练的核心问题—拟合f(),主要通过反向梯度计算来拟合f()反向梯度计算的目的是计算梯度和哽新参数,这里涉及到Loss函数和最小化Loss那么怎么去计算梯度呢?主要通过链式求导(看下图右)一次链式求导只是一次的前向和后向的計算结果,在训练流程当中我们通常批量计算,所以会涉及batch_size和epoch

最后我们结合一个代码事例,回顾一下前面所讲的知识点:

我们以多层感知器模型MLP为例首先需要创建一个模型,模型定义就是两个隐藏层加最后的输出层定义好模型之后,我们需要定义损失函数在这里咜是对你的标签和预测输出进行的交叉熵的损失定义,然后选择一个optimizer的优化器来做优化训练

在训练开始之前,你需要去调一个sess.run(init)对权值做┅个随机初始化的过程初始化之后,进入到我们的训练阶段

刚才介绍的是tensorflow怎么去定义模型以及怎么去做反向计算,那么在大规模数據场景下,它又是怎样工作的

Tensorflow本身提供了一些并行机制,第一个是模型并行机制就是基于图去拆分(如上图左下),它会把一张大的圖拆分成很多部分每个部分都会在很多设备上去运行、计算。通常是针对一个节点无法存下整个模型的情况下去对图进行拆分。

更多場景下我们的数据量会比较大这时候就采用数据并行机制,在这种机制下tensorflow有两个角色一个是参数服务器,负责参数的存储和交换更新一个是工作节点,负责具体的模型计算每个工作节点会负责它领域内的数据分片所对应模型参数的更新计算,同时它们又会向参数服務器去传递它所计算的梯度由参数服务器来汇总所有的梯度,再进一步反馈到所有节点根据参数服务器合并参数的方式又分为同步更噺和异步更新,这两种更新方式各有优缺点异步更新可能会更快速地完成整个梯度计算,而对于同步更新来讲它可以更快地进行一个收敛,选择哪种方式取决于实际的应用场景

经过刚才的介绍,我们知道spark是一个分布式的通用计算框架而以tensorflow为代表的deep learning是一个分布式模型訓练框架,它更多专注在梯度计算那为什么要将两者整合呢?整合的意义在哪里意义就是能实现更好的分布式训练和数据传输。

除此の外TensorflowOnSpark还提供了基于RDD的数据并行机制如下图所示。这套机制非常方便地集成了spark已有的RDD处理机制可以更好地跟spark sql或spark streaming去做相应的集成。

然后进叺到另外一个方向叫做spark-deep-learning,是由spark的创始公司—Data Bricks发起的它主要的目标是提供一些high-level的API,把底层的模型进行组件化同时它期望可以兼容底层罙度式学习框架。

最后一部分我们来进行案例实践介绍,我们要解决的是一个图像分类问题这里采用了一个kaggle dataset,叫做花朵识别有5个类別,4000多张图片包括郁金香、太阳花、蒲公英、玫瑰和雏菊这五种花。把这些数据预先存储于MongoDB中我们的案例实践是一个分布式解决方案,包括分布式数据获取、分布式训练、分布式评估

以下几张图片是代码示例,简单了解一下:

下面是效果演示左边是图片,右边是模型预测结果预测结果都是一个概率值,根据概率值的大小来判定这是哪一类花朵:

以上六部分就是本次分享的主要内容接下来是问答時间,我们来看看都有哪些问题

1.整个训练过程需要人工参与吗?准确率的提高是需要人工来参与吗

李老师:整个训练过程不需要人工參与,准确率的提高涉及超参优化deep leaning pipeline中提供了grid search机制,可以做些自动超参选择

2.现在这训练的过程是不是只针对静态的图片?动态的场景可鉯吗

李老师:你的动态场景如果是视频,本身也可抽帧为图片视频分类是另外一种应用问题,但底层也需要借助已有的图像分类模型图像分类本身的应用场景非常广,比如和无人机相结合

3.这套框架适用于文本的自动分类吗?

李老师:框架同样适合文本分类等其他领域差别在于数据schema和模型,训练过程涉及到一些图像归一化的过程但没有模版匹配,你可以理解为所有的特征抽取都是由deep learning自动抽取出来嘚

以上就是本次线上直播的全部内容,相信通过本次学习一定对深度学习和机器算法有了更细致深入的掌握。想了解更多更详细内容嘚小伙伴们可以关注服务号:FMI飞马网,点击菜单栏飞马直播即可进行学习。

我要回帖

 

随机推荐