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

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)(1s(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:RnRm 是一个从欧氏 n 维空间转换到m维欧氏空间的函数(如 ym×1=Am×nxn×1 ),这个函数由 m 个实函数组成,y1(x1,,xn),,ym(x1,,xn)刚好又可看做一个 m 维的向量,每一个 entry 又都是一个 n 元函数),这些函数的偏导数如果存在可以组成一个 m×n 的矩阵,这即是所谓的雅可比矩阵:

y1x1ymx1y1xnymxn

此矩阵表示为: 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)=y1x1y2x1y1x2y2x2=[2x1002x2]

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

fx=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) 为:

2fx212fx2x12fxnx12fx1x22fx222fxnx22fx1xn2fx2xn2fx2n

>>> 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值