【深度学习】深度学习简介

人工智能的痛点:数据表达、特征提取、运算处理器

解决了以上痛点,人工智能的任务就能解决了90%。

 

深度学习的核心问题之一:自动的将简单的特征组合成更加复杂的特征,并使用这些组合特征解决问题。

 

深度学习是机器学习的一个分支,深度学习除了学习特征和任务之间的关联外,还能自动从简单特征中提取更加复杂的特征,

 

深度学习和机器学习的差异:

机器学习:输入à人工提取特征à权重学习à预测结果

深度学习:输入à基础特征提取à多层复杂特征提取à权重学习à预测结果

 

深度学习的领域主要关注如何搭建智能的计算机系统,解决人工智能中遇到的问题

神经科学主要关注如何建立更准确的模型来模拟人类大脑的工作

 

人工智能、机器学习、深度学习关系图:

 

神经网络发展史:

       1、二十世纪四十年代,早期的神经网络模型类似于仿生机器学习,试图模拟大脑的学习机理。

       2、二十世纪八十年代,第二波神经网络研究因分布式知识表达和神经网络反向传播算法的提出和兴起。

       分布式的知识表达的核心思想是现实世界中的知识和概念应该通过多个神经元来表达,每个模型中的每个神经元也应该参与表达多个概念。

       3、二十一世纪,机器学习领域的高度发展和云计算、GPU的出现计算量不再是阻碍神经网络发展的问题。大数据的兴起也产生了海量的数据,使其获取海量的数据不再困难。

 

深度学习的应用:

图像识别、语音识别、音频识别、自然语言处理、机器人、生物信息处理、游戏、搜索引擎、广告投放、医学诊断、股票金融


深度学习工具对比:





网络和模型能力

Caffe可能是第一个主流的工业级深度学习工具,它开始于2013年底,具有出色的卷积神经网络实现。在计算机视觉领域Caffe依然是最流行的工具包,它有很多扩展,但是由于一些遗留的架构问题,它对递归网络和语言建模的支持很差。此外,在Caffe中图层需要使用C++定义,而网络则使用Protobuf定义。

 

CNTK由深度学习热潮的发起演讲人创建,目前已经发展成一个通用的、平台独立的深度学习系统。在CNTK中,网络会被指定为向量运算的符号图,运算的组合会形成层。CNTK通过细粒度的构件块让用户不需要使用低层次的语言就能创建新的、复杂的层类型。

 

TensorFlow是一个理想的RNN(递归神经网络) API和实现,TensorFlow使用了向量运算的符号图方法,使得新网络的指定变得相当容易,但TensorFlow并不支持双向RNN3D卷积,同时公共版本的图定义也不支持循环和条件控制,这使得RNN的实现并不理想,因为必须要使用Python循环且无法进行图编译优化。

 

Theano支持大部分先进的网络,现在的很多研究想法都来源于Theano,它引领了符号图在编程网络中使用的趋势。Theano的符号API支持循环控制,让RNN的实现更加容易且高效。

 

Torch对卷积网络的支持非常好。在TensorFlowTheano中时域卷积可以通过conv2d来实现,但这样做有点取巧;Torch通过时域卷积的本地接口使得它的使用非常直观。Torch通过很多非官方的扩展支持大量的RNN,同时网络的定义方法也有很多种。但Torch本质上是以图层的方式定义网络的,这种粗粒度的方式使得它对新图层类型的扩展缺乏足够的支持。与Caffe相比,在Torch中定义新图层非常容易,不需要使用C++编程,图层和网络定义方式之间的区别最小。

 

接口

Caffe支持pycaffe接口,但这仅仅是用来辅助命令行接口的,而即便是使用pycaffe也必须使用protobuf定义模型。

 

CNTK的使用方式与Caffe相似,也是通过指定配置文件并运行命令行,但CNTK没有Python或者任何其他高级语言的接口。

 

TensorFlow支持PythonC++两种类型的接口。用户可以在一个相对丰富的高层环境中做实验并在需要本地代码或低延迟的环境中部署模型。

 

Theano支持Python接口。

 

Torch运行在LuaJIT上,与C++C#以及Java等工业语言相比速度非常快,用户能够编写任意类型的计算,不需要担心性能,唯一的问题就是Lua并不是主流的语言。

 

 

模型部署

Caffe是基于C++的,因此可以在多种设备上编译,具有跨平台性,在部署方面是最佳选择。

 

CNTKCaffe一样也是基于C++并且跨平台的,大部分情况下部署非常简单。但是它不支持ARM架构,这限制了它在移动设备上的能力。

 

TensorFlow支持C++接口,同时由于它使用了Eigen而不是BLAS类库,所以能够基于ARM架构编译和优化。TensorFlow的用户能够将训练好的模型部署到多种设备上,不需要实现单独的模型解码器或者加载Python/LuaJIT解释器。

 

Theano缺少底层的接口,并且其Python解释器也很低效,对工业用户而言缺少吸引力。虽然对大的模型其Python开销并不大,但它的限制摆在那,唯一的亮点就是它跨平台,模型能够部署到Windows环境上。

 

Torch的模型运行需要LuaJIT的支持,虽然这样做对性能的影响并不大,但却对集成造成了很大的障碍,使得它的吸引力不如Caffe/CNTK/TensorFlow等直接支持C++的框架。

 

性能

在单GPU的场景下,所有这些工具集都调用了cuDNN,因此只要外层的计算或者内存分配差异不大其表现都差不多。

Caffe 简单快速。

CNTK 简单快速。

TensorFlow仅使用了cuDNN v2,但即使如此它的性能依然要比同样使用cuDNN v2Torch要慢1.5倍,并且在批大小为128时训练GoogleNet还出现了内存溢出的问题

Theano在大型网络上的性能与Torch7不相上下。但它的主要问题是启动时间特别长,因为它需要将C/CUDA代码编译成二进制,而TensorFlow并没有这个问题。此外,Theano的导入也会消耗时间,并且在导入之后无法摆脱预配置的设备(例如GPU0)。

Torch非常好,没有TensorFlowTheano的问题。

另外,在多GPU方面,CNTK相较于其他的深度学习工具包表现更好,它实现了1-bitSGD和自适应的minibatching

 

架构

Caffe的架构在现在看来算是平均水准,它的主要痛点是图层需要使用C++定义,而模型需要使用protobuf定义。另外,如果想要支持CPUGPU,用户还必须实现额外的函数,例如Forward_gpuBackward_gpu;对于自定义的层类型,还必须为其分配一个int类型的id,并将其添加到proto文件中。

TensorFlow的架构清晰,采用了模块化设计,支持多种前端和执行平台。

 

Theano 的架构比较变态,它的整个代码库都是Python的,就连C/CUDA代码也要被打包为Python字符串,这使得它难以导航、调试、重构和维护。

Torch7nn类库拥有清晰的设计和模块化的接口。