深度学习框架简介

概述


简介

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

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

在深度学习中,这些分层的表示(几乎总是)是通过称为神经网(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深度学习(一)深度学习基础
深度学习框架对比与选择

你可能感兴趣的:(深度学习,机器学习,框架,tensorflow,算法,人工智能,人工智能)