优化器可以通俗的理解成梯度下降那一套流程。
梯度下降
基本流程
a. 损失函数
b. 求导,计算梯度
c. 更新参数
d. 迭代下一批样本
可以对照着理解tf。
tf 优化器
正常使用流程
a. 创建优化器(也就是选择优化方法,只是选择方法,其他什么也没做)
b. 指定损失函数和可优化参数
c. minimize最小化损失函数,这步包含两个操作,首先计算梯度,然后更新参数
以tf基本优化器,也就是梯度下降为例
optimizer = tf.train.GradientDescentOptimizer(learning_rate) # 优化器 global_step = tf.Variable(0, name='global_step', trainable=False) # 记录全局训练步骤 train_op = optimizer.minimize(loss, global_step=global_step) # 最小化损失函数,包括计算梯度,更新参数,记录训练次数
注意tf中学习率可以是tensor, 也就是说它可被feed。
tf 人工实现梯度下降
a. 计算梯度
b. 人工处理梯度
c. 优化参数
也就是把minimize拆开
# 创建一个optimizer. opt = GradientDescentOptimizer(learning_rate=0.1) # 计算<list of variables>相关的梯度 grads_and_vars = opt.compute_gradients(loss, <list of variables>) # grads_and_vars为tuples (gradient, variable)组成的列表。
#对梯度进行想要的处理,比如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)
优化器API详解
API | 描述 |
tf.train.Optimizer |
tf中优化器是个家族,Optimizer是个基类,一般不用 用的是它的子类 GradientDescentOptimizer, AdagradOptimizer,MomentumOptimizer等等 |
tf.train.Optimizer.__init__(use_locking, name) | 初始化 |
tf.train.Optimizer.minimize(loss, global_step=None, var_list=None, gate_gradients=1, aggregation_method=None, colocate_gradients_with_ops=False, name=None, grad_loss=None) |
最小化损失函数,返回更新后的参数列表 global_step 为迭代次数,如果不为None,它的值会自增 var_list 为参数列表,
此步包含计算梯度和更新参数两步,也就是下面两个API
|
tf.train.Optimizer.compute_gradients(loss, var_list=None, gate_gradients=1, aggregation_method=None, colocate_gradients_with_ops=False, grad_loss=None) |
计算梯度,只是求导,没做其他的,返回(梯度,变量)的tuples loss是损失函数 var_list 是参数列表,基于loss对这些参数求导
其他版本 tf.gradients |
tf.train.Optimizer.apply_gradients(grads_and_vars, global_step=None, name=None) |
将梯度应用到变量上,更新参数, 返回一个应用指定梯度的操作Operation,并对global_step做自增操作 |
tf.train.Optimizer.get_name() | 获取名称 |
并发性参数
调试函数(高级API)
子类优化器
tf.train.GradientDescentOptimizer 梯度下降
tf.train.MomentumOptimizer 动量梯度下降
tf.train.AdadeltaOptimizer
tf.train.AdagradOptimizer
tf.train.AdamOptimizer
tf.train.FtrlOptimizer
tf.train.RMSPropOptimizer
参考资料
http://www.cnblogs.com/hellcat/p/7041433.html
http://www.360doc.com/content/18/0505/10/54605916_751286822.shtml
https://www.cnblogs.com/wuzhitj/p/6648641.html
https://blog.csdn.net/hustqb/article/details/80302726