我一直在使用UFLDL教程(在matlab / octave中):
http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial
并且一直在尝试不同数据集上的稀疏自动编码器。我尝试在时间序列数据上运行它并遇到问题。由于输入数据具有负值,因此S形激活函数(1/1 + exp(-x))是不合适的。当在tanh中替换时,optimazion程序minfunc(L-BFGS)失败(步长大于TolX)。我没有任何变化地显着降低了TolX常数。 我将输出层更改为线性,保持输入层sigmoid,但这不是一个更好的解决方案。自动编码器的输出按常数(0.5)放大,这会使成本函数出现问题。所以....简而言之:
为什么Tanh激活功能不适用于L-BFGS? (或者是其他错误的东西)?
..我错过了什么?在任何地方读到它说激活功能是非常可互换的。我知道有解决方法(重新缩放数据,使用FFT系数等),但我不明白为什么这不起作用。
无论如何,提前感谢任何回答的人!在这里的第一篇文章,我越来越多地阅读这些类型的论坛,并发现它们越来越有用..
答案 0 :(得分:2)
我想我可能已经弄明白了。感谢你们两位回答!稀疏性惩罚使用Kullback Leibler Divergence。看到此链接,距离页面的一半多一点。 (你可以在这里输入Latex吗?)无论如何它可能有点长..
http://deeplearning.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity
英语:稀疏性惩罚试图最小化隐藏单位的激活,但它假设一个输出范围在0和1之间的sigmoid,因为KL div仅在0和1之间是真实的。 如果tanh的平均激活为0(这是我们想要的稀疏自动编码器)那么在该页面上给出的KL div是不满意的。 我没有运气地环顾四周;
有没有一种形式的KL div,它具有适当的tanh激活范围?有人可以指点我的任何参考?在上面链接的那个网站上,作者说许多稀疏性惩罚的选择都可以,但没有进一步阐述其他选择可能是什么。只是做一些事情是谨慎的吗?或寻找可接受的东西。再次感谢!
答案 1 :(得分:0)
我有点跟随UFLDL,我遇到了同样的问题。
我正在尝试(beta / 2 * m)* mean(mean(abs(a2)))来规范稀疏成本,认为随着一个神经元激活的增加将与a线性匹配其他神经元的激活减少。我希望这会导致比吉隆坡更好的稀疏性; KL的低导数接近p意味着当a2_j接近p时,a2_j的进一步减小导致成本的减小更小,使得a2_j达到p的可能性越来越小;线性成本没有那个问题。
然而,我在查找如何修改d2以在反向传播期间获得正确的渐变时遇到一些麻烦。你现在可能已经找到了其他一些解决方案,但如果没有,这可能值得一试。如果你(或其他任何人!)想出来,我很乐意得到答案=)
编辑:d2 = d2 +((network.beta /(2 * network.examples))* exp(-a2);)。* z2_grad;似乎给出了好的结果。
edit2:不,不。抱歉'回合
答案 2 :(得分:0)
我在UFLDL之后尝试了稀疏自动编码器算法。我正在使用fortran90。
在我的代码中,我使用了tanh激活功能。 p_hat
术语已使用
p_hat = (p_hat+1.0)/2.0
因此,稀疏惩罚不会变得不可行。我的成本函数收敛平稳,但隐藏层中的激活节点不转为非活动状态(-1)。我无法理解这种现象。这对我减少输入向量维数的目的没有帮助。