深度学习入门初步

深度学习的概念源于人工神经网络的研究。含多隐层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。

       深度学习的概念由Hinton等人于2006年提出。基于深信度网(DBN)提出非监督贪心逐层训练算法,为解决深层结构相关的优化难题带来希望,随后提出多层自动编码器深层结构。此外Lecun等人提出的卷积神经网络是第一个真正多层结构学习算法,它利用空间相对关系减少参数数目以提高训练性能。

       深度学习是机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。

深度学习的核心思想

把学习结构看作一个网络,则深度学习的核心思路如下:

      ①无监督学习用于每一层网络的pre-train;

      ②每次用无监督学习只训练一层,将其训练结果作为其高一层的输入;

      ③用监督学习去调整所有层

       Deep learning本身算是machine learning的一个分支,简单可以理解为neural network的发展。大约二三十年前,neural network曾经是ML领域特别火热的一个方向,但是后来确慢慢淡出了,原因包括以下几个方面:

    1)比较容易过拟合,参数比较难tune,而且需要不少trick;

    2)训练速度比较慢,在层次比较少(小于等于3)的情况下效果并不比其它方法更优;

       所以中间有大约20多年的时间,神经网络被关注很少,这段时间基本上是SVM和boosting算法的天下。但是,一个痴心的老先生Hinton,他坚持了下来,并最终(和其它人一起Bengio、Yann.lecun等)提成了一个实际可行的deep learning框架。

Deeplearning与传统的神经网络之间有相同的地方也有很多不同。

       二者的相同在于deep learning采用了神经网络相似的分层结构,系统由包括输入层、隐层(多层)、输出层组成的多层网络,只有相邻层节点之间有连接,同一层以及跨层节点之间相互无连接,每一层可以看作是一个logistic regression模型;这种分层结构,是比较接近人类大脑的结构的。

深度学习入门初步_第1张图片

​       而为了克服神经网络训练中的问题,DL采用了与神经网络很不同的训练机制。传统神经网络中,采用的是back propagation的方式进行,简单来讲就是采用迭代的算法来训练整个网络,随机设定初值,计算当前网络的输出,然后根据当前输出和label之间的差去改变前面各层的参数,直到收敛(整体是一个梯度下降法)。而deep learning整体上是一个layer-wise的训练机制。这样做的原因是因为,如果采用back propagation的机制,对于一个deep network7层以上),残差传播到最前面的层已经变得太小,出现所谓的gradient diffusion(梯度扩散)。

Deeplearning训练过程

1、传统神经网络的训练方法为什么不能用在深度神经网络

       BP算法作为传统训练多层网络的典型算法,实际上对仅含几层网络,该训练方法就已经很不理想。深度结构(涉及多个非线性处理单元层)非凸目标代价函数中普遍存在的局部最小是训练困难的主要来源。

BP算法存在的问题:

(1)梯度越来越稀疏:从顶层越往下,误差校正信号越来越小;

(2)收敛到局部最小值:尤其是从远离最优区域开始的时候(随机值初始化会导致这种情况的发生);

(3)一般,我们只能用有标签的数据来训练:但大部分的数据是没标签的,而大脑可以从没有标签的的数据中学习;

 2、deeplearning训练过程

       如果对所有层同时训练,时间复杂度会太高;如果每次训练一层,偏差就会逐层传递。这会面临跟上面监督学习中相反的问题,会严重欠拟合(因为深度网络的神经元和参数太多了)。

       2006年,hinton提出了在非监督数据上建立多层神经网络的一个有效方法,简单的说,分为两步,一是每次训练一层网络,二是调优,使原始表示x向上生成的高级表示r和该高级表示r向下生成的x'尽可能一致。方法是:

1)首先逐层构建单层神经元,这样每次都是训练一个单层网络。

2)当所有层训练完后,Hinton使用wake-sleep算法进行调优。

       将除最顶层的其它层间的权重变为双向的,这样最顶层仍然是一个单层神经网络,而其它层则变为了图模型。向上的权重用于“认知”,向下的权重用于“生成”。然后使用Wake-Sleep算法调整所有的权重。让认知和生成达成一致,也就是保证生成的最顶层表示能够尽可能正确的复原底层的结点。比如顶层的一个结点表示人脸,那么所有人脸的图像应该激活这个结点,并且这个结果向下生成的图像应该能够表现为一个大概的人脸图像。Wake-Sleep算法分为醒(wake)和睡(sleep)两个部分。

1)wake阶段:认知过程,通过外界的特征和向上的权重(认知权重)产生每一层的抽象表示(结点状态),并且使用梯度下降修改层间的下行权重(生成权重)。也就是“如果现实跟我想象的不一样,改变我的权重使得我想象的东西就是这样的”。

2)sleep阶段:生成过程,通过顶层表示(醒时学得的概念)和向下权重,生成底层的状态,同时修改层间向上的权重。也就是“如果梦中的景象不是我脑中的相应概念,改变我的认知权重使得这种景象在我看来就是这个概念”。 

deeplearning训练过程具体如下:

1)使用自下上升非监督学习(就是从底层开始,一层一层的往顶层训练):

       采用无标定数据(有标定数据也可)分层训练各层参数,这一步可以看作是一个无监督训练过程,是和传统神经网络区别最大的部分(这个过程可以看作是feature learning过程):

        具体的,先用无标定数据训练第一层,训练时先学习第一层的参数(这一层可以看作是得到一个使得输出和输入差别最小的三层神经网络的隐层),由于模型capacity的限制以及稀疏性约束,使得得到的模型能够学习到数据本身的结构,从而得到比输入更具有表示能力的特征;在学习得到第n-1层后,将n-1层的输出作为第n层的输入,训练第n层,由此分别得到各层的参数;

2)自顶向下的监督学习(就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调):

       基于第一步得到的各层参数进一步fine-tune整个多层模型的参数,这一步是一个有监督训练过程;第一步类似神经网络的随机初始化初值过程,由于DL的第一步不是随机初始化,而是通过学习输入数据的结构得到的,因而这个初值更接近全局最优,从而能够取得更好的效果;所以deep learning效果好很大程度上归功于第一步的feature learning过程。

Deep Learning的常用模型或者方法

      1、AutoEncoder自动编码器

      2、Sparse Coding稀疏编码

    3、Restricted Boltzmann Machine(RBM)限制波尔兹曼机

      4、Deep BeliefNetworks深信度网络

      5、Convolutional Neural Networks卷积神经网络

常用的深度学习框架比较

网络和模型能力

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

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

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

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

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

接口

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

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

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

Theano支持Python接口。

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

模型部署

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

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

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

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

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

性能

在单GPU的场景下,所有这些工具集都调用了cuDNN,因此只要外层的计算或者内存分配差异不大其表现都差不多。本文的性能测试是基于Soumith@FB的ConvNets基准测试

来做的。

Caffe 简单快速。

CNTK 简单快速。

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

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

Torch非常好,没有TensorFlow和Theano的问题。

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

架构

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

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

深度学习入门初步_第2张图片

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

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

跨平台

Caffe、CNTK和Theano都能在所有的系统上运行,而TensorFlow和Torch则不支持Windows。

你可能感兴趣的:(深度学习,深度学习)