AutoEncoder

自编码 AutoEncoder 是一种无监督学习的算法,他利用反向传播算法,让目标值等于输入值。

比如对于一个神经网络,输入一张图片,通过一个 Encoder 神经网络,输出一个比较 “浓缩的”feature map。之后将这个 feature map 通过一个 Decoder 网络,结果又将这张图片恢复。

如果说我们的数据集特别大,对于直接训练而言性能肯定较低。但如果我们对数据特征进行提取,缩减输入信息量,学习起来就相对轻松。


简单模型

下面是一个AutoEncoder的三层模型,其中 $W^* = W^T$

2010年,Vincent 在论文中表明,只用单组W就可以,所以W*没有必要去训练。

http://jmlr.org/papers/volume11/vincent10a/vincent10a.pdf

如果实数作为输入,损失函数为 $L(f(x)) = {1\over2}\sum_{k}(\hat x_k - x_k)^2$


PCA 和 AutoEncoder

PCA又叫主成分分析法,是将n维特征映射到k维上,本质上是个线性变化。而AutoEncoder是基于DNN的,因为有激活函数,所以可以进行非线性变换。下图是MNIST数据集经过 PCA 和AutoEncoder 降维再还原后的效果。

可以看到AutoEncoder效果是明显优于PCA。

Dropout AutoEncoder

Dropout AutoEncoder是不断让神经元死亡以达到缩减特征的效果。

下图是一个简单的神经元图。


Adversarial AutoEncoders

Adversarial AutoEncoders是利用GAN网络的思想,利用一个生成器 G 和一个判别器 D 进行对抗学习,以区分 Real data 和 Fake data。

具体思路是这样的,我现在需要一个满足 p(z) 概率分布的 z 向量,但是 z 实际上满足 q(z) 分布。那么我就首先生成一个满足 p(z) 分布的 z′ 向量,打上 Real data 的标签,然后将 z 向量打上 Fake data 的标签,将它们俩送入判别器 D。判别器 D 通过不断学习,预测输入 input 是来自于 Real data(服从预定义的 p(z) 分布)还是 Fake data(服从 q(z) 分布)。由于这里的 p(z) 可以是我们定义的任何一个概率分布,因此整个对抗学习的过程实际上可以认为是通过调整 Encoder 不断让其产生数据的概率分布 q(z) 接近我们预定义的 p(z)。


AutoEncoder代码实现

https://github.com/JiaZhengJingXianSheng/AutoEncoder


结果分析

下面这张图是原本mnist数据集的图。

结果1

在epochs = 1 情况下,在经过编码器编码,解码器恢复的结果为下图。

结果2

因为DNN是有损失的,所以在恢复的过程中肯定是有部分信息丢失。但可以通过训练次数的提升,来减少信息丢失,下图为epochs = 50 情况下恢复出来的结果,可以看到效果明显优于上图。

结果3