从 Jacobian 矩阵、Hessian 矩阵到 Theano 实现
T.grad(cost, wrt),一般接收两个参数,第一个参数表示需要求导的函数,放在深度学习的背景下就是代价函数,wrt(with respect to)表示代价函数所关于的参数(通俗地讲,就叫自变量,f(x)f(x)表示关于xx的函数ff)。
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型函数
求导,
\frac{d\,s(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→RmF:\, \mathbb{R}^n\rightarrow\mathbb{R}^m是一个从欧氏nn维空间转换到mm维欧氏空间的函数(如ym×1=Am×nxn×1y_{m\times 1}=A_{m\times n}x_{n\times 1}),这个函数由mm个实函数组成,y1(x1,…,xn),…,ym(x1,…,xn)y_1(x_1, \ldots,x_n),\ldots,y_m(x_1,\ldots,x_n)(刚好又可看做一个 mm 维的向量,每一个 entry 又都是一个 nn 元函数),这些函数的偏导数如果存在可以组成一个m×nm\times n的矩阵,这即是所谓的雅可比矩阵:
\begin{bmatrix} \frac{\partial y_1}{\partial x_1}&&\cdots&&\frac{\partial y_1}{\partial x_n}\\ \vdots&&\ddots&&\vdots\\ \frac{\partial y_m}{\partial x_1}&&\cdots&&\frac{\partial y_m}{\partial x_n} \end{bmatrix}
此矩阵表示为:JF(x1,…,xn)J_F(x_1,\ldots,x_n),或者∂(y1,…,ym)∂(x1,…,xn)\frac{\partial(y_1,\ldots,y_m)}{\partial(x_1,\ldots,x_n)}
>>> 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.]])
J_y(x_1, x_2)=\frac{\partial (y_1,y_2)}{\partial (x_1, x_2)}=\begin{bmatrix}\frac{\partial y_1}{\partial x_1}&&\frac{\partial y_1}{\partial x_2}\\ \frac{\partial y_2}{\partial x_1} &&\frac{\partial y_2}{\partial x_2}\end{bmatrix}=\begin{bmatrix}2x_1&&0 \\ 0 && 2x_2\end{bmatrix}
再考虑这样一个向量,f(x)=[3x21+x2ln(x1)sin(x2)]T\mathrm f(\mathrm x)=\left[3x_1^2+x_2 \quad \ln(x_1) \quad \sin(x_2) \right]^T,则 Jacobian 为:
\frac{\partial \mathbf f}{\partial \mathbf x}=\begin{pmatrix} 6x_1&1\\ \frac1{x_1}&0\\ 0&\cos(x_2) \end{pmatrix}
2. Hessian矩阵
Hessian matrix是一个自变量为向量的实值函数的二阶偏导数组成的方块矩阵,此函数如下:
f(x_1, x_2, \ldots, x_n)
如果 ff的所有二阶导数都存在,那么ff的 Hessian 矩阵为:
H(f)_{ij}(x)=D_iD_jf(x)
其中 x=(x1,x2,…,xn)x=(x_1,x_2,\ldots,x_n),即 H(f)H(f)为:
\begin{bmatrix} \frac{\partial^2f}{\partial x_1^2}&&\frac{\partial^2f}{\partial x_1x_2} &&\cdots&&\frac{\partial^2f}{\partial x_1x_n}\\ \frac{\partial^2f}{\partial x_2x_1}&&\frac{\partial^2f}{\partial x_2^2} &&\cdots&&\frac{\partial^2f}{\partial x_2x_n}\\ \vdots && \vdots && \ddots && \vdots\\ \frac{\partial^2f}{\partial x_nx_1}&&\frac{\partial^2f}{\partial x_nx_2} &&\cdots&&\frac{\partial^2f}{\partial x_n^2} \end{bmatrix}
>>> 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)= \begin{bmatrix} 2&&0\\ 0&&2 \end{bmatrix}
References
[1] Jacobian矩阵和Hessian矩阵
[2] Derivatives in Theano
从 Jacobian 矩阵、Hessian 矩阵到 Theano 实现相关推荐
- Jacobian 和Hessian矩阵
雅克比(Jacobian matrix)矩阵:目标函数f为一个函数向量,f=(f1(x),f2(x),-fm(x))T,自变量x=(x1,x2,-,xn)T:函数向量f对x求梯度,结果为一个矩阵:行数 ...
- Jacobian 和 Hessian 矩阵
最大特征值确定最大二阶导数,最小特征值确定最小二阶导数.
- 最优化方法——梯度 Jacobian矩阵 Hessian矩阵
一维f(x): 多维f(x):
- 牛顿法, Jacobian矩阵 和 Hessian矩阵
牛顿法 主要有两方面的应用: 求方程的根: 求解最优化方法: 为什么要用牛顿法求方程的根? 问题很多,牛顿法 是什么?目前还没有讲清楚,没关系,先直观理解为 牛顿法是一种迭代求解方法(Newton童鞋 ...
- 【矩阵学习】Jacobian矩阵和Hessian矩阵
[矩阵学习]Jacobian矩阵和Hessian矩阵 Jacobian 矩阵 Jacobian 行列式 Hessian 矩阵 Hessian 在牛顿法中的应用 Jacobian 矩阵 在向量分析中, ...
- 协方差矩阵—Hessian矩阵—正定矩阵
文章目录 一.基本概念 1.1 协方差矩阵 及推导 1.2 Hessian矩阵 1.3 Hessian矩阵 示例 1.3 正定矩阵定义及性质 1.4 正定矩阵 示例 一.基本概念 1.1 协方差矩阵 ...
- Jacobian矩阵和Hessian矩阵的理解
深度学习中梯度向量的计算,Jacobian矩阵和Hessian矩阵是基础的知识点. 求微分其实就是线性化,导数其实就是线性空间之间的线性变换,Jaocibian矩阵本质上就是导数. 比如,映射在处的导 ...
- 三维重建4:Jacobian矩阵和Hessian矩阵
在使用BA平差之前,对每一个观测方程,得到一个代价函数.对多个路标,会产生一个多个代价函数的和的形式,对这个和进行最小二乘法进行求解,使用优化方法.相当于同时对相机位姿和路标进行调整,这就是所谓的BA ...
- Jacobian矩阵、Hessian矩阵
本文来源于:http://jacoxu.com/jacobian%e7%9f%a9%e9%98%b5%e5%92%8chessian%e7%9f%a9%e9%98%b5/ 由于经常忘记雅克比矩阵和海森 ...
最新文章
- Windows Mobile使用Web Service上传和下载二进制数据流
- Redis的一些问题
- 450g带盖吐司配方_450g带盖吐司烤多久
- linux系统的数据库是本地吗,Linux下MySQL无法在本地以非root用户身份连接数据库...
- Error:Kotlin: Module was compiled with an incompatible version of Kotlin
- [C/C++基础知识] 面试再谈struct和union大小问题
- Everest 0.6 添加开机自启动程序
- java中list()和listfile()
- linux内核的I2C子系统详解2——关键结构体、关键文件
- 32位操作系统,为什么最大支持4G存储空间,2的32次方 = 4294967296bit = 4G,这个怎么计算出来的,
- 2021 ACDU China Tour-上海站暨数据库大咖讲坛(第4期)成功举办!(附视频回放PPT下载)...
- bzoj2286 [Sdoi2011]消耗战 单调栈+lca
- nginx与php处理用户请求,配置 NGINX 处理 PHP 的请求《 LEMP 网站应用运行环境 》
- 11-6-线程的概念
- springboot requestmapping 正则_SpringBoot三招组合拳,手把手教你打出优雅的后端接口...
- linux tomcat重启 报错,Linux启动Tomcat或停止Tomcat的错误解决方案
- 物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联网与互联网物联
- linux 2048移动代码,2 的威力,Linux 的威力:终端中的 2048
- kettle案例21-将字段值设置为常量
- 基于Ocean Connect云平台的照明控制系统设计
热门文章
- java io nio pio_Netty之BIO(同步阻塞IO)、PIO(偽異步阻塞IO)、NIO(異步非阻塞IO)、AIO(異步非阻塞IO)、Netty...
- css背景透明度不影响文字_唯美文字背景图 | 生活不一定很酷
- android背景颜色动态修改,Android自定义TextView带圆角及背景颜色(动态改变圆角背景颜色)...
- linux查看接口的命令,linux shell命令查看接口索引--ip link show
- mysql巡检常用命令_总结Linux下系统巡检常用命令
- 如何表示数组所有数都不等于一个数_力扣刷题那些事儿(3)-缺失的第一个正整数(41)...
- 网站选择按钮点击无反应?_Win10系统电脑鼠标左键单击没有反应的解决办法
- LeetCode 40. 组合总和 II(回溯)
- LeetCode 152. 乘积最大子序列(动态规划)
- 三维重建:三维重建技术概述