简述梯度下降算法的原理,梯度下降算法是最常用也是最有效的
本文将深入浅出地介绍梯度下降算法的原理,并在文末简要实现梯度下降算法(python代码实现)。
基本思路首先我们需要了解梯度下降算法的原理。这里我举一个简单的例子:
有个农民在山上砍柴,天色已晚。这个农民打算从山顶走到他在山脚下的家。由于天气原因,能见度很低,他每走一步只能看到很短的距离。在这里,让我们想想这个农民怎样才能在最快的时间内回家。在这里,这个农民可以使用梯度下降算法。答案是他每走一步都走在离自己最近的最陡的地方。好了,问题解决了。我们继续。所以假设农夫有判断最陡方向的能力,那么问题又来了。这个农民每次沿着这个最陡的方向走多少步?迈一大步,就会想家。但是,如果你走了一小步,你很可能不会在短时间内到家,所以每一步的大小也是一个至关重要的问题。
好了,故事到此结束。这里我想说的是,我每次走路最陡的地方就是梯度下降算法的原理,每步的大小是梯度学习算法中一个非常重要的学习速率参数。相信你看完这个会在脑子里记住一些概念。接下来,我们将首先从数学的角度解释梯度下降算法。可能有点枯燥,但是一定要坚持读下去。
梯度下降算法的数学原理:x1=x0y(x)x1=x0- alpha * y(x)x1=x0y(x)
上述公式中的参数分别表示为:
x1:x1:下一个位置。
X0:当前位置当前位置。
:每一步的每一步的步长(即上面文中的学习率不能太大也不能太小)
y(x):上升梯度最快的方向就是最陡位置的方向。
这里有一个简单的例子:
先来一个一元函数:y (x)=x2y (x)=x2y (x)=x2然后(y(x))=2x delta(y(x))=2 * x(y(x))=2x。
我们来设定初始位置x0=1步长(学习率)=0.4 =0.4 =0.4。
根据公式x1=x0y(x)x1=x0- alpha * y(x)x1=x0y(x),有:
x1=1
x2=0.04
x3=0.008
x4=0, 0016
如图,经过四次运算,也就是四步,基本达到了函数的最低点,也就是山底。
接下来,让我们尝试一个多元示例:
z ( x,y)=x^2 y^2 z(x,y)=x^2 y^2 z(x,y )=x 2 y 2
现在用梯度下降法计算这个函数的最小值。通过观察可以发现,最小值其实是(0,0)点。但是接下来,我们会从梯度下降算法开始一步步计算这个最小值!
我们假设初始起点为(x,y)=(1,3),初始学习率为=0.1 =0.1=0.1,则(z)=lt;2 x,2y gt; delta(z)=lt;2x,2ygt(z)=2x,2y
然后进行多次迭代:
最后,我们尝试用python实现梯度下降算法。这个场景是线性回归的一个简单例子。现在假设我们有一系列的点,如下图所示:
首先,我们定义一个成本函数,这里我们采用均方误差函数:
在这个公式中
m是数据集中的点数。
是一个常数,所以当计算梯度时,二次乘法会抵消这里的。自然没有多余的常系数,方便后续计算,不会影响结果。
Y是数据集中每个点的实际Y坐标值。
h是我们的预测函数。根据每个输入X,我们可以根据计算出预测的Y值,也就是从代价函数中可以看出,代价函数中有两个变量,所以是一个多变量梯度下降问题。我们可以求解成本函数的梯度,即分别对两个变量进行微分。
定义了成本函数和梯度,以及预测的函数形式。我们可以开始写代码了。
导入numpy作为点数据集的np#大小. m=20#点x坐标和虚拟值(x0,x1).X0=np.ones((m,1))X1=np.arange(1,m 1)。shape(m,1)X=np.hstack((X0,X1))# Points y-coordinate y=NP . array([3,4,5,5,2,4,7,8,11,8,12,11,13,13,16,17,18,17,19,21])。reshape(m,1)#学习率=0.01 def Error _ function(theta,X,y): 误差函数J定义 diff=np.dot(X,theta) - y return (1。/2*m) * np.dot(np.transpose(diff),diff)def Gradient _ function(theta,X,y): 函数J定义的梯度 diff=np.dot(X,theta) - y return (1。/m) * np.dot(np.transpose(X),diff)def gradient_descent(X,y,alpha): 执行梯度下降。 theta=np.array([1,1])。shape(2,1)gradient=gradient _ function(theta,X,Y)while not NP . all(NP . absolute(gradient)=1e-5):theta=theta-alpha * gradient gradient=gradient _ function(theta,X,Y)return theta optimal=gradient _ descent(X,Y,alpha) print (optimal:,optimal) print (error function:,error _ function (optimal,X,y) [0,0])结果如下:
拟合的直线如下:
相信看完这篇文章,你就能理解梯度下降了。