一般为了模型能更好的收敛,随着训练的进行,但愿可以减少学习率,以使得模型可以更好地收敛,找到loss最低的那个点.python
tensorflow中提供了多种学习率的调整方式.在https://www.tensorflow.org/api_docs/python/tf/compat/v1/train搜索decay.能够看到有多种学习率的衰减策略.api
本文介绍两种学习率衰减策略,指数衰减和多项式衰减.app
tf.compat.v1.train.exponential_decay( learning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None )
learning_rate 初始学习率
global_step 当前总共训练多少个迭代
decay_steps 每xxx steps后变动一次学习率
decay_rate 用以计算变动后的学习率
staircase: global_step/decay_steps的结果是float型仍是向下取整学习
学习率的计算公式为:decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)测试
咱们用一段测试代码来绘制一下学习率的变化状况.this
#coding=utf-8 import matplotlib.pyplot as plt import tensorflow as tf x=[] y=[] N = 200 #总共训练200个迭代 num_epoch = tf.Variable(0, name='global_step', trainable=False) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for num_epoch in range(N): ##初始学习率0.5,每10个迭代更新一次学习率. learing_rate_decay = tf.train.exponential_decay(learning_rate=0.5, global_step=num_epoch, decay_steps=10, decay_rate=0.9, staircase=False) learning_rate = sess.run([learing_rate_decay]) y.append(learning_rate) #print(y) x = range(N) fig = plt.figure() ax.set_xlabel('step') ax.set_ylabel('learing rate') plt.plot(x, y, 'r', linewidth=2) plt.show()
结果如图:
.net
tf.compat.v1.train.polynomial_decay( learning_rate, global_step, decay_steps, end_learning_rate=0.0001, power=1.0, cycle=False, name=None )
设定一个初始学习率,一个终止学习率,而后线性衰减.cycle控制衰减到end_learning_rate后是否保持这个最小学习率不变,仍是循环往复. 太小的学习率会致使收敛到局部最优解,循环往复能够必定程度上避免这个问题.
根据cycle是否为true,其计算方式不一样,以下:
code
#coding=utf-8 import matplotlib.pyplot as plt import tensorflow as tf x=[] y=[] z=[] N = 200 #总共训练200个迭代 num_epoch = tf.Variable(0, name='global_step', trainable=False) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for num_epoch in range(N): ##初始学习率0.5,每10个迭代更新一次学习率. learing_rate_decay = tf.train.polynomial_decay(learning_rate=0.5, global_step=num_epoch, decay_steps=10, end_learning_rate=0.0001, cycle=False) learning_rate = sess.run([learing_rate_decay]) y.append(learning_rate) learing_rate_decay2 = tf.train.polynomial_decay(learning_rate=0.5, global_step=num_epoch, decay_steps=10, end_learning_rate=0.0001, cycle=True) learning_rate2 = sess.run([learing_rate_decay2]) z.append(learning_rate2) #print(y) x = range(N) fig = plt.figure() ax.set_xlabel('step') ax.set_ylabel('learing rate') plt.plot(x, y, 'r', linewidth=2) plt.plot(x, z, 'g', linewidth=2) plt.show()
绘图结果以下:
cycle为false时对应红线,学习率降低到0.0001后再也不降低. cycle=true时,降低到0.0001后再突变到一个更大的值,在继续衰减,循环往复.blog
在代码里,一般经过参数去控制不一样的学习率策略,例如utf-8
def _configure_learning_rate(num_samples_per_epoch, global_step): """Configures the learning rate. Args: num_samples_per_epoch: The number of samples in each epoch of training. global_step: The global_step tensor. Returns: A `Tensor` representing the learning rate. Raises: ValueError: if """ # Note: when num_clones is > 1, this will actually have each clone to go # over each epoch FLAGS.num_epochs_per_decay times. This is different # behavior from sync replicas and is expected to produce different results. decay_steps = int(num_samples_per_epoch * FLAGS.num_epochs_per_decay / FLAGS.batch_size) if FLAGS.sync_replicas: decay_steps /= FLAGS.replicas_to_aggregate if FLAGS.learning_rate_decay_type == 'exponential': return tf.train.exponential_decay(FLAGS.learning_rate, global_step, decay_steps, FLAGS.learning_rate_decay_factor, staircase=True, name='exponential_decay_learning_rate') elif FLAGS.learning_rate_decay_type == 'fixed': return tf.constant(FLAGS.learning_rate, name='fixed_learning_rate') elif FLAGS.learning_rate_decay_type == 'polynomial': return tf.train.polynomial_decay(FLAGS.learning_rate, global_step, decay_steps, FLAGS.end_learning_rate, power=1.0, cycle=False, name='polynomial_decay_learning_rate') else: raise ValueError('learning_rate_decay_type [%s] was not recognized' % FLAGS.learning_rate_decay_type)
推荐一篇:http://www.javashuo.com/article/p-yiehgvxm-gq.html 对各类学习率衰减策略描述的很详细.而且都有配图,能够很直观地看到各类衰减策略下学习率变换状况.