别看本文没有几页纸,本着把经典的文多读几遍的想法,把它彩印出来看,没想到效果很好,比在屏幕上看着舒服。若用蓝色的笔圈出重点,这篇文章中几乎要全蓝。字字珠玑。
Reducing the Dimensionality of Data with Neural Networks
G.E. Hinton and R.R. Salakhutdinov
摘要
训练一个带有很小的中间层的多层神经网络,可以重构高维空间的输入向量,实现从高维数据到低维编码的效果。(原文为high-dimensional data can be converted to low-dimensional codes)在这样的Autoencoder network中,通常使用Gradient Descent方法来对网络权重进行微调(Fine-tuning),这样做有效的前提是初始的网络权重足够好。(原文this works well only if the initial weights are close to a good solution.)本文提出了一个有效的初始化网络权重的方法,使得采用deep autoencoder network学习到的低维编码优于PCA降维的结果。
背景介绍
PCA(Principal Components Analysis)主成分分析是一个被广泛采用的用来降维的方法。它旨在找到数据点的方差最大的方向,并用这些方向作为坐标来表示数据集中的各个点。(PCA finds the directions of greatest variance in the data set and represents each data points by its coordinates along each of these directions.)
Autoencoder: 我们采用了一种非线性的PCA的泛化版本,该方法使用了一个自适应的多层编码网络,将数据从高维变为低维的编码,以及一个类似的解码网络从低维编码中对数据进行重构。 采用随机权重对网络初始化,通过最小化原始数据与重构数据之间的误差来对网络的整体结构进行训练。采用链式法则计算梯度,并将梯度向后传播以更新网络权重。
问题来了~~~~
对于autoencoder来说,初始权重的设置非常重要,过大,则会导致陷入坏的局部最优;过小,则会导致训练困难。只有找到一个好的初始化权重,才能保证后续的梯度算法能够收敛到一个理想的局部解。找到这样的一个初始化权重需要对每一层尝试许多类型的算法 ,因此本文引入了pretraining的过程。(好好理解:Finding such initial weights requires a very different type of algorithm that learns one layer of features at a time.)
方法概览
以binary data为例,说明pretraining的过程
用RBM(Restricted Boltzmann Machines)来建模binary data,由visible layer与hidden layer构成。以image为例,pixels对应RBM的visible units ,feature detectors对应RBM的hidden units ,则visible与hidden units共同对应的energy函数有如下定义:
通过该能量函数赋予每个image一个概率。通过调节权重以及偏差,来降低真实image的能量,提高虚构image的能量,使得网络更加倾向于那些真实的数据。RBM的结构好:给定h,v之间是条件独立的,给定v,h之间是条件独立的。有如下公式:
权重w的调整方法:注意:该调整策略并非严格按照能量公式所对应的概率目标函数求导得到的~~其中,是学习速率,对应真实图像pixel i与feature detector j一起出现的概率,对应虚构图像的概率。
pretraining的过程:learning one layer of feature detector->将该层的输出作为第二层feature学习的输入数据(原文:treat activities as data for learning a second layer of features.),也就是说第一层的feature detector作为第二层RBM的visible units。(原文:The first layer of feature detectors then become the visible units for learning the next RBM.)这种逐层学习的思想可以重复多次。
可以证明的是,给定每层的单元数目不减少,有正确的初始化weight,多加一层,可以改善模型概率似然的下界。 (原文:Adding an extra layer always improves a lower bound on the log probability that the model assigns to the training data, provided the number of feature detectors per layer does not decrease and their weights are intialized correctly.)
逐层的训练方法对于pretrain deep autoencoder是非常有效的方法。(原文: The layer-by-layer learning algorithm is a very effective way to pretrain the weights of a deep autoencoder. )每层的feature能够很好的捕捉层间activities的强度以及高阶相关性。对于大多数想要揭示数据的低维、非线性特征来说,逐层训练是一个有效的方法。
纵观整个deep autoencoder可以分为pretraining,unfolding以及fine-tuning三个阶段。pretraining就是上述描述的逐层训练的过程。unfolding是将pretraining阶段学到的weight用于编码与解码的过程,从而得到真正的autoencoder的结构。fine-tuning指的是采用bp算法对整个autoencoder的结构的权重进行微调。
泛化到Continuous data将visible units由原来的stochastic binary variable替换为linear units with Gaussian Noise。在实验中,所有的visible units都是这种情况的。
实验:
模拟数据
MNIST数据集
Reuter Corpus:The autoencoder clearly outperformed latent semantic analysis, a well known document retrieval method based on PCA.(应该是从优化目标函数的角度来说PCA与LDA的关系)
总结:
Pretraining的好处:由于网络权重中的大部分信息来源于原始数据本身,因此pretraining的泛化性能好。
label中所蕴含的有限信息仅仅适合对网络权重做微调。
从以前的实验经验中可以看出这一点是非常正确的。
Deep Autoencoder早在1980年就已经提出,事实上它对于非线性维度归约(nonlinear dimensionality reduction)来说是非常有效的。但是它需要的三个条件迄今才满足:(1)Computers are fast enough; (2)data sets are big enough; (3)the initial weights are close enough to a good solution。
Autoencoders give mappings in both directions between data and code spaces.