深度网络初探

基本概念

若是已经学过了以前的课程,深度网络的概念很好理解:
git

在输入层如输出层之间加入若干由稀疏自编码器(Sparse autoencoder)构成的隐藏层(Hidden layer,一般多于2层),造成一个多层人工神经网络,是为【深度网络】,对这个网络的训练过程也称为【深度学习】。github

因为每一个隐藏层都是一个稀疏自编码器,它能对上层传来的数据作特征提取,所以多个隐藏层可以提取原数据的高阶特征,高阶特征就意味着更复杂的特征。算法

使用深度网络最主要的优点在于,它能以更加紧凑简洁的方式来表达比浅层网络大得多的函数集合。网络

而且,这种【逐层抽象】的工做方式与大脑皮层是相似的。虽然没有人知道模仿大脑是不是通向通用 AI 的必经之路,就比如飞机不必定像鸟同样才能飞,可是就目前的实践来看,深度网络的效果还不错。
机器学习


数学过程

逐层贪婪训练方法

逐层贪婪算法的主要思路是每次只训练网络中的一层,即咱们首先训练一个只含一个隐藏层的网络,仅当这层网络训练结束以后才开始训练一个有两个隐藏层的网络,以此类推。
函数

即从第1个隐藏层开始,把上一层的数据做为输入训练一个稀疏自编码器,每次只训练一层,直到把全部的隐藏层都训练完成,最后再训练输出层(一般是一个分类器)。学习

这样作有两个好处:优化

  1. 只须要无标记数据,而无标记数据相比有标记数据廉价的多;编码

  2. 能使参数位于解空间中较好的位置上,以这些位置为起点开始梯度降低更有可能收敛到比较好的局部极值点,这是由于无标签数据已经提供了大量输入数据中包含的模式的先验信息。spa

栈式自编码算法

就是逐层训练稀疏自编码器的算法。该算法较简单,其伪代码描述:

for i = 1 : numberOfHiddenLayers
    if i==1
        使用全量数据训练第i个隐藏层;
    else
        使用 features(i-1) 训练第i个隐藏层;
    end
    features(i) = 第i个隐藏层从上游数据中提取的特征;
end

使用 features(numberOfHiddenLayers) 训练分类器;

微调多层自编码算法

在逐层训练完成后,参数已经被逐层初始化,此时将深度网络做为一个总体,构建代价函数并应用梯度降低等优化算法对参数进行进一步调整,是为【微调】(fine-tuning)。

若是将 softmax 做为最后的分类器,那么 softmax 的代价函数就是整个网络的代价函数:

不一样的是这个代价函数不只是 θ 的函数,还隐性地包括了全部隐藏层的参数。在优化以前必须先计算 J 对全部参数的偏导数。

求导的过程以下:

使用前向传播算法计算每一层的输出

这一步在数学上和代码上都不难。

使用反向传播算法计算每一层的残差

我认为前向与反向传播中有几个要注意的点:

  1. 计算输出层的残差

    对每一条样本都要计算在各层的残差,而且在求导的时候使用单条样本的代价函数。

  2. softmax 的训练要计入截距项(bias term)

    在训练隐藏层的时候,咱们把输入数据和截距项的参数分开表示和计算(W 和 b),但在 softmax 中,一般把它们合在一块儿统一表示(θ),至少本文是这么作的,你也能够实现一个分开表示的版本。

    所以传给 softmax 数据须要在末尾增长一个维度,其值为 +1,且参数初始化的时候要把截距项的参数包括进去。

  3. 高阶特征(深层自编码器)的可视化

    这是一个相对目前教程进度更复杂的问题,因此课后做业并无要求将高阶特征可视化。但可视化能带来的一个明显好处就是提供对高阶特征的一个直观表达,或人类能看懂的表达,因为人类大脑皮层的工做方式相似,这也许还能帮助咱们理解大脑逐层的抽象原理。

    高阶特征可视化存在不止一种方法,已经有不少论文探讨了这个问题:

    论文1 

    论文2

    知乎上的讨论

    本文采用最简单的“权值内积”方法来可视化深层特征。

    我会再专门研究下这个问题,也许会再开一篇文章作一番更全面的讨论。

计算 J 对每一个参数的偏导

惟一的难点就是向量化,若是已完成了 sparse autoencoder 和 softmax 的做业,只需将代码复用便可。


课后做业

做业代码

本章的课后做业将以前每章的代码做为不一样部件整合起来造成一个深度网络系统。其中的部件包括稀疏自编码器、softmax分类器等自己就是相对小型的机器学习系统,因此整个训练过程较复杂,容易出错。

stackedAEExercise.m

stackedAECost.m

计算结果:

相关文章
相关标签/搜索