Deep Learning深度学习学习笔记整理系列之常用模型四五六七学步园文档格式.docx
《Deep Learning深度学习学习笔记整理系列之常用模型四五六七学步园文档格式.docx》由会员分享,可在线阅读,更多相关《Deep Learning深度学习学习笔记整理系列之常用模型四五六七学步园文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
![Deep Learning深度学习学习笔记整理系列之常用模型四五六七学步园文档格式.docx](https://file1.bdocx.com/fileroot1/2023-2/1/9a1ca505-24fd-45d4-aa71-fb3fef9dc151/9a1ca505-24fd-45d4-aa71-fb3fef9dc1511.gif)
其他层就同样的方法炮制就行了(训练这一层,前面层的参数都是固定的,并且他们的decoder已经没用了,都不需要了)。
3)有监督微调:
经过上面的方法,我们就可以得到很多层了。
至于需要多少层(或者深度需要多少,这个目前本身就没有一个科学的评价方法)需要自己试验调了。
每一层都会得到原始输入的不同的表达。
当然了,我们觉得它是越抽象越好了,就像人的视觉系统一样。
到这里,这个AutoEncoder还不能用来分类数据,因为它还没有学习如何去连结一个输入和一个类。
它只是学会了如何去重构或者复现它的输入而已。
或者说,它只是学习获得了一个可以良好代表输入的特征,这个特征可以最大程度上代表原输入信号。
那么,为了实现分类,我们就可以在AutoEncoder的最顶的编码层添加一个分类器(例如罗杰斯特回归、SVM等),然后通过标准的多层神经网络的监督训练方法(梯度下降法)去训练。
也就是说,这时候,我们需要将最后层的特征code输入到最后的分类器,通过有标签样本,通过监督学习进行微调,这也分两种,一个是只调整分类器(黑色部分):
另一种:
通过有标签样本,微调整个系统:
(如果有足够多的数据,这个是最好的。
end-to-endlearning端对端学习)
一旦监督训练完成,这个网络就可以用来分类了。
神经网络的最顶层可以作为一个线性分类器,然后我们可以用一个更好性能的分类器去取代它。
在研究中可以发现,如果在原有的特征中加入这些自动学习得到的特征可以大大提高精确度,甚至在分类问题中比目前最好的分类算法效果还要好!
AutoEncoder存在一些变体,这里简要介绍下两个:
SparseAutoEncoder稀疏自动编码器:
当然,我们还可以继续加上一些约束条件得到新的DeepLearning方法,如:
如果在AutoEncoder的基础上加上L1的Regularity限制(L1主要是约束每一层中的节点中大部分都要为0,只有少数不为0,这就是Sparse名字的来源),我们就可以得到SparseAutoEncoder法。
如上图,其实就是限制每次得到的表达code尽量稀疏。
因为稀疏的表达往往比其他的表达要有效(人脑好像也是这样的,某个输入只是刺激某些神经元,其他的大部分的神经元是受到抑制的)。
DenoisingAutoEncoders降噪自动编码器:
降噪自动编码器DA是在自动编码器的基础上,训练数据加入噪声,所以自动编码器必须学习去去除这种噪声而获得真正的没有被噪声污染过的输入。
因此,这就迫使编码器去学习输入信号的更加鲁棒的表达,这也是它的泛化能力比一般编码器强的原因。
DA可以通过梯度下降算法去训练。
9.2、SparseCoding稀疏编码
如果我们把输出必须和输入相等的限制放松,同时利用线性代数中基的概念,即O=a1*Φ1+a2*Φ2+….+
an*Φn,Φi是基,ai是系数,我们可以得到这样一个优化问题:
Min|I–O|,其中I表示输入,O表示输出。
通过求解这个最优化式子,我们可以求得系数ai和基Φi,这些系数和基就是输入的另外一种近似表达。
因此,它们可以用来表达输入I,这个过程也是自动学习得到的。
如果我们在上述式子上加上L1的Regularity限制,得到:
Min|I–O|+u*(|Φ1|+|Φ2|+…+|Φn|)
这种方法被称为SparseCoding。
通俗的说,就是将一个信号表示为一组基的线性组合,而且要求只需要较少的几个基就可以将信号表示出来。
“稀疏性”定义为:
只有很少的几个非零元素或只有很少的几个远大于零的元素。
要求系数ai是稀疏的意思就是说:
对于一组输入向量,我们只想有尽可能少的几个系数远大于零。
选择使用具有稀疏性的分量来表示我们的输入数据是有原因的,因为绝大多数的感官数据,比如自然图像,可以被表示成少量基本元素的叠加,在图像中这些基本元素可以是面或者线。
同时,比如与初级视觉皮层的类比过程也因此得到了提升(人脑有大量的神经元,但对于某些图像或者边缘只有很少的神经元兴奋,其他都处于抑制状态)。
稀疏编码算法是一种无监督学习方法,它用来寻找一组“超完备”基向量来更高效地表示样本数据。
虽然形如主成分分析技术(PCA)能使我们方便地找到一组“完备”基向量,但是这里我们想要做的是找到一组“超完备”基向量来表示输入向量(也就是说,基向量的个数比输入向量的维数要大)。
超完备基的好处是它们能更有效地找出隐含在输入数据内部的结构与模式。
然而,对于超完备基来说,系数ai不再由输入向量唯一确定。
因此,在稀疏编码算法中,我们另加了一个评判标准“稀疏性”来解决因超完备而导致的退化(degeneracy)问题。
(详细过程请参考:
UFLDL
Tutorial稀疏编码)
比如在图像的FeatureExtraction的最底层要做EdgeDetector的生成,那么这里的工作就是从NaturalImages中randomly选取一些小patch,通过这些patch生成能够描述他们的“基”,也就是右边的8*8=64个basis组成的basis,然后给定一个testpatch,我们可以按照上面的式子通过basis的线性组合得到,而sparsematrix就是a,下图中的a中有64个维度,其中非零项只有3个,故称“sparse”。
这里可能大家会有疑问,为什么把底层作为EdgeDetector呢?
上层又是什么呢?
这里做个简单解释大家就会明白,之所以是EdgeDetector是因为不同方向的Edge就能够描述出整幅图像,所以不同方向的Edge自然就是图像的basis了……而上一层的basis组合的结果,上上层又是上一层的组合basis……(就是上面第四部分的时候咱们说的那样)
Sparsecoding分为两个部分:
1)Training阶段:
给定一系列的样本图片[x1,x2,…],我们需要学习得到一组基[Φ1,Φ2,…],也就是字典。
稀疏编码是k-means算法的变体,其训练过程也差不多(EM算法的思想:
如果要优化的目标函数包含两个变量,如L(W,B),那么我们可以先固定W,调整B使得L最小,然后再固定B,调整W使L最小,这样迭代交替,不断将L推向最小值。
EM算法可以见我的博客:
“从最大似然到EM算法浅解”)。
训练过程就是一个重复迭代的过程,按上面所说,我们交替的更改a和Φ使得下面这个目标函数最小。
每次迭代分两步:
a)固定字典Φ[k],然后调整a[k],使得上式,即目标函数最小(即解LASSO问题)。
b)然后固定住a[k],调整Φ[k],使得上式,即目标函数最小(即解凸QP问题)。
不断迭代,直至收敛。
这样就可以得到一组可以良好表示这一系列x的基,也就是字典。
2)Coding阶段:
给定一个新的图片x,由上面得到的字典,通过解一个LASSO问题得到稀疏向量a。
这个稀疏向量就是这个输入向量x的一个稀疏表达了。
例如:
9.3、RestrictedBoltzmannMachine(RBM)限制波尔兹曼机
假设有一个二部图,每一层的节点之间没有链接,一层是可视层,即输入数据层(v),一层是隐藏层(h),如果假设所有的节点都是随机二值变量节点(只能取0或者1值),同时假设全概率分布p(v,h)满足Boltzmann分布,我们称这个模型是RestrictedBoltzmannMachine(RBM)。
下面我们来看看为什么它是DeepLearning方法。
首先,这个模型因为是二部图,所以在已知v的情况下,所有的隐藏节点之间是条件独立的(因为节点之间不存在连接),即p(h|v)=p(h1|v)…p(hn|v)。
同理,在已知隐藏层h的情况下,所有的可视节点都是条件独立的。
同时又由于所有的v和h满足Boltzmann
分布,因此,当输入v的时候,通过p(h|v)可以得到隐藏层h,而得到隐藏层h之后,通过p(v|h)又能得到可视层,通过调整参数,我们就是要使得从隐藏层得到的可视层v1与原来的可视层v如果一样,那么得到的隐藏层就是可视层另外一种表达,因此隐藏层可以作为可视层输入数据的特征,所以它就是一种DeepLearning方法。
如何训练呢?
也就是可视层节点和隐节点间的权值怎么确定呢?
我们需要做一些数学分析。
也就是模型了。
联合组态(jointconfiguration)的能量可以表示为:
而某个组态的联合概率分布可以通过Boltzmann分布(和这个组态的能量)来确定:
因为隐藏节点之间是条件独立的(因为节点之间不存在连接),即:
然后我们可以比较容易(对上式进行因子分解Factorizes)得到在给定可视层v的基础上,隐层第j个节点为1或者为0的概率:
同理,在给定隐层h的基础上,可视层第i个节点为1或者为0的概率也可以容易得到:
给定一个满足独立同分布的样本集:
D={v
(1),v
(2),…,v(N)},我们需要学习参数θ={W,a,b}。
我们最大化以下对数似然函数(最大似然估计:
对于某个概率模型,我们需要选择一个参数,让我们当前的观测样本的概率最大):
也就是对最大对数似然函数求导,就可以得到L最大时对应的参数W了。
如果,我们把隐藏层的层数增加,我们可以得到DeepBoltzmannMachine(DBM);
如果我们在靠近可视层的部分使用贝叶斯信念网络(即有向图模型,当然这里依然限制层中节点之间没有链接),而在最远离可视层的部分使用RestrictedBoltzmannMachine,我们可以得到DeepBeliefNet(DBN)。
9.4、DeepBeliefNetworks深信度网络
DBNs是一个概率生成模型,与传统的判别模型的神经网络相对,生成模型是建立一个观察数据和标签之间的联合分布,对P(Observation|Label)和P(Label|Observation)都做了评估,而判别模型仅仅而已评估了后者,也就是P(Label|Observation)。
对于在深度神经网络应用传统的BP算法的时候,DBNs遇到了以下问题:
(1)需要为训练提供一个有标签的样本集;
(2)学习过程较慢;
(3)不适当的参数选择会导致学习收敛于局部最优解。
DBNs由多个限制玻尔兹曼机(RestrictedBoltzmannMachines)层组成,一个典型的神经网络类型如图三所示。
这些网络被“限制”为一个可视层和一个隐层,层间存在连接,但层内的单元间不存在连接。
隐层单元被训练去捕捉在可视层表现出来的高阶数据的相关性。
首先,先不考虑最顶构成一个联想记忆(associativememory)的两层,一个DBN的连接是通过自顶向下的生成权值来指导确定的,RBMs就像一个建筑块一样,相比传统和深度分层的sigmoid信念网络,它能易于连接权值的学习。
最开始的时候,通过一个非监督贪婪逐层方法去预训练获得生成模型的权值,非监督贪婪逐层方法被Hinton证明是有效的,并被其称为对比分歧(contrastivedivergence)。
在这个训练阶段,在可视层会产生一个向量v,通过它将值传递到隐层。
反过来,可视层的输入会被随机的选择,以尝试去重构原始的输入信号。
最后,这些新的可视的神经元激活单元将前向传递重构隐层激活单元,获得h(在训练过程中,首先将可视向量值映射给隐单元;
然后可视单元由隐层单元重建;
这些新可视单元再次映射给隐单元,这样就获取新的隐单元。
执行这种反复步骤叫做吉布斯采样)。
这些后退和前进的步骤就是我们熟悉的Gibbs采样,而隐层激活单元和可视层输入之间的相关性差别就作为权值更新的主要依据。
训练时间会显著的减少,因为只需要单个步骤就可以接近最大似然学习。
增加进网络的每一层都会改进训练数据的对数概率,我们可以理解为越来越接近能量的真实表达。
这个有意义的拓展,和无标签数据的使用,是任何一个深度学习应用的决定性的因素。
在最高两层,权值被连接到一起,这样更低层的输出将会提供一个参考的线索或者关联给顶层,这样顶层就会将其联系到它的记忆内容。
而我们最关心的,最后想得到的就是判别性能,例如分类任务里面。
在预训练后,DBN可以通过利用带标签数据用BP算法去对判别性能做调整。
在这里,一个标签集将被附加到顶层(推广联想记忆),通过一个自下向上的,学习到的识别权值获得一个网络的分类面。
这个性能会比单纯的BP算法训练的网络好。
这可以很直观的解释,DBNs的BP算法只需要对权值参数空间进行一个局部的搜索,这相比前向神经网络来说,训练是要快的,而且收敛的时间也少。
DBNs的灵活性使得它的拓展比较容易。
一个拓展就是卷积DBNs(ConvolutionalDeepBeliefNetworks(CDBNs))。
DBNs并没有考虑到图像的2维结构信息,因为输入是简单的从一个图像矩阵一维向量化的。
而CDBNs就是考虑到了这个问题,它利用邻域像素的空域关系,通过一个称为卷积RBMs的模型区达到生成模型的变换不变性,而且可以容易得变换到高维图像。
DBNs并没有明确地处理对观察变量的时间联系的学习上,虽然目前已经有这方面的研究,例如堆叠时间RBMs,以此为推广,有序列学习的dubbed
temporalconvolutionmachines,这种序列学习的应用,给语音信号处理问题带来了一个让人激动的未来研究方向。
目前,和DBNs有关的研究包括堆叠自动编码器,它是通过用堆叠自动编码器来替换传统DBNs里面的RBMs。
这就使得可以通过同样的规则来训练产生深度多层神经网络架构,但它缺少层的参数化的严格要求。
与DBNs不同,自动编码器使用判别模型,这样这个结构就很难采样输入采样空间,这就使得网络更难捕捉它的内部表达。
但是,降噪自动编码器却能很好的避免这个问题,并且比传统的DBNs更优。
它通过在训练过程添加随机的污染并堆叠产生场泛化性能。
训练单一的降噪自动编码器的过程和RBMs训练生成模型的过程一样。
9.5、ConvolutionalNeuralNetworks卷积神经网络
卷积神经网络是人工神经网络的一种,已成为当前语音分析和图像识别领域的研究热点。
它的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。
该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。
卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。
CNNs是受早期的延时神经网络(TDNN)的影响。
延时神经网络通过在时间维度上共享权值降低学习复杂度,适用于语音和时间序列信号的处理。
CNNs是第一个真正成功训练多层网络结构的学习算法。
它利用空间关系减少需要学习的参数数目以提高一般前向BP算法的训练性能。
CNNs作为一个深度学习架构提出是为了最小化数据的预处理要求。
在CNN中,图像的一小部分(局部感受区域)作为层级结构的最低层的输入,信息再依次传输到不同的层,每层通过一个数字滤波器去获得观测数据的最显著的特征。
这个方法能够获取对平移、缩放和旋转不变的观测数据的显著特征,因为图像的局部感受区域允许神经元或者处理单元可以访问到最基础的特征,例如定向边缘或者角点。
1)卷积神经网络的历史
1962年Hubel和Wiesel通过对猫视觉皮层细胞的研究,提出了感受野(receptivefield)的概念,1984年日本学者Fukushima基于感受野概念提出的神经认知机(neocognitron)可以看作是卷积神经网络的第一个实现网络,也是感受野概念在人工神经网络领域的首次应用。
神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其能够在即使物体有位移或轻微变形的时候,也能完成识别。
通常神经认知机包含两类神经元,即承担特征抽取的S-元和抗变形的C-元。
S-元中涉及两个重要参数,即感受野与阈值参数,前者确定输入连接的数目,后者则控制对特征子模式的反应程度。
许多学者一直致力于提高神经认知机的性能的研究:
在传统的神经认知机中,每个S-元的感光区中由C-元带来的视觉模糊量呈正态分布。
如果感光区的边缘所产生的模糊效果要比中央来得大,S-元将会接受这种非正态模糊所导致的更大的变形容忍性。
我们希望得到的是,训练模式与变形刺激模式在感受野的边缘与其中心所产生的效果之间的差异变得越来越大。
为了有效地形成这种非正态模糊,Fukushima提出了带双C-元层的改进型神经认知机。
VanOoyen和Niehuis为提高神经认知机的区别能力引入了一个新的参数。
事实上,该参数作为一种抑制信号,抑制了神经元对重复激励特征的激励。
多数神经网络在权值中记忆训练信息。
根据Hebb学习规则,某种特征训练的次数越多,在以后的识别过程中就越容易被检测。
也有学者将进化计算理论与神经认知机结合,通过减弱对重复性激励特征的训练学习,而使得网络注意那些不同的特征以助于提高区分能力。
上述都是神经认知机的发展过程,而卷积神经网络可看作是神经认知机的推广形式,神经认知机是卷积神经网络的一种特例。
2)卷积神经网络的网络结构
卷积神经网络是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成。
图:
卷积神经网络的概念示范:
输入图像通过和三个可训练的滤波器和可加偏置进行卷积,滤波过程如图一,卷积后在C1层产生三个特征映射图,然后特征映射图中每组的四个像素再进行求和,加权值,加偏置,通过一个Sigmoid函数得到三个S2层的特征映射图。
这些映射图再进过滤波得到C3层。
这个层级结构再和S2一样产生S4。
最终,这些像素值被光栅化,并连接成一个向量输入到传统的神经网络,得到输出。
一般地,C层为特征提取层,每个神经元的输入与前一层的局部感受野相连,并提取该局部的特征,一旦该局部特征被提取后,它与其他特征间的位置关系也随之确定下来;
S层是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射为一个平面,平面上所有神经元的权值相等。
特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。
此外,由于一个映射面上的神经元共享权值,因而减少了网络自由参数的个数,降低了网络参数选择的复杂度。
卷积神经网络中的每一个特征提取层(C-层)都紧跟着一个用来求局部平均与二次提取的计算层(S-层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力。
3)关于参数减少与权值共享
上面聊到,好像CNN一个牛逼的地方就在于通过感受野和权值共享减少了神经网络需要训练的参数的个数。
那究竟是啥的呢?
下图左:
如果我们有1000x1000像素的图像,有1百万个隐层神经元,那么他们全连接的话(每个隐层神经元都连接图像的每一个像素点),就有1000x1000x1000000=10^12个连接,也就是10^12个权值参数。
然而图像的空间联系是局部的,就像人是通过一个局部的感受野去感受外界图像一样,每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些感受不同局部的神经元综合起来就可以得到全局的信息了。
这样,我们就可以减少连接的数目,也就是减少神经网络需要训练的权值参数的个数了。
如下图右:
假如局部感受野是10x10,隐层每个感受野只需要和这10x10的局部图像相连接,所以1百万个隐层神经元就只有一亿个连接,即10^8个参数。
比原来减少了四个0(数量级),这样训练起来就没那么费力了,但还是感觉很多的啊,那还有啥办法没?
我们知道,隐含层的每一个神经元都连接10x10个图像区域,也就是说每一个神经元存在10x10=100个连接权值参数。
那如果我们每个神经元这100个参数是相同的呢?
也就是说每个神经元用的是同一个卷积核去卷积图像。
这样我们就只有多少个参数?
?
只有100个参数啊!
!
亲!
不管你隐层的神经元个数有多少,两层间的连接我只有100个参数啊!
这就是权值共享啊!
这就是卷积神经网络的主打卖点啊!
(有点烦了,呵呵)也许你会问,这样做靠谱吗?
为什么可行呢?
这个……共同学习。
好了,你就会想,这样提取特征也忒不靠谱吧,这样你只提取了一种特征啊?
对了,真聪明,我们需要提取多种特征对不?
假如一种滤波器,也就是一种卷积核就是提出图像的一种特征,例如某个方向的边缘。
那么我们需要提取不同的特征,怎么办,加多几种滤波器不就行了吗?
对了。
所以假设我们加到100种滤波器,每种滤波器的参数不一样,表示它提出输入图像的不同特征,例如不同的边缘。
这样每种滤波器去卷积图像就得到对图像的不同特征的放映,我们称之为FeatureMap。
所以100种卷积核就有100个Feature
Map。
这100个FeatureMap就组成了一层神经元。
到这个时候明了了吧。
我们这一层有多少个参数了?
100种卷积核x每种卷积核共享100个参数=100x100=10K,也就是1万个参数。
才1万个参数啊!
(又来了,受