为什么稀疏自编码器 python很少见到多层的

&p&一、前期准备:&/p&&p&1.1、数学基础知识:如果你前面对矩阵,概率的一些完全基础的知识都已经忘得差不多了。那么我建议先看看《Deep Learning》这本书的2~4章。这本书是Ian Goodfellow, Yoshua Bengio和Aaron Courville写的一本深度学习的入门教材,非常适合大家阅读,而且阅读起来由浅入深,循序渐进,公式很好,可读性非常强。Deep Learning英文版本可以在这里看到。(&a href=&http://link.zhihu.com/?target=http%3A//www.deeplearningbook.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Deep Learning&/a&)。如果您对英文实在是怵得厉害,那么现在有中文翻译版。(&a href=&http://link.zhihu.com/?target=https%3A//github.com/ExtremeMart/DeepLearningBook-CN& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ExtremeMart/DeepLearningBook-CN&/a&)。看完这几章的内容,你对要跑起来的深度学习内容估计问题就不大了。看懂一般的模型也问题不大了。&/p&&p&1.2、编程语言:如果你刚开始是抱着学习深度学习模型的目的来的,那么你用Python或者是Matlab就好(当然还是强烈建议用Python)。语言学习其实最开始你了解一下大概这种语言是怎么运行的,然后再添加一点基本的语法知识,就差不多了。尤其是Python这么语言,你找一个对这个语言熟知的同学叫你两个小时就不多可以了。然后调试程序这些,比较建议用Anaconda(&a href=&http://link.zhihu.com/?target=https%3A//anaconda.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&:: Anaconda Cloud&/a&),尤其是Spyder,调试程序,参看中间结果非常方面。&/p&&p&1.3、软件库:因为前面强烈推荐的是Python,那么这里我也主要是针对Python来推荐。现在Tensorflow特别火,受到了广大深度学习从业者和爱好者的一致好评。而这也是Google维护的一个深度学习库,因此相关的配套非常的完善,现在安装也是最方便的,不像以前的Theano安装还需要好几步,现在就算是在Windows的平台下,其安装也只要“pip install tensorflow”一条命令就可以解决。而基于tensorflow的更高一层的库Keras则对于大家学习模型、搭框架又提供了一条更加方便的途径,这里也比较推荐。&/p&&p&二、基本模型:&/p&&p&前面列去了几个前期需要准备的基础内容和平台选择方案,现在这一小节,给大家总结一下深度学习里面的基本模型。我将这些模型大致分为了这几类:多层感知机模型;深度神经网络模型和递归神经网络模型。&/p&&p&2.1 多层感知机模型:&/p&&p&2.1.1 Stacked Auto-Encoder堆叠自编码器&/p&&p&堆叠自编码器是一种最基础的深度学习模型,该模型的子网络结构自编码器通过假设输出与输入是相同的来训练调整网络参数,得到每一层中的权重。通过堆叠多层自编码网络可以得到输入信号的几种不同表征(每一层代表一种表征),这些表征就是特征。自动编码器就是一种尽可能复现输入信号的神经网络。为了实现这种复现,自编码器就必须捕捉可以代表输入数据的最重要的因素,就像PCA那样,找到可以代表原信息的主要成分。&/p&&p&2.1.1.1 网络结构&/p&&p&堆叠自编码器的网络结构本质上就是一种普通的多层神经网络结构。&/p&&br&&figure&&img src=&http://pic3.zhimg.com/v2-77b3d4b7dae8aa67be0e00a800f9f062_b.png& data-rawwidth=&748& data-rawheight=&437& class=&origin_image zh-lightbox-thumb& width=&748& data-original=&http://pic3.zhimg.com/v2-77b3d4b7dae8aa67be0e00a800f9f062_r.png&&&/figure&&p&图1
自编码器网络结构&/p&&p&2.1.1.2 训练过程&/p&&p&堆叠自编码器与普通神经网络不同之处在于其训练过程,该网络结构训练主要分两步:非监督预训练和有监督微调训练。&/p&&p&(1)非监督预训练&/p&&p&自编码器通过自学习得到原始数据的压缩和分布式表征,一般用于高层特征提取与数据非线性降维。结构上类似于一个典型的三层BP神经网络,由一个输入层,一个中间隐含层和一个输出层构成。但是,输出层与输入层的神经元个数相等,且训练样本集合的标签值为输入值,即无标签值。输入层到隐含层之间的映射称为编码(Encoder),隐含层到输出层之间的映射称为解码(Decoder)。非监督预训练自编码器的中间层为特征层,在训练好第一层特征层后,第二层和第一层的训练方式相同。我们将第一层输出的特征层当成第二层的输入层,同样最小化重构误差,就会得到第二层的参数,并且得到第二层输入的特征层,也就是原输入信息的第二个表征。以此类推可以训练其他特征层。&/p&&p&(3)有监督微调训练&/p&&p&经过上面的训练方法,可以得到一个多层的堆叠自编码器,每一层都会得到原始输入的不同的表达。到这里,这个堆叠自编码器还不能用来分类数据,因为它还没有学习如何去连结一个输入和一个类。它只是学习获得了一个可以良好代表输入的特征,这个特征可以最大程度上代表原输入信号。那么,为了实现分类,我们就可以在AutoEncoder的最顶的编码层添加一个分类器(例如逻辑斯蒂回归、SVM等),然后通过标准的多层神经网络的监督训练方法(梯度下降法)微调训练。&/p&&p&2.1.1.3 典型改进&/p&&p&(1)Sparse AutoEncoder稀疏自编码器&/p&&p&在AutoEncoder的基础上加上L1的稀疏限制(L1主要是约束每一层中的节点中大部分都要为0,只有少数不为0,这就是Sparse名字的来源)来减小过拟合的影响,我们就可以得到稀疏自编码器。&/p&&p&(2)Denoising AutoEncoders降噪自编码器&/p&&p&降噪自动编码器是在自动编码器的基础上,训练数据加入噪声,所以自动编码器必须学习去去除这种噪声而获得真正的没有被噪声污染过的输入。因此,这就迫使编码器去学习输入信号的更加鲁棒的表达,这也是它的泛化能力比一般编码器强的原因。&/p&&p&2.1.1.4 模型优缺点&/p&&p&(1)优点:&/p&&p&(1)、可以利用足够多的无标签数据进行模型预训练;&/p&&p&(2)、具有较强的数据表征能力。&/p&&p&(2)缺点:&/p&&p&(1)、因为是全连接网络,需要训练的参数较多,容易出现过拟合;深度模型容易出现梯度消散问题。&/p&&p&(2)、要求输入数据具有平移不变性。&/p&&br&&p&2.1.2、Deep belief network 深度信念网络&/p&&p&2006年,Geoffrey Hinton提出深度信念网络(DBN)及其高效的学习算法,即Pre-training+Fine tuning,并发表于《Science》上,成为其后深度学习算法的主要框架。DBN是一种生成模型,通过训练其神经元间的权重,我们可以让整个神经网络按照最大概率来生成训练数据。所以,我们不仅可以使用DBN识别特征、分类数据,还可以用它来生成数据。&/p&&p&2.1.2.1 网络结构&/p&&p&深度信念网络(DBN)由若干层受限玻尔兹曼机(RBM)堆叠而成,上一层RBM的隐层作为下一层RBM的可见层。下面先介绍RBM,再介绍DBN。&/p&&p&(1) RBM&/p&&br&&figure&&img src=&http://pic2.zhimg.com/v2-7d66cb7d6a1c307af96feddc48507b4d_b.png& data-rawwidth=&463& data-rawheight=&226& class=&origin_image zh-lightbox-thumb& width=&463& data-original=&http://pic2.zhimg.com/v2-7d66cb7d6a1c307af96feddc48507b4d_r.png&&&/figure&&p&图2
RBM网络结构&/p&&p&一个普通的RBM网络结构如上图所示,是一个双层模型,由m个可见层单元及n个隐层单元组成,其中,层内神经元无连接,层间神经元全连接,也就是说:在给定可见层状态时,隐层的激活状态条件独立,反之,当给定隐层状态时,可见层的激活状态条件独立。这保证了层内神经元之间的条件独立性,降低概率分布计算及训练的复杂度。RBM可以被视为一个无向图模型,可见层神经元与隐层神经元之间的连接权重是双向的,即可见层到隐层的连接权重为W,则隐层到可见层的连接权重为W’。除以上提及的参数外,RBM的参数还包括可见层偏置b及隐层偏置c。&/p&&p&RBM可见层和隐层单元所定义的分布可根据实际需要更换,包括:Binary单元、Gaussian单元、Rectified Linear单元等,这些不同单元的主要区别在于其激活函数不同。&/p&&p&(2) DBN&/p&&figure&&img src=&http://pic4.zhimg.com/v2-bc5614ecb4dcd1e8bad8b5f179a0e87b_b.png& data-rawwidth=&415& data-rawheight=&287& class=&content_image& width=&415&&&/figure&&br&&p&图3
DBN模型结构&/p&&p&DBN模型由若干层RBM堆叠而成,如果在训练集中有标签数据,那么最后一层RBM的可见层中既包含前一层RBM的隐层单元,也包含标签层单元。假设顶层RBM的可见层有500个神经元,训练数据的分类一共分成了10类,那么顶层RBM的可见层有510个显性神经元,对每一训练数据,相应的标签神经元被打开设为1,而其他的则被关闭设为0。&/p&&p&2.1.2.2 训练过程&/p&&p&DBN的训练包括Pre-training和Fine tuning两步,其中Pre-training过程相当于逐层训练每一个RBM,经过Pre-training的DBN已经可用于模拟训练数据,而为了进一步提高网络的判别性能, Fine tuning过程利用标签数据通过BP算法对网络参数进行微调。&/p&&p&(1) Pre-training&/p&&p&如前面所说,DBN的Pre-training过程相当于逐层训练每一个RBM,因此进行Pre-training时直接使用RBM的训练算法。&/p&&p&(2) Fine tuning&/p&&p&建立一个与DBN相同层数的神经网络,将Pre-training过程获得的网络参数赋给此神经网络,作为其参数的初始值,然后在最后一层后添加标签层,结合训练数据标签,利用BP算法微调整个网络参数,完成Fine tuning过程。&/p&&p&2.1.2.3 改进模型&/p&&p&DBN的变体比较多,它的改进主要集中于其组成“零件”RBM的改进,下面列举两种主要的变体。(这边的改进模型暂时没有深入研究,所以大概参考网上的内容)&/p&&p&(1) 卷积DBN(CDBN)&/p&&p&DBN并没有考虑到图像的二维结构信息,因为输入是简单的将一个图像矩阵转换为一维向量。而CDBN利用邻域像素的空域关系,通过一个称为卷积RBM(CRBM)的模型达到生成模型的变换不变性,而且可以容易得变换到高维图像。&/p&&p&(2) 条件RBM(Conditional RBM)&/p&&p&DBN并没有明确地处理对观察变量的时间联系的学习上,Conditional RBM通过考虑前一时刻的可见层单元变量作为附加的条件输入,以模拟序列数据,这种变体在语音信号处理领域应用较多。&/p&&p&2.1.2.4 典型优缺点&/p&&p&对DBN优缺点的总结主要集中在生成模型与判别模型的优缺点总结上。&/p&&p&(1)优点:&/p&&p&(1)、生成模型学习联合概率密度分布,所以就可以从统计的角度表示数据的分布情况,能够反映同类数据本身的相似度;&/p&&p&(2)、生成模型可以还原出条件概率分布,此时相当于判别模型,而判别模型无法得到联合分布,所以不能当成生成模型使用。&/p&&p&(2)缺点:&/p&&p&(1)、 生成模型不关心不同类别之间的最优分类面到底在哪儿,所以用于分类问题时,分类精度可能没有判别模型高;&/p&&p&(2)、由于生成模型学习的是数据的联合分布,因此在某种程度上学习问题的复杂性更高。&/p&&p&(3)、要求输入数据具有平移不变性。&/p&&br&&p&2.2、Convolution Neural Networks卷积神经网络&/p&&p&卷积神经网络是人工神经网络的一种,已成为当前语音分析和图像识别领域的研究热点。它的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。&/p&&p&2.2.1 网络结构&/p&&p&卷积神经网络是一个多层的神经网络,其基本运算单元包括:卷积运算、池化运算、全连接运算和识别运算。&/p&&br&&figure&&img src=&http://pic1.zhimg.com/v2-4ae4bfe55f4ee2f5c663c_b.png& data-rawwidth=&802& data-rawheight=&300& class=&origin_image zh-lightbox-thumb& width=&802& data-original=&http://pic1.zhimg.com/v2-4ae4bfe55f4ee2f5c663c_r.png&&&/figure&&br&&p&图4
卷积神经网络结构&/p&&p&l 卷积运算:前一层的特征图与一个可学习的卷积核进行卷积运算,卷积的结果经过激活函数后的输出形成这一层的神经元,从而构成该层特征图,也称特征提取层,每个神经元的输入与前一层的局部感受野相连接,并提取该局部的特征,一旦该局部特征被提取,它与其它特征之间的位置关系就被确定。&/p&&p&l 池化运算:它把输入信号分割成不重叠的区域,对于每个区域通过池化(下采样)运算来降低网络的空间分辨率,比如最大值池化是选择区域内的最大值,均值池化是计算区域内的平均值。通过该运算来消除信号的偏移和扭曲。&/p&&p&l 全连接运算:输入信号经过多次卷积核池化运算后,输出为多组信号,经过全连接运算,将多组信号依次组合为一组信号。&/p&&p&l 识别运算:上述运算过程为特征学习运算,需在上述运算基础上根据业务需求(分类或回归问题)增加一层网络用于分类或回归计算。&/p&&p&2.2.2 训练过程&/p&&p&卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。卷积网络执行的是有监督训练,所以其样本集是由形如:(输入信号,标签值)的向量对构成的。&/p&&p&2.2.3 典型改进&/p&&p&卷积神经网络因为其在各个领域中取得了好的效果,是近几年来研究和应用最为广泛的深度神经网络。比较有名的卷积神经网络模型主要包括1986年Lenet,2012年的Alexnet,2014年的GoogleNet,2014年的VGG,2015年的Deep Residual Learning。这些卷积神经网络的改进版本或者模型的深度,或者模型的组织结构有一定的差异,但是组成模型的机构构建是相同的,基本都包含了卷积运算、池化运算、全连接运算和识别运算。&/p&&p&2.2.4 模型优缺点&/p&&p&(1)优点:&/p&&p&(1)、权重共享策略减少了需要训练的参数,相同的权重可以让滤波器不受信号位置的影响来检测信号的特性,使得训练出来的模型的泛化能力更强;&/p&&p&(2)、池化运算可以降低网络的空间分辨率,从而消除信号的微小偏移和扭曲,从而对输入数据的平移不变性要求不高。&/p&&p&(2)缺点:&/p&&p&(1)、深度模型容易出现梯度消散问题。&/p&&br&&p&2.3、Recurrent neural network 递归神经网络&/p&&p&在深度学习领域,传统的多层感知机为基础的上述各网络结构具有出色的表现,取得了许多成功,它曾在许多不同的任务上——包括手写数字识别和目标分类上创造了记录。但是,他们也存在一定的问题,上述模型都无法分析输入信息之间的整体逻辑序列。这些信息序列富含有大量的内容,信息彼此间有着复杂的时间关联性,并且信息长度各种各样。这是以上模型所无法解决的,递归神经网络正是为了解决这种序列问题应运而生,其关键之处在于当前网络的隐藏状态会保留先前的输入信息,用来作当前网络的输出。&/p&&p&许多任务需要处理序列数据,比如Image captioning, speech synthesis, and music generation 均需要模型生成序列数据,其他领域比如 time series prediction, video analysis, and musical information retrieval 等要求模型的输入为序列数据,其他任务比如机器翻译,人机对话,controlling a robot 的模型要求输入输出均为序列数据。&/p&&p&2.3.1 网络结构&/p&&p&图4.1左侧是递归神经网络的原始结构,如果先抛弃中间那个令人生畏的闭环,那其实就是简单“输入层=&隐藏层=&输出层”的三层结构,但是图中多了一个非常陌生的闭环,也就是说输入到隐藏层之后,隐藏层还会输入给自己,使得该网络可以拥有记忆能力。我们说递归神经网络拥有记忆能力,而这种能力就是通过W将以往的输入状态进行总结,而作为下次输入的辅助。可以这样理解隐藏状态:&/p&&p&h=f(现有的输入+过去记忆总结)&/p&&br&&figure&&img src=&http://pic1.zhimg.com/v2-ec9dce13d27d68f108b8_b.png& data-rawwidth=&529& data-rawheight=&258& class=&origin_image zh-lightbox-thumb& width=&529& data-original=&http://pic1.zhimg.com/v2-ec9dce13d27d68f108b8_r.png&&&/figure&&br&&p&图5 递归神经网络结构图&/p&&p&2.3.2 训练过程&/p&&p&递归神经网络中由于输入时叠加了之前的信号,所以反向传导时不同于传统的神经网络,因为对于时刻&i&t&/i&的输入层,其残差不仅来自于输出,还来自于之后的隐层。通过反向传递算法,利用输出层的误差,求解各个权重的梯度,然后利用梯度下降法更新各个权重。&/p&&p&2.3.3 典型改进&/p&&p&递归神经网络模型可以用来处理序列数据,递归神经网络包含了大量参数,且难于训练(时间维度的梯度消散或梯度爆炸),所以出现一系列对RNN优化,比如网络结构、求解算法与并行化。今年来bidirectional RNN (BRNN)与 LSTM在image captioning, language translation, and handwriting recognition这几个方向上有了突破性进展 。&/p&&p&2.3.4 模型优缺点&/p&&p&(1)优点:&/p&&p&(1)、模型是时间维度上的深度模型,可以对序列内容建模;&/p&&p&(2)缺点:&/p&&p&(1)、需要训练的参数较多,容易出现梯度消散或梯度爆炸问题;&/p&&p&(2)、不具有特征学习能力。&/p&&br&&br&&br&&br&&br&&h2&&u&
&/u&&/h2&&p&上次写了一篇机器学习入门的文章后,有人留言说他是从UFLDL来进行入门的。今天我就来讲讲UFLDL及以此来入门深度学习。&/p&&p&背景介绍:&/p&&p&UFLDL是stanford大学的AndrewNG教授维护的一个其上课的wiki界面。Andrew NG此君在工业界和学术界在机器学习、机器人、在线学习等方面真的是做了很多功德无量的大事,具体的内容,下次我再写一篇八卦文深入的八一八此君的各种奇闻异事。&/p&&p&另外,笔者曾经参与翻译UFLDL内容。所以,对于此wiki页面及其内容还是相对熟悉的。&/p&&p&UFLDL其实最主要还是讲的神经网络方面及其周边的一些知识。所以其实要想靠这个页面来学习整个机器学习领域的知识其实不是特别适合的。&/p&&p&但是如果你是想通过UFLDL来学习深度学习尤其是深度自编码神经网络和卷积神经网络这些特定的深度学习模型却是绝佳的入门法宝。&/p&&p&UFLDL的内容总结起来包括了几大部分:神经网络结构及训练方法基础知识、数据预处理基础知识、深度自编码神经网络和卷积神经网络基础知识这几大部分。&/p&&p&其中神经网络机构及训练方法基础知识讲解了最经典的神经网络结构-BP神经网络的结构组成、基本的训练方法等内容,对于没有任何神经网络知识的小伙伴绝对是一个很好的入门教程。而且他提供的作业代码中会教你怎样一步一步将公式转化为matlab的代码以及如何分布调试算法程序。&/p&&p&数据预处理基础知识讲解了数据白化方法和主成成分分析(PCA)的方法,这两类方法都是数据预处理中重要而典型的方法。尤其是PCA,应用非常广泛,也是Hinton发表在Science那篇文章中做比较的一种算法。&/p&&p&在深度自编码神经网络和卷积神经网络的介绍也非常经典。一步一步,公式都很简单,而且很容易和代码联系起来。&/p&&p&综上,UFLDL确实是做深度神经网络学习不可多得的入门教材。&/p&&br&&p&相信只要按照网页上的内容一步一步走,入门深度学习绝对不是梦。
&/p&&p&Good Luck and Have Fun&/p&&br&&br&&p&&u&
&/u&&/p&&br&&p&深度学习仅仅看看UFLDL肯定是不够的,你必须得多实践,实践实践再实践。但是目前众多优秀的开源DL库的诞生,为大家实践DL提供了非常大的方便。这里陆陆续续给大家介绍几个用过的比较好的库。&/p&&p&1、Theano&/p&&p&这个库是DL三座大山之一的Yoshua Bengio所主导建立的一个DL库,也是DL领域在开始阶段最有影响力的一个库。这个库对于DL领域常用的算法支持比较齐全,文档也非常的优秀。安装的话,如果你仅仅只用CPU非常的方面,但是如果你需要用GPU可能会稍微麻烦一点,这里面不同软件之间的兼容性和配置问题可能会让你比较头痛。&/p&&p&另外,如果你对Python比较熟悉(当然,现在做DL的就没有几个不用Python的)的话可以非常容易上手。但是可能最开始可能会对Tensor这种数据格式不是特别的适应,但是这也就是一个熟能生巧的过程,用得多了,自然的就熟悉啦。&/p&&br&&br&&br&&br&&p&广告时间:机器学习、未来智能、机器人相关话题,可关注公众号:智能学之家&/p&&figure&&img src=&http://pic1.zhimg.com/55cd1f8dcd6e246782ec_b.jpg& data-rawwidth=&430& data-rawheight=&430& class=&origin_image zh-lightbox-thumb& width=&430& data-original=&http://pic1.zhimg.com/55cd1f8dcd6e246782ec_r.jpg&&&/figure&
一、前期准备:1.1、数学基础知识:如果你前面对矩阵,概率的一些完全基础的知识都已经忘得差不多了。那么我建议先看看《Deep Learning》这本书的2~4章。这本书是Ian Goodfellow, Yoshua Bengio和Aaron Courville写的一本深度学习的入门教材,非常适合大家…
&b&自编码器&/b&&br&&br&&p&自从Hinton 2006年的工作之后,越来越多的研究者开始关注各种自编码器模型相应的堆叠模型。实际上,自编码器(Auto-Encoder)是一个较早的概念了,比如Hinton等人在年的工作。(说来说去都是这些人呐。。。)&/p&&br&&b&自编码器简介&br&&/b&&br&&p&先暂且不谈神经网络、深度学习,仅是自编码器的话,其原理很简单。自编码器可以理解为一个试图去还原其原始输入的系统。如下图所示。&/p&&br&&figure&&img src=&https://pic2.zhimg.com/f5ccfacef17d59e106b012af_b.png& data-rawwidth=&1070& data-rawheight=&296& class=&origin_image zh-lightbox-thumb& width=&1070& data-original=&https://pic2.zhimg.com/f5ccfacef17d59e106b012af_r.png&&&/figure&&br&&p&图中,虚线蓝色框内就是一个自编码器模型,它由编码器(Encoder)和解码器(Decoder)两部分组成,本质上都是对输入信号做某种变换。编码器将输入信号x变换成编码信号y,而解码器将编码y转换成输出信号&img src=&//www.zhihu.com/equation?tex=%5Ctilde%7Bx%7D+& alt=&\tilde{x} & eeimg=&1&&。即&/p&&br&y=f(x)&br&&br&&img src=&//www.zhihu.com/equation?tex=%5Ctilde%7Bx%7D+& alt=&\tilde{x} & eeimg=&1&&=g(y)=g(f(x))&br&&br&&p&而自编码器的目的是,让输出&img src=&//www.zhihu.com/equation?tex=%5Ctilde%7Bx%7D+& alt=&\tilde{x} & eeimg=&1&&尽可能复现输入x,即tries to copy its input to its output。但是,这样问题就来了——如果f和g都是恒等映射,那不就恒有&img src=&//www.zhihu.com/equation?tex=%5Ctilde%7Bx%7D+& alt=&\tilde{x} & eeimg=&1&&=x了?不错,确实如此,但这样的变换——没有任何卵用啊!因此,我们经常对中间信号y(也叫作“编码”)做一定的约束,这样,系统往往能学出很有趣的编码变换f和编码y。&/p&&br&&p&这里强调一点,对于自编码器,我们往往并不关系输出是啥(反正只是复现输入),我们真正关心的是中间层的编码,或者说是从输入到编码的映射。可以这么想,在我们强迫编码y和输入x不同的情况下,系统还能够去复原原始信号x,那么说明编码y已经承载了原始数据的所有信息,但以一种不同的形式!这就是特征提取啊,而且是自动学出来的!实际上,自动学习原始数据的特征表达也是神经网络和深度学习的核心目的之一。&/p&&br&&p&为了更好的理解自编码器,下面结合神经网络加以介绍。&/p&&br&&b&自编码器与神经网络&/b&&br&&br&&p&神经网络的知识不再详细介绍,相信了解自编码器的读者或多或少会了解一些。简单来讲,神经网络就是在对原始信号逐层地做非线性变换,如下图所示。&/p&&br&&figure&&img src=&https://pic2.zhimg.com/794ae9378840bcb918e594f1409ac1fd_b.png& data-rawwidth=&598& data-rawheight=&731& class=&origin_image zh-lightbox-thumb& width=&598& data-original=&https://pic2.zhimg.com/794ae9378840bcb918e594f1409ac1fd_r.png&&&/figure&&br&&p&该网络把输入层数据x∈Rn转换到中间层(隐层)h∈Rp,再转换到输出层y∈Rm。图中的每个节点代表数据的一个维度(偏置项图中未标出)。每两层之间的变换都是“线性变化”+“非线性激活”,用公式表示即为&/p&&br&h=f(W(1)x+b(1))&br&y=f(W(2)h+b(2))&br&&br&&p&神经网络往往用于分类,其目的是去逼近从输入层到输出层的变换函数。因此,我们会定义一个目标函数来衡量当前的输出和真实结果的差异,利用该函数去逐步调整(如梯度下降)系统的参数(W(1),b(1),W(2),b(2)),以使得整个网络尽可能去拟合训练数据。如果有正则约束的话,还同时要求模型尽量简单(防止过拟合)。&/p&&br&&p&那么,自编码器怎么表示呢?前面已说过,自编码器试图复现其原始输入,因此,在训练中,网络中的输出应与输入相同,即y=x,因此,一个自编码器的输入、输出应有相同的结构,即&/p&&br&&figure&&img src=&https://pic3.zhimg.com/28abeb3e233fcc7a892e_b.png& data-rawwidth=&624& data-rawheight=&731& class=&origin_image zh-lightbox-thumb& width=&624& data-original=&https://pic3.zhimg.com/28abeb3e233fcc7a892e_r.png&&&/figure&&br&&p&我们利用训练数据训练这个网络,等训练结束后,这个网络即学习出了x→h→x的能力。对我们来说,此时的h是至关重要的,因为它是在尽量不损失信息量的情况下,对原始数据的另一种表达。结合神经网络的惯例,我们再将自编码器的公式表示如下:(假设激活函数是sigmoid,用s表示)&/p&&br&y=fθ(x)=s(Wx+b)&br&&img src=&//www.zhihu.com/equation?tex=%5Ctilde%7Bx%7D+& alt=&\tilde{x} & eeimg=&1&&=gθ′(y)=s(W′y+b′)&br&L(x,&img src=&//www.zhihu.com/equation?tex=%5Ctilde%7Bx%7D+& alt=&\tilde{x} & eeimg=&1&&)=L(x,g(f(x)))&br&&br&&p&其中,L表示损失函数,结合数据的不同形式,可以是二次误差(squared error loss)或交叉熵误差(cross entropy loss)。如果&img src=&//www.zhihu.com/equation?tex=W%5E%7B%27%7D%3DW%5E%7BT%7D+& alt=&W^{'}=W^{T} & eeimg=&1&&,一般称为tied weights。&/p&&br&&p&为了尽量学到有意义的表达,我们会给隐层加入一定的约束。从数据维度来看,常见以下两种情况:&/p&&br&&ul&&li&n&p,即隐层维度小于输入数据维度。也就是说从x→h的变换是一种降维的操作,网络试图以更小的维度去描述原始数据而尽量不损失数据信息。实际上,当每两层之间的变换均为线性,且监督训练的误差是二次型误差时,该网络等价于PCA!没反应过来的童鞋可以反思下PCA是在做什么事情。&/li&&/ul&&br&&ul&&li&n&p,即隐层维度大于输入数据维度。这又有什么用呢?其实不好说,但比如我们同时约束h的表达尽量稀疏(有大量维度为0,未被激活),此时的编码器便是大名鼎鼎的“稀疏自编码器”。可为什么稀疏的表达就是好的?这就说来话长了,有人试图从人脑机理对比,即人类神经系统在某一刺激下,大部分神经元是被抑制的。个人觉得,从特征的角度来看更直观些,稀疏的表达意味着系统在尝试去特征选择,找出大量维度中真正重要的若干维。&/li&&/ul&&br&&b&堆叠自编码器&/b&&br&&br&&p&有过深度学习基础的童鞋想必了解,深层网络的威力在于其能够逐层地学习原始数据的多种表达。每一层的都以底一层的表达为基础,但往往更抽象,更加适合复杂的分类等任务。&/p&&br&&p&堆叠自编码器实际上就在做这样的事情,如前所述,单个自编码器通过虚构x→h→x的三层网络,能够学习出一种特征变化h=fθ(x)(这里用θ表示变换的参数,包括W,b和激活函数)。实际上,当训练结束后,输出层已经没什么意义了,我们一般将其去掉,即将自编码器表示为&/p&&br&&figure&&img src=&https://pic2.zhimg.com/bfafabd75f9e81ff2cfbb79_b.png& data-rawwidth=&621& data-rawheight=&149& class=&origin_image zh-lightbox-thumb& width=&621& data-original=&https://pic2.zhimg.com/bfafabd75f9e81ff2cfbb79_r.png&&&/figure&&br&&p&之前之所以将自编码器模型表示为3层的神经网络,那是因为训练的需要,我们将原始数据作为假想的目标输出,以此构建监督误差来训练整个网络。等训练结束后,输出层就可以去掉了,我们关心的只是从x到h的变换。&/p&&br&&p&接下来的思路就很自然了——我们已经得到特征表达h,那么我们可不可以将&/p&&p&h再当做原始信息,训练一个新的自编码器,得到新的特征表达呢?当然可以!这就是所谓的堆叠自编码器(Stacked Auto-Encoder, SAE)。Stacked就是逐层垒叠的意思,跟“栈”有点像。&a href=&//link.zhihu.com/?target=http%3A//deeplearning.stanford.edu/wiki/index.php/%25E6%25A0%%25BC%258F%25E8%2587%25AA%25E7%25BC%%25A0%%25AE%%25B3%2595& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&UFLDL&/a&教程将其翻译为“栈式自编码”,anyway,不管怎么称呼,都是这个东东,别被花里胡哨的专业术语吓到就行。当把多个自编码器Stack起来之后,这个系统看起来就像这样:&/p&&br&&figure&&img src=&https://pic3.zhimg.com/1f35f4019afa06e106fe_b.png& data-rawwidth=&1220& data-rawheight=&130& class=&origin_image zh-lightbox-thumb& width=&1220& data-original=&https://pic3.zhimg.com/1f35f4019afa06e106fe_r.png&&&/figure&&br&&p&亦可赛艇!这个系统实际上已经有点深度学习的味道了,即learning multiple levels of representation and abstraction(Hinton, Bengio, LeCun, 2015)。需要注意的是,整个网络的训练不是一蹴而就的,而是逐层进行。按题主提到的结构n,m,k结构,实际上我们是先训练网络n→m→n,得到n→m的变换,然后再训练m→k→m,得到m→k的变换。最终堆叠成SAE,即为n→m→k的结果,整个过程就像一层层往上盖房子,这便是大名鼎鼎的layer-wise unsuperwised pre-training(逐层非监督预训练),正是导致深度学习(神经网络)在2006年第3次兴起的核心技术。&/p&&br&&p&关于逐层预训练与深度学习,将在本文最后探讨。&/p&&br&&b&自编码器的变种形式&/b&&br&&br&&p&上述介绍的自编码器是最基本的形式。善于思考的童鞋可能已经意识到了这个问题:隐层的维度到底怎么确定?为什么稀疏的特征比较好?或者更准确的说,怎么才能称得上是一个好的表达(What defines a good representation)?&/p&&br&&p&事实上,这个问题回答并不唯一,也正是从不同的角度去思考这个问题,导致了自编码器的各种变种形式出现。目前常见的几种模型总结如下(有些术语实在不好翻译,看英文就好。。。)&/p&&br&&figure&&img src=&https://pic4.zhimg.com/bba16bd2fa8537_b.png& data-rawwidth=&543& data-rawheight=&163& class=&origin_image zh-lightbox-thumb& width=&543& data-original=&https://pic4.zhimg.com/bba16bd2fa8537_r.png&&&/figure&&br&&p&下面简介下其中两种模型,以对这些变种模型有个直观感受。&/p&&br&&b&稀疏自编码器&/b&&br&&br&&p&&a href=&//link.zhihu.com/?target=http%3A//deeplearning.stanford.edu/wiki/index.php/%25E8%2587%25AA%25E7%25BC%%25A0%%25AE%%25B3%%25B8%258E%25E7%25A8%%E6%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&UFLDL-自编码算法与稀疏性&/a&对该模型有着比较详细的介绍。如前所示,这种模型背后的思想是,高维而稀疏的表达是好的。一般而言,我们不会指定隐层表达h中哪些节点是被抑制的(对于sigmoid单元即输出为0),而是指定一个稀疏性参数ρ,代表隐藏神经元的平均活跃程度(在训练集上取平均)。比如,当ρ=0.05时,可以认为隐层节点在95%的时间里都是被一直的,只有5%的机会被激活。实际上,为了满足这一条件,隐层神经元的活跃度需要接近于0。&/p&&br&&p&那么,怎么从数学模型上做到这点呢?思路也不复杂,既然要求平均激活度为ρ,那么只要引入一个度量,来衡量神经元ii的实际激活度&img src=&//www.zhihu.com/equation?tex=%5Ctilde%7B%5Crho+_%7Ba%7D+%7D+& alt=&\tilde{\rho _{a} } & eeimg=&1&&与期望激活度ρ之间的差异即可,然后将这个度量添加到目标函数作为正则,训练整个网络即可。那么,什么样的度量适合这个任务呢?有过概率论、信息论基础的同学应该很容易想到它——相对熵,也就是KL散度(KL divergence)。因此,整个网络所添加的惩罚项即为&/p&&br&&img src=&//www.zhihu.com/equation?tex=%5Csum_%7Bi%5Cin+h%7D%7BKL%28%5Crho+%7C%7C%5Ctilde%7B%5Crho+_%7Ba%7D+%7D+%29%7D+& alt=&\sum_{i\in h}{KL(\rho ||\tilde{\rho _{a} } )} & eeimg=&1&&&br&&br&&p&具体的公式不再展开,可以从下图(摘自UFLDL)中直观理解KL散度作为惩罚项的含义。图中假设平均激活度ρ=0.2。&/p&&figure&&img src=&https://pic2.zhimg.com/77d4cd469ea497a7df4d42ad_b.png& data-rawwidth=&1200& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&https://pic2.zhimg.com/77d4cd469ea497a7df4d42ad_r.png&&&/figure&&br&&p&可以看出,当^ρiρ^i一旦偏离期望激活度ρρ,这种误差便急剧增大,从而作为惩罚项添加到目标函数,指导整个网络学习出稀疏的特征表达。&/p&&br&&b&降噪自编码器&br&&/b&&br&&p&关于降噪自编码器,强烈推荐其作者Pascal Vincent的论文Stacked Denoising Autoencoders: Learning Useful Representations in a Deep Network with a Local Denoising Criterion。DAE的核心思想是,一个能够从中恢复出原始信号的表达未必是最好的,能够对“被污染/破坏”的原始数据编码、解码,然后还能恢复真正的原始数据,这样的特征才是好的。&/p&&br&&p&稍微数学一点,假设原始数据x被我们“故意破坏”,比如加入高斯白噪,或者把某些维度数据抹掉,变成了&img src=&//www.zhihu.com/equation?tex=%5Cbar%7Bx%7D+& alt=&\bar{x} & eeimg=&1&&,然后再对&img src=&//www.zhihu.com/equation?tex=%5Cbar%7Bx%7D+& alt=&\bar{x} & eeimg=&1&&编码、解码,得到恢复信号&img src=&//www.zhihu.com/equation?tex=%5Ctilde%7Bx%7D+%3Dg%28f%28x%29%29& alt=&\tilde{x} =g(f(x))& eeimg=&1&&,该恢复信号尽可能逼近未被污染的数据xx。此时,监督训练的误差从L(x,g(f(x)))变成了L(x,g(f(&img src=&//www.zhihu.com/equation?tex=%5Ctilde%7Bx%7D+& alt=&\tilde{x} & eeimg=&1&&)))。&/p&&br&&p&直观上理解,DAE希望学到的特征变换尽可能鲁棒,能够在一定程度上对抗原始数据的污染、缺失。Vincent论文里也对DAE提出了基于流行的解释,并且在图像数据上进行测试,发现DAE能够学出类似Gabor边缘提取的特征变换。注意,这一切都是在我们定义好规则、误差后,系统自动学出来的!从而避免了领域专家费尽心力去设计这些性能良好的特征。&/p&&br&&p&DAE的系统结构如下图(摘自Vincent论文)所示。&/p&&br&&figure&&img src=&https://pic3.zhimg.com/7fe0f8b216df17aacdabd5da_b.png& data-rawwidth=&884& data-rawheight=&282& class=&origin_image zh-lightbox-thumb& width=&884& data-original=&https://pic3.zhimg.com/7fe0f8b216df17aacdabd5da_r.png&&&/figure&&br&&p&现在使用比较多的noise主要是mask noise,即原始数据中部分数据缺失,这是有着很强的实际意义的,比如图像部分像素被遮挡、文本因记录原因漏掉了一些单词等等。&/p&&p&其他的模型就不再展开了,总之,每遇到一个自编码器的一个变种模型时,搞清楚其背后的思想(什么样的表达才是好的),就很容易掌握了。套用V的”Behind this mask is a man, and behind this man is an idea, and ideas are bulletproof”,我们可以说,”Behind this auto-encoder is a model, and behind this model is an idea, and ideas are bulletproof”。&/p&&br&&b&关于预训练与深度学习&/b&&br&&br&&p&深度学习第3次兴起正式因为逐层预训练方法的提出,使得深度网络的训练成为可能。对于一个深度网络,这种逐层预训练的方法,正是前面介绍的这种Stacked Auto-Encoder。对于常见的分类任务,一般分为以下两个阶段:&/p&&br&&ul&&li&layer-wise pre-training (逐层预训练)&/li&&/ul&&br&&ul&&li&fune-tuning (微调)&/li&&/ul&&br&&p&注意到,前述的各种SAE,本质上都是非监督学习,SAE各层的输出都是原始数据的不同表达。对于分类任务,往往在SAE顶端再添加一分类层(如Softmax层),并结合有标注的训练数据,在误差函数的指导下,对系统的参数进行微调,以使得整个网络能够完成所需的分类任务。&/p&&br&&figure&&img src=&https://pic2.zhimg.com/4f231f7a15d6edc27559_b.png& data-rawwidth=&1331& data-rawheight=&290& class=&origin_image zh-lightbox-thumb& width=&1331& data-original=&https://pic2.zhimg.com/4f231f7a15d6edc27559_r.png&&&/figure&&br&&p&对于微调过程,即可以只调整分类层的参数(此时相当于把整个SAE当做一个feature extractor),也可以调整整个网络的参数(适合训练数据量比较大的情况)。&/p&&br&&p&题主提到,为什么训练稀疏自编码器为什么一般都是3层的结构,实际上这里的3层是指训练单个自编码器所假想的3层神经网络,这对任何基于神经网络的编码器都是如此。多层的稀疏自编码器自然是有的,只不过是通过layer-wise pre-training这种方式逐层垒叠起来的,而不是直接去训练一个5层或是更多层的网络。&/p&&br&&p&为什么要这样?实际上,这正是在训练深层神经网络中遇到的问题。直接去训练一个深层的自编码器,其实本质上就是在做深度网络的训练,由于梯度扩散等问题,这样的网络往往根本无法训练。这倒不是因为会破坏稀疏性等原因,只要网络能够训练,对模型施加的约束总能得到相应的结果。&/p&&br&&p&但为什么逐层预训练就可以使得深度网络的训练成为可能了呢?有不少文章也做过这方面的研究。一个直观的解释是,预训练好的网络在一定程度上拟合了训练数据的结构,这使得整个网络的初始值是在一个合适的状态,便于有监督阶段加快迭代收敛。&/p&&p&笔者曾经基于 MNIST数据集,尝试了一个9层的网络完成分类任务。当随机初始化时,误差传到底层几乎全为0,根本无法训练。但采用逐层预训练的方法,训练好每两层之间的自编码变换,将其参数作为系统初始值,然后网络在有监督阶段就能比较稳定的迭代了。&/p&&br&&p&当然,有不少研究提出了很好的初始化策略,再加上现在常用的dropout、ReLU,直接去训练一个深层网络已经不是问题。这是否意味着这种逐层预训练的方式已经过时了呢?这里,我想采用下Bengio先生2015年的一段话作为回答:&/p&&br&&blockquote&&p&Stacks of unsupervised feature learning layers are STILL useful when you are in a regime with insufficient labeled examples, for transfer learning or domain adaptation. It is a regularizer. But when the number of labeled examples becomes large enough, the advantage of that regularizer becomes much less. I suspect however that this story is far from ended! There are other ways besides pre-training of combining supervised and unsupervised learning, and I believe that we still have a lot to improve in terms of our unsupervised learning algorithms.&/p&&/blockquote&&br&&p&最后,多说一句,除了AE和SAE这种逐层预训练的方式外,还有另外一条类似的主线,即限制玻尔兹曼机(RBM)与深度信念网络(DBN)。这些模型在神经网络/深度学习框架中的位置,可以简要总结为下图。&/p&&br&&figure&&img src=&https://pic4.zhimg.com/c1f51d5d714f_b.png& data-rawwidth=&1483& data-rawheight=&758& class=&origin_image zh-lightbox-thumb& width=&1483& data-original=&https://pic4.zhimg.com/c1f51d5d714f_r.png&&&/figure&&br&&em&订正:感谢@&/em&&em&&a href=&http://www.zhihu.com/people/zhang-xia-en& class=&internal&&Detective 夏恩&/a&指正&/em&&em&,RBM堆叠起来是Deep Boltzmann Machines, 再加一个分类器才是DBN,供阅读上图时参考。&/em&&br&&br&&br&&br&&b&相关学习资料推荐&/b&&br&&br&&ol&&li&&a href=&//link.zhihu.com/?target=http%3A//ufldl.stanford.edu/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sranford UFLDL教程&/a& 旧版有中文版作为参考&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//deeplearning.net/tutorial/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Deep Learning Tutorial (Theano)&/a& 其中有关于AE、DAE、SDAE基于Theano的实现&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/rasmusbergpalm/DeepLearnToolbox& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&DeepLearnToolbox&/a& 该Toolbox基于Matlab实现,其中有SAE、CAE的实现&/li&&li&相关论文&/li&&/ol&&ul&&li&Hinton, G.E. and R.R. Salakhutdinov, Reducing the dimensionality of data with neural networks. Science, 86): p. 504-507.&/li&&li&Learning multiple layers of representation. Trends in cognitive sciences, ): p. 428-434.&/li&&li&Vincent, P., et al. Extracting and composing robust features with denoising autoencoders. in Proceedings of the 25th international conference on Machine learning. 2008.&/li&&li&Bengio, Y., Learning deep architectures for AI. Foundations and trends? in Machine Learning, ): p. 1-127.&/li&&li&Vincent, P., et al., Stacked Denoising Autoencoders: Learning Useful Representations in a Deep Network with a Local Denoising Criterion. Journal of Machine Learning Research, ): p. &a href=&tel:&&&/a&.&/li&&li&Rifai, S., et al., Contractive Auto-Encoders: Explicit Invariance During Feature Extraction. Icml, 2011.&/li&&li&Chen, M., et al., Marginalized denoising autoencoders for domain adaptation. arXiv preprint arXiv:, 2012.&/li&&li&Bengio, Y., A. Courville and P. Vincent, Representation learning: A review and new perspectives. Pattern Analysis and Machine Intelligence, IEEE Transactions on, ): p. &a href=&tel:&&&/a&.&/li&&li&LeCun, Y., Y. Bengio and G. Hinton, Deep learning. Nature, 53): p. 436-444.&/li&&/ul&&br&【非常高兴看到大家喜欢并赞同我们的回答。应许多知友的建议,最近我们开通了同名公众号:&b&PhDer&/b&,也会定期更新我们的文章,如果您不想错过我们的每篇回答,欢迎扫码关注~ 】&br&&br&【“科研君”公众号初衷始终是希望聚集各专业一线科研人员和工作者,在进行科学研究的同时也作为知识的传播者,利用自己的专业知识解释和普及生活中的 一些现象和原理,展现科学有趣生动的一面。该公众号由清华大学一群在校博士生发起,目前参与的作者人数有10人,但我们感觉这远远不能覆盖所以想科普的领域,并且由于空闲时间有限,导致我们只能每周发布一篇文章。我们期待更多的战友加入,认识更多志同道合的人,每个人都是科研君,每个人都是知识的传播者。我们期待大家的参与,想加入我们,进QQ群吧~:】
自编码器 自从Hinton 2006年的工作之后,越来越多的研究者开始关注各种自编码器模型相应的堆叠模型。实际上,自编码器(Auto-Encoder)是一个较早的概念了,比如Hinton等人在年的工作。(说来说去都是这些人呐。。。) 自编码器简介
先暂且不谈…
已有帐号?
无法登录?
社交帐号登录
212 人关注
391 条内容
609 人关注
187 条内容
351 人关注
347 条内容
724 人关注
174 条内容
22952 人关注
877 条内容

我要回帖

更多关于 训练稀疏自编码器 的文章

 

随机推荐