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

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

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


  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

                                                  例子

相关文章
|
29天前
|
机器学习/深度学习 人工智能 自然语言处理
|
5月前
|
机器学习/深度学习 运维 自然语言处理
揭示堆叠自动编码器的强大功能 - 最新深度学习技术
揭示堆叠自动编码器的强大功能 - 最新深度学习技术
40 0
|
11月前
|
机器学习/深度学习 编解码 人工智能
深度学习进阶篇[8]:对抗神经网络GAN基本概念简介、纳什均衡、生成器判别器、解码编码器详解以及GAN应用场景
深度学习进阶篇[8]:对抗神经网络GAN基本概念简介、纳什均衡、生成器判别器、解码编码器详解以及GAN应用场景
深度学习进阶篇[8]:对抗神经网络GAN基本概念简介、纳什均衡、生成器判别器、解码编码器详解以及GAN应用场景
|
12月前
|
机器学习/深度学习 数据可视化 Java
深度学习--Pytorch构建栈式自编码器实现以图搜图任务(以cifar10数据集为例)
本文旨在使用CIFAR-10数据集,构建与训练栈式自编码器,提取数据集中图像的特征;基于所提取的特征完成CIFAR-10中任意图像的检索任务并展示效果。
160 0
|
12月前
|
机器学习/深度学习 运维 算法
深度学习实战(九):使用自动编码器生成图像
除了一小部分的算法可以。这就是所谓的无监督学习(Unsupervised Learning)。无监督学习通过自己的方式从未标记的数据中推断出一个函数。最著名的无监督算法是K-Means,它被广泛用于将数据聚类,而PCA则是降维的首选方案。K-Means和PCA可能是有史以来最好的两种机器学习算法。而让它们更出色的是它们的简单性。如果你掌握了它们,你就会觉得:“为什么我没有早点想到呢?
151 0
深度学习实战(九):使用自动编码器生成图像
|
机器学习/深度学习 数据可视化 数据库
无监督学习-自编码器|深度学习(李宏毅)(十九)
无监督学习-自编码器|深度学习(李宏毅)(十九)
842 0
无监督学习-自编码器|深度学习(李宏毅)(十九)
|
1天前
|
机器学习/深度学习 安全 量子技术
深度学习在图像识别中的应用与挑战
【5月更文挑战第10天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域进步的核心力量。本文聚焦于深度学习在图像识别任务中的应用,并探讨了当前面临的主要挑战。我们将回顾深度学习模型的发展历程,特别是卷积神经网络(CNN)在处理图像数据方面的革命性贡献,并分析诸如数据偏差、模型泛化能力、计算资源需求等关键问题。此外,文中还将展望深度学习技术未来的发展方向及其在图像识别领域的应用前景。
|
1天前
|
机器学习/深度学习 传感器 自动驾驶
探索基于深度学习的图像识别技术在自动驾驶领域的应用
【5月更文挑战第10天】 随着人工智能技术的飞速发展,特别是深度学习在图像处理和识别方面的突破性进展,自动驾驶汽车逐渐成为现实。本文将深入探讨深度学习技术在图像识别领域的应用,以及如何通过这些技术提高自动驾驶系统的性能和安全性。我们将分析卷积神经网络(CNN)在车辆检测、行人识别和交通标志识别中的作用,并讨论数据增强、迁移学习和对抗网络等策略如何帮助提升模型的泛化能力和鲁棒性。此外,文中还将涉及深度学习模型在实时处理和嵌入式系统部署时面临的挑战及其解决方案。
|
1天前
|
机器学习/深度学习 传感器 自动驾驶
基于深度学习的图像识别技术在自动驾驶系统中的应用
【5月更文挑战第10天】 随着人工智能技术的飞速发展,基于深度学习的图像识别技术已成为自动驾驶系统不可或缺的核心组成部分。该技术通过模拟人类视觉系统处理与理解环境信息的过程,赋予自动驾驶车辆高度准确和实时的环境感知能力。本文首先概述了深度学习在图像识别领域的关键技术与方法,包括卷积神经网络(CNN)及其变体、循环神经网络(RNN)等,并探讨了这些技术在自动驾驶系统中的具体应用,如车辆检测、行人识别、交通标志识别以及道路场景理解。随后,文章分析了当前技术面临的主要挑战,包括数据集的多样性与质量、模型泛化能力、实时处理要求及系统的鲁棒性问题。最后,展望了未来图像识别技术在自动驾驶领域的发展趋势,特
|
1天前
|
机器学习/深度学习 计算机视觉
深度学习在图像识别中的应用与挑战
【5月更文挑战第10天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉尤其是图像识别领域进步的关键力量。本文深入探讨了深度学习技术在图像识别任务中的核心应用,包括但不限于卷积神经网络(CNN)的架构优化、数据增强策略以及迁移学习的实践。同时,文章还分析了当前面临的主要挑战,如模型泛化能力不足、对抗性样本的防御、以及计算资源的巨大需求等。通过对最新研究成果的综合评述,本文旨在为读者提供一个关于深度学习在图像识别领域中所扮演角色及未来发展方向的全面视角。
9 4