如何正确设置Tensorflow中Adadelta算法的参数?

2024-05-29 06:09:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在使用Tensorflow进行回归。 我的神经网络很小,有10个输入神经元,12个隐藏在单层中的神经元和5个输出神经元。

  • 激活功能为relu
  • 成本是产出与实际价值的平方距离
  • 我的神经网络与其他优化器(如GradientDescent、Adam、Adagrad)进行了正确的训练。

然而,当我尝试使用Adadelta时,神经网络根本不会训练。变量在每一步都保持不变。

我尝试了所有可能的初始学习率(从1.0e-6到10)和不同的权重初始化:它总是一样的。

有人知道发生了什么事吗?

非常感谢


Tags: 功能距离tensorflow神经网络成本权重relu价值
1条回答
网友
1楼 · 发布于 2024-05-29 06:09:01

简而言之:不要使用Adadelta

现在很少有人使用它,你应该坚持:

  • ^带有0.9动量的{}非常标准,并且工作良好。缺点是你必须找到自己最好的学习率。
  • tf.train.RMSPropOptimizer:结果对良好的学习率的依赖性较小。该算法与Adadelta非常相似,但在我看来性能更好。

如果您真的想使用Adadelta,请使用论文中的参数:learning_rate=1., rho=0.95, epsilon=1e-6。一个更大的epsilon在开始时会有帮助,但是要准备好等待比其他优化器稍长的时间以看到收敛。

注意,在论文中,他们甚至不使用学习率,这与保持学习率等于1是一样的。


长答案

阿达达的起步很慢。来自paper的完整算法是:

Adadelta

问题是它们累积了更新的平方。

  • 在步骤0中,这些更新的运行平均值为零,因此第一次更新将非常小。
  • 由于第一次更新很小,更新开始时的运行平均值很小,这是一种恶性循环

我认为Adadelta在比您的网络更大的情况下性能更好,经过一些迭代后,它的性能应该与RMSProp或Adam相当。


下面是我的代码,可以与Adadelta优化器一起使用:

import tensorflow as tf

v = tf.Variable(10.)
loss = v * v

optimizer = tf.train.AdadeltaOptimizer(1., 0.95, 1e-6)
train_op = optimizer.minimize(loss)

accum = optimizer.get_slot(v, "accum")  # accumulator of the square gradients
accum_update = optimizer.get_slot(v, "accum_update")  # accumulator of the square updates

sess = tf.Session()
sess.run(tf.initialize_all_variables())

for i in range(100):
    sess.run(train_op)
    print "%.3f \t %.3f \t %.6f" % tuple(sess.run([v, accum, accum_update]))

前10行:

  v       accum     accum_update
9.994    20.000      0.000001
9.988    38.975      0.000002
9.983    56.979      0.000003
9.978    74.061      0.000004
9.973    90.270      0.000005
9.968    105.648     0.000006
9.963    120.237     0.000006
9.958    134.077     0.000007
9.953    147.205     0.000008
9.948    159.658     0.000009

相关问题 更多 >

    热门问题