Auto-Encoder
# 1. Self-supervised Learning Framework
先简短看一下 Self-Supervised Learning 的 Framework:
这个过程中不用标注资料的学习叫做 Self-Supervised Learning,也有人叫 Pre-Training。学会之后就可以用把 model 用于其他下游的任务里。
在有 BERT、GPT 之前,还有一个更古老的不需要用标注资料的任务,就叫做 Auto-Encoder,所以你也可以把 Auto-Encoder 看作是 Self-Supervised Learning 的一种 Pre-Train 的方法。
# 2. Auto-Encoder
# 2.1 简介
我们用影像来做例子讲解 Auto-Encoder 是怎么运作的:
在 Auto-Encoder 中有两个 network,一个叫做 Encoder,一个叫做 Decoder:
- Encoder 把一张图片读进来,输出一个 vector,接下来这个 vector 会变成 Decoder 的输入;
- Decoder 会产生一张图片,所以它的架构可能会像 GAN 的 Generator。
训练的目标是希望Encoder 的输入跟 Decoder 的输出越接近越好。这个事情也有人叫它 Reconstruction。
这个 idea 与 Cycle GAN 相同,Cycle GAN 是需要两个 Generator,第一个 G 把 X domain 的 image 转到 Y domain,另一个 G 再把 Y domain 的 image 转回来,并希望最原先的图片跟转完两次后的图片越接近越好。
这个训练过程不需要任何的标注资料,所以它是一个 Unsupervised Learning 的方法。对于 Encoder 输出的 vector,有多种叫法:Embedding、Representation、Code。
怎么把 Train 的 Auto-Encoder 用在 Downstream 的任务里面呢?它常用于降维,通常 Encoder 的 input 是一个 high dim,而 output 是 low dim。中间这个 Encoder 的输出又叫做 Bottleneck(瓶颈),形容 Auto-Encoder 输入输出都很宽,中间特别窄。Encoder 做的就是把 high dim 转成 low dim,这个过程也叫 Dimension Reduction。
在很多不是 deep learning base 的 machine learning 中,也有很多 Dimension Reduction 的技术,比如 PCA、t-SNE。
# 2.2 Why Auto-Encoder?
Auto-Encoder 到底好在哪呢?把一个 high dim -> low dim 有什么样的帮助呢?
在神雕侠侣中,杨过与樊一翁 PK,樊一翁的武器除了一根钢杖以外,还有他的胡子,他可以甩动胡子当作软鞭,很厉害。但杨过说三招之内减掉他的胡子,而且成功了,这时怎么做到的?因为杨过发现,鬍子是由头所操控的,虽然鬍子甩开来有两丈那么长,但头能做的变化是有限的。于是杨过直接打他的头,这样樊一翁不得不闪避,从而逼着他这个胡子所能够动的路线变得有限,然后打败了樊一翁。
那 Auto-Encoder 所做的“把一张图片压缩又还原回来”为什么能成功呢?如下图,我们假设本来的 image 是 3 × 3,Encoder 的 output 是 2 dim,这时怎么有可能从 2 dim 去还原 3 × 3 的 image 呢?
能够做到这件事情是因为,对于影像来说,并不是所有 3 × 3 的矩阵都是 image,image 的变化其实是有限的。你随便 sample 一个矩阵,通常都不会是你会看到的图片。当变化受限后,假如将图片收集起来发现说只有两个类型(如上图),其他类型根本就不是你一般在训练的时候会看到的状况,那 Encoder 就可以只用两个维度就可以描述一张 image 了,这样看到第一个类型就让左边维度是 1,看到第二个类型就让右边维度是 1。这就对应到刚才这个樊一翁的例子:
Encoder 做的事情就是化繁为简,本来比较复杂的东西,它只是表面上比较复杂,事实上它的变化其实是有限的,就可以用比较简单的方法来表示它。
如果我们可以把复杂的图片,用比较简单的方法来表示它,那么在下游的任务里面,我们可能就只需要比较少的训练资料就可以让机器学到我们本来要它学的事情。以上就是 Auto-Encoder 的概念。
# 2.3 Auto-encoder is not a new idea
Auto-Encoder 从来都不是一个新的想法。Deep Learning 之父 Hinton 在 06 年的 Science 的 paper 中就提出了 Auto-Encoder 的概念,只是那时候的 network 与现在的不太一样,那时候的 Auto-Encoder 长这样:
那时候人们觉得 deep 的 network 是 train 不起来的,每一层应该分开训练,所以用了一个叫做 Restricted Boltzmann Machine(RBM,受限玻尔兹曼机)的技术,它将每一层分开 train,等每一层 train 好后再全部接起来做微调,注意它微调的是 pre-train 的 model,这个过程在今天看来就成了 pre-train 的 pre-train。如今很少再提到 Restricted Boltzmann Machine 了,因为它没什么必要。这里也只是想说 Auto-Encoder 不是新的概念,而是一个非常有历史的概念。
# 2.4 De-noising Auto-Encoder
De-noising 的 Auto-Encoder 是说把原来要输进去给 Encoder 的图片,加上一些 noisy,再传给 Encoder,通过 Decoder 试图还原未加入杂讯的图片。所以现在这个 network 还多了一个要学会自己去掉杂讯的任务。
如果你看今天的 BERT 的话,也可以把它看作一个 De-Noising 的 Auto-Encoder,在 BERT pre-train 中会加 masking,那些 masking 其实就是 noise,BERT 的 model 就是 Encoder,output 就是 Embedding:
BERT 的输出就是 Embedding,接下来有一个 Linear 的模型,就是 Decoder,Decoder 要做的事情就是还原原来的句子,也就是把填空题被盖住的地方还原回来。所以我们说 BERT 就是一个 De-Noising 的 Auto-Encoder。
上图中,Decoder 也不一定非要是 Linear。我们换一个说法,最小的 BERT 有 12 层,那我们可以将第 6 层的输出是 Embedding,那剩下的 6 层就是 Decoder。总之这个 Decoder 不一定非要是 Linear。
# 3. Feature Disentanglement
我们介绍一下 Auto-Encoder 其他有意思的应用:Feature Disentanglement。Disentangle 是说把一堆本来纠缠在一起的东西给解开。
为什么会有这个议题呢?我们先看看 Auto-Encoder 在做的事情:
中间这个 Representation 包含了多个方面的资讯。Feature Disentangle 想做的事就是,在 train 一个 Auto-Encoder 时,同时有办法知道这个 Representation 的哪些维度代表了哪些资讯。比如说将一段语音经过 Encoder 后输出一个 100 dim 的 vector,我们可以知道说前 50 dim 代表这句话的内容,后 50 dim 代表了这句话说话人的特征。这就是 Feature Disentangle 所做的,它是有办法做的,具体怎么做可以参考论文。
有了这个技术,就可以期待机器做 Voice Conversion,也就是将 A 的声音转成 B 的声音,而且训练资料不需要 A 和 B 念同样的句子。如下图所示,我们可以将两句话的内容互换:
同样,在 CV、NLP 上又有着类似的应用。
# 4. Discrete Latent Representation
我们介绍另一个应用:Discrete Latent Representation。目前我们都假设中间这个 Representation 都是一串 real numbers,那它可不可以是别的东西呢?
- 比如也许可以使 binary,好处是这使得每一个 dim 代表了某种特征,1/0 表示是否具有这种特征,这样的话就使得解析 Encoder 的输出更加容易
- 甚至也许可以强迫这个 vector 一定要是 one-hot,也就是只有一维是 1,这样也许就可以做到 unsupervised 分类。比如做 0-9 的手写数字识别,那可以强迫中间的 Representation 是 10 dim 的 one-hot vector,这样也许 1 个维度对应 1 个数字,从而在训练时就不需要用到 label data 了
Discrete Latent Representation 还有其他形式,最知名的是 VQVAE(Vector Quantized Variational Aauto-Encoder)。它是这样子运作的,输入一张 image,Encoder output 一个一般的 continuous 的 vector,但接下来还有一个 Codebook:
这个 Codebook 有一排 vector,他们都是 learn 出来的,然后用 Encoder 的 output 和和这排 vector 算 similarity,这个过程类似于 self-attention,然后选出 similarity 最大的 vector 作为 Decoder 的 input。最后要求 Decoder 输出一张 image 并让它与输入的 image 越接近越好。
这个过程中的 Encoder、Decoder 和 Codebook 都是一起从资料里面 learn 出来的。好处是 Decoder 的 input 一定是 codebook 中的某一个 vector,就等于让你的 Embedding(Representation)不是无穷无尽的可能,而是只有有限种可能。
像这个技术也可以用在语音上,这样 Codebook 也许可以学到最基本的发音部位(如音标)。
# 4.2 Text as Representation
还有一种疯狂的想法:Representation 一定要是 vector 吗,能不能是别的东西?比如能不能是一段文字:
如果 Embedding 就是一个 word seq,那也许这串文字就是文章的摘要,也是最关键和精华的部分。这样 Encoder 和 Decoder 就需要都是 seq2seq 的 model,比如 Transformer。
但如果你真的训练这个 model,会发现这样是 train 不起来的,因为 Encoder 和 Decoder 会发明自己的暗号,产生人看不懂的文字。这样就需要用 GAN 的概念,加上一个 Discriminator:
这里的 Discriminator 看过人写的句子,这样强迫 Encoder 产生一段人能看懂的句子。但这该怎么 train 啊?看到你没法 train 的东西,就用 RL 硬做一发。这样用 RL 硬做就可以了。下面是一些训练的结果:
但也会有犯错的时候,或者产生莫名其妙的句子。
更狂的还有拿 Tree Structure 当做 Embedding 的:
# 5. More Applications
Auto-Encoder 还有更多的作用。之前我们都是用的 Encoder,其实 Decoder 也有作用。
# 5.1 Generator
把 Decoder 拿出来,这不就是一个 Generator 嘛!我们说 Generator 是吃一个 vector,产生一个东西,而 Decoder 不就是这样吗:
- 可以试一下从一个已知的 distribution 中 sample 一个向量,丢给 Decoder,看看能不能输出一张 image。
Generative Model 除了 GAN 外还有两种,其中一个就是 VAE(Variarional Auto Encoder),它其实就是把 Auto-Encoder 的 Decoder 拿出来当做 Generator 来使用。
# 5.2 Compression
Auto-Encoder 可以拿来做压缩,中间 low dim 的 Representation 完全可以看作一个 lossy 压缩的结果:
# 5.3 Anomaly Detection
在非常多的场合会需要做 Anomaly Detection(异常检测):
异常检测要做的事情就是:来了一笔新的资料,它到底跟我们之前在训练资料里面看过的资料相不相似。这个异常检测系统就是透过大量你已经看过的资料训练出来的:
- 如果新的资料看起来像是训练资料里面的 data,就说它是正常的
- 如果看起来不像是训练资料里面的 data,就说它是异常的
这个 Anomaly 有很多别的称呼:Outlier、Novelty、Exception 等,其实都是指的一件事。此外,相不相似也没有明确的定义:
那个这个异常检测有什么样的应用呢:
也许有人会想说 Anomaly Detection 能不能当成一个 binary classification 问题来做呢?问题在于难于收集资料,Anomaly Detection 通常你比较有办法收集到正常的资料,你比较不容易收集到异常的资料。比如大部分交易记录都是正常的,而异常的资料是非常少的。
如果我们有一大堆正常资料,却几乎没有异常的资料,那这种分类问题叫做 One Class 问题。对于普通的 binary classification 问题,需要两个类别的资料才能训练,而如果只有一个类别,这个时候就要用 Auto-Encoder 了。比如说要侦测一张 image:
- 如果 output 的 image 与 input 的 image 差异较大,就代表这种图片是在训练时没有见到过的,从而判断为 anomaly。
# 5.3.2 More about Anomaly Detection
异常检测不是只能用 Auto-Encoder 技术,Auto-Encoder 只是众多方法里面的一个,有关异常检测更完整的介绍可参考过去的上课录影。