无监督学习-自编码器-补充|深度学习(李宏毅)(二十)

简介: 无监督学习-自编码器-补充|深度学习(李宏毅)(二十)

一、最小重构代价之外的方法


  1. Using Discriminator


一个自编码器学习到的隐层向量对于原来的输入来说应该是具有代表性的,就好比三玖的耳机对于三玖来说就是具有代表性的,看到三玖的耳机不会想到一花一样:

51)`)R_T{LOR2V]ET[H)8M1.png

                                                       example


评估隐层向量的代表性好不好就可以当做评估自编码器效果的指标。具体的方法就是训练一个Discriminator来评估隐层向量是不是具有代表性,在下面的例子中三玖的图片通过一个自编码器可以得到一个蓝色的向量,凉宫春日的图片通过一个自编码器可以得到一个黄色的向量:

6J~[MA19FJ{7]F}WZF9B7)J.png

                 example

然后我们可以训练一个Discriminator,其参数为53[P@$D9C0`QE@7KLYKGAJR.png,这个Discriminator可以是一个二分类器,输入一张图片和对应的自编码器的隐层向量,然后判断它们是否匹配:


IAYQ@K}J`%)K[{_I@56UZ}7.png

                                  Discriminator


Discriminator的训练资料中包含positive和negative的样本,一张图片和对应的隐层向量属于positive的训练样本,而将图片与其他图片的隐层向量任意组合得到的样本为negative的样本:


M([KV009G(R[_5V``9ZCGC2.png

                    训练资料


4K_X$6LH5D)M`P66`2~GHBN.png

在实际操作中可以将Encoder和Discriminator一起进行训练,这样的做法类似于在general autoencoder中将Encoder和Decoder一起进行训练一样,事实上经典的自编码器可以看做训练Discriminator的方法的一个特例。


可以将自编码器的Decoder看做是Discriminator,这个Discriminator同样地输入一张图片和对应的Encoder的隐层向量,然后计算Decoder的输出与输入图片的重构代价来评估隐层向量是否具备代表性,这就类似上述Discriminator的做法,只是这里的Discriminator只会输入positive的训练资料,而没有negative的训练资料:


9M)WS)QG1IA@1W2`X2JF}{N.png

                                  autoencoder


  1. Sequential Data


对于序列化的数据(比如句子),我们也希望能够通过自编码器得到它的表示,实际的做法包括下列方法。


  • Skip Thought


这种方法尝试将句子通过Encoder编码成向量,然后利用这个向量和Decoder来预测前一个和后一个句子。这种方法的思想类似于训练word embedding,类似词汇,两个句子的上下文如果一致,那么这两个句子的含义很可能也一样,同样地其embedding也应该相似:


9]%W%GQ)`VB7_BW$94LRNZV.png

                                   Skip Thought


参考论文:https://arxiv.org/abs/1506.06726


  • Quick Thought


这种方法的思想是让一个句子和它的下一句的embedding要越接近越好,而和从语料库中采样出来的其他句子要越不相似越好。这种方法与Skip Thought相比不需要训练Decoder而只需要训练一个Encoder就好。


具体的做法是和Encoder同时训练一个分类器,输入当前句子、当前句子的下一句和随机采样的句子的embedding,然后分类预测下一句,而实际中的分类器也就是计算向量内积,这也就保证了一个句子与它的下一句的embedding相似,与随机采样的句子不相似:


E%O8$2%3908QZZO$[TKIIC7.png

                                              Quick Thought


这种方法应该保证一定要有随机采样的句子参与,而不能只让当前句子和下一句的embedding越接近越好,这是因为这样会使所有句子学习到一个一样的embedding。


参考论文:https://arxiv.org/abs/1803.02893


  • Contrastive Predictive Coding


Contrastive Predictive Coding(CPC)是另一种方法,以语音讯号为例,这种方法是要训练一个序列的embedding,要求这个embedding能够预测后面的讯号通过Encoder后的embedding:


QYQ_A]2{EMIZQL0@XCS51E3.png

                                   Contrastive Predictive Coding


参考论文:https://arxiv.org/abs/1807.03748


二、学习更具解释性表示的自编码器


  1. Feature Disentangle


无论是语音、文字还是图像资料,都是由多个部分的讯息组成的,举例来说,语音可能是由语者、内容等讯息组成的,文本可能是由文法、语义等讯息组成的,图像可能是由风格等讯息组成:


[8K}V29X)I2V)0NDD5}SVS4.png

                                            资料的组成


我们希望能做到的是使自编码器学习到的表示的不同维度能够表示不同类型的讯息,这项任务就叫做Feature Disentangle。


以语音的处理举例来说,我们期望将语音信号通过自编码器学习到具有一定可解释性的表示,具体来说我们希望表示的一部分维度能够代表语者或者内容的讯息,当然语音信号可能还包含其他类型的讯息,不过这里以语者和内容这两项为例。


如下图所示,我们考虑的方法分为两种,一种是使用一个自编码器,然后使得隐层向量的一部分维度代表语者,一部分维度代表内容;另一种方法是训练两个Encoder,使得一个Encoder的输出对应语者的讯息,另一个Encoder的输出对应内容的讯息


8GN%SJG)@ITU%WEINFLK}NT.png

                                          语音处理


这样的方法可以做到变声(Voice Conversion),举例来说,下图中女生说“how are you”,男生说“hello”,然后通过Encoder获得他们语音的表示:


IU5$FJ7G7ANIU3$2J1W`MJQ.png

                                                语音处理


通过组合他们的语者与内容讯息的向量就可以实现用男生的声音说“how are you”这件事:


TSG9BSWXZP66`JN~9YUB)5E.png

                                             语音处理


如下图所示,对于上述第一种训练一个Encoder的方法,可以采用生成对抗网络的思路进行处理,我们尝试使用训练一个语者分类器,这个分类器就相当于生成对抗网络中的Discriminator,将自编码器的表示中代表内容信息的部分输入到Discriminator中尝试来骗过Discriminator,这样自编码器就会学会将有关语者的讯息放到另外的维度中去,那么图中表示的绿色的部分就只剩下有关内容的讯息。这个方法采用生成对抗网络的思路来进行训练,也就意味着自编码器和Discriminator是交替迭代训练的:


Y9[D6AAM]`AG[A%7WJ@1{1T.png

                                               第一种方法


第二种方法就是训练两个Encoder的方法,对于表示中有关内容的部分,可以采用在第一个Encoder后面添加一个instance normalization的方法,这种特殊的normalization可以移除全局的信息(也就是语者信息),然后就可以使得第一个Encoder仅学习内容的信息:


KH2@)F6CLG[FUWDK2W@{FSI.png

                                              第二种方法


而对于第二个Encoder,如下图所示,它的输出并不是像上图中那样和第一个Encoder的输出拼接在一起后再输入到Decoder中,而是通过将其输出到Decoder后面的adaptive instance normalization中,这种normalization只会影响全局信息:


76}J[PZ9O@@~E5@@JT06KNM.png

                                      第二种方法


有关这一类的方法只介绍大体的方法,不做细节上的介绍。


  1. Discrete and Structured Representation


  • Discrete Representation


自编码器学习到的隐层表示是连续的,我们期望自编码器能学习到一个离散的表示。这样的好处是有利于聚类等任务,对于连续的表示通常还需要使用一些聚类的方法,而如果自编码器学习到的表示是离散的(比如one-hot的表示),这样我们就可以直接得到类别。


在下图中展示了两种离散型的表示,分别是根据表示最大值的维度得到的one-hot表示和根据每个维度是否大于0.5得到的binary表示:


0E]QY8LOJF%BG2%ZHSB2_S2.png

                                                     离散表示


通过将连续的隐层表示转换成one-hot表示或者binary表示,使得整个网络是不可微分的,对于这种不可微分的网络也有一些优化的技巧,具体可以参照这篇论文:


https://arxiv.org/abs/1611.01144


另外有一个学习离散型表示的方法,叫做Vector Quantised-Variational AutoEncoder (VQ-VAE),这种方法包含一个Codebook,Codebook中有多个向量,这里面的向量是网络的参数,是需要学习出来的。对于Encoder输出的隐层表示,要和Codebook中的向量计算相似度,然后将相似度最高的向量输入到Decoder中,这里通过最高相似度得到第几个向量就代表了自编码器的离散表示:


I[1@F2D`%E3GCZ%FJH{0278.png

                                               VQ-VAE


同样的这样的网络结构也是不可微分的,具体的优化方法可以参照论文:


https://arxiv.org/abs/1711.00937


  • Structured Representation


我们还可以让自编码器输出结构化的表示,比如下面的seq2seq2seq auto-encoder。我们可以尝试让自编码输出一个序列作为隐层表示,它的输出和输出可以是一篇文章,中间的隐层序列就相当于文章的摘要:


W(M0[NSOHW02CQEBVIKJU[K.png

                                   seq2seq2seq auto-encoder


事实上,直接这样训练得到的摘要可能是人类无法理解的,举例来说,很可能文档中的“台湾大学”会被摘要成“湾学”这样的词汇,因此我们需要对Encoder的输出做一些限制,做法是使用生成对抗网络的思路,添加一个Discriminator来判断Encoder的输出是不是人类可以理解的句子,然后按照迭代的方法进行训练:


Q8{$`H79U0Q9I95$DJ6T_1V.png

                             seq2seq2seq auto-encoder


这个方法也是不可微分的,实际上是按照强化学习的方式来训练的,具体方法参照论文:https://arxiv.org/abs/1810.02851


下面是一些用这种方法的一些例子。几个比较好的例子如下,机器会学习到直接复制原文或者进行一些词汇的缩写:


XIHAM@6(F4]TMSCR{$BY]%1.png

                                                   例子

UTC_([JPRO0M4(C[I{5(80M.png

                                                    例子


以下是一些不好的例子:


J9`7{ATBKNST[U}XC$59K35.png

                                                  例子


`UE3JN3(HXUP[A~X]DNRC4K.png

                                                  例子

相关文章
|
7月前
|
机器学习/深度学习 运维 Python
python深度学习实现自编码器Autoencoder神经网络异常检测心电图ECG时间序列
python深度学习实现自编码器Autoencoder神经网络异常检测心电图ECG时间序列
|
3月前
|
机器学习/深度学习 算法
深度学习中的自编码器:探索无监督学习的秘密
在深度学习的浩瀚海洋中,自编码器犹如一座神秘的灯塔,指引着无监督学习的方向。本文将带你航行于自编码器的构造与原理之间,探索它们如何通过编码输入数据、重构输出来捕捉数据的内在特征。我们将一起见证自编码器在降维、去噪、生成模型等方面的应用奇迹,并思考其在深度学习未来中的角色与挑战。准备好了吗?让我们启航,揭开自编码器的神秘面纱。
64 0
|
7月前
|
机器学习/深度学习 数据可视化 PyTorch
使用Python实现深度学习模型:变分自编码器(VAE)
使用Python实现深度学习模型:变分自编码器(VAE)
466 2
|
7月前
|
机器学习/深度学习 运维
深度学习实现自编码器Autoencoder神经网络异常检测心电图ECG时间序列
深度学习实现自编码器Autoencoder神经网络异常检测心电图ECG时间序列
|
7月前
|
机器学习/深度学习 数据可视化 PyTorch
使用Python实现深度学习模型:自动编码器(Autoencoder)
使用Python实现深度学习模型:自动编码器(Autoencoder)
255 0
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
|
机器学习/深度学习 运维 自然语言处理
揭示堆叠自动编码器的强大功能 - 最新深度学习技术
揭示堆叠自动编码器的强大功能 - 最新深度学习技术
104 0
|
机器学习/深度学习 编解码 人工智能
深度学习进阶篇[8]:对抗神经网络GAN基本概念简介、纳什均衡、生成器判别器、解码编码器详解以及GAN应用场景
深度学习进阶篇[8]:对抗神经网络GAN基本概念简介、纳什均衡、生成器判别器、解码编码器详解以及GAN应用场景
深度学习进阶篇[8]:对抗神经网络GAN基本概念简介、纳什均衡、生成器判别器、解码编码器详解以及GAN应用场景
|
机器学习/深度学习 数据可视化 Java
深度学习--Pytorch构建栈式自编码器实现以图搜图任务(以cifar10数据集为例)
本文旨在使用CIFAR-10数据集,构建与训练栈式自编码器,提取数据集中图像的特征;基于所提取的特征完成CIFAR-10中任意图像的检索任务并展示效果。
225 0
|
4天前
|
机器学习/深度学习 传感器 数据采集
深度学习在故障检测中的应用:从理论到实践
深度学习在故障检测中的应用:从理论到实践
28 5