如何理解梯度下降算法

Last Updated: 2024-05-14 13:18:41 Tuesday

-- TOC --

对于一元函数,即只有一个变量,我们说导数(derivative)。对于多元函数,即有多个变量,我们说梯度(gradient)。导数是个标量,只有大小(有正负),没有方向。梯度是个向量,除了每个维度的大小,组合在一起就是个方向。

梯度每个维度的值,就是一个方向导数,或偏导数,比如对于一个二元函数z=f(x,y),可以固定x得到z对于y的偏导数\(\cfrac{\partial z}{\partial y}\),也可以固定住y得到z对于x的偏导数\(\cfrac{\partial z}{\partial x}\)。组合在一起,就是z的梯度\(\nabla=(\cfrac{\partial z}{\partial x},\cfrac{\partial z}{\partial y})\)。

一元函数的导数,其值在每一点均可能不相同,导数在某一点是个数,在某一区间,就是个函数,叫做导函数。梯度是一个向量,空间中的某一点,向量可以理解为空间中的一个数值。梯度在某一片空间内,每个维度的值可能都在变化,也就是一个多元函数。

常常看到这样的结论:梯度方向是因变量变化最快的方向!比如二元函数的因变量z。

二元函数变量空间中的某个点,其切是一个面,这个点在这个面上,可以按任意方向变化,360度无死角,无数个变化方向。但是,只有梯度确定的方向,是z变化最快的方向。现在将这个结论对应到一元函数的导数身上:导数是y变化最快的方向。

不仅是变化最快的方向,还有确定的变化率,梯度的变化率就是梯度向量的长度。

导数是个标量,没有方向呀?

导数没有方向,但是与导数同源的,是一条切线(不是切面)。这条线就已经决定了方向!

因此,IMHO,梯度下降算法在一元函数上的应用,就是导数下降算法,完全一样。而且,用一元函数的平面曲线图,可以更容易地理解梯度下降算法。

补充一个细节:变化最快的方向,其实有两个方向,一正一负。

梯度下降算法,利用的就是梯度的负方向,即所谓“下降”,降低z的值(即cost function的值),以此来优化z,达到拟合数据的效果。

为什么负方向(negative gradient direction)就是下降呢?让我们用一元函数的图形来理解“导数下降”这个算法,请脑补一副可导曲线的图像:

  1. 导数为正的区间,单增,乘以\(-\eta\),实际效果是x向左移动,向y更小的地方移动;
  2. 导数为负的区间,单减,乘以\(-\eta\),实际效果是x向右移动,向y更小的地方移动;
  3. 当曲线有多个local minima的时候,完全有可能将算法困在某个local minimum附近,不得动弹;
  4. 当导数值非常小的时候,x不管是向左还是向右移动,都非常缓慢。

\(\eta\)就是learning rate,带上负号,就是朝着梯度的反方向。

多元函数的梯度下降,也是这么一回事儿。

SGD

Stochastic Gradient Descent

这里的stochastic,在应用中就是训练时的minibatch。为什么有效?从数学上理解,整个要优化的公式,等号的右边,是个和式。Coss的计算,是对每一个training data的cost的求和。如果只对minibatch中的data进行计算,同样可能够达到整体降cost的效果。使用minibatch,有计算上的优势。

本文链接:https://cs.pynote.net/math/202209041/

-- EOF --

-- MORE --