设为首页 加入收藏

TOP

Theano学习笔记(四)――导数
2015-07-20 17:47:32 来源: 作者: 【 】 浏览:3
Tags: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.]

?

?

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇LeetCode 99 Recover Binary Sear.. 下一篇POJ2318TOYS

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python中文网 - 人生 (2025-12-24 18:49:47)
·【整整648集】这绝对 (2025-12-24 18:49:44)
·Python超详细一条龙 (2025-12-24 18:49:42)
·【超详细】JDK 下载 (2025-12-24 18:19:32)
·Java_百度百科 (2025-12-24 18:19:29)