注:最近打算将UFLDL教程重新看一遍,其实里面有很多关于神经网络以及深度学习的知识点很有用,但是只是学习深度学习的话有一些内容就有点多余,所以想整理一个笔记,记录下神经网络到深度学习的一些知识点。整个教材已经非常好,网上有原版的英文版,也有翻译的中文版,这个只是自己的学习笔记,对原来教程中的内容进行了梳理,有些图也是引用的原来的教程,若内容上有任何错误,希望与我联系,若内容有侵权,同样也希望告知,我会尽快删除。
这个笔记主要分为以下几个部分: - 神经网络 - 自编码器与稀疏性 - Softmax回归 - 自我学习 - 深度网络 - 其他,如PCA
前面的网络形式最多是三层的网络结构,即输入层,一个隐含层和一个输出层,这是一个“浅”层的网络结构。
网络结构中的“浅”值的是隐藏层的个数,即特征生成的网络层数。
我们知道,每一个隐藏层可以对上一层的输出进行非线性变换,这样,每增加一个隐藏层就可以计算出更加复杂的特征表示,那么,使用“深”层的神经网络将会比使用“浅”具有更好的表达能力。
使用深度网络最主要的优势在于:它能以更加紧凑的方式来表达比浅层网络大得多的函数集合。这样,对于图像,就能够学习到“部分-整体”的分解关系。深度网络是一种层次的网络结构模型。
但是简单的增加网络中隐含层的数量对于训练整个网络模型具有一定的难度,主要表现在:
通常对于深度网络,可采用逐层贪婪的训练方法,即每次训练一个只包含一个隐层的网络,训练完成后再训练下一个隐层,依次类推下去。在每一层的训练过程中,可以使用有监督的训练方法,也可以使用无监督的训练方法。最终将逐层训练得到的参数用来初始化整个网络的权重,最后对整个网络进行“微调”。
对于逐层训练的方法,主要有两方面的好处:
自编码器的结构如下图所示:
下面以分类为例,对整个训练过程进行描述,首先将原始的输入x(k)作为输入训练第一个自编码神经网络,如下图所示:
此时,对于每一个训练样本x(k)便能得到其隐含层的输出h(1)(k),将这个隐含层的输出作为第二个自编码器的输入,继续训练第二个自编码器,可以由下图表示:
将整个过程连接在一起便可以由下图表示出来:
栈式自编码神经网络具有强大的表达能力,这主要得益于其层次的特征表示。通过一层一层的特征学习,可以学习到特征之间的层次结构。在上述的自编码神经网络的分类中,可以丢弃第二个自编码器的“解码”过程,直接将隐含层的输出作为Softmax回归的输入。
微调是深度学习的一种策略,可以提高栈式自编码神经网络的性能。在微调的过程中,将整个栈式自编码神经网络的所有层都看成一个模型,统一对模型中的参数进行修正的过程。
进行全局微调的通用的方式是对误差进行反向传播,利用前面在神经网络中的推导:
前面介绍的神经网络模型都是全连接的网络,全连接是指当前层的每一个节点与前一层的所有节点之间都存在着相连的边。对于输入节点而言,若输入节点的个数较少,那么利用全连接的方式影响并不是太大,若是输入节点的个数变得很多,此时利用全连接的方式,需要学习的参数会变得特别多,举个简单的例子,如上面的自编码器,输入层是666个输入节点和一个偏置节点,隐含层是4个隐层节点,此时需要训练的参数个数是4∗6+4=28个参数,若此时增加到12个输入节点,隐含层的节点个数不变,此时需要训练的参数个数为4∗12+4=52个参数,需要训练的个数急剧扩大。
为了解决这样的问题,可以对隐含单元和输入单元之间加上限制条件:每个隐含单元仅仅只和一部分的输入单元相连接。
以上的思想称为部分连接,也称为稀疏连接,部分连接的思想受启发于生物学里面的视觉系统结构。视觉皮层的神经元是局部接受信息的。
自然图像有一个性质:一部分的统计特性与其他部分是一样的。
利用这样的性质,可以将一部分学习的特征应用在另一部分上。为了获得卷积特征,需要对一部分的数据进行卷积运算,具体过程如下图所示:
在通过卷积操作得到的特征后,其特征的维数很大,很容易出现“过拟合”的情况,通常可以对特征进行聚合统计,聚合统计的方法主要有求平均值或者最大值,这个过程也被称为池化(Pooling)。下面的过程解释了池化的具体过程。
通过卷积操作和池化的操作,我们便得到了特征,将特征应用在各种分类器中,如Softmax回归中,便能对样本进行分类。
这里只是简单介绍了卷积和池化的过程,更多的卷积神经网络的知识可以见以后的专题。
若需要PDF版本,请关注我的新浪博客@赵_志_勇,私信你的邮箱地址给我。
1、英文版:UFLDL Tutorial
2、中文版:UFLDL教程