Press "Enter" to skip to content

AutoEncoder

自编码AutoEncoder是一种无监督学习的算法,他利用反向传播算法,让目标值等于输入值。什幺意思呢,下面举个例子

 

有一个神经网络,它在做的事情是,输入一张图片,通过一个Encoder神经网络,输出一个比较”浓缩的”feature map。之后将这个feature map通过一个Decoder网络,结果又将这张图片还原回去了

 

你也可以这幺理解,整个Encoder+Decoder是一个神经网络,中间的code只是暂存的数据

 

 

感觉就像是,现在有一锅红糖水,你不停的煮它,最终水都被煮干了,只剩下红糖,这个红糖就是上图的”Code”。然后你再向红糖里面注水、加热,结果又还原回了一锅红糖水

 

假设上面的神经网络展开如下图所示,可以看出,图片经过了一个压缩,再解压的工序。当压缩的时候,原有的图片质量被缩减。解压时,用信息量少却包含所有关键信息的文件恢复出了原本的图片。为什幺要这样做呢?

 

 

因为有时候神经网络要接受大量的输入信息,比如说输入信息是高清图片时,信息量可能高达上千万,让神经网络直接从上千万个信息中进行学习是很吃力的。所以,为何不压缩一下,提取出原图片中最具代表性的信息,缩减输入信息量,再把缩减后的信息带入进行网络学习。这样学习起来就轻松多了

 

How to Train?

 

下图是一个AutoEncoder的三层模型,其中$W^*=W^T$,$W^*$没有什幺含义,仅仅是个变量名字而已,用来区分$W$,你也可以管$W^*$叫$W’$

 

 

Vincent在2010年的 论文 中做了研究,发现只要单组$W$就可以了,即$W^*=W^T$。$W^*$和$W^T$称为Tied Weights(绑定的权重),实验证明,$W^*$真的只是在打酱油,完全没有必要去训练

 

如果是实数作为输入,Loss function就是

 

$$ L(f(x))=\frac{1}{2}\sum_k (\hat {x}_k-x_k)^2 $$

 

如果输入是binary的,即01值,那幺就是

 

$$ L(f(x))=-\sum_k (x_k log(\hat{x}_k)+(1-x_k)log(1-\hat{x}_k)) $$

 

PCA V.S. AutoEncoder

 

同样都是降维,PCA和AutoEncoder谁的效果更好呢?

 

首先从直觉上分析,PCA本质上是线性的变换,所以它是有局限性的。而AutoEncoder是基于DNN的,由于有activation function的存在,所以可以进行非线性变换,使用范围更广

 

下图展示了MNIST数据集分别经过PCA和AutoEncoder 降维再还原 后的效果。第二行是是使用AutoEncoder的方法,可以看到几乎没什幺太大变化;而第四行的图片很多都变得非常模糊了。说明PCA的效果是不如AutoEncoder的

 

 

Denoising AutoEncoders

 

Vincent在2008的 论文 中提出了AutoEncoder的改良版——dA,论文标题叫”Extracting and Composing Robust Features”,译成中文就是”提取、编码出具有鲁棒性的特征”

 

首先我们考虑,为什幺会产生这样的变种AutoEncoder。如果我们仅仅只是在像素级别对一张图片进行Encode,然后再重建,这样就无法发现更深层次的信息,很有可能会导致网络记住了一些特征。为了防止这种情况产生,我们可以给输入图片加一些噪声,比方说生成和图片同样大小的高斯分布的数据,然后和图像的像素值相加(见下图)。如果这样都能重建原来的图片,意味着这个网络能从这些混乱的信息中发现真正有用的特征,此时的Code才能代表输入图片的”精华”

 

 

关键是,这样胡乱给原始图片加噪声真的科学吗?Vincent从大脑认知角度给了解释。Paper中说到:

 

人类具有认识被阻挡的破损图像的能力,源于我们高等的联想记忆感受机能

 

就是说,我们能以多种形式去记忆(比如图像、声音),所以即便是数据破损丢失,我们也能回想起来

Be First to Comment

发表评论

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