您的位置:首页 > 其它

从 Jacobian 矩阵、Hessian 矩阵到 Theano 实现

2015-12-09 11:34 429 查看
T.grad(cost, wrt),一般接收两个参数,第一个参数表示需要求导的函数,放在深度学习的背景下就是代价函数,wrt(with respect to)表示代价函数所关于的参数(通俗地讲,就叫自变量,f(x)表示关于x的函数f)。

T.grad的第一个参数必须是标量。

>>> import thenao
>>> import theano.tensor as T
>>> x = T.dmatrix('x')
>>> y = x**2+x
>>> gy = T.grad(y, x)

TypeError: cost must be a scalar.


>>> x = T.dmatrix('x')
>>> y = T.sum(x**2+x)
# 这里的T.sum似乎并没有做加和的动作
>>> gy = T.grad(y, x)
>>> f = theano.function([x], gy)
>>> f([[0, 1], [2, 3]])
array([[ 1.,  3.],
[ 5.,  7.]])


同理,对
sigmoid型函数
求导,

ds(x)dx=s(x)(1−s(x))

>>> x = T.dmatrix('x')
>>> s = T.sum(1./(1.+T.exp(-x)))
>>> gs = T.grad(s, x)
>>> dlogistic = theano.function([x], gs)
>>> dlogistic([[0, 1], [-1, -2]])
array([[ 0.25      ,  0.19661193],
[ 0.19661193,  0.10499359]])


1. Jacobian 矩阵

在向量分析中,雅克比矩阵是一阶偏导数以一定方式排列成的矩阵,其行列式称为雅克比行列式。

假设F:Rn→Rm是一个从欧氏n维空间转换到m维欧氏空间的函数(如ym×1=Am×nxn×1),这个函数由m个实函数组成,y1(x1,…,xn),…,ym(x1,…,xn)(刚好又可看做一个 m 维的向量,每一个 entry 又都是一个 n 元函数),这些函数的偏导数如果存在可以组成一个m×n的矩阵,这即是所谓的雅可比矩阵:

⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1∂x1⋮∂ym∂x1⋯⋱⋯∂y1∂xn⋮∂ym∂xn⎤⎦⎥⎥⎥⎥⎥⎥⎥

此矩阵表示为:JF(x1,…,xn),或者∂(y1,…,ym)∂(x1,…,xn)

>>> x = T.dvector('x')
>>> y = x**2
>>> J, updates = theano.scan(lambda i, y, x: T.grad(y[i], x), sequences=T.arange(y.shape[0]), non_sequences=[y, x])
>>> f = theano.function([x], J, updates=updates)
>>> f([3, 4])
array([[ 6.,  0.],
[ 0.,  8.]])


Jy(x1,x2)=∂(y1,y2)∂(x1,x2)=⎡⎣⎢⎢⎢∂y1∂x1∂y2∂x1∂y1∂x2∂y2∂x2⎤⎦⎥⎥⎥=[2x1002x2]

再考虑这样一个向量,f(x)=[3x21+x2ln(x1)sin(x2)]T,则 Jacobian 为:

∂f∂x=⎛⎝⎜⎜⎜6x11x1010cos(x2)⎞⎠⎟⎟⎟

2. Hessian矩阵

Hessian matrix是一个自变量为向量的实值函数的二阶偏导数组成的方块矩阵,此函数如下:

f(x1,x2,…,xn)

如果f的所有二阶导数都存在,那么f的 Hessian 矩阵为:

H(f)ij(x)=DiDjf(x)

其中x=(x1,x2,…,xn),即H(f)为:

⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢∂2f∂x21∂2f∂x2x1⋮∂2f∂xnx1∂2f∂x1x2∂2f∂x22⋮∂2f∂xnx2⋯⋯⋱⋯∂2f∂x1xn∂2f∂x2xn⋮∂2f∂x2n⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

>>> x = T.dvector('x')
>>> y = x**2
>>> cost = T.sum(y)
>>> 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 = theano.function([x], H, updates=updates)
>>> f([3, 4])
array([[ 2.,  0.],
[ 0.,  2.]])


H(f)ij(x)=[2002]

References

[1] Jacobian矩阵和Hessian矩阵

[2] Derivatives in Theano
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: