梯度可以说是神经网络优化器最基本的一个概念,一直听到这词,但是对于其数学含义,以前还不是特别明白,最近看到一篇不错的文章介绍梯度的文章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} ∂x∂f,y轴方向的斜率 ∂ f ∂ y {∂f}\over{∂y} ∂y∂f。我们可以推广偏导数求任意方向的斜率。对应的结果称为方向导数。
取方向导数的第一步是指定一个方向。指定一个方向的一种方法是采用向量
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)=h→0limhf(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)=∂x∂f,同样
u
\bold u
u = (0, 1),那么
D
u
f
(
a
)
=
∂
f
∂
y
D_uf(\bold a) = {{∂f}\over{∂y}}
Duf(a)=∂y∂f。
在下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)=∂x∂f。同样的
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)=∂y∂f。
如果让
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) 梯度是一个沿着m方向的向量,且其模长是Dmf(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)∥∥u∥cos(θ)=∥∇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)∥,它就没有什么用。幸运的是,最终结果相当简单,因为梯度偏导数矩阵的另外一种形式。