1

我一直在研究 UFLDL 教程(在 matlab/octave 中):

http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial

并且一直在不同的数据集上尝试稀疏自动编码器。我尝试在时间序列数据上运行它并遇到了问题。由于输入数据有负值,sigmoid 激活函数 (1/1 + exp(-x)) 是不合适的。当替换为 tanh 时,优化程序 minfunc (L-BFGS) 失败(步长低于 TolX)。我大幅降低了 TolX 常数,没有任何变化。我将输出层更改为线性,保留输入层 sigmoid,但这不是一个可取的解决方案。自动编码器的输出按常数 (0.5) 放大,这会增加成本函数。所以....简而言之:

为什么 Tanh 激活函数不适用于 L-BFGS?(或者还有什么问题)?

..我错过了什么?到处都读到它说激活函数是可以互换的。我知道有解决方法(重新调整数据,使用 FFT 系数等),但我不明白为什么这不起作用。

无论如何,提前感谢任何回答的人!第一次在这里发帖,我越来越多地阅读这些类型的论坛,并且发现它们越来越有用..

4

3 回答 3

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 激活范围?有人可以指出我的任何参考吗?在上面链接的那个网站上,作者说许多稀疏惩罚的选择是可以的,但没有进一步详细说明其他选择可能是什么。只是编造一些东西是谨慎的..?或者寻找被接受的东西。再次感谢!

于 2012-07-12T04:36:22.403 回答
0

我已经尝试了 UFLDL 之后的稀疏自动编码器算法。我正在使用fortran90。

在我的代码中,我使用了 tanh 激活函数。该p_hat术语已修改为范围 [0,1] 使用,

p_hat = (p_hat+1.0)/2.0

因此,稀疏惩罚不会变得不可行。我的成本函数平滑收敛,但隐藏层中的激活节点不会变为非活动状态(-1)。我无法理解这种现象。这无助于我减少输入向量维度的目的。

于 2012-08-24T17:34:52.390 回答
0

我有点松散地遵循 UFLDL,我遇到了同样的问题。

我正在尝试 (beta/2*m)*mean(mean(abs(a2))) 来规范稀疏性的成本,认为随着一个神经元激活的增加将与激活其他神经元。我希望这会导致比 KL 更好的稀疏性;KL 在 p 附近的低导数意味着随着 a2_j 越来越接近 p,a2_j 的进一步减小导致成本的较小下降,使得 a2_j 到达 p 的可能性越来越小;线性成本没有这个问题。

但是,我在弄清楚如何修改 d2 以在反向传播期间获得正确的梯度时遇到了一些麻烦。您现在可能已经找到了其他解决方案,但如果没有,这可能值得弄清楚。如果您(或其他任何人!)弄清楚,我很想得到答案=)

编辑:d2 = d2 + ( (network.beta / (2 * network.examples)) * exp(-a2); ) .* z2_grad; 似乎给出了好的结果。

编辑2:不,它没有。对不起'回合

于 2012-08-10T02:30:05.443 回答