前言
主要是在写玻尔兹曼机相关的theano
时, 在计算梯度grad
的时候发现一个参数名字叫做consider_constant
,来看看这个到底做了什么事情
参考博客:
using consider_constant selectively
【theano-windows】学习笔记三——theano中的导数
理论
其实就是数学中求导中用到的将某个与变量相关的项固定, 求解其它项关于变量的梯度. 我记得有个梯度下降法叫做固定坐标梯度下降, 就是先固定x
利用y
优化函数, 然后固定y
优化x
之类的, 后续我去看看, 感觉如果它用theano
实现的话可能会用到这个参数
用数学的方法表示就是, 如果有如下的操作
x=w2,y=w3,z=x+y
如果我们不使用
consider_constant
, 那么对
w求导的结果是 但是如果设置
consider_constant=[x]
,那么求导结果就是
∂z∂w=3w2
其实看看我前面用
theano
实现RBM的
博客中容易发现使用
consider_constant=[吉布斯采样k次的visible层输出]
的原因在于这个
visible
的值计算是与模型参数有关的, 如果不设置它为常量, 最终的导数不止是计算能量函数的导数了, 还会额外计算这个
visible
对模型参数的导数, 这并不是RBM的正常梯度更新方法所需要的, 详细可看博客RBM的利用自由能量函数更新梯度的数学表达式
验证
先引入相关包
import theano
import theano.tensor as T
定义标量操作
w=T.dscalar('w')
x=w**2
y=w**3
z=x+y
不设置常量参数的情况下计算导数
gz=T.grad(z,w)
fn=theano.function([w],gz)
theano.pp(fn.maker.fgraph.outputs[0])
结果
Elemwise{Composite{((i0 * i1) + (i2 * sqr(i1)))}}(TensorConstant{2.0}, w, TensorConstant{3.0})
翻译过来就是(2∗w)+(3∗w2)
设置x
为常量参数的情况下
gz=T.grad(z,w,consider_constant=[x])
fn=theano.function([w],gz)
theano.pp(fn.maker.fgraph.outputs[0])
结果
Elemwise{Composite{(i0 * sqr(i1))}}(TensorConstant{3.0}, w)
翻译过来就是3∗w2
后记
根据我们的cost
中关于梯度计算的理论, 来合理设置是否需要固定某项来更新梯度.