本打算把梯度放在神经网络来讲,学习机器学习实战时发现用到梯度下降最优算法,所以就把这个知识点深入讲一下,等后面实战到神经网络时,直接复制这里的,这次讲解会深入讲解,简明易懂是目的,虽然网上都有各种画图说明,但是还是不容易理解,本讲解一定会让大家理解的,讲解主要从问题出发,从简单的内容开始,这需要你对导数、向量、多远微分有点了解,进入正题:
如果有基础的可以从下面的泰勒级数阅读:
想知道来龙去脉的建议仔细阅读。
什么是梯度?为什么梯度方向就是函数上升最快的方向?又为什么有梯度下降的说法?他们有什么联系?
什么是梯度?
讲梯度的定义之前,先说明一下梯度他不是一个实数,他是一个向量即有方向有大小。这个向量有什么特点呢?这里以二元函数为主讲解,先给出公式:
设一个多元函数为,在某点(,)的梯度为这点的偏导即:
其中是函数在这一点的梯度符号,是一个整体,而、是函数在 在( ) 的偏导数。
看到这里大家肯定是晕晕的,别急我们慢慢往下看,现在问题来了,为什么在多元函数中某点的梯度就是该函数在这一点的偏导数呢?为什么不是二阶偏导数不是其他而是一阶偏导数呢?为什么会这样呢?基础不好的同学可能还会问什么是偏导数呢?什么是向量呢?上面这个定义,大家看了下面理解以后再过来看就懂了。
大家还记得什么是向量吗?怎么定义的?
在平面直角坐标系中,分别取与x轴、y轴方向相同的两个单位向量i,j作为一组基底。 为平面直角坐标系内的任意向量,以坐标原点O为起点作向量 。由平面向量基本定理可知,有且只有一对实数(x,y),使得 ,因此把实数对(x,y) 叫做向量 的坐标,记作 。这就是向量 的坐标表示。三维的也是这样表示的。
那么这样大家就能理解向量是可以使用坐标表示的,同时解释了他是一个向量的表示,虽然没有箭头,但是他也是向量呀,而且就是梯度,现在大家应该可以理解为什么说他是一个向量,到这里我们还需要一点矩阵方面的知识,例如矩阵方面的向量什么?这里的向量和矩阵的向量有所不同,大家需要区别开,因为应用不同,所有定义有点不同但是具有相同的性质即有大小有方向。后面会发现就是通过向量把他们的关系建立起来的。
矩阵:矩阵大家都知道,矩阵的向量默认为列向量即一列为一组向量(这点特别重要,大家务必留心,这关系后面的梯度证明的理解),矩阵中的向量有什么性质呢?在这里只提到用到的性质,降低难度,即向量的范数(在空间向量中称为模),以及两个向量的內积。
向量的內积:
设二维空间内有两个向量 和 ,定义它们的数量积(又叫内积、点积)为以下实数:
更一般地,n维向量的内积定义如下: [1]
几何定义
设二维空间内有两个向量 和 , 和 表示向量a和b的大小,它们的夹角为 ,则内积定义为以下实数: 、
內积的物理意义就是b向量在a向量的投影的乘积或者说a向量在b向量投影的乘积,他们是一样的。
该定义只对二维和三维空间有效。
此时大家看到了內积的定义,知道內积计算结果是一个数,不是向量,他的物理意义就是既然是一个数那就存在最大值和最小值,再看看这个公式:,因为的范围为[-1,1],所以內积的范围为[-, ],因此存在最大值和最小值,当取180°时最下,当取0时最大,由此我们可知只要这两个向量共线就会取极值,如果共线同向则取极大值,反之取极小值,所谓共线就是两线平行的意思。 这个概念很重要,大家务必理解了,这将直接关系能否理解梯度。下面介绍矩阵这方面内容。
矩阵向量:
从这里大家可以看到,矩阵中向量的內积定义和平面向量的定义很像,只是他们的表达不一样吧了,如果把平面中a向量和b向量写成列的形式就一样了。只能说平面向量是矩阵向量的一种特殊情况,大家可以这么理解,
因为矩阵向量是列向量,而矩阵的运算法则是行乘以列,因此矩阵向量求內积需要转置一下才能求出是一个数,
到这里大家知道了矩阵的向量计算內积公式了,总结一下:
设矩阵向量为、,则他们的內积为,既然是內积,那它也有最大值和最小值,和平面理解一样,两向量同向,值最大,反向值最小(这个概念很重要的,理解透什么是內积,切记矩阵向量內积的形式),这样大家可以理解內积了,至于梯度,大家别急,基础理解了,梯度自然而然的就理解了。下面是导数方面的内容。
什么是导数?什么是偏导数?他们有什么物理意义?梯度和导数、向量有什么关系?
大家都知道导数是代表函数(曲线)的斜率,是描述函数(曲线)变化快慢的量,同时曲线的极大值点也可以使用导数来判断,即极大值点的导数为0,此时斜率为零(现在不深入讨论,后面会通过泰勒级数进行讨论,一阶导数为零的点不一定是极值点可能是驻点,这时需要根据二阶导数判断),那么导数就为我们求解函数的极值提供了可能,当然我们现在说的导数是一元导数即,只具有一个变量,因此很容易求导,那么什么是偏导数呢?我们知道导数是指一元函数的,他的物理意义就是衡量函数变化快慢的量,例如一天中,温度随时间变化的函数就是一元函数,而多元函数是指形如、、等的函数,此时函数的自变量有多个,在这里以二元函数为例说明,我们知道,一旦变量增多,意味着影响因素增加,例如一天的气温不仅和时间有关还是天气有关,还和地理位置有关等,但是我们就想知道,在这多种因素的影响下,我就想知道哪个因素对他影响最大,怎么办呢?所谓的影响最大就是这个因素对气温的影响最大,即求气温的最值,这时候大家可能会说求导啊,对呀求导最好了,但是这里有很多变量啊,例如,我想求x对f的影响,怎么办呢?初中我们都学过一个实验方法就是控制变量法,即当我需要改变一个量时,让其他量不变的情况下去改变这个量然后观察对函数的影响,那么我们 多元求导可不可以也使用这样的方法呢?当我求x对f的影响时,我把y当做常量来处理,然后对x求导即可,当然可以啊,只是这时候的求导不在是导数了,因为多元函数是对一个因素也就是x进行求导,因此称为偏导,这下大家理解为什么有称为偏导了吧。
总结一下:偏导数是指在多元函数的情况下,对其每个变量进行求导,求导时,把其他变量看做常量进行处理,物理意义就是查看这一个变量在其他情况不变的情况下对函数的影响程度。
那什么是梯度呢?和上面又有什么关系呢?
再说梯度之前还是要先说一下泰勒级数,为什么要说这个泰勒级数,因为证明梯度方向总是指向函数最大增加方向的一个关键支撑。
泰勒级数:
数学中,泰勒公式是一个用函数在某点的信息描述其附近取值的公式。如果函数足够平滑的话,在已知函数在某一点的各阶导数值的情况之下,泰勒公式可以用这些导数值做系数构建一个多项式来近似函数在这一点的邻域中的值,即泰勒级数在某一邻域内去无限接近该函数的一个公式。详解泰勒级数可参考这篇文章
这里引入泰勒级数的目的是为了证明极值点的导数问题,高阶函数一般要使用到矩阵论的海森矩阵相关知识,这里不引入那么深的概念,但是基本的矩阵知识还是需要的。
我们只保留前三项:
上面提到了一阶导数是极值点的 。现在解释为什么会是这样,上面的是指很小的步长,当时说明x向右走,当时说明x向左走,学过高等数学极限的应该有这个概念,现在我们通过泰勒级数只考虑上面公式的前两项来解释为什么,极值点处的一阶导数为0
假如这一点的函数值为极值点,可以是极小值或者极大值,这里以极大值点为讲解内容 :
因为此时的为极大值,无论还是,那么的,那么上面的公式想要成立,只能让
才能成立,极小值也是这样证明的,无需画图,从泰勒级数就可以说明极值点的一阶导数一定为0,那么一阶导数为零的点不一定是极值点怎么证明呢?使用三项即可证明,下面证明;
一阶导数为零不一定是极值点:
如果,那么公式可写成这样:
从上式可以看到如果在时假如为极大值,理应说无论还是,,但是此时如果 ,则,所以,即证的不是极大值点,那如何才能判断是极值点呢?
此时需要借助二阶导数,上面如果则为极大值点,所以才有一阶导数等于零,二阶导数小于零为极大值点,如果二阶导数大于零则为极小值点。如果二阶导数等于0怎么办?那就继续判断三阶导数就可以了。
这是在标量的情况下的极值问题,如果x是向量怎么处理呢?
还是引入泰勒公式就可以了。只是不一样的是都是向量了:
我们知道机器学习中的变量都很多,一般都使用向量进行表示(此时为列向量)且为多元函数,求导和标量一样的,只是现在是求偏导了。
上面的公式、、、都是向量,例如一阶偏导应该是这样的:
因为是向量,所以有大小有方向了,大家注意到了没有此时的为行向量了,因为转置了,因此和相乘是內积,此时我们也只看前两项即:
现在重点来了啊,为了每次x前进的方向是使函数增长最快,应该怎样选取前进方向的步伐(向量),才能保证呢?好,大家能看到直接影响着,而决定的值是由、决定,然而是确定的,所以使其最大即可,而该式就是向量的內积,根据上面讲了半天的向量內积可知,只要使取的向量和共线就可以了,如果共线同向则取最大方向,反向取最小小方向。因此直接使=即可,即保证方向共线就可以了,至于值得大小可以乘一个标量,现在我们找到了这个向量,而这个向量就是多元函数的一阶偏导数,这时候就定义,多元函数的一阶偏导数为梯度,符号为,数学上的梯度就是这么来的,此时就可以写成这样了:
好,到这里我们知道了什么是梯度,梯度怎么来的,总结来说梯度是为了寻找极值而生的,而且是极大值,因此梯度总是指向函数增长最快的方向,这就是本质原因了,但是我们常听的是梯度下降,改变梯度方向就是下降最快的,共线反向取极小值就是这个道理了。
该式更能反映事实。大家细细品味,梯度的知识点难在理解上,梯度不是标量,他是向量,有方向有大小,一般我们不是很关心大小,因为可以通过标量放大或者缩小,重要的是方向问题,因为只要确定增长最快的方向,才能找到极值点,这也是很多算法使用梯度优化算法的原因,当然是梯度的反方向,
到现在基本上就结束了,但是我还是有些知识需要交代,矩阵方面的没给大家深入讲,可能上面的证明还是不够严谨,但是证明思路已经出来了,理解梯度已经够用了,如果感兴趣,建议大家有时间看看张贤达的矩阵论,里面有更严谨的数学推到 ,在这里希望给大家一种抛砖引玉的感觉,矩阵论对这方面讲解的很透彻,主要牵扯到二次型,正定、半正定等知识。有时候感觉数学没什么用,其实用处很大的,需要我们学习者内化或者理解其物理意义,搞明白来龙去脉,方能正确使用数学这把利剑,梯度到此结束,有问题欢迎交流。