深度学习的基础 - 梯度

邵盛松

柯西将极限的定义引入了微积分,很创新。因为微积分的创造者们没有把一件事说明白,他用新的概念把这件事说明白了。问题变了,思维方式就变了,之前的人的问题是什么什么是多少,他的问题是如何定义“什么什么”的问题。他定义的框架把微积分的严谨度向前迈了一大步,所以问什么样的问题最重要。微积分的现代体系就是他建的。

数学有些地方又是借鉴物理知识,可以在后面的深度学习部分看到。从芝诺用不是数学的语言-大白话描述它,到现在都2500多年了。中国的先人们发现的什么什么定理领先西方多少多少年,到了明朝后期比较尴尬了,19世纪末期清代的李善兰把这个知识引入到中国。别人是先进的,那就无论好坏对错全盘吸收,然后持续积累改进迭代。如果后人把问题再变了,那又会离“微积分真理”又进了一步。人的语言可以表达不存在的东西,因相信而这不存在东西也就变得存在。

说梯度的时候,还得理解方向导数,偏导数。
最小化 f(x)的问题,如果是一元的,一个 导数的概念就够了;如果是多元的,就出现了偏导数,方向导数,梯度的概念。
导数精确描述了函数变化率,变化率可理解为变量的变化“快慢”问题。研究变化率的问题之前的 y=kx+b,就一个未知数x,x也叫自变量,可以说一元函数,研究多元函数的时候就出现了偏导。偏可以理解成部分,多元就是一个自变量固定,在编程里叫常量。三维可以可视化易于理解,超过三维在我看来只能逻辑推理,所以用一元,二元来可视化理解。假设一个二元函数的偏导数,它反应的是函数沿坐标轴方向的变化率。一个点画线的时候可以朝着坐标轴方向,也可以朝着其他方向,其他方向就成了方向导数
式子z=f(x,y)z = f ( x , y )的偏导数
函数在点x0,y0(x_0,y_0)沿着xx轴方向的变化率
fx(x0,y0)=limΔx0f(x0+Δx,y0)f(x0,y0)Δ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 }
函数在点x0,y0(x_0,y_0)沿着yy轴方向的变化率
fy(x0,y0)=limΔy0f(x0,y0+Δy)f(x0,y0)Δ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 }
定义偏导数是可以使用导数来定义,也可以使用极限来定义,甚至可以使用方向导数来定义

下面用数学语言来描述方向导数,用数学语言作为标杆,优点严谨,强逻辑,不产生歧义,缺点不易懂。之后我用大白话说明是什么问题。多本教科书均有定义,这里采用 同济大学《高等数学 第七版 下册》103页的《方向导数与梯度》
原图是这样的
深度学习基础 - 梯度

llxOyxOy平面上以P0(x0,y0)P_0(x_0,y_0)为始点的一条射线,el=(cosα,cosβ)e_l=(\cos \alpha,\cos \beta)是与lll同方向的单位向量,射线ll的参数方程为

x=x0+tcosαy=y0+tcosβt0 \begin{array} { c } { x = x _ { 0 } + t \cos \alpha } \\ { y = y _ { 0 } + t \cos \beta } \\ { t \geqslant 0 } \end{array}

设函数z=f(x,y)z=f(x,y)在点P0(x0,y0)P_0(x_0,y_0)的某个领域U(P0)U(P_0)内有定义,P(x0+tcosα,y0+tcosβ)P(x_{0}+tcos\alpha,y_{0}+tcos\beta)ll上的另一点,且PU(P0)P\in U(P_{0})。如果函数增量f(x0+tcosα,y0+tcosβ)f(x0,y0){f(x_{0}+tcos\alpha,y_{0}+tcos\beta)-f(x_{0},y_{0})}与点PP到点P0P_0的距离PP0=t|PP_0|=t的比值
f(x0+tcosα,y0+tcosβ)f(x0,y0)t \frac{f(x_{0}+tcos\alpha,y_{0}+tcos\beta)-f(x_{0},y_{0})}{t}

PP沿着ll趋向于P0(t0+)P_{0}(即t\rightarrow0^{+})时的极限存在,则称此极限为函数f(x,y)f(x,y)在点P0P_0沿方向ll的方向导数

fl(x0,y0)=limt0+f(x0+tcosα,y0+tcosβ)f(x0,y0)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}`
它要表达的图是这样的,耗时的画图,看的图简化下
深度学习基础 - 梯度

单位向量el=(cosα,cosβ)e_l=(\cos \alpha,\cos \beta)怎么解释
首先得有个向量假设叫它a,长度不能为0,还有个向量e,与a方向一样,长度是1,那么这个e就叫做向量a的单位向量。就像在坐标轴上画刻度,至于多大间隔为1,自己定。

这就是上面提到的单位向量ele_l
(cosα,cosβ)(\cos \alpha,\cos \beta)a是向量ele_l的x轴坐标分量和y轴坐标分量,相当于直角三角形的斜边是1,根据前面的三角函数,知道了角度,可以计算对边和斜边。
图片中
tcos(alpha)=tcos(α)=Δxt*cos(alpha)=t*cos(\alpha)=\Delta x
tcos(beta)=tcos(β)=Δyt*cos(beta)=t*cos(\beta)=\Delta y
就有了如下式子
ρ=PP0=Δx2+Δy2 Δz=f(x+Δx,y+Δy)f(x,y)fl=limρ0f(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 }

方向导数就像我们给地球定义了东西南北,正南正北刮的就像偏导数,地球上的风是可以按照任意方向刮的,就像方向导数。
深度学习基础 - 梯度
根据上面的抛物线简化下
目的是找到抛物线中最低的点,也就是y轴中最小的那个坐标
先随意取一点,这条直线的斜率是三角形的高除以宽,也就是h/g,相当于tan(alpha)
看图知道如果切线平行于x轴,相当于tan0=0
当点向下移动时,斜率越来越小
tan60=3tan60 ^ { \circ }=\sqrt { 3 }
tan45=1tan45 ^ { \circ }=1
tan30=33tan30 ^ { \circ }=\frac { \sqrt { 3 } } { 3 }
tan0=0tan0 ^ { \circ }=0

梯度
函数在某点的梯度是这样一个向量,它的方向是函数在这点方向导数取得最大值得方向,它的模为方向导数的最大值.

解释什么是向量的模?
向量的模就是向量的长度
假设平面有两个点 A(x1,y1)B(x2,y2)A \left( x _ { 1 } , y _ { 1 } \right) B \left( x _ { 2 } , y _ { 2 } \right),它们之间的距离是(还是勾股定理)
AB=(x2x1)2+(y2y1)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 } }
这类距离也叫欧式距离,在机器学习中叫2-范数
nabla
换成表示方式就是
已知 a=(x,y)| \vec { \boldsymbol { a } } | =( x , y ),那么模就是
a=x2+y2 | \vec { \boldsymbol { a } } | = \sqrt { \boldsymbol { x } ^ { 2 } + \boldsymbol { y } ^ { 2 } }
梯度的符号是$\operatorname { grad } f(x_0,y_0) $或者 f(x0,y0)\nabla f(x_0,y_0),倒三角的符号是
梯度是这样的
gradf(x,y)=(fx)2+(fy)2 \operatorname { grad f } ( x , y ) = \sqrt { \left( \frac { \partial f } { \partial x } \right) ^ { 2 } + \left( \frac { \partial f } { \partial y } \right) ^ { 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
关于函数的这个“凸”,各种书籍资料都没有统一,这个凹凸正好是中国的象形字,但老外用的是字母。所以看书的时候要注意书中的定义和上下文,例如在陈宝林《最优化理论与算法》中用的抛物线的开口向上为凸函数和抛物线的开口向下为凹函数,我后面的说法采用张景中的上凸和下凸,直观无歧义。在他的著作《直来直去的微积分》中描述了林群的不使用极限概念定义导数,目的是让数学变得更容易学习。就像例如同样是对速度的定义,哪个更容易懂些。
初中的定义:速度等于路程与时间之比。
高中的定义:速度等于位移和发生位移所用时间的比值。
大学的定义:速度是描述质点运动快慢和方向的物理量等于位移对时间的微分,
同时也等于加速度的积分。
我这里使用了极限的概念来理解,如果使用林群的“一致性不等式”定义导数证明泰勒公式变得简单了。
等值线
深度学习基础 - 梯度

相关文章: