一、常见的参数学习算法
- TensorFLow 中的优化器子类都是基于其父类
tf.train.Optimizer()
的,常用的子类有以下画红框的三种:
• tf.train.GradientDescentOptimizer()
• tf.train.MomentumOptimizer()
• tf.train.AdamOptimizer()
- 参数(权重和偏置)更新步骤:
- 计算所有可训练参数的梯度:
compute_gradients(loss)
- 一次性更新所有的参数:
apply_gradients(grads_and_vars)
- 优化器的
minimize(loss)
方法将以上两步合并为一步来操作
- 实例化优化器并调用
minimize(loss)
方法进行优化
loss = tf.square(Y - Y_pred, name='loss')
learning_rate = 0.01
# 只需传入学习率和损失函数即可
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
# 进行迭代优化
for i in range(n_epochs): # 迭代这么多轮
total_loss = 0
for _ in range(n_batches):
X_batch, Y_batch = mnist.train.next_batch(batch_size)
_, loss_batch = sess.run([optimizer, loss], feed_dict={X: X_batch, Y:Y_batch})
total_loss += loss_batch
print('Average loss epoch {0}: {1}'.format(i, total_loss/n_batches))
二、tf.train.GradientDescentOptimizer
tf.train.GradientDescentOptimizer(learning_rate, use_locking=False, name='GradientDescent')
输入参数:
learning_rate: A Tensor or a floating point value. The learning rate to use.
use_locking: If True use locks for update operations.常用方法:
1、compute_gradients(loss, var_list=None)
- Compute gradients of loss for the variables in var_list
2、
apply_gradients(grads_and_vars, global_step=None, var_list=None, name=None)
- Apply gradients to variables
3、
minimize(loss, global_step=None, var_list=None, name=None)
- 此方法通过更新变量列表(参数)来不断的减小损失,它合并了
compute_gradients()
和apply_gradients()
的操作,使得我们无法得知中间的梯度值- 如果想要在参数更新对梯度进行检验或者处理,可以单独使用
compute_gradients()
和apply_gradients()
,并将梯度检验或处理插入到这两个函数之间,见以下代码示例:
# 创建一个 optimizer
opt = tf.train.GradientDescentOptimizer(learning_rate=0.1)
# 计算<list of variables>相关的梯度, grads_and_vars 为 tuples (gradient, variable)组成的列表
grads_and_vars = opt.compute_gradients(loss, <list of variables>)
#对梯度进行想要的处理,比如 cap 处理
capped_grads_and_vars = [(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars]
# 令 optimizer 运用 capped 的梯度(gradients)
opt.apply_gradients(capped_grads_and_vars)
三、tf.train.MomentumOptimizer
tf.train.MomentumOptimizer(learning_rate,momentum,use_locking=False,name='Momentum',use_nesterov=False)
输入参数:
learning_rate: A Tensor or a floating point value. The learning rate to use.
momentum: 上一次权重更新值的系数,一般为 0.9momentum 的直观理解:
当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。常用方法:
- 和
tf.train.GradientDescentOptimizer
使用方法一样
四、tf.train.AdamOptimizer
tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False,name='Adam')
输入参数:
- 一般按照默认的参数设置即可
- They show empirically that Adam works well in practice and compares favorably to other adaptive learning-method algorithms.
常用方法:
- 和
tf.train.GradientDescentOptimizer
使用方法一样
五、学习率的设置
TF 中学习率的设置有以下几种函数可以调用,另外我们可以参考下 caffe 中学习率设置
- tf.train.exponential_decay
- tf.train.inverse_time_decay
- tf.train.natural_exp_decay
- tf.train.polynomial_decay
- tf.train.piecewise_constant(x, boundaries, values, name=None)
# use a learning rate that's 1.0 for the first 100000 steps,
# 0.5 for steps 100001 to 110000,
# and 0.1 for any additional steps.
global_step = tf.Variable(0, trainable=False, name='global_step')
boundaries = [100000, 110000]
values = [1.0, 0.5, 0.1]
learning_rate = tf.train.piecewise_constant(global_step, boundaries, values)
# Later, whenever we perform an optimization step, we increment global_step.
optimizer = tf.train.MomentumOptimizer(learning_rate)
train_op = optimizer.minimize(loss, global_step=global_step)
六、参考资料
1、An overview of gradient descent optimization algorithms2、如何选择优化器(上面的翻译版)?3、https://www.tensorflow.org/api_guides/python/train
七、参数学习算法的比较、原理及选择(待补充…)