理解梯度下降

理解梯度下降

梯度下降的公式相信大家都耳熟能详:
θ=θλf(x;θ)θ \theta=\theta-\lambda \frac{\partial f(x;\theta)}{\partial \theta}
其中λ\lambda是步长,那为什么他有效呢?

Local linearity

在讨论梯度下降之前,我们先讨论一个更简单的问题,我想知道4.36=?\sqrt{4.36}=?是多少?但现在我们只知道4=2\sqrt{4}=2,还有这个函数在4这个点的梯度,能不能就凭这两个信息预测出4.36这个点的值是多少?为什么我们可以预测出来?其中的奥秘就是Local linearity, 看下图:

理解梯度下降

对于任意的一个光滑的函数,如果我们取某个点,然后不停地放大他(如果你自己能画图,也可以自己试试),你会发现那条原本一条扭曲的曲线,在某个区域无限放大后居然变成了一条直线(跟红色的线重合)。再看看导数的定义:
dydx=limΔx0f(x+Δx)f(x)Δx \frac{dy}{dx}=\lim_{\Delta x\to 0}\frac{f(x+\Delta x)-f(x)}{\Delta x}

它其实就是在算,在一个很小的长度dxdx下,f(x)大小的变化率,如果在局部是线性的,所以,想象一下,如果我们想要知道在4这个点加上0.36后的位置的变化,也就是4.36这个值(假设现在局部放大后就是线性的),于是我们可以用 f(x)0.36f'(x)*0.36来计算出f(x)f(x)增加的量,于是
f(4.36)f(4)+0.36f(4)=2+0.540.5=2.09 f(4.36)\approx f(4)+0.36*f'(4)=2+0.5*4^{-0.5}=2.09

我们拿计算器算一下,4.36=2.088061\sqrt{4.36}=2.088061,答案非常接近!事实上,我们知道其实导数也是一条曲线f(x)f'(x),而这条曲线也有Locally linearity的性质,所以,如果我们能够用二阶导数先预测出一阶导数在加了0.36后的变化,然后再根据这个变化去预测原函数f的变化,那我们就能够能加准确!

所以,我们先用二阶导数预测一阶导数在4.36的值是f(4.36)f(4)+0.36f(4)f'(4.36)\approx f'(4)+0.36*f''(4),现在我们出现了两个导数,一个是f(4)f'(4),一个是f(4.36)f'(4.36),为了更准确的地预测,我们可以将这个两个导数取平均然后再去预测我们的最终值:

f(4.36)f(4)+0.36f(4)+f(4.36)2f(4)+0.36f(4)+f(4)+0.36f(4)2=f(4)+0.36f(4)+0.3622f(4)=2.087975 \begin{aligned} f(4.36) & \approx f(4)+0.36*\frac{f'(4)+f'( 4.36)}{2} \\ & \approx f(4)+0.36*\frac{f'(4)+f'( 4) +0.36*f''( 4)}{2}\\ & =f(4)+0.36*f'(4)+\frac{0.36^{2}}{2} f''( 4)\\ & =2.087975 \end{aligned}

有没有很熟悉,这其实就是泰勒公式展开,我们可以无穷的写下去,直到最后的导数真的变成一条直线。

λ\lambda函数f(x;θ)f(x;\theta)的变化

梯度下降

接来下再说说梯度下降就很简单了,想要知道到底θ\theta到底是向前走一小步,还是向后走一小步会使得使得f(x;θ)f(x;\theta )减少。

而我们又知道,我们可以根据梯度去预测向前一小步的变化量,那就是λf(x;θ)θ\lambda *\frac{\partial f(x;\theta )}{\partial \theta }

如果f(x;θ)θ>0\frac{\partial f(x;\theta )}{\partial \theta } >0,意味着f(x;θ+Δθ)f(x;θ)>0f(x;\theta +\Delta \theta )-f(x;\theta ) >0,也就是θ\theta向前一小步f\displaystyle f的预测值是增大的,所以我们希望θ\theta向后一小步,因此θ=θλf(x;θ)θ\theta =\theta -\lambda \frac{\partial f(x;\theta )}{\partial \theta }

而如果f(x;θ)θ<0\frac{\partial f(x;\theta )}{\partial \theta } < 0,意味着f(x;θ+Δθ)f(x;θ)<0f(x;\theta +\Delta \theta )-f(x;\theta )< 0,向前一小步,f(x;θ)f(x;\theta )是变小的,所以我们希望他保持向前,也就是θ=θ+λf(x;θ)θ\displaystyle \theta =\theta +\lambda \frac{\partial f(x;\theta )}{\partial \theta }

咦,似乎跟原本的梯度下降公式有点不一样?其实原本的梯度下降公式中的“负”号指的是负梯度,也就是,如果本来就是f(x;θ)θ<0\frac{\partial f(x;\theta )}{\partial \theta } < 0,那么他就是一个负梯度,我们是不需要再加一个负变成正数的!为了简洁,我们就用负梯度表示梯度下降了!

θ=θλθf(x) \theta =\theta -\lambda \nabla _{\theta } f( x)

参考资料

local-linearization-intro