自编码 Autoencoder (非监督学习)
学习资料:
- 相关代码
- 为 TF 2017 打造的新版可视化教学代码
- 机器学习-简介系列 Autoencoder
要点¶
Autoencoder 简单来说就是将有很多Feature的数据进行压缩,之后再进行解压的过程。 本质上来说,它也是一个对数据的非监督学习,如果大家知道 PCA (Principal component analysis), 与 Autoencoder 相类似,它的主要功能即对数据进行非监督学习,并将压缩之后得到的“特征值”,这一中间结果正类似于PCA的结果。 之后再将压缩过的“特征值”进行解压,得到的最终结果与原始数据进行比较,对此进行非监督学习。如果大家还不是非常了解,请观看机器学习简介系列里的 Autoencoder 那一集; 如果对它已经有了一定的了解,那么便可以进行代码阶段的学习了。大概过程如下图所示:
今天的代码,我们会运用两个类型:
- 第一,是通过Feature的压缩并解压,并将结果与原始数据进行对比,观察处理过后的数据是不是如预期跟原始数据很相像。(这里会用到MNIST数据)
- 第二,我们只看
encoder
压缩的过程,使用它将一个数据集压缩到只有两个Feature时,将数据放入一个二维坐标系内,特征压缩的效果如下:
同样颜色的点,代表分到同一类的数据。(Lebel相同)
Autoencoder¶
我们的MNIST数据,每张图片大小是 28x28 pix,即 784 Features:
- 在压缩环节:我们要把这个Features不断压缩,经过第一个隐藏层压缩至256个 Features,再经过第二个隐藏层压缩至128个。
- 在解压环节:我们将128个Features还原至256个,再经过一步还原至784个。
- 在对比环节:比较原始数据与还原后的拥有 784 Features 的数据进行 cost 的对比,根据 cost 来提升我的 Autoencoder 的准确率,下图是两个隐藏层的 weights 和 biases 的定义:
下面来定义 Encoder 和 Decoder ,使用的 Activation function 是 sigmoid
, 压缩之后的值应该在 [0,1] 这个范围内。在 decoder
过程中,通常使用对应于 encoder
的 Activation function:
来实现 Encoder 和 Decoder 输出的结果:
再通过我们非监督学习进行对照,即对 “原始的有 784 Features 的数据集” 和 “通过 'Prediction' 得出的有 784 Features 的数据集” 进行最小二乘法的计算,并且使 cost 最小化:
最后,通过 Matplotlib
的 pyplot
模块将结果显示出来, 注意在输出时MNIST数据集经过压缩之后 x 的最大值是1,而非255:
通过5个 Epoch 的训练,(通常情况下,想要得到好的的效果,我们应进行10 ~ 20个 Epoch 的训练)我们的结果如下:
上面一行是真实数据,下面一行是经过 encoder
和 decoder
之后的数据,如果继续进行训练,效果会更好。
Encoder¶
在类型二中,我们只显示 encoder
之后的数据, 并画在一个二维直角坐标系内。做法很简单,我们将原有 784 Features 的数据压缩成仅剩 2 Features 的数据:
通过四层 Hidden Layers 实现将 784 Features 压缩至 2 Features:
Weights 和 biases 也要做相应的变化:
与类型一类似,创建四层神经网络。(注意:在第四层时,输出量不再是 [0,1] 范围内的数,而是将数据通过默认的 Linear activation function 调整为 (-∞,∞) :
在输出图像时,我们只关心 encoder
压缩之后,即 decoder
解压之前的结果: