UFLDL之栈式自编码

UFLDL之栈式自编码

参考资料:UFLDL教程tornadomeet的博客
个人代码:github地址

栈式自编码算法介绍

微调问题

在自我学习的章节中,结合自编码特征提取与有监督的模型训练来预测数据的标签。假设使用的有监督模型是logistic classifier,则全部的结构图如下:
这里写图片描述
将输入(x)映射到特征层激活量(a)的权值网络为(W^{(1)})是由全部数据训练得到的。自学习算法中,(W^{(1)})是不变的;但是实际上,可以把由自编码算法得到的权值作为初始值,使用梯度下降或者L-BFGS对参数进行微调以减小训练误差。
微调必须在有大量标注数据的情况下使用,才能显著提升分类器的性能。若只有大量未标注数据,却只有相对较少的已标注数据集,微调作用非常有限。

深度学习网络

当激活函数非线性的时候,深度网络具有更强的表达能力。深度网络就是隐藏层或者说特征层更多的网络。每个隐藏层和上一个隐藏层之间都构成“整体——部分”的关系。以之前提到过的数字识别为例,如果第一层隐藏层检测的是边缘、笔画,那么第二层隐藏层就可以把这些特征组合起来,构成更复杂的轮廓……
深度学习网络在数学上会遇到局部极值问题和梯度弥散问题,局部极值很好理解,梯度弥散是指使用BP算法计算导数的时候,反向传播的梯度会随着层数的增加急剧减小,这样最初几层权重的变化会非常缓慢。
解决上述两个问题的方案是逐层贪婪训练方法,即每次都只训练一层,训练方法可以参照稀疏自编码算法。

微调多层自编码

采用逐层贪婪训练方法训练,以下图这种情况为例:
这里写图片描述
先忽略Features Ⅱ特征层和Softmax classifier层,并假定Features Ⅰ层的输出和输入相同,从而训练Input到Features Ⅰ的权值网络,这个过程和自编码算法是相同的,即:
这里写图片描述
而后,去掉输出层,只保留Input和Features Ⅰ层,并计算出Features Ⅰ层的激活值作为Features Ⅱ层的输入。然后按照同样的方法训练Features Ⅰ层到Features Ⅱ层的权值网络,由此得到所有特征层之间的权值。最后一个特征层可以视需要使用logistic回归或者softmax回归等分类器。
而微调采用的是BP算法,按照ufldl教程的说法,其最后一层的误差为:

[delta^{(n_l)}= - ( abla_{a^{n_l}}J) ullet f'(z^{(n_l)}) ]

以softmax分类器为例,其满足:

[ abla J = heta^T(I-P) ]

该公式在softmax回归里有提到,其中I是类别标签,P为条件概率向量。
而由最后一层的误差依次计算得到前面几项的误差以及根据误差求得偏导数的过程和BP算法是相同的。
个人认为,此处的最后一层指的不是softmax层而是特征层的最后一层,这样子公式才能和之前神经网络的吻合。

原文地址:https://www.cnblogs.com/lity/p/6041934.html