【通俗理解】AutoEncoder模型——无监督特征学习的数学奥秘

【通俗理解】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 ∣∣xx2来优化编码器和解码器,使得学到的特征表示 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∣∣xf(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∣∣xf(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∣∣xf(g(x))2+λiKL(ρ∣∣ρ^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,fminELBO(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年就已经被应用了。

这其中的关系,就留给你思考一下。

Denoising AutoEncoder模型框架

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&timestamp=1574148212&ver=1983&signature=cJmf6RhGLOC-esM2mlpzu0SDvJNvLdk6D-6BHTaBvP7-9AT7hpCYxUqsYHfIwon0j2s4ewrOZO9ybmeVXGrYmITrv42ifwAbBl6VY31L0E9Y7nCtTR3c65zVR88jvI&new=1>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神经美学-茂森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值