1. 对Auto-Encoder提出更多的要求
在 Pytorch实战_图像降维及聚类 中,我已经简单的介绍了 Auto-Encoder 的原理。对于最简单的 Auto-Encoder,我们的要求就是尽量降低 reconstruction loss,也就是还原出来的图片或文章要和原图片或文章尽可能相近。
但是除此之外,我们能不能对Auto-Encoder提出更多的要求呢?答案是肯定的,我们来看一下:
- 不仅仅是减低 reconstruction loss
- 得到更具有可接受性的 embedding
1.1 要求一
要求一要求我们不仅仅是减低 reconstruction loss,而且要求我们得到的embedding能代表我们原有的图片或文字(就像是写轮眼代表了宇智波一族一样)。我们怎么使得机器做到这一点呢?
从下面这个PPT可以看出,我们需要另外构建一个分类器 Discriminator 来衡量 embedding 和原有图片的适配程度。具体流程是,我们使用参数设置为
θ
\theta
θ 的 Encoder 将图片进行压缩,并将压缩得到的 embedding 和 图片一同放入Discriminator 进行分类,由 Discriminator 来判断二者是否适配。对于每个
θ
\theta
θ 来说,我们都会调节 Discriminator 的参数
ϕ
\phi
ϕ 来使得 Discriminator 的训练误差尽可能的小,我们定义这个误差为
L
D
∗
L_D^{*}
LD∗。最终我们应该调节参数
θ
\theta
θ 使得
L
D
∗
L_D^{*}
LD∗ 尽可能小。
1.2 要求二
要求二要求我们得到的 embedding 更加有解释性。通常我们得到的 embedding 看起来都是一团乱麻,就像下面 PPT 右上角的图片一样。我们想要知道 embedding 每一部分都代表了什么信息。如下图所示,在语音训练中,我们得到的 embedding 可能包含了说话者的信息(如:发音习惯等等)以及话语本身中的信息,我们想要将其分开。
具体该怎么做呢?一个简单自然的想法是,我们训练两个 Encoder,其中一个专门用来提取话本身的信息,另一个用来提取说话人的信息。这有什么用呢?比如我们可以把另一个说话人的信息和话语本身的信息进行结合,实现变声的效果。
怎么训练这有的 Encoder 呢?一种方式是反向训练 。同样我们创造一个二分类的 Discriminator,这个 Discriminator 的作用是吃进去表示话语本身信息的那一部分 embedding,并判定这是哪个人说的。如果我们的 Encoder 能做到欺骗过 Discriminator,让他分不清到底是哪个人说的,那说明这部分 embedding 中已经不包含说话人的信息了。