主要是在写玻尔兹曼机相关的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求导的结果是 ∂z∂w=2w+3w2 但是如果设置consider_constant=[x],那么求导结果就是 ∂z∂w=3w2 其实看看我前面用theano实现RBM的博客中容易发现使用consider_constant=[吉布斯采样k次的visible层输出]的原因在于这个visible的值计算是与模型参数有关的, 如果不设置它为常量, 最终的导数不止是计算能量函数的导数了, 还会额外计算这个visible对模型参数的导数, 这并不是RBM的正常梯度更新方法所需要的, 详细可看博客RBM的利用自由能量函数更新梯度的数学表达式 验证先引入相关包
import theanoimport theano.tensor as T定义标量操作
w=T.dscalar('w')x=w**2y=w**3z=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中关于梯度计算的理论, 来合理设置是否需要固定某项来更新梯度.