GradientDescentOptimizer设置自适应学习率
我正使用TensorFlow来训练一个神经网络。我初始化GradientDescentOptimizer的方式如下:
init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) mse = tf.reduce_mean(tf.square(out - out_)) train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)
问题是我不知道如何为学习速率或衰减值设置更新规则。
如何在这里使用自适应学习率呢?
最佳解决办法
首先,tf.train.GradientDescentOptimizer旨在对所有步骤中的所有变量使用恒定的学习率。 TensorFlow还提供现成的自适应优化器,包括tf.train.AdagradOptimizer和tf.train.AdamOptimizer,这些可以作为随时可用的替代品。
但是,如果要通过其他普通渐变下降控制学习速率,则可以利用以下事实:tf.train.GradientDescentOptimizer构造函数的learning_rate参数可以是Tensor对象。这允许您在每个步骤中为学习速率计算不同的值,例如:
learning_rate = tf.placeholder(tf.float32, shape=[]) # ... train_step = tf.train.GradientDescentOptimizer( learning_rate=learning_rate).minimize(mse) sess = tf.Session() # Feed different values for learning rate to each training step. sess.run(train_step, feed_dict={learning_rate: 0.1}) sess.run(train_step, feed_dict={learning_rate: 0.1}) sess.run(train_step, feed_dict={learning_rate: 0.01}) sess.run(train_step, feed_dict={learning_rate: 0.01})
或者,您可以创建一个标量tf.Variable
来保存学习率,并在每次要更改学习率时进行分配
次佳解决办法
Tensorflow提供了一种自动将指数衰减应用于学习速率张量的操作:tf.train.exponential_decay。有关正在使用的示例,请参阅this line in the MNIST convolutional model example。然后使用前文中的建议将此变量作为learning_rate参数提供给您的优化器。
要看的关键部分是:
# Optimizer: set up a variable that's incremented once per batch and # controls the learning rate decay. batch = tf.Variable(0) learning_rate = tf.train.exponential_decay( 0.01, # Base learning rate. batch * BATCH_SIZE, # Current index into the dataset. train_size, # Decay step. 0.95, # Decay rate. staircase=True) # Use simple momentum for the optimization. optimizer = tf.train.MomentumOptimizer(learning_rate, 0.9).minimize(loss, global_step=batch)
注意最小化global_step=batch
参数。这会告诉优化器在每次训练时都会帮助您增加'batch'参数。