- auto-encoder
- Feature Disentangle(特征分离)
二十四、Unsupervised Learning:Deep Auto-encoder
(一)Auto-encoder介绍
1、Auto-encoder
比如做数字辨识,首先找一个encoder,可以input一张digit,接下来可能就是一个neural network,它的output就是一个code(大小比input小,会有压缩的效果),这个code代表原来input这张image的某种精简有效的representation。
问题是现在做的unsupervised learning,不知道output长什么样子。所以我们要做一件事情–learn一个decoder,input一个vector,output就是一张image。接下来也没办法train这个decoder(只知道output,不知道input)。这两个network可以把它们接起来一起学:
PCA:input一张image
x
x
x(省略掉“-
x
ˉ
\bar{x}
xˉ”),把
x
x
x乘上一个weight
W
W
W,得到
c
c
c,这个component weight
c
c
c再乘上一个matrix
W
T
W^T
WT得到
x
^
\hat{x}
x^,我们要做的事情就是minimize input跟construct的结果,让
x
x
x跟
x
^
\hat{x}
x^越接近越好。这是PCA做的事。如果把它当作neural network来看的话,那input
x
x
x就是input layer,output
x
^
\hat{x}
x^就是 output layer,中间component 的weight就是hidden layer(linear)。中间这个hidden layer我们又叫Bottleneck later(因为这个component 的数目通常要比你的input小得多,才能达到dimension reduction的效果,所以它是一个特别窄的layer,Bottleneck 瓶颈的意思)。
前一部分在做encode,后一部分在做decode,那么hidden layer的output是我们要找的code。
也可以用gradient descent 来解PCA,但是PCA只有一层hidden layer,可以把它变成更多hidden layer:
从input到bottleneck的部分就是encoder,从bottleneck output到最后整个network的output就是decoder。
其中encoder的weight和decoder的weight互为Transpose不是必要的。
2、Deep Auto-encoder
Deep Auto-encoder的结果比PCA要好。
如果上图做PCA时hidden layer降到2维,会发现最后所有颜色混在一起;如果是用Deep Auto-encoder会发现这些数字是分开的:
3、auto-encoder的应用
- Text Retrieval
- Similar Image Search
- Pre-training DNN
(1)Text Retrieval
Auto-encoder用在文字处理上:比如把一篇文章压成一个code,如下图,Vector Space Model–假设每一个蓝色圈圈就是一篇文章,现在使用者输入一个查询的词汇,接下来计算这个查询的词汇跟每篇document之间的内积:
假设今天做的是Bag-of-word,开一个vector,vector的size就是词汇的size,假设现在有一个document "This is an apple"表示为vector就是:
但是Bag-of-word没办法考虑语义信息。
我们可以使用auto-encoder让语义考虑进来。举例来说learn一个auto-encoder,它的input就是一个document或者是一个query,把这个document变成一个vector,再把这个vector通过一个encoder,把它压成2维,结果如下图所示,但是使用LSA得不到类似的结果:
(2)Similar Image Search
auto-encoder应用在以图找图上:计算要找的image query和database中其它的image在pixel上的相似程度,然后最相似的几张就是最后结果。但是这样得不到太好的结果。
解决方法就是使用deep auto-encoder,把每一张image变成一个code,在code上再去做搜寻。input一个32x32的image,每个pixel用RGB表示,(32x32x3),把它的维数变为8192维,再变为4096–2048–1024–512–256,最后这张image用一个256维的vector来描述它,再把这个code用另外一个decoder,变回原来的image,得到的结果如下图右上角所示:
如果不是在pixel上算相似度,而是再code上算相似度会得到比较好的结果:
(3)Pre-training DNN
找一组比较好的initialization的方法就叫做pre-training。
用auto-encoder做pre-training:假设现在input是784维,第一个hidden layer1000,第二个hidden layer 1000,第三个500,到10维,在做pre-training时先train一个auto-encoder,这个auto-encoder input784维,然后中间有一个1000维的vector,然后再把它变回784维,希望input和output越接近越好。
先learn一个auto-encoder,learn好后把784-1000维的weight
W
1
W^1
W1留下来,然后把database中digit统统变成1000维的vector,接着learn另外一个auto-encoder,它把1000维的vector变成1000维的code,再把1000维的code转回1000维的vector,这个auto-encoder在learn时会让input和output越接近越好:
把上面的auto-encoder的
W
2
W^2
W2保存下来,再learn第三个auto-encoder,input1000维,code 500维,output 1000维:
然后把
W
3
W^3
W3保存下来,这个
W
1
W^1
W1、
W
2
W^2
W2、
W
3
W^3
W3就等于你在learn整个neural network的initialization,最后通过random initialization得到
W
4
W^4
W4,然后用backpropagation去调一遍:
pre-training:如果今天有很多的unlabelled data,只有少量的label data,可以用大量的unlabelled data先initialization好所有的
W
W
W,最后的label data就只需要稍微调整你的weight就好。
4、De-noising auto-encoder
De-noising auto-encoder这个方法可以让auto-encoder做得更好:
把原来的input
x
x
x,加上一些noise变成code
c
c
c,然后把
c
c
c decode回来变成
y
y
y,需要让
y
y
y和在加了noise之前的input
x
x
x 越接近越好:
还有另外一个方法叫做contractive auto-encoder:希望learn这个code时加上一个constraint,这个constraint就是当input有变化时对code的影响是小的。
5、Auto-encoder for CNN
unpooling和deconvolution是什么?
(1)unpooling
做pooling时:得到一个4x4的matrix,接下来matrix里面的pixel分成四个一组,然后从每组里面挑个最大的,image就会变成原来的1/4;如果要做unpooling就得记得pooling是从哪里取值,也就是做Max Locations;
做unpooling时要把原来比较小的matrix扩大,记录的pooling的位置放在原来的位置,其它的位置补零。做完unpooling后原来比较小的image会变得比较大(比如14x14–>28x28):
(2)deconvolution
实际上,deconvolution就是convolution。
举例:1维的convolution,input有5个dimension,filter size为3,做convolution时本来是3个值变成1个值,做deconvolution时就应该是1个值变成3个值:
如上图所示,1个值分别乘上红色、蓝色、绿色的weight变成3个值,重叠的地方加起来。这个事情等同于在做convolution,不同的weight的顺序不同。
6、Sequence-to-sequence Auto-encoder
RNN章节有介绍。
7、decoder to generate
怎么确保在我们希望的区域里面都是image:在code上加regularization。
(二)More about Auto-encoder
Auto-encoder:
- 为什么一定是minimize reconstruction error?
- 希望让encoder自动output出来的能更容易被解读。
(1)
我们希望embedding可以代表原来encoder输入的那个object。今天有一个encoder,这个encoder看见一张图片就output一个embedding,比如:
那么如何知道这个encoder是不是好的?训练一个Discriminator(来源于GAN),可以当作一个binary classifier,它的输入是一张图片和一个embedding,输出是这张图片和这个embedding是否是一对的。
训练资料:
假设binary classifier的参数为
Φ
\Phi
Φ,loss function
L
D
L_D
LD:
根据这个想法可以提出新的训练这个encoder的方法,过去都是minimize reconstruction error(重建误差),但是现在可以通过训练一个binary classifier去评估一个encoder是好还是不好,接下来就是去调encoder的参数让encoder进行学习使得它用我们现在评估一个encoder好坏的方法的评估标准下可以得到好的结果。
现在评估的标准是看
L
D
∗
L_D^\ast
LD∗,它越小代表encoder越好。那么训练encoder的目标就变成要去minimize
L
D
∗
L_D^\ast
LD∗。
假设encoder参数是
θ
\theta
θ,找一个
θ
\theta
θ让
L
D
∗
L_D^\ast
LD∗的值越小越好。
Auto-encoder可以看作以上那种情况的special case。
(2)
Sequential Data(顺序数据):train auto-encoder 输入自己预测自己;Skip thought --train一个model输入一个句子,预测前一个句子和下一个句子;Quick thought–只learn encoder,把每一个句子都丢到encoder中,然后会output一个embedding vector,训练方式就是每一个句子要跟它的下一个句子output的embedding vector越接近越好,重点就是要随机sample一些句子,不仅要和下一个句子的embedding vector越像越好,而且要和随机sample的句子的embedding越不像越好。
Contrastive Predictive Coding(PCP):
training encoder,这个encoder输入是一段声音讯号,声音的每一小段都要用encoder得到它的embedding,训练目标就是希望encoder output出来的embedding可以拿去预测接下来同一个encoder会output的embedding。
(3)More interpretable embedding
Feature Disentangle(特征分离):
一个复杂的资讯,比如一段声音里面不仅包含了文字的资讯,还包含了说话人声音的特质,环境噪音等;比如一段文字里面语义的资讯,文法的资讯;比如一张图片有风格的资讯,内容里面物件的资讯。所以一个encoder 的输入包含了各式的资讯。但是我们拿一个vector来表示我们输入的object。
但是我们不知道这个vector哪些dimension对应的是什么资讯。我们期待encoder可以自动告诉我们哪些维度对应哪些资讯。
目标:encoder输出一个vector以后前多少维代表,比如,内容的资讯,后多少维代表的,比如说话人的资讯。
这个想法还可以变形:两个encoder,一个encoder专门抽出内容的资讯,另一个encoder专门抽出说话人的资讯,把内容的资讯和说话人的资讯拼在一起丢给decoder才能还原原来的讯号。
Feature Disentangle在语音上的应用:假如现在训练encoder,它可以把声音的资讯和说话人的资讯切开:
然后可以把女生说的"How are you"的vector和男生的vector结合起来放到decoder里面,这样就可以用男生的声音说"How are you"。–变声器。
Feature Disentangle的几个做法:
1、使用Adversarial Training(对抗训练)的概念:训练一个语者的classifier,这个classifier会把encoder的output的向量吃进去,根据这个向量判断出现在这个向量它来源的语者到底是哪一个人;encoder做的事情就是骗过这个classifier,让这个classifier的正确率越低越好。如果这个encoder成功骗过了这个classifier,并且给这个classifier看的embedding是encoder output的前一百维,那么encoder就会学到有关语者的任何资讯都不可以放在前一百维。那么前一百维可能就只剩下文字的资讯。实际上在做训练时,通常会用GAN的方式来训练这个classifier,也就是说这个classifier就是一个Discriminator,然后你的encoder就是generator,你的classifier跟encoder是iteratively的(先train classifier,再train encoder,再train classifier ,再train encoder…)。
2、Designed Network Architecture:代表不同资讯的embedding是用不同的decoder输出的,其实可以用更简单的方法–直接去改encoder的架构,抹掉不希望出现的资讯。举例来说有一种layer叫做instance normalization layer,这种layer可以抹掉global 的资讯。但是光这样做可能是不够的,也许encoder 1 输出没有包含任何语者的资讯,但是不能保证encoder 2 不会包含内容的资讯。举例来说一个可能的设计是在decoder上加一个特别的layer AdaIN,即adaptive instance normalization ,会调整输出的global的信息,如果adaptive instance normalization这个layer一变,整个句子每一个片段都会做改变,所以encoder 2的输出会改变它的句子,不能够在这个输出里面放文字的资讯:
(4)Discrete Representation(离散表示)
过去在train auto-encoder时,embedding我们都说它是continuous vector,它是一个低维向量,搞不清楚这个向量在干什么,所以我们期待encoder能不能够 output discrete(离散)的东西。如果encoder可以output 离散的东西我们就更容易解读这个output代表什么意思,甚至可以更容易地做分群。
举例来说,我们能不能让encoder的输出就是one-hot(只有一维是1,其它都是0),我们光看哪个维度是一,就可以知道只要同一维度是1,那object都属于同一类。不需要再把这个embedding在做k-means clustering,就自动把它分好群了。
做法1:今天在训练encoder和decoder时在他们之中再加一个东西–encoder的输出本来是continuous vector,我们看看这个vector的哪一维最大,接下来,就把最大的那一维改成1,其它的改为0,得到one-hot vector,然后把one-hot vector丢给decoder,让它还原原来的图片;
做法2:或者是说中间的continuous vector,某个值大于0.5,就把这一维改为1,其它改为0,把这个vector改为Binary vector。
Binary vector的做法优于one-hot vector的做法。
Vector Quantized Variational Auto-encoder(VQVAE)(矢量量化变分自动编码器):
有一个encoder,有一个decoder,除此之外还有一个codebook,在codebook里面就是一排vector,是机器学出来的。今天有一个图片进来的时候,encoder会output一个向量,这个向量是continuous的,接下来拿这个向量去跟codebook里面每一个vector去算相似度看谁的相似度最高,就把相似度最高的vector拿出来当作decoder的input,train的时候还是minimize reconstruction error。
作用:比较容易保留的discrete的资讯。
(5)Sequence as Embedding
可以让embedding不再是一个向量,假设让它是一个句子。
假设现在encoder的对象是一大堆文章,我们可以learn一个 seq2seq2seq的auto-encoder,encoder吃一篇文章进来,output不是一个向量,而是一个sequence,decoder把这个sequence吃进去,试图还原原来的文章。但是这样训练不好结果。
那怎么让encoder输出的sequence是人看得懂的呢?需要用到GAN的概念。
我们训练一个discrimination,它的工作就是看一个句子,判断这个句子是不是人写的。今天这个encoder就要学习去骗过这个discrimination,学习说输出一段文字,这串文字discrimination觉得像是人写的东西,同时这个encoder输出的句子,decoder又可以还原回文章,encoder可能保留了文章里面最重要的资讯。
(如果今天有一个loss function不能微分,就用Reinforcement learning硬做)
例子:
作用:用这个技术就可以让机器自动学会怎么给一篇文章做摘要。
(6)Tree as Embedding
总结:
本文是对blibli上李宏毅机器学习2020的总结,如有侵权会立马删除。