【自监督算法】自编码器(autoencoder, AE)

 十分建议先读keras文档
 看完之后感觉好像普通的自编码器好像没啥用啊?
 使用自编码器做数据压缩,性能并不怎么样……
 做逐层预训练训练深度网络吧,现在好的初始化策略、Batch Normalization、残差连接啥的都很有效了……
 那自编码器岂不是只有数据去噪、为进行可视化而降维这两个可应用的点了!配合适当的维度和稀疏约束,自编码器可以学习到比PCA等技术更有意思的数据投影。
当然了,变分自编码器用于生成模型还是挺好的!

1.简介

自编码器是一类在监督学习和监督学习中使用的人工神经网络

功能: 通过将输入信息作为学习目标,对输入信息进行表征学习。可应用于降维、降噪、异常值检测、数据生成、深度神经网络的预训练,包含卷积层的可被应用于计算机视觉问题,包括图像降噪、神经风格迁移等 。

结构: 编码器(encoder)和解码器(decoder)。输入神经元和输出神经元的个数相等,输出是在设法重建输入,损失函数是重建损失。

特点: 是一种数据压缩算法。

  • 数据相关的(data-specific),只能压缩类似于训练集的数据。
  • 有损的,解压缩的输出与原来的输入相比是退化的。
    在这里插入图片描述
  • 从数据样本中自动学习的,这意味着很容易对指定类的输入训练出一种特定的编码器,而不需要完成任何新工作。
    在这里插入图片描述

按学习范式分类: 前两者是判别模型、后者是生成模型

  • 收缩自编码器(Undercomplete autoencoder)
  • 正则自编码器(Regularized autoencoder)
  • 变分自编码器(Variational AutoEncoder, VAE)

按构筑类型分类:

  • 前馈结构的神经网络
  • 递归结构的神经网络

不完备自编码器(undercomplete autoencoder):内部表示(隐层的输出)的维度小于输入数据。

自编码器吸引了一大批研究和关注的主要原因之一是很长时间一段以来它被认为是解决无监督学习的可能方案,即大家觉得自编码器可以在没有标签的时候学习到数据的有用表达。再说一次,自编码器并不是一个真正的无监督学习的算法,而是一个自监督的算法。自监督学习是监督学习的一个实例,其标签产生自输入数据。要获得一个自监督的模型,你需要想出一个靠谱的目标跟一个损失函数,问题来了,仅仅把目标设定为重构输入可能不是正确的选项。基本上,要求模型在像素级上精确重构输入不是机器学习的兴趣所在,学习到高级的抽象特征才是。事实上,当你的主要任务是分类、定位之类的任务时,那些对这类任务而言的最好的特征基本上都是重构输入时的最差的那种特征。

2.最简单的自编码器

一个全连接的编码器和解码器,学到的是PCA的近似。

3.稀疏自编码器

对隐层单元施加稀疏性/正则性约束的话,会得到更为紧凑的表达,只有一小部分神经元会被激活。所以模型过拟合的风险降低。

2.栈式自编码器Stacked Autoencoders

定义: 有多个隐层的自编码器,即把自编码器叠起来。

Q:增加隐层可以学到更复杂的编码,但千万不能使自编码器过于强大。
A:想象一下,一个Encoder过于强大,它仅仅是学习将输入映射为任意数,然后Decoder学习其逆映射。很明显,这一自编码器可以很好的重建数据,但它并没有在这一过程中学到有用的数据表示,也不能推广到新的实例。

在这里插入图片描述

栈式自编码器的架构一般是关于中间隐层对称的。

2.1.训练方式

2.1.1.捆绑权重,直接训练整个栈式自编码器

前提: 自编码器的层次是严格轴对称的(如上图)。
实现: 将Decoder层的权重捆绑到Encoder层。
好处: 使得模型参数减半,加快了训练速度,降低了过拟合风险。

假设自编码器一共有NN层(不算输入层),WLW_L表示第LL层的权重。即,第一层是第一个隐层,第N2\frac N2层是编码层,第NN层是输出层)。则,Decoder层的权重可以表示为WNL+1=WLT,L=1,2,,N2W_{N−L+1}=W^T_L ,L=1,2,⋯,\frac N2
注意: 偏置项不会捆绑。

2.1.2.多次训练,一次训练一个浅层自编码器

方法: 训练多个浅层的自编码器,然后再将它们合并为一体,这样要快得多。

实现方法1: 使用这种方式,可创建很深的栈式AE。

  1. 第一个自编码器:重建输入。
  2. 第二个自编码器:重建第一个自编码器隐层的输出。
  3. 整合这两个自编码器。
    在这里插入图片描述

实现方式2:

  1. 中间:完整的栈式编码器,在训练完成之后可以使用。
  2. 左侧:是最先需要训练的,它跳过第二和第三个隐层,直接创建一个输出层。这个输出层与栈式自编码器的输出层共享同样的权重和偏置。
  3. 右侧:随后训练。它使得第三个隐层的输出与第一个隐层的输出尽可能的接近。
    在这里插入图片描述

2.2.使用栈式自编码器进行无监督预训练

 如果我们要处理一个复杂的有监督学习问题又没有足够的标注数据,一个解决方案是找到一个解决类似任务的训练好的模型,复用低层。
 类似的,如果有一个很大的数据集但绝大部分是未标注数据,可以使用所有的数据先训练一个栈式自编码器,然后复用低层来完成真正的任务。
在这里插入图片描述

3.去噪自编码器

目的: 强制自编码器学习有用特征。防止自编码器简单的将输入复制到输出,提取出数据中有用的模式。
实现方式1: 对输入增加噪声(如高斯噪声),通过训练之后得到无噪声的输出。
实现方式2: 随机丢弃输入层的某个特征,类似于dropout。
在这里插入图片描述

去噪自编码器:高斯噪声(左)、Dropout(右)

4.卷积自编码器:用卷积层搭建

在现实中,用于处理图像的自动编码器几乎都是卷积自动编码器。
编码器:卷积层、MaxPooling层(空域下采样)
解码器:卷积层、上采样层

5.序列到序列的自动编码器

如构造基于LSTM的自编码器:首先用一个LSTM的编码器来将输入序列变为一个向量,然后将这个向量重复N次,然后用LSTM的解码器将这个N步的时间序列变为目标序列。

典型:seq2seq模型

  • 编码器:处理序列输入并压缩信息到一个固定长度的上下文向量中(sentence embedding)。上下文向量被当做是输入序列的语义概要。
  • 解码器:由上下文向量初始化,并每次产生一个转码输出。早期的研究仅使用编码网络的最后一个状态作为下次解码的初始状态。
    在这里插入图片描述

固定长度上下文向量具有一个明显的致命缺点:无法记忆长句子。一旦完成编码器输入序列的处理,就会遗忘开始的部分。因此注意力机制(Bahdanau et al., 2015)被提出,解决这个问题。

6.变分自编码器:编码数据的分布

VAE为码字施加约束,是使编码器学习到输入数据的隐变量模型

隐变量模型是连接显变量集和隐变量集的统计模型,隐变量模型的假设是显变量是由隐变量的状态控制的,各个显变量之间条件独立。

也就是说,变分编码器不再学习一个任意的函数,而是学习你的数据概率分布的一组参数。通过在这个概率分布中采样,你可以生成新的输入数据,即变分编码器是一个生成模型

工作原理:

  1. 建立编码网络,将输入影射为隐分布的参数: 编码器网络将输入样本x转换为隐空间的两个参数,记作z_mean和z_log_sigma。
  2. 然后从这些参数确定的分布中采样,这个样本相当于之前的隐层值: 随机从隐藏的正态分布中采样得到数据点z,这个隐藏分布我们假设就是产生输入数据的那个分布。z=zmean+exp(zlogσ)ϵz = z_{mean} + exp(z_{log\sigma})*\epsilonϵ\epsilon是一个服从正态分布的张量。
  3. 最后,将采样得到的点映射回去重构原输入: 使用解码器网络将隐空间映射到显空间,即将z转换回原来的输入数据空间。

需要实例化三个模型:

  1. 一个端到端的自动编码器,用于完成输入信号的重构
  2. 一个用于将输入空间映射为隐空间的编码器
  3. 一个利用隐空间的分布产生的样本点生成对应的重构样本的生成器

使用端到端的模型训练,参数集由两个损失函数来训练:

  1. 重构损失函数:要求解码出来的样本与输入的样本相似(与之前的自编码器相同)
  2. 学习到的隐分布与先验分布的KL距离,作为一个正则。实际上,把这项损失函数去掉也可以,尽管它对学习符合要求的隐空间和防止过拟合有帮助。

Python实现:

  1. Tensorflow
  2. Keras
  3. Keras文档

参考

https://blog.csdn.net/qq_19707521/article/details/78740986
https://www.cnblogs.com/royhoo/p/Autoencoders.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章