12 大深度学习框架的入门项目

概述

开源框架总览:现如今开源生态非常完善,深度学习相关的开源框架众多,光是为人熟知的就有 caffe,tensorflow,pytorch/caffe2,keras,mxnet,paddldpaddle,theano,cntk,deeplearning4j,matconvnet 等。如何选择最适合你的开源框架是一个问题。一个合格的深度学习算法工程师怎么着得熟悉其中的 3 个以上吧。下面是各大开源框架的一个总览。

开源框架总览
开源框架总览

在这里我们还有一些框架没有放上来,是因为它们已经升级为大家更喜欢或者使用起来更加简单的版本,比如从 torch->pytorch,从 theano 到 lasagne。另外这些框架都支持 CUDA ,因此编程语言这里也没有写上 cuda 。

在选择开源框架时,要考虑很多原因,比如开源生态的完善性,比如自己项目的需求,比如自己熟悉的语言。当然,现在已经有很多开源框架之间进行互转的开源工具如 MMDNN 等,也降低了大家迁移框架的学习成本。

除此之外还有 tiny-dnn,ConvNetJS,MarVin,Neon 等等小众,以及 CoreML 等移动端框架,就不再一一介绍。总的来说对于选择什么样的框架,有三可以给出一些建议。

  1. 不管怎么说,tensorflow/pytorch 你都必须会,是目前开发者最喜欢,开源项目最丰富的框架。
  2. 如果你要进行移动端算法的开发,那么 Caffe 是不能不会的。
  3. 如果你非常熟悉 Matlab,matconvnet 你不应该错过。
  4. 如果你追求高效轻量,那么 darknet 和 mxnet 你不能不熟悉。
  5.  如果你很懒,想写最少的代码完成任务,那么用 keras 吧。
  6. 如果你是 java 程序员,那么掌握 deeplearning4j 没错的。

其他的框架,也自有它的特点,大家可以自己多去用用。

如何学习开源框架

要掌握好一个开源框架,通常需要做到以下几点:

  •  熟练掌握不同任务数据的准备和使用。
  • 熟练掌握模型的定义。
  • 熟练掌握训练过程和结果的可视化。
  • 熟练掌握训练方法和测试方法。

一个框架,官方都会开放有若干的案例,最常见的案例就是以 MNISI 数据接口+预训练模型的形式,供大家快速获得结果,但是这明显还不够,学习不应该停留在跑通官方的 demo 上,而是要解决实际的问题。我们要学会从自定义数据读取接口,自定义网络的搭建,模型的训练,模型的可视化,模型的测试与部署等全方位进行掌握。这是一个二分类任务,给大家准备了500 张微笑表情的图片、500 张无表情的图片,放置在 git 工程的data 目录下,图片预览如下,已经全部缩放到 60*60 的大小:

这是无表情的图片:

无表情的图片
无表情的图片

这是微笑表情的图片:

微笑表情的图片
微笑表情的图片

因此,我们的目标就是利用这 500 张图片完成好这个图像分类任务。

在下面的所有框架的学习过程中,我们都要完成下面这个流程,只有这样,才能叫做真正的完成了一个训练任务。

流程
流程

另外,所有的框架都使用同样的一个模型,这是一个 3 层卷积 +2 层全连接的网络,由卷积+BN 层+激活层组成,有的使用带步长的卷积,有的使用池化,差别不大。

  • 输入图像,48*48*3 的 RGB 彩色图。
  • 第一层卷积,通道数 12,卷积核 3*3。
  • 第二层卷积,通道数 24,卷积核 3*3。
  • 第三层卷积,通道数 48,卷积核 3*3。
  • 第一层全连接,通道数 128。
  • 第二层全连接,通道数 2,即类别数。

网络结构如下:

网络结构
网络结构

这是最简单的一种网络结构,优化的时候根据不同的框架,采用了略有不同的方案。因为此处的目标不是为了比较各个框架的性能,所以没有刻意保持完全一致。

开源框架

下面我们开始对各个框架进行简述。

1.  Caffe

概述:Caffe 是伯克利的贾扬清主导开发,以 C++/CUDA 代码为主,最早的深度学习框架之一,比TensorFlow、Mxnet、Pytorch 等都更早,需要进行编译安装。支持命令行、Python 和 Matlab 接口,单机多卡、多机多卡等都可以很方便的使用。目前 master 分支已经停止更新,intel 分支等还在维护,caffe  框架已经非常稳定。

caffe 的使用通常是下面的流程:

caffe
caffe

以上的流程相互之间是解耦合的,所以 caffe 的使用非常优雅简单。

caffe 有很明显的优点和缺点。

优点:

  • 以 C++/CUDA/python 代码为主,速度快,性能高。
  • 工厂设计模式,代码结构清晰,可读性和拓展性强。
  • 支持命令行、Python 和 Matlab 接口,使用方便。
  • CPU 和 GPU 之间切换方便,多 GPU 训练方便。
  • 工具丰富,社区活跃。

缺点:

  • 源代码修改门槛较高,需要实现前向反向传播,以及 CUDA 代码。
  • 不支持自动求导。
  • 不支持模型级并行,只支持数据级并行
  • 不适合于非图像任务。
caffe
caffe

2. Tensorflow

概述:TensorFlow 是 Google brain 推出的开源机器学习库,可用作各类深度学习相关的任务。TensorFlow = Tensor + Flow,Tensor 就是张量,代表 N 维数组,这与 Caffe 中的 blob 是类似的;Flow  即流,代表基于数据流图的计算。

特点:TensorFlow 最大的特点是计算图,即先定义好图,然后进行运算,所以所有的 TensorFlow 代码,都包含两部分:

  • 创建计算图,表示计算的数据流。它做了什么呢?实际上就是定义好了一些操作,你可以将它看做是Caffe 中的 prototxt 的定义过程。
  • 运行会话,执行图中的运算,可以看作是 Caffe 中的训练过程。只是 TensorFlow 的会话比 Caffe 灵活很多,由于是 Python 接口,取中间结果分析,Debug 等方便很多。
tensorflow
tensorflow

3 . Pytorch

概述:一句话总结 Pytorch = Python + Torch。Torch 是纽约大学的一个机器学习开源框架,几年前在学术界非常流行,包括 Lecun 等大佬都在使用。但是由于使用的是一种绝大部分人绝对没有听过的 Lua 语言,导致很多人都被吓退。后来随着 Python 的生态越来越完善,Facebook 人工智能研究院推出了 Pytorch 并开源。Pytorch 不是简单的封装 Torch 并提供Python 接口,而是对 Tensor 以上的所有代码进行了重构,同 TensorFlow 一样,增加了自动求导。

后来 Caffe2 全部并入 Pytorch,如今已经成为了非常流行的框架。很多最新的研究如风格化、GAN 等大多数采用 Pytorch 源码。

特点:

  • 动态图计算。TensorFlow 从静态图发展到了动态图机制 Eager Execution ,pytorch 则一开始就是动态图机制。动态图机制的好处就是随时随地修改,随处 debug ,没有类似编译的过程。
  • 简单。相比 TensorFlow1.0 中 Tensor、Variable、Session 等概念充斥,数据读取接口频繁更新,tf.nn、tf.layers、tf.contrib 各自重复,Pytorch 则是从 Tensor 到 Variable 再到 nn.Module ,最新的Pytorch 已经将 Tensor 和 Variable 合并,这分别就是从数据张量到网络的抽象层次的递进。有人调侃TensorFlow 的设计是 “make it complicated” ,那么 Pytorch 的设计就是 “keep it simple”。
pytorch
pytorch

4 . Mxnet

概述:  Mxnet 是由李沐等人领导开发的非常灵活,扩展性很强的框架,被 Amazon 定为官方框架。

特点:  Mxnet 同时拥有命令式编程和符号式编程的特点。在命令式编程上 MXNet 提供张量运算,进行模型的迭代训练和更新中的控制逻辑;在声明式编程中 MXNet 支持符号表达式,用来描述神经网络,并利用系统提供的自动求导来训练模型。Mxnet 性能非常高,推荐资源不够的同学使用。

Mxnet
Mxnet

5.  Keras

概述:  Keras 是一个对小白用户非常友好而简单的深度学习框架,严格来说并不是一个开源框架,而是一个高度模块化的神经网络库。

Keras 在高层可以调用 TensorFlow,CNTK,Theano ,还有更多的库也在被陆续支持中。 Keras 的特点是能够快速实现模型的搭建,是高效地进行科学研究的关键。

特点:

  •  高度模块化,搭建网络非常简洁。
  •   API 很简单,具有统一的风格。
  •  容易扩展,只需使用 python 添加新类和函数。
Keras
Keras

6.  Paddlepaddle

概述:  正所谓 Google 有 Tensorflow,Facebook 有 Pytorch,Amazon 有 Mxnet,作为国内机器学习的先驱,百度也有 PaddlePaddle,其中 Paddle 即 Parallel Distributed Deep Learning (并行分布式深度学习)。

特点:  paddlepaddle 的性能也很不错,整体使用起来与 tensorflow 非常类似,拥有中文帮助文档,在百度内部也被用于推荐等任务。另外,配套了一个可视化框架 visualdl,与 tensorboard 也有异曲同工之妙。国产框架不多,大家多支持啊!

paddlepaddle
paddlepaddle

7.  CNTK

概述:  CNTK 是微软开源的深度学习工具包,它通过有向图将神经网络描述为一系列计算步骤。在有向图中,叶节点表示输入值或网络参数,而其他节点表示其输入上的矩阵运算。

CNTK 允许用户非常轻松地实现和组合流行的模型,包括前馈 DNN,卷积网络(CNN)和循环网络(RNN / LSTM)。与目前大部分框架一样,实现了自动求导,利用随机梯度下降方法进行优化。

特点:

  • CNTK 性能较高,按照其官方的说法,比其他的开源框架性能都更高。
  • 适合做语音,CNTK 本就是微软语音团队开源的,自然是更合适做语音任务,使用 RNN 等模型,以及在时空尺度分别进行卷积非常容易。
cntk
cntk

8.  Matconvnet

概述:  不同于各类深度学习框架广泛使用的语言 Python,MatConvnet 是用 matlab 作为接口语言的开源深度学习库,底层语言是 cuda。

特点:  因为是在 matlab 下面,所以 debug 的过程非常的方便,而且本身就有很多的研究者一直都使用 matlab 语言,所以其实该语言的群体非常大。

matconvnet
matconvnet

9. Deeplearning4j

概述:  不同于深度学习广泛应用的语言 Python,DL4J 是为 java 和 jvm 编写的开源深度学习库,支持各种深度学习模型。

特点:  DL4J 最重要的特点是支持分布式,可以在 Spark 和 Hadoop 上运行,支持分布式 CPU 和 GPU 运行。DL4J 是为商业环境,而非研究所设计的,因此更加贴近某些生产环境。

Deeplearning4j
Deeplearning4j

10 .  Chainer

概述:  chainer 也是一个基于 python 的深度学习框架,能够轻松直观地编写复杂的神经网络架构,在日本企业中应用广泛。

特点:  chainer 采用 “Define-by-Run” 方案,即通过实际的前向计算动态定义网络。更确切地说,chainer 存储计算历史而不是编程逻辑,pytorch 的动态图机制思想主要就来源于 chaine

chainer
chainer

11 .  Lasagne/Theano

概述:  Lasagen 其实就是封装了 theano,后者是一个很老牌的框架,在 2008 年的时候就由 Yoshua Bengio 领导的蒙特利尔 LISA 组开源了。

特点:  theano 的使用成本高,需要从底层开始写代码构建模型,Lasagen 对其进行了封装,使得 theano 使用起来更简单。

Theano
Theano

12 .  Darknet

概述:  Darknet 本身是 Joseph Redmon 为了 Yolo 系列开发的框架。
Joseph Redmon 提出了 Yolo v1,Yolo v2,Yolo v3。

特点:  Darknet 几乎没有依赖库,是从 C 和 CUDA 开始撰写的深度学习开源框架,支持 CPU 和 GPU。Darknet跟 caffe 颇有几分相似之处,却更加轻量级,非常值得学习使用。

Darknet
Darknet

PyTorch 更新,正式支持TensorBoard

与 2018 年 12 月正式发布的 Pytorch1.0 相比,这次发布的 1.1 版本提高了性能,并增加了新的模型理解和可视化工具,来提高可用性,还提供了新的 API。

其中,最重要的功能是支持 TensorBoard,它是谷歌为 TensorFlow 打造的可视化工具,能够帮助开发人员评估和调试模型。

根据 Facebook 介绍,在开发这一功能的时候,他们与谷歌有非常密切的合作。

其他的更新还有:

  • Jit 编译器:改进了Just-in-time (JIT) 编译。包括各种错误的修复以及 TorchScript 中扩展的功能,例如对字典、用户类和属性的支持。
  • 新 API:支持布尔张量,更好地支持自定义循环神经网络。
  • 分布式训练:改进了常见模型(如CNN)的性能,增加了对多设备模块的支持,包括在仍使用分布式数据并行(DDP)的情况下跨 GPU 分割模型的能力,以及对并非所有参数都用于每次迭代的模块的支持(如控制流,如自适应 SoftMax 等)。

关于本次更新,Pytorch在下面的GitHub文档中进行了详细的解释,请收好传送门:

https://github.com/pytorch/pytorch/releases/tag/v1.1.0

对于这次更新,PyTorch 的产品经理 Joe Spisa 表示,他们并不是要将 PyTorch 变成金钱,而是希望 PyTorch 拥有一个社区。

他表示,现在这个社区正开始从一个以研究为中心的社区向生产型的社区转变,而且转变速度也在快速增长。

PyTorch 路线图的下一步是,以更少的比特数运行神经网络,实现更快的 CPU 和 GPU 性能,并支持 AI 从业者创建命名张量维数。

现在,Pytorch 使用一个简单的 “from torch.utils.TensorBoard import SummaryWriter” 命令来支持TensorBoard。

PyTorch 1.0 正式版发布

PyTorch 1.0 同时面向产品化 AI 和突破性研究的发展,「我们在 PyTorch1.0 发布前解决了几大问题,包括可重用、性能、编程语言和可扩展性。」Facebook 人工智能副总裁 Jerome Pesenti 曾在 PyTorch 开发者大会上表示。

随着 PyTorch 生态系统及社区中有趣新项目及面向开发者的教育资源不断增加,今天 Facebook 在 NeurIPS 大会上发布了 PyTorch 1.0 稳定版。该版本具备生产导向的功能,同时还可以获得主流云平台的支持。

现在,研究人员及工程师可以轻松利用这一开源深度学习框架的新功能,包括可在 eager execution 和 graph execution 模式之间无缝转换的混合前端、改进的分布式训练、用于高性能研究的纯 C++ 前端,以及与云平台的深度集成。

PyTorch 1.0 将加速 AI 从原型到生产部署的工作流程,并使这一进程更加容易开始。仅仅在过去的几个月里,就不断有人通过广泛普及的新教学课程上手 PyTorch,一些专家还构建了创新型项目,将这一框架扩展到从自然语言处理到概率编程的多个领域。

GitHub地址项目 GitHub 地址

PyTorch 经验指南:技巧与陷阱

PyTorch 的构建者表明,PyTorch 的哲学是解决当务之急,也就是说即时构建和运行计算图。目前,PyTorch 也已经借助这种即时运行的概念成为最受欢迎的框架之一,开发者能快速构建模型与验证想法,并通过神经网络交换格式 ONNX 在多个框架之间快速迁移。本文(机器之心翻译)从基本概念开始介绍了 PyTorch 的使用方法、训练经验与技巧,并展示了可能出现的问题与解决方案。

PyTorch 是一种灵活的深度学习框架,它允许通过动态神经网络(例如利用动态控流——如 if 语句或 while 循环的网络)进行自动微分。它还支持 GPU 加速、分布式训练以及各类优化任务,同时还拥有许多更简洁的特性。以下是作者关于如何利用 PyTorch 的一些说明,里面虽然没有包含该库的所有细节或最优方法,但可能会对大家有所帮助。

神经网络是计算图的一个子类。计算图接收输入数据,数据被路由到对数据执行处理的节点,并可能被这些节点转换。在深度学习中,神经网络中的神经元(节点)通常利用参数或可微函数转换数据,这样可以优化参数以通过梯度下降将损失最小化。更广泛地说,函数是随机的,图结构可以是动态的。所以说,虽然神经网络可能非常适合数据流式编程,但 PyTorch 的 API 却更关注命令式编程——一种编程更常考虑的形式。这令读取代码和推断复杂程序变得简单,而无需损耗不必要的性能;PyTorch 速度很快,且拥有大量优化,作为终端用户你毫无后顾之忧。

本文其余部分写的是关于 grokking PyTorch 的内容,都是基于 MINIST 官网实例,应该要在学习完官网初学者教程后再查看。为便于阅读,代码以块状形式呈现,并带有注释,因此不会像纯模块化代码一样被分割成不同的函数或文件。

Pytorch 基础

PyTorch 使用一种称之为 imperative / eager 的范式,即每一行代码都要求构建一个图,以定义完整计算图的一个部分。即使完整的计算图还没有构建好,我们也可以独立地执行这些作为组件的小计算图,这种动态计算图被称为「Define-by-Run」方法。

GitHub地址项目 GitHub 地址

深度学习新王者:AutoML

TowardDataScienc 最近发布文章 《Everything you need to know about AutoML and Neural Architecture Search 》,将 AutoML 和神经架构搜索(NAS),定义为深度学习领域的新一代王者。

神经架构搜索(NAS)

在开发神经网络的过程中,架构工程事关重大,架构先天不足,再怎么训练也难以得到优秀的结果。当然,提到架构,很多人会想到迁移学习:譬如:把 ImageNet 上训练的 ResNet 拿来,换个数据集再训练,并根据训练结果更新权重,便完成了。这种方法的确也可行,但是要想得到最好的效果,还是根据实际情况设计自己的网络架构比较靠谱。设计神经网络架构,能称得上机器学习过程中门槛最高的一项任务了。想要设计出好架构,需要专业的知识技能,还要大量试错。

NAS 就为了搞定这个费时费力的任务而生。这种算法的目标,就是搜索出最好的神经网络架构。它的工作流程,通常从定义一组神经网络可能会用到的『建筑模块』开始。比如说 Google Brain 那篇 NasNet 论文,就为图像识别网络总结了这些常用模块:其中包含了多种卷积和池化模块 ——

NASNet blocks for image recognition network

NAS 算法用一个循环神经网络(RNN)作为控制器,从这些模块中挑选,然后将它们放在一起,来创造出某种端到端的架构。这个架构,通常会呈现出和 ResNetDenseNet 等最前沿网络架构一样的风格,但是内部模块的组合和配置有所区别。一个架构的好坏,往往就取决于选择的模块和在它们之间构建的连接。接下来,就要训练这个新网络,让它收敛,得到在留出验证集上的准确率。这个准确率随后会用来通过策略梯度更新控制器,让控制器生成架构的水平越来越高。这个过程很直观了。简单来说,很有小朋友搭积木的风范:让一个算法挑出一些积木,然后把它们组装在一起,做成一个神经网络。训练、测试,根据这个结果来调整选积木(模块)的标准和组装的方式。NAS 就是要用它来构建和当前最先进的架构风格非常类似的网络,这些模块也都是当前研究中常用的。

NAS 算法的主要工作,就是给这些模块换个连接方式。

下面,就是它发现的 ImageNet 最佳神经网络架构:

Best discovered blocks and structure for the ImageNet network on the right below

但是,用 450 个 GPU 来训练,找到一个优秀的架构也需要训练 3 到 4 天,这种方法还是门槛太高、效率太低。于是,2017 年开始,Google 先后提出了渐进式神经架构搜索(PNAS)与高效神经架构搜索(ENAS)。试图通过改进模型训练方式来提高效率,并降低训练成本,使单个 1080 Ti GPU 也能达到不错的模型搜索效率。

深度学习新方法 AutoML

很多人将 AutoML 称为深度学习的新方式,认为它改变了整个系统。有了 AutoML,我们就不再需要设计复杂的深度学习网络,只需运行一个预先设置好的 NAS 算法。最近,Google 提供的 Cloud AutoML 将这种理念发挥到了极致。只要你上传自己的数据,Google 的 NAS 算法就会为你找到一个架构,用起来又快又简单。AutoML 的理念就是把深度学习里那些复杂的部分都拿出去,你只需要提供数据,随后就让 AutoML 在神经网络设计上尽情发挥吧。这样,深度学习就变得像插件一样方便,只要有数据,就能自动创建出由复杂神经网络驱动的决策功能。

How AutoML works

不过,AutoML 价格也并不算亲民,每小时收费 20 美元。此外,一旦你开始训练,则无法导出模型,并且得用谷歌提供的 API 在云上运行你的网络,这些限制看起来都不是很方便,另外,这里有一份 Google AutoML 的快速入门指导。

ENAS 算法模型

总的来说,若你想使用 AutoML,现在已经有很多不同的选择,这完全取决于你是否会使用你想要的算法,以及你对这件事的预算如何。过去几年,在深度学习工作的自动化上,整个领域都在大步向前,让深度学习更贴近大众、更易用。以下是几款同样采用 ENAS 算法模型实现自动神经网络架构搜索的项目,面向 KerasTensorFlowPytorch 深度学习框架 ——

GitHub地址

LSTM:时间序列数据关联模型

此前,跨象乘云™介绍了《LSTM 模型预测电子货币价格》教程,实际上,LSTM 模型能够从时间序列数据中捕捉最重要的特征并进行关联建模。股票价格预测模型,是关于对冲基金如何使用此类系统的典型案例,使用了 Python 编写的 PyTorch 框架进行训练,设计实验并绘制结果。

对冲基金是深度学习应用中具有吸引力的领域之一,也是投资基金的一种形式。不少金融组织从投资者那里筹集资金后对其进行管理,并通过分析时间序列数据来做出一些预测。在深度学习中,有一种适用于时间序列分析的架构是:递归神经网络(RNNs),更具体地说,是一种特殊类型的递归神经网络:长短期记忆网络(LSTM)。NEVEN PIČULJAN 以对冲基金如何使用深度学习系统为例进行典型案例分析,并展示实验过程及结果。同时文章将分析如何提高深度学习系统性能,以及需要什么样背景的深度学习人才,来搭建应用于对冲基金的深度学习系统。这里有对应的中文翻译

机器学习库选型

选择一个机器学习(ML)库来解决预测问题,是个说起来容易做起来难的事情 —— 可选择性太多了。每一个库对于它擅长的特定问题都有着良好的特性与优势。 即使对于在机器学习和数据科学领域具有相当经验的人来说,逐个检查所有不同的方案也是一种煎熬。Mayukh Bhaowal —— Salesforce Einstein 的产品管理总监,负责自动化机器学习;向我们分享了关于机器学习库的最重要的五个特征,科研工作者可以在决定使用哪个库时进行参考。

1.编程模式

大多数机器学习库,在高级设计模式中分为两个模式:符号式(Symbolic)和命令式(Imperative)。

  • 在符号式程序中,科研工作者可以从功能上定义复杂的数学计算,而无需实际执行。它通常采用计算图的形式。你把所有的东西放在一起,并用抽象的方式把它们连接起来,当把真值作为输入数据传进去时,它才会真正实现计算。这种模式的最大优点是可组合性和抽象性,从而使开发人员能够专注于更高层次的问题。效率是另外一大优势,因为将这些函数并行化执行相对来说容易一些。Apache Spark 的 ML 库,Spark MLlib 以及任何基于 Spark 的库,比如 Microsoft 的 MMLSpark 和 Intel 的 BigDL,都遵循这种模式。有向无环图(DAG)是计算图的表示形式。符号式编程机器学习库的其他例子有CNTK,具备静态计算图;Caffe2,使用网络结构类Net(操作符 Operator 的计算图);H2O.ai;以及Keras。
  • 在命令式编程中,一切都是先执行的。你写下一行代码,当编译器读取这行并执行它时,就会发生真实的数值计算,然后移到下一行代码。这种风格使得创建模型原型更容易,因为它往往更灵活,更容易调试,易于排除故障。 Scikit-learn 是一个流行的 Python 库,属于这个类别。其他库,如 auto sklearn 和 TPOT 是 Scikit-learn 的高阶抽象层,也遵循这种范式。 PyTorch 是另一种支持动态计算图的主流选择,动态计算图让整个计算流程是命令式的。

显然,这两种方法互有胜负,究竟选择哪种好,是随着用例不同而不同的。命令式编程非常适合研究,因为它天然支持更快速的原型设计 —— 允许重复迭代,试错和和快速反馈循环 —— 而符号式编程更适合于生产环境的应用。

有一些库结合了这两种方法,创建了一种混合风格。最好的例子是 MXNet,它允许符号式编程中的回调函数中插入命令式代码,或者把符号式编程作为命令式程序的一部分。另一个更新的发展是来自 Google 的 TensorFlow 的 Eager Execution。尽管最初,它只是一个具备符号式计算范式的 Python 库(一个张量的静态计算图),但是 Eager Execution 并不需要一个图,而且可以立即执行。

  • 符号式:Spark MLlib,MMLSpark,BigDL,CNTK,H2O.ai,Keras,Caffe2
  • 命令式:scikit-learn,auto sklearn,TPOT,PyTorch
  • 混合式:MXNet,TensorFlow

2.机器学习算法

监督学习,无监督学习,推荐系统深度学习是我们所采用的机器学习算法中常见的分类。我们需要再次强调,应用场景(用例)将决定使用哪个库最好。例如,如果科研工作者正在进行大量自定义的图像处理,如果其他条件相同的话,Caffe2 将是一个不错的选择。它是 Caffe 的进化版,Caffe 一开始把 CNN 应用于图像分类。 CNTK 将是自然语言处理的一个合理选择,因为 CNTK 框架诞生于微软的语言服务部门。另一方面,如果大多数用例是监督学习和非监督学习,Spark MLlib,scikit-learn,H2O.ai 和 MMLSpark 也都是很好的选择,因为它们支持大量的监督和非监督算法。除此之外, Spark MLlib,H2O.ai 和 Mahout 还通过提供协作过滤算法对推荐系统提供支持。

随着深度学习(DL)的兴起,许多较老的库现在已经显得力不从心。 TensorFlow 是首批向数据科学家提供深度学习的计算库之一。今天,我们还有很多其他的专注于深度学习的框架可以选择,其中包括PyTorch,Keras,MXNet,Caffe2,CNTK 和 BigDL。还有其他一些算法库支持 DL 算法,但 DL 不是它们的主要功能,比如 MMLSpark(用于图像和文本学习)和 H2O.ai(通过 Deepwater 插件提供对 DL 的支持)。

  • 有监督和无监督:Spark MLlib,scikit-learn,H2O.ai,MMLSpark,Mahout
  • 深度学习:TensorFlow,PyTorch,Caffe2(用于处理图片),Keras,MXNet,CNTK,BigDL,MMLSpark(用于处理图片和文字),H2O.ai(通过 Deepwater 插件提供支持)
  • 推荐系统:Spark MLlib,H2O.ai(通过 Sparkling Water 插件提供支持),Mahout

3.硬件和性能

计算性能是为科研项目选择合适的库的关键标准之一。这一项对于专精于 DL 算法的库更为重要,因为它们往往是计算密集型的。

推动 DL 开发的最大趋势之一是 GPU 的进步,以及 GPU 提供了对大型矩阵运算的支持。所有 DL 库(如TensorFlow,Keras,PyTorch 和 Caffe2)都支持 GPU,不过许多通用库(如 MMLSpark,H2O.ai 和Apache Mahout)也提供了对 GPU 的支持。CNTK 和 MXNet 拥有自动化多 GPU 和多服务器支持,允许用户进行快速地进行跨多个 GPU 的分布式训练,而且无需任何配置。然而,TensorFlow 由于比其他的 DL 平台计算速度慢,而得到了一些负面评价。作为一种弥补,TensorFlow 在其新的定制 AI 芯片 Tensor Processing Unit(TPU)上大肆宣传。其缺点是,TPU 是非商品化的硬件,只能与 TensorFlow 一起工作,这导致了供应商锁定的现象。

Caffe2,MXNet 和 TensorFlow 同时也因对移动计算支持而脱颖而出。所以,如果科研项目需要在移动设备上进行机器学习训练,那它们就会是你最好的选择。

关于性能方面值得一提的是,大部分基于 Spark 构建的库都能够依靠内存缓存中间数据,靠这一点利用Spark 进行并行集群计算,使本质上需要『迭代』的机器学习算法运行得更快。 Apache Mahout 是一个例外,它直到最近才支持 Hadoop MapReduce,并且要进行对计算而言开销很大的磁盘 I / O 操作,因此它对于迭代算法来说速度较慢。 Mahout 现在在 Spark,H2O.ai 和 Apache Flink 上增加了对Scala语言的支持。 BigDL 在Spark 的生态系统中使用 CPU 实现 DL 的方法是一种新颖的方式,与传统的利用 GPU 加速的 DL 库有所不同,BigDL 使用英特尔的 MKL 和多线程编程。

  • CPU:Spark MLlib,scikit-learn,auto sklearn,TPOT,BigDL
  • GPU:Keras,PyTorch,Caffe2,MMLSpark,H2O.ai,Mahout,CNTK,MXNet,TensorFlow
  • 移动计算:MXNet,TensorFlow,Caffe2

4.可读性

ML 软件与传统软件的区别在于,其预测行为本身或产出的结果不是那么可预期的。与基于规则的引擎不同,这种软件能不断学习到新的规则。深度学习面临的最大挑战之一,是如何持续不断地建立对机器学习应用的信任和信心。为什么预测影响因子 X 有更高的可能性转化客户,而影响因子 Y 在转化率方面引入的可能性较低?数据集中驱动算法进行某些预测的数据模式是什么?我们能否将机器学习模型的这种洞察力转化为商业行动?

对这个问题的其他衍生问题包括,计算图执行时对算法评价指标的可视化,观察数据流并对它们进行优化,手工模型和/或调试模型质量。

这是一个在机器学习中相对不成熟的领域,只有少数库试图解决这个问题。 H2O.ai 推出了机器学习可解释性,解决了这个问题的某些方面。 TensorFlow 有一个称为 TensorBoard 的可视化工具,它帮助数据科学家理解、优化和调试大量的深度神经网络。Keras 也通过其自身的模型可视化解决了这个问题。

虽然这些都是朝着正确方向的很好的步骤,但是为了鼓励 ML 被更广泛的接纳,可解释性领域还需要我们投注更多的新学,让机器学习更加透明,减少它的黑盒性。

  • 可读性:TensorFlow(TensorBoard),H2O.ai(机器学习可解释性),Keras(模型可视化)

5.自动化机器学习

可以这样说:机器学习中最大的创新领域之一,就是自动化的机器学习。真实世界中的机器学习不仅仅是构建模型,还涉及到构造数据管线,其中包括 ETL,特征工程,特征选择,模型选择(包括超参数调优),模型更新和模型部署。

工作流程中的许多步骤在各种应用和数据集处理中都是通用的,并且往往有重复的倾向,这就意味着存在对流程进行优化和自动化的机会。除此以外,某些工作流程特别需要数据科学和机器学习方面的直觉和领域知识,比如特征工程或深度模型调优。这些领域对于无法获得博士学位的人来说难以进入。实现许多步骤的自动化,可以加快数据科学家的工作效率,能够帮助他们在几个小时而不是几个月内帮助构建机器学习应用。

Auto sklearn,TPOT 和 H2O.ai 就是建立在这个前提下的,而且针对的是有监督分类问题。Auto sklearn 使用了贝叶斯优化进行自动化模型选择和超参调整。 TPOT 正在使用遗传算法编程进行超参调整。 TPOT 和 H2O.ai 都包含了几种不同级别的特征工程自动化。 MMLSpark 针对图像和文本的特征,具备自动化模型选择,以及一定程度的自动化特征工程。

无论是从广度(数据管线中的不同阶段自动化)还是深度(单一一个数据处理阶段上的智能自动化)上,这类工具可以说是供不应求。

  • 超参数调整:auto sklearn(贝叶斯优化),TPOT(遗传编程)
  • 有限的自动特征工程:TPOT,H2O.ai,MMLSpark

其他注意事项

尽管机器学习模型在可用前需要在数据集上进行训练,但是在某些情况下,我们可以访问全球通用的数据集。比如,像 ImageNet 这种通用图像数据集,完全足够用于建立一个通用的图像分类模型,这也被称为预训练的模型。这样的模型可以作为插件来引入,这意味着不需要数据或者训练。 MMLSpark,CNTK,TensorFlow,PyTorch,Keras 和 BigDL 都为通用分类任务提供预训练的模型。值得注意的是,这样的模型对于定制化用例是没有用的。

例如,一个通用的图像分类模型,如果需要从作物田地的航拍图像中对农作物的类型进行分类的话,效果就会很差,但是它能很好地将猫与狗分类。这是因为,尽管 ImageNet 中存在农作物相关的图像,但是对于特定种类的作物,以及患上不同疾病的作物的训练数据是不足的,而那些数据可能刚好是化肥公司所关心的。

CNTK 附带一些方便的功能,如数据集自动化随机提取,以及实时在线训练。尽管 MMLSpark 是一个Scala 库,但它支持自动生成其他语言,也就是 PythonR 的接口。

  • 预训练模型:MMLSpark,CNTK,TensorFlow,PyTorch,Keras,BigDL
  • 实时培训:CNTK
  • 多语言支持:MMLSpark 支持从Scala自动生成 Python / R 的接口

小结

将 ML 构建到科学研究项目中时,有多种 ML 库供科研工作者选择。尽管可能没有一个完美的选择,但考虑上述因素,有助于确保科研项目的特定需求选择最佳解决方案。对于拥有数千家企业客户的企业公司来说,还有许多市场尚未涉足的其他挑战 ——

标签泄漏,也被称为数据泄漏,一直是 ML 库的致命弱点。这一点的发生是由于存在未知的业务流程,导致用于模型训练的数据集具有代表实际标签的字段。检查数据是否存在泄漏,并将泄露的字段从数据中删除是得到理想模型的关键。

多租户是另一个关键点 —— 我们如何共享机器学习平台和资源,为多个用户提供服务,每个用户都有自己独特的数据集,并导致完全不同的模型被训练?随着数据/模型规模的不同,这个问题也不同。随着行业继续面临这样的挑战,一个完整、详尽开发的自动 ML 解决方案,虽然现在暂时不存在,在将来可能被证明是成功的关键。

TensorFlow VS. PyTorch

本文来源自斯坦福大学计算机科学博士生 Awni Hannun 发表的文章,对比当前两个深度学习主流框架:TensorFlowPytorch 之间的差异。整体而言:

PyTorch 更适合于在研究中快速进行原型设计、业余爱好者和小型项目;而 TensorFlow 则更适合大规模的调度,尤其当考虑到跨平台和嵌入式调度操作时。细分对比如下 ——

准备时间 –> PyTorch

PyTorch 实际上是 NumPy 的替代,它支持 GPU,有着更高级的功能,可以用来构建和训练深度神经网络。如果你熟悉 NumPy、Python 和常见的深度学习概念(卷积层、递归层、SGD 等),那么学习 PyTorch 对你来说会很容易。

而 TensorFlow 则可以看成是一种嵌入 Python 的编程语言。当你在编写 TensorFlow 代码时,它们会通过 Python 编译成一张图,然后由 TensorFlow 执行引擎运行。我看到过刚使用 TensorFlow 的人因为这个额外的间接层而苦思冥想。也因为如此,想用 TensorFlow 还需要学一些额外的概念,比如会话、图、变量作用域和占位符等。要运行基本模型,还需要更多的样板代码。使用 TensorFlow 的前期准备时间肯定比 PyTorch 要长。

图创建和调试 –> PyTorch

创建和运行计算图可能是这两个框架最大的不同。在 PyTorch 中,图架构是动态的,这意味着图是在运行时创建的。而在 TensorFlow 中,图架构是静态的,这意味着先编译出图然后再运行。

PyTorch 中简单的图架构更容易推导,或许更重要的一点是,它更容易调试。调试 PyTorch 代码如同调试 Python 代码,可以使用 pdb 并在任何地方设置断点。而调试 TensorFlow 代码并不那么容易,你有两个选择,一是请求会话中你想要检查的变量,二是学习和使用 TensorFlow 调试器(tfdbg)。

覆盖率 –> TensorFlow

PyTorch 在逐渐发展,两者之间的差距会缩小到零。然而,目前仍有一些 TensorFlow 支持但 PyTorch 不支持的功能,如:

  • 沿着维度翻转张量(np.flip, np.flipud, np.fliplr)
  • 检查张量是空值还是无限值(np.is_nan, np.is_inf)
  • 快速傅里叶变换(np.fft)

此外,TensorFlow 的 contrib 包中有更多比 PyTorch 更高级的函数和模型。

序列化 –> TensorFlow

在这两种框架下保存和加载模型都很简单。

PyTorch 有一个特别简单的 API,既可以保存模型的所有权重,也可以 pickle 全部类。

TensorFlow 的 Saver 对象也很容易使用,并为检查点(check-pointing)提供了更多选择。在序列化中 TensorFlow 的主要优点是可以将整个图保存为协议缓冲区。这包括参数和运算。此外,该图可以通过其他支持的语言(C++,Java)加载。这对不支持 Python 的调度栈来说至关重要。理论上,在改变模型源代码之后,你想要运行旧模型时它也能有所帮助。

部署 –> TensorFlow

对于小规模的服务器端部署,两个框架都很容易封装在诸如 Flask web 服务器中。不过,TensorFlow 支持移动和嵌入式部署。可以确定的说,这比包括 PyTorch 在内的大多数深度学习框架支持功能的都要多。将 TensorFlow 部署到 Android 或 iOS 上确实需要大量的工作,但至少你不必用 Java 或 C++ 重写模型的整个推理程序。

文档 –> SAME

两种框架的文档中都能找到需要的东西。Python 的 API 在两个框架中都有良好的文档记录,并且有足够的例子和教程来学习这两种框架。一个比较边缘的问题是,PyTorch 的 C 语言库大多是无文档记录的,不过这只影响到编写定制的 C 语言扩展程序,而且这种操作是否有助于软件还存疑。

数据加载 –> PyTorch

PyTorch 中用于数据加载的 API 设计得很好。接口在数据集、采样器和数据加载器中有明确规定。数据加载器接收数据集和采样器,根据采样器的调度,在数据集上生成迭代器。加载并行数据就像把  num_workers 语句传递到数据加载器一样简单。

在 TensorFlow 还没发现特别有用的加载数据的工具,例如 readers, queues, queue runners 等,都不够好。部分原因是因为将想要运行的所有预处理代码添加到 TensorFlow 图中并不总是直接的,例如计算时频谱(spectrogram)。而且,API 本身更繁琐,更难以学习。

设备管理 –> TensorFlow

TensorFlow 管理设备时的无缝性非常好。通常不需要规定任何东西,因为默认已经设好了。例如,如果 GPU 可用,TensorFlow 将默认在 GPU 上运行。在 PyTorch 中,即使支持 CUDA,都必须明确地将所有东西移到设备上。

TensorFlow 设备管理的唯一缺点是,即使你只使用一个 GPU 它也会默认占用所有 GPU 的显存。简单的解决方法是用 CUDA_VISIBLE_DEVICES 语句指定显卡。但有时会忘了设置,所以当 GPU 实际上处于空闲状态时,会显示内存不足。

在 PyTorch 中,代码需要更频繁地检查 CUDA 的可用性和更明确的设备管理,当编写能够同时在 CPU 和 GPU 上运行的代码时尤甚。另外,将 GPU 上的 PyTorch Variable 转换为 NumPy 数组有点繁琐。

自定义扩展 –> PyTorch

在这两种框架中都可以用 C 语言、C++ 或 CUDA 构建或绑定自定义扩展。但 TensorFlow 需要更多的样板代码,即使它支持多种类型和设备。

在 PyTorch 中,只需为每个 CPU 和 GPU 版本编写一个接口和相应的实现。用这两种框架来编译扩展都很直接,并且不需要下载除了 pip 安装包之外的任何头文件或源代码。

TensorFlow 与 PyTorch 入门课件

最后,香港科技大学发布了 TensorFlow 与 Pytorch 两个框架的快速入门课件,以供科研学习者参考。

GitHub地址项目GitHub地址