李宏毅机器学习Lecture 16 Unsupervised Learning - Auto-encoder 课程笔记

李宏毅机器学习Lecture 16 Unsupervised Learning - Auto-encoder 课程笔记

    • auto-encoder
    • starting from PCA
    • deep auto-encoder
    • auto-encoder在文字组的应用
    • Auto-encoder应用于以图找图
    • Auto-encoder用于预训练DNN
    • De-noising auto-encoder
    • auto-encoder for CNN
    • decoder产生新的图片

视频地址: https://www.youtube.com/watch?v=Tk5B4seA-AU

首先明确大前提是 unsuperised learning
李宏毅机器学习Lecture 16 Unsupervised Learning - Auto-encoder 课程笔记_第1张图片

auto-encoder

想法:首先找一个encoder,通过这个encoder能得到一张图片的精简表达
只学NN encoder 问题:只有input,没有output
只学NN decoder 问题:只有output,没有input
解决方法:把encoder 和decoder 连起来一起学,input一个图片中间变成一个code,再把code通过decoder变成原来的image。

starting from PCA

把PCA当做NN来看,x是input layer, x ^ \hat{x} x^ 是output layer,中间c是hidden layer,c通常由input降维得到的,所以特别窄又称之为bottleneck layer

deep auto-encoder

训练目标和PCA一样, ( x − x ^ ) 2 (x-\hat{x})^{2} (xx^)2越小越好;
auto-encoder可以有多个隐层,中间特别窄的layer是bottleneck layer。把input做encode得到bottleneck layer,把bottleneck layer做decode变回原来的image。注意到,从input layer到第一个layer的权重 W 1 W_1 W1和最后一个layer到output layer之间的权重 W 1 T W_1^\mathrm{T} W1T互为转置。
李宏毅机器学习Lecture 16 Unsupervised Learning - Auto-encoder 课程笔记_第2张图片
上图是Hinton论文中的结果:PCA把原来的图片从784维降到30维再恢复到784维,得到图片雾雾的,而deep auto-encoder结构见上图,结果看起来非常好。
如果用PCA把图片降到2维,则所有的数字都混在一起,而deep auto-encoder降到2维可以把数字分开。

以下是auto-encoder的应用:

auto-encoder在文字组的应用

举例来说现在做文字的搜索,使用vector space model把每一篇文章变成空间中的vector,把查询词汇也变成一个vector,接下来计算查询词汇和每一篇文章的内积或余弦相似度,从而进行查询。这个模型的关键是要把文章转成一个vector。
一种方法是词袋,这个模型的想法是:如果现在有10w的词汇,现在开一个vector,这个vector的大小就是10w维。把句子表示成vector就是在单词出现的位置标1,不出现的位置标0。也可以对每个词乘上权重IDF,代表词汇的重要性。
但是这种方法中每个词都独立,不能考虑到语意。
要把语意考虑进来的话,要用Auto-encoder。词袋经过auto-encoder之后得到code。下图中不同颜色代表文档的不同种类,观察到同一类的文章集中在一起。 如果现在做查询,输入一个查询词,通过encoder变成一个二维的vector,假设查询词落在图中所在区域,就可以说查询词与energy markets有关。而用LSA的话无法检索出来。
李宏毅机器学习Lecture 16 Unsupervised Learning - Auto-encoder 课程笔记_第3张图片

Auto-encoder应用于以图找图

李宏毅机器学习Lecture 16 Unsupervised Learning - Auto-encoder 课程笔记_第4张图片
如果基于像素计算图片之间相似度的话,得到的结果会比较差。比如,会得到迈克尔杰克逊的照片比较像马蹄铁。
而把image经过auto-encoder变成code,基于code计算相似度,就会得到比较好的结果。比如,用迈克尔杰克逊的照片找到的都是人脸,虽然在pixel level上看起来不像,但是通过很多hidden layer 转成code的时候,在256维里面会比较像。

Auto-encoder用于预训练DNN

参数初始化的方法称为pre-training,auto-encoder可以用在train NN时候的参数初始化。
李宏毅机器学习Lecture 16 Unsupervised Learning - Auto-encoder 课程笔记_第5张图片

如何做参数初始化:
1.在训练第一个auto-encoder时,input是784维,中间有一个1000维的vector,然后把它变回784维。需要小心的是,一般希望hidden layer维数小,如果比input维数大,要加很强的正则项,e.g.对1000维的output做L1正则化(希望output稀疏)。否则hidden layer可能直接记住input,没有learn到任何东西。学好一个auto-encoder之后保留 W 1 W_1 W1,并且固定住。接下来把所有database里面digit的变成1000维的vector。
2.在训练第二个auto-encoder时,把1000维vector变成1000维的code,再把1000维的code转成1000维的vector。训练的目标同样是越接近越好,然后保留 W 2 W_2 W2
以此类推,最后随机初始化输出层之前的权重。然后用BP做fine-tune(W1,W2,W3已经很好,微调即可)。
之前在训练较深的NN时要用到预训练,但是现在没必要了,因为训练技术进步了。
但在有大量unlabelled data、少量labelled data时仍需要预训练,可以先用大量无标注数据先把W1,W2,W3先learn好,最后的labelled data只需稍微调整weight就好。

De-noising auto-encoder

李宏毅机器学习Lecture 16 Unsupervised Learning - Auto-encoder 课程笔记_第6张图片
auto-encoder让自编码做的更好,做法是:把原来的input x x x加上一些noise变成 x ′ x' x,然后把 x ′ x' x通过encode变成 c c c,再把 c c c decode回来变成 y y y。注意此时要让output和加noise之前 x x x越接近越好,具有一定的鲁棒性。

auto-encoder for CNN

李宏毅机器学习Lecture 16 Unsupervised Learning - Auto-encoder 课程笔记_第7张图片如果用CNN处理图片的话,卷积层和池化层交替做encoder,得到一个code,然后接下做decoder。
unpooling: 在pooling的时候记得从哪里取的值,unpooling的时候把对应位置恢复,其余位置补0。做完unpooling之后,原来比较小的image会变得比较大,比如把1414的图片扩散成2828的图片。Keras中unpooling是直接把pooling后的每个值复制4份。
deconvolution: 其实就是convolution。
Convolution:三个值变成一个值,deconvolution:一个值变成三个值。
为什么等同?input三个value,其余补0;不同点是weight相反—左边红蓝绿,右边绿蓝红。

decoder产生新的图片

李宏毅机器学习Lecture 16 Unsupervised Learning - Auto-encoder 课程笔记_第8张图片
把784维图片通过hidden layer降到2维,再把2维通过hidden layer 解回原来图片。
如何产生新的图片?
在encoder部分,2维的vector画出来如上图所示,接下来根据vector的分布选择红框,在红框中等间隔采样选出一个2维的vector,作为decoder的input,得到计算机生成的图片。
如果红框选错了位置,比如选在右下方,可能得不到数字。
如何知道在红框内采样?
必须先观察二维vector的分布,才知道哪里有值。但是分析二维分布有点麻烦,改进方法:加正则化。
在训练时,对code加L2正则化,这样code比较接近0。采样时在0附近采样,这样采样得到的vector比较有可能都对应数字。

参考链接:https://blog.csdn.net/xzy_thu/article/details/70196885

你可能感兴趣的:(李宏毅机器学习Lecture 16 Unsupervised Learning - Auto-encoder 课程笔记)