首页 > 代码库 > Theano学习笔记(四)——导数
Theano学习笔记(四)——导数
导数使用T.grad计算。
这里使用pp()打印梯度的符号表达式。
第3行输出是打印了经过优化器简化的符号梯度表达式,与第1个输出相比确实简单多了。
fill((x** TensorConstant{2}), TensorConstant{1.0})指创建一个x**2大小的矩阵,并填充1。
importtheano.tensor as T fromtheano import pp fromtheano import function x= T.dscalar('x') y= x ** 2 gy= T.grad(y, x) printpp(gy) f= function([x], gy) printf(4) printpp(f.maker.fgraph.outputs[0]) >>> ((fill((x** TensorConstant{2}), TensorConstant{1.0}) * TensorConstant{2}) * (x **(TensorConstant{2} - TensorConstant{1}))) 8.0 (TensorConstant{2.0}* x)
T.grad的第1个参数必须是标量
例如计算逻辑函数sigmoid的导数:
importtheano.tensor as T fromtheano import function x= T.dmatrix('x') s= T.sum(1 / (1 + T.exp(-x))) gs= T.grad(s, x) dlogistic= function([x], gs) printdlogistic([[0, 1], [-1, -2]]) >>> [[0.25 0.19661193] [ 0.19661193 0.10499359]]
计算雅克比(Jacobian)矩阵
雅克比矩阵是向量的一阶偏导数:
用T.arrange生成从0到y.shape[0]的序列。循环计算。
scan可以提高创建符号循环效率。
lambda~是python内建的magicfunction.
x= T.dvector('x') y = x ** 2 J, updates = theano.scan(lambdai, y,x : T.grad(y[i], x), sequences=T.arange(y.shape[0]), non_sequences=[y,x]) f = function([x], J,updates=updates) f([4, 4]) >>> [[ 8. 0.] [ 0. 8.]]
计算海森(Hessian)矩阵
海森矩阵是多元函数的二阶偏导数方阵。
只要用T.grad(cost,x)替换雅克比矩阵的一些y即可。
x= T.dvector('x') y = x** 2 cost= y.sum() gy =T.grad(cost, x) H,updates = theano.scan(lambda i, gy,x : T.grad(gy[i], x),sequences=T.arange(gy.shape[0]), non_sequences=[gy, x]) f =function([x], H, updates=updates) f([4,4]) >>> [[2. 0.] [ 0. 2.]]
雅克比右乘
x可以由向量扩展成矩阵。雅克比右乘使用Rop:
W = T.dmatrix('W') V =T.dmatrix('V') x =T.dvector('x') y =T.dot(x, W) JV =T.Rop(y, W, V) f =theano.function([W, V, x], JV) printf([[1, 1], [1, 1]], [[2, 2], [2, 2]], [0,1]) >>> [2. 2.]
雅克比左乘
雅克比左乘使用Lop:
import theano import theano.tensor as T from theano import function x = T.dvector('x') v =T.dvector('v') x =T.dvector('x') y =T.dot(x, W) VJ =T.Lop(y, W, v) f =theano.function([v,x], VJ) print f([2, 2], [0, 1]) >>> [[0. 0.] [ 2. 2.]]
海森矩阵乘以向量
可以使用Rop
import theano import theano.tensor as T from theano import function x= T.dvector('x') v= T.dvector('v') y= T.sum(x ** 2) gy= T.grad(y, x) Hv= T.Rop(gy, x, v) f= theano.function([x, v], Hv) printf([4, 4], [2, 2]) >>> [4. 4.]
欢迎参与讨论并关注本博客和微博以及知乎个人主页后续内容继续更新哦~
转载请您尊重作者的劳动,完整保留上述文字以及文章链接,谢谢您的支持!
Theano学习笔记(四)——导数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。