深度学习的基础 - 偏导数、方向导数、梯度
flyfish
柯西将极限的定义引入了微积分,很创新。因为微积分的创造者们没有把一件事说明白,他用新的概念把这件事说明白了。问题变了,思维方式就变了,之前的人的问题是什么什么是多少,他的问题是如何定义“什么什么”的问题。他定义的框架把微积分的严谨度向前迈了一大步,所以问什么样的问题最重要。微积分的现代体系就是他建的。
数学有些地方又是借鉴物理知识,可以在后面的深度学习部分看到。从芝诺用不是数学的语言-大白话描述它,到现在都2500多年了。中国的先人们发现的什么什么定理领先西方多少多少年,到了明朝后期比较尴尬了,19世纪末期清代的李善兰把这个知识引入到中国。别人是先进的,那就无论好坏对错全盘吸收,然后持续积累改进迭代。如果后人把问题再变了,那又会离“微积分真理”又进了一步。人的语言可以表达不存在的东西,因相信而这不存在东西也就变得存在。
说梯度的时候,还得理解方向导数,偏导数。
最小化 f(x)的问题,如果是一元的,一个 导数的概念就够了;如果是多元的,就出现了偏导数,方向导数,梯度的概念。
导数精确描述了函数变化率,变化率可理解为变量的变化“快慢”问题。研究变化率的问题之前的 y=kx+b,就一个未知数x,x也叫自变量,可以说一元函数,研究多元函数的时候就出现了偏导。偏可以理解成部分,多元就是一个自变量固定,在编程里叫常量。三维可以可视化易于理解,超过三维在我看来只能逻辑推理,所以用一元,二元来可视化理解。假设一个二元函数的偏导数,它反应的是函数沿坐标轴方向的变化率。一个点画线的时候可以朝着坐标轴方向,也可以朝着其他方向,其他方向就成了方向导数
偏导数
式子
z
=
f
(
x
,
y
)
z = f ( x , y )
z=f(x,y)的偏导数
函数在点
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)沿着
x
x
x轴方向的变化率
f
x
′
(
x
0
,
y
0
)
=
lim
Δ
x
→
0
f
(
x
0
+
Δ
x
,
y
0
)
−
f
(
x
0
,
y
0
)
Δ
x
f _ { x } ^ { \prime } \left( x _ { 0 } , y _ { 0 } \right) = \lim _ { \Delta x \rightarrow 0 } \frac { f \left( x _ { 0 } + \Delta x , y _ { 0 } \right) - f \left( x _ { 0 } , y _ { 0 } \right) } { \Delta x }
fx′(x0,y0)=Δx→0limΔxf(x0+Δx,y0)−f(x0,y0)
函数在点
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)沿着
y
y
y轴方向的变化率
f
y
′
(
x
0
,
y
0
)
=
lim
Δ
y
→
0
f
(
x
0
,
y
0
+
Δ
y
)
−
f
(
x
0
,
y
0
)
Δ
y
f _ { y } ^ { \prime } \left( x _ { 0 } , y _ { 0 } \right) = \lim _ { \Delta y \rightarrow 0 } \frac { f \left( x _ { 0 } , y _ { 0 } + \Delta y \right) - f \left( x _ { 0 } , y _ { 0 } \right) } { \Delta y }
fy′(x0,y0)=Δy→0limΔyf(x0,y0+Δy)−f(x0,y0)
定义偏导数是可以使用导数来定义,也可以使用极限来定义,甚至可以使用方向导数来定义
下面用数学语言来描述方向导数,用数学语言作为标杆,优点严谨,强逻辑,不产生歧义,缺点不易懂。之后我用大白话说明是什么问题。多本教科书均有定义,这里采用 同济大学《高等数学 第七版 下册》103页的《方向导数与梯度》
原图是这样的
设 l l l是 x O y xOy xOy平面上以 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0)为始点的一条射线, e l = ( cos α , cos β ) e_l=(\cos \alpha,\cos \beta) el=(cosα,cosβ)是与 l l ll同方向的单位向量,射线 l l l的参数方程为
x = x 0 + t cos α y = y 0 + t cos β t ⩾ 0 \begin{array} { c } { x = x _ { 0 } + t \cos \alpha } \\ { y = y _ { 0 } + t \cos \beta } \\ { t \geqslant 0 } \end{array} x=x0+tcosαy=y0+tcosβt⩾0
设函数
z
=
f
(
x
,
y
)
z=f(x,y)
z=f(x,y)在点
P
0
(
x
0
,
y
0
)
P_0(x_0,y_0)
P0(x0,y0)的某个领域
U
(
P
0
)
U(P_0)
U(P0)内有定义,
P
(
x
0
+
t
c
o
s
α
,
y
0
+
t
c
o
s
β
)
P(x_{0}+tcos\alpha,y_{0}+tcos\beta)
P(x0+tcosα,y0+tcosβ)为
l
l
l上的另一点,且
P
∈
U
(
P
0
)
P\in U(P_{0})
P∈U(P0)。如果函数增量
f
(
x
0
+
t
c
o
s
α
,
y
0
+
t
c
o
s
β
)
−
f
(
x
0
,
y
0
)
{f(x_{0}+tcos\alpha,y_{0}+tcos\beta)-f(x_{0},y_{0})}
f(x0+tcosα,y0+tcosβ)−f(x0,y0)与点
P
P
P到点
P
0
P_0
P0的距离
∣
P
P
0
∣
=
t
|PP_0|=t
∣PP0∣=t的比值
f
(
x
0
+
t
c
o
s
α
,
y
0
+
t
c
o
s
β
)
−
f
(
x
0
,
y
0
)
t
\frac{f(x_{0}+tcos\alpha,y_{0}+tcos\beta)-f(x_{0},y_{0})}{t}
tf(x0+tcosα,y0+tcosβ)−f(x0,y0)
当 P P P沿着 l l l趋向于 P 0 ( 即 t → 0 + ) P_{0}(即t\rightarrow0^{+}) P0(即t→0+)时的极限存在,则称此极限为函数 f ( x , y ) f(x,y) f(x,y)在点 P 0 P_0 P0沿方向ll的方向导数
∂
f
∂
l
∣
(
x
0
,
y
0
)
=
lim
t
→
0
+
f
(
x
0
+
t
c
o
s
α
,
y
0
+
t
c
o
s
β
)
−
f
(
x
0
,
y
0
)
t
‘
\frac{\partial f}{\partial l} \mid_{(x_{0},y_{0})}=\lim_{t \rightarrow 0^{+}}\frac{f(x_{0}+tcos\alpha,y_{0}+tcos\beta)-f(x_{0},y_{0})}{t}`
∂l∂f∣(x0,y0)=t→0+limtf(x0+tcosα,y0+tcosβ)−f(x0,y0)‘
它要表达的图是这样的,耗时的画图,看的图简化下
单位向量
e
l
=
(
cos
α
,
cos
β
)
e_l=(\cos \alpha,\cos \beta)
el=(cosα,cosβ)怎么解释
首先得有个向量假设叫它a,长度不能为0,还有个向量e,与a方向一样,长度是1,那么这个e就叫做向量a的单位向量。就像在坐标轴上画刻度,至于多大间隔为1,自己定。
这就是上面提到的单位向量
e
l
e_l
el
(
cos
α
,
cos
β
)
(\cos \alpha,\cos \beta)
(cosα,cosβ)a是向量
e
l
e_l
el的x轴坐标分量和y轴坐标分量,相当于直角三角形的斜边是1,根据前面的三角函数,知道了角度,可以计算对边和斜边。
图片中
t
∗
c
o
s
(
a
l
p
h
a
)
=
t
∗
c
o
s
(
α
)
=
Δ
x
t*cos(alpha)=t*cos(\alpha)=\Delta x
t∗cos(alpha)=t∗cos(α)=Δx
t
∗
c
o
s
(
b
e
t
a
)
=
t
∗
c
o
s
(
β
)
=
Δ
y
t*cos(beta)=t*cos(\beta)=\Delta y
t∗cos(beta)=t∗cos(β)=Δy
就有了如下式子
ρ
=
∣
P
P
0
∣
=
Δ
x
2
+
Δ
y
2
Δ
z
=
f
(
x
+
Δ
x
,
y
+
Δ
y
)
−
f
(
x
,
y
)
∂
f
∂
l
=
lim
ρ
→
0
f
(
x
+
Δ
x
,
y
+
Δ
y
)
−
f
(
x
,
y
)
ρ
\rho = \left| P P _ { 0 } \right| = \sqrt { \Delta x ^ { 2 } + \Delta y ^ { 2 } } \ \\ \Delta z = f ( x + \Delta x , y + \Delta y ) - f ( x , y ) \\ \frac { \partial f } { \partial l } = \lim _ { \rho \rightarrow 0 } \frac { f ( x + \Delta x , y + \Delta y ) - f ( x , y ) } { \rho }
ρ=∣PP0∣=Δx2+Δy2 Δz=f(x+Δx,y+Δy)−f(x,y)∂l∂f=ρ→0limρf(x+Δx,y+Δy)−f(x,y)
方向导数
方向导数就像我们给地球定义了东西南北,正南正北刮的就像偏导数,地球上的风是可以按照任意方向刮的,就像方向导数。
偏导数1
∂ f ∂ x ( a , b ) = lim h → 0 f ( a + h , b ) − f ( a , b ) h . \frac{\partial f}{\partial x}(a,b) = \lim_{h\rightarrow 0} \frac{f(a+h,b) - f(a,b)}{h}. ∂x∂f(a,b)=h→0limhf(a+h,b)−f(a,b).
偏导数2
∂ f ∂ y ( a , b ) = lim h → 0 f ( a , b + h ) − f ( a , b ) h . \frac{\partial f}{\partial y}(a,b) = \lim_{h\rightarrow 0} \frac{f(a,b+h) - f(a,b)}{h}. ∂y∂f(a,b)=h→0limhf(a,b+h)−f(a,b).
方向导数
符号
∇ v f ( x ) ∼ ∂ f ( x ) ∂ v ∼ f v ′ ( x ) ∼ D v f ( x ) ∼ D f ( x ) ( v ) ∼ ∂ v f ( x ) ∼ v ⋅ ∇ f ( x ) ∼ v ⋅ ∂ f ( x ) ∂ x {\displaystyle \nabla _{\mathbf {v}}{f}({\mathbf {x}})\sim {\frac {\partial {f({\mathbf {x}})}}{\partial {\mathbf {v}}}}\sim f'_{\mathbf {v} }({\mathbf {x}})\sim D_{\mathbf {v}}f({\mathbf {x}})\sim Df({\mathbf {x}})({\mathbf {v}})\sim \partial _{\mathbf {v}}f({\mathbf {x}})\sim \mathbf {v} \cdot {\nabla f({\mathbf {x}})}\sim {\mathbf {v}}\cdot {\frac {\partial f({\mathbf {x}})}{\partial {\mathbf {x}}}}} ∇vf(x)∼∂v∂f(x)∼fv′(x)∼Dvf(x)∼Df(x)(v)∼∂vf(x)∼v⋅∇f(x)∼v⋅∂x∂f(x)
扩展偏导得到的方向导数
f ( x ) = f ( x 1 , x 2 , … , x n ) f({x}) = f(x_1, x_2, \ldots, x_n) f(x)=f(x1,x2,…,xn)
v = ( v 1 , … , v n ) {v} = (v_1, \ldots, v_n) v=(v1,…,vn)
∇ v f ( x ) = lim h → 0 f ( x + h v ) − f ( x ) h . \nabla_{{v}}{f}({x}) = \lim_{h \rightarrow 0}{\frac{f({x} + h{v}) - f({x})}{h}}. ∇vf(x)=limh→0hf(x+hv)−f(x).
换种形式
D v f ( a ) = lim h → 0 f ( a + h v ) − f ( a ) h . D_{{v}}f({a}) = \lim_{h \to 0} \frac{f({a}+h{v}) - f({a})}{h}. Dvf(a)=h→0limhf(a+hv)−f(a).
理解
导数:曲线上某一点沿着x轴方向变化的速率,即函数f(x)f(x)在该点的斜率
函数的导数就是函数的变化率
偏导数:
∂
f
∂
x
是函数
f
(
x
,
y
)
\frac{\partial f}{\partial x}\text{是函数}f(x,y)
∂x∂f是函数f(x,y)沿着x轴方向的变化率
∂ f ∂ y 是函数 f ( x , y ) \frac{\partial f}{\partial y}\text{是函数}f(x,y) ∂y∂f是函数f(x,y)沿着y轴方向的变化率
设函数z=f(X)=f(x,y) 在点P的某一邻域U§内有定义.自点引射线l.设x轴正向到射线l的转角为 φ(逆时针方向:
φ>0;顺时针方向:0),并设P’(x+△x,y+△y)为上的另一点且P’∈U§.我们考虑函数的增量f(x+△x,y+△y)-f(x,y)与P、P’两点间的距离 ρ = ( Δ x ) 2 + ( Δ y ) 2 \rho=\sqrt{(\Delta x)^2+(\Delta y)^2} ρ=(Δx)2+(Δy)2
的比值.当P’沿着l趋于P时,如果这个比的极限存在,则称这极限为函数f(x,y)在点P沿方向l的方向导数,记作
∂ f ∂ l = lim ρ → 0 f ( x + Δ x , y + Δ y ) − f ( x , y ) ρ \frac{\partial f}{\partial {l}}=\lim_{\rho \to 0}\frac{f(x+\Delta x ,y+\Delta y)-f(x,y)}{\rho} ∂l∂f=ρ→0limρf(x+Δx,y+Δy)−f(x,y)
换种形式
Δ x = ρ ⋅ c o s α ; Δ y = ρ ⋅ c o s β ; \Delta x= \rho \cdot cos\alpha; \Delta y= \rho \cdot cos\beta; Δx=ρ⋅cosα;Δy=ρ⋅cosβ;
∂ f ∂ l ⃗ = lim ρ → 0 f ( x + ρ c o s α , y + ρ c o s β ) − f ( x , y ) ρ \frac{\partial f}{\partial \vec{l}}=\lim_{\rho \to 0}\frac{f(x+\rho cos\alpha,y+\rho cos\beta)-f(x,y)}{\rho} ∂l∂f=ρ→0limρf(x+ρcosα,y+ρcosβ)−f(x,y)
因为
sin
(
θ
)
=
cos
(
π
2
−
θ
)
=
1
csc
(
θ
)
\sin(\theta )=\cos \left({\frac {\pi }{2}}-\theta \right)={\frac {1}{\csc(\theta )}}
sin(θ)=cos(2π−θ)=csc(θ)1
α
+
β
=
π
2
\alpha + \beta={\frac {\pi }{2}}
α+β=2π
还可以写成
∂ f ∂ l ⃗ = lim ρ → 0 f ( x + ρ c o s α , y + ρ s i n α ) − f ( x , y ) ρ \frac{\partial f}{\partial \vec{l}}=\lim_{\rho \to 0}\frac{f(x+\rho cos\alpha,y+\rho sin\alpha)-f(x,y)}{\rho} ∂l∂f=ρ→0limρf(x+ρcosα,y+ρsinα)−f(x,y)
方向导数:某一点沿着某一方向的变化率
根据上面的抛物线简化下
目的是找到抛物线中最低的点,也就是y轴中最小的那个坐标
先随意取一点,这条直线的斜率是三角形的高除以宽,也就是h/g,相当于tan(alpha)
看图知道如果切线平行于x轴,相当于tan0=0
当点向下移动时,斜率越来越小
t
a
n
6
0
∘
=
3
tan60 ^ { \circ }=\sqrt { 3 }
tan60∘=3
t
a
n
4
5
∘
=
1
tan45 ^ { \circ }=1
tan45∘=1
t
a
n
3
0
∘
=
3
3
tan30 ^ { \circ }=\frac { \sqrt { 3 } } { 3 }
tan30∘=33
t
a
n
0
∘
=
0
tan0 ^ { \circ }=0
tan0∘=0
方程
z
=
f
(
x
,
y
)
z=f(x,y)
z=f(x,y) ,表示曲面
S
S
S。
如果
z
0
=
f
(
x
0
,
y
0
)
z_0=f(x_0,y_0)
z0=f(x0,y0),那么点
P
(
x
0
,
y
0
,
z
0
)
P(x_0,y_0,z_0)
P(x0,y0,z0)在
S
S
S上 。
过P和
P
0
(
x
0
,
y
0
)
P_0(x_0,y_0)
P0(x0,y0)的平行于
u
u
u的竖直平面交S于曲线
C
C
C。
f沿着方向u的变化率是C在点P的切线的斜率。
当
u
=
i
u=i
u=i时
p
0
p_0
p0的方向导数是
∂
f
∂
x
\frac{\partial f}{\partial x}
∂x∂f 在
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)的值
当
u
=
j
u=j
u=j时
p
0
p_0
p0的方向导数是
∂
f
∂
y
\frac{\partial f}{\partial y}
∂y∂f 在
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)的值
方向导数可以求沿着任意方向,不仅仅是方向
i
i
i和方向
j
j
j的变化率
梯度
函数在某点的梯度是这样一个向量,它的方向是函数在这点方向导数取得最大值得方向,它的模为方向导数的最大值.
解释什么是向量的模?
向量的模就是向量的长度
假设平面有两个点
A
(
x
1
,
y
1
)
B
(
x
2
,
y
2
)
A \left( x _ { 1 } , y _ { 1 } \right) B \left( x _ { 2 } , y _ { 2 } \right)
A(x1,y1)B(x2,y2),它们之间的距离是(还是勾股定理)
∣
A
B
⃗
∣
=
(
x
2
−
x
1
)
2
+
(
y
2
−
y
1
)
2
| \vec { \mathbf { A B } } | = \sqrt { \left( \boldsymbol { x } _ { 2 } - \boldsymbol { x } _ { \mathbf { 1 } } \right) ^ { 2 } + \left( \boldsymbol { y } _ { 2 } - \boldsymbol { y } _ { \mathbf { 1 } } \right) ^ { 2 } }
∣AB∣=(x2−x1)2+(y2−y1)2
这类距离也叫欧式距离,在机器学习中叫2-范数
nabla
换成表示方式就是
已知
∣
a
⃗
∣
=
(
x
,
y
)
| \vec { \boldsymbol { a } } | =( x , y )
∣a∣=(x,y),那么模就是
∣
a
⃗
∣
=
x
2
+
y
2
| \vec { \boldsymbol { a } } | = \sqrt { \boldsymbol { x } ^ { 2 } + \boldsymbol { y } ^ { 2 } }
∣a∣=x2+y2
梯度的符号是$\operatorname { grad } f(x_0,y_0) $或者
∇
f
(
x
0
,
y
0
)
\nabla f(x_0,y_0)
∇f(x0,y0),倒三角的符号是
梯度是这样的
gradf
(
x
,
y
)
=
(
∂
f
∂
x
)
2
+
(
∂
f
∂
y
)
2
\operatorname { grad f } ( x , y ) = \sqrt { \left( \frac { \partial f } { \partial x } \right) ^ { 2 } + \left( \frac { \partial f } { \partial y } \right) ^ { 2 } }
gradf(x,y)=(∂x∂f)2+(∂y∂f)2
以二元z=f(x,y)这样的曲面用等值线表示
先使用Python画一个
import numpy as np
import matplotlib.pyplot as plt
def f(x, y):
return (x**2+y**2)
n = 64
x = np.linspace(-1, 1, n)
y = np.linspace(-1, 1, n)
#画原图
fig = plt.figure()
x1,y1 = np.meshgrid(x,y)
pic1=fig.add_subplot(111,projection='3d')
pic1.plot_surface(x1,y1,f(x1,y1),rstride=3,cstride=3,cmap=plt.cm.jet)
plt.show()
#画等值线
fig = plt.figure()
x2, y2 = np.meshgrid(x, y)
t = plt.contour(x2, y2, f(x2, y2), 10)
plt.clabel(t, inline=True, fontsize=10)
plt.show()
原图
在吴恩达的机器学习视频教程 Gradient Descent For Linear Regression中也有类似的这样的图,this is called a convex function
关于函数的这个“凸”,各种书籍资料都没有统一,这个凹凸正好是中国的象形字,但老外用的是字母。所以看书的时候要注意书中的定义和上下文,例如在陈宝林《最优化理论与算法》中用的抛物线的开口向上为凸函数和抛物线的开口向下为凹函数,我后面的说法采用张景中的上凸和下凸,直观无歧义。在他的著作《直来直去的微积分》中描述了林群的不使用极限概念定义导数,目的是让数学变得更容易学习。就像例如同样是对速度的定义,哪个更容易懂些。
初中的定义:速度等于路程与时间之比。
高中的定义:速度等于位移和发生位移所用时间的比值。
大学的定义:速度是描述质点运动快慢和方向的物理量等于位移对时间的微分,
同时也等于加速度的积分。
我这里使用了极限的概念来理解,如果使用林群的“一致性不等式”定义导数证明泰勒公式变得简单了。
等值线