1. 什么是auto-encoder
- 主要有两个部件:encoder和decoder,简单采用背靠背的全连接层,形成一个瓶颈neck就为经典AutoEncoder的架构核心,层数一般不多,以1或2层隐含层为主
- 一个encoder,作用好比输入一张图片丢入网络输出一个code(code是一个输入目标的压缩代表),
- 一个decoder,输入一个code,丢入该网络,生成一个图片,能够重建原来的图像
这两个NN,不能单独训练,需要一起学
2. PCA
与PCA有类似的思想
PCA就是输入图片x (x 往往减去平均x,这里省略掉了,因为往往图片起手就是标准化) ,x会乘上w,得到c,c再乘上wT,得到
⌢
x
\frown x
⌢x
如果把它当成NN来看,
- 输入x 就是input layer,输出的x就是 output layer
- 中间component的weight就是hidden layer(往往叫bottleneck later,因为得到code数目要小,所以layer都特别窄)
- w就是做encode,wT是decode,那么code就是我们想要的
3. deep auto-encoder
提出了更深层次的auto-encoder
中间窄的layer可以作为encode,input layer-bottle之间就是encode,bottle-output layer就是decode,这里的对称每个层weight是互为转置的,这样就会使得参数少一半,不会overfit的,但也不一定这样做,往往就是直接整个网络训练过来
4. PCA与deep auto-encoder的结果
(后者更加清晰)
如果将30维降到2维,你会发现PCA会混起来(不同颜色代表不同数字),而auto-enocder是分开的
5. auto-encoder用途
5.1 auto-encoder 可以做图片搜索
我们可以使用像素上面的 Euclidean 距离,你会发现搜索上面的结果可以会有偏差,比如用迈克尔杰克逊,上面就是搜索的结果
使用auto-encoder后
上面的图片就是code再重建回来的结果,如果在code上面算相似度,找到的都是人脸
5.2 auto-encoder 预训练DNN
我们会先训练一个auto encoder,使得输入与输出接近,训练之后,把w1固定住,我们崽训练下一个auto-encoder,也就是当作输入1000维,输出1000维,使两者越接近越好,以此类推,最后w4随机初始化,之后用backpropagation微调
现在不预训练也可以训练
5.3 auto-encoder CNN
pooling与unpooling
pooling每四个选取最大的,并记录位置,unpooling时候把除了记录的位置补0,这样会使得图片变大,效果如下
当然还有其他做法,也可以使用maxpooling后结果,每个赋值四份
convolution和deconvolution
其实deconvolution就是convultion
我们使用一维的
使用窗口为3的进行filter,下面的是convolution
convolution3个值变一个值,那么deconvlution就是一个值变成3个值,但是会出现重复的值,也是下面图并列的,所以我们把他们相加,其实我们可以将图片转化为右边的计算过程(里面计算的是一模一样的),也就是padding之后进行convlution操作
6. 有趣的事情
我们用训练encoder产生vector
我们也可以使用decoder生成新的image,将784的image通过hidden layer 输出vector后映射到2维,再把2维的 通过hidden layer解回图片,在encoder的部分,二维画出来如左图,不同颜色不同数字,我们在红色中间,等间隔sample,得到如右图的结果,发现神奇的现象,一个过度化的现象
会发现左上角比较差,因为这边是没有图片的,这里是如何选出sample的地方(也就是红框)呢?是有值的像图片的,这是人为将映射到2维观察出来的,那我们不降维的话,我们可以使用regularization,保证接近0的地方,然后就可以0为中心等距sample,就像下面的图