优化器
Optimizer基类提供了计算损失梯度和将梯度应用于变量的方法。一组子类实现了经典的优化算法,如GradientDescent和Adagrad。
你永远不会实例化Optimizer类本身,而是实例化其中一个子类。
class tf.train.Optimizer
优化器的基类。
该类定义API以添加Ops来训练模型。你从来没有直接使用这个类,而是实例及其子类为一体 GradientDescentOptimizer,AdagradOptimizer或MomentumOptimizer。
用法
# Create an optimizer with the desired parameters.
opt = GradientDescentOptimizer(learning_rate=0.1)
# Add Ops to the graph to minimize a cost by updating a list of variables.
# "cost" is a Tensor, and the list of variables contains variables.Variable
# objects.
opt_op = opt.minimize(cost, <list of variables>)
用compute_gradients()。计算梯度。
按照您的意愿处理梯度。
应用处理后的梯度apply_gradients()。
例:
# Create an optimizer.
opt = 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 (gradient, 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)
tf.train.Optimizer.init(use_locking, name)
创建一个新的优化器。
这必须由子类的构造函数调用。
ARGS:
use_locking:布尔。如果True应用使用锁定来防止对变量的并发更新。
name:非空字符串。用于为优化器创建的累加器的名称。
举:
ValueError:如果名称格式不正确。
-
tf.train.Optimizer.minimize(loss, global_step=None, var_list=None, gate_gradients=1, name=None)
通过更新’var_list’添加操作以最小化“损失”。
此方法简单地将调用compute_gradients()和apply_gradients()组合起来。如果要在应用梯度之前处理梯度,请显式调用compute_gradients()和apply_gradients(),而不要使用此函数。
ARGS:
loss:包含值最小化的张量。
global_step:可选变量在变量更新后按1递增。
var_list:可选的变量列表。可更新以最大程度地减少“损失”。默认为GraphKeys.TRAINABLE_VARIABLES下的图表中收集的变量列表。
gate_gradients:如何选择梯度的计算。可以是GATE_NONE,GATE_OP或GATE_GRAPH。
name:返回操作的可选名称。
返回:
更新’var_list’中的变量的操作。如果’global_step’不是None,那么该操作也会增加global_step。
举:
ValueError:如果某些变量不是变量。变量对象。
-
tf.train.Optimizer.compute_gradients(loss, var_list=None, gate_gradients=1)
为“var_list”中的变量计算“损失”的梯度。
这是minim()的第一部分。它返回(梯度,变量)对的列表,其中“gradient”是“变量”的梯度。请注意,如果给定变量没有梯度,则“梯度”可以是张量,IndexedSlices或None。
ARGS:
loss:包含值最小化的张量。
var_list:变量的可选列表。可以更新以最大程度地减少“损失”。默认为GraphKey.TRAINABLE_VARIABLES下的图表中收集的变量列表。
gate_gradients:如何选择梯度的计算。可以是GATE_NONE,GATE_OP或GATE_GRAPH。
返回:
(梯度,变量)对的列表。
举:
TypeError:如果var_list包含变量以外的任何变量。变量。
ValueError:如果一些参数无效。
-
tf.train.Optimizer.apply_gradients(grads_and_vars, global_step=None, name=None)
将梯度应用于变量。
这是minimize()的第二部分。它返回应用梯度的操作。
ARGS:
grads_and_vars:compute_gradients()返回的(梯度,变量)对的列表。
global_step:可选变量在变量更新后按1递增。
name:返回操作的可选名称。默认为传递给Optimizer构造函数的名称。
返回:
应用指定梯度的操作。如果’global_step’不是None,那么该操作也会增加global_step。
举:
TypeError:如果grads_and_vars格式不正确。
Gate gradients
二者minimize()并compute_gradients()接受gate_gradient控制并行性梯度的应用过程中的程度的参数。
可能的值是:GATE_NONE,GATE_OP,和GATE_GRAPH。
GATE_NONE:并行计算和应用梯度。这在执行过程中提供了最大的并行性,但是以结果中的某些不可重复性为代价。例如,MatMul的两个梯度取决于输入值:在计算其他梯度之前,GATE_NONE可以将其中一个梯度应用于其中一个输入,从而导致不可重现的结果。
GATE_OP:对于每个操作,确保在使用之前计算所有梯度。这可以防止为多个输入生成梯度的Ops竞争条件,其中梯度取决于输入。
GATE_GRAPH:确保在使用任何一个变量之前计算所有变量的所有梯度。这提供了最少的并行性,但如果要在应用任何梯度之前处理所有梯度,可能会很有用。
Slots
一些优化器子类,例如MomentumOptimizer和AdagradOptimizer 分配和管理与要训练的变量相关的附加变量。这些被称为插槽。插槽有名称,您可以向优化器询问它使用的插槽名称。一旦你有一个插槽名称,你可以向优化器询问它创建的变量以保存插槽值。
如果您想记录调试训练算法,报告关于插槽的统计信息等,这可能很有用。
tf.train.Optimizer.get_slot_names()
返回由优化器创建的插槽名称列表。
请参阅get_slot()。
返回:
字符串列表。
tf.train.Optimizer.get_slot(var, name)
返回由优化器为“var”创建的名为“name”的插槽。
一些优化器子类使用额外的变量。例如Momentum和Adagrad使用变量来累积更新。如果由于某种原因需要这些变量,则可以访问这些变量。
使用get_slot_names()获取由优化器创建的插槽名称列表。
ARGS:
var:传递给minimize()或apply_gradients()的变量。
name:一个字符串。
返回:
插槽的变量(如果已创建),否则无。
class tf.train.GradientDescentOptimizer
实现梯度下降算法的优化器。
tf.train.GradientDescentOptimizer.init(learning_rate, use_locking=False, name=’GradientDescent’)
构建一个新的梯度下降优化器。
ARGS:
learning_rate:张量或浮点值。学习速度使用。
use_locking:如果True使用锁定进行更新操作
name:应用梯度时创建的操作的可选名称前缀。默认为“梯度梯度”。
-
class tf.train.AdagradOptimizer
实现Adagrad算法的优化器。
tf.train.AdagradOptimizer.init(learning_rate, initial_accumulator_value=0.1, use_locking=False, name=’Adagrad’)
构建一个新的Adagrad优化器。
ARGS:
learning_rate:A Tensor或浮点值。学习率。
initial_accumulator_value:浮点值。累加器的起始值必须是正值。
use_locking:如果True使用锁定进行更新操作。
name:应用梯度时创建的操作的可选名称前缀。默认为“Adagrad”。
举:
ValueError:如果initial_accumulator_value无效。
-
class tf.train.MomentumOptimizer
实现Momentum算法的优化器。
tf.train.MomentumOptimizer.init(learning_rate, momentum, use_locking=False, name=’Momentum’)
构建一个新的Momentum优化器。
ARGS:
learning_rate:A Tensor或浮点值。学习率。
momentum:A Tensor或浮点值。势头。
use_locking:如果True使用锁定进行更新操作。
name:应用梯度时创建的操作的可选名称前缀。默认为“动量”。
-
class tf.train.AdamOptimizer
实现Adam算法的优化器。
tf.train.AdamOptimizer.init(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name=’Adam’)
构建一个新的Adam优化器。
实施依据:http : //arxiv.org/pdf/1412.6980v7.pdf
初始化:
m_0 <- 0 (Initialize initial 1st moment vector)
v_0 <- 0 (Initialize initial 2nd moment vector)
t <- 0 (Initialize timestep)
variable带梯度的更新规则g使用本文第2部分末尾描述的优化:
t <- t + 1
lr_t <- learning_rate * sqrt(1 - beta2^t) / (1 - beta1^t)
m_t <- beta1 * m_{t-1} + (1 - beta1) * g
v_t <- beta2 * v_{t-1} + (1 - beta2) * g * g
variable <- variable - lr_t * m_t / (sqrt(v_t) + epsilon)
一般来说,epsilon的默认值1e-8可能不是一个好的默认值。例如,当在ImageNet上训练一个Inception网络时,当前的好选择是1.0或0.1。
ARGS:
learning_rate:张量或浮点值。学习率。
beta1:浮点值或常量浮点张量。一阶矩估计的指数衰减率。
beta2:浮点值或常量浮点张量。第二时刻估计的指数衰减率。
epsilon:数值稳定性的一个小常量。
use_locking:如果True使用锁定进行更新操作
name:应用梯度时创建的操作的可选名称。默认为“Adam”。
-
class tf.train.FtrlOptimizer
实现FTRL算法的优化器。
tf.train.FtrlOptimizer.init(learning_rate, learning_rate_power=-0.5, initial_accumulator_value=0.1, l1_regularization_strength=0.0, l2_regularization_strength=0.0, use_locking=False, name=’Ftrl’)
构建一个新的FTRL优化器。
在“ Ad Click Prediction:a View from the Trenches”一文中描述了Ftrl-proximal算法,缩写为Follow-the-regularized-leader 。
它可以提供良好的性能与稀疏性权衡。
Ftrl近端使用其自己的全球基础学习率,可以表现得像Adagrad learning_rate_power=-0.5一样,或者像梯度下降一样 learning_rate_power=0.0。
有效学习率按照每个参数进行调整,相对于此基本学习率为:
effective_learning_rate_i = (learning_rate /
pow(k + summed_squared_gradients_for_i, learning_rate_power));
其中k是小常数initial_accumulator_value。
请注意,|w|^2目标函数的实际正则化系数是在使用此函数时1 / lambda_2指定l2 = lambda_2为参数。
ARGS:
learning_rate:浮点值或常量浮点数Tensor。
learning_rate_power:浮点值必须小于或等于零。
initial_accumulator_value:累加器的起始值。只允许正值。
l1_regularization_strength:浮点值,必须大于或等于零。
l2_regularization_strength:浮点值,必须大于或等于零。
use_locking:如果True使用锁定进行更新操作。
name:应用梯度时创建的操作的可选名称前缀。默认为“Ftrl”。
举:
ValueError:如果其中一个参数无效。
-
class tf.train.RMSPropOptimizer
实现RMSProp算法的优化器。
tf.train.RMSPropOptimizer.init(learning_rate, decay, momentum=0.0, epsilon=1e-10, use_locking=False, name=’RMSProp’)
构建一个新的RMSProp优化器。
ARGS:
learning_rate:张量或浮点值。学习率。
decay:历史/即将到来的折价的折扣因子
momentum:一个标量张量。
epsilon:小数值以避免零分母。
use_locking:如果True使用锁定进行更新操作。
name:应用梯度时创建的操作的可选名称prefic。默认为“RMSProp”。