声明:
- 翻译自官方文档
Optimizer
该模块定义了一个训练模型的operator的API。一般来说不会直接用到这个API,它更像是一个父类,各种基于不同类型优化算法的optimizer都继承自这里,如:GradientDescentOptimizer
, AdagradOptimizer
, MomentumOptimizer
。
基本用法Usage
构建TensorFlow graph:
# Create an optimizer with desired parameters.
opt = GradientDescentOptimizer(learning_rate=0.1)
# Add Ops to the graph to minimizer a cost by uodating a list of variables.
# "cost" is a Tensor, and the list of variables contains tf.Variable objects.
obj_op = opt.minimizer(cost, var_list =< list of variables>)
开启训练:
# Execute opt_op to do one step of training:
opt_op.run()
或:
sess.run(opt_op)
计算梯度Processing gradients before applying them
对optimizer调用minimizer()
函数包含两步:
- 计算梯度
- 将梯度应用到参数更新中
也就是说,如果你将两步分离,比如想获取所有trainable_variables
的梯度时,可以进行如下操作:
optimizer.compute_gradients()
计算梯度- 对梯度进行搞事情
optimizer.apply_gradients()
进行参数更新
示例:
# Create an optimizer.
optimizer = GradientDescentOptimizer(learning_rate=0.1)
# Compute the gradients for a list of variables.
grads_and_vars = opt.compute_gradients(loss, <list of variables>)
# grads_and_vars is a list of tuples (gradienet, variable).
# Do whatever you need to the 'gradient' part, for example cap them, etc.
capped_grads_and_vars = [(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars]
# Ask the optimizer to apply the capped gradients.
opt.apply_gradients(capped_grads_and_vars)
梯度门限Gating Gradients
minimize()
和compute_gradients()
都有一个共同的参数gate_gradients
,用来控制梯度计算的并行。
- GATE_NONE:以结果不可复现为代价,最大限度地并行计算和应用梯度。
- GATE_OP:对于每个操作,确保在使用之前计算所有梯度。
- GATE_GRAPH:确保在使用任何一个变量之前计算所有变量的所有梯度。比上面GATE_OP更严格的条件。
Slots
一些优化器子类(如MomentumOptimizer和AdagradOptimizer)需要分配和管理除trainable_variables
之外的其他变量。这些被称为Slots,便于调试过程中输出其他变量(Slots)的信息。