实现momentum算法的优化器。计算表达式如下(如果use_nesterov = False):
accumulation = momentum * accumulation + gradient
variable -= learning_rate * accumulation
注意,在这个算法的密集版本中,不管梯度值是多少,都会更新和应用累加,而在稀疏版本中(当梯度是索引切片时,通常是因为tf)。只有在前向传递中使用变量的部分时,才更新变量片和相应的累积项。
__init__
__init__(
learning_rate,
momentum,
use_locking=False,
name='Momentum',
use_nesterov=False
)
构造一个新的momentum optimizer。
参数:
learning_rate
: 张量或浮点值。学习速率。
momentum
: 张量或浮点值。
use_lock:如果真要使用锁进行更新操作。
name:可选的名称前缀,用于应用渐变时创建的操作。默认为“动力”。
如果是真的,使用Nesterov动量。参见Sutskever et al., 2013。这个实现总是根据传递给优化器的变量的值计算梯度。使用Nesterov动量使变量跟踪本文中称为theta_t + *v_t的值。这个实现是对原公式的近似,适用于高动量值。它将计算NAG中的“调整梯度”,假设新的梯度将由当前的平均梯度加上动量和平均梯度变化的乘积来估计。
Eager Compatibility:
当启用了紧急执行时,learning_rate和momentum都可以是一个可调用的函数,不接受任何参数,并返回要使用的实际值。这对于跨不同的优化器函数调用更改这些值非常有用。
方法:
apply_gradients
apply_gradients(
grads_and_vars,
global_step=None,
name=None
)
对变量应用梯度,这是minimize
()的第二部分,它返回一个应用渐变的操作。
参数:
返回:
异常:
TypeError
: If grads_and_vars
is malformed.ValueError
: If none of the variables have gradients.RuntimeError
: If you should use _distributed_apply()
instead.compute_gradients
apply_gradients(
grads_and_vars,
global_step=None,
name=None
)
对变量应用梯度,这是最小化()的第二部分,它返回一个应用渐变的操作。
参数:
返回值:
异常:
TypeError
: If grads_and_vars
is malformed.ValueError
: If none of the variables have gradients.RuntimeError
: If you should use _distributed_apply()
instead.compute_gradients
compute_gradients(
loss,
var_list=None,
gate_gradients=GATE_OP,
aggregation_method=None,
colocate_gradients_with_ops=False,
grad_loss=None
)
为var_list中的变量计算损失梯度。这是最小化()的第一部分。它返回一个(梯度,变量)对列表,其中“梯度”是“变量”的梯度。注意,“梯度”可以是一个张量,一个索引切片,或者没有,如果给定变量没有梯度。
参数:
loss
: 一个包含要最小化的值的张量,或者一个不带参数的可调用张量,返回要最小化的值。当启用紧急执行时,它必须是可调用的。返回:
异常:
TypeError
: If var_list
contains anything else than Variable
objects.ValueError
: If some arguments are invalid.RuntimeError
: If called with eager execution enabled and loss
is not callable.Eager Compatibility:
当启用了即时执行时,会忽略gate_gradients、aggregation_method和colocate_gradients_with_ops。
get_name
get_name()
get_slot
get_slot(
var,
name
)
一些优化器子类使用额外的变量。例如动量和Adagrad使用变量来累积更新。例如动量和Adagrad使用变量来累积更新。如果出于某种原因需要这些变量对象,这个方法提供了对它们的访问。使用get_slot_names()获取优化器创建的slot列表。
参数:
name
: 一个字符串。返回值:
get_slot_names
get_slot_names()
返回优化器创建的槽的名称列表。
返回值:
minimize
minimize(
loss,
global_step=None,
var_list=None,
gate_gradients=GATE_OP,
aggregation_method=None,
colocate_gradients_with_ops=False,
name=None,
grad_loss=None
)
通过更新var_list,添加操作以最小化损失。此方法简单地组合调用compute_gradients()和apply_gradients()。如果想在应用渐变之前处理渐变,可以显式地调用compute_gradients()和apply_gradients(),而不是使用这个函数。
参数:
返回值:
异常:
ValueError
: If some of the variables are not Variable
objects.Eager Compatibility
当启用紧急执行时,loss应该是一个Python函数,它不接受任何参数,并计算要最小化的值。最小化(和梯度计算)是针对var_list的元素完成的,如果不是没有,则针对在执行loss函数期间创建的任何可训练变量。启用紧急执行时,gate_gradients、aggregation_method、colocate_gradients_with_ops和grad_loss将被忽略。
variables
variables()
编码优化器当前状态的变量列表。包括由优化器在当前默认图中创建的插槽变量和其他全局变量。
返回值: