分类目录:《机器学习中的数学》总目录


有时我们需要计算输入和输出都为向量的函数的所有偏导数。包含所有这样的偏导数的矩阵被称为Jacobian矩阵。具体来说,如果我们有一个函数f:Rm→Rnf:R^m\rightarrow R^nf:Rm→Rn,fff的Jacobian矩阵J∈Rn×mJ\in R^{n\times m}J∈Rn×m定义为:
Ji,j=∂∂xjf(x)iJ_{i, j}=\frac{\partial}{\partial x_j}f(x)_iJi,j​=∂xj​∂​f(x)i​

有时,我们也对导数的导数感兴趣,即二阶导数。例如,有一个函数f:Rm→Rnf:R^m\rightarrow R^nf:Rm→Rn,fff的一阶导数(关于xjx_jxj​)关于xix_ixi​的导数记为:
∂2∂xi∂xjf(x)i\frac{\partial^2}{\partial x_i\partial x_j}f(x)_i∂xi​∂xj​∂2​f(x)i​

在一维情况下,我们可以将∂2∂x2f\frac{\partial^2}{\partial x^2}f∂x2∂2​f记为f′′(x)f''(x)f′′(x)。二阶导数告诉我们,一阶导数将如何随着输入的变化而改变。它表示只基于梯度信息的梯度下降步骤是否会产生如我们预期的那样大的改善,因此它是重要的。我们可以认为,二阶导数是对曲率的衡量。假设我们有一个二次函数,如果这样的函数具有零二阶导数,那就没有曲率,也就是一条完全平坦的线,仅用梯度就可以预测它的值。我们使用沿负梯度方向大小为ϵ\epsilonϵ的下降步,当该梯度是1时,代价函数将下降ϵ\epsilonϵ。如果二阶导数是负的,函数曲线向下凹陷(向上凸出),因此代价函数将下降得比ϵ\epsilonϵ多。如果二阶导数是正的,函数曲线是向上凹陷(向下凸出),因此代价函数将下降得比ϵ\epsilonϵ少。从下图可以看出不同形式的曲率如何影响基于梯度的预测值与真实的代价函数值的关系:

当我们的函数具有多维输入时,二阶导数也有很多。我们可以将这些导数合并成一个矩阵,称为Hessian矩阵:
H(f)(x)i,j=∂2∂xi∂xjf(x)H(f)(x)_{i,j}=\frac{\partial^2}{\partial x_i\partial x_j}f(x)H(f)(x)i,j​=∂xi​∂xj​∂2​f(x)

Hessian等价于梯度的Jacobian矩阵。微分算子在任何二阶偏导连续的点处可交换,也就是它们的顺序可以互换:
∂2∂xi∂xjf(x)=∂2∂xj∂xif(x)\frac{\partial^2}{\partial x_i\partial x_j}f(x)=\frac{\partial^2}{\partial x_j\partial x_i}f(x)∂xi​∂xj​∂2​f(x)=∂xj​∂xi​∂2​f(x)

这意味着Hi,j=Hj,iH_{i, j}=H_{j, i}Hi,j​=Hj,i​,因此Hessian矩阵在这些点上是对称的。在深度学习背景下,我们遇到的大多数函数的Hessian几乎处处都是对称的。因为Hessian矩阵是实对称的,我们可以将其分解成一组实特征值和一组特征向量的正交基。在特定方向ddd上的二阶导数可以写成dTHdd^THddTHd。当ddd是HHH的一个特征向量时,这个方向的二阶导数就是对应的特征值。对于其他的方向ddd,方向二阶导数是所有特征值的加权平均,权重在0和1之间,且与ddd夹角越小的特征向量的权重越大。最大特征值确定最大二阶导数,最小特征值确定最小二阶导数。我们可以通过(方向)二阶导数预期一个梯度下降步骤能表现得多好。我们在当前点x(0)x^{(0)}x(0)处做函数f(x)f(x)f(x)的近似二阶泰勒级数:
f(x)≈f(x(0))+(x−x(0))Tg+12(x−x(0))TH(x−x(0))f(x)\approx f(x^{(0)})+(x-x^{(0)})^Tg+\frac{1}{2}(x-x^{(0)})^TH(x-x^{(0)})f(x)≈f(x(0))+(x−x(0))Tg+21​(x−x(0))TH(x−x(0))

其中有3项:函数的原始值、函数斜率导致的预期改善和函数曲率导致的校正。当最后一项太大时,梯度下降实际上是可能向上移动的。当gTHgg^THggTHg为零或负时,近似的泰勒级数表明增加ϵ\epsilonϵ将永远使fff下降。在实践中,泰勒级数不会在ϵ\epsilonϵ大的时候也保持准确,因此在这种情况下我们必须采取更具启发式的选择。当gTHgg^THggTHg为正时,通过计算可得,使近似泰勒级数下降最多的最优步长为:
ϵ∗=gTggTHg\epsilon^*=\frac{g^Tg}{g^THg}ϵ∗=gTHggTg​

最坏的情况下,ggg与HHH最大特征值λmax⁡λ_{\max}λmax​对应的特征向量对齐,则最优步长是1λmax⁡\frac{1}{λ_{\max}}λmax​1​。当我们要最小化的函数能用二次函数很好地近似的情况下,Hessian的特征值决定了学习率的量级。二阶导数还可以用于确定一个临界点是否是局部极大点、全局极小点或鞍点。回想一下,在临界点处f′′(x)=0f''(x)=0f′′(x)=0。而f′′(x)>0f''(x)>0f′′(x)>0意味着f′(x)f'(x)f′(x)会随着我们移向右边而增加,移向左边而减小,也就是f′(x−ϵ)<0f'(x-\epsilon)<0f′(x−ϵ)<0和f′(x−ϵ)>0f'(x-\epsilon)>0f′(x−ϵ)>0对足够小的ϵ\epsilonϵ成立。换句话说,当我们移向右边,斜率开始指向右边的上坡;当我们移向左边,斜率开始指向左边的上坡。因此我们得出结论,当f′(x)=0f'(x)=0f′(x)=0且f′′(x)>0f''(x)>0f′′(x)>0时,xxx是一个全局极小点。同理,当f′(x)=0f'(x)=0f′(x)=0且f′′(x)<0f''(x)<0f′′(x)<0时,xxx是一个局部极大点。这就是所谓的二阶导数测试。不幸的是,当f′′(x)=0f''(x)=0f′′(x)=0时,测试是不确定的。在这种情况下,xxx可以是一个鞍点或平坦区域的一部分。

在多维情况下,我们需要检测函数的所有二阶导数。利用Hessian的特征值分解,我们可以将二阶导数测试扩展到多维情况。在临界点处(∇xf(x)=0\nabla_xf(x)=0∇x​f(x)=0),我们通过检测Hessian的特征值来判断该临界点是一个局部极大点、全局极小点还是鞍点。当Hessian是正定的(所有特征值都是正的),则该临界点是全局极小点。因为方向二阶导数在任意方向都是正的,参考单变量的二阶导数测试就能得出此结论。同样的,当Hessian是负定的(所有特征值都是负的),这个点就是局部极大点。在多维情况下,实际上我们可以找到确定该点是否为鞍点的积极迹象(某些情况下)。如果Hessian的特征值中至少一个是正的且至少一个是负的,那么xxx是fff某个横截面的局部极大点,却是另一个横截面的全局极小点,如下图所示。最后,多维二阶导数测试可能像单变量版本那样是不确定的。当所有非零特征值是同号的且至少有一个特征值是0时,这个检测就是不确定的。这是因为单变量的二阶导数测试在零特征值对应的横截面上是不确定的。

多维情况下,单个点处每个方向上的二阶导数是不同的。Hessian的条件数衡量这些二阶导数的变化范围。当Hessian的条件数很差时,梯度下降法也会表现得很差。这是因为一个方向上的导数增加得很快,而在另一个方向上增加得很慢。梯度下降不知道导数的这种变化,所以它不知道应该优先探索导数长期为负的方向。病态条件也导致很难选择合适的步长。步长必须足够小,以免冲过最小而向具有较强正曲率的方向上升。这通常意味着步长太小,以至于在其他较小曲率的方向上进展不明显,如下图所示:

我们可以使用Hessian矩阵的信息来指导搜索,以解决这个问题。其中最简单的方法是牛顿法(Newton’smethod)。牛顿法基于一个二阶泰勒展开来近似x(0)x^{(0)}x(0)附近的f(x)f(x)f(x):
f(x)≈f(x(0))+(x−x(0))T∇xf(x(0))+12(x−x(0))TH(f)(x(0))(x−x(0))f(x)\approx f(x^{(0)})+(x-x^{(0)})^T\nabla_xf(x^{(0)})+\frac{1}{2}(x-x^{(0)})^TH(f)(x^{(0)})(x-x^{(0)})f(x)≈f(x(0))+(x−x(0))T∇x​f(x(0))+21​(x−x(0))TH(f)(x(0))(x−x(0))

通过计算,我们可以得到这个函数的临界点:
x∗=x(0)−H(f)(x(0))−1∇xf(x(0))x^*=x^{(0)}-H(f)(x^{(0)})^{-1}\nabla_xf(x^{(0)})x∗=x(0)−H(f)(x(0))−1∇x​f(x(0))

如果fff是一个正定二次函数,牛顿法只要应用一次上式就能直接跳到函数的最小点。如果fff不是一个真正二次但能在局部近似为正定二次,牛顿法则需要多次迭代应用上式。迭代地更新近似函数和跳到近似函数的最小点可以比梯度下降更快地到达临界点。这在接近全局极小点时是一个特别有用的性质,但是在鞍点附近是有害的。当附近的临界点是最小点(Hessian的所有特征值都是正的)时牛顿法才适用,而梯度下降不会被吸引到鞍点(除非梯度指向鞍点)。

仅使用梯度信息的优化算法称为一阶优化算法,如梯度下降。使用Hessian矩阵的优化算法称为二阶最优化算法,如牛顿法。大多数优化算法适用于各种各样的函数,但几乎都没有理论保证。因为在深度学习中使用的函数族是相当复杂的,所以深度学习算法往往缺乏理论保证。在许多其他领域,优化的主要方法是为有限的函数族设计优化算法。在深度学习的背景下,限制函数满足Lipschitz连续或其导数Lipschitz连续可以获得一些保证。Lipschitz连续函数的变化速度以Lipschitz常数LLL为界:
∀x,∀y:∣f(x)−f(y)∣≤L∣∣x−y∣∣2\forall x,\forall y:|f(x)-f(y)|\leq L||x-y||_2∀x,∀y:∣f(x)−f(y)∣≤L∣∣x−y∣∣2​

这个属性允许我们量化自己的假设——梯度下降等算法导致的输入的微小变化将使输出只产生微小变化,因此是很有用的。Lipschitz连续性也是相当弱的约束,并且深度学习中很多优化问题经过相对较小的修改后就能变得Lipschitz连续。最成功的特定优化领域或许是凸优化。凸优化通过更强的限制提供更多的保证。凸优化算法只对凸函数适用,即Hessian处处半正定的函数。因为这些函数没有鞍点而且其所有全局极小点必然是全局最小点,所以表现很好。然而,深度学习中的大多数问题都难以表示成凸优化的形式。凸优化仅用作一些深度学习算法的子程序。凸优化中的分析思路对证明深度学习算法的收敛性非常有用,然而一般来说,深度学习背景下凸优化的重要性大大减少。

机器学习中的数学——Jacobian矩阵和Hessian矩阵相关推荐

  1. Jacobian矩阵和Hessian矩阵的理解

    深度学习中梯度向量的计算,Jacobian矩阵和Hessian矩阵是基础的知识点. 求微分其实就是线性化,导数其实就是线性空间之间的线性变换,Jaocibian矩阵本质上就是导数. 比如,映射在处的导 ...

  2. 三维重建4:Jacobian矩阵和Hessian矩阵

    在使用BA平差之前,对每一个观测方程,得到一个代价函数.对多个路标,会产生一个多个代价函数的和的形式,对这个和进行最小二乘法进行求解,使用优化方法.相当于同时对相机位姿和路标进行调整,这就是所谓的BA ...

  3. 机器学习中的数学知识(part1)

    学习笔记,仅供参考,有错必纠 参考自:<机器学习与应用>–雷明 文章目录 机器学习中的数学知识 偏导数与梯度 雅克比矩阵 Hessian矩阵 奇异值分解 向量与矩阵求导 机器学习中的数学知 ...

  4. 机器学习中的数学(七)--凸优化的基础知识

    写在前面 <机器学习中的数学>系列主要列举了在机器学习中用到的较多的数学知识,包括微积分,线性代数,概率统计,信息论以及凸优化等等.本系列重在描述基本概念,并不在应用的方面的做深入的探讨, ...

  5. 机器学习中的数学(四)--线性代数

    写在前面 <机器学习中的数学>系列主要列举了在机器学习中用到的较多的数学知识,包括微积分,线性代数,概率统计,信息论以及凸优化等等.本系列重在描述基本概念,并不在应用的方面的做深入的探讨, ...

  6. 机器学习中的数学(三)--牛顿法

    写在前面 <机器学习中的数学>系列主要列举了在机器学习中用到的较多的数学知识,包括微积分,线性代数,概率统计,信息论以及凸优化等等.本系列重在描述基本概念,并不在应用的方面的做深入的探讨, ...

  7. 机器学习中的数学——拟牛顿法(Quasi-Newton Methods)

    分类目录:<机器学习中的数学>总目录 相关文章: · 梯度下降法(Gradient Descent) · 随机梯度下降(Stochastic Gradient Descent, SGD) ...

  8. 机器学习中的数学(上)

      上篇博文介绍了<机器学习之支持向量机>后发现利用到了梯度.凸优化.拉格朗日对偶性等数学问题.而且凸优化是本科非数学专业学不到的科目,所以这篇博文就要和大家分享一下机器学习中常用的数学概 ...

  9. 机器学习中的数学——牛顿迭代法(Newton‘s Method)

    分类目录:<机器学习中的数学>总目录 相关文章: · 梯度下降法(Gradient Descent) · 随机梯度下降(Stochastic Gradient Descent, SGD) ...

最新文章

  1. 【赠书】阿里巴巴官方出品,工业级知识图谱最新书籍领取!
  2. Android PowerImageView实现,可以播放动画的强大ImageView
  3. MySQL8.0 · 优化器新特性 · Cost Model, 直方图及优化器开销优化
  4. python导入pillow模块_Python:argparse模块和pillow-image
  5. python 获取脚本当前路径_Python获取脚本所在目录的正确方法
  6. Spring Boot学习总结(9)——SpringBoot集成Ehcache3.x
  7. CentOS 配置自启动Redis
  8. stm32f407 spi3 mosi没有输出_正点原子STM32F407探索者开发板资料连载第56章 USB 读卡器实验
  9. Tomcat控制台乱码
  10. SQLMAP 注入教程
  11. debug常规的基本使用
  12. 基于51单片机及MAX6675的8通道测温系统 protues仿真
  13. Android 点击图片全屏预览 -——ZoomPreviewPicture默认预览使用
  14. wifi连接一段时间才能上网_Win7系统下连接wifi一段时间就自动断线怎么办【图文】...
  15. CSS高级篇——属性选择器 (attribute selectors)
  16. 输入圆锥体的半径和高,并求体积
  17. [OpenCV实战]39 在OpenCV中使用ArUco标记的增强现实
  18. 基于Java的文本相似度计算
  19. 美团饿了么外卖CPS项目怎么做?简单推广每天躺赚(附源码和搭建教程)
  20. 易失性存储DRAM详解

热门文章

  1. Opentsdb简介
  2. 2012年半程盘点之最佳iPad应用
  3. CRC32教程_个人理解
  4. go语言实现消息队列模型
  5. 免费接口API:二维码图片地址 返回识别出的内容。通用文字识别
  6. 怎么批量统计微博播放量、阅读、粉丝数据
  7. element 手机适配_手机端rem适配方案_蓝戒的博客
  8. 仿迅雷实现下载工具,支持断点续传和多线程下载以及简单界面展示
  9. 移动平台商家支付宝如何获取商户私钥,支付宝公钥。
  10. 对象、同义词和公有同义词顺序选取