美文网首页
第十二章 自编码器

第十二章 自编码器

作者: 晨光523152 | 来源:发表于2020-03-28 16:22 被阅读0次

    现代社会很多数据是没有标签的。
    那么面对无标签的数据,能不能从中学习到数据的分布P(x)

    如果算法把x作为监督信号来学习,这类算法称为自监督学习。

    12.1 自编码器原理

    一个有监督学习的神经网络的功能:
    o = f_{\theta}(x),x\in R^{d_{in}},o\in R^{d_{out}}
    这个过程可以看出是原始的高维输入向量x变换到低维的变量o(降维过程)

    利用神经网络的强大的非线性表达能力去学习到低维的数据表示,但是无监督的数据没有额外的标注信息,只有数据x本身。

    只使用数据x本身来指导网络的训练,也就是希望学习到x\rightarrow x的映射f_{\theta}

    把这个分为两部分:

    • 学习高维度的输入x编码成低维度的隐变量z的映射:g_{\theta_{1}}:x\rightarrow z
      被称为编码器;
    • 学习隐变量z解码成高维度x的映射:h_{\theta_{2}}:z\rightarrow x
      被称为解码器。
    自编码器模型

    这个网络模型称为自动编码器(简称自编码器)。

    希望学习到的输出\overline{x}与原始输入x尽可能的接近:\overline{x} \approx x

    一般用欧式距离来刻画,让两个的欧式距离尽可能的小,那么优化目标可以写为:


    自编码器优化目标

    感觉这里只需要改下优化目标就可以了,和其它神经网络的写法差不多

    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 高斯白噪声,椒盐噪声),

    往网络里输入有噪声的数据,希望网络还原出原始的输入x

    Denoising AE 图示

    12.3.2 Dropout Auto-Encoder

    添加 Dropout,防止过拟合

    12.3.3 Adversarial Auto-Encoder

    对抗自编码器(Adversarial Auto-Encoder)利用额外的判别器网络(Discriminator,D)来判定降维的隐藏变量z是否采样先验分布p(z)。判别器网络输出[0,1],表征隐藏向量是否采样自先验分布p(z)

    采样自先验分布p(z)z标注为真,采样自编码器的条件概率q(z|x)z标注为假。

    意义:除了可以重建样本,还可以约束条件概率分别q(z|x)逼近先验分布p(z)

    (还不能理解这一部分)

    12.4 变分自编码器

    基本的自编码器是一个判别模型,并不是生成模型。

    变分自编码器(Variational Auto-Encoders):学习到给定x,隐藏变量的条件概率分布p(z|x),在学习到这个分布后,通过对p(z|x)进行采样可以生成不同的样本。

    12.4.1 VAE 原理

    假设任何数据集都采样自某个分布p(x|z)z是隐藏的变量(代表了某种内部特征)z符合先验分布p(z),在给定具体隐藏变量z的情况下,可以学到了分布p(x|z)中采样一系列的生成样本(p(x,z)?是这样吗?具有z特征的x),这些样本都具有z所表示的特征。

    p(z)已知(可以假定符合已知分别的情况下),目的是希望能学会生成概率模型p(x|z)

    采用最大似然估计:一个好的模型,应该拥有很大的概率产生已观测的样本x\in D。比如通过一个 Dector 来学习p(x|z),那么神经网络优化的目标是:

    公式

    由于z是连续变量,上述积分没法转换为离散形式,导致很难优化。

    那么利用变分推断的思想,通过分布q_{\phi}(z|x)来逼近p(z|x),即需要优化q_{\phi}(z|x)p(z|x)之间的距离:

    公式 image.png

    其中,\mathbb{D}_{KL}表示散度,是一种衡量分布q,p之间差距的度量,定义为:

    散度 散度 推导1 推导2

    说明\mathcal{L}(\theta,\phi)log\;p(x)的下界限,优化目标被称为 Evidence Lower Bound Objective (ELBO)。

    可以通过max\; \mathcal{L}(\theta,\phi)来达到优化最大似然概率max\;p(x)的目的。

    后面这部分推导就没看懂了,先上图吧,之后慢慢理解


    推导3 推导4

    12.4.2 Reparameterization Trick

    隐变量z采样自编码器的输出q_{\phi}(z|x),编码器输出正态分布的矩阵\mu和方差\sigma^{2},解码器的输入采样自\mathcal{N}(\mu,\sigma^{2})。由于采样操作的存在,梯度传播是不连续的,无法通过梯度下降算法端到端式训练 VAE 网络。

    利用 reparameterization Trick 方法,解决问题。:通过z=\mu + \sigma \odot \varepsilon方式采样隐变量。

    reparameterization Trick 网络结构

    参考资料:https://github.com/dragen1860/Deep-Learning-with-TensorFlow-book

    相关文章

      网友评论

          本文标题:第十二章 自编码器

          本文链接:https://www.haomeiwen.com/subject/axhlyhtx.html