1. auto-encoder
encoder就是把一张图片做编码,使得编码后的size比原始图片小,起到压缩的效果。encoder的过程可以是一个network的架构,
但是一个unsupervised learning问题,还没办法学习。
再考察encoder的逆过程decoder,就是把经过encoder过程得到的压缩了的图像数据还原回去(可能无法做到和原始图像绝对
一致)。同样的,decoder过程也是一个unsupervised learning 的network,单独也是无法学习的。
怎么解决encoder、decoder单独都无法学习的问题呢?那就把两个network接到一起,让它们一起学
联系到之前学习过的降维方法PCA,PCA是做dimension reduction,架构如下
把input x乘上一组weight w,得到c(c的维度较低),把c乘上另一组weight w‘ 就可以还原为x(并不是真正的x,只是与x很
接近)。中间那一层就是PCA的hidde layer,把hidden layer的output取出来,把它作为x降维后的结果。
PCA的hidden layer只有一层,我们当然可以把这一层hidden layer扩展成很多层hidden layer。,这就是deep auto-encoder
要做的事。
在Hinton的一篇paper里对PCA和deep auto-encoder的效果做了对比,可以发现deep auto-encoder在还原能力上要比PCA
要好。
2. auto-encoder—text retrival
如何把一篇文章压缩成一个code?为什么要这么做?用途有很多,比如现在要做文字的搜寻(判断一个词属于哪篇document)
通常的做法是把每一片document都表示成一个vector,也把该词表示成一个vector。然后计算cosime similarity
那怎么把document表示成一个vector呢?最trival的方法是bag-of-words,
缺点:bag-of-words无法考虑语义、语序,对bag-of-words来说每个词汇都是independent。
用auto-encoder来代替bag-of-words。把document压缩成一个vector。Hinton的实验结果如下(把docuemnt压缩成二维)
注:在Hinton的语料里,每一个document都带标签(属于哪一类文章),图中可见每一类文章对应的二维向量基本在一条放射状的带上。
如果用LSA的话效果则差了很多
3. auto-decoder—similar image search
原始做法是利用pixle算欧式距离,但这样做的效果很差。下图中,计算结果显示马蹄铁居然和迈克尔杰克逊很像。。。
用auto-encoder可以大大改进效果。
架构如下
相似度效果如下
4. auto-encoder—pre-traning DNN
很多时候深度学习的训练(尤其是几年前计算能力受限的时候),受到参数初始化的影响较大。
比如你要train左边的DNN,可以一步步去train小的网络,然后把得到的矩阵W固化,一步步向前推进。如右上图所示,train一个auto-encoder
网络,实现了把一个784维的input转成了1000维的向量,中间产物w1保留下来,1000维的向量也固定下来作为新的input,去train下一个 auto-encoder。
注:右上这个网络,输入是784维,中间是1000维,对于这种网络,在训练的时候有失效的风险,即网络没有真正的学习,而是直接把784维的input
直接装进了中间层的1000维。为了防止这种“假学习”的情况发生,可以在这一层加正则(严厉的L1正则),使生成的1000维向量很稀疏。
在得到了W1、W2、W3之后,随机初始化W4,然后再用back propagation去调整W1、W2、W3、W4(这时W1、W2、W3其实已经很好了,只
需微调)。
过去training技术不太好的时候pre-training还是很有用的,现在一般很少用这招了。还有一个地方pre-training可以大显身手的。如果你有大量的 unlabeled data,可以用这些unlabeled data去train出W1、W2、W3,然后用少量的labled data去微调W1、W2、W3、W4。