深度学习的基础 - 梯度
邵盛松
柯西将极限的定义引入了微积分,很创新。因为微积分的创造者们没有把一件事说明白,他用新的概念把这件事说明白了。问题变了,思维方式就变了,之前的人的问题是什么什么是多少,他的问题是如何定义“什么什么”的问题。他定义的框架把微积分的严谨度向前迈了一大步,所以问什么样的问题最重要。微积分的现代体系就是他建的。
数学有些地方又是借鉴物理知识,可以在后面的深度学习部分看到。从芝诺用不是数学的语言-大白话描述它,到现在都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) ( x 0 , y 0 ) 沿着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 }
f x ′ ( x 0 , y 0 ) = Δ x → 0 lim Δ x f ( x 0 + Δ x , y 0 ) − f ( x 0 , y 0 )
函数在点( x 0 , y 0 ) (x_0,y_0) ( x 0 , y 0 ) 沿着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 }
f y ′ ( x 0 , y 0 ) = Δ y → 0 lim Δ y f ( x 0 , y 0 + Δ y ) − f ( x 0 , y 0 )
定义偏导数是可以使用导数来定义,也可以使用极限来定义,甚至可以使用方向导数来定义
下面用数学语言来描述方向导数,用数学语言作为标杆,优点严谨,强逻辑,不产生歧义,缺点不易懂。之后我用大白话说明是什么问题。多本教科书均有定义,这里采用 同济大学《高等数学 第七版 下册》103页的《方向导数与梯度》
原图是这样的
设l l l 是x O y xOy x O y 平面上以P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P 0 ( x 0 , y 0 ) 为始点的一条射线,e l = ( cos α , cos β ) e_l=(\cos \alpha,\cos \beta) e l = ( cos α , cos β ) 是与l l l l同方向的单位向量,射线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 = x 0 + t cos α y = y 0 + t cos β 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) P 0 ( x 0 , y 0 ) 的某个领域U ( P 0 ) U(P_0) U ( P 0 ) 内有定义,P ( x 0 + t c o s α , y 0 + t c o s β ) P(x_{0}+tcos\alpha,y_{0}+tcos\beta) P ( x 0 + t c o s α , y 0 + t c o s β ) 为l l l 上的另一点,且P ∈ U ( P 0 ) P\in U(P_{0}) P ∈ U ( P 0 ) 。如果函数增量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 ( x 0 + t c o s α , y 0 + t c o s β ) − f ( x 0 , y 0 ) 与点P P P 到点P 0 P_0 P 0 的距离∣ P P 0 ∣ = t |PP_0|=t ∣ P P 0 ∣ = 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}
t f ( x 0 + t c o s α , y 0 + t c o s β ) − f ( x 0 , y 0 )
当P P P 沿着l l l 趋向于P 0 ( 即 t → 0 + ) P_{0}(即t\rightarrow0^{+}) P 0 ( 即 t → 0 + ) 时的极限存在,则称此极限为函数f ( x , y ) f(x,y) f ( x , y ) 在点P 0 P_0 P 0 沿方向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 ∣ ( x 0 , y 0 ) = t → 0 + lim t f ( x 0 + t c o s α , y 0 + t c o s β ) − f ( x 0 , y 0 ) ‘
它要表达的图是这样的,耗时的画图,看的图简化下
单位向量e l = ( cos α , cos β ) e_l=(\cos \alpha,\cos \beta) e l = ( cos α , cos β ) 怎么解释
首先得有个向量假设叫它a,长度不能为0,还有个向量e,与a方向一样,长度是1,那么这个e就叫做向量a的单位向量。就像在坐标轴上画刻度,至于多大间隔为1,自己定。
这就是上面提到的单位向量e l e_l e l ( cos α , cos β ) (\cos \alpha,\cos \beta) ( cos α , cos β ) a是向量e l e_l e l 的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 ∗ c o s ( a l p h a ) = t ∗ c o s ( α ) = Δ x t ∗ c o s ( b e t a ) = t ∗ c o s ( β ) = Δ y t*cos(beta)=t*cos(\beta)=\Delta y t ∗ c o s ( b e t a ) = t ∗ c o s ( β ) = Δ 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 }
ρ = ∣ P P 0 ∣ = Δ x 2 + Δ y 2 Δ z = f ( x + Δ x , y + Δ y ) − f ( x , y ) ∂ l ∂ f = ρ → 0 lim ρ f ( x + Δ x , y + Δ y ) − f ( x , y )
方向导数就像我们给地球定义了东西南北,正南正北刮的就像偏导数,地球上的风是可以按照任意方向刮的,就像方向导数。
根据上面的抛物线简化下
目的是找到抛物线中最低的点,也就是y轴中最小的那个坐标
先随意取一点,这条直线的斜率是三角形的高除以宽,也就是h/g,相当于tan(alpha)
看图知道如果切线平行于x轴,相当于tan0=0
当点向下移动时,斜率越来越小t a n 6 0 ∘ = 3 tan60 ^ { \circ }=\sqrt { 3 } t a n 6 0 ∘ = 3 t a n 4 5 ∘ = 1 tan45 ^ { \circ }=1 t a n 4 5 ∘ = 1 t a n 3 0 ∘ = 3 3 tan30 ^ { \circ }=\frac { \sqrt { 3 } } { 3 } t a n 3 0 ∘ = 3 3 t a n 0 ∘ = 0 tan0 ^ { \circ }=0 t a n 0 ∘ = 0
梯度
函数在某点的梯度是这样一个向量,它的方向是函数在这点方向导数取得最大值得方向,它的模为方向导数的最大值.
解释什么是向量的模?
向量的模就是向量的长度
假设平面有两个点 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 ( x 1 , y 1 ) B ( x 2 , y 2 ) ,它们之间的距离是(还是勾股定理)∣ 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 } }
∣ A B ∣ = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 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 ∣ = x 2 + y 2
梯度的符号是$\operatorname { grad } f(x_0,y_0) $或者 ∇ f ( x 0 , y 0 ) \nabla f(x_0,y_0) ∇ f ( x 0 , y 0 ) ,倒三角的符号是
梯度是这样的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 } }
g r a d f ( 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
关于函数的这个“凸”,各种书籍资料都没有统一,这个凹凸正好是中国的象形字,但老外用的是字母。所以看书的时候要注意书中的定义和上下文,例如在陈宝林《最优化理论与算法》中用的抛物线的开口向上为凸函数和抛物线的开口向下为凹函数,我后面的说法采用张景中的上凸和下凸,直观无歧义。在他的著作《直来直去的微积分》中描述了林群的不使用极限概念定义导数,目的是让数学变得更容易学习。就像例如同样是对速度的定义,哪个更容易懂些。
初中的定义:速度等于路程与时间之比。
高中的定义:速度等于位移和发生位移所用时间的比值。
大学的定义:速度是描述质点运动快慢和方向的物理量等于位移对时间的微分,
同时也等于加速度的积分。
我这里使用了极限的概念来理解,如果使用林群的“一致性不等式”定义导数证明泰勒公式变得简单了。等值线