离上一次更新没过几天,但却经历了好多事情,2020真的太不寻常了…永远不知道明天和意外哪个会先来!珍惜当下~天佑中华!
今天接着记叙项目中需要用到的模型。
Stacked Auto Encoder
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有不错的效果?
一个直观的解释是,预训练好的网络在一定程度上拟合了训练数据的结构,这使得整个网络的初始值是在一个合适的状态,便于有监督阶段加快迭代收敛。
友情链接:栈式自编码器的微调过程
【模型详解】AutoEncoder详解(七)——栈式自编码:Stacked AutoEncoder
家里蹲第二天…希望疫情快过去吧!想重启2020啊!