本节参考的是网页http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial中关于Building Deep Networks for Classification一节的介绍。分下面2大部分内容:
1. 从self-taught到deep networks:
从前面的关于self-taught learning介绍(Deep learning:十五(Self-Taught Learning练习))可以看到,该ML方法在特征提取方面是完全用的无监督方法,本次要讲的就是在上面的基础上再用有监督的方法继续对网络的参数进行微调,这样就可以得到更好的效果了。把self-taught learning的两个步骤合在一起的结构图如下所示:
很显然,上面是一个多层神经网络,三层。
一般的,前面的无监督学习到的模型参数可以当做是有监督学习参数的初始化值,这样当我们用有大量的标注了的数据时,就可以采用梯度下降等方法来继续优化参数了,因为有了刚刚的初始化参数,此时的优化结果一般都能收敛到比较好的局部最优解。如果是随机初始化模型的参数值的话,那么在多层神经网络中一般很难收敛到局部较好值,因为多层神经网络的系统函数是非凸的。
那么该什么时候使用微调技术来调整无监督学习的结果呢?只有我们有大量标注的样本下才可以。当我们有大量无标注的样本,但有一小部分标注的样本时也是不适合使用微调技术的。如果我们不想使用微调技术的话,那么在第三层分类器的设计时,应该采用级联的表达方式,也就是说学习到的结果和原始的特征值一起输入。当然了,如果采用了微调技术,则效果更好,就不需要继续用级联的特征表达了。
2. Deep networks小综述:
如果使用多层神经网络的话,那么将可以得到对输入更复杂的函数表示,因为神经网络的每一层都是上一层的非线性变换。当然,此时要求每一层的activation函数是非线性的,否则就没有必要用多层了。
Deep networks的优点:
一、比单层神经网络能学习到更复杂的表达。比如说用k层神经网络能学习到的函数(且每层网络节点个数时多项式的)如果要用k-1层神经网络来学习,则这k-1层神经网络节点的个数必须是指数级庞大的数字。
二、不同层的网络学习到的特征是由最底层到最高层慢慢上升的。比如在图像的学习中,第一个隐含层层网络可能学习的是边缘特征,第二隐含层就学习到的是轮廓什么的,后面的就会更高级有可能是图像目标中的一个部位,也就是是底层隐含层学习底层特征,高层隐含层学习高层特征。
三、这种多层神经网络的结构和人体大脑皮层的多层感知结构非常类似,所以说有一定的生物理论基础。
Deep networks的缺点:
一、网络的层次越深,所需的训练样本数越多,如果是用有监督学习的话,那么这些样本就更难获取,因为要进行各种标注。但是如果样本数太少的话,就很容易产生过拟合现象。
二、因为多层神经网络的参数优化问题是一个高阶非凸优化问题,这个问题通常收敛到一个比较差的局部解,普通的优化算法一般都效果不好。也就是说,参数的优化问题是个难点。
三、梯度扩散问题。因为当网络层次比较深时,在计算损失函数的偏导时一般需要使用BP算法,但是这些梯度值随着深度慢慢靠前而显著下降,这样导致前面的网络对最终的损失函数的贡献很小。这样的话前面的权值更新速度就非常非常慢了。一个理论上比较好的解决方法是将后面网络的结构的神经元的个数提高非常多,以至于它不会影响前面网络的结构的学习。但这样岂不是和低深度的网络结构一样了吗?所以不妥。
所以一般都是采用的层次贪婪训练方法来训练网络的参数,即先训练网络的第一个隐含层,然后接着训练第二个,第三个…最后用这些训练好的网络参数值作为整体网络参数的初始值。这样的好处是数据更容易获取,因为前面的网络层次基本都用无监督的方法获得,很容易,只有最后一个输出层需要有监督的数据。另外由于无监督学习其实隐形之中已经提供了一些输入数据的先验知识,所以此时的参数初始化值一般都能得到最终比较好的局部最优解。比较常见的一种层次贪婪训练方法就是stacked autoencoders。它的编码公式如下所示:
解码公式如下:
最后的就是用stacked autoencoders学习到的参数来初始化整个网络了,此时整个网络可以看做是一个单一的神经网络模型,只是它是多层的而已,而通常的BP算法是对任意层的网络都有效的。最后的参数调整步骤和前面学习到的稀疏编码模型是一样的。其过程截图如下:
参考资料:
http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial