Press "Enter" to skip to content

深度网络能否拟合F(X)=X?

Author: Zongwei Zhou | 周纵苇

 

Weibo:@MrGiovanni

 

Email: [email protected]

引子

 

近年来红得发紫的深度网络在很多方面都表现出了卓越的实力,比如计算机视觉中的物体分类,分割,边界检测等等,这种非线性的结构实际是源自神经网络,它不但可以自动的去学习到图像的特征,而且可以拟合很多很多复杂的决策边界函数。我的问题是: 这种神经网络能否拟合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 LearningSelf-Supervised Learning )。但是它存在的问题在于:

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注