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

  • 激活功能是relu
  • 成本是输出与实际值之间的平方距离
  • 我的神经网络可以与GradientDescent,Adam,Adagrad等其他优化程序一起正确训练。

  • 但是,当我尝试使用Adadelta时,神经网络根本无法训练。变量在每一步都保持不变。

    我尝试了所有可能的初始learning_rate(从1.0e-6到10),并且使用了不同的权重初始化:它总是一样的。

    有人对发生的事情有一点想法吗?

    非常感谢

    最佳答案

    简短答案:请勿使用Adadelta

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

    具有tf.train.MomentumOptimizer动量的

  • 0.9非常标准,并且效果很好。缺点是您必须找到最佳的学习率。
  • tf.train.RMSPropOptimizer:结果较少依赖良好的学习率。该算法与Adadelta 非常相似,但在我看来效果更好。

  • 如果您真的想使用Adadelta,请使用纸张中的参数:learning_rate=1., rho=0.95, epsilon=1e-6。更大的epsilon在开始时会有所帮助,但准备比其他优化程序等待更长的时间才能看到收敛。

    请注意,在本文中,他们甚至不使用学习率,这与使其等于1相同。

    长答案

    Adadelta起步很慢。 paper的完整算法为:

    python - 如何在Tensorflow中正确设置Adadelta算法的参数?-LMLPHP

    问题在于它们累积了更新的平方。
  • 在步骤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
    

    10-06 12:37