机器学习实验报告完整

来源:医生招聘 发布时间:2021-01-10 点击:

基于AutoEncoder原理和L_BFGS优化算法实现手写数字识别 目录 1 神经网络基本概念 3 1.1概述 3 1.2 神经网络模型 4 2 AutoEncoder原理 5 2.1 反向传播算法 5 2.2 Softmax回归 7 2.3 Stacked AutoEncoder 8 2.4 微调过程 9 2.5 Sparse AutoEncoder 9 2.6 Denoise AutoEncoder 10 3 L_BFGS算法 11 3.1基本原理 11 3.2算法流程 15 3.3算法收敛性分析:
18 4 基于AutoEncoder的手写数字识别 18 4.1 MNIST数据库 18 4.2 模型训练 19 4.3 模型测试 19 5 实验结果及分析:
19 5.1 AutoEncoder 20 5.2 Sparse AutoEncoder 20 5.3 Denoise AutoEncoder 21 5.4 实验结果汇总及分析 22 6 参考资料 24 AutoEncoder实现手写数字识别 1 神经网络基本概念 1.1概述 神经网络是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。

神经网络由多个神经元构成,下图就是单个神经元的图1所示:
图1 神经元模型 这个神经元是以以及截距为输入值的运算单元,其输出为,其中函数被称作“激活函数”。在本次试验中,我们选用sigmoid函数作为激活函数 (1) 图2 sigmoid函数图像 1.2 神经网络模型 神经网络就是将许多个单一的神经元联结在一起,这样,一个神经元的输出就可以是另一个神经元的输入。例如,下图就是一个简单的神经网络:
图3 神经网络示意图 我们用第层第单元的激活值(输出值)。当时,,也就是第个输入值。对于给定的参数集合,神经网络就可以按照函数来计算输出结果。以上述模型为例,计算步骤如下: (2) 我们用表示第第层第单元输入加权和(包括偏置),这样我们对上式就可以得到一种更加简洁的表示法:
(3) 上述的计算步骤叫作前向传播。给定第层的激活值后,第层的激活值就可以按照下面步骤计算得到:
(4) 2 AutoEncoder原理 2.1 反向传播算法 自编码(AutoEncoder)神经网络是一种无监督的学习算法,它使用了反向传播算法,让目标值等于输入值,例如输入值为训练样本集合,则我们的输出值。下图是一个自编码神经网络的示例:
图4 单隐层神经网络 自编码神经网络的主要参数是连接权重和偏置,我们尝试利用自编码神经网络学习一个,也就是说我们尝试逼近一个恒等函数,从而使得输出接近于输入。假设我们有一个固定样本集,它包含个样例。对于单个样例,其代价函数为:
(5) 这是一个方差代价函数。给定一个包含个样例的数据集,我们可以定义整体代价函数为:
(6) 以上公式中的第一项是一个均方差项。第二项是一个规则化项(也叫权重衰减项),其目的是减小权重的幅度,防止过度拟合。

我们的目标是针对参数和来求其函数的最小值。为了求解神经网络,我们将每一个参数和初始化为一个很小的、接近于0的随机数,之后对目标函数求最优解。

梯度下降法中每一次迭代都是按照如下公式对参数和进行更新:
(7) 其中是学习速率。更新参数和的关键步骤是计算偏导数。而反向传播算法是计算偏导数的一种有效方法。整体代价函数的偏导数为:
(8) 反向传播算法的思路是:给定一个样例,我们首先进行前向传导算法,得到的激活值,包括输出层的输出值。之后,针对第层的每一个节点,我们计算出其“残差”,该残差表明了该节点对最终输出值得误差产证了多少影响。残差的定义如下:
(9) 对于的各个层,第层的第个节点的残差计算方法如下:
(10) 需要我们计算的偏导数就可以写成下面的形式:
(11) 总的来说,利用向量化的表示,反向传播算法可以表示成以下几个步骤:
1. 进行前馈传导计算,利用前向传导公式,得到直至输出层的激活值。

2. 对于第层(输出层),计算出残差:
(12) 3. 对于的各个层 (13) 4. 计算最终需要的偏导数值:
(14) 5. 根据公式(7)更新权重参数:
(15) (16) 2.2 Softmax回归 Softmax回归模型是logistic回归模型在多分类问题上的推广。在logistic回归中,训练集由个已标记的样本构成:,其中输入特征。由于logistic回归是针对二分类问题的,因此类标记。假设函数如下:
(17) 我们的目的就是训练模型参数,使其能够最小化代价函数:
(18) 而在Softmax回归中,类标签可以取个不同的值。因此对于训练集,我们有,所以假设函数形式如下:
(19) 其中是模型参数。

Softmax回归算法的代价函数如下:
(20) 其中是示性函数。

为了限制Softmax回归在描述对象时候出现过拟合现象,我们加入了权重衰减项来修改代价函数,则整个代价函数变为:
(21) 经过这个权重衰减后,代价函数就变成了严格的凸函数,这样就可以保证得到唯一解。此时的Hessian矩阵变为可逆矩阵,并且因为是凸函数,L-BFGS等算法可以保证收敛到全局最优解。

2.3 Stacked AutoEncoder 栈式自编码神经网络(Stacked AutoEncoder)是一个由多层自编码神经网络组成的神经网络,其前一层的自编码神经网络的输出作为厚一层自编码神经网络的输入。对于一个层的栈式自编码神经网络,假定用表示第个自编码神经网络的参数,那么该栈式自编码神经网络的编码过程就是,按照从前向后的顺序徐行每一层自编码神经网络的编码步骤:
(22) 一种比较好的获取栈式自编码神经网络参数的方法是采用逐层贪婪训练法进行训练。即利用原始输入来训练网络的第一层,得到其参数;
然后网络的第一层将原始输入转化为由隐层单元激活值组成的向量A,接着把A作为第二层的输入,继续训练得到第二层的参数,最后对后面的各层采用同样的策略训练参数。

2.4 微调过程 微调(fine-tuning)是深度学习中的常用策略,可以大幅提神一个展示自编码神经网络的性能表现。从更高的视角来讲,微调将栈式自编码神经网络的所有层视为一个模型,网络中所有的权重只都可以被优化。

在栈式的自编码神经网络中,微调的实现主要分为以下几个步骤:
1. 对于输出层(层),我们使用的是Softmax回归分类器,该层的残差为:
(23) 其中,其中为输入数据对应的类别标签,为条件概率向量。

2. 对于的各个层,利用公式(13),(14),(15),(16)计算残差,更新参数。

2.5 Sparse AutoEncoder 稀疏自编码神经网络(Sparse AutoEncoder)的稀疏性可以被解释如下。如果当神经元的输出接近于1的时候我们认为它是被激活的,而输出接近于0的时候认为它是被抑制的,那么是的神经元大部分的时候都是被抑制的限制被称作稀疏性限制。令表示隐层神经元的平均活跃度。我们可以加入一条限制,其中是一个接近于0的稀疏性参数,也就是说该层的所有隐节点的平均活跃度是,接近于0的。为了实现这一限制,我们在我们的优化目标函数中加入一个额外的惩罚因子,而这一惩罚因子将惩罚那些与相差较大的的情况,从而使得隐层神经元的平均活跃度保持在较小的范围之内。在本次实验中,我们选择相对熵来做我们惩罚函数,惩罚因子可以表示为:
(24) 这一惩罚因子具有如下的性质,当时,=0,并且随着和 。KL惩罚因子的函数图5所示:
图5 KL惩罚因子 加入惩罚因子后,总体的代价函数就可以表示为:
(25) 2.6 Denoise AutoEncoder 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise AutoEncoder(简称dAE模型)。Denoise AutoEncoder的模型如下:
图6 denoise Autoencoder 原理 由上图可知,样本按照分布加入随机噪声后变为,在本实验中,我们加入的噪音是对原始数据随机部分清0。dAE可以直观的解释为:1.dAE有点类似人体的感官系统,比如人眼看物体时,如果物体某一小部分被遮住了,人依然能够将其识别出来,2.多模态信息输入人体时(比如声音,图像等),少了其中某些模态的信息有时影响也不大。3.普通的autoencoder的本质是学习一个相等函数,即输入和重构后的输出相等,这种相等函数的表示有个缺点就是当测试样本和训练样本不符合同一分布,即相差较大时,效果不好,明显,dAE在这方面的处理有所进步。

3 L_BFGS算法 3.1基本原理 机器学习算法中经常碰到非线性优化问题,如 Sparse Filtering 算法,其主要工作在于求解一个非线性极小化问题。在具体实现中,大多调用的是成熟的软件包做支撑,其中最常用的一个算法是 L-BFGS。

L_BFGS算法是拟牛顿算法中广泛使用的一种优化算法。牛顿算法具有标准形式:。拟牛顿法是在牛顿法的基础上发展来的。牛顿法的基本思想是在现有极小值点估计值的附近对目标函数进行二阶泰勒展开,进而找到极小点的下一个估计值。因而,牛顿法具有二次收敛性;
然而,牛顿法要求海森矩阵为正定阵,同时对海森矩阵的计算也意味着很大的计算代价,包括对海森矩阵求逆的过程。

随后,拟牛顿算法应运而生,拟牛顿法属于梯度法的一种,具有下面形式:,其中是正定矩阵。该方法在迭代过程中通过对迭代方向的调整,使其接近牛顿下降方向。它的特点是:收敛速度快,避免牛顿法的二次微分计算。相对于共轭梯度法,它的不足在于,在计算迭代方向的矩阵向量乘法中,需要存储矩阵。并被证明在解决有约束、无约束以及大规模优化问题上比牛顿法更有效。拟牛顿算法的基本思想是不通过求偏导而直接构造出可近似海森矩阵(或海森矩阵的逆矩阵)的对称正定矩阵,在“拟牛顿条件”下优化目标函数。不同的拟牛顿算法则对应不同的构造海森矩阵或其逆矩阵的方式。

拟牛顿条件:
假定在第k次迭代后,使用二次模型对目标函数在处进行近似,为求导操作:
(26) 这里表示求导,和分别对应和。为n*n对称正定矩阵,并且在每次迭代中会进行更新。

对上式求极值点可得:
(27) 那么则视为下一步迭代的搜索方向,在该方向上进行一维线搜索得到步长之后,将会确定下一步迭代的取值:
(28)紧接着,使用相似的方法,在处对该目标函数使用二次模型进行近似,可以得到:
(29) 接下来将建立点处和点处的关系,即上式在处和处的梯度值应该和目标函数一致。因此,可以得到以下的关系:
(30) 整理可得:
(31) 令, 将得到以下关系式:
(32) 这就是割线方程,描述了目标函数自变量偏移量和梯度变化量之间的关系,也就是拟牛顿算法需要满足的条件。其中是对目标函数相应的海森矩阵的近似,假定对海森矩阵的逆矩阵进行近似,则可以得到另一等价的割线方程:
(33) BFGS算法是通过近似海森矩阵来实现的,同时是对称正定矩阵。接下来给出的构造方法。

BFGS算法:
采用直接法进行构造,并定义矩阵的更新方式:
(34) 为了保证矩阵的对称正定特性,对按以下方式进行定义:
(35) 将上式和割线方程联立可得:
(36) 括号中表示数值结果,并非向量结果。在这里,假定括号中数值分别是1和-1;
之后,确定和的数值,可得:
(37) 再令,并进一步得到和的数值:
(38) 最终得出了的更新方程:
(39) 对上式应用Sherman–Morrison–Woodbury公式将得到该方程的另一表示:
(40) 以上就是BFGS算法的海森矩阵(或其逆矩阵)的估计值的更新方程。

L_BFGS算法:
L-BFGS算法是在BFGS算法的基础上得到的,由于原始的BFGS算法需要保存n*n的矩阵,该存储量随n成平方规模增长,为了减少存储量,减小内存开销,适应大规模的优化问题,L_BFGS算法应运而生。L_BFGS算法是对BFGS算法的近似,其核心思想是不再存储完整的n*n矩阵,而是仅仅保留m个最近的n维向量和,这样存储量就由降低至。与此同时,算法性能也接近原始BFGS算法(选取合适的m值,依问题而定)。

紧接着,将给出L_BFGS算法的具体原理。根据BFGS算法中的更新方程,可以根据公式展开得到与的关系,如下:
(41) 很自然的,考虑L_BFGS算法,如果k<=m-1,那么用来计算的公式成立,无需修改;
如果k>m-1(即k>=m)时,仅仅保留最近的m个向量和m个向量,则用来计算的公式变为:
(42) 那么可以将上述两种情况进行综合,令,则有:
(43) 在每步迭代中得到后,在处建立相应的二次模型,根据极值点条件:
(44) 将成为处下一步进行搜索的方向,根据Jorge Nocedal Stephen J. Wright 《Numerical Optimization》书中的介绍,这里给出一个计算的高效的算法:
3.2算法流程 以上给出了L_BFGS算法的原理和算法流程,这部分将给出在具体优化过程中该算法的应用。通常,需要将L_BFGS算法和线搜索方向配合起来使用,以达到不错的效果,其收敛性也能得到一定的保证。L-BFGS可以被用来求解大型的无约束优化问题(Machine Learning中的很多问题都可以用其求解,如Logistic Regress等)。

这里首先给出一种广泛使用的非精确一维线搜索算法---Wolfe非精确线搜索。非精确线搜索算法是指对目标函数来说,给出在点处沿着下降方向的步长值,使在处的函数值相比处的函数值有一定的下降。而不同的非精确一维线搜索算法通过构造不同的测试条件来达到使函数值取得一定下降的目的,本文仅给出满足(强)Wolfe条件的一维非精确线搜索算法。

下面给出满足Wolfe条件的可接受步长区间的图:
图7 Wolfe条件的可接受步长区间的图 (1)
(45) (2)
(46) 强Wolfe条件:(2)
(47) 这里条件1用来使处的函数值有一定的下降值,条件2用来限定处的斜率应大于处斜率的倍;
而强Wolfe条件(2)的进一步限定了处斜率值,使可接受步长落在某个波谷中。

当然,在该算法具体的实现中,仅仅有这些是不够的,当每次迭代步长落在不满足(强)Wolfe条件的地方,需要使用插值算法给出新的步长值,这样才能够达到满意的结果。

下面给出Wolfe非精确一维线搜索算法的流程:
现在已经介绍了线搜索以及L_BFGS 算法的相关内容。下面给出整体算法流程,用来实现实际的最优化问题。

3.3算法收敛性分析:
根据割线方程,和应为对称正定矩阵,这在时成立。当目标函数为凸函数,成立;
然而对非凸函数来说,该不等式不一定成立,但是,如果线搜索算法满足Wolfe或强Wolfe条件,将成立。此外,线搜索算法中初始步长的选择也尤为重要。

4 基于AutoEncoder的手写数字识别 4.1 MNIST数据库 MNIST数据集是由Google实验室的Corinna Cortes和纽约大学柯朗研究所的Yann LeCun建有一个手写数字数据库,训练库有60,000张手写数字图像,测试库有10,000张。每一个手写数字大小为像素。部分手写数字如下图所示:
图8 部分样本 4.2 模型训练 在本次实验中,我们将像素的手写数字变换成的列数据作为我们模型的输入。训练数据个数为60000组。训练目标为得到第一层自编码神经网络的,第二层自编码神经网络的,以此类推。Softmax回归的参数。具体操作步骤见第二章。

4.3 模型测试 我们使用MNIST数据集中提供的10000组数据对我们训练的模型进行准确度测试。

模型准确率=(分对样本数)/(总样本数)。

5 实验结果及分析:
对于只有一个隐层的Autoencoder的权重可视化,以及准确率,如5.1到5.3所示。总的实验结果和参数详见表1. 5.1 AutoEncoder 这是最原始的Autoencoder,在训练时没有引入稀疏项和白噪声。这个Autonecoder只有一个隐层。图9所示是该隐层的权值。隐层节点一共有196个。训练的具体参数可查后面的表1. 准确度:0.915 W可视化:
图9 Autoencoder权值可视化 结果分析:
从图中可以依稀的看出数字0到9,这是由于这是Autoencoder的第一层。Autoencoder虽然是神经网络。但是可以看成是线性的模型,又由于这是第一层的权值(总共也就一层),所以对数据的抽象程度不高,所以从权值中基本上能够看出0到9的数字。这一点在稀疏Autoencoder中表现的更加明显。

5.2 Sparse AutoEncoder Sparse Autoencoder在Autoencoder的基础上引入了稀疏项,起到压缩信息的作用。具体说就是将输入数据用尽量少的神经节点来表示。这样就会尽量的保留有用的信息而剔除无用的信息。如果从空间的角度来理解就是将原始数据投射到由隐层节点个数个向量张成的一个低维度空间里面,同时要求投射到低维空间后数据尽量沿隐层节点的基向量,也就是权值向量分布。这样带来的好处就是能提高下一步分类的准确度。

准确度:0.9276 W可视化:
图10 Sparse Autoencoder权值可视化 结果分析:
从图中可以看出,相对于图9(原始Autoencoder),图10 的数字信息更加明显,而且少了不少的“噪声”。原因正如上面所说,引入稀疏项之后,原始数据每次激活的神经元的数量较之前少了很多。因此,一些繁杂的信息,比如图9里面的“噪声”,就被去掉了,只留下了真正有用的信息。因此,图10显得比较清晰。而且从实验结果上可以看出以Sparse Autoencoder为基础的分类器的分类精度确实比基本的Autoencoder的分类精度高。

5.3 Denoise AutoEncoder 这里的Denoise Autoencoder 跟 Autoencoder的训练程序参数设置基本相同,唯一不同的是Denoise Autoencoder在训练的时候加入了噪声。加入噪声的目的是为了模拟可能出现的遮挡,模糊,等情况,从而使训练出来的分类器更加健壮。

准确度:0.9194 W可视化:
图11 Denoise Autoencoder权值可视化 结果分析 由于与Autoencoder相比,只有训练样本不一样,因为在训练时加入噪声。加噪声的规则是:每一个像素点以0.3的概率变为0。所以,图11和图9大体上是一致的,由于训练数据不一样,所以体现到权值上就有一些差别。而且从训练结果上看,加入噪声后使得分类器精度有一定的提升。

5.4 实验结果汇总及分析 在表1中,n表示Autoencoder 的层数,AccRate表示以Autoencoder为基础的softmax分类器的准确度,λ1表示Autoencoder的权重衰减项系数,β为Autoencoder的稀疏项系数,ρ为Autoencoder的稀疏性参数,λ2为softmax的权重衰减项系数。

Denoise Autoencoder的像素值变为0的概率都是0.3,表1中的Autoencoder的隐层节点数都是196个。

5.1~5.3用到的Autoencoder的具体训练参数如表1所示:
表1 Autoencoder详细训练参数及准确率 n AccRate λ1 β ρ λ2 AutoEncoder 1 0.915 0.0002 0 0 0.0003 Denoise AutoEncoder 1 0.9194 0.0002 0 0 0.0003 Sparse AutoEncoder 1 0.9276 0.0002 2 0.015 0.0003 在训练一层的分类器的时候,通过控制变量法,改变Autoencoder的训练参数,训练出不同的Autoencoder。通过这种办法可以得到不同参数大小对Autoencoder的影响。在表2中,隐层节点都是300个,训练Autoencoder时,最大迭代次数也都是400次,其余参数如下表所示:
表2 Autoencoder参数对结果的影响 n AccRate λ1 β ρ λ2 AutoEncoder 1 0.9154 0.0003 3 0.01 0.0003 AutoEncoder 1 0.8031 0.0003 3 0.001 0.0003 AutoEncoder 1 0.9285 0.0002 3 0.01 0.0003 AutoEncoder 1 0.9218 0.0003 2 0.01 0.0003 实验结果分析:
1. 稀疏性参数ρ和稀疏项系数β是用来控制隐层的节点的平均激活程度的,ρ越低平均激活程度越低,一般情况下ρ取0.05左右。在表2的第2行当ρ取到0.001的时候,可能由于值过小导致信息丢失太多导致不能够恢复出原信号,因此使得准确率大大的降低;

2. 降低λ1后使得准确率有所上升。权重衰减项的目的是减小权值的幅度,这样在一定程度上能够防止出现过大的权重项,从而出现过拟合现象,因此适当的减小λ1可以使分类器的准确率提高,而在调节λ1的时候还要考虑权重的总的个数,也不能设的过小;

3. 对比表1和表2,表2 的准确率相比表1来说要高一些,而表1和表2有一个区别就是:隐层节点数表1的都是196个,表二的都是300个。这个对分类准确率也有很大的影响。

综上,训练Autoencoder要考虑的参数有λ1,β,ρ还有隐层节点的数量。通过表1和表2得出的经验就是:稀疏性参数ρ和稀疏项系数β要适当的小一些但是不能过于的小,ρ就在0.01左右,而β就在2左右,权重衰减系数不能太大就设置在0.0002左右。隐层节点数量从结果上看300个要比196个要好一些,由于输入节点数量就是784个,所以,隐层节点数也不能设置的太小。

6 参考资料 [1] Yoshua Bengio Learning Deep Architectures for AI [2] http://ufldl.stanford.edu/wiki/index.php/Neural_Networks [3] http://deeplearning.stanford.edu/wiki/index.php/Stacked_Autoencoders

推荐访问:
上一篇:年12月办公室秘书年度工作总结
下一篇:电大本科混凝土结构设计历年重点期末复习试题及参考答案资料

Copyright @ 2013 - 2018 优秀啊教育网 All Rights Reserved

优秀啊教育网 版权所有