自编码器(二)
自编码器到底好在哪里?当我们把一个高维度的图片,变成一个低维度的向量的时候,到 底带来什么样的帮助呢?我们来设想一下,自编码器这件事情它要做的,是把一张图片压缩 又还原回来,但是还原这件事情为什么能成功呢?如图1.1所示,假设本来图片是3×3的 维度,此时我们要用9个数值来描述一张3×3的图片,假设编码器输出的这个向量是二维 的,我们怎么才可能从二维的向量去还原3×3的图片,即还原这9个数值呢?怎么有办法把 9 个数值变成2个数值,又还原成3,又还原回9个数值呢?
图1.1 自编码器的原理
能够做到这件事情是因为,对于图像来说,并不是所有3×3的矩阵都是图片,图片的变 化其实是有限的,你随便采样一个随机的噪声,随便采样一个矩阵出来,它通常都不是你会 看到的图片。举例来说,假设图片是3×3的,那它的变化,虽然表面上应该要有3×3个数 值,才能够描述3×3的图片,但是也许它的变化实际上是有限的。也许我们把图片收集起来 发现,它实际上只有如图1.1所示的白色和橙色方块两种类型。一般在训练的时候就会看到 这种状况,就是因为图片的变化还是有限的。因此我们在做编码器的时候,有时只用两个维度 就可以描述一张图片,虽然图片是3×3,应该用9个数值才能够储存,但是实际上它的变化 也许只有两种类型,那你就可以说看到这种类型,我就左边这个维度是1,右边是0,看到这 种类型就左边这个维度是0,右边这个维度是1。
而编码器做的事情就是化繁为简,有时本来比较复杂的东西,它实际上只是表面上看起 来复杂,而本身的变化是有限的。我们只需要找出其中有限的变化,就可以将它本来比较复杂 的东西用更简单的方法来表示。如果我们可以把复杂的图片,用比较简单的方法来表示它,那 我们就只需要比较少的训练数据,在下游的任务里面,我们可能就只需要比较少的训练数据, 就可以让机器学到,这就是自编码器的概念。
自编码器从来就不是一个新的概念,它具有悠长的历史。举例来说,深度学习之父Hinton 早在2006 年的Science 论文里面就有提到自编码器这个概念,只是那个时候用的网络跟今天 我们用的有很多不一样的地方。那个时候自编码器的结构还不太成熟,当时人们还并不认为 深度的神经网络是能够训练起来的,换句话说就是把网络叠很多层,然后每一层一起训练的 方法是不太可能成功的,因此人们普遍认为每一层应该分开训练,所以Hinton用的是一个叫 做受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)的技术。
这里我们特别把Hinton 教授 2006 年的文章里面的图拿出来给大家展示一下过去人们是 怎么看待深度学习这个问题的。那个时候要训练一个很深的网络不太可能,每一层分开要训 练,虽然这个在现在看来很深也没有很深,只是三层,但是在2006年这个已经是很深的了。 那这个三层要分开来训练才可以,那这边说分开来训练这件事情叫做预训练。但它跟自监督 学习中的预训练又不太一样,假设自编码器是预训练,那么这里的预训练就相当于是预训练 中的预训练,这里预训练倾向于训练流程的概念,自编码器的预训练倾向于算法流程的概念。 这里预训练是要先训练自编码器,每一层用RBM的技术分开来训练。先把每一层都训练好, 再全部接起来做微调这件事情,这边的微调也并不是BERT模型的微调,它是微调那个预训 练的模型。这个RBM技术我们会发现今天很少有人在提到它了,它其实不是一个深度学习 的技术,它有点复杂,我们也没有打算要深入细讲,至于为什么现在都很少人用它,就是因为它没有什么用。但是在2006年,还是有必要用到这个技术的。其实Hinton后来在2012年的 时候,有一篇论文呢偷偷在结尾下一个结论说其实RBM技术也没有什么必要,所以后来就 没有什么人再用这个技术了。而且那时候还有一个神奇的信念,即编码器和解码器,它们的结 构必须是对称,所以编码器的第一层,跟解码器的最后一层,它们必须对应,不过现在已经没 有或者说比较少这样的限制。总之,自编码器从来就不是一个新的概念。