TF2 自编码器原理

TF2 自编码器原理

相关文章导航



假设机器学习是一个蛋糕,强化学习是蛋糕上的樱桃,监督学习是外面的糖衣,无监督学习则是蛋糕本体。—Yann LeCun


前言

神经网络如何学习的算法,这类算法需要学习的是在给定样本𝒙下的条件概率𝑃(𝑦|𝒙)。在社交网络蓬勃发展的今天,获取海量的样本数据𝒙,如照片、语音、文本等,是相对容易的,但困难的是获取这些数据所对应的标签信息,例如机器翻译,除了收集源语言的对话文本外,还需要待翻译的目标语言文本数据。数据的标注工作目前主要还是依赖人的先验知识(Prior Knowledge)来完成,如亚马逊的Mechanical Turk 系统专门负责数据标注业务,从全世界招纳兼职人员完成客户的数据标注任务。深度学习所需要的数据规模一般非常大,这种强依赖人工完成数据标注的方式代价较高,而且不可避免地引入标注人员的主观先验偏差。面对海量的无标注数据,有没有办法能够从中学习到数据的分布𝑃(𝒙)的算法?这就是无监督学(Unsupervised Learning)算法。特别地,如果算法把𝒙作为监督信号来学习,这类算法称为自监督学习(Self-supervised Learning),接下来要介绍的自编码器算法就是属于自监督学习范畴。

自编码器原理

让我们先看一下有监督学习中的神经网络的功能:
在这里插入图片描述
这个过程可以看成是特征降维的过程,把原始的高维输入向量𝒙变换到低维的变量𝒐。特征降维(Dimensionality Reduction)在机器学习中有广泛的应用,比如文件压缩(Compression)、数据预处理(Preprocessing)等。最常见的降维算法有主成分分析法(Principal components analysis,简称PCA),通过对协方差矩阵进行特征分解而得到数据的主要成分,但是PCA 本质上是一种线性变换,提取特征的能力极为有限

那么能不能利用神经网络的强大非线性表达能力去学习到低维的数据表示呢?问题的关键在于,训练神经网络一般需要一个显式的标签数据(或监督信号),但是无监督的数据没有额外的标注信息,只有数据𝒙本身

于是,我们尝试着利用数据𝒙本身作为监督信号来指导网络的训练,即希望神经网络能够学习到映射𝑓𝜃: 𝒙 → 𝒙。我们把网络𝑓𝜃切分为两个部分,前面的子网络尝试学习映射关系:𝑔𝜃1 : 𝒙 → 𝒛,后面的子网络尝试学习映射关系ℎ𝜃2 : 𝒛 → 𝒙,如图 12.1 所示。我们把𝑔𝜃1看成一个数据编码(Encode)的过程,把高维度的输入𝒙编码成低维度的隐变量𝒛(Latent Variable,或隐藏变量),称为Encoder 网络(编码器)ℎ𝜃2看成数据解码(Decode)的过程,把编码过后的输入𝒛解码为高维度的𝒙,称为Decoder 网络(解码器)

在这里插入图片描述

编码器和解码器共同完成了输入数据𝒙的编码和解码过程,我们把整个网络模型𝑓𝜃叫做自动编码器(Auto-Encoder),简称自编码器。如果使用深层神经网络来参数化𝑔𝜃1和ℎ𝜃2函数,则称为深度自编码器(Deep Auto-encoder)

在这里插入图片描述

自编码器能够将输入变换到隐藏向量𝒛并通过解码器重建(Reconstruct,或恢复)出𝒙 。我们希望解码器的输出能够完美地或者近似恢复出原来的输入,即𝒙 ≈ 𝒙,那么,自编码器的优化目标可以写成:

它和均方误差原理上是等价的。自编码器网络和普通的神经网络并没有本质的区别,只不过训练的监督信号由标签𝒚变成了自身𝒙。借助于深层神经网络的非线性特征提取能力,自编码器可以获得良好的数据表示,相对于PCA 等线性方法,自编码器性能更加优秀,甚至可以更加完美的恢复出输入𝒙。
在这里插入图片描述
它和均方误差原理上是等价的。自编码器网络和普通的神经网络并没有本质的区别,只不过训练的监督信号由标签𝒚变成了自身𝒙。借助于深层神经网络的非线性特征提取能力,自编码器可以获得良好的数据表示,相对于PCA 等线性方法,自编码器性能更加优秀,甚至可以更加完美的恢复出输入𝒙。

在下图中,第1 行是随机采样自测试集的真实MNIST 手写数字图片,第2、3、4 行分别是基于长度为30 的隐藏向量,使用自编码器、Logistic PCA 和标准PCA 算法恢复出的重建样本图片;在图 12.3(b)中,第1 行为真实的人像图片,第2、3 行分别是基于长度为30 的隐藏向量,使用自编码器和标准PCA 算法恢复出的重建样本。可以看到,使用深层神经网络的自编码器重建出图片相对清晰,还原度较高,而PCA 算法重建出的图片较模糊。
在这里插入图片描述

如何去训练?

  • 对于二进制输入的损失函数
    在这里插入图片描述
    可以看到就是普通的交叉熵损失函数而已

  • 对于实数输入的损失函数
    在这里插入图片描述
    这里也可以看到就是普通的均方差损失函数而已

几种自编码器变种

Dropout AutoEncoders

顾名思义,Dropout AutoEncoders采取的变化就断掉部分的连接层,这样可以减少过拟合的程度
在这里插入图片描述

Adversarial AutoEncoders(AAE)

想要完全的了解Adersarial AutoEncoders[1] 可以去阅读一下论文,这里我就大概的介绍一下具体的细节之后会在GAN的博客里面详细的写道

Adversarial AutoEncoders它是一种概率式自动编码器,利用最近提出的生成性对抗网络(GAN)将编码器隐藏向量的后验集合与任意先验分布相匹配,进行变分推理先验后确保,从先验空间的任何部分生成有意义的样本。结果,adversarial自动编码器的解码器学习了一个深度生成模型,该模型将所施加的优先级映射到数据分布。

在这个模型中自编码器的训练具有双重目标——传统的重建误差和对抗性训练准则

为了更好的了解AAE我想简单的介绍一下GAN的原理(这在AAE的论文里都有):

生成性对抗网络(GAN框架建立了两个神经网络之间的AMI最大对抗博弈-生成模型G和判别模型D。判别模型D(x),是一个神经网络,它计算的pointxin数据空间是我们试图建模的数据分布(正样本)的样本,而不是生成模型(负样本)的样本的概率。同时,生成器使用一个函数G(z),该函数将样本从priorp(z)映射到数据空间。G(z)被训练成最大程度地混淆鉴别器,使其相信其生成的样本来自数据分布。利用fd(x)w.r.t.x的梯度对生成器进行训练,并使用该梯度修改其参数。这个游戏的解决方案可以表示为:
在这里插入图片描述
生成器和鉴别器可以分两个阶段使用交替SGD找到:(a)训练鉴别器以区分由生成器生成的真实样本和假样本;(b)训练生成器以便用生成的样本愚弄鉴别器。
在这里插入图片描述

AAE

x作为输入,z作为隐藏的代码向量(隐藏单位)的自动编码器与深度编码器和解码器。p(z)是我们想要施加在代码上的先验分布,q(z | x)是一个编码分布,p(x | z)是解码分布。同时,pd(x)是数据分布,p(x)是模型分布。自动编码器q(z | x)的编码函数定义了q(z)在自动编码器的隐藏码向量上的后验分布
在这里插入图片描述
这就是AAE的基础理论

引用

[1] Alireza Makhzani, Jonathon Shlens, Navdeep Jaitly, Ian Goodfellow, Brendan Frey. Adversarial Autoencoders. arXiv preprint arXiv:1511.05644,2015 11

<think>嗯,用户想了解变分自编码器(VAE)的工作原理和数学推导。我需要先回忆一下VAE的基础知识,然后结合提供的引用资料来组织回答。 首先,VAE是生成模型,结合了自编码器和概率建模。自编码器有编码器和解码器,但传统自编码器的潜在空间可能是离散的,而VAE引入了概率分布,通常是高斯分布,这样潜在变量可以连续,方便生成新数据。 接下来是数学部分。VAE的损失函数包括重构损失和KL散度。重构损失类似于传统自编码器的重建误差,比如均方误差或交叉熵。而KL散度用于衡量潜在变量的分布与先验分布(通常是标准正态分布)的差异。这部分可能需要详细推导变分下界(ELBO),因为用户提到了数学推导。 根据引用3,传统自编码器使用平方误差作为重建损失,而VAE在此基础上添加了KL散度项。引用1提到VAE属于无监督学习,使用概率建模,所以需要解释如何通过概率模型生成数据。 然后,用户可能想知道VAE的结构,比如编码器输出的是均值和方差,然后通过重参数化技巧采样潜在变量。这部分需要解释为什么需要重参数化,比如为了允许梯度传播。 数学推导部分可能需要从概率模型出发,假设数据由潜在变量z生成,然后通过最大化边缘似然,引入变分推断来近似后验分布。推导ELBO的时候,需要分解log p(x)为重构项和KL散度项。这部分可能需要一步步展开,确保正确性。 另外,用户提供的引用2中有VAE的代码结构,可以提到编码器和解码器的构建,损失函数如何结合重构损失和KL散度。比如,编码器输出均值和对数方差,解码器从潜在变量重建输入。 可能的问题点:用户是否熟悉KL散度的计算?是否需要解释KL散度的公式,比如对于两个高斯分布的KL散度如何简化?另外,重参数化技巧的具体步骤,比如从标准正态分布采样,然后乘以方差加上均值。 还要注意使用正确的LaTeX格式,比如变量用$符号包裹,独立公式用$$。例如,潜在变量$z$的分布,ELBO的公式等。 最后,生成的相关问题需要考虑用户可能的后续疑问,比如VAE和GAN的区别,KL散度消失的问题,重参数化的必要性,以及应用场景等。 现在需要组织这些内容,确保结构清晰,分步骤解释VAE的原理、数学推导,并附上代码示例。同时,在适当的地方加入引用标记,比如引用1、2、3中的相关内容。</think>### 变分自编码器(VAE)原理及数学推导 #### 一、核心思想 变分自编码器(Variational Autoencoder, VAE)是一种结合了**自编码器结构**与**概率建模**的生成模型。其核心思想是通过学习数据的潜在分布(即隐含变量$z$的概率分布),实现数据的生成与重建[^1]。与传统自编码器不同,VAE的编码器输出的是潜在变量的**概率分布参数**(如均值和方差),而非固定值,并通过**重参数化技巧**(Reparameterization Trick)实现梯度反向传播[^2]。 --- #### 二、数学推导 ##### 1. 概率建模假设 - **数据生成过程**:假设观测数据$\mathbf{x}$由隐含变量$\mathbf{z}$生成,即$\mathbf{z} \sim p(\mathbf{z})$(先验分布,通常为标准正态分布$\mathcal{N}(0,I)$),$\mathbf{x} \sim p_\theta(\mathbf{x}|\mathbf{z})$(由解码器建模的似然分布)。 - **目标**:最大化观测数据的边缘似然$\log p_\theta(\mathbf{x})$,但直接计算困难,因此引入变分分布$q_\phi(\mathbf{z}|\mathbf{x})$(编码器建模的后验分布)近似真实后验$p_\theta(\mathbf{z}|\mathbf{x})$。 ##### 2. 变分下界(ELBO) 通过变分推断推导**证据下界(ELBO)**: $$ \log p_\theta(\mathbf{x}) \geq \mathbb{E}_{q_\phi(\mathbf{z}|\mathbf{x})} \left[ \log p_\theta(\mathbf{x}|\mathbf{z}) \right] - D_{\text{KL}}\left( q_\phi(\mathbf{z}|\mathbf{x}) \parallel p(\mathbf{z}) \right) $$ - **第一项**:重构损失,衡量解码器重建数据的能力(如均方误差或交叉熵)。 - **第二项**:KL散度,约束$q_\phi(\mathbf{z}|\mathbf{x})$与先验分布$p(\mathbf{z})$的相似性[^3]。 ##### 3. KL散度计算 假设$q_\phi(\mathbf{z}|\mathbf{x}) = \mathcal{N}(\mu, \sigma^2 I)$,$p(\mathbf{z}) = \mathcal{N}(0, I)$,则: $$ D_{\text{KL}} = \frac{1}{2} \sum_{i=1}^d \left( \sigma_i^2 + \mu_i^2 - 1 - \log \sigma_i^2 \right) $$ 其中$d$为潜在空间维度。 --- #### 三、模型结构 1. **编码器**(推断网络): - 输入数据$\mathbf{x}$,输出潜在分布的参数$\mu$和$\log \sigma^2$。 - 代码示例(简化): ```python encoder = Sequential([ Dense(256, activation='relu', input_shape=(784,)), Dense(128, activation='relu'), Dense(2 * latent_dim) # 输出均值和对数方差 ]) ``` 2. **重参数化**: - 采样$\mathbf{z} = \mu + \sigma \odot \epsilon$,其中$\epsilon \sim \mathcal{N}(0, I)$。 3. **解码器**(生成网络): - 输入潜在变量$\mathbf{z}$,输出重建数据$\mathbf{\hat{x}}$。 ```python decoder = Sequential([ Dense(128, activation='relu', input_shape=(latent_dim,)), Dense(256, activation='relu'), Dense(784, activation='sigmoid') # 输出像素概率 ]) ``` --- #### 四、损失函数 VAE总损失为**重构损失 + KL散度**: ```python def vae_loss(x, x_recon): reconstruction_loss = tf.reduce_mean( tf.keras.losses.binary_crossentropy(x, x_recon) ) * 784 # 假设输入为28x28图像 kl_loss = -0.5 * tf.reduce_mean( 1 + log_var - tf.square(mu) - tf.exp(log_var) ) return reconstruction_loss + kl_loss ``` --- #### 五、应用场景 - 生成新数据(如手写数字、图像插值) - 数据降维与特征提取 - 半监督学习中的特征表示 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值