现代社会很多数据是没有标签的。
那么面对无标签的数据,能不能从中学习到数据的分布。
如果算法把作为监督信号来学习,这类算法称为自监督学习。
12.1 自编码器原理
一个有监督学习的神经网络的功能:
这个过程可以看出是原始的高维输入向量变换到低维的变量(降维过程)
利用神经网络的强大的非线性表达能力去学习到低维的数据表示,但是无监督的数据没有额外的标注信息,只有数据本身。
只使用数据本身来指导网络的训练,也就是希望学习到的映射。
把这个分为两部分:
- 学习高维度的输入编码成低维度的隐变量的映射:
被称为编码器; - 学习隐变量解码成高维度的映射:
被称为解码器。
这个网络模型称为自动编码器(简称自编码器)。
希望学习到的输出与原始输入尽可能的接近:
一般用欧式距离来刻画,让两个的欧式距离尽可能的小,那么优化目标可以写为:
自编码器优化目标
感觉这里只需要改下优化目标就可以了,和其它神经网络的写法差不多
12.2 MNIST 图片实战
12.2.1 Fashion MNIST 数据集
Fashion MNIST 数据集包含了10类不同类型的衣服,鞋子,包等灰度图片,图片大小为 28 x 28,共 70000 张图片。
使用 tf.keras.datasets.fashion_mnist.load_data() 加载数据
12.2.2 编码器
编码器由三层全连接层网络组成,输出节点数分别为256,128,20。
12.2.3 解码器
解码器也是由三层全连接层网络组成,输出节点分别为123,256,784
12.2.4 -- 12.2.5 网络
按照书中的代码训练网络,直接出错了,我还不知道是为啥。
然后我直接改为keras的风格,用model.fit()进行训练。
(还没有训练完成,用的Google colab 来训练,一直连接中断,待训练完成后,看看结果)
代码是:
import tensorflow as tf
import numpy as np
(x_train,y_train),(x_test,y_test) = tf.keras.datasets.fashion_mnist.load_data()
x_train,x_test = x_train.astype(np.float32) / 255. ,x_test.astype(np.float32) /255.
x_train1, x_test1 = x_train.reshape(-1,784), x_test.reshape(-1,784)
class AE(tf.keras.Model):
def __init__(self):
super(AE,self).__init__()
self.dense1 = tf.keras.layers.Dense(256, activation = "relu")
self.dense2 = tf.keras.layers.Dense(128, activation = "relu")
self.dense3 = tf.keras.layers.Dense(20)
self.dense4 = tf.keras.layers.Dense(128, activation = "relu")
self.dense5 = tf.keras.layers.Dense(256, activation = "relu")
self.dense6 = tf.keras.layers.Dense(784)
def call(self, inputs):
x = inputs
x = self.dense1(x)
x = self.dense2(x)
x = self.dense3(x)
x = self.dense4(x)
x = self.dense5(x)
x = self.dense6(x)
return x
def model(self):
x = tf.keras.layers.Input(shape=(784))
return tf.keras.Model(inputs=[x],outputs=self.call(x))
model = AE().model()
model.summary()
def euclidean_distance_loss(y_true, y_pred):
"""
Euclidean distance loss
https://en.wikipedia.org/wiki/Euclidean_distance
:param y_true: TensorFlow/Theano tensor
:param y_pred: TensorFlow/Theano tensor of the same shape as y_true
:return: float
"""
return tf.sqrt(tf.reduce_sum(tf.square(y_pred - y_true), axis=-1))
model.compile(optimizer = tf.keras.optimizers.Adam(),loss=euclidean_distance_loss)
model.fit(x_train1,x_train1,batch_size =4,epochs=20)
pred = model.predict(x_test1)
就训练了20个epoch,
结果一般般吧
原图1 重建图1 原图2 重建图2
12.3 自编码器变种
由于损失函数是直接度量重建样本与真实样本的底层特征之间的距离,而不是评价重建样本的逼真度,因此在某些任务上效果一般(如图片重建),容易出现重建图片边缘模糊,逼真度不够的情况。
12.3.1 Denoising Auto-Encoder
为了防止神经网络记忆输入图片的底层特征,Denoising Auto-Encoder 给输入数据添加随机的噪声(e.g 高斯白噪声,椒盐噪声),
往网络里输入有噪声的数据,希望网络还原出原始的输入。
Denoising AE 图示12.3.2 Dropout Auto-Encoder
添加 Dropout,防止过拟合
12.3.3 Adversarial Auto-Encoder
对抗自编码器(Adversarial Auto-Encoder)利用额外的判别器网络(Discriminator,D)来判定降维的隐藏变量是否采样先验分布。判别器网络输出,表征隐藏向量是否采样自先验分布:
采样自先验分布的标注为真,采样自编码器的条件概率的标注为假。
意义:除了可以重建样本,还可以约束条件概率分别逼近先验分布。
(还不能理解这一部分)
12.4 变分自编码器
基本的自编码器是一个判别模型,并不是生成模型。
变分自编码器(Variational Auto-Encoders):学习到给定,隐藏变量的条件概率分布,在学习到这个分布后,通过对进行采样可以生成不同的样本。
12.4.1 VAE 原理
假设任何数据集都采样自某个分布,是隐藏的变量(代表了某种内部特征),符合先验分布,在给定具体隐藏变量的情况下,可以学到了分布中采样一系列的生成样本(?是这样吗?具有特征的),这些样本都具有所表示的特征。
在已知(可以假定符合已知分别的情况下),目的是希望能学会生成概率模型。
采用最大似然估计:一个好的模型,应该拥有很大的概率产生已观测的样本。比如通过一个 Dector 来学习,那么神经网络优化的目标是:
由于是连续变量,上述积分没法转换为离散形式,导致很难优化。
那么利用变分推断的思想,通过分布来逼近,即需要优化与之间的距离:
其中,表示散度,是一种衡量分布之间差距的度量,定义为:
说明是的下界限,优化目标被称为 Evidence Lower Bound Objective (ELBO)。
可以通过来达到优化最大似然概率的目的。
后面这部分推导就没看懂了,先上图吧,之后慢慢理解
推导3 推导4
12.4.2 Reparameterization Trick
隐变量采样自编码器的输出,编码器输出正态分布的矩阵和方差,解码器的输入采样自。由于采样操作的存在,梯度传播是不连续的,无法通过梯度下降算法端到端式训练 VAE 网络。
利用 reparameterization Trick 方法,解决问题。:通过方式采样隐变量。
reparameterization Trick 网络结构参考资料:https://github.com/dragen1860/Deep-Learning-with-TensorFlow-book
网友评论