机器学习之十五(读书笔记)

本文介绍了自动编码器(Auto-encoder)的概念,包括浅层与深层自动编码器的区别,以及其在图像检索、相似图像搜索和预训练深度神经网络(DNN)中的应用。通过对比PCA,展示了深度自动编码器在特征学习上的优势。此外,还探讨了去噪自动编码器、合同自动编码器、序列到序列自动编码器,以及如何通过特征分离实现更可解释的嵌入表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 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的总结,如有侵权会立马删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值