各位老铁们好,相信很多人对深入解析:梯度与梯度下降算法原理及应用都不是特别的了解,因此呢,今天就来为大家分享下关于深入解析:梯度与梯度下降算法原理及应用以及的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
文章主要内容:
梯度下降的场景假设梯度梯度下降算法的数学解释梯度下降算法示例梯度下降算法的实现延伸阅读
梯度下降的场景假设
梯度下降法的基本思想可以类比为一个下山的过程。假设一个场景:一个人被困在山上,需要从山上下来(即找到山的最低点,即山谷)。不过此时山上大雾,导致能见度很低。因此,下山的路无法确定。他必须利用周围的信息,找到下山的路。这时候他就可以利用梯度下降算法来帮助他下山了。具体来说,就是根据他现在的位置,找到这个位置最陡的地方,然后朝着山体高度下降的地方走去。同理,如果我们的目标是上山,那就是爬到山顶。那么此时你应该是沿着最陡的方向向上走。然后每走一定的距离,就重复使用同样的方法,最后就可以顺利到达山谷了。
Untitled.png 我们还可以假设,山峰最陡的部分无法立即用肉眼观察到,而是需要复杂的工具来测量。同时,这个人恰好拥有测量最陡方向的能力。因此,人每行走一定的距离,就需要一段时间来测量该位置最陡的方向,比较耗时。所以要想在太阳落山之前到达山底,就必须尽可能减少方向测量的次数。这是一个两难的境地。如果经常测量,可以保证下山的方向绝对正确,但是非常耗时。如果测量太少,就有偏离轨道的风险。所以,我们需要找到一个合适的频率来测量方向,保证下山的方向不会错,同时又不花太多的时间!
梯度下降
梯度下降的基本过程与下山的场景非常相似。
首先,我们有一个可微函数。这个函数代表一座山。我们的目标是找到这个函数的最小值,也就是山的底部。根据之前的场景假设,下山最快的方法就是找到当前位置最陡的方向,然后沿着这个方向下去。对应到函数,就是求给定点的梯度,然后向梯度的反方向移动。这样会让函数值下降最快!因为梯度的方向就是函数变化最快的方向(后面会详细解释)
因此,我们反复使用这种方法,反复获取梯度,最终达到局部极小值,这和我们下山的过程类似。找到梯度就可以确定最陡的方向,这就是测量场景中方向的方法。那么为什么梯度的方向是最陡的方向呢?接下来我们从微分开始
微分
看待微分的意义有不同的角度。最常用的两个是:
函数图中,切线的斜率函数在某一点的变化率
几个微分的例子:Untitled.png 上面的例子都是单变量微分。当函数有多个变量时,存在多变量微分,即每个变量单独微分。
Untitled.png
梯度
梯度实际上是多变量微分的推广。
这是一个例子:
无标题.png
我们可以看到梯度就是将每个变量分别微分,然后用逗号分隔。包含了梯度,说明梯度实际上是一个向量。
梯度是微积分中非常重要的概念。前面我提到了渐变的含义。
在单变量函数中,梯度实际上是函数的微分,表示函数在给定点处的切线的斜率。在多变量函数中,梯度是一个向量,并且该向量有一个方向。梯度的方向表示函数的方向。固定点上升最快的方向这也解释了为什么我们需要千方百计求梯度!如果我们需要到达山脚,我们需要观察每一步最陡的地方。梯度只是告诉我们这个方向。梯度的方向就是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以只要我们沿着梯度的方向一直走,就可以到达局部最低点!
梯度下降算法的数学解释
上面我们花了很大的篇幅介绍了梯度下降算法的基本思想和场景假设,以及梯度的概念和思想。接下来我们就开始从数学上讲解梯度下降算法的计算过程和思路!
无标题.png
该式的含义是:J是的函数。我们当前的位置是0点,我们需要从这个点到J的最小点,也就是山的底部。首先,我们确定前进的方向,即梯度的反方向,然后走一定距离的步长,即。走完这一步,我们到达了点1!
Untitled.png
下面就这个公式的几个常见的疑问:
是什么含义?
在梯度下降算法中被称为学习率或者步长,也就是说我们可以通过来控制每一步的距离,保证步数不会太大而带来麻烦。哈哈,其实只要别走得太快,错过最低点就可以了。同时注意不要走得太慢,以免太阳还没到山底就已经落山了。所以的选择在梯度下降法中往往非常重要! 不能太大或太小。如果太小,可能会导致最低点延迟。如果太大,可能会导致错过最低点!
Untitled.png
为什么要梯度要乘以一个负号?
渐变前加负号表示向渐变的相反方向移动!之前我们提到过,梯度的方向其实就是此时函数上升最快的方向!而我们需要往下降最快的方向走,这自然就是负梯度的方向,所以这里需要加一个负号。
梯度下降算法的实例
我们假设有一个只有一个变量的函数:
无标题.png
微分函数:
无标题.png
初始化,起点是:
Untitled.png 学习率:
Untitled.png 根据前述梯度下降的计算公式:
Untitled.png 我们开始梯度下降的迭代计算过程:
Untitled.png 如图,经过四次操作,也就是四步,我们基本上已经到达了函数的最低点,也就是山底:
Untitled.png
多变量函数的梯度下降
我们假设有一个目标函数:
无标题.png
现在我们要通过梯度下降计算这个函数的最小值。我们通过观察可以发现,最小值其实就是(0, 0)点。不过接下来,我们将从梯度下降算法开始一步步计算这个最小值!
我们假设初始起点是:
无标题.png
初始学习率为:
无标题.png
函数的梯度为:
无标题.png
进行多次迭代:
无标题.png
我们发现基本上已经接近函数的极小点了:
Untitled.png
梯度下降算法的实现
下面我们将使用python实现一个简单的梯度下降算法。该场景是一个简单的线性回归示例:假设现在我们有一系列点,如下所示
(注意:实际的线性回归不需要以迭代的方式完成。这只是梯度下降算法的一个例子。)
无标题.png
我们将使用梯度下降来拟合这条直线!首先我们需要定义一个代价函数,这里我们选择均方误差代价函数
无标题.png
在本公告中,m 是数据集中的点数,1/2 是常数。这样在计算梯度时,二次乘法就会抵消这里的1/2。自然不会有多余的常数系数,方便后续的计算。并且不会影响结果。 y是数据集中每个点的真实y坐标值。 h 是我们的预测函数。根据每个输入的x,根据计算预测的y值,即
无标题.png
从代价函数中我们可以看出,代价函数中有两个变量,因此是一个多变量梯度下降问题。求解代价函数的梯度就是分别对两个变量进行微分。
无标题.png
阐明了成本函数和梯度,以及预测的函数形式。我们可以开始编写代码了。但在此之前,需要说明的是,为了方便代码的编写,我们将所有的公式转换为矩阵形式。在python中计算矩阵非常方便,代码也会变得非常简洁。为了转换为矩阵计算,我们观察到预测函数的形式
无标题.png
我们有两个变量。为了矩阵化这个公式,我们可以为每个点x 添加一个维度。该维度的值固定为1,并且该维度将乘以0。这有利于我们统一矩阵计算:
无标题.png
然后我们将成本函数和梯度转换为矩阵向量乘法:
Untitled.png
程序实现:
首先,我们需要定义数据集和学习率
将numpy 导入为np
# 点数据集的大小。
米=20
# 点x 坐标和虚拟值(x0, x1)。
X0=np.ones((m, 1))
X1=np.arange(1, m+1).reshape(m, 1)
X=np.hstack((X0, X1))
# 点y 坐标
y=np.array([
3、4、5、5、2、4、7、8、11、8、12、
11, 13, 13, 16, 17, 18, 17, 19, 21
]).重塑(米, 1)
# 学习率alpha。
alpha=0.01 接下来我们以矩阵向量的形式定义成本函数和成本函数的梯度
def error_function(theta, X, y):
"""误差函数J 定义。"""
diff=np.dot(X, ) - y
返回(1./2*m) * np.dot(np.transpose(diff), diff)
def 梯度函数(theta, X, y):
"""函数J 定义的梯度。"""
diff=np.dot(X, ) - y
return (1./m) * np.dot(np.transpose(X), diff)最后一部分是算法的核心部分,梯度下降迭代计算
defgradient_descent(X, y, alpha):
"""执行梯度下降。"""
=np.array([1, 1]).reshape(2, 1)
梯度=梯度函数(theta, X, y)
而不是np.all(np.absolute(gradient)=1e-5):
= - * 梯度
梯度=梯度函数(theta, X, y)
return theta 当梯度小于1e-5时,表示已经进入比较平滑的状态,类似于谷状态。这个时候继续迭代的效果就不会很大了,所以这个时候就可以退出循环了!
完整代码如下:
将numpy 导入为np
# 点数据集的大小。
米=20
# 点x 坐标和虚拟值(x0, x1)。
X0=np.ones((m, 1))
X1=np.arange(1, m+1).reshape(m, 1)
X=np.hstack((X0, X1))
# 点y 坐标
y=np.array([
3、4、5、5、2、4、7、8、11、8、12、
11, 13, 13, 16, 17, 18, 17, 19, 21
]).重塑(米, 1)
# 学习率alpha。
阿尔法=0.01
def error_function(theta, X, y):
"""误差函数J 定义。"""
diff=np.dot(X, ) - y
返回(1./2*m) * np.dot(np.transpose(diff), diff)
def 梯度函数(theta, X, y):
"""函数J 定义的梯度。"""
diff=np.dot(X, ) - y
返回(1./m) * np.dot(np.transpose(X), diff)
defgradient_descent(X, y, alpha):
"""执行梯度下降。"""
=np.array([1, 1]).reshape(2, 1)
梯度=梯度函数(theta, X, y)
而不是np.all(np.absolute(gradient)=1e-5):
= - * 梯度
梯度=梯度函数(theta, X, y)
返回
最优=梯度下降(X, y, alpha)
print("optimal:", 最佳)
print("error function:", error_function(optimal, X, y)[0,0]) 运行代码,计算结果如下:
无标题.png
拟合直线如下:
【深入解析:梯度与梯度下降算法原理及应用】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
梯度听起来很像数学课上的概念。
有8位网友表示赞同!
我学过一点点机器学习,感觉梯度下降算法听起来就很大牌。
有11位网友表示赞同!
这篇文章是不是讲怎么计算梯度的?
有12位网友表示赞同!
我觉得学习一下梯度下降算法对以后做数据科学很有用!
有7位网友表示赞同!
机器学习里好多重要的算法都是以“梯度”命名的,很神奇。
有18位网友表示赞同!
我之前听说过梯度这个词,感觉有点抽象的。
有5位网友表示赞同!
我想知道这篇博客讲哪个领域的梯度啊?软件开发、数学还是其他的?
有8位网友表示赞同!
我现在正在学习机器学习,这篇文章刚好可以补充一下我的知识!
有6位网友表示赞同!
梯度下降算法听起来很复杂,希望这篇文章能够通俗易懂地解释。
有9位网友表示赞同!
我一直觉得编程和数学这两个领域是密切相关的,这篇博客是不是要证明这一点?
有8位网友表示赞同!
机器学习越来越火了,学点相关知识很有必要。
有17位网友表示赞同!
我感觉这篇文章应该会解释梯度下降算法是如何工作的。
有8位网友表示赞同!
之前听朋友说梯度的应用很多,这篇文章可以让我了解一下吗?
有7位网友表示赞同!
我对机器学习的原理还是不太了解,希望这篇文章能帮我解答一些疑惑!
有14位网友表示赞同!
我是不是得先学习一下数学的基础知识才能理解这篇文章?
有16位网友表示赞同!
觉得学习梯度下降算法可以让我更深入地理解机器学习。
有14位网友表示赞同!
这篇文章内容很有深度,应该能够对学习机器学习有很大帮助!
有9位网友表示赞同!
期待作者能用通俗易懂的方式介绍梯度的概念和应用!
有16位网友表示赞同!
我觉得梯度是一个很重要的基础概念,理解它可以加深我对机器学习的认识。
有12位网友表示赞同!