TensorFlow 梯度優化相關

2021-09-07 14:28:55 字數 2556 閱讀 6694

tf.trainable_variables可以得到整個模型中所有trainable=true的variable,也是自由處理梯度的基礎

tf.gradients

用來計算導數。該函式的定義如下所示

def gradients(ys,

xs,grad_ys=none,

name="gradients",

colocate_gradients_with_ops=false,

gate_gradients=false,

aggregation_method=none):

雖然可選引數很多,但是最常使用的還是ys和xs。根據說明得知,ys和xs都可以是乙個tensor或者tensor列表。而計算完成以後,該函式會返回乙個長為len(xs)的tensor列表,列表中的每個tensor是ys中每個值對xs[i]求導之和。如果用數學公式表示的話,那麼g = tf.gradients(y,x)可以表示成 ,

tf.gradients(loss, model.input_tensor)  # 計算梯度,並非使用optimizer類實現
tf.clip_by_global_norm修正梯度值,用於控制梯度**的問題。梯度**和梯度瀰散的原因一樣,都是因為鏈式法則求導的關係,導致梯度的指數級衰減。為了避免梯度**,需要對梯度進行修剪。 

先來看這個函式的定義:

def clip_by_global_norm(t_list, clip_norm, use_norm=none, name=none):
輸入引數中:t_list為待修剪的張量, clip_norm 表示修剪比例(clipping ratio).

函式返回2個引數: list_clipped,修剪後的張量,以及global_norm,乙個中間計算量。當然如果你之前已經計算出了global_norm值,你可以在use_norm選項直接指定global_norm的值。

那麼具體如何計算呢?根據原始碼中的說明,可以得到 

list_clipped[i]=t_list[i] * clip_norm / max(global_norm, clip_norm),

其中 global_norm = sqrt(sum([l2norm(t)**2 for t in t_list]))

可以寫作 

其中, 

lic和lig

代表t_list[i]和list_clipped[i], 

nc和ng

代表clip_norm 和 global_norm的值。 

其實也可以看到其實ng

就是t_list的l2模。上式也可以進一步寫作 

也就是說,當t_list的l2模大於指定的nc

時,就會對t_list做等比例縮放。

這裡講解一下具體應用於優化器的方法,

self._lr = tf.variable(0.0, trainable=false)  # lr 指的是 learning_rate

tvars = tf.trainable_variables()

grads, _ = tf.clip_by_global_norm(tf.gradients(cost, tvars),

config.max_grad_norm)

# 梯度下降優化,指定學習速率

optimizer = tf.train.gradientdescentoptimizer(self._lr)

# optimizer = tf.train.adamoptimizer()

# optimizer = tf.train.gradientdescentoptimizer(0.5)

# self._train_op = optimizer.minimize(grads)

『tensorflow』網路操作api_下

提取梯度,使用梯度優化變數,效果和上面的例子相同,

# 建立乙個optimizer.

opt = gradientdescentoptimizer(learning_rate=0.1)

# 計算相關的梯度

grads_and_vars = opt.compute_gradients(loss, )

# grads_and_vars為tuples (gradient, variable)組成的列表。

#對梯度進行想要的處理,比如cap處理

tensorflow梯度下降

import tensorflow as tf model parameters w tf.variable 0 dtype tf.float32 w初值及型別 b tf.variable 0 dtype tf.float32 b初值及型別 model input and output x tf.p...

tensorflow 檢視梯度方式

1.為什麼要檢視梯度 對於初學者來說網路經常不收斂,loss很奇怪 就是不收斂 所以懷疑是反向傳播中梯度的問題 1 求導之後的數 的絕對值 越來越小 趨近於0 這就是梯度程式設計客棧消失 2 求導之後的數 的絕對值 越來越大 特別大,發散 這就是梯度 所以說呢,當loss不正常時,可以看看梯度是否處...

TensorFlow中梯度下降函式

一 介紹 下面介紹在tensorflow中進行隨機梯度下降優化的函式。在tensorflow中通過乙個叫optimizer的優化器類進行訓練優化。二 梯度下降優化器 三 說明 在訓練過程中先例項化乙個優化函式如tf.train.gradientdescentoptimizer,並基於一定的學習率進行...