查看原文
其他

深度学习入门

引言 


       近几年来人工智能越来越火,大家都已经知道了AlphaGo的威力,然而在其背后,从技术层面来说,深度学习功不可没。那么深度学习到底是什么,其与传统的机器学习之间又有什么样的关联。对于想入坑深度学习的同学,又该从哪些方面入手。这就是本文要回答的问题。


深度学习的提出


       先从深度学习的提出开始说起,深度学习的概念是由Hinton在2006年提出,他当时首次提出了深度信念网络(DBN),相比之前,他采用无监督方式逐层训练深层网络,在深层网络训练中取得了跨越式的进展。虽然称为是深度学习,但其实是深层神经网络。神经网络或者说人工神经网络早在上个世纪都已经提出,但是在Hinton之前,很少人尝试去训练深层神经网络,也当然没有深度的概念了。2006年可以说是深度学习的元年,但是对于神经网络来说,虽然不是元年,但确是其振兴的又一个重要转折点。神经网络之前经历了跌宕的发展,但是从此时之后,它重回时代的舞台。


深度学习的兴起

       

这里有必要谈一下深度学习的兴起原因。为什么是深度学习或者说是深层神经网络成为热点。神经网络从生物相似性来说,应该是比较理想的人工智能实现载体,因为其与生物的神经元结构是类似的。通过层与层之间的连接或者传递,可以实现复杂模式的学习。早在上个世纪,就已经证明了单隐含层的神经网络就可以实现任何非线性模式的拟合。因此,经典的BP神经网络也大多采用单个隐含层,按理说可以拟合任何模型。不过这毕竟是理想,现实并非如此,因为找到这个优化点就是个大难题。那么人们可能会尝试增加隐含层的个数即深层神经网络,从直观上讲,深层神经网络要由于增加了隐含层,表达力会更强,而且应该在实践中比浅层神经网络的效果要好。但是在真实情境中却并不是这样,因为在当时深层神经网络的训练难度要大,这与算法、数据以及计算力都有关系。比如,我们知道神经网络的初始参数对网络训练可能会影响很大,较糟糕的初始参数可能会导致网络很难收敛,对深层神经网络这个效应更大,而Hinton提出无监督预训练方式也就是解决网络的初始参数问题,无监督预训练的原理是他假定一个好的特征表达,后面的输出层总是可以重构出前面的输入层。还有如果你的训练样本很少,也很难训练出一个很好的深度模型。而目前深度学习之所以热,就是现在出现了新技术来解决深层神经网络的难训练问题。这主要归功于以下三个方面:

       (1) 计算力的提高:大家都知道的摩尔定律,以及GPU,FPGA,ASIC等在深度学习的应用;

       (2) 大数据时代的到来:我们有了更多的训练样本;

       (3) 算法的创新:启发式的参数初始化,新的激活函数、优化方法以及网络架构等;

       深度学习的兴起与这三个方面紧密相关,其实更重要的是前两个方面,因为深度学习的核心算法相比之前并没有太大的变革,也难怪有人称为深度学习为“暴力计算型”人工智能,有了更多的训练数据,加上强大的计算能力我们完全可以拟合更好的模型,之前是理论上可以实现,现在是实践上做得越来越好。值得一提的是,深度学习是一个发展迅速的领域,尤其是近几年更是暴热,当年Hinton提出的深度信念网络现在也被遗忘在角落里了,也许这就是技术变革吧。


深度学习与机器学习


       由于之前神经网络也是归到机器学习的范畴,毕竟是表征学习(Representation learning),还是在机器学习的定义中,所以从这个角度来看,深度学习也是在机器学习之下的,但是由于时势造英雄,只不过单独被拎出来罢了,而现在我们说机器学习可能大多是指传统的机器学习方法如决策树及支持向量机等,或者说是除了神经网络之外的算法,不过从本质上讲,机器学习应该囊括了深度学习,至少现在还是这样。


深度学习如何入门


       如果要入门深度学习,掌握了神经网络基础之后,可以先学习深度学习两个最基本的模型:卷积神经网络(CNnsorflow以及Facebook的Pytorch等等,大家可以选择某个框架从简单的N)和递归神经网络(RNN)。前者主要用于计算机视觉(CV),后者主要用于自然语言处理(NLP)。其实两种模型也早在上个世纪被提出,不过加上深度,两个模型分别在两个不同的领域取得重大进展。然后还要学习一下深度学习模型的训练方法,即相关梯度下降法(SGD)以及相关变体,值得注意的是SGD方法需要计算梯度,这不得牵扯到经典的BP算法,还有一些自动求导的方法,这些也只很重要的方面。接着要开始学习深度学习的框架,如Google的Tedemo开始搭建模型,这对学习理论是有裨益的。作为一个迅猛发展的领域,最重要的是要开始跟进一些最新的paper,多学习一些新的模型及架构。下面我们来介绍CV中使用最多的CNN模型。


从CNN模型开始


       CNN模型也应该算是生物启发式模型,Hubel和Wiesel在研究猫脑皮层中发现其视觉皮层中存在局部感受域,继而提出了CNN。在讲CNN之前,我们先看看传统的神经网络模型,如果加上深度,就称为DNN模型。一个3层的DNN模型如图1所示:

        


可以看到层与层之间的神经元是两两连接的,即前面层与后面层的任何两个神经元都是相互连接的,我们一般称之为这样的层为全连接层,这样整个网络非常稠密,需要参数相对较多。由于是全连接,每个层之间的神经元应该来说是没有位置区别的,反正总是与后面层的所有神经元相连。但是我们知道,对于图像来说,其输入是一个矩阵(2-D),对于彩色图片加上通道数应该是三维张量(3-D),不过可以看成3个矩阵。如果直接采用全连接层,肯定是不太合适的,因为你需要将输入拉平成一个向量,这样会丧失空间信息。而CNN就是专门来解决2-D输入的问题。图2为一个小型的CNN模型:



可以看到输入是一个2-D灰度图片,其网络层包含卷积层(Convolution layer)、下采样层(Sub-sampling layer)以及全连接层(Fully connected layer)。首先看卷积层,在这之前,我们先介绍一些概念,在CNN中我们一般称一个2-D为一个特征图(feature map),比如S1层含有4个特征图,而S2层含6有个特征图。可以看到相比全连接层,其不再是输入层每个神经元与后面层的每个神经元相连,而是输入层的一小块局部区域与后面的神经元相连。比如C1层的4个特征图的中间的小块矩阵与S2层中的第一个特征图的某个神经元相连,而且对于输出层的一个特征图来说,所有的权重值是共享的。假设一个2x2的矩阵块与后面层的一个特征图的一个神经元相连,那么计算这样一个神经元,需要的权重为4x(2x2+1)=20(其中1为偏置bias),如图3所示,每个2x2的矩阵输入乘以对应的权值,再加上偏置,就得输出层特征图上的一个神经元。如果我们设置长度与宽度上的步长(strides),你可以认为是在两个维度上进行滑动,那么存在很多这样的矩阵块,比如输入层的一个特征图的大小为32x32,长度与宽度上步长均为1,那么可以计算出输出的特征图的长度与宽度均为(32-2+1)=31,有时候你希望输入与输出的大小一致,那么需要在输入图边缘进行补零操作(zero-padding),可以计算出边缘仅需要补一个零就可以得到32x32的输出特征图,这是两种不同的模式:VALID与PADDING模式。有一点要注意:对于输出层的一个特征图来说,所有的矩阵块在计算出对应的神经元时采用的权重是一样的,这就是权值共享。就是说,计算出一个特征图就只需要40个权重值就够了,通过权值共享,需要训练的参数大大降低。如果你需要输出6个特征图,那么仅需要20x6=120个参数。可以看到卷积操作相比全连接层其使用的参数会少很多。我们一般称卷积的权重值为卷积核,采用不同的卷积核,可以得到不同的特征图,如上面采用6个卷积核,得到6个输出特征图。从图像的角度来说,采用不同的卷积核意味着抓取图片的不同的特征,所以叫特征图。一般在CNN中,我们称特征图的个数为通道数(channels)。还有一点,这里我们默认输入层的所有特征图卷积成一个特征图,事实上也可以采用不同的组合生成特征图,如输入层的1,2,3特征图生成输出层的第一个特征图。这样可以降低计算量,所以早期的CNN会采用这种方式,不过现在很少采用这样的组合方式,因为计算力可能不再是瓶颈了。


图3:卷积实例(来源:deeplearning.net)


一般对应卷积层之后是下采样层,也一般称为池化层(pooling layer),池化层不需要参数,一般是降低卷积之后得到特征图的大小。可以看到,S2层中的第一个特征图的一小块矩阵被压缩到C2层第一个特征图的一个神经元,压缩的方式可以采用取平均值或者最大值,一般采用后者。池化操作不像卷积操作,池化不再是特征图的组合,而是输入层的一个特征图就对应输出层的一个特征图。这就是经典的CNN模型的基本单元:卷积+池化。通过这样单元的堆积可以形成深度CNN模型,最后加上全连接层即可。不过现在的CNN有时候不再使用池化层,而是用更多的卷积层来代替,也许是因为池化并没有太大的性能优势。而且有些网络是全卷积操作,连后面的全连接层都被替换了。感兴趣的可以继续深挖。


总结


       这篇小文简单介绍了深度学习的一些基本知识以及经典的CNN模型,可以看到深度学习并没有想象中那么可怕,并且现在出现了越来越多灵活的深度学习框架,大家可以分分钟建立一个深度学习模型。重要的是不断学习,尤其是对于这样一个飞速发展的领域。




有任何问题请加我的个人微信:JeemyJohn,或扫描如下二维码:



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存