Unsupervised Learning: Deep Auto-encoder
简单回顾一下Encoder和Decoder:
- Encoder(编码器),它可以把原先的图像压缩成更低维度的向量
- Decoder(解码器),它可以把压缩后的向量还原成图像
- 把两者连起来一起做学习,就是Auto-encoder。
实际上PCA用到的思想与之非常类似,PCA的过程本质上就是按组件拆分,再按组件重构的过程。 在PCA中,我们先把均一化后的
x
x
x根据组件
W
W
W分解到更低维度的
c
c
c,然后再将组件权重
c
c
c乘上组件的反置
W
T
W^T
WT得到重组后的
x
^
\hat x
x^,同样我们期望重构后的
x
^
\hat x
x^与原始的
x
x
x越接近越好。 如果把这个过程看做NN,我们发现最中间那一层hidden layer实际上就是code。 一个直觉的想法就是:把这个NN做的Deep一点。 惊人的是:这个想法是可行的,而且效果很好! 只要够深,做到2维也行!
Text Retrieval
Auto-encoder也可以被用在文字处理上。 我们想把一篇文章做一个编码,有一种简单做法Vector Space Model:把每一篇文章都表示成空间中的一个向量。 假设查询者输入了某个词汇,那我们就把该查询词汇也变成空间中的一个点,并计算query和每一篇document之间的内积(inner product)或余弦相似度(cos-similarity)从而得知应该去哪一篇document查询。 那么如何把一个document表示为一个向量呢?有一种Bag-of-word的方法:维数等于所有词汇的总数,某一维等于1则表示该词汇在这篇文章中出现,此外还可以根据词汇的重要性将其加权。 但这个模型是非常脆弱的,对它来说每个词汇都是相互独立的,无法体现出词汇之间的语义(semantic) 尽管如此,最终效果依旧很好。 相比之下,LSA的效果就差多了。
Similar Image Search
Auto-encoder同样可以被用在图像检索上。 以图找图最简单的做法就是直接对输入的图片与数据库中的图片计算pixel的相似度,并挑出最像的图片,但这种方法的效果是不好的,因为单纯的pixel所能够表达的信息太少了。甚至会出现“迈克尔·杰克逊和马蹄铁很像”的结果。 解法也很简单:先把图像变成code,再做相似度检索。
Pre-training DNN
在训练神经网络的时候,我们一般都会对如何初始化参数比较困扰,预训练(pre-training)是一种寻找比较好的参数初始化值的方法,而我们可以用Auto-encoder来做pre-training。 比方说,我们要train一个下面的NN。 步骤如下: 先做一个
784
→
1000
→
784
784\rightarrow 1000\rightarrow 784
784→1000→784,要求前后的
784
784
784要尽可能相近,然后保留
1000
1000
1000(蓝色)。
然后做
1000
(
蓝
)
→
1000
(
绿
)
→
1000
(
蓝
)
1000(蓝)\rightarrow 1000(绿)\rightarrow 1000(蓝)
1000(蓝)→1000(绿)→1000(蓝),要求前后的
1000
(
蓝
)
1000(蓝)
1000(蓝)要尽可能相近,然后保留
1000
1000
1000(绿)。 以此类推,直到做完。 此时三个隐藏层的参数
W
1
W^1
W1、
W
2
W^2
W2、
W
3
W^3
W3就是训练整个神经网络时的参数初始值。 然后随机初始化最后一个隐藏层到输出层之间的参数
W
4
W^4
W4。 再用反向传播去调整一遍参数,因为
W
1
W^1
W1、
W
2
W^2
W2、
W
3
W^3
W3都已经是很好的参数值了,这里只是做微调,这个步骤也因此得名为Find-tune。
但由于现在训练机器的条件比以往更好,因此pre-training并不是必要的。不过他也有自己的优势:
- 如果你只有大量的unlabeled data和少量的labeled data,那你可以先用这些unlabeled data把
W
1
W^1
W1、
W
2
W^2
W2、
W
3
W^3
W3先初始化好,最后再用labeled data去微调
W
1
W^1
W1~
W
4
W^4
W4即可。因此pre-training在有大量unlabeled data的场景下(如半监督学习)是比较有用的
De-noising Auto-encoder
有一种能令Auto-encoder更有效的办法:对input图像
x
x
x加上一点噪声。 这样可以令NN更加稳定。因为此时的编码器Encoder不仅仅是在学习如何做编码,它还学习到了如何过滤掉噪声这件事情。
Contractive Auto-encoder
收缩自动编码器的基本思想是,在做encode编码的时候,要加上一个约束,它可以使得:input的变化对编码后得到的code的影响最小化。 这样同样可以令NN更稳定。
CNN和Auto-encoder
处理图像通常都会用卷积神经网络CNN,它的基本思想是交替使用卷积层和池化层,让图像越来越小,最终展平,这个过程跟Encoder编码的过程其实是类似的。 理论上要实现自编码器,Decoder只需要做跟Encoder相反的事即可,那对CNN来说,解码的过程也就变成了交替使用**去卷积层(Deconvolution)和去池化层(Unpooling)**即可。
Unpooling
首先回顾pooling的过程:对图像分组(比如每组是一个
2
×
2
2 \times 2
2×2的矩阵),从每组中选取最大的一个pixel代表这一组,然后图像就被缩小了4倍。 一种unpooling做法:提前记录pooling所挑选的pixel在原图中的位置,然后做Unpooling,就要把当前的matrix放大到原来的四倍,也就是把2×2 matrix里的pixel按照原先记录的位置插入放大后的4×4 matrix中,其余项补0即可。 另一种(Keras):pooling并没有记录原先的位置,做Unpooling的时候就是直接把pixel的值复制四份填充到扩大后的matrix里即可。
Deconvolution
简单回顾一下convolution:每个右边的点是由n个左边的点相加得到(见左图)。 那么Deconvolution就应该是:每个点分成n份,相同位置的值相加即可得到还原(见中图)。 但实际上:如果把左边的点补充多一点,灰色的点值为0,那可以看到Deconvolution其实也是convolution。
|