老饼讲解:一步一步上手学习
好了,这节我们来讲一下梯度下降算法。
众所周知,梯度下降算法就是一种优化算法,也就是用来解决求函数的最小值问题。那么为什么需要梯度下降这类的优化算法呢?下面我们先来唠唠为什么,然后再来快速了解一下梯度下降算法是个什么东东。
在传统方法中,要求单变量函数的最小值,我们通常只要令的导数为0,然后解出x就可以,然而, 在多元函数中,要求出最小值一般是非常困难的。

如图所示,虽然n个自变量,能求得n条偏导等式,但是只有这n条等式构成线性方程组时,我们才有成熟的方法对其求解,如果是非线性方程,我们目前并没有成熟的求解方案, 这也是为什么我们很喜欢构造线性问题,因为它能轻松求解。对于多元方程极小值问题,联立偏导方程求精确解的路子行不通,我们的替代方案就是进行数值求解,梯度下降法就是其中最基本的算法之一。
有的同学可能忘记梯度是什么了,其实就是一元函数中的导数,而多元函数各个变量的偏导数就称为梯度,简单地把"梯度"当成"导数"来理解就差不多了。下面一起来看看梯度下降算法是什么,其实它很简单,它的基本思想如下:

如图所示,梯度下降算法先取一个初始值,然后进行迭代,每次都往梯度的反方向调整它,直到梯度很小。
为什么梯度很小就停止训练呢?因为极值处的梯度为0,梯度很小就意味着可能达到局部最低点附近了。
根据上面的原理,很容易就整理出梯度下降算法的算法流程,如下所示:

它只有简单的几步:
1. 先初始化参数
2. 计算梯度
3. 往负梯度调整参数
其中,lr是学习率,代表调整的步长
4. 检查是否达到终止条件,否则重复2、3
终止的条件一般设为"达到最大训练次数"和"梯度过小"。
有同学可能会问lr是什么,lr是学习率,它用于控制调整的步长,一般设为0.1或0.01。
好了,下面我们进一步来逐点加深对梯度下降法的理解吧。
在一元函数中,负梯度就是导数的反方向,在多元函数中,负梯度就是各个变量偏导数的反方向:

为什么要往负梯度方向调整?因为梯度是函数瞬时上升最快的方向,而负梯度呢,就是函数瞬时下降最快的方向了,所以往负梯度方向调整,只要步长足够小,就能保证目标函数一定能下降。
事实上,梯度下降法对初始值是非常敏感的,我们先来上个图:

如图所示,如果初始化在点A,那么最终能找到的就是局部最优值,而初始化在点B,最终就会找到全局最优值。总的来说,梯度下降法只能找到离初始值最近的局部极小值,如果初始化不好,找到的结果也不好。所以在用梯度下降法时,往往会采用随机初始化,然后多试几次,看看哪次的结果最好。
这节我们学习了梯度下降法,它其实就是一种简单有效的优化算法,它只需要先初始化一个值,然后不断往负梯度方向迭代就可以了,这里我们也不作过于深入的研究,该知道的基本都知道了,下节我们再拉点数据出来具体实践一下就好了,在理论与实践的双向印证下,这样对梯度下降法的理解就非常具体了。
评论