原创博客,转载请注明出处!
一、TensorFlow的优化器类
在TensorFlow中,编写好前向函数和损失函数后,可以直接调用TensorFlow自带的优化器去优化损失函数。
在TensorFlow中,每个优化方法都是一个类,常见的几种优化方法如下:
GradientDescentOptimizer
AdagradOptimizer
AdagradDAOptimizer
MomentumOptimizer
AdamOptimizer
RMSPropOptimizer
FtrlOptimizer
二、常用optimizer类讲解
1、tf.train.Optimizer
这是上面各种优化器类的父类。所以它的一些方法也是上述优化器类的通用方法。
(1)compute_gradients
计算var_list中变量的损失梯度。它是下面介绍的minimize()方法的第一部分,它返回一个(变量的梯度,变量)对的列表,其中梯度可以是张量、索引切片或无梯度(如果给定的变量无梯度)。
compute_gradients(loss,var_list=None,
gate_gradients=GATE_OP,
aggregation_method=None,
colocate_gradients_with_ops=False,
grad_loss=None)
loss:要最小化值的张量,即损失函数。
var_list:要更新的变量对象的列表或元组,以最小化损失。默认为GraphKeys.TRAINABLE_VARIABLES图表下收集的变量列表。
gate_gradinets:计算梯度的方式,可以是GATE_NONE, GATE_OP, 或GATE_GRAPH
aggregation_method:指定用于组合渐变项的方法。在类AggregationMethod中定义了有效值
colocate_gradients_with_ops:尝试将梯度和相应地op并置
grad_loss:保持为损失计算梯度的张量。
(2)apply_gradients
对变量应用渐变,即根据梯度和学习率更新变量。它是minimize()方法的第二部分,返回一个应用渐变的操作。
apply_gradients(grads_and_vars,global_step=None,name=None)
grads_and_vars:上面compute_gradients方法返回的(梯度,变量)列表
global_step:变量更新后自增
name:操作的名称,默认为优化器构造函数的名称。
(3)minimize
添加操作节点,用于最小化loss,并更新var_list。该方法是简单的合并了compute_gradients()与apply_gradients()方法。
返回为一个优化更新后的var_list,如果global_step非None,该操作还会为global_step做自增操作
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)
loss:要最小化值的张量,即损失函数。
global_step:loss变量更新后自增
var_list:要更新的变量对象的列表或元组,以最小化损失。默认为GraphKeys.TRAINABLE_VARIABLES图表下收集的变量列表。
gate_gradients:计算梯度的方式,可以是GATE_NONE, GATE_OP, 或GATE_GRAPH
aggregation_method:指定用于组合渐变项的方法。在类AggregationMethod中定义了有效值
colocate_gradients_with_ops:尝试将梯度和相应地op并置
name:操作的名称,默认为优化器构造函数的名称。
grad_loss:保持为损失计算梯度的张量。
其中gate_gradients每个参数的意义:
GATE_NONE:并行地计算和应用梯度。提供最大化的并行执行,但是会导致有的数据结果没有再现性。比如两个matmul操作的梯度依赖输入值,使用GATE_NONE可能会出现有一个梯度在其他梯度之前便应用到某个输入中,导致出现不可再现的(non-reproducible)结果
GATE_OP:对于每个操作Op,确保每一个梯度在使用之前都已经计算完成。这种做法防止了那些具有多个输入,并且梯度计算依赖输入情形中,多输入Ops之间的竞争情况出现。
GATE_GRAPH:确保所有的变量对应的所有梯度在他们任何一个被使用前计算完成。该方式具有最低级别的并行化程度,但是对于想要在应用它们任何一个之前处理完所有的梯度计算时很有帮助的。
(4)get_name
返回对象的名称
(5)get_slot和get_slot_names
一些optimizer的子类,比如 MomentumOptimizer 和 AdagradOptimizer 分配和管理着额外的用于训练的变量。这些变量称之为’Slots’,Slots有相应的名称,可以向optimizer访问的slots名称。有助于在log debug一个训练算法以及报告slots状态
get_slot()返回一个name所对应的slot,name是由Optimizer为var所创建,var为用于传入 minimize() 或 apply_gradients()的变量。
get_slot(var,name)
get_slot_names()返回一个由Optimizer所创建的slots的名称列表。
get_slot_names()
2、tf.train.GradientDescentOptimizer
梯度下降法,其构造函数如下:
__init__(learning_rate,use_locking=False,name='GradientDescent')
learning_rate:要使用的学习率 ,可以是一个张量或浮点数。
use_locking:如果为True,则对于更新操作(update operations.)使用锁
name:操作的名字,默认是”GradientDescent”
3、tf.train.AdadeltaOptimizer
其构造方法如下:
__init__(learning_rate=0.001,rho=0.95,
epsilon=1e-08,
use_locking=False,
name='Adadelta')
learning_rate:学习率
rho:衰减率,可以是一个张量或浮点数。
epsilon:张量或浮点值。一个很小值,避免除以0分母。
4、tf.train.AdagradOptimizer
其构造方法如下:
__init__(learning_rate,
initial_accumulator_value=0.1,
use_locking=False,
name='Adagrad')
learning_rate:学习率
initial_accumulator_value:浮点数正数,初始化加速器值。
5、tf.train.MomentumOptimizer
其构造方法如下:
__init__(learning_rate,momentum,
use_locking=False,
name='Momentum',
use_nesterov=False)
learning_rate:学习率
momentum:动量值,可以是张量或浮点数
use_nesterov:如果为True,使用Nesterov动量。
6、tf.train.AdamOptimizer
其构造方法如下:
__init__(learning_rate=0.001,
beta1=0.9,
beta2=0.999,
epsilon=1e-08,
use_locking=False,
name='Adam')
learning_rate:学习率
betal:浮点数或常量浮点张量,β1的值
betal2:浮点数或常量浮点张量,β2的值
epsilon:张量或浮点值。一个很小值,避免除以0分母。
7、tf.train.RMSPropOptimizer
其构造方法如下:
__init__(
learning_rate,
decay=0.9,
momentum=0.0,
epsilon=1e-10,
use_locking=False,
centered=False,
name='RMSProp'
)
decay:学习率改变系数
8、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',
accum_name=None,
linear_name=None,
l2_shrinkage_regularization_strength=0.0)