tensorflow随笔-底层梯度
(1)tf.AggregationMethod是一個類
Class AggregationMethod
類擁有的方法主要用于聚集梯度
計算偏導數需要聚集梯度貢獻,這個類擁有在計算圖中聚集梯度的很多方法。比如:
ADD_N: 所有的梯度被求和匯總,使用 "AddN"操作。有一個特點:所有的梯度在聚集之前必須要準備好,
DEFAULT: 默認聚集方法
類方法
ADD_N
DEFAULT
EXPERIMENTAL_ACCUMULATE_N
EXPERIMENTAL_TREE
TensorFlow擁有計算給定TensorFlow計算圖的導數的函數。優化器類自動計算圖上的導數,但是新的優化器的創建者或專家用戶可以調用下面的底層函數。
(2)tf.gradients
tf.gradients(ys,xs,grad_ys=None,name='gradients',colocate_gradients_with_ops=False,gate_gradients=False,aggregation_method=None,stop_gradients=None )在XS中構造ys關于x的符號導數之和。
ys和xs是 每個tensor或tensor的列表。grad_ys是一個tensor列表,保存由ys接收的梯度,列表必須和ys長度一樣。
gradients()將操作增加到圖中,輸出關于ys的導數,返回長度LeN(xs)的tensor的列表,其中每個tensor是ys中所有y的sum(Dy/Dx)。
grad_ys是一個張量(tensor)列表,其長度與ys的長度相同,它保持ys中的每個y的初始梯度。當grad_ys為None時,我們在ys中為每個y填充一個Y尺寸的’1’s的張量。用戶可以提供他們自己的初始grad_ys來對每個y使用不同的初始梯度來計算導數(例如,如果希望為每個y中的每個值提供不同的加權梯度)。
(3)stop_gradients
是一個tensor或tensor的列表,所有關于xs作為常量(constant),這些tensor不會被反向傳播,仿佛它們已經被使用stop_gradients 顯式地斷開。除此之外,這允許計算偏導數,而不是全導數。
在數學中,一個多變量的函數的偏導數,就是它關于其中一個變量的導數而保持其他變量恒定
f"xy與f"yx的區別在于:前者是先對 x 求偏導,然后將所得的偏導函數再對 y 求偏導;后者是先對 y 求偏導再對 x 求偏導。當 f"xy 與 f"yx 都連續時,求導的結果與先后次序無關。
已知二元函數z=f(u,v),其中u、v是關于x的一元函數,有u=u(x)、v=v(x),u、v作為中間變量構成自變量x的復合函數z,它最終是一個一元函數,它的導數就稱為全導數。全導數的出現可以作為一類導數概念的補充,其中***著整合全部變量的思想。
求 z=x3+6xy+y5 偏導數。
解: = 3x + 6y, = 6x + 5y.
tf.stop_gradient tf.hessians#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Mon Aug 27 11:16:32 2018@author: liuxing """import tensorflow as tf a = tf.constant(1.) b = tf.constant(1.) c = tf.constant(1.) g = tf.gradients([5*a + 3*b + 2*c], [a, b, c], stop_gradients=[a, b, c])sess=tf.Session() with sess:print sess.run(g) [5.0, 3.0, 2.0]以上是使用stop_gradients計算偏導數,下面繼續討論stop_gradients
#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Mon Aug 27 11:16:32 2018@author: liuxing """import tensorflow as tf a = tf.constant(1.) b = 2*a c = 3*b g = tf.gradients([a + b + c], [a, b, c], stop_gradients=[a, b, c])sess=tf.Session() with sess:print sess.run(g)[1.0, 1.0, 1.0]
偏導數都是1,這是正常的
g=a+b+c
對于a,b,c來說,偏導數g’a、g’b、g’c都是g=1
#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Mon Aug 27 11:16:32 2018 @author: liuxing """import tensorflow as tf x = tf.constant(1.) a = 12*x b = 2*a c = 3*b g1 = tf.gradients([a + b + c], [a, b, c]) g2 = tf.gradients([a + b + c], [a, b, c],stop_gradients=[a, b, c])sess=tf.Session() with sess:print sess.run(g1)print sess.run(g2)[9.0, 4.0, 1.0]
[1.0, 1.0, 1.0]
與全導數g1 = tf.gradients([a + b + c], [a, b, c])相比,偏導數g2 = tf.gradients([a + b + c], [a, b, c],stop_gradients=[a, b, c])
的值是[1.0,1.0 , 1.0],而全導數g1 = tf.gradients([a + b + c], [a, b, c])考慮了a對b和c的影響,并求值為[9.0, 4.0, 1.0],例如:
(a+b+c)'a=9,其中:
b=2*a
c=3b=32*a=6a
相比于在圖構造期間使用的tf.stop_gradient。stop_gradients提供了已經構造完圖之后停止梯度的方法,當將這兩種方法結合起來時,反向傳播在tf.stop_gradient節點和stop_gradients節點處都停止,無論首先遇到哪個節點。
所有整數張量被認為是恒定的,相對于所有的xs,就好像它們被包括在stop_gradients中。
參數說明:
ys: 將被求導的tensor列表或一個tensor
xs: 用于求導的tensor列表或一個tensor
grad_ys: 可選的,tensor或tensor列表與ys相同大小,并保持在ys中計算的每個y的梯度。
name: 用于將所有梯度OP分組在一起的可選名稱。默認為“梯度”。
colocate_gradients_with_ops: 如果是True,嘗試用用相應的op共同定位梯度。
gate_gradients: 如果為true,則為每個操作圍繞梯度添加元組,這樣可避免一些競爭條件。
aggregation_method: 指定用于組合梯度項的方法。接受值是類聚集方法中定義的常量。
類方法
ADD_N
DEFAULT
EXPERIMENTAL_ACCUMULATE_N
EXPERIMENTAL_TREE
stop_gradients: 可選。tensor和tensor列表不區分
tf.stop_gradient
停止梯度計算
當在圖中計算時,這個操作原樣輸出它的輸入tensor。
#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Mon Aug 27 11:16:32 2018 @author: liuxing """import tensorflow as tf x = tf.constant(2.) a = 12*x b = 2*a c = 3*x g1 = tf.stop_gradient([a,b]) g2 = tf.gradients([a,c],[x]) g3 = tf.gradients([a,b,c],[x]) g4 = tf.gradients([a,b],a) sess=tf.Session() with sess:print sess.run(g1)print sess.run(g2)print sess.run(g3)print sess.run(g4)[24. 48.]
[15.0]
[39.0]
[3.0]
當構建操作用于計算梯度時,這個操作避免考慮輸入的貢獻。通常來說,梯度生成器通過遞歸地找出有助于其計算的輸入。 如果在圖中插入這個OP,則從梯度發生器中屏蔽輸入,它們不被考慮用于計算梯度。
每當您想用TensorFlow計算一個值,但需要假設值是常數時,這樣是有用的。例如:
1.EM算法中的M-step不應該包括通過E_step(E步長)的輸出的反向傳播。
2.對比Boltzmann機器的發散訓練,當對能量函數進行微分時,訓練不能通過從模型中生成樣本的圖來進行反向傳播。
3.敵對訓練, 不應有逆反發生在對抗示例生成過程中。
參數:
input: tensor.
name: 操作名字(可選)
返回:
A Tensor. 和input尺寸一樣
總結
以上是生活随笔為你收集整理的tensorflow随笔-底层梯度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Maven构建分布式项目时子模块相互依赖
- 下一篇: npm error enoent:no