神经网络优化算法详解(TensorFlow)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_14839543/article/details/71601258

Tensorflow中的一些常用的优化算法的调用命令为:

SGD

optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.learning_rate)

这个类是实现梯度下降算法的优化器。(结合理论可以看到,这个构造函数需要的一个学习率就行了)

__init__(learning_rate, use_locking=False,name=’GradientDescent’)

作用:创建一个梯度下降优化器对象 

参数: 

learning_rate: A Tensor or a floating point value. 要使用的学习率 

use_locking: 要是True的话,就对于更新操作(update operations.)使用锁 

name: 名字,可选,默认是”GradientDescent”.

Momentum

optimizer = tf.train.MomentumOptimizer(lr, 0.9)

AdaGrad

optimizer = tf.train.AdagradientOptimizer(learning_rate=self.learning_rate)

RMSProp

optimizer = tf.train.RMSPropOptimizer(0.001, 0.9)

ADAM

optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate, epsilon=1e-08)

Adam 这个名字来源于 adaptive moment estimation,自适应矩估计。概率论中矩的含义是:如果一个随机变量 X 服从某个分布,X 的一阶矩是 E(X),也就是样本平均值,X 的二阶矩就是 E(X^2),也就是样本平方的平均值。Adam 算法根据损失函数对每个参数的梯度的一阶矩估计和二阶矩估计动态调整针对于每个参数的学习速率。Adam 也是基于梯度下降的方法,但是每次迭代参数的学习步长都有一个确定的范围,不会因为很大的梯度导致很大的学习步长,参数的值比较稳定。it does not require stationary objective, works with sparse gradients, naturally performs a form of step size annealing。

直接进行优化

train_op = optimizer.minimize(loss)
获得提取进行截断等处理
gradients, v = zip(*optimizer.compute_gradients(loss))#此函数用来将计算得到的梯度和方差进行拆分

compute_gradients(loss,var_list=None,gate_gradients=GATE_OP,aggregation_method=None,colocate_gradients_with_ops=False,grad_loss=None)

作用:对于在变量列表(var_list)中的变量计算对于损失函数的梯度,这个函数返回一个(梯度,变量)对的列表,其中梯度就是相对应变量的梯度了。这是minimize()函数的第一个部分, 

参数: 

loss: 待减小的值 

var_list: 默认是在GraphKey.TRAINABLE_VARIABLES. 

gate_gradients: How to gate the computation of gradients. Can be GATE_NONE, GATE_OP, or GATE_GRAPH. 

aggregation_method: Specifies the method used to combine gradient terms. Valid values are defined in the class AggregationMethod. 

colocate_gradients_with_ops: If True, try colocating gradients with the corresponding op. 

grad_loss: Optional. A Tensor holding the gradient computed for loss.


gradients, _ = tf.clip_by_global_norm(gradients, self.max_gradient_norm)#梯度修剪,防止梯度爆炸
train_op = optimizer.apply_gradients(zip(gradients, v), global_step=self.global_step)#应用梯度来更新权值

apply_gradients(grads_and_vars,global_step=None,name=None)

作用:把梯度“应用”(Apply)到变量上面去。其实就是按照梯度下降的方式加到上面去。这是minimize()函数的第二个步骤。 返回一个应用的操作。 
参数: 
grads_and_vars: compute_gradients()函数返回的(gradient, variable)对的列表 
global_step: Optional Variable to increment by one after the variables have been updated. 
name: 可选,名字

其他一些没有标注的优化算法目前还没有学习到,以后再更新。


展开阅读全文

没有更多推荐了,返回首页