1. 程式人生 > >tf.clip_by_global_norm使用

tf.clip_by_global_norm使用

在用bilstm+crf訓練命名實體識別時,採用梯度修剪策略,最小化損失

with tf.variable_scope('crf'):
    self.log_likelihood, self.transition_params = crf.crf_log_likelihood(inputs=self.logits,tag_indices=self.targets,sequence_lengths=self.sequence_length)

with tf.name_scope('loss'):
    #因為我們希望self.log_likelihood最大,所以相當於求-self.log_likelihood的最小值
self.log_loss = tf.reduce_mean(-self.log_likelihood) #正則 self.l2_loss = tf.contrib.layers.apply_regularization( regularizer=tf.contrib.layers.l2_regularizer(0.0001), weights_list=tf.trainable_variables()) self.loss = self.log_loss+self.l2_loss self.train_summary = tf.summary.
scalar('loss',self.loss) self.vali_summary = tf.summary.scalar('loss',self.loss) # self.merged = tf.summary.merge_all() optimizer = tf.train.AdamOptimizer(self.learning_rate) # optimizer = tf.train.GradientDescentOptimizer(self.learning_rate) #獲取所有可訓練的向量 tvars = tf.trainable_variables() #gradients是計算向量,輸入是loss和所有trainable的向量。
#clip_by_global_norm是梯度縮放輸入是所有trainable向量的梯度,和所有trainable向量,返回第一個clip好的梯度,第二個globalnorm grads, _ = tf.clip_by_global_norm(tf.gradients(self.loss, tvars), self.clip_grad) #apply_gradients是tf.train.Optimizer.minimize實際操作中兩步中的一步,minizie其實是分了兩步運算,第一步計算梯度tf.train.Optimizer.compute_gradients和第二步更新梯度 #tf.train.Optimizer.apply_gradients,由於我們已經計算股哦梯度了,所以我們只用更新梯度就可以了,輸入格式就是如下zip(梯度向量,變數向量) #tvars的格式可以參考這篇部落格:https://blog.csdn.net/u014595019/article/details/52805444 self.train_op = optimizer.apply_gradients(zip(grads, tvars))