理解梯度下降
梯度下降的公式相信大家都耳熟能详:
θ=θ−λ∂θ∂f(x;θ)
其中λ是步长,那为什么他有效呢?
Local linearity
在讨论梯度下降之前,我们先讨论一个更简单的问题,我想知道4.36=?是多少?但现在我们只知道4=2,还有这个函数在4这个点的梯度,能不能就凭这两个信息预测出4.36这个点的值是多少?为什么我们可以预测出来?其中的奥秘就是Local linearity, 看下图:

对于任意的一个光滑的函数,如果我们取某个点,然后不停地放大他(如果你自己能画图,也可以自己试试),你会发现那条原本一条扭曲的曲线,在某个区域无限放大后居然变成了一条直线(跟红色的线重合)。再看看导数的定义:
dxdy=Δx→0limΔxf(x+Δx)−f(x)
它其实就是在算,在一个很小的长度dx下,f(x)大小的变化率,如果在局部是线性的,所以,想象一下,如果我们想要知道在4这个点加上0.36后的位置的变化,也就是4.36这个值(假设现在局部放大后就是线性的),于是我们可以用 f′(x)∗0.36来计算出f(x)增加的量,于是
f(4.36)≈f(4)+0.36∗f′(4)=2+0.5∗4−0.5=2.09
我们拿计算器算一下,4.36=2.088061,答案非常接近!事实上,我们知道其实导数也是一条曲线f′(x),而这条曲线也有Locally linearity的性质,所以,如果我们能够用二阶导数先预测出一阶导数在加了0.36后的变化,然后再根据这个变化去预测原函数f的变化,那我们就能够能加准确!
所以,我们先用二阶导数预测一阶导数在4.36的值是f′(4.36)≈f′(4)+0.36∗f′′(4),现在我们出现了两个导数,一个是f′(4),一个是f′(4.36),为了更准确的地预测,我们可以将这个两个导数取平均然后再去预测我们的最终值:
f(4.36)≈f(4)+0.36∗2f′(4)+f′(4.36)≈f(4)+0.36∗2f′(4)+f′(4)+0.36∗f′′(4)=f(4)+0.36∗f′(4)+20.362f′′(4)=2.087975
有没有很熟悉,这其实就是泰勒公式展开,我们可以无穷的写下去,直到最后的导数真的变成一条直线。
λ函数f(x;θ)的变化
梯度下降
接来下再说说梯度下降就很简单了,想要知道到底θ到底是向前走一小步,还是向后走一小步会使得使得f(x;θ)减少。
而我们又知道,我们可以根据梯度去预测向前一小步的变化量,那就是λ∗∂θ∂f(x;θ)。
如果∂θ∂f(x;θ)>0,意味着f(x;θ+Δθ)−f(x;θ)>0,也就是θ向前一小步f的预测值是增大的,所以我们希望θ向后一小步,因此θ=θ−λ∂θ∂f(x;θ)。
而如果∂θ∂f(x;θ)<0,意味着f(x;θ+Δθ)−f(x;θ)<0,向前一小步,f(x;θ)是变小的,所以我们希望他保持向前,也就是θ=θ+λ∂θ∂f(x;θ)。
咦,似乎跟原本的梯度下降公式有点不一样?其实原本的梯度下降公式中的“负”号指的是负梯度,也就是,如果本来就是∂θ∂f(x;θ)<0,那么他就是一个负梯度,我们是不需要再加一个负变成正数的!为了简洁,我们就用负梯度表示梯度下降了!
θ=θ−λ∇θf(x)
参考资料
local-linearization-intro