堆栈自编码学习

转载:http://ufldl.stanford.edu/wiki/index.php/%E6%A0%88%E5%BC%8F%E8%87%AA%E7%BC%96%E7%A0%81%E7%AE%97%E6%B3%95

栈式自编码算法

一、概述

逐层贪婪训练法依次训练网络的每一层,进而预训练整个深度神经网络。在本节中,我们将会学习如何将自编码器“栈化”到逐层贪婪训练法中,从而预训练(或者说初始化)深度神经网络的权重。

栈式自编码神经网络是一个由多层稀疏自编码器组成的神经网络,其前一层自编码器的输出作为其后一层自编码器的输入。对于一个 \textstyle n 层栈式自编码神经网络,我们沿用自编码器一章的各种符号,假定用 \textstyle W^{(k, 1)}, W^{(k, 2)}, b^{(k, 1)}, b^{(k, 2)} 表示第 \textstyle k 个自编码器对应的 \textstyle W^{(1)}, W^{(2)}, b^{(1)}, b^{(2)} 参数,那么该栈式自编码神经网络的编码过程就是,按照从前向后的顺序执行每一层自编码器的编码步骤:

a(l)=f(z(l))z(l+1)=W(l,1)a(l)+b(l,1)(5)(6) (5) a ( l ) = f ( z ( l ) ) (6) z ( l + 1 ) = W ( l , 1 ) a ( l ) + b ( l , 1 )

同理,栈式神经网络的解码过程就是,按照从后向前的顺序执行每一层自编码器的解码步骤:

a(n+l)=f(z(n+l))z(n+l+1)=W(nl,2)a(n+l)+b(nl,2)(19)(20) (19) a ( n + l ) = f ( z ( n + l ) ) (20) z ( n + l + 1 ) = W ( n − l , 2 ) a ( n + l ) + b ( n − l , 2 )

其中,\textstyle a^{(n)} 是最深层隐藏单元的激活值,其包含了我们感兴趣的信息,这个向量也是对输入值的更高阶的表示。

通过将 \textstyle a^{(n)} 作为softmax分类器的输入特征,可以将栈式自编码神经网络中学到的特征用于分类问题。

二、 训练

一种比较好的获取栈式自编码神经网络参数的方法是采用逐层贪婪训练法进行训练。即先利用原始输入来训练网络的第一层,得到其参数 \textstyle W^{(1,1)}, W^{(1,2)}, b^{(1,1)}, b^{(1,2)};然后网络第一层将原始输入转化成为由隐藏单元激活值组成的向量(假设该向量为A),接着把A作为第二层的输入,继续训练得到第二层的参数 \textstyle W^{(2,1)}, W^{(2,2)}, b^{(2,1)}, b^{(2,2)};最后,对后面的各层同样采用的策略,即将前层的输出作为下一层输入的方式依次训练。

对于上述训练方式,在训练每一层参数的时候,会固定其它各层参数保持不变。所以,如果想得到更好的结果,在上述预训练过程完成之后,可以通过反向传播算法同时调整所有层的参数以改善结果,这个过程一般被称作“微调(fine-tuning)”。

实际上,使用逐层贪婪训练方法将参数训练到快要收敛时,应该使用微调。反之,如果直接在随机化的初始权重上使用微调,那么会得到不好的结果,因为参数会收敛到局部最优。

如果你只对以分类为目的的微调感兴趣,那么惯用的做法是丢掉栈式自编码网络的“解码”层,直接把最后一个隐藏层的 \textstyle a^{(n)} 作为特征输入到softmax分类器进行分类,这样,分类器(softmax)的分类错误的梯度值就可以直接反向传播给编码层了。

三、 具体实例

让我们来看个具体的例子,假设你想要训练一个包含两个隐含层的栈式自编码网络,用来进行MNIST手写数字分类(这将会是你的下一个练习)。 首先,你需要用原始输入 \textstyle x^{(k)} 训练第一个自编码器,它能够学习得到原始输入的一阶特征表示\textstyle h^{(1)(k)}(如下图所示)。

这里写图片描述
Stacked SparseAE Features1.png

接着,你需要把原始数据输入到上述训练好的稀疏自编码器中,对于每一个输入\textstyle x^{(k)},都可以得到它对应的一阶特征表示\textstyle h^{(1)(k)}。然后你再用这些一阶特征作为另一个稀疏自编码器的输入,使用它们来学习二阶特征 \textstyle h^{(2)(k)}。(如下图所示)

这里写图片描述
Stacked SparseAE Features2.png

同样,再把一阶特征输入到刚训练好的第二层稀疏自编码器中,得到每个 \textstyle h^{(1)(k)} 对应的二阶特征激活值 \textstyle h^{(2)(k)}。接下来,你可以把这些二阶特征作为softmax分类器的输入,训练得到一个能将二阶特征映射到数字标签的模型。

这里写图片描述
Stacked Softmax Classifier.png

如下图所示,最终,你可以将这三层结合起来构建一个包含两个隐藏层和一个最终softmax分类器层的栈式自编码网络,这个网络能够如你所愿地对MNIST数字进行分类。

这里写图片描述
Stacked Combined.png

四、 讨论

栈式自编码神经网络具有强大的表达能力及深度神经网络的所有优点。

更进一步,它通常能够获取到输入的“层次型分组”或者“部分-整体分解”结构。为了弄清这一点,回顾一下,自编码器倾向于学习得到能更好地表示输入数据的特征。因此,栈式自编码神经网络的第一层会学习得到原始输入的一阶特征(比如图片里的边缘),第二层会学习得到二阶特征,该特征对应一阶特征里包含的一些模式(比如在构成轮廓或者角点时,什么样的边缘会共现)。栈式自编码神经网络的更高层还会学到更高阶的特征。

举个例子,如果网络的输入数据是图像,网络的第一层会学习如何去识别边,第二层一般会学习如何去组合边,从而构成轮廓、角等。更高层会学习如何去组合更形象且有意义的特征。例如,如果输入数据集包含人脸图像,更高层会学习如何识别或组合眼睛、鼻子、嘴等人脸器官。

五、 中英文对照
自编码器 Autoencoder
逐层贪婪训练法 Greedy layer-wise training
预训练 PreTrain
栈式自编码神经网络 Stacked autoencoder
微调 Fine-tuning
原始输入 Raw inputs
层次型分组 Hierarchical grouping
部分-整体分解 Part-whole decomposition
一阶特征 First-order features
二阶特征 Second-order features
更高阶特征 Higher-order features
激活值 Activation

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
堆栈自编码(stacked autoencoder)是一种深度学习模型,可以用于无监督学习特征提取。其基本思想是通过多层的编码器和解码器网络来学习数据的低维表示,从而提取出数据中的关键特征。参数优化是训练模型的关键步骤之一,下面介绍几种常见的堆栈自编码参数优化方法: 1. 随机梯度下降(SGD):SGD是一种基本的优化方法,通过每次迭代更新一小部分数据的梯度来更新参数。SGD的优点是简单易懂,但是容易陷入局部最优解。 2. 动量梯度下降(Momentum SGD):Momentum SGD在SGD的基础上增加了动量项,通过平滑前几次的梯度来加速收敛并减少震荡。Momentum SGD的优点是可以加速收敛,并且可以跳出局部最优解。 3. 自适应学习率优化算法(Adagrad):Adagrad通过适应性地调整每个参数的学习率来进行优化,对于出现频率较大的参数,降低学习率,对于出现频率较小的参数,提高学习率。Adagrad的优点是可以自适应地调整学习率,但是容易出现学习率过小的情况。 4. 自适应矩估计算法(Adam):Adam是一种自适应矩估计算法,不仅考虑梯度的一阶矩估计(均值),还考虑了梯度的二阶矩估计(方差),通过动态调整每个参数的学习率来进行优化。Adam的优点是可以自适应地调整学习率,并且相对于SGD等方法,收敛速度更快。 总的来说,不同的参数优化方法适用于不同的场景,需要根据实际情况选择。同时,也可以通过调整超参数来进一步优化模型的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值