Stacked Auto Encoder(栈式自动编码)

您所在的位置:网站首页 encoders Stacked Auto Encoder(栈式自动编码)

Stacked Auto Encoder(栈式自动编码)

#Stacked Auto Encoder(栈式自动编码)| 来源: 网络整理| 查看: 265

Stacked Auto Encoder称为栈式自动编码,顾名思义,它是对自编码网络的一种使用方法,是一个由多层训练好的自编码器组成的神经网络。先引入关于 自动编码即(AE)的相关知识

Auto Encoder

AE(Auto Encoder)是一种无监督的含有一个隐含层神经网络,其中输出层被设置为等于输入层,AE的目的是尽可能的准确地重建原始输入。 整个模型的结构如下图所示: AE由编码器和解码器组成。

先简单说一下思想:

一般的MLP(多层感知机)是一个有监督学习的过程,除了给定输入数据X之外,还要给定label Y,然后把X feed 到神经网络,并最小化神经网络的输出与label Y之间的差值,通过这种方法来训练神经网络的参数。

AE的区别是这是个非监督学习的过程,也就是说不需要label Y, 自编码是这样干的,它令每个样本的标签为y=x,也就是每个样本的数据x的标签也是x。自编码就相当于自己生成标签,而且标签是样本数据本身。训练时的优化目标是让输出值跟输入值尽可能接近,最好完全一样。

我们可以这样理解:输入数据代表了一些信息,起初以一定维度的数据来表示,然后经过中间隐藏层编码后,维度被压缩(降低)了,但是最后还是还原成了一个与原始信息非常接近的数据。 举个例子,这个过程,就好像把文件先压缩,再解压缩,或者把文件加密再解密,数据的中间的形式(维度)发生了变化,但数据的信息量不变。 这就是核心思想,类似PCA。

所以根据以上思想,只要训练一个简单的,单隐藏层的神经网络,就可以用无监督的方式实现数据降维。这就是最基本的AE。

接下来根据上面图片看一下过程:

1.假设AE的输入为: 其中dx是输入的维数。

2.编码器通过映射函数f将x从输入层投影到隐含层 其中d(h)是隐含层变量向量的维度。其中f(x)函数表示为 其中w是dh×dx权重矩阵,b∈Rdx是偏差向量。解码器的激活函数sf可以是sigmoid函数、tanh函数或者rectified

3.在编码器中,通过映射函数f将隐含层表示的h映射到输出层的x∈Rdx,其中f函数如下:

其中w是dx×dh权重矩阵,b∈Rdx是输出层的偏差向量。同样sf的激活函数可以是sigmoid函数、tanh函数或者rectified linear unit function(ReLu函数)。

4.AE用于通过对网络施加限制(例如限制隐含层单元的数量)来重新构建输出x尽可能的与输入x相似。训练的输入数据表示为

其中N是训练样本总数。

每一个训练样本xi都被投影到隐含表示hi,然后被映射到重构数据xi。为了获得模型参数,通过计算均方重构误差最小化来重构损失函数 5.AE的参数可以通过梯度下降算法来更新。 训练完成后,AE的权重和偏差被保存下来。

这部分具体可参考:[论文学习]1——Stacked AutoEncoder(SAE)堆栈自编码器

回到SAE,SAE是具有分层结构的神经网络,由多个AE层逐层连接组成。

“栈化”过程的基本实现思想如下:训练好上述的AE结构后,舍去解码过程,此时我们可以理解为code具有一定的降维、提取特征的能力。将此时的code作为输入,输入到新的AE结构中进行训练,如下图所示

在这个过程中,特别注意一下,我们把前面的整体输出(h1-h4)当成这第二层的输入了,那么构建第二个autoencoder时,添加的临时输出层就不再是原始的(x1-x6)了,而是第一部分的输出,即(h1-h4)。这一点是避免训练方式的误解的关键所在。

如此重复,使每次的“栈化”过程都能够学习到近似最优,最后得到code,可以认为,这个code更能够提取出有效的特征,因为它是多种效果的“叠加”,相应的,如果是进行分类操作,直接将code接入到分类器中,就可以得到分类结果,下图所示的是将code接入到softmax中:

故,上述整个过程可以如下所示(途中省略了每次训练的解码过程):

详例(包含两个隐含层的栈式自编码网络)及实战代码参考: 自编码实例5:栈式自编码

总的来说堆栈自编码器的思路是:我们已经得到特征表达h,将h作为原始信息,训练一个新的自编码器,得到新的特征表达。Stacked 就是逐层堆叠的意思,当把多个自编码器 Stack 起来之后,这个系统看起来就像这样:

需要注意的是,整个网络的训练不是一蹴而就的,而是逐层进行的。 比如说我们训练一个n -> m -> k 结构的网络,实际上我们是先训练网络 n -> m -> n ,得到 n -> m 的变换,然后再训练 m -> k -> m 网络,得到 m -> k 的变换。最终堆叠成 SAE ,即为 n -> m -> k 的结果,整个过程就像一层层往上面盖房子,这就是 逐层非监督预训练。

为什么逐层预训练的SAE有不错的效果? 一个直观的解释是,预训练好的网络在一定程度上拟合了训练数据的结构,这使得整个网络的初始值是在一个合适的状态,便于有监督阶段加快迭代收敛。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3