直观理解梯度,以及偏导数、方向导数和法向量等_shine-lee的博客-程序员秘密

技术标签: 数学  

博客:blog.shinelee.me | 博客园 | CSDN

写在前面

梯度是微积分中的基本概念,也是机器学习解优化问题经常使用的数学工具(梯度下降算法),虽然常说常听常见,但其细节、物理意义以及几何解释还是值得深挖一下,这些不清楚,梯度就成了“熟悉的陌生人”,仅仅“记住就完了”在用时难免会感觉不踏实,为了“用得放心”,本文将尝试直观地回答以下几个问题,

  • 梯度与偏导数的关系?
  • 梯度与方向导数的关系?
  • 为什么说梯度方向是上升最快的方向,负梯度方向为下降最快的方向?
  • 梯度的模有什么物理意义?
  • 等高线图中绘制的梯度为什么垂直于等高线?
  • 全微分与隐函数的梯度有什么关系?
  • 梯度为什么有时又成了法向量?

闲话少说,书归正传。在全篇“作用域”内,假定函数可导。

偏导数

在博文《单变量微分、导数与链式法则 博客园 | CSDN | blog.shinelee.me》中,我们回顾了常见初等函数的导数,概括地说,

导数是一元函数的变化率(斜率)。导数也是函数,是函数的变化率与位置的关系。

如果是多元函数呢?则为偏导数

偏导数是多元函数“退化”成一元函数时的导数,这里“退化”的意思是固定其他变量的值,只保留一个变量,依次保留每个变量,则 N N N元函数有 N N N个偏导数。

以二元函数为例,令 z = f ( x , y ) z=f(x,y) z=f(x,y),绘制在3维坐标系如下图所示,

z = f(x, y)

在分别固定 y y y x x x的取值后得到下图中的黑色曲线——“退化”为一元函数,二维坐标系中的曲线——则偏导数 ∂ z ∂ x \frac{\partial {z}}{\partial {x}} xz ∂ z ∂ y \frac{\partial z}{\partial y} yz分别为曲线的导数(切线斜率)

partial derivative x

partial derivative y

由上可知,一个变量对应一个坐标轴,偏导数为函数在每个位置处沿着自变量坐标轴方向上的导数(切线斜率)

Partial derivative

方向导数

如果是方向不是沿着坐标轴方向,而是任意方向呢?则为方向导数。如下图所示,点 P P P位置处红色箭头方向的方向导数为黑色切线的斜率,来自链接Directional Derivative

Directional Derivative

方向导数为函数在某一个方向上的导数,具体地,定义 x y xy xy平面上一点 ( a , b ) (a, b) (a,b)以及单位向量 u ⃗ = ( cos ⁡ θ , sin ⁡ θ ) \vec u = (\cos \theta ,\sin \theta ) u =(cosθ,sinθ),在曲面 z = f ( x , y ) z=f(x, y) z=f(x,y)上,从点 ( a , b , f ( a , b ) ) (a,b, f(a,b)) (a,b,f(a,b))出发,沿 u ⃗ = ( cos ⁡ θ , sin ⁡ θ ) \vec u = (\cos \theta ,\sin \theta ) u =(cosθ,sinθ)方向走 t t t单位长度后,函数值 z z z F ( t ) = f ( a + t cos ⁡ θ , b + t sin ⁡ θ ) F(t)=f(a+t \cos \theta, b + t \sin \theta) F(t)=f(a+tcosθ,b+tsinθ),则点 ( a , b ) (a,b) (a,b) u ⃗ = ( cos ⁡ θ , sin ⁡ θ ) \vec u = (\cos \theta ,\sin \theta ) u =(cosθ,sinθ)方向的方向导数为:
d d t f ( a + t cos ⁡ θ , b + t sin ⁡ θ ) ∣ t = 0 = lim ⁡ t → 0 f ( a + t cos ⁡ θ , b + t sin ⁡ θ ) − f ( a , b ) t = lim ⁡ t → 0 f ( a + t cos ⁡ θ , b + t sin ⁡ θ ) − f ( a , b + t sin ⁡ θ ) t + lim ⁡ t → 0 f ( a , b + t sin ⁡ θ ) − f ( a , b ) t = ∂ ∂ x f ( a , b ) d x d t + ∂ ∂ y f ( a , b ) d y d t = f x ( a , b ) cos ⁡ θ + f y ( a , b ) sin ⁡ θ = ( f x ( a , b ) , f y ( a , b ) ) ⋅ ( cos ⁡ θ , sin ⁡ θ ) \begin{aligned} &\left.\frac{d}{d t} f(a+t \cos \theta, b+t \sin \theta)\right|_{t=0} \\=& \lim _{t \rightarrow 0} \frac{f(a+t \cos \theta, b+t \sin \theta) - f(a, b)}{t} \\=& \lim _{t \rightarrow 0} \frac{f(a+t \cos \theta, b+t \sin \theta) - f(a, b+t \sin \theta)}{t} + \lim _{t \rightarrow 0} \frac{f(a, b+t \sin \theta) - f(a, b)}{t} \\=& \frac{\partial}{\partial x} f(a, b) \frac{d x}{d t}+\frac{\partial}{\partial y} f(a, b) \frac{d y}{d t} \\=& f_x (a, b) \cos \theta+ f_y (a, b) \sin \theta \\=&\left(f_x (a, b), f_y (a, b)\right) \cdot(\cos \theta, \sin \theta) \end{aligned} =====dtdf(a+tcosθ,b+tsinθ)t=0t0limtf(a+tcosθ,b+tsinθ)f(a,b)t0limtf(a+tcosθ,b+tsinθ)f(a,b+tsinθ)+t0limtf(a,b+tsinθ)f(a,b)xf(a,b)dtdx+yf(a,b)dtdyfx(a,b)cosθ+fy(a,b)sinθ(fx(a,b),fy(a,b))(cosθ,sinθ)
上面推导中使用了链式法则。其中, f x ( a , b ) f_x (a, b) fx(a,b) f y ( a , b ) f_y (a, b) fy(a,b)分别为函数在 ( a , b ) (a, b) (a,b)位置的偏导数。由上面的推导可知:

该位置处,任意方向的方向导数为偏导数的线性组合,系数为该方向的单位向量。当该方向与坐标轴正方向一致时,方向导数即偏导数,换句话说,偏导数为坐标轴方向上的方向导数,其他方向的方向导数为偏导数的合成

写成向量形式,偏导数构成的向量 ∇ f ( a , b ) = ( f x ( a , b ) , f y ( a , b ) ) \nabla f(a, b) = (f_x (a, b), f_y (a, b)) f(a,b)=(fx(a,b),fy(a,b)),称之为梯度

梯度

梯度,写作 ∇ f \nabla f f,二元时为 ( ∂ z ∂ x , ∂ z ∂ y ) (\frac{\partial{z}}{\partial{x}}, \frac{\partial{z}}{\partial{y}}) (xz,yz),多元时为 ( ∂ z ∂ x , ∂ z ∂ y , …   ) (\frac{\partial{z}}{\partial{x}}, \frac{\partial{z}}{\partial{y}},\dots) (xz,yz,)

我们继续上面方向导数的推导, ( a , b ) (a,b) (a,b) θ \theta θ方向上的方向导数为
( f x ( a , b ) , f y ( a , b ) ) ⋅ ( cos ⁡ θ , sin ⁡ θ ) = ∣ ( ( f x ( a , b ) , f y ( a , b ) ) ∣ ⋅ ∣ 1 ∣ ⋅ cos ⁡ ϕ = ∣ ∇ f ( a , b ) ∣ ⋅ cos ⁡ ϕ \begin{aligned} &\left(f_x (a, b), f_y (a, b)\right) \cdot(\cos \theta, \sin \theta) \\ =& |((f_x (a, b), f_y (a, b))| \cdot |1| \cdot \cos \phi \\=& |\nabla f(a,b)| \cdot \cos \phi \end{aligned} ==(fx(a,b),fy(a,b))(cosθ,sinθ)((fx(a,b),fy(a,b))1cosϕf(a,b)cosϕ
其中, ϕ \phi ϕ ∇ f ( a , b ) \nabla f(a,b) f(a,b) u ⃗ \vec u u 的夹角,显然,当 ϕ = 0 \phi = 0 ϕ=0 u ⃗ \vec u u 与梯度 ∇ f ( a , b ) \nabla f(a,b) f(a,b)同向时方向导数取得最大值最大值为梯度的模 ∣ ∇ f ( a , b ) ∣ |\nabla f(a,b)| f(a,b),当 ϕ = π \phi = \pi ϕ=π u ⃗ \vec u u 与梯度 ∇ f ( a , b ) \nabla f(a,b) f(a,b)反向时方向导数取得最小值,最小值为梯度模的相反数。此外,根据上面方向导数的公式可知,在夹角 ϕ < π 2 \phi < \frac{\pi}{2} ϕ<2π时方向导数为正,表示 u ⃗ \vec u u 方向函数值上升, ϕ > π 2 \phi > \frac{\pi}{2} ϕ>2π时方向导数为负,表示该方向函数值下降。

至此,方才有了梯度的几何意义

  1. 当前位置的梯度方向,为函数在该位置处方向导数最大的方向,也是函数值上升最快的方向,反方向为下降最快的方向;
  2. 当前位置的梯度长度(模),为最大方向导数的值。

等高线图中的梯度

在讲解各种优化算法时,我们经常看到目标函数的等高线图示意图,如下图所示,来自链接Applet: Gradient and directional derivative on a mountain

Kl27an.png

图中,红点为当前位置,红色箭头为梯度,绿色箭头为其他方向,其与梯度的夹角为 θ \theta θ

将左图中 z = f ( x , y ) z=f(x, y) z=f(x,y)曲面上的等高线投影到 x y xy xy平面,得到右图的等高线图。

梯度与等高线垂直。为什么呢?

等高线,顾名思义,即这条线上的点高度(函数值)相同,令某一条等高线为 z = f ( x , y ) = C z=f(x,y)=C z=f(x,y)=C C C C为常数,两边同时全微分,如下所示

d z = ∂ f ∂ x d x + ∂ f ∂ y d y = ( ∂ f ∂ x , ∂ f ∂ y ) ⋅ ( d x , d y ) = d C = 0 \begin{aligned} dz = &\frac{\partial f}{\partial x} dx + \frac{\partial f}{\partial y} dy \\=& (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}) \cdot (dx, dy) \\=& dC = 0\end{aligned} dz===xfdx+yfdy(xf,yf)(dx,dy)dC=0

这里,两边同时全微分的几何含义是,在当前等高线上挪动任意一个极小单元,等号两侧的变化量相同 f ( x , y ) f(x, y) f(x,y)的变化量有两个来源,一个由 x x x的变化带来,另一个由 y y y的变化带来,在一阶情况下,由 x x x带来的变化量为 ∂ f ∂ x d x \frac{\partial f}{\partial x} dx xfdx,由 y y y带来的变化量为 ∂ f ∂ y d y \frac{\partial f}{\partial y} dy yfdy,两者叠加为 z z z的总变化量,等号右侧为常数,因为我们指定在当前等高线上挪动一个极小单元,其变化量为0,左侧等于右侧。进一步拆分成向量内积形式, ( ∂ f ∂ x , ∂ f ∂ y ) (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}) (xf,yf)为梯度, ( d x , d y ) (dx, dy) (dx,dy)为该点指向任意方向的极小向量,因为两者内积为0,所以两者垂直。自然不难得出梯度与等高线垂直的结论。

更进一步地,梯度方向指向函数上升最快的方向,在等高线图中,梯度指向高度更高的等高线

隐函数的梯度

同理,对于隐函数 f ( x , y ) = 0 f(x,y)=0 f(x,y)=0,也可以看成是一种等高线。二元时,两边同时微分,梯度垂直于曲线;多元时,两边同时微分,梯度垂直于高维曲面。

即,隐函数的梯度为其高维曲面的法向量

有了法向量,切线或切平面也就不难计算得到了。令曲线 f ( x , y ) f(x , y) f(x,y)上一点为 ( a , b ) (a,b) (a,b),通过全微分得该点的梯度为 ( f x , f y ) (f_x, f_y) (fx,fy),则该点处的切线为 f x ( x − a ) + f y ( y − b ) = 0 f_x (x-a) + f_y (y-b) = 0 fx(xa)+fy(yb)=0,相当于将上面的微分向量 ( d x , d y ) (dx, dy) (dx,dy)替换为 ( x − a , y − b ) (x-a, y-b) (xa,yb),其几何意义为法向量垂直切平面上的任意向量。

小结

至此,文章开篇几个问题的答案就不难得出了,

  • 偏导数构成的向量为梯度;
  • 方向导数为梯度在该方向上的合成,系数为该方向的单位向量;
  • 梯度方向为方向导数最大的方向,梯度的模为最大的方向导数;
  • 微分的结果为梯度与微分向量的内积
  • 等高线全微分的结果为0,所以其梯度垂直于等高线,同时指向高度更高的等高线
  • 隐函数可以看成是一种等高线,其梯度为高维曲面(曲线)的法向量

以上。

参考

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/firelx/article/details/102668951

智能推荐

AMNet_输入到残差网路50的尺寸大小最好为多少_qq_38453997的博客-程序员秘密

Deep Atrous Muliscale Stereo Disparity Estimation Networks摘要:提出了一种新的立体视差估计深度学习结构。提出的AMNet采用高效的特征提取器和深度卷积,扩展的coat volume在深度特征上提出了新的构成方式。提出了一种堆叠的多尺度网络,从coat volume中提取丰富的多尺度上下文信息,从而在多尺度上对视差进行高精度估计。AMNet...

洛谷 P1196 [NOI2002]银河英雄传说 带权并查集_化身孤岛的鲸o的博客-程序员秘密

洛谷 P1196 [NOI2002]银河英雄传说 带权并查集题解:本题所求的不止是两个编号之间是否有关系,还要求两个编号之间有什么关系,这就要求我们维护多个数组,fa[]数组维护两个编号之间的连通性,dis[]维护编号为i的战舰到fa[i]之间的距离,num[]维护编号为i的战舰所在的那一列有多少战舰。代码如下:#include&lt;iostream&gt;#include&lt;al...

echarts 自定义Z值直方图_echarts z_小贵子的博客的博客-程序员秘密

&amp;lt;script&amp;gt; $(function() { // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById('main')); // 指定图表的配置项和数据 var data = [ // 维度0 维度1 维度2 维度3 ...

新一代超低功耗STM32U5,到底有啥亮点?_strongerHuang的博客-程序员秘密

关注+星标公众号,不错过精彩内容作者 | strongerHuang微信公众号|嵌入式专栏在今年年初(2021年2月25日),ST官方宣布推出了全新超低功耗系列STM32U5,内核采用...

基于SmartThreadPool线程池技术实现多任务批量处理_weixin_33885253的博客-程序员秘密

一、多线程技术应用场景介绍本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何采用基于开源组件SmartThreadPool线程池技术实现多任务批量处理。在工作中您是否遇到过如何快速高效的处理Job任务列表、如何通过多线程批量处理订单、如何多线程群发短信、如何批量上传图片到远程图片服务器或者云存储图片服务器、如何通过多线程让应用程序提高对CPU的利用率从而增加...

Mysql数据库理论基础之五--SELECT单多表查询、子查询、别名_weixin_33961829的博客-程序员秘密

一、简介由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点:1、是一种数据库管理系统2、是一种关联数据库管理系统3、是一种开放源码软件,且有大量可用的共享MySQL软件4、MySQL数据库服务器具有快速、可靠和易于使用的特点5、MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可...

随便推点

linux内核链表的实现_linux内核链表实现方式_IT人Key的博客-程序员秘密

<br />本文会记录一些linux内核实现中使用到的一些小技巧,工具等等,会根据学习进度不定时更新本文......<br />双向循环链表<br /> 第一个想写的是linux的双向循环链表(写这个的原因是因为最近学习epoll的内核代码实现,进而需要了解linux的等待队列,这其中也用到了双向循环链表,稍后也会分析linux的等待队列)<br /> linux的双向循环链表之于传统的双向循环链表,其优点是:将其从具体的数据结构中提取出来构成一种通用的循环链表实现,在linux中表现形式为:<br />

修改tomcat catalina.bat调整jvm内存及tomcat窗口标题_乘桴游海的博客-程序员秘密

开发这么久了,总会时不时碰到内存溢出的错误,知道应该去 catalina 中去设置一下jvm的内存大小。可是每次都忘记具体在哪个位置。而且,很多时候,出现内存溢出的环境都不是本机,而是服务器搭建环境的时候,而此时也没太多时间让自己去读一下 catalina.bat 这个脚本,只能每次都上网搜。今天正好有时间,就读了一下catalina.bat 这个脚本,记录一下。 以windows下的tomcat

Home Assistant 开发指南_homeassistant frontend_TommySte的博客-程序员秘密

HA运行指南前言运行core+frontend1. 下载源码2. 安装依赖3. 组装 frontend4. 配置 nodejs5. 运行前言Home Assistant 是一款智能家居管理系统的开源库。官方文档:环境配置frontend 配置运行环境:Debian + VSCode备注:建议在 Linux 下运行,Windows 请按照官方文档安装配置 WSL(Windows Subsystem for Linux)core+frontendcore 也即 ha 的核,是核心部分,f

转载博客 htm5l实现滚动播放_szcsun5的博客-程序员秘密

Yorhom's Game Box用自己的双手绘画自己的游戏天地,用自己的智慧换取成功的喜悦目录视图摘要视图订阅【免费公开课】Gulp前端自动化教程   【专家问答】陈绍英:大型IT系统性能测试实战   【博客活动】有奖征文--走进VR开发世界   『HTML5梦幻之旅』-滚动播放的幻灯片效果

20155229 2016-2017-2 《Java程序设计》第十周学习总结_weixin_34377919的博客-程序员秘密

20155229 2016-2017-2 《Java程序设计》第十周学习总结教材学习内容总结网络网络分为局域网、广域网、城域网一次HTTP请求包含3个部分:①方法--统一资源标识符--协议/版本② 请求头③ 请求实体HTTP包含3个部分:①协议--状态码--说明;②响应头;③响应实体。HTTP是URL中最常使用的协议URLConnection类有两个布尔类型的字段,doInpu...

IDA安装lazyIDA_sheepbotany的博客-程序员秘密

插件链接:https://github.com/P4nda0s/LazyIDA很多文章说把lazyIDA.py文件放进IDA的plugins中就好了但是我右键convert依然没出现,观察一下IDA,发现控制台报错这说明它缺少一个叫做PyQt5的包,所以你需要pip导入:打开cmd:pip install PyQt5,因为我已经导入了,所以显示安装成功实在是太心酸了,这几天我已经试过所有方法,安装了python2与python3,重新安装IDA,还试图手动导入python脚本。。。。。。如

推荐文章

热门文章

相关标签