自编码器(autoencoder)
/ AW-toh-en-koh-dur /
自编码器,是一种靠「把输入照抄回去」来学习的网络——但中途要穿过一个刻意设下的瓶颈,逼它先压缩。想象有人要你只用十个字向朋友描述一张照片,再让那位朋友单凭你的描述把它重画出来。要画得好,你这十个字就必须抓住真正要紧的东西——要旨——而把杂乱扔掉。自编码器一身二任:一个「编码器」把输入挤成一份小小的概要,一个「解码器」则单凭这份概要去重建原物。
巧妙之处就在那个「挤」的地方。中间那份小概要——叫作「潜在表示」或「瓶颈」——窄得根本盛不下原原本本的输入,于是网络被迫只留下本质结构、丢掉噪声。又因为它要对准的输出,正是输入本身,便无需任何人工标签;数据自己监督自己。这让自编码器成了无监督、表示学习的经典范例——它的目标不是一个预测,而是对数据的一份良好压缩描述。
它有什么用?学到的潜在编码可以用来压缩数据、去除噪声(拿「带噪输入、干净输出」的成对样本训练它,它就学会了「擦洗」),或是揪出异常(一笔欺诈、一处缺陷会重建得很糟,因为网络从没学过抄写这类怪东西)。该说的局限是:一个朴素自编码器并不是可靠的「全新逼真样本」生成器——它的潜在空间通常坑坑洼洼、满是空隙——而且若瓶颈开得太宽,它还会作弊,干脆把输入原样放过去。变分自编码器及别的变体缓解了其中一些问题,但要论清晰的图像生成,领跑的是 GAN 和扩散模型。
把一张 784 像素的手写数字图喂给编码器,让它挤成区区 32 个数;解码器再单凭这 32 个数把数字重建出来。先用干净的数字训练,然后喂进一张带噪的——解码器会输出一个去噪后的版本,因为它只会画真正的数字。
挤成一段小小的编码,再重建——留住本质,丢掉噪声。
自编码器的价值在于中间那段被挤出来的编码,而不在于它吐出的那份副本——那份副本只是用来逼出好编码的训练借口。要是把瓶颈开得和输入一样宽,它什么也学不到,只会原样照抄。