一、常见的参数学习算法

  • TensorFLow 中的优化器子类都是基于其父类 tf.train.Optimizer() 的,常用的子类有以下画红框的三种:
• tf.train.GradientDescentOptimizer()
• tf.train.MomentumOptimizer()
• tf.train.AdamOptimizer()

TensorFlow中的padding tensorflow中的算法_权重

  • 参数(权重和偏置)更新步骤:
  • 计算所有可训练参数的梯度:compute_gradients(loss)
  • 一次性更新所有的参数:apply_gradients(grads_and_vars)
  • 优化器的 minimize(loss) 方法将以上两步合并为一步来操作

TensorFlow中的padding tensorflow中的算法_常用方法_02

  • 实例化优化器并调用 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

TensorFlow中的padding tensorflow中的算法_TensorFlow中的padding_03

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.9

momentum 的直观理解:
TensorFlow中的padding tensorflow中的算法_常用方法_04
TensorFlow中的padding tensorflow中的算法_权重_05
当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。

常用方法:

  • 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)

TensorFlow中的padding tensorflow中的算法_权重_06

六、参考资料

1、An overview of gradient descent optimization algorithms2、如何选择优化器(上面的翻译版)?3、https://www.tensorflow.org/api_guides/python/train

七、参数学习算法的比较、原理及选择(待补充…)