我正在尝试使用 ADADELTA 算法在 MNIST 数据集上训练 2 个隐藏层 tanh 神经网络。
这是我的设置的参数:
- Tanh 激活函数
- 2个隐藏层,784个单元(与输入单元数相同)
- 我在输出层使用带有交叉熵损失的 softmax
- 我随机初始化权重,扇形约为 15,标准差为 1/sqrt(15) 的高斯分布权重
- 我正在使用 10 的 minibatch 大小和 50% 的 dropout。
- 我正在使用 ADADELTA 的默认参数 (rho=0.95, epsilon=1e-6)
- 我检查了我的导数与自动微分
如果我运行 ADADELTA,起初它会在错误中有所收获,并且我可以看到第一层正在学习识别数字的形状。它在对数字进行分类方面做得不错。但是,当我长时间运行 ADADELTA(30,000 次迭代)时,很明显出现了问题。虽然目标函数在几百次迭代后停止改进(并且内部 ADADELTA 变量停止变化),但第一层权重仍然具有与它们初始化时相同的稀疏噪声(尽管在该噪声之上学习了真实特征)。
为了说明我的意思,这里是网络可视化的示例输出。
请注意第一层权重中的像素噪声,尽管它们具有结构。这与初始化它们的噪声相同。
没有一个训练示例具有像这种噪声这样的不连续值,但由于某种原因,ADADELTA 算法从未将这些异常值权重降低到与它们的邻居一致。
到底是怎么回事?