深入学习Apache Spark和TensorFlow

想要了解更多关于Apache Spark的信息,请在2016年2月在纽约出席Spark东部峰会。

神经网络在过去的几年中取得了惊人的进展,现在它是图像识别和自动翻译领域的领先技术。而 TensorFlow是Google发布的用于数值计算和神经网络的新架构。在这篇博文中,我们将展示如何使用TensorFlow和Spark来训练和应用深度学习模型。

您可能想知道:当大多数高性能深度学习是用单节点来实现时,Apache Spark这使用的是什么?为了回答这个问题,我们介绍了两种使用情况,并解释你可以怎样使用Spark和一组机器来改进TensorFlow的深度学习流程:

  1. 超参数调整:用Spark来寻找神经网络训练的最优超参数集,从而使训练时间减少10倍,错误率低34%。
  2. 按比例部署模型: 基于大数据用Spark应用受训神经网络模型。

超参数调整

深度学习机器学习(ML)技术的一个典型范例是人造神经网络。他们用一个较复杂的输入,如一张照片或一段录音,然后对这些信号采用复杂的数学转换。这个变换输出一个更容易被其他ML算法操作的数字向量。人造神经网络通过模仿人类大脑视觉皮层中的神经元(以一种简化得多的形式)来实现这种转换。

就像人类学着解释他们所看到的东西一样,人造神经网络需要被训练去识别“有趣的”特定图案。比如,这些图案可能是一些简单的图形,例如棱,圆形,但是它们也可能复杂得多。在这里,我们准备使用NIST的经典数据集,训练一个神经网络来识别这些数字:

TensorFlow库自动为神经网络创建各种形状和尺寸的训练算法。然而,构建神经网络的实际过程比在数据集上运行某些函数要复杂得多。通常有许多非常重要的超参数(非专业人员的配置参数)要去设置,这个影响了模型如何被训练。选中了对的参数就会有高性能,而不好的参数则会导致训练时间过长和低性能。在实际运用中,机器学习实践者用不同的超参数多次重复运行相同的模型,以找到最优集。这是一种称为超参数调整的经典技术。

当建立神经网络时,有许多重要的超参数要慎重地选择。例如:

  • 每层神经元的数量:神经元数量太少会降低神经网络的表达能力,但神经元数量太多会大幅增加运行时间并返回噪声估值。
  • 学习率:如果学习率太高,神经网络只会关注最近看到的几个样本,而忽视以前累积的所有经验。如果学习率太低,又需要花过长的时间以达到一个良好的状态。

有趣的是,即使TensorFlow它本身不是分布式的,但超参数调整的过程是“高度并行”的,且它可以被Spark分配。在这种情况下,我们可以使用Spark来传送数据和模型描述等共用元素,然后在一组机器中以容错的方式调度独立重复的运算。

怎么利用Spark提高准确性呢?默认超参数组的准确度是99.2%。在测试集里超参数调优的最佳结果的准确率为99.47%,测试误差减少34%。与添加到集群中的节点数按比例分配线性计算:使用13节点的集群,我们能够并行训练13个模型,相比于在一台机器上每次训练一个模型,这样可以使转换速率加速7倍。以下是关于群集中计算机数量的计算时间(以秒为单位)的柱图:

更重要的是,我们深入了解了训练程序于各种不同的超参数训练的灵敏度。例如,对于不同数量的神经元,我们绘制了有关学习率的最终测试表现图:

这展示了神经网络的一个经典权衡曲线:

  • 学习率是至关重要的:如果学习率太低,神经网络不会学到任何东西(高测试误差)。如果太高,训练进程可能会随机震荡,甚至在一些结构中产生偏离。
  • 神经元的数量对于达到良好的效果并不重要,而神经元多的网络对学习率更敏感。这是Occam's Razon原理:对于大部分目标,更简单的模型趋向于“够好了”。如果您有时间和资源去处理这错过的1%的测试误差,那么您得乐意在训练中投入大量的资源,并找到合适的超参数来产生效果。

利用参数的稀疏样本,我们可以将最有希望的一组参数归零。

我如何使用它?

由于TensorFlow可以使用每个工作者的所有内核,我们在每个工作者上一次只能运行一个任务,并将他们批处理以减少冲突。按照TensorFlow网站上的说明, TensorFlow库可以作为常规Python库被设置在在Spark集群。下面的笔记展示了如何安装TensorFlow并让用户重新运行这篇博文的实验:

按比例部署模型

TensorFlow模型可以直接嵌入流程中,以便对数据集执行复杂的识别任务。例如,我们展示了如何从一个已被训练好股票神经网络模型中标记一组图像。

用Spark内置的传送机制,这个模型首先被分配给集群的工作者:

  with gfile.FastGFile( ‘classify_image_graph_def.pb’, ‘rb’) as f:
  model_data = f.read()
  model_data_bc = sc.broadcast(model_data)

然后这个模型被加载到每个节点上,被应用到图像中。这里是一个被运行在每个节点上的概要代码:

def apply_batch(image_url):
  # Creates a new TensorFlow graph of computation and imports the model
  with tf.Graph().as_default() as g:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(model_data_bc.value)
    tf.import_graph_def(graph_def, name=”)
    # Loads the image data from the URL:
    image_data = urllib.request.urlopen(img_url, timeout=1.0).read()
    # Runs a tensor flow session that loads the
    with tf.Session() as sess:
      softmax_tensor = sess.graph.get_tensor_by_name(‘softmax:0’)
      predictions = sess.run(softmax_tensor, {‘DecodeJpeg/contents:0’: image_data})
      return predictions

这个代码可以通过把凑图片拼凑在一起而变得高效。

这里有个图片的例子:

这是根据神经网络对这个图像的解释,这是相当准确的:

(‘coral reef’, 0.88503921),
   (‘scuba diver’, 0.025853464),
   (‘brain coral’, 0.0090828091),
   (‘snorkel’, 0.0036010914),
   (‘promontory, headland, head, foreland’, 0.0022605944)])

前景展望

我们展示了如何结合Spark和TensorFlow在手写数字识别和图像标记上来训练和部署神经网络。尽管我们使用的神经网络框架只能在单节点中工作,但我们可以使用Spark来分配超参数调整进程和部署模型。这不仅减少了训练时间,而且提高了准确性,使我们更好地理解各种超参数的灵敏度。

虽然这个支持目前只在Python上适用,但我们期望在TensorFlow和其他部分Spark框架之间提供更深的一体化。

免费试用Databricks。从今天开始

本文的版权归 林纾燊 所有,如需转载请联系作者。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能

作为TensorFlow的底层语言,你会用C+构建深度神经网络吗?

选自Matrices.io 作者:Florian Courtial 机器之心编译 参与:李泽南、蒋思源 很多人都知道 TensorFlow 的核心是构建在 C+...

30780
来自专栏人工智能

Tensorflow新手通过PlayGround可视化初识神经网络

北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 ? NVIDIA 深度学习学院 带你快速进入火热的DL领域 正文共179...

25280
来自专栏企鹅号快讯

晚上好啊!这是今天人工智能精选要闻

作者|震霆 总第2017098期 出品|遇见人工智能 公众号 GOwithAI 北京市首个无人驾驶试运营基地落户顺义 今天,顺义区无...

25470
来自专栏人工智能

TensorFlow核心使用要点

正文之前,小梦先来说说什么是TensorFlow。TensorFlow是谷歌研发的第二代人工智能学习系统,可被用于语音识别或图像识别等多项机器深度学 习领域。T...

25670
来自专栏人工智能

深度学习轻松学:如何用可视化界面来部署深度学习模型

翻译 | AI科技大本营 参与 | 王赫 上个月,我有幸结识了 DeepCognition.ai 的创始人。 Deep Cognition (深度认知) 建立的...

47170
来自专栏xingoo, 一个梦想做发明家的程序员

Windows下TensorFlow安装指南(图文版)

随着深度学习概念火起来,TensorFlow也跟着成为业界流行的深度学习框架。它采用CPU+GPU的并行计算模式,使得神经网络可以有效的并行计算,从以前的三层...

25950
来自专栏编程

10x Python开发者必读:本月Python文章TOP 10

翻译 | AI科技大本营 参与 | 刘畅 编辑 | Donna 【AI科技大本营导语】Medium热门博客Mybridge AI例行评出本月10篇有助于提升你职...

25670
来自专栏应用案例

关于机器学习,这可能是目前最全面最无痛的入门路径和资源!

之前搞机器学习的那帮人都喜欢用Python,所以Python慢慢就积攒了很多优秀的机器学习库,所谓的库,你就理解为别人封装好的一些具有某些功能的模块,我们可以通...

36970
来自专栏企鹅号快讯

无人驾驶系列——深度学习笔记:Tensorflow基本概念

随着无人驾驶的火爆,深度学习在无人驾驶中的应用受到广泛关注,我在工作中对此有所接触,因此进行了相关学习和整理,给大家大家可以参考。 ? TensorFlow深度...

27060
来自专栏企鹅号快讯

无人驾驶系列——深度学习笔记:Tensorflow的安装-windows系统

前言 近期由个人工作的需要,着手开始研究深度学习相关的内容。也是小白一枚,希望通过文字来记录自己学习过程中踩的坑,给看到的人一点帮助。 ? 目前深度学习框架中,...

32390

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励