【theano-windows】学习笔记十七——梯度中的consider_constant
前言
主要是在寫玻爾茲曼機相關(guān)的theano時, 在計算梯度grad的時候發(fā)現(xiàn)一個參數(shù)名字叫做consider_constant,來看看這個到底做了什么事情
參考博客:
using consider_constant selectively
【theano-windows】學(xué)習(xí)筆記三——theano中的導(dǎo)數(shù)
理論
其實就是數(shù)學(xué)中求導(dǎo)中用到的將某個與變量相關(guān)的項固定, 求解其它項關(guān)于變量的梯度. 我記得有個梯度下降法叫做固定坐標梯度下降, 就是先固定x利用y優(yōu)化函數(shù), 然后固定y優(yōu)化x之類的, 后續(xù)我去看看, 感覺如果它用theano實現(xiàn)的話可能會用到這個參數(shù)
用數(shù)學(xué)的方法表示就是, 如果有如下的操作
如果我們不使用 consider_constant, 那么對 w求導(dǎo)的結(jié)果是
?z?w=2w+3w2
但是如果設(shè)置 consider_constant=[x],那么求導(dǎo)結(jié)果就是
?z?w=3w2
其實看看我前面用 theano實現(xiàn)RBM的 博客中容易發(fā)現(xiàn)使用 consider_constant=[吉布斯采樣k次的visible層輸出]的原因在于這個 visible的值計算是與模型參數(shù)有關(guān)的, 如果不設(shè)置它為常量, 最終的導(dǎo)數(shù)不止是計算能量函數(shù)的導(dǎo)數(shù)了, 還會額外計算這個 visible對模型參數(shù)的導(dǎo)數(shù), 這并不是RBM的正常梯度更新方法所需要的, 詳細可看博客RBM的利用自由能量函數(shù)更新梯度的數(shù)學(xué)表達式
驗證
先引入相關(guān)包
import theano import theano.tensor as T定義標量操作
w=T.dscalar('w') x=w**2 y=w**3 z=x+y不設(shè)置常量參數(shù)的情況下計算導(dǎo)數(shù)
gz=T.grad(z,w) fn=theano.function([w],gz) theano.pp(fn.maker.fgraph.outputs[0])結(jié)果
Elemwise{Composite{((i0 * i1) + (i2 * sqr(i1)))}}(TensorConstant{2.0}, w, TensorConstant{3.0})翻譯過來就是(2?w)+(3?w2)
設(shè)置x為常量參數(shù)的情況下
gz=T.grad(z,w,consider_constant=[x]) fn=theano.function([w],gz) theano.pp(fn.maker.fgraph.outputs[0])結(jié)果
Elemwise{Composite{(i0 * sqr(i1))}}(TensorConstant{3.0}, w)翻譯過來就是3?w2
后記
根據(jù)我們的cost中關(guān)于梯度計算的理論, 來合理設(shè)置是否需要固定某項來更新梯度.
總結(jié)
以上是生活随笔為你收集整理的【theano-windows】学习笔记十七——梯度中的consider_constant的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡还款了多久可以刷出来?还款了怎么还
- 下一篇: 【Ogre-windows】实例配置