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

Ama*_*ier 8 python neural-network tensorflow

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

  • 激活功能是relu
  • 成本是产出与实际价值之间的平方距离
  • 我的神经网络与其他优化器正确训练,如GradientDescent,Adam,Adagrad.

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

我尝试过每一个初始的learning_rate(从1.0e-6到10)并且使用不同的权重初始化:它总是相同的.

有没有人对发生了什么有一点了解?

非常感谢

Oli*_*rot 8

简答:不要使用Adadelta

今天很少有人使用它,你应该坚持:

  • tf.train.MomentumOptimizer0.9势头非常标准和行之有效的.缺点是你必须找到自己最好的学习率.
  • tf.train.RMSPropOptimizer:结果较少依赖于良好的学习率.这个算法与Adadelta非常相似,但在我看来表现更好.

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

请注意,在论文中,他们甚至不使用学习率,这与保持学习率相同1.


答案很长

Adadelta起步缓慢.该论文的完整算法是:

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]))
Run Code Online (Sandbox Code Playgroud)

前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
Run Code Online (Sandbox Code Playgroud)