其实自编码器也可以算是自监督学习的一环,因 此我们可以再简单回顾一下自监督学习的框架。如图1.1所示,首先你有大量的没有标注的 数据,用这些没有标注的数据,你可以去训练一个模型,你必须设计一些不需要标注数据的 任务,比如说做填空题或者预测下一个词元等等,这个过程就是自监督学习,有时也叫做预训 练。用这些不用标注数据的任务学完一个模型以后,它可能本身没有什么作用,比如BERT 模型只能做填空题,GPT模型只能够把一句话补完,但是你可以把它用在其他下游的任务里 面。
图1.1 自监督学习框架
在有BERT 或者GPT模型之前,其实有一个更古老的,不需要用标注数据的任务,就 叫做自编码器,所以你也可以把自编码器看作是一种自监督学习的预训练方法。当然可能不 是所有人都会同意这个观点,有人可能会说这个自编码器,不算是自监督学习。因为这个自编 码器是早在2006 年就有的概念,然后自监督学习是2019年才有这个词汇,所以他们认为自 编码器不算是自监督学习的一环。这个都是见仁见智的问题,这种名词定义的问题,我们就不 用太纠结在这个地方,从自监督学习,即不需要用标注数据来训练这个角度来看,自编码器我 们可以认为它算是自监督学习中的一种方法,它就跟填空或者预测接下来的词元是很类似的 概念,只是用的是另外一种不一样的思路。
自编码器的原理,以图像为例,如图1.2所示,假设我们有非常大量的图片,在自编码器 里面有两个网络,一个叫做编码器,另外一个叫做解码器,它们是不同的两个网络。编码器把 一张图片读进来,它把这张图片变成一个向量,编码器可能是很多层的卷积神经网络(CNN), 把一张图片读进来,它的输出是一个向量,接下来这个向量会变成解码器的输入。而解码器会 产生一张图片,所以解码器的网络架构可能会像是GAN里面的生成器,它是比如11个向量 输出一张图片。
图1.2 自编码器的流程
训练的目标是希望编码器的输入跟解码器的输出越接近越好。换句话说,假设你把图片 看作是一个很长的向量的话,我们就希望这个向量跟解码的输出,这个向量,这两个向量他们的距离越接近越好,也有人把这件事情叫做重构(reconstruction)。因为我们就是把一张 图片,压缩成一个向量,接下来解码器要根据这个向量,重建出原来的图片,希望原输入的结 果跟重建后的结果越接近越好。讲到这里读者可能会发现说,这个概念其实跟前面讲的Cycle GAN 模型是类似的。
在做Cycle GAN 的时候,我们会需要两个生成器,第一个生成器把X域的图片转到Y 域,另外一个生成器把Y域的图片转回来,然后希望最原先的图片跟转完两次后的图片越接 近越好。那这边编码器和解码器,也就是这个自编码器的概念,跟CycleGAN其实是一模一 样的,都是希望所有的图片经过两次转换以后,要跟原来的输出越接近越好,而这个训练的过 程,完全不需要任何的标注数据,你只需要收集到大量的图片,你就可以做这个训练。因此它 是一个无监督学习的方法,跟自监督学习系列中预训练的做法一样,你完全不需要任何的标 注数据。那像这样子这个编码器的输出,有时候我们叫它嵌入。嵌入也称为表示或编码,因为 编码器是一个编码,所以这个有人把这个向量叫做编码,这些其实指的都是同一件事情。
怎么把训练好的自编码器用在下游的任务里面呢?常见的用法就是把原来的图片可以看 成是一个很长的向量,但这个向量太长了不好处理,这是把这个图片丢到编码器以后,输出 另外一个向量,这个向量我们会让它比较短,比如说只有10维或者100维。接着拿这个新的 向量来做接下来的任务,也就是图片不再是一个很高维度的向量,它通过编码器的压缩以后, 变成了一个低维度的向量,我们再拿这个低维度的向量,来做接下来想做的事情,这就是自编 码器用在下游任务的常见做法。
由于通常编码器的输入是一个维度非常高的向量,而其输出也就是我们的嵌入(也称为 表示或编码),其是一个非常低维度的向量。比如输入是100×100的图片,100×100那就是 1 万维的向量。如果是RGB那就是3万维的向量,但是通常编码器我们会设得很小,比如说 10、100 这样的量级,所以这个这边会有一个特别窄的部分,本来输入是很宽的,输出也是很 宽的,但是中间特别窄,因此这一段就叫做瓶颈。而编码器做的事情,是把本来很高维度的东 西,转成低维度的东西,把高维度的东西转成低维度的东西又叫做降维。