目录
虽然是倒数第二课,但只要前面的认真听了,这节课就会觉得相当简单。
从主成分分析到自动编码器
先复习一下PCA,这是一种找出高维数据附近的linear manifold,用这上面的映射来表示数据本身的方法。linear manifold定义如下:
通过标准的SVD方法可以高效地得到主成分,而通过神经网络反而要低效一些。使用神经网络的目的是,可以通过多层非线性函数来将数据投影到curve manifold(这种表达更强大)上去处理。
PCA
从N维数据中找出M个正交的方向,让数据在这些方向上的方差最大,忽略那些差别不大的方向。这M个主方向形成了低维的子空间,N维数据点在该子空间的投影可以保留主要信息,丢失次要信息。重建的时候利用$N-M$这些维度上的均值补全丢失的维度,误差是与原数据点的距离。
这个过程可以通过下图体现:
数据点是从高斯分布采样的二维点,取方差最大的一维主方向,则红点在主方向上的投影的是绿点。由于所有数据在另一方向上的均值与绿点相同,所以从一维点(绿点)重建后的二维点还是绿点。绿点与红点之间的距离为误差。
使用反向传播低效地实现PCA
尝试让神经网络的输出与输入一致,如果隐藏层像“瓶颈”一样很小的话,则其可以作为主成分,或类似主成分的东西。
上图中,输入投影到隐藏层,从隐藏层重建输出;尽量使输入与输出相似,那么隐藏层的激活值就形成了对输入有效的编码。
如果输入和输出层都是线性的,则整个网络就是对数据的线性方程。如果学习是最小化平方误差的话,则这与PCA的目标一样。两者的子空间可能是一样的,但坐标轴可能存在旋转或偏移。流入code的权值代表成分的方向,可能不是正交的。与PCA不同,数据在各个方向上的方差可能是相等的。少量数据上速度可能不如SVD,但大量数据时可能速度更快。
使用反向传播泛化PCA
之所以要用反向传播代替PCA,是因为在code前后使用非线性层就可以得到非线性的manifold。
除了code之外,前后的两层都是非线性的,分别是编码器和解码器,对应着双向的映射。这是一个用监督方法进行非监督学习的有趣例子。
Deep Autoencoders
早在80年代人们就尝试着用Deep Autoencoders替代PCA,但那时候训练出来的效果就是比不上PCA。直到后来用上了pre-training,Deep Autoencoders才胜过了PCA。
Deep Autoencoders的优势如下:
-
提供双向灵活的映射
-
训练时间是训练实例数目的线性函数
-
最终的编码器速度快(一串矩阵乘法)
但其训练实在是非常难。
-
如果以小权值起步,则反向传播中梯度会消失
后来发明了许多更好的训练方法。
-
unsupervised layer-by-layer pre-training
-
或者小心地初始化权值训练Echo-State Nets
第一个成功的Deep Autoencoder
是由Hinton & Salakhutdinov, Science, 2006实现的,其结构如下:
输入是784像素的图像。编码器是预训练的层叠RBM,解码器是其转置。RBM训练完毕后,用反向传播fine-tune一下。此处使用交叉熵作为目标函数,因为用的是逻辑斯谛单元。在反向传播的过程中,编码器和解码器的权值不再是转置的关系,而是发生了轻微的改变。
压缩效果对比
对比两者将手写数字压缩为30维实值向量再还原的效果:
Deep Autoencoder表示数据的能力明显更强。
Deep Autoencoder应用于文档检索与可视化
这种应用以前挑大梁的是LSA潜在语义分析,也就是将文档的词频特征向量应用PCA。得到的code可被用于判断文档相似度,于是可以用来做文档检索。如果Deep Autoencoder比PCA得到的code更好,那么该code对文档检索的效果也应该理所当然地更好。Hinton老爷子发现,利用Deep Autoencoder编码的10维code,效果与LSA的50维以上相当。如果用2维编码,得到的图像也比LSA要好。
寻找相似文档
语言模型是词袋,特征选择是词频+去除停用词。
如果直接用这个向量的话,则太大了,很低效。降维但不损失大部分信息后可以提高速度。
压缩特征向量
网络结构如下:
code是10维的,只要比较这个code就行了。
重建词袋所需的非线性
由于词频与像素强度不同,所以需要预处理。具体方法是将词频除以词袋中的总词频,得到该单词出现的概率。于是特征向量就是一个概率向量,表示从文档随机挑选一个词得到该词的概率。
输出上面加了一个softmax,于是也得到了概率向量。在训练第一个RBM的时候,则需要将激活值乘以N(N是文档的总词频),因为一共采样了N次。如果不做这个处理的话,则输入到第一个隐藏层的weight就实在太小了。
试验效果
词袋大小2000,文档数400,000,类别数100,训练编码器与LSA比较。在另外400,000测试文档中挑一个,用code与其余文档的code做余弦夹角排序。将检索到的文档与属于相同分类的文档数目一同画出来。结果如下:
可见自动编码器10维的code就比LSA 50维的效果都要好。
二维对比
用能用上的最好的手段作二维PCA,每个点按分类着色,得到下图:
可见PCA后的数据不太区分得开,基本上混淆在一起了。
而自动编码器的区分能力则强大得多:
中间的文档可能是单词数过少,实在不好区分。 这种可视化的用处非常大,比如如果某个绿点是安然公司的财报,那么其附近的绿点对应的公司的股票肯定是垃圾股。
知识共享署名-非商业性使用-相同方式共享:码农场 » Hinton神经网络公开课15 Modeling hierarchical structure with neural nets