我一直在使用Tensorflow进行回归。 我的神经网络非常小,有10个输入神经元,12个隐藏神经元在一个层中,5个输出神经元。
然而,当我尝试使用Adadelta时,神经网络根本不会训练。变量在每一步都保持不变。
我尝试过每一个初始的learning_rate(从1.0e-6到10)并且使用不同的权重初始化:它总是一样。
有没有人对发生的事情有一点了解?
非常感谢
答案 0 :(得分:7)
今天很少有人使用它,你应该坚持:
tf.train.MomentumOptimizer
动量的0.9
非常标准,效果很好。缺点是你必须找到最好的学习率。tf.train.RMSPropOptimizer
:结果较少依赖于良好的学习率。这个算法非常类似于Adadelta ,但在我看来表现更好。如果您真的想使用Adadelta,请使用论文中的参数:learning_rate=1., rho=0.95, epsilon=1e-6
。一个更大的epsilon
在开始时会有所帮助,但是要准备等待比其他优化器更长的时间来看到收敛。
请注意,在论文中,他们甚至不使用学习率,这与保持等于1
相同。
Adadelta起步缓慢。 paper的完整算法是:
问题是他们积累了更新的平方。
我认为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