梯度下降算法的定位
梯度下降算法是一种求解局部最小值的算法,在线性模型和非线性模型中都可以用。
在用某个模型对数据进行拟合时,会用损失函数(或者叫错误函数等等)去评估拟合的准确性,这个时候往往要找到损失函数的最小值,即求出达到最佳拟合效果时各参数的值。求函数的最小值时往往用到梯度下降法。
从二维空间的线性回归说起
假设平面上有n个点: (x1, y1), (x2, y2), …, (xn, yn).
现在要找出一条直线去拟合这些点(即找出x和y的线性关系)。
首先要构造一个损失函数去评估拟合的好坏,最小二乘法是最常见的方法(其实就是用误差的平方和去构造损失函数)。
设拟合函数为y^=mx+b(y^为x对应的y的估计值),则损失函数为:
E=∑i=1n(mxi+b−yi)2
下面有两种方法去求参数m和b:
1,传统的统计学方法:求m和b的值使得E最小。
要求函数的最小值,首先想到的就是求导数,令导数等于零(这个例子是奏效的,应该能够证明这个函数是凸函数,用其它先验知识也能知道它的形状)。
于是分别求m和b的偏导数,令其等于零:
∂m∂E=2∑i=1n(mxi+b−yi)xi=0
∂b∂E=2∑i=1n(mxi+b−yi)=0
解得:
m=x2−xˉ2xy−xˉyˉ
b=x2−xˉ2x2y−xyxˉ
2,用梯度下降的方法去求m和b
随便设定一个初始的m和b值,同时learning rate (α)也需要提前设置。
不妨设m0=b0=0,α=0.0001
经过一次迭代,m0和b0分别变成m1和b1:
m1=m0−α∂m0∂E
b1=b0−α∂b0∂E
在m0和b0都已知的情况下,∂m0∂E和∂b0∂E很容易求出来。
。。。
经过N(比如10000,一般要人为设置次数)次这样的迭代,就会得到mN和bN的值,不出意外,这里的mN和bN跟传统的解法得到的值基本一样。
拓展到多维空间的线性回归
假设在n+1维空间,有m个点:(x11, x12, …, x1n, y1), (x21, x22, …, x2n, y2), …, (xm1, xm2, …, xmn, ym)
用最小二乘法去构造损失函数:
E=∑i=1m(w1xi1+w2xi2+...+wnxin+b−yi)2
(向量写法为E=∑i=1m(wTxi+b−yi)2)
对每一个系数分别求导数为:
∂w1∂E=2∑i=1m(wTxi+b−yi)xi1
∂w2∂E=2∑i=1m(wTxi+b−yi)xi2
…
∂wn∂E=2∑i=1m(wTxi+b−yi)xin
∂b∂E=2∑i=1m(wTxi+b−yi)
写成梯度的形式为:
∇E=(∂w1∂E,∂w2∂E,...,∂wn∂E,∂b∂E)T
梯度实际上就是对多变量函数的每一个变量求偏导数,再按一定的顺序组成向量或者矩阵。
接下来,和二维空间中一样,对每一个变量分别进行迭代,直到得到理想的结果。
再拓展到非线性模型
对于非线性模型,迭代方法与线性模型一样,用一般的公式来展示比较麻烦,因此举一个例子比较容易理解。
假如有如下的非线性方程组:
与之相关的函数为:
构造损失函数:
迭代前初始化参数:
开始进行迭代:
Reference
Gradient Descent: All You Need to Know
Why do we subtract the slope * a in Gradient Descent?
Gradient descent from wikipedia