深度学习框架简介

概述


简介

人工智能诞生于1950年代,深度学习是机器学习的一个特定子领域:从数据中学习表示的一种新方法,强调学习愈来愈有意义的表示的连续层(layers)。web

深度学习将数据中高层次化的模式建模成复杂的多层网络,须要进行大量的计算来构建一个有用的模型。算法

在深度学习中,这些分层的表示(几乎老是)是经过称为神经网(neural networks)的模型来学习的,这些模型的结构是逐层堆叠在一块儿的文字层。编程

就目的而言,深度学习是一个从数据中学习表征的数学框架。后端

机器学习是关于将输入(如图像)映射到目标(如标签“cat”),这是经过观察许多输入和目标的样例来完成的。数组

总的来讲,有三种技术力量推进着机器学习的进步:网络

  • 硬件
  • 数据和基准测试
  • 算法的进步
解决的问题

虽然深度学习是机器学习的一个至关古老的分支领域,但它直到2010年代初才开始崭露头角。框架

数据科学家使用深度学习来解决企业各个方面很是实际的问题,如:机器学习

  • 语深度学习可以处理音频和文本数据,可应用于语言翻译(GMNT谷歌翻译)、语音识别、语音合成、情感分析以及天然语言生成等领域
  • 高精地图和图像识别应用,深度学习能够应用于图像分类(ResNet50),目标检测(Mask R-CNN),图像分割(UNET),图像恢复等领域
  • 支付系统提供商使用深度学习实时识别可疑交易
  • 具备大型数据中心和计算机网络的机构使用深度学习从日志中挖掘信息检测威胁
  • 汽车制造商和汽车运营商使用深度学习挖掘传感器数据预测部分车辆故障
  • 具备大型复杂供应链的公司使用深度学习预测延迟和生产瓶颈
  • 预测人幼年或老年时的外貌,能够帮助警方寻找失踪人口
优点

深度学习的优点:编程语言

  • 它能从特征中检测复杂的相互做用
  • 它能从几乎没有处理的原始数据中学习低层次的特征
  • 它能处理高基数类成员
  • 它能处理未标记的数据
缺点

深度学习的劣势:分布式

  • 生成的模型难以解释,这些模型可能有许多层和上千个节点;单独解释每个是不可能的
  • 对训练数据过分学习,算法“记住了”训练数据的特征,在模型将要使用的生产环境中,这些被记住的特征可能会也可能不会被用到
  • 须要大量的计算性能来构建,虽然计算成本已经大幅降低,可是计算仍旧不是免费的。对于小数据集的简单问题,在计算开销和时间相同的状况下,深度学习可能不会比更简单方法产生足够的额外效果
  • 复杂性,在测试数据上表现良好但没法落实的预测模型是没有实际用途的

基础算法


近年来,随着海量数据的积累和计算机硬件计算能力的提高,深度学习愈来愈普遍应用在各个方面。

深度学习没有足够的数据支持深度学习,有时用不一样的算法能够更好地解决这个问题。

学习和掌握基本的算法,不能马上解决全部的问题,但能够在面对问题的时候有更多更优的选择,也能够基于这些算法构建出新的适应问题的算法。

经典的深度学习方法包括下述方面:

  1. 几率模型
  • 几率建模是统计学原理在数据分析中的应用,这类算法中最著名的算法之一是朴素贝叶斯算法
  • 朴素贝叶斯是一种基于贝叶斯定理的机器学习分类器,它假设输入数据中的特征都是独立的
  • 一个密切相关的模型是逻辑回归(简称logreg),是一个分类算法而不是回归算法
  1. 早期神经网络
  • 神经网络第一次成功的实际应用是在1989年贝尔公司,当Yann LeCun将早期的卷积神经网络和反向传播的思想结合起来,并将它们应用到手写数字的分类问题上时
  • 在20世纪90年代,美国邮政服务公司(United States Postal Service)使用该网络来自动读取邮件信封上的邮编
  • 反向传播算法是一种利用梯度降低优化训练参数操做链的方法
  1. 内核模型
  • 核方法是一类分类算法,其中最著名的是支持向量机(SVM)
  • SVMs旨在经过在属于两个不一样类别的两组点之间找到好的决策边界来解决分类问题
  1. 决策树,随机森林,以及梯度加强机
  • 决策树是相似流程图的结构,对输入数据点进行分类或预测给定输入的输出值
  • 随机森林算法引入了一种健壮的、实用的决策树学习方法,它涉及到构建大量的专门决策树,而后集成它们的输出
  • 梯度提高机很像随机森林,是一种基于综合弱预测模型(一般是决策树)的机器学习技术
  1. 神经网络
  • 2011年,来自IDSIA的Dan Ciresan开始经过gpu训练的深度神经网络赢得学术图像分类竞赛,这是现代深度学习的第一次实际成功
  • 自2012年以来,深度卷积神经网络(convnets)成为全部计算机视觉任务的首选算法

主流框架介绍


深度学习框架已经实现了核心算法,在学习和实际工程应用中就没必要从新实现复杂的模型,如卷积神经网络(CNN)或循环神经网络(RNN)。

使用深度学习框架的好处:

  • 不须要手写CUDA 代码能跑GPU
  • 容易构建大的计算图(computational graphs)
  • 自动实现计算图中的梯度计算

这里仅对比较经常使用的四种深度学习框架做一简要介绍,后期深刻学习。

  1. TensorFlow

2015年11月谷歌(Google)出品,基于Python和C++编写,TensorFlow一经推出就得到了极大的关注,并迅速成为现在用户最多的深度学习框架。2019年3月已发布最新的TensorFlow2.0 版本。

优势:

  • 自带tensorboard可视化工具,可以让用户实时监控观察训练过程
  • 拥有大量的开发者,有详细的说明文档、可查询资料多
  • 支持多GPU、分布式训练,跨平台运行能力强
  • 具有不局限于深度学习的多种用途,还有支持强化学习和其余算法的工具

缺点:

  • 频繁变更的接口。TensorFlow的接口一直处于快速迭代之中,而且没有很好地考虑向后兼容性,这致使如今许多开源代码已经没法在新版的TensorFlow上运行,同时也间接致使了许多基于TensorFlow的第三方框架出现BUG
  • 接口设计过于晦涩难懂,在设计TensorFlow时,创造了图、会话、命名空间、PlaceHolder等诸多抽象概念,对初学者来讲较难上手。(不过,据称新的2.0版本对接口设计有了重大改进,笔者也很期待)
  • 运行明显比其余框架速度慢
  1. Keras

Keras 于2015年3月首次发布,拥有“为人类而不是机器设计的API”,获得Google的支持。

用于快速构建深度学习原型的高层神经网络库,由纯Python编写而成,以TensorFlow,CNTK,Theano和MXNet为底层引擎,提供简单易用的API接口,可以极大地减小通常应用下用户的工做量。

优势:

  • 更简洁,更简单的API
  • 丰富的教程和可重复使用的代码
  • 更多的部署选项(直接而且经过TensorFlow后端),更简单的模型导出
  • 支持多GPU训练

缺点:

  • 过分封装致使丧失灵活性,致使用户在新增操做或是获取底层的数据信息时过于困难
  • 许多BUG都隐藏于封装之中,没法调试细节
  • 初学者容易依赖于 Keras 的易使用性而忽略底层原理
  1. PyTorch
    PyTorch于2016年10月发布,是一款专一于直接处理数组表达式的低级API。 前身是 Torch(一个基于 Lua 语言的深度学习库)。

Facebook 人工智能研究院对PyTorch提供了强力支持。

PyTorch 支持动态计算图,为更具数学倾向的用户提供了更低层次的方法和更多的灵活性,目前许多新发表的论文都采用PyTorch做为论文实现的工具,成为学术研究的首选解决方案。

优势:

  • 简洁易用:更少的抽象,更直观的设计,建模过程简单透明,所思即所得,代码易于理解
  • 能够为使用者提供更多关于深度学习实现的细节,如反向传播和其余训练过程
  • 活跃的社区:提供完整的文档和指南,做者亲自维护的论坛供用户交流和求教问题。固然与Tensorflow相比,社区仍是更小
  • 代码很Pythonic(简洁、优雅),更好的调试功能,默认的运行模式更像传统的编程,您可使用常见的调试工具如pdb,ipdb或PyCharm调试器

缺点:

  • 无可视化接口和工具
  • 导出模型不可移植,工业部署不成熟
  • 代码冗余量较大
  1. Caffe/Caffe2.0
    Caffe的全称是Convolutional Architecture for Fast Feature Embedding,它是一个清晰、高效的深度学习框架,于2013年末由加州大学伯克利分校开发,核心语言是C++。

它支持命令行、Python和MATLAB接口。Caffe的一个重要特点是能够在不编写代码的状况下训练和部署模型。

优势:

  • 核心程序用C++编写,所以更高效,适合工业界开发
  • 网络结构都是以配置文件形式定义,不须要用代码设计网络
  • 拥有大量的训练好的经典模型(AlexNet、VGG、Inception)在其 Model Zoo里

缺点:

  • 缺乏灵活性和扩展性:Caffe是基于层的网络结构,若是要实现一个新的层,用户必需要利用C++实现它的前向和后向传播代码。若是须要新层运行在GPU上,则同时还须要用户本身实现CUDA代码。这种限制使得不熟悉C++和CUDA的用户扩展Caffe十分困难
  • 依赖众多环境,难以配置,GitHub上基于Caffe的新的项目愈来愈少,已经不多用于学术界
  • 缺少对递归网络RNN和语言建模的支持,不适用于文本、声音或时间序列数据等其余类型的深度学习应用

总结


  • 若是你最终想找一份深度学习的工做,最好学习下TensorFlow
  • 若是你是深度学习的初学者,想要快速入门,建议从Keras开始
  • 若是你是一名科研工做者,倾向于理解你的模型真正在作什么,那么就考虑选择PyTorch
  • 若是您是C++熟练使用者,并对CUDA计算游刃有余,你能够考虑选择Caffe

综上,深度学习框架众多,并没有最好与最坏之分。

最重要的仍是要深入理解神经网络的基本概念,根据本身想要实现网络的类型,基于本身擅长的编程语言,考虑项目自己的特色和目标,选择最适合您的框架。


参考资料:
深度学习:实际问题解决指南
Python深度学习(一)深度学习基础
深度学习框架对比与选择