结论速递
本次task了解了自编码器的原理。自编码器可以视为是一种自监督学习,由三个主要部分组成,encoder,中间的embedding向量,和decoder。自编码器的的核心思想是化繁为简。常将中间的embedding向量作为后续任务的输入。
自编码器的常见变体包括,de-noising auto-encoder,前面加噪声,要求decoder还原出加噪声前的状态,可以类比BERTmask掉词的用途。Feature disentanglement,特征解构,使得特征具有具体意义。Discrete Latent Representation,离散表征,使中间的特征为离散特征。
目录
1 自编码器的基础
1.1 引入:自监督学习回顾
自编码器可以属于自监督学习的一种,因为不需要喂入打了标签的数据。其实属于是最古老的自监督学习任务(早于GPT等)。事实上,自监督学习这个词起源于2019年,远晚于自编码器诞生的06/07年,这样介绍是为了便于理解。
自监督学习框架由以下两部分组成:
-
给模型喂入一些没有标签的数据(自监督/预训练)
-
微调后可以用在下游任务中
1.2 自编码器的构成
以图片处理为例,自编码器的结构如下
输入图片,经过一个encoder(多层神经网络),转化为一个向量,随后再经过一个decoder(多层神经网络),变成一张图片。
其中decoder类似于GAN中的生成器。
训练的目标是输出和输入越接近越好。和CycleGAN有点类似,就是一个reconstruction(重建)的过程。
中间的vector也被叫做embedding,representation或者code。中间段也叫做bottleneck。
自编码器常见的用法是,把vector重建出来的feature丢到下游的新任务中去。(将高维的图片进行压缩到低维度向量,也就是降维)
李宏毅在此处给出了一些降维的回顾
1.3 自编码器的动机
自编码器做的事情,是把图片压缩又还原。而还原的前提,是:图片的变化是有限的,使得中间的压缩变量可以描述出这个变化。
所以自编码器的核心思想,就是化繁为简。
自编码器的06年就有人提出,当时人们对深度学习的理解,还是分层的train,但已经有了这个idea。
当时的pre-train指的是,分开训练每一个部分的network, 而微调,是指微调前面pre-train的结果。
1.4 自编码器的常见变形
de-noising auto-encoder。
将输入图片加入噪声后,再放入自编码器。此时的训练目标是,让输出与放入噪声前的输入越接近越好。
在这种模型中,自编码器还需要有去除噪声的能力。因为encoder看到的是加入了噪声的图片,而decoder要还原的是去除了噪声的图片。
其实BERT的思路和这个很类似de-noising auto-encoder。mask相当于加noise;BERT部分类似于编码器;输出结果类似于embedding;最后微调的部分类似于解码器。整个过程是mask部分的被mask前的重建。
2 自编码器的其他拓展变形
2.1 Feature disentanglement 特征解构
所谓Feature disentanglement ,就是把原来纠缠在一起的东西,解绑。
可以先看一下自编码器的常见应用,比如重建图像,重建声音,重建文档。
但是这些应用当中,中间的embedding部分,都是所有内容纠缠在一起的。以音频为例,语义变量和演讲者信息变量,可能是混杂在一起的。
而Feature disentanglement想要做到的事情是,有没有可能在train的时候,就把上述提到的这两种变量分开呢。
上述截图中,列举了几篇实现Feature disentanglement论文。
Feature disentanglement在实际当中能做什么呢?举个例子:柯南的变声器。
如果实现了Feature disentanglement,则有了A的声音B的声音,A和B甚至不需要说同样的句子,甚至不需要说同样的语言,就可以实现AB的互相变声。
比如把李宏毅的声音变成新垣结衣的声音。
先分别train有Feature disentanglement的自编码器。
然后再,把说英语的李宏毅部分的语言内容向量,和说日语的新垣结衣部分的声音向量,再丢到decoder里,就有机会实现一个说英文的新垣结衣。当然反过来也是可以的,即一个说日语的李宏毅。
2.2 Discrete Latent Representation 离散表征
我们目前学到的表征都是一个离散向量,有没有可能是一个binary的向量(就更好解释),或者是一个one-hot的向量呢。
这种思路下,最知名的是VQVAE。
VQVAE的思想是,encoder生成一个向量后,去和codebook(一系列的离散vector)对比,找到一个相似度最接近的向量作为生成向量,再输入给decoder。
codebook机制和self attention有点像,vector相当于query,coderbook里的vector相当于key。
这样做的好处是,输入decoder的vector一定是codebook里的向量。
对于语音来说,codebook可以是由最基本的发音单位组成的。
进一步的想法,如果中间向量不是一个普通向量,而是一段词向量,那是不是可以视为是文章的summary。当然此时的encoder和decoder需要是Seq2seq的。那么就可以让机器自动学会做无监督的总结。