【通俗理解】AutoEncoder模型——无监督特征学习的数学奥秘
关键词提炼
#AutoEncoder #无监督学习 #特征提取 #神经网络 #Denoising AutoEncoder #Sparse AutoEncoder #CNN/LSTM AutoEncoder #Variational AutoEncoder #Adversarial AutoEncoder
第一节:AutoEncoder的类比与核心概念
1.1 AutoEncoder的类比
AutoEncoder可以被视为一个“数据压缩机”,它通过学习输入数据的压缩表示,然后再将这种表示解压回原始数据,从而实现高效的特征提取和数据降维。就像我们用ZIP文件压缩文档一样,AutoEncoder也能把数据“压缩”成一个更简洁的形式,同时保留最重要的信息。
1.2 相似公式比对
- 主成分分析(PCA): X = U Σ V T X = U\Sigma V^T X=UΣVT,是一种线性降维技术,通过保留数据的主要特征来减少数据的维度。
- AutoEncoder:通过神经网络学习一个映射 f ( g ( x ) ) ≈ x f(g(x)) \approx x f(g(x))≈x,其中 g g g是编码器, f f f是解码器,实现非线性降维和特征提取。
第二节:AutoEncoder的核心概念与应用
2.1 核心概念
- 编码器(Encoder): g ( x ) g(x) g(x),将输入数据 x x x映射到一个低维的特征空间 z z z。
- 解码器(Decoder): f ( z ) f(z) f(z) ,将特征空间 ,将特征空间 ,将特征空间z 映射回原始数据空间,重构出输入数据 映射回原始数据空间,重构出输入数据 映射回原始数据空间,重构出输入数据x’$。
- 重构误差:通过最小化重构误差 ∣ ∣ x − x ′ ∣ ∣ 2 ||x - x'||^2 ∣∣x−x′∣∣2来优化编码器和解码器,使得学到的特征表示 z z z尽可能保留输入数据 x x x的重要信息。
2.2 应用
- 特征提取:AutoEncoder可以用于提取高维数据的低维特征表示,便于后续的分类、聚类等任务。
- 数据降维:通过AutoEncoder学习数据的压缩表示,实现数据的有效降维,提高计算效率和存储效率。
- 异常检测:利用AutoEncoder的重构误差来检测输入数据中的异常点,因为异常点通常难以被准确重构。
2.3 优势与劣势
- 优势:无监督学习,不需要标签信息,适用于大量未标注数据的特征提取;非线性降维,能够捕捉数据中的复杂结构。
- 劣势:可能过拟合,特别是当神经网络参数较多时;需要选择合适的网络结构和超参数。
2.4 与PCA的类比
AutoEncoder在特征提取方面扮演着与PCA相似的角色,但PCA是一种线性降维技术,而AutoEncoder通过神经网络实现非线性降维,能够捕捉数据中的更复杂、更抽象的特征。
第三节:公式探索与推演运算
3.1 AutoEncoder的基本形式
AutoEncoder的基本形式可以表示为:
min g , f ∣ ∣ x − f ( g ( x ) ) ∣ ∣ 2 \min_{g,f} ||x - f(g(x))||^2 g,fmin∣∣x−f(g(x))∣∣2
其中, g g g是编码器, f f f是解码器,目标是最小化重构误差。
3.2 不同类型的AutoEncoder
-
Denoising AutoEncoder:在输入数据中加入随机噪声,增强模型的鲁棒性。
min g , f ∣ ∣ x − f ( g ( x + noise ) ) ∣ ∣ 2 \min_{g,f} ||x - f(g(x + \text{noise}))||^2 g,fmin∣∣x−f(g(x+noise))∣∣2
-
Sparse AutoEncoder:在损失函数中加入稀疏性约束,使得编码器输出的特征表示更加稀疏。
min g , f ∣ ∣ x − f ( g ( x ) ) ∣ ∣ 2 + λ ∑ i KL ( ρ ∣ ∣ ρ ^ i ) \min_{g,f} ||x - f(g(x))||^2 + \lambda \sum_i \text{KL}(\rho || \hat{\rho}_i) g,fmin∣∣x−f(g(x))∣∣2+λi∑KL(ρ∣∣ρ^i)
其中, KL ( ρ ∣ ∣ ρ ^ i ) \text{KL}(\rho || \hat{\rho}_i) KL(ρ∣∣ρ^i)是KL散度,用于衡量神经元激活概率 ρ ^ i \hat{\rho}_i ρ^i与期望概率 ρ \rho ρ之间的差异。
-
CNN/LSTM AutoEncoder:将卷积神经网络(CNN)或长短时记忆网络(LSTM)等结构融入AutoEncoder中,用于处理图像序列等数据。
-
Variational AutoEncoder(VAE):假设特征表示 z z z服从某种分布,并通过采样生成 z z z,实现生成模型的效果。
min g , f − ELBO ( x ) \min_{g,f} -\text{ELBO}(x) g,fmin−ELBO(x)
其中,ELBO是证据下界(Evidence Lower Bound),用于近似最大化数据的对数似然。
-
Adversarial AutoEncoder:结合生成对抗网络(GAN)的思想,通过对抗训练提高特征表示的鲁棒性和生成能力。
3.3 推演与运算
对于不同类型的AutoEncoder,其推演和运算主要涉及到神经网络的前向传播和反向传播算法。通过梯度下降等优化算法更新网络参数,最小化重构误差或相关损失函数,从而实现特征提取和数据降维的目标。
第四节:相似公式比对
-
自编码器与PCA:
- 共同点:都用于特征提取和数据降维。
- 不同点:PCA是线性降维技术,而自编码器通过神经网络实现非线性降维;PCA是无参数的,而自编码器需要学习网络参数。
-
Denoising AutoEncoder与Dropout:
- 相似点:都通过在输入或隐藏层加入随机噪声来提高模型的鲁棒性。
- 差异:Denoising AutoEncoder是在训练阶段加入噪声,而Dropout是在训练阶段随机丢弃部分神经元的激活输出。
-
Sparse AutoEncoder与L1正则化:
- 相似点:都通过引入稀疏性约束来简化模型,提高泛化能力。
- 差异:Sparse AutoEncoder通过KL散度来衡量神经元的激活概率与期望概率之间的差异,而L1正则化则是直接对权重的绝对值进行惩罚。
第五节:核心代码与可视化
以下是一个使用Python和TensorFlow库实现的简单AutoEncoder示例代码,用于MNIST数据集的特征提取和数据降维。代码还包括了使用matplotlib和seaborn库进行可视化的部分。
import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 加载MNIST数据集
(x_train, _), (x_test, _) = tf.keras.datasets.mnist.load_data()
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
x_train = x_train[..., tf.newaxis]
x_test = x_test[..., tf.newaxis]
# 构建AutoEncoder模型
input_img = layers.Input(shape=(28, 28, 1))
x = layers.Flatten()(input_img)
x = layers.Dense(128, activation='relu')(x)
x = layers.Dense(64, activation='relu')(x)
x = layers.Dense(32, activation='relu')(x)
encoded = layers.Dense(2, activation='relu')(x) # 特征表示z的维度为2
x = layers.Dense(32, activation='relu')(encoded)
x = layers.Dense(64, activation='relu')(x)
x = layers.Dense(128, activation='relu')(x)
x = layers.Dense(784, activation='sigmoid')(x)
decoded = layers.Reshape((28, 28, 1))(x)
autoencoder = models.Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
# 训练AutoEncoder模型
autoencoder.fit(x_train, x_train, epochs=50, batch_size=256, shuffle=True, validation_data=(x_test, x_test))
# 可视化原始图像和重构图像
fig, ax = plt.subplots(2, 10, figsize=(20, 4))
for i in range(10):
ax[0, i].imshow(x_test[i].reshape(28, 28))
ax[0, i].title.set_text("Original")
ax[0, i].axis('off')
ax[1, i].imshow(autoencoder.predict(x_test[i:i+1]).reshape(28, 28))
ax[1, i].title.set_text("Reconstructed")
ax[1, i].axis('off')
sns.despine()
plt.show()
# 打印输出信息
print("AutoEncoder model has been trained and tested on MNIST dataset.")
print("The reconstructed images are shown below the original images.")
这段代码首先加载了MNIST数据集,并构建了一个简单的AutoEncoder模型。模型通过编码器将输入图像压缩成一个2维的特征表示,然后通过解码器将特征表示重构回原始图像。通过最小化重构误差来训练模型,并使用matplotlib和seaborn库可视化了原始图像和重构图像。最后,代码打印了一些输出信息,说明了模型的训练和测试过程。
AutoEncoder作为NN里的一类模型,采用无监督学习的方式对高维数据进行高效的特征提取和特征表示,并且在学术界和工业界都大放异彩。
本文主要介绍AutoEncoder系列模型框架的演进,旨在梳理AutoEncoder的基本原理。
首先上图,然后再对他们进行逐一介绍。
AutoEncoder的思想最早被提出来要追溯到1988年[1],当时的模型由于数据过于稀疏高维计算复杂度高很难优化,没能得到广泛的引用。
直到2006年,Hinton等人[2]采用梯度下降来逐层优化RBM从而实现对原始样本/特征的抽象表示,并在特征降维上取得显著效果。
这才使得采用神经网络来构建AutoEncoder的方法得到广泛关注。
AutoEncoder
在介绍经典的基于神经网络的AutoEncoder模型之前,先来整体看一下AutoEncoder框架的基本思想,如下图所示。
AutoEncoder框架包含两大模块:
编码过程和解码过程。
通过encoder(g)将输入样本x映射到特征空间z,即编码过程;
然后再通过decoder(f)将抽象特征z映射回原始空间得到重构样本x’,即解码过程。
优化目标则是通过最小化重构误差来同时优化encoder和decoder,从而学习得到针对样本输入x的抽象特征表示z。
这里我们可以看到,AutoEncoder在优化过程中无需使用样本的label,
本质上是把样本的输入同时作为神经网络的输入和输出,
通过最小化重构误差希望学习到样本的抽象特征表示z。
这种无监督的优化方式大大提升了模型的通用性。
对于基于神经网络的AutoEncoder模型来说,则是encoder部分通过逐层降低神经元个数来对数据进行压缩;
decoder部分基于数据的抽象表示逐层提升神经元数量,最终实现对输入样本的重构。
这里指的注意的是,由于AutoEncoder通过神经网络来学习每个样本的唯一抽象表示,这会带来一个问题:
当神经网络的参数复杂到一定程度时AutoEncoder很容易存在过拟合的风险。
Denoising
AutoEncoder
为了缓解经典AutoEncoder容易过拟合的问题,一个办法是在输入中加入随机噪声;
Vincent等人[3]提出了Denoising
AutoEncoder,在传统AutoEncoder输入层加入随机噪声来增强模型的鲁棒性。
另一个办法就是结合正则化思想,Rifai等人[4]提出了Contractive AutoEncoder,通过在AutoEncoder目标函数中加上encoder的Jacobian矩阵范式来约束使得encoder能够学到具有抗干扰的抽象特征。
下图是Denoising AutoEncoder的模型框架。
目前添加噪声的方式大多分为两种:
添加服从特定分布的随机噪声;
随机将输入x中特定比例置为0。
有没有觉得第二种方法跟现在广泛石红的Dropout很相似,但是Dropout方法是Hinton等人在2012年才提出来的,而第二种加噪声的方法在08年就已经被应用了。
这其中的关系,就留给你思考一下。
Sparse AutoEncoder
为了在学习输入样本表示的时候可以得到稀疏的高维抽象特征表示,Ng等人[5]在原来的损失函数中加入了一个控制稀疏化的正则项。
稀疏约束能迫使encoder的各层只有部分神经元被激活,从而将样本映射成低维稀疏特征向量。
具体来说,如果单个神经元被激活的概率很小,则可认为该网络具有稀疏性。
神经元是否被激活可以看做服从概率的伯努利分布。
因此可以使用KL散度来衡量神经元被激活的概率ρ^与期望概率ρ之间的loss:
通过将D_KL加入到AutoEncoder的目标函数中,即可实现对神经网络稀疏性的约束。
另外,还有一种方法就是对神经网络各层的输出加入L1约束。
CNN/LSTM
AutoEncoder
其实无论是Convolutional Autoencoder[6]、 Recursive
Autoencoder还是LSTM Autoencoder[7]等等,思路都是将传统NN网络的结构融入到AutoEncoder中。
以LSTM AutoEncoder为例,目标是针对输入的样本序列学习得到抽象特征z。
因此encoder部分是输入一个样本序列输出抽象特征z,采用如下的Many-to-one LSTM;
而decoder部分则是根据抽象特征z,重构出序列,采用如下的One-to-many LSTM。
将传统NN网络的结构引入AutoEncoder其实更多是一个大概的思想,具体实现的时候,编码器和解码器都是不固定的,可选的有CNN/RNN/双向RNN/LSTM/GRU等等,而且可以根据需要自由组合。
Variational
AutoEncoder
Vairational
AutoEncoder(VAE)是Kingma等人与2014年提出。
VAE比较大的不同点在于:
VAE不再将输入x映射到一个固定的抽象特征z上,而是假设样本x的抽象特征z服从(μ,σ^2)的正态分布,然后再通过分布生成抽象特征z。
最后基于z通过decoder得到输出。
模型框架如下图所示:
由于抽象特征z是从正态分布采样生成而来,因此VAE的encoder部分是一个生成模型,然后再结合decoder来实现重构保证信息没有丢失。
VAE是一个里程碑式的研究成果,倒不是因为他是一个效果多么好的生成模型,主要是提供了一个结合概率图的思路来增强模型的鲁棒性。
后续有很多基于VAE的扩展,包括infoVAE、betaVAE和factorVAE等。
Adversarial
AutoEncoder
既然说到生成模型引入AutoEncoder,那必定也少不了将GAN的思路引入AutoEncoder[9],也取得了不错的效果。
对抗自编码器的网络结构主要分成两大部分:
自编码部分(上半部分)、GAN判别网络(下半部分)。
整个框架也就是GAN和AutoEncoder框架二者的结合。
训练过程分成两个阶段:
首先是样本重构阶段,通过梯度下降更新自编码器encoder部分、以及decoder的参数、使得重构损失函数最小化;
然后是正则化约束阶段,交替更新判别网络参数和生成网络(encoder部分)参数以此提高encoder部分混淆判别网络的能力。
一旦训练完毕,自编码器的encoder部分便学习到了从样本数据x到抽象特征z的映射关系。
参考文献
[1]
Auto-association by multilayer perceptrons and singular value decomposition,
Bourlard etc, 1988
[2] Reducing the dimensionality
of data with neural networks, Geoffrey Hinton etc, 2006
[3] Extracting and
composing robust features with denoising autoencoders, Pascal Vincent etc, 2008
[4] Contractive
auto-encoders: Explicit invariance during feature extraction, Rifai S etc, 2011
[5] Sparse
autoencoder, Andrew Ng, etc, 2011
[6] Stacked
Convolutional Auto-Encoders for Hierarchical Feature, Jonathan Masci, Jurgen
Schmidhuber etc, 2011
[7] Unsupervised
Learning of Video Representations using LSTMs, Nitish Srivastava etc, 2015
[8] Auto-encoding
variational bayes, Diederik Kingma etc, ICLR 2014
[9] Adversarial
Autoencoders, Alireza Makhzani, Ian Goodfellow etc, 2015
阅读 确定
<From: https://mp.weixin.qq.com/s?src=11×tamp=1574148212&ver=1983&signature=cJmf6RhGLOC-esM2mlpzu0SDvJNvLdk6D-6BHTaBvP7-9AT7hpCYxUqsYHfIwon0j2s4ewrOZO9ybmeVXGrYmITrv42ifwAbBl6VY31L0E9Y7nCtTR3c65zVR88jvI&new=1>