从 Jacobian 矩阵、Hessian 矩阵到 Theano 实现
2015-12-09 11:34
429 查看
T.grad(cost, wrt),一般接收两个参数,第一个参数表示需要求导的函数,放在深度学习的背景下就是代价函数,wrt(with respect to)表示代价函数所关于的参数(通俗地讲,就叫自变量,f(x)表示关于x的函数f)。
T.grad的第一个参数必须是标量。
同理,对
ds(x)dx=s(x)(1−s(x))
假设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)
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)⎞⎠⎟⎟⎟
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⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
H(f)ij(x)=[2002]
[2] Derivatives in Theano
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
相关文章推荐
- linux 无法使用sudo
- E4A - 打开、关闭软键盘
- Android适配全攻略(分享)
- java之快排
- Burst Balloons
- 一个基本的spring mvc项目搭建(入门)
- YUV数据分析
- 8、osg中拾取模型对象
- Atom如何安装Activate Power Mode
- Office 365管理员指引 3 ——管理接受域
- AndroidStudio里怎样引用aar文件
- StringBuilder在高性能场景下的正确用法
- Ubuntu常用指令与快捷键大全,整理中...
- mysql 构建大表及myisam 基础知识
- Android 的 SDK Manager 无法启动 闪退解决方法
- 某网hadoop视频全套
- [leetcode]Valid Palindrome
- Django项目用mod_wsgi部署到Apache2, Ubuntu 14.04
- Synchronized详解
- Python基础教程