Figure 14. 加入Batch Normalization的网络的训练过程(Sergey Ioffe et al. 2015)
Early stopping:
Early stopping也是一项在实际应用深度学习模型时防止过拟合的技术,该技术主要通过控制训练的轮数(epoch)来防止过拟合,也就是在validation loss不再持续下降时自动停止训练。实际上,early stopping可以应用在很多机器学习问题上,例如非参回归、boosting等。另外,early stopping也可以看成是一种正则化的形式。
Regularization:
这里所说的regularization是指狭义上像L1、L2等对控制权重的正则化,不包括前面提及的Dropout和early stopping等。对网络的权重参数加上L1或L2正则项也是一种比较常用的防止过拟合的手段,L1/L2正则化的方法在机器学习中应用非常广泛,这里也不再赘述。
深度学习常见的实现平台和框架
深度学习模型由于其复杂性对机器硬件以及平台均有一定的要求,一个好的应用平台可以使得模型的训练事半功倍。那么,针对深度学习有哪些比较流行好用的平台和框架呢?下面就向大家介绍一些比较常用的深度学习平台以及它们的优缺点。
Caffe:
Caffe是由美国加州伯克利分校视觉与学习中心在2013年开发并维护的机器学习库,它对卷积神经网络具有非常好的实现(http://caffe.berkeleyvision.org )。Caffe是基于C/C++开发的,所以模型计算的速度相对较快,但是Caffe不太适合文本、序列型的数据的处理,也就是在RNN的应用方面有很大的限制,其优缺点可以简单的总结如下:
优点:适合图像处理;版本稳定,计算速度较快
缺点:不适合RNN应用;不可扩展;不便于在大型网络中使用;C/C++编程难度较大,不够简洁;几乎不再更新
Theano/Tensorflow:
Theano和Tensorflow都是比较底层的机器学习库,并且都是一种符号计算框架,它们都适用于基于卷积神经网络、循环神经网络以及贝叶斯网络的应用,它们都提供Python接口,Tensorflow还提供C++接口。Theano是在2008年由蒙特利尔理工学院LISA实验室开发并维护的(http://deeplearning.net/software/theano/ ),非常适合数值计算优化,并且支持自动计算函数梯度,但它不支持多GPU的应用。Tensorflow是由Google Brain团队开发的,目前已经开源,由Google Brain团队以及众多使用者们共同维护(https://www.tensorflow.org )。
Tensorflow通过预先定义好的数据流图,对张量(tensor)进行数值计算,使得神经网络模型的设计变得非常容易。与Theano相比,Tensorflow支持分布式计算和多GPU的应用。就目前来看,Tensorflow是在深度学习模型的实现上应用最为广泛的库。
Keras:
Keras是一个基于Theano和Tensorflow的,高度封装的深度学习库(https://keras.io/ )。它是由是由谷歌软件工程师Francois Chollet开发的,在开源之后由使用者共同维护。Keras具有非常直观的API,使用起来非常的简洁,一般只需要几行代码便可以构建出一个神经网络模型。目前,Keras已经发布2.0版本,支持使用者从底层自定义网络层,这很大程度上弥补了之前版本在灵活性上不够的缺陷。
Torch/PyTorch:
Torch是基于Lua语言开发的一个计算框架(http://torch.ch/ ),可以非常好的支持卷积神经网络。在Torch中网络的定义是以图层的方式进行的,这导致它不支持新类型图层的扩展,但是新图层的定义相对比较容易。Torch运行在LuaJIT上,速度比较快,但是目前Lua并不是主流编程语言。另外,值得注意的是Facebook在2017年1月公布了Torch 的Python API,即PyTorch的源代码。PyTorch支持动态计算图,方便用户对变长的输入输出进行处理,另外,基于python的库将大幅度增加Torch的集成灵活性。
Lasagne:
Lasagne是一个基于Theano计算框架(http://lasagne.readthedocs.io/en/latest/index.html ),它的封装程度不及Keras,但它提供小的接口,这也使得代码与底层的Theano/Tensorflow比较为简洁。Lasagne这种半封装的特性,平衡了使用上的便捷性和自定义的灵活性。
DL4J:
DL4J(Deeplearning4j)是一个基于Java的深度学习库(https://deeplearning4j.org/ )。它是由Skymind公司在2014年发布并开源的,其包含的深度学习库是商业级应用的开源库,由于是基于Java的,所以可以与大数据处理平台Hadoop、Spark等集成使用。DL4J依靠ND4J进行基础的线性代数运算,计算速度较快,同时它可以自动化并行,因此十分适合快速解决实际问题。
MxNet:
MxNet是一个由多种语言开发并且提供多种语言接口的深度学习库(http://mxnet.io/ )。MxNet支持的语言包括Python,R,C++,Julia,Matlab等,提供C++, Python, Julia, Matlab, JavaScript,R等接口。MxNet是一个快速灵活的学习库,由华盛顿大学的Pedro Domingos及其研究团队开发和维护。目前,MxNet已被亚马逊云服务所采用。
CNTK:
CNTK是微软的开源深度学习框架(http://cntk.ai ),是基于C++开发的,但是提供Python接口。CNTK的特点是部署简单,计算速度比较快,但是它不支持ARM架构。CNTK的学习库包括前馈DNN、卷积神经网络和循环神经网络。
Neon:
Neon是Nervana公司开发的一个基于Python的深度学习库(http://neon.nervanasys.com/docs/latest/ )。该学习库支持卷积神经网络、循环神经网络、LSTM以及Autoencoder等应用,目前也是开源状态。有报道称在某些测试中,Neon的表现要优于Caffe、Torch和Tensorflow。
深度学习网络实例
通过前面的介绍,读者对于深度学习已经有了比较详细的了解,那么实际应用中深度学习网络究竟是怎么样设计的呢?本节我们向大家介绍几种应用效果非常好的深度学习网络,从中我们可以体会到神经网络设计的一些技巧。
LeNet:
LeNet是由Yann LeCun等最早提出的一种卷积神经网络,我们在介绍CNN的时候已经提到过该网络(Figure 7)。LeNet网络总共有7层(不包括输入层),分别是C1、S2、C3、S4、C5、F6以及OUTPUT层,其中C1、C3为卷积层,S2、S4为下采样层,C5、F6为全连接层。该网络的输入时32 X 32的图片,C1包含6个特征图(feature maps),C3包含16个特征图,两个全连接层的神经元数量分别是120和84,最终的输出层含有10个神经元,对应十个类别。这个网络在训练过程中总共需要优化大约12000个参数,在手写数字识别(MNIST数据集)的任务上效果远优于传统的机器学习方法。这一网络的提出提供了一个卷积神经网络应用的范例,也就是将卷积层与采样层(后来的池化层)交替连接,最后在展开连接全连接层。实践证明在很多任务中这一网络结构具有较好的表现。
AlexNet:
AlexNet是Alex和Hinton参加ILSVRC2012比赛时所使用的卷积神经网络,该网络可以说是更深层次的CNN在大数据集上应用的开山之作,随后诸多应用均是在此网络的基础上发展而来。AlexNet由5个卷积层和3个全连接层组成,其中第1,2,5卷积层后加入了池化过程(Figure 15),各层神经元的数目分别是253440、186624、64896、64896、43264、4096、4096和1000,总计涉及的参数达到6千万。该网络的训练集是来自ImageNet的140万包含1000个类别的高分辨率图片,其中有5万作为验证集,15万作为测试集。在训练该网络的过程中,采用ReLu作为激活函数,并且对图片数据通过水平翻转等方法进行了扩增,为了防止过拟合,该网络中还使用了dropout技术,网络的优化采用了批量梯度下降并加入了动量和权值衰减。整个训练过程在两个GTX 580的GPU上持续了5-6天。最终的结果是该网络在ILSVRC2012比赛中取得了最好的成绩,并且远远由于其他方法。