libtorch学习笔记(14)- 梯度的数学解释

2 篇文章 0 订阅
2 篇文章 0 订阅

梯度可以说是神经网络优化器最基本的一个概念,一直听到这词,但是对于其数学含义,以前还不是特别明白,最近看到一篇不错的文章介绍梯度的文章An introduction to the directional derivative and the gradient,这里翻译一下,并附上自己的理解

方向导数(The directional derivative)

假设用一个函数 f ( x , y ) f(x, y) f(x,y)表示在一条山脉每个位置 x = ( x , y ) \bold x = (x,y) x=(x,y)的高度。如果你站在一个点 x = a \bold x = \bold a x=a,在你面前的地面的斜率将取决于你面向的方向,在某一个方向可能是陡峭的上坡路,而某个方向相对比较平坦,而在另外一个方向却是陡峭的下坡路。

f f f 偏 导 数 \color{red}{偏导数} 将给出x轴方向的斜率 ∂ f ∂ x {∂f}\over{∂x} xf,y轴方向的斜率 ∂ f ∂ y {∂f}\over{∂y} yf。我们可以推广偏导数求任意方向的斜率。对应的结果称为方向导数。

取方向导数的第一步是指定一个方向。指定一个方向的一种方法是采用向量 u = ( u 1 , u 2 ) \bold u=(u_1, u_2) u=(u1,u2),这个向量指定了要计算斜率的方向。简化一下,这里的 u \bold u u是一个单位向量。我们将沿着方向 u \bold u u在点 a \bold a a上的 f f f的方向导数记做: D u f ( a ) D_uf(\bold a) Duf(a),并且通过极限形式把它定义做一个普通导数或者偏导数:
D u f ( a ) = lim ⁡ h → 0 f ( a + h u ) − f ( a ) h D_uf(\bold a) = \lim_{\mathclap{h\to0}} {{f(\bold a+h\bold u) - f(\bold a)} \over {h}} Duf(a)=h0limhf(a+hu)f(a)
这个看起来 f ( x , y ) f(x,y) f(x,y)突然不见了,但是不用担心。
方向导数的概念很简单; D u f ( a ) D_uf(\bold a) Duf(a)是站在 a \bold a a点面向通过 u \bold u u给定的方向上 f ( x , y ) f(x,y) f(x,y)的斜率。如果x和y给定的单位是米,那么 D u f ( a ) D_uf(\bold a) Duf(a)就是当你站在 a \bold a a沿着 u \bold u u方向上每移动一米高度的变化。
这里要注意的是 D u f ( a ) D_uf(\bold a) Duf(a)是一个数字,而不是一个矩阵或者向量。如果 u \bold u u指向的是x轴,或者y轴,方向导数就相当于偏导数。比如,如果 u \bold u u = (1, 0),那么 D u f ( a ) = ∂ f ∂ x D_uf(\bold a) = {{∂f}\over{∂x}} Duf(a)=xf,同样 u \bold u u = (0, 1),那么 D u f ( a ) = ∂ f ∂ y D_uf(\bold a) = {{∂f}\over{∂y}} Duf(a)=yf

在下Java Applet中,一座山脉的高度 f ( x , y ) f(x,y) f(x,y)被显示在曲面图(a surface plot)(左)和等高线图(a level curve plot)(右)。对定义方向导数 D u f ( a ) D_uf(\bold a) Duf(a)的点和 u \bold u u方向的解释,在右边的二维等高线图可能看起来更清晰一下(译者注:个人觉得左边图更清晰,红点表示 a \bold a a,浅绿色的粗箭头代表防线 u \bold u u,而深绿色细箭头表示则是方向导数 D u f ( a ) D_uf(\bold a) Duf(a)),所以我们先聚焦在右边的图,你能通过等高线图中紧密的环形线来辨识山脉的陡峭。在这个Java Applet你能来回移动点 a \bold a a(红色的点),也可以改变方向 u \bold u u来观察方向导数 D u f ( a ) D_uf(\bold a) Duf(a)如何变化。如果设置 u \bold u u指向正东方(在Applet中 θ = 0 \theta = 0 θ=0),这样 u \bold u u指向x轴正方向( u = ( 1 , 0 ) \bold u=(1,0) u=(1,0)),那么 D u f ( a ) = ∂ f ∂ x D_uf(\bold a) = {{∂f}\over{∂x}} Duf(a)=xf。同样的 u \bold u u指向正北方(在Applet中 θ = π / 2 \theta = \pi/2 θ=π/2),这样 u \bold u u指向y轴正方向( u = ( 0 , 1 ) \bold u=(0,1) u=(0,1)),那么 D u f ( a ) = ∂ f ∂ y D_uf(\bold a) = {{∂f}\over{∂y}} Duf(a)=yf
在这里插入图片描述
在这里插入图片描述
如果让 u \bold u u指向一个平行于等高线的方向,什么事情会发生在 D u f ( a ) D_uf(\bold a) Duf(a)?(因为沿着等高线高度是恒定的,因此您应该能够推断该方向的坡度应该是多少)在任何一个方向 u \bold u u,当把 u \bold u u指向相反的方向(比如,从 θ \theta θ增加或者减少 π \pi π)?

在曲面图上,山脉的陡峭程度可能比较容易看出来。但是这个图会产生一些误解,因为它会让你认为点 a \bold a a和方向向量 u \bold u u在一个三位空间里,其实它们是在一个二维空间里。在这个曲面图上,红点悬浮在山脉平面的三维空间中,在曲面上红点不是 a \bold a a;相反 a \bold a a点是红点在xy-平面的阴影。第二,代表 u \bold u u的淡绿色向量悬浮在曲面上。对二维方向向量 u \bold u u一个更好的表述:它是浅绿色向量在xy-平面阴影。

虽然曲面图有助于辨识方向导数 D u f ( a ) D_uf(\bold a) Duf(a)是曲面的斜率。深绿向量在指定向量 u \bold u u的方向上指向上方或者下方山脉。这个向量的斜率(这个和曲面的斜率是一回事)是方向导数。这个向量(旋转到指向右侧)显示在 D u f ( a ) D_uf(\bold a) Duf(a)旁边,以进一步强调此点。

梯度(gradient)

在大多数情况下,总有一个方向 u \bold u u,沿着它这个方向导数 D u f ( a ) D_uf(\bold a) Duf(a)是最大的。这是一个“上山”的方向。(在有些情况下,比如当你在山顶或者在山谷底,可能不是这样的)让我们称这个有最大斜率的方向为 m \bold m m。方向 u \bold u u和最大的斜率 D m f ( a ) D_mf(\bold a) Dmf(a)决定了f梯度,并且用符号 ∇ f ( a ) \nabla f(\bold a) f(a)表示。 梯 度 是 一 个 沿 着 m 方 向 的 向 量 , 且 其 模 长 是 D m f ( a ) \color{red}梯度是一个沿着\bold m方向的向量,且其模长是D_mf(\bold a) 沿mDmf(a)。在数学上,我们可以把它写作 ∇ f ( a ) ∥ ∇ f ( a ) ∥ = m {\nabla f(\bold a) \over {\lVert \nabla f(\bold a) \rVert} }= m f(a)f(a)=m,并且 ∥ ∇ f ( a ) ∥ = D m f ( a ) {\lVert \nabla f(\bold a) \rVert} = D_mf(\bold a) f(a)=Dmf(a)

下面Java Applet演示了梯度,和它与方向向量的关系。这里 θ \theta θ的定义与上面图提到不一样。这里 θ \theta θ是梯度和向量 u \bold u u的夹角。当 θ = 0 \theta=0 θ=0 u \bold u u和梯度指向相同的方向。
在这里插入图片描述
红色梯度向量总是指向山脉(事实上,梯度总是垂直于等高线)。当等高线越密集的时候,梯度越大。在山顶上梯度代表什么?

注意当 θ = 0 ( o r θ = 2 π ) \theta =0(or \theta=2\pi) θ=0(orθ=2π),方向导数 D u f ( a ) D_uf(\bold a) Duf(a)和梯度模 ∥ ∇ f ( a ) ∥ \lVert \nabla f(\bold a) \rVert f(a)是相等的,也就是 D u f ( a ) = ∥ ∇ f ( a ) ∥ D_uf(\bold a)=\lVert \nabla f(\bold a) \rVert Duf(a)=f(a)。当 θ = π \theta =\pi θ=π u \bold u u指向梯度相反的方向,并且 D u f ( a ) = − ∥ ∇ f ( a ) ∥ D_uf(\bold a)=-\lVert \nabla f(\bold a) \rVert Duf(a)=f(a)。那对于什么 θ \theta θ D u f ( a ) = 0 D_uf(\bold a)=0 Duf(a)=0?

通过来回移动 a \bold a a(深色红点)和改变 θ \theta θ,我希望你能确认一点,对于一个固定的 a \bold a a,当 u \bold u u ∇ f ( a ) \nabla f(\bold a) f(a)在同一方向的时候(比如,当 θ = 0 \theta=0 θ=0或者 θ = 2 π \theta=2\pi θ=2π), D u f ( a ) D_uf(\bold a) Duf(a)会取最大值;当 u \bold u u ∇ f ( a ) \nabla f(\bold a) f(a)在相反方向的时候(比如,当 θ = 0 \theta=0 θ=0或者 θ = 2 π \theta=2\pi θ=2π),会取最小值。因此 D u f ( a ) D_uf(\bold a) Duf(a)总是位于 − ∥ ∇ f ( a ) ∥ -\lVert \nabla f(\bold a) \rVert f(a) ∥ ∇ f ( a ) ∥ \lVert \nabla f(\bold a) \rVert f(a)之间。总的来说梯度和方向导数之间的关系可以用下面的等式表示:
D u f ( a ) = ∇ f ( a ) ⋅ u = ∥ ∇ f ( a ) ∥ ∥ u ∥ c o s ( θ ) = ∥ ∇ f ( a ) ∥ c o s ( θ ) \begin{aligned} D_uf(\bold a) &= \nabla f(\bold a) \cdot \bold u\\ &=\lVert \nabla f(\bold a) \rVert \lVert \bold u \rVert cos(\theta)\\ &=\lVert \nabla f(\bold a) \rVert cos(\theta)\\ \end{aligned} Duf(a)=f(a)u=f(a)ucos(θ)=f(a)cos(θ)
在这里 θ \theta θ u \bold u u和梯度的夹角。(记得前面提到 u \bold u u是一个单位向量,这意味着 ∥ u ∥ = 1 \lVert \bold u \rVert = 1 u=1)。

但是究竟梯度的什么?
本文主要是对方向导数和梯度给你一个直观的印象,但是没有提到梯度确切的意义。上面关于方向导数的公式很不错,但是如果你不知道怎么计算 ∥ ∇ f ( a ) ∥ \lVert \nabla f(\bold a) \rVert f(a),它就没有什么用。幸运的是,最终结果相当简单,因为梯度偏导数矩阵的另外一种形式。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值