深度学习(1)——sae(稀疏自动编码机)_第1页
深度学习(1)——sae(稀疏自动编码机)_第2页
深度学习(1)——sae(稀疏自动编码机)_第3页
深度学习(1)——sae(稀疏自动编码机)_第4页
深度学习(1)——sae(稀疏自动编码机)_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、深度学习深度学习(1)稀疏自动编码机(稀疏自动编码机(SAE)网络)网络 广东工业大学 13级控制工程 传统神经网络 1)比较容易过拟合,参数比较难调整; 2)训练速度比较慢,在层次比较少(小于等于3)的情况下效果并不比其它方法更优;BP算法存在的问题:(1)梯度越来越稀疏:从顶层越往下,误差校正信号越来越小;(2)收敛到局部最小值:尤其是从远离最优区域开始的时候(随机值初始化会导致这种情况的发生);(3)一般,我们只能用有标签的数据来训练:但大部分的数据是没标签的,而大脑可以从没有标签的的数据中学习;一、针对过拟合现象的处理1.惩罚项(Penalty,正则化方法,正则化的一般形式是在整个目标

2、函数后增加一个正则项,以使经验风险最小化。把不重要的项的参数保留,但是令其系数为零)2.给输入层a1加噪,以及对隐含层ai进行Dropout (按比例随机清零。)二、针对训练快慢与稳定性的矛盾 应用权值动量辅助调整权值三、针对以往一个bp网络不能太多层 先逐个逐个隐含层进行无监督训练(实际还是用bp),即调用saesetup.m以及saetrain.m。 然后得到各个隐含层的参数才对完整的网络进行有监督训练。test_example_SAE.m一、训练隐含层(例中为单个隐含层) 1.调用saesetup设置网络参数( 结构为784 100的两层网络) 2.在第1步基础上修改网络参数(这里是修改

3、第一组的 激活函数类型、学习率、输入加噪率、训练迭代次数、batchsize) 3.调用saetrain,让它对各个隐含层进行逐层训练(例子中给的隐含层数为1层,100个节点,输入输出同是train_x。每次进行nntrain来训练隐含层都为三层网络,输入层和输出层一样) 4.对第一组权值进行可视化,看看学习结果。(由于例中的网络只有一个100节点隐含层,故可视化为一张100个特征块图片。第一组权值W1用于编码,第二组W2用于解码)二、初始化网络(为第三步初始化) 1.调用nnsetup,设置整个网络(结构是784 100 10) 2.设置网络的激活函数和学习率 3.第一步中,把用于编码的W(

4、实际包括阈值b和权值W)赋给此网络。三、训练前向网络1. 设置训练次数、batchsize。2.调用nntrain训练整个网络(此时因期望输出是train_y,为有监督的训练)3.调用nntest测试整个网络saesetup.m这里sae.setup中的输入是784 100,令architecture=784 10 784 ,调用nnsetup进行网络参数设置。xhxW1b1W1b1saetrain.m逐个隐含层逐个隐含层进行nntrain(sae.aei, x, x, opts)训练更新sae.aei参数,其实就是更新sae.aei.W1、sae.aei.W2实验中,这里的i=1,因而就是得

5、到sae.ae1.W1、sae.ae1.W2,而最后只取用sae.ae1.W1784+1100+1784+1+1这里a1=train_xa2=sigm(nn.a1 * nn.W1),作为训练第二个隐含层的输入,但是这里只有一个隐含层,所以a2在这里并没用a1a2若是需要训练两个隐含层,那么这里的a2则作为下个三层网络的输入以及输出a1a2阈值Bnnsetup.mnn.size = architecture; %要设置的各层节点结构,如784 100 784 nn.n = numel(nn.size); %层数,当784 100 784,则为3 nn.activation_function =

6、tanh_opt; %激活函数,或称传递函数nn.learningRate = 2; %学习率,或称步长,就是决定每次梯度下降的长度nn.momentum = 0.5; % 权值动量nn.scaling_learningRate = 1; %在nntrain中出现,是每代间,学习率的关系倍数nn.weightPenaltyL2 = 0; %权值惩罚(L2正则化),在nnapplygrads中用到nn.nonSparsityPenalty = 0; %稀疏惩罚项,在nnbp中用到。nn.sparsityTarget = 0.05; %稀疏目标,在nnbp中用到。nn.inputZeroMaske

7、dFraction = 0; %用于加噪nn.dropoutFraction = 0; %每一次mini-batch样本输入训练时,随机扔掉0%的隐含层节点nn.testing = 0; %设置此时网络有无测试nn.output = sigm; %输出接什么函数,还有softmax and linear以下i 为从第 2 到最后一层 nn.n nn.Wi - 1 随机给出网络权值初始值nn.vWi - 1 让它初值=0 %用于更新参数时的临时参数nn.pi 让它初值=0 稀疏nntrain(这里无验证数据输入)大循环逐numepochs(训练代数)小循环逐numbatches(每代的样本批次,

8、每批样本100个,它们共同决定更新一次权值。不同代的同个批次中的样本不会相同,因为被随机打乱了。)1 故有numepochs* numbatches次执行下列(这么多次更新权值)判断inputZeroMaskedFraction,看看是否要加噪,是的话,按此比例随机把输入值清零。 nn = nnff(nn, batch_x, batch_y);%前向网络 nn = nnbp(nn); % 反向传播网络nn = nnapplygrads(nn); %梯度下降L(n)=nn.L;%保存每次训练的误差,总共训练了10*600次,故有6000个误差2 每代更新损失值和学习率loss = nneval(

9、nn, loss, train_x, train_y);%误差值 nn.learningRate = nn.learningRate * nn.scaling_learningRate;%调整改变下一次训练的学习率nntrain.mxhyW2b2W1b1结果得到每层的激活值,一、输入层a1=ones(m,1) x,这里m=size(x,1)=100二、隐含层(这里只考虑s函数)从第2到第n-1层,ai = sigm(nn.ai - 1 * nn.Wi - 1);dropoutFraction用在训练隐含层中,随机将激活值按比例清零(为了让权值不起作用)dropoutFraction用在测试中,

10、将激活值nn.ai = nn.ai.*(1 - nn.dropoutFraction)if(nn.nonSparsityPenalty0)% 在nnbp中用到 nn.pi = 0.99 * nn.pi + 0.01 * mean(nn.ai, 1);三、输出层1。当输出不接softmax时 nn.an = sigm(nn.an - 1 * nn.Wn - 1);2。当输出接分类器softmax时(此次实验没用到它) 得到误差值e=y-an当输出不接softmax时,平均误差平方为L = sum(sum(1/2 * nn.e . 2) / m;nnff.m为了得到n-1组dW,用于调节n-1个W

11、。在求dW过程中用到了中间变量 di,d_act一、求di 1.输出层的dn当 nn.output=sigm时,dn = - nn.e .* (nn.an .* (1 - nn.an); (即1/2 *nn.e2的复合函数求导,其中变量是nn.an) 2.隐含层的diif(nn.nonSparsityPenalty0) pi = repmat(nn.pi, size(nn.ai, 1), 1); sparsityError = zeros(size(nn.ai,1),1) nn.nonSparsityPenalty * (-nn.sparsityTarget ./ pi + (1 - nn.s

12、parsityTarget) ./ (1 - pi);if i+1=n % 倒数第二层,即最后一个隐含层 di = (di + 1 * nn.Wi + sparsityError) .* d_act; % d_act = nn.ai .* (1 - nn.ai);else %此外 di = (di + 1(:,2:end) * nn.Wi + sparsityError) .* d_act; if(nn.dropoutFraction0)% nn.dropOutMaski在nnff中已求得,必须与它相同 di = di .* ones(size(di,1),1) nn.dropOutMaski

13、;(清零)二、求dWiif i+1=n nn.dWi = (di + 1 * nn.ai) / size(di + 1, 1); else nn.dWi = (di + 1(:,2:end) * nn.ai) / size(di + 1, 1); (以往的bp网络,W=-*de/dw,这里多了稀疏项,以及Dropout 的处理,在下一步的nnapplygrads中还多了权值惩罚以及权值动量)nnbp.m nnapplygrads.m梯度下降法计算作为更新值的nn.W。当当设置nn.weightPenaltyL20,则 dW = nn.dWi + nn.weightPenaltyL2 * zer

14、os(size(nn.Wi,1),1) nn.Wi(:,2:end);当当设置nn.weightPenaltyL2=0,则dW = nn.dWi再再让dW乘以学习率(或称 步长)如果如果权值动量momentum0,则 nn.vWi = nn.momentum*nn.vWi + dW; dW = nn.vWi;最后最后nn.Wi = nn.Wi - dW;1。惩罚项方法是一种间接修剪网络的办法,其原理是在传统的误差函数中加入一衡量网络结构复杂程度的“复杂度项”。应用到权值更新规则后,该项在训练过程中起到防止权值增长太大和驱使不重要权值逐渐减小到零的作用防止权值增长太大和驱使不重要权值逐渐减小到零的作用。尽管那些接近零的连接权没有从网络中被删除。但它们对网络输出几乎没有影响,已相当于从网络中被删除了。这样一来,训练后的神经网络实际上已是被修剪过的小网络了。可见,惩罚项法在没有破坏网络结构的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论