梯度下降是机器学习的核心基础概念,但是碍于概念过于抽象,所以比较难理解,所以笔者想花一些时间来弄懂梯度下降的原理,所以就有了后面的这些图和我个人的一些理解和看法,希望可以在助力自身学习的同时帮助一些初学者更快的搞懂梯度下降。
在理解梯度下降前,我们首先要知道高等数学的偏导数知识,导数的的物理意义。
比如下面这张图,对于某条曲线而言,我们可以知道导数的物理意义就是计算其在各个点的斜率。
在知道导数的物理意义之后,我们可以更深一层的理解,导数为0的点要么是这个曲线的极大值要么是极小值
在监督式学习中,我们通过把特征值和其对应的结果打包,简单理解为特征值为x,其对应的标签为y,可以画出其图像。
在上面这幅图中,h(x)是我们拟合的一条条直线,红色的点是样本点(x,y),我们希望我们拟合的直线与这些样本的重合度足够高,就需要有个东西来判断拟合的效果,从直觉上理解可以认为拟合的线与样本点的距离越短,效果越好。所以就有了损失函数(代价函数)的定义。
比如很常用的MSE(均方误差损失函数)
l o s s ( w , b ) = ( f ( x ) − y ) 2 = ( y ^ − y ) 2 loss(w,b)=(f(x)-y)^2=(\hat{y}-y)^2 loss(w,b)=(f(x)−y)2=(y^−y)2
考虑到有m个x和m个y,即m个离散点,所以将上面的公式进行大数化处理(概率论的估计),得到代价函数
J = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 J=\frac{1}{m}\sum_{i=1}^m{\left( f\left( x_i \right) -y_i \right) ^2} J=m1i=1∑m(f(xi)−yi)2
因为代价函数的物理意义是量化预测值与实际值的差异程度,所以我们的目标就很明朗了,即:
m i n i m i z e w , b J ( w , b ) \underset{w,b}{minimize}J(w,b) w,bminimizeJ(w,b)
有了上面的铺垫,我们可以以一个例子来深入了解梯度下降了。比如吴恩达的一个房价预测的例子:
图像中标的x点是样本,而红线是我们拟合的线。
我们可以计算得对于这条拟合曲线的损失函数 l o s s = ( f ( x ) − y ) 2 = ( w x + b − x − 100 ) 2 loss=(f(x)-y)^2=(wx+b-x-100)^2 loss=(f(x)−y)2=(wx+b−x−100)2,根据损失函数得到代价函数并画出它的图像:
我们可以看到代价函数的曲面图中是有最小值的,把整个曲面看作一个山谷,这个山谷的谷底就是我们所需要的拟合曲线的参数w和b的坐标。即 m i n i m i z e w , b J ( w , b ) \underset{w,b}{minimize}J(w,b) w,bminimizeJ(w,b)
前面我们知道导数的物理意义,所以我们可以通过求偏导的方式来得到代价函数的极小值(偏导为0),但是这个极小值是局部的最小值,而非全局的最小值。
极小值与最小值的关系如下:
所以大多数时候如果直接求偏导=0所对应的坐标(w,b)并不能得到很好的拟合效果。所以引入了学习率的概率,改进求最小值的方法,就得到我们梯度下降法的公式:
w j : = w j − l r ∗ ∂ J ( w j , b j ) ∂ w j w_j := w_j-lr*\frac{\partial J(w_j,b_j)}{\partial w_j} wj:=wj−lr∗∂wj∂J(wj,bj)
b j : = b j − l r ∗ ∂ J ( w j , b j ) ∂ b j b_j := b_j-lr*\frac{\partial J(w_j,b_j)}{\partial b_j} bj:=bj−lr∗∂bj∂J(wj,bj)
在这里的(w,b)和 ( θ 1 , θ 0 ) (\theta_1,\theta_0) (θ1,θ0)是一个东西
直观的理解:
把红点定为初始点,切于初始点的红色直线的斜率,表示了函数 J ( θ ) J(\theta) J(θ)在初始点处有正斜率,也就是说它有正导数, 则根据梯度下降公式 θ j : = θ j − l r ∗ ∂ J ( w j , b j ) ∂ w j \theta_j := \theta_j-lr*\frac{\partial J(w_j,b_j)}{\partial w_j} θj:=θj−lr∗∂wj∂J(wj,bj) , 右边的结果是一个正值,即 θ 1 \theta_1 θ1会向左边移动。这样不断重复,直到收敛(达到局部最小值,即斜率为0)。
初始 值(初始点)是任意的,若初始点恰好就在极小值点处,梯度下降算法将什么也不做( θ 1 : = θ 1 − l r ∗ 0 \theta_1:=\theta_1-lr*0 θ1:=θ1−lr∗0)。
盗图自吴恩达大佬:这里描述起始点在最低点左上和右上的情况,不管是在那一边,梯度下降算法都会使得待优化参数逼近最优值。
可以理解为我们的损失(代价函数)是一步一步变小的,为了避免出现步子迈太小,速度太慢或者步子迈太大跨过了最低点的情况,所以需要合理的调整学习率: