查看原文
其他

如何通俗理解梯度下降算法?

脚本之家 2022-09-23

The following article is from 编码珠玑 Author 刘亚曦

 关注
脚本之家
”,与百万开发者在一起


出处:编码珠玑(ID:gh_f65e0111d17a)

如若转载请联系原公众号

上面这张照片是我上次在下班路上拍到的,天刚刚下过雨,雨珠沿着窗户的玻璃面向下流动,我做了黑白硬相处理,有一定的艺术性。也许你会问,这张照片跟这个题目有什么关系呢?其实,雨珠只会沿着当前位置最「陡峭」的方向流动,这正是深度学习中梯度下降算法的一种直观体现。深度学习是目前在互联网行业非常火热的话题,但是目前市场上介绍深度学习算法的书籍要么上来就是一大堆的数学公式,要么就是直接给你一些残缺的框架代码,让人看起来好似囫囵吞枣,今天我更想用一种直观的方式给大家解释一下深度学习,由于深度学习涉及到大量的数学原理,所以这个专辑我会分几篇文章来进行分别介绍。但我并不会直接按照公式进行长篇大论,这篇文章主要面对的是初学者,所以我更会用最直观的方式尤其是用插画的方式来给大家讲解。本篇文章我会首先介绍深度学习中的最重要的算法——梯度下降算法。


我们首先来回忆一下高数里面对梯度的定义:


如果二元函数  在平面  上具有连续偏导数,那么对于每一个点  都有向量  与其对应,我们记 那么  称为函数  在点  处的梯度(gradient).


可是这个公式从直观上看,大多数人并没有明白其本质含义,但是这个公式却是在深度学习中非常重要的一种算法。所以,今天我就花点时间给大家解释一下这个公式。


但是要说梯度的定义,我们还得从导数说起。


一,导数的本质


不知道大家有没有想过一个问题,当初李善兰为什么要把 derivative 这个词成“导数”呢,导,在说文解字里面有引导之意,而我们知道,导数在数学上的意义就是函数某点切线的斜率,它“控制”这个函数的增长速度,在几何上最直观的解释就是函数在这点的“陡峭程度”,所以李善兰这样的翻译也正迎合了 derivative 这个单词想表达的意义。


我们知道,导数的几何定义是




它的几何意义如上图所示:  分别为函数  上任意一点, 它们的横坐标分别为  与  ,当点  沿着曲线函数逼近点  的时候,如果下面的极限存在,那么我称  在点  处可导,导数记为  : 

为了方便,我们把  时的  与  分别记为  ,这里的d代表differential(微分),有极小变化量的意思:

我们以一元函数  为例来说明:


下图中点  是函数图像上任意一点,红色直线是在改点的斜率,也就是导函数。根据函数图像,我们可以看出当  的时候,它是一个增函数,  ,意味着它在上坡:



当  的时候,它是一个减函数,  ,意味着它在下坡:



由大于0到小于0过度的时候,必定有一个点等于零。这个点就是极(大)值点。可以想象,如果上面那张图片上某一个雨珠落到这个函数上,例如函数中的  点,那么它无论如何怎么移动,只可能超两个方向移动,或者  增长方向,或者  减小方向,它别无选择:



所以说,一元函数导数的本质就是函数在此点的斜率,通过这个斜率,我们可以知道函数此时的变化率问题。



二,方向导数的本质:也是一个导数,函数沿任意方向的变化率


如果这个函数是多元函数会怎么样呢,它有导数吗,答案是有,而且还分为偏导数与方向导数。上面说了,一元函数的导数是为了研究函数沿  坐标轴的变化率的,那么对于二元函数来说,它是一个曲面,我们如何研究它的变化率呢?我么以函数  的图像为例来说明:



我们先来说偏导数,如果我们研究上面点  沿某一坐标轴的变化率为多少,这就是偏导数的由来,例如计算  点沿  轴的变化率,我们先做  的平面来截取这个曲面,得到的曲面在点  做切线,切线的斜率就是点  对  方向的偏导数:


同样也能得出沿  方向的偏导数,也即变化率。可这样你一定能够看出偏导数的局限性了,它只能求函数沿某一坐标轴的变化率,而往往我们想求的是沿任意方向的变化率,这个时候就要用到方向导数了。


很显然,在点  处沿任意方向(这里说的任意方向指的是在平面  上的任意方向)的都有一个切线,数量显然是无数条的,但是我们最感兴趣的还是那个变化率的最大值,因为它的方向最抖。他们的方向导数可以根据下面这个式子计算出来: 其中   分别是方向  的方向余弦。



三,梯度的本质:它是一个向量


在本文开头部分,我们知道梯度的定义公式为: 明显,他是一个向量,那么上面方向导数的公式可化简为它与方向余弦的内积形式:可这个向量有什么特殊吗?答案是有,他很特殊,既然它是个向量,就必定有方向。看上面的化简公式,在沿梯度的方向,也就是夹角  ,方向导数最大,意味着它增长的最快;在梯度相反的方向,也就是  ,方向导数最小,意味着它减小的最快。



四,梯度下降的思路:


首先说明一下,在深度学习中,我们最终的目的还是求函数的最小值。举个最简单的例子,我们经常用的最小二乘法进行直线拟合或者线性回归的模型中,它也是在求函数总偏差的最小值。按照传统的做法,我们在得出函数模型后,要对每一个因变量求偏导数,让其分别等于0,联立求出每一个参数,例如我在上两篇文章中「对最小二乘法拟合直线的一些思考与改进」、「最小二乘法之加权最小二乘的应用」用的就是这种方法。但如果在深度学习中,这种方法就是不可取了,因为后者在一个模型中往往包含了成千上万个变量,通过联立偏导数求方程的的方法实在是难以求得,即便能求出,它的计算量也是难以接受。那么怎么办呢,梯度下降思想的威力就发挥出来了。


根据上面我们得出的结论,与梯度相反的方向,函数减小的最快。那么我们可以每次让函数的每一个变量偏移一个微小的变量,计算它们的梯度,再根据得出的结果调整一下方向,再次计算,如此反复进行,即可收敛出我们的最小值。


它的几何思维如下下图所示:假设你在山顶,你有一个足球,把它放在山顶,然后轻轻松开手,球会在重力的作用下沿最抖(梯度)的方向滚动,稍微前进一点后,立马把它止住,然后在当前位置再次松手,如此反复进行,足球就会沿着图中红色最抖的方向进行滚动。


五,用Excel体验梯度下降算法:


我们以函数  来进行说明,如果按照传统的做法,我们求其最小值的方法是分别对  求偏导,再计算结果。但这次我们使用梯度下降的思路来求解它的最小值。


首先,在微小的变化范围内,我们知道下面关系式成立: 写成向量内积的形式就是: 只有当向量   的方向与梯度的方向相反时候,也即  ,  才能取最小,这里边的   .



还以  说明,首先我们给  定义一个初始值,你可以理解为在那个足球的具体位置,然后每次计算它的梯度,再得出相应的偏移量  与  ,如此反复进行,整个过程分为三步:


1,随便给出初始值。例如  ,再设定  的值,这个值很重要,基本上就是每步的"步长"了,不能太大也不能太小,实际工程应用过程中可以用公式计算出来,这里为了方便我们取  .


2,计算偏移向量。根据计算出来的梯度与  值,来计算偏移向量。例如 3,根据第二步计算出来的偏移量,重新更新位置:  4,重复上面三个步骤。



上面的Excel表格就是我们通过上面四个步骤进行模拟出来的数据,观察最后的计算结果,数据逐步趋向于0,这个结果与这个函数的实际最小值保持一致,正是我们想要的结果。

  推荐阅读:

动图图解GC算法 - 让垃圾回收动起来!

韩信竟是数学大师?中国古代数学启发计算机加密算法

你可以拒绝算法了

阿里四面,居然栽在一道排序算法上

一位前Google工程师的算法学习之路

每日打卡赢积分兑换书籍入口

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存