近年来,机器学习和深度学习不断被炒热,tensorflow 做为谷歌发布的数值计算和神经网络的新框架也得到了诸多关注,spark和tensorflow深度学习框架的结合,使得tensorflow在现有的spark集群上就能够进行深度学习,而不须要为深度学习设置单独的集群,为了深刻了解spark赶上tensorflow分布式深度学习框架的原理和实践,飞马网于4月10日晚,邀请到前后就任于百度、腾讯,负责过多个大数据研发工做的李曙鹏老师进行线上直播,主要向咱们介绍spark和深度学习的基本原理、spark与深度学习领域相结合的最新的发展方向,以及如何结合tensorflowonspark开源框架,构建一个分布式图像分类模型训练。算法
如下是本次分享实录:sql
上面这张图片显示的是本次直播所针对的受众和可能的收益,你们能够了解一下。服务器
一.大数据的价值微信
什么是大数据的价值呢?李老师根据自身以往的项目经验和互联网主流的大数据应用场景,大体总结了如下三种价值。网络
二.计算的核心问题框架
结合上面所说的大数据的价值和应用场景,咱们把它概括为一条计算流:首先从数据存储当中通过数据加工、抽取,获得提炼后的数据、特征,而后进行进一步的模型训练,获得模型。机器学习
这条计算流的核心问题能够概括为y=f(x)这个函数。对于第一阶段的数据ETL和查询来说,主要解决的是数据源对接、实时数据整合、数据归一化、特征生成等应用场景,它的计算框架表明是spark,输入是f()\x,输出是y,很是适合作分布式数据计算。第二阶段的模型训练,主要有模型建模、反向计算、梯度更新、超参数调优、效果评估等流程,它的计算框架表明是tensorflow,输入是x\y,输出是f(),更多关注的是模型建模和分布式参数更新。异步
接下来,咱们就针对以上两个框架作一些基本原理的介绍和概述。分布式
三.spark概述函数
1.spark的核心抽象:RDD
为何要作RDD这样的抽象呢?主要是由于它的一致性、高效并行、容错机制,RDD屏蔽了分布式的复杂性,使开发程序时简单如写单机程序。
RDD也提供了一些操做,如transform和action,经过对RDD操做业务的封装以及计算逻辑,咱们就会造成一个大的DAG计算图(参考下图右)。
2.spark的大数据生态:
这部分是讲spark的数据生态,包括它支持的组件库、部署环境和数据来源。
3.Spark SQL和Spark Streaming:
咱们简要介绍一下这两个比较重要的组件,首先是spark sql,它的典型应用场景是OLAP多维分析,它提供了一个DataFrame抽象接口,等价于RDD,以下图所示。
Spark Streaming是spark的一个实时处理组件,它的典型应用场景是实时特征处理,它提供了一个Dstreams抽象接口,直观上理解Dstreams就是一个持续的RDD,以下图。
四.Deep Learning概述
下面,咱们一块儿来了解关于Deep Learning的相关内容。
1.Deep Learning模型:
第一个模型是很是经典的多层感知器模型(MLP)。首次这个模型有一个输入层,在输入层后面有两个隐藏层,最后是输出层。这个模型的特色是全链接,在最后输出以前有一个Softmax函数,它的做用是把最终的权值转换为最直观的几率。理论上来说,MLP这种带有隐藏层的神经网络能够拟合一切的函数,但它的计算量很大,因此传统的MLP模型并不适合去更深层次地加深网络结构。
真正把神经网络推向更深层次网络结构模型的是CNN卷积神经网络,它一般应用在图像分类等领域,这里有一个概念—感觉野,所谓感觉野就是空间局部性的考虑,它认为图像上比较接近的图像领域具备更强的相关性,图像上更远的像素之间相关性更弱,基于感觉野的考虑,它把全链接层替换为卷积操做。
卷积操做的特色是能够将局部特征抽象化,另外大幅减小计算量,以便加深神经网络,丰富语义表达。
2.Tensorflow模型建模与训练:
介绍完深度学习模型后,回到咱们的tensorflow部分,首先咱们了解一下tensorflow是怎样来作模型建模的。以下图所示,X是Tensor,W和b是Variable,Matmul、Add、ReLU都是Operator,最后组成一个神经网络图Graph。
其次,咱们来了解一下tensorflow训练的核心问题—拟合f(),主要经过反向梯度计算来拟合f(),反向梯度计算的目的是计算梯度和更新参数,这里涉及到Loss函数和最小化Loss。那么怎么去计算梯度呢?主要经过链式求导(看下图右)。一次链式求导只是一次的前向和后向的计算结果,在训练流程当中,咱们一般批量计算,因此会涉及batch_size和epoch。
最后咱们结合一个代码事例,回顾一下前面所讲的知识点:
咱们以多层感知器模型MLP为例,首先须要建立一个模型,模型定义就是两个隐藏层加最后的输出层,定义好模型以后,咱们须要定义损失函数,在这里它是对你的标签和预测输出进行的交叉熵的损失定义,而后选择一个optimizer的优化器来作优化训练,
在训练开始以前,你须要去调一个sess.run(init)对权值作一个随机初始化的过程,初始化以后,进入到咱们的训练阶段。
3.Tensorflow分布式训练机制:
刚才介绍的是tensorflow怎么去定义模型以及怎么去作反向计算,那么,在大规模数据场景下,它又是怎样工做的?
Tensorflow自己提供了一些并行机制,第一个是模型并行机制,就是基于图去拆分(如上图左下),它会把一张大的图拆分红不少部分,每一个部分都会在不少设备上去运行、计算。一般是针对一个节点没法存下整个模型的状况下,去对图进行拆分。
更多场景下咱们的数据量会比较大,这时候就采用数据并行机制,在这种机制下tensorflow有两个角色,一个是参数服务器,负责参数的存储和交换更新,一个是工做节点,负责具体的模型计算。每一个工做节点会负责它领域内的数据分片所对应模型参数的更新计算,同时它们又会向参数服务器去传递它所计算的梯度,由参数服务器来汇总全部的梯度,再进一步反馈到全部节点,根据参数服务器合并参数的方式又分为同步更新和异步更新,这两种更新方式各有优缺点,异步更新可能会更快速地完成整个梯度计算,而对于同步更新来说,它能够更快地进行一个收敛,选择哪一种方式取决于实际的应用场景。
五.Deep Learning On Spark
通过刚才的介绍,咱们知道spark是一个分布式的通用计算框架,而以tensorflow为表明的deep learning是一个分布式模型训练框架,它更多专一在梯度计算,那为何要将二者整合呢?整合的意义在哪里?意义就是能实现更好的分布式训练和数据传输。
针对分布式训练的场景,雅虎开源了TensorflowOnSpark的开源框架,它主要实现tensorflow可以与spark相结合作分布式训练。同时也有其它的一些机制,例如,CaffeOnSpark、MMLSpark(CNTK)、PaddleOnSpark。
TensorflowOnSpark解决的核心问题是将spark做为分布式tensorflow的底层调动机制,经过spark executor去把tensorflow的进程调动起来,这样在进行tensorflow训练时就不须要手动地去组建网络。它也提供了一个API,经过调TFCluster.run这样一个API,能够快速得到tensorflow的一个分布式训练环境。
除此以外TensorflowOnSpark还提供了基于RDD的数据并行机制,以下图所示。这套机制很是方便地集成了spark已有的RDD处理机制,能够更好地跟spark sql或spark streaming去作相应的集成。
而后进入到另一个方向,叫作spark-deep-learning,是由spark的创始公司—Data Bricks发起的,它主要的目标是提供一些high-level的API,把底层的模型进行组件化,同时它指望能够兼容底层深度式学习框架。
这里有个“Transfer Learning as a Pipeline”的例子供你们了解,以下图所示:
TensorflowOnSpark Pipeline开发了两个API,一个是TFEstimator,另外一个是TFModel,提供了这两个以后,你能够直接把它们集成到spark-deep-learning pipeline里面,进行进一步的训练。
六.TensorflowOnSpark案例实践
最后一部分,咱们来进行案例实践介绍,咱们要解决的是一个图像分类问题,这里采用了一个kaggle dataset,叫作花朵识别,有5个类别,4000多张图片,包括郁金香、太阳花、蒲公英、玫瑰和雏菊这五种花。把这些数据预先存储于MongoDB中。咱们的案例实践是一个分布式解决方案,包括分布式数据获取、分布式训练、分布式评估。
如下几张图片是代码示例,简单了解一下:
下面是效果演示,左边是图片,右边是模型预测结果,预测结果都是一个几率值,根据几率值的大小来断定这是哪一类花朵:
以上六部分就是本次分享的主要内容,接下来是问答时间,咱们来看看都有哪些问题。
1.整个训练过程须要人工参与吗?准确率的提升是须要人工来参与吗?
李老师:整个训练过程不须要人工参与,准确率的提升涉及超参优化,deep leaning pipeline中提供了grid search机制,能够作些自动超参选择。
2.如今这训练的过程是否是只针对静态的图片?动态的场景能够吗?
李老师:你的动态场景若是是视频,自己也可抽帧为图片,视频分类是另一种应用问题,但底层也须要借助已有的图像分类模型,图像分类自己的应用场景很是广,好比和无人机相结合。
3.这套框架适用于文本的自动分类吗?
李老师:框架一样适合文本分类等其余领域,差异在于数据schema和模型,训练过程涉及到一些图像归一化的过程,但没有模版匹配,你能够理解为全部的特征抽取都是由deep learning自动抽取出来的。
以上就是本次线上直播的所有内容,相信经过本次学习,必定对深度学习和机器算法有了更细致深刻的掌握。想了解更多更详细内容的小伙伴们,能够关注服务号:FMI飞马网,点击菜单栏飞马直播,便可进行学习。