放牧代码和思想
专注自然语言处理、机器学习算法
    时间有限,只有GitHub上的issue能及时处理,大约每周末一次。另外,不要叫我楼主,谢谢。

Hinton神经网络公开课15 Modeling hierarchical structure with neural nets

目录

2017年06月04日20-30-32.png2017年06月04日21-47-30.png2017年06月04日21-40-09.png2017年06月04日21-36-22.png2017年06月04日20-28-52.png2017年06月04日20-25-11.png2017年06月04日21-20-32.png2017年06月04日21-02-01.pngEnron.jpg虽然是倒数第二课,但只要前面的认真听了,这节课就会觉得相当简单。

从主成分分析到自动编码器

先复习一下PCA,这是一种找出高维数据附近的linear manifold,用这上面的映射来表示数据本身的方法。linear manifold定义如下:

hankcs.com 2017-06-04 上午10.10.09.png

通过标准的SVD方法可以高效地得到主成分,而通过神经网络反而要低效一些。使用神经网络的目的是,可以通过多层非线性函数来将数据投影到curve manifold(这种表达更强大)上去处理。

PCA

从N维数据中找出M个正交的方向,让数据在这些方向上的方差最大,忽略那些差别不大的方向。这M个主方向形成了低维的子空间,N维数据点在该子空间的投影可以保留主要信息,丢失次要信息。重建的时候利用$N-M$这些维度上的均值补全丢失的维度,误差是与原数据点的距离。

这个过程可以通过下图体现:

2017年06月04日16-35-42.png

数据点是从高斯分布采样的二维点,取方差最大的一维主方向,则红点在主方向上的投影的是绿点。由于所有数据在另一方向上的均值与绿点相同,所以从一维点(绿点)重建后的二维点还是绿点。绿点与红点之间的距离为误差。

使用反向传播低效地实现PCA

尝试让神经网络的输出与输入一致,如果隐藏层像“瓶颈”一样很小的话,则其可以作为主成分,或类似主成分的东西。

2017年06月04日19-22-51.png

上图中,输入投影到隐藏层,从隐藏层重建输出;尽量使输入与输出相似,那么隐藏层的激活值就形成了对输入有效的编码。

如果输入和输出层都是线性的,则整个网络就是对数据的线性方程。如果学习是最小化平方误差的话,则这与PCA的目标一样。两者的子空间可能是一样的,但坐标轴可能存在旋转或偏移。流入code的权值代表成分的方向,可能不是正交的。与PCA不同,数据在各个方向上的方差可能是相等的。少量数据上速度可能不如SVD,但大量数据时可能速度更快。

使用反向传播泛化PCA

之所以要用反向传播代替PCA,是因为在code前后使用非线性层就可以得到非线性的manifold。

2017年06月04日19-36-56.png

除了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实现的,其结构如下:

2017年06月04日19-50-05.png

输入是784像素的图像。编码器是预训练的层叠RBM,解码器是其转置。RBM训练完毕后,用反向传播fine-tune一下。此处使用交叉熵作为目标函数,因为用的是逻辑斯谛单元。在反向传播的过程中,编码器和解码器的权值不再是转置的关系,而是发生了轻微的改变。

压缩效果对比

对比两者将手写数字压缩为30维实值向量再还原的效果:

2017年06月04日19-56-13.png

Deep Autoencoder表示数据的能力明显更强。

Deep Autoencoder应用于文档检索与可视化

这种应用以前挑大梁的是LSA潜在语义分析,也就是将文档的词频特征向量应用PCA。得到的code可被用于判断文档相似度,于是可以用来做文档检索。如果Deep Autoencoder比PCA得到的code更好,那么该code对文档检索的效果也应该理所当然地更好。Hinton老爷子发现,利用Deep Autoencoder编码的10维code,效果与LSA的50维以上相当。如果用2维编码,得到的图像也比LSA要好。

寻找相似文档

语言模型是词袋,特征选择是词频+去除停用词。

2017年06月04日20-05-33.png

如果直接用这个向量的话,则太大了,很低效。降维但不损失大部分信息后可以提高速度。

压缩特征向量

网络结构如下:

2017年06月04日20-07-35.png

code是10维的,只要比较这个code就行了。

重建词袋所需的非线性

由于词频与像素强度不同,所以需要预处理。具体方法是将词频除以词袋中的总词频,得到该单词出现的概率。于是特征向量就是一个概率向量,表示从文档随机挑选一个词得到该词的概率。

输出上面加了一个softmax,于是也得到了概率向量。在训练第一个RBM的时候,则需要将激活值乘以N(N是文档的总词频),因为一共采样了N次。如果不做这个处理的话,则输入到第一个隐藏层的weight就实在太小了。

试验效果

词袋大小2000,文档数400,000,类别数100,训练编码器与LSA比较。在另外400,000测试文档中挑一个,用code与其余文档的code做余弦夹角排序。将检索到的文档与属于相同分类的文档数目一同画出来。结果如下:

2017年06月04日20-25-11.png

可见自动编码器10维的code就比LSA 50维的效果都要好。

二维对比

用能用上的最好的手段作二维PCA,每个点按分类着色,得到下图:

2017年06月04日20-28-52.png

可见PCA后的数据不太区分得开,基本上混淆在一起了。

而自动编码器的区分能力则强大得多:

2017年06月04日20-30-32.png

中间的文档可能是单词数过少,实在不好区分。 这种可视化的用处非常大,比如如果某个绿点是安然公司的财报,那么其附近的绿点对应的公司的股票肯定是垃圾股。

Enron.jpg

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » Hinton神经网络公开课15 Modeling hierarchical structure with neural nets

分享到:更多 ()

评论 欢迎留言

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我的开源项目

HanLP自然语言处理包基于DoubleArrayTrie的Aho Corasick自动机