Author: Zongwei Zhou | 周纵苇
Weibo: @MrGiovanni
Email: zongweiz@asu.edu
引子
近年来红得发紫的深度网络在很多方面都表现出了卓越的实力,比如计算机视觉中的物体分类,分割,边界检测等等,这种非线性的结构实际是源自神经网络,它不但可以自动的去学习到图像的特征,而且可以拟合很多很多复杂的决策边界函数。我的问题是:这种神经网络能否拟合f(x)=x这个最简单的函数呢?
换句话说,就是输入网络的一幅图X,经过各种乱七八糟的变换,最后的输出能否还是原图X不变?
首先想到的应该是Auto-Encoder吧,Hinton早在2006年就把它发表在了Science上了( Reducing the Dimensionality of Data with Neural Networks),一幅图经过了编码-解码器,最后还是回到这幅图本身,它的一个应用是图像压缩。试想一个1M的图像,经过编码变成了一个很小的向量,这个向量很小,可能只有几个K,它是原图丰富特征的抽象表征,储存起来特别的省空间,当我们想看原图的时候,只需把这个小小的向量放到解码器即可,理想情况下,1M的图像又回来了。就像饼干,你用一个编码器把它变成压缩饼干,想吃的时候用解码器再把它恢复原样。像金箍棒,不用的时候用编码器把它变小放耳朵,用的时候解码成那么大。
可惜的是,变回来的图可能已经不是原来那个图了。一个不那么恰当的例子是,本来一个很开心的人,你扇他一巴掌,然后给一颗红枣,他还是原来那个开心的人吗?有损失吧。一样的,对于编码解码器,它所还原出来的图像是有信息损失的。这么想,和质量守恒定律类似,信息量也是守恒的,不会凭空的产生。压缩了信息相当于剔除了一些信息,这是不能被恢复的。一个几K的vector怎么可能会平白无故地还原成几M的原图呢?丢失的信息就是泼出去的水。这是一篇很不错的关于auto encoder应用的技术博客:Building Autoencoders in Keras。所以深度网络不能拟合F(X)=X函数喽,还没完。
刚刚说信息不会凭空消失,所以1M的图,变成1K的向量,是不可能还原成1M的原图的,可是如果我把1M的图,变成1G的向量,能不能还原成1M的原图呢?
有人可能会说,这算哪门子的压缩啊,越压越大吗??
压缩毕竟不是Auto-Encoder的全部作用吧,这里我们的目标就不是压缩了,而是就想拟合F(X)=X,不管花多少代价。
那么我的第六感是,在理论上(我还不知道什么理论),无损mapping是可以用深度网络做到的[?]
这个问题的英文描述是:
Identity mapping < F(X)=X > ensures that the output of some multilayer neural net is equal to its input. Such a net is also named as replicator.
列出一些相关读物:
- difference between replicator networks and autoencoders
- Approximate realization of identity mappings by three‐layer neural networks (谁有办法下到这篇文章?)
- Andrew Ng Sparse Auto-encoder Notes
- Xiaogang Wang. Autoencoder. 2015
实验
先设计一个简单的实验:输入是一个784长的vector,希望得到的输出是它本身,这里需要着重考虑的变量就是encoding_dim。正常来讲是比784要小的值,但是为了减少信息损失,我们也用784,甚至比它更大的值。
from keras.layers import Input, Dense
from keras.models import Model
# this is the size of our encoded representations
encoding_dim = 32 # 32 floats -> compression of factor 24.5, assuming the input is 784 floats
# this is our input placeholder
input_img = Input(shape=(784,))
# "encoded" is the encoded representation of the input
encoded = Dense(encoding_dim, activation='relu')(input_img)
# "decoded" is the lossy reconstruction of the input
decoded = Dense(784, activation='sigmoid')(encoded)
# this model maps an input to its reconstruction
autoencoder = Model(input_img, decoded)
# this model maps an input to its encoded representation
encoder = Model(input_img, encoded)
# create a placeholder for an encoded (32-dimensional) input
encoded_input = Input(shape=(encoding_dim,))
# retrieve the last layer of the autoencoder model
decoder_layer = autoencoder.layers[-1]
# create the decoder model
decoder = Model(encoded_input, decoder_layer(encoded_input))
从实验的结果上说,无论encoding_dim设的什么大小,都没有办法完美实现F(X)=X,甚至在训练集上都无法实现。这个博客(Building Autoencoders in Keras)展示了结果的示意图。但是!实验结果无法实现不代表理论上无法实现。怎么办,理论弱、
并且我认为神经网络里面很多操作都会损失信息,就拿上面的这个简单的Auto-encoder来讲,激活函数relu就是一个例子,对于大于零的值,确实是无损激活y=x,但是对于小于零的,却直接就取零了,赤裸裸的损失了信息,或许可以调整成linear,或者干脆不要激活函数。what about最后的sigmoid,讲道理也是有损失的,可能需要加一个batch normalization,BN在我看来还算是属于无信息损失的操作。另外,为了实现精准的一对一mapping,在loss function的设计上也许也需要一些考量。好吧,我越来越不确定自己在说什么了。。。
为什么要讨论深度网络对F(X)=X函数的拟合?
不卖关子了,写这么多废话是为了思考一个在Generative Adversarial Nets研究中一个比较有趣的问题,也就是无损地用GAN来做一系列的变换。因为GAN中的generator实质上就是一个类似auto encoder的结构。一个刚刚在ICLR 2018中发表的相关工作是“UNSUPERVISED REPRESENTATION LEARNING BY PREDICTING IMAGE ROTATIONS”。关于这个问题的讨论,属于比较偏理论的,或者比较高层次的GAN研究——因为它还暂时没有一个比较好的应用载体(这篇论文中用这个来做图像表征的研究),研究的目的就是为了对GAN深入理解。文章虽短,但是思想很有意思。说用GAN来学习图像的旋转——论文中只限于90,180,270度这样的无信息损失的旋转,因为其他任意角度需要对原图做差值。
一个非常难解决的问题就是:如何用深度网络学一个一对一的mapping?
因为input和output的所有像素都是一一对应的,唯一的差别就是重新排列了一下像素。上面提到的论文并没有专门提炼出这个问题,我把它提出来,但是目前没有答案。另一篇相关的论文也发表在ICLR 2018上,题为:ITERATIVE GANS FOR ROTATING VISUAL OBJECTS,还有它的增常版本在arxiv上了“IterGANs: Iterative GANs to Learn and Control 3D Object Transformation”。
关于用GAN来学习图像的旋转和平移,可不可以Generator根本就不凭空去“创造”像素,而是输出一个原像素的动态移动的指令map,这样可以确保的是原像素值不变,只是物理的移动。只需要把这个指令map作用在原图中,就可以实现图像的无损平移和旋转啦。
训练Auto-encoder的另一个应用是Self-Supervised (Feature) Learning (A Survey to Self-Supervised Learning和Self-Supervised Learning)。但是它存在的问题在于:
网友评论