优化函数
# 损失函数
loss = ...
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op =optimizer.minimize(loss,global_step=global_step)
其中minimize()包含两个步骤:
1.计算loss对指定val_list的梯度(导数),返回元组列表[(gradient,variable),…]
compute_gradients(loss,val_list)
注:tf.gradients(loss, tf.variables)与compute_gradients(loss,val_list)作用类似,但是只返回梯度
2.用计算得到的梯度来更新对应的变量(权重)
optimizer.apply_gradients(grads_and_vars, global_step=global_step, name=None)将
compute_gradients(loss,val_list)的返回值作为输入对variable更新
注意:在程序中global_step初始化为0,每次更新参数时,自动加1
# 等价于上面的代码
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
grads_and_vars = optimizer.compute_gradients(loss)
train_op = optimizer.apply_gradients(grads_and_vars)
将minimize()分成两个步骤
原因:在某种情况下对梯度进行修正,防止梯度消失或者梯度爆炸
如 tf.clip_by_norm()对梯度进行裁剪,通过控制梯度的最大范式,防止梯度爆炸的问题,是一种比较常用的梯度规约的方式
example:
import tensorflow as tf
w = tf.Variabl