关键词:
文章目录
简介
简单来说,梯度下降就像是从山顶出发,到达最低的谷底,但下山过程中可能误入歧途,走入不是最低的谷底,即局部最优。
『梯度』是一个向量,表示函数在该点处的方向导数沿着该方向取得最大值,也就是说沿着该向量方向变化率最大,是最陡的。
梯度的大小: ∣ ∇ f ∣ = f x ( x , y ) ′ 2 + f y ( x , y ) ′ 2 |\\nabla f|=\\sqrtf_x(x,y)'^2+f_y(x,y)'^2 ∣∇f∣=fx(x,y)′2+fy(x,y)′2,其中 f x ( x , y ) ′ f_x(x,y)' fx(x,y)′是在点 ( x , y ) 处 (x,y)处 (x,y)处对 x x x的偏导数,其中 f y ( x , y ) ′ f_y(x,y)' fy(x,y)′是在点 ( x , y ) 处 (x,y)处 (x,y)处对 y y y的偏导数。偏导数可以理解为在点(x,y)处的切线对x或y的斜率。
上图摘自网络。
那所谓的梯度下降法,可以理解为沿着梯度最大的反方向下山的过程。比如三维特征中,其平面图可以像是山峰和谷底,那我们就是要从山峰出发,从最陡(梯度最大)的方向进行下山,从而到达谷底取最小值,但往往可能陷入其它谷底,只取到了极小值,可以修改步长(学习率)。
Θ
1
=
Θ
0
−
α
∇
J
(
Θ
)
\\Theta^1=\\Theta^0-\\alpha\\nabla J(\\Theta)
Θ1=Θ0−α∇J(Θ)
其中
J
J
J是关于
Θ
\\Theta
Θ的一个函数,设当前点位
Θ
0
\\Theta^0
Θ0,从这个点走一段距离的步长(也就是学习率
α
\\alpha
α),然后到达
Θ
1
\\Theta^1
Θ1这个点,以此迭代,最终目标是要走到
J
J
J的最小值点,也就是谷底。
梯度下降算法中有几种方式来调节权重向量,通过为每个权重计算一个梯度,从而更新权值,使目标函数尽可能最小化。其差别在于样本的使用方式不同,包括全梯度下降算法、随机梯度下降算法、小批量梯度下降算法、随机平均梯度下降算法等,一般常用的还是随机梯度下降。
全梯度下降
全梯度下降算法(Full Gradient descent,FG)
所谓『全』的意思就是考虑全部的训练集样本,对其求和后取平均值。每次更新时在整个数据集上计算全部梯度,计算量较大,所以梯度下降的速度较慢。
此外,批梯度下降过程中不能同步更新模型,即在运行的过程中,不能增加新的样本数据。是在整个训练数据集上计算损失函数关于参数 θ \\theta θ的梯度。
θ = θ − η ⋅ ∇ θ J ( θ ) \\theta=\\theta-\\eta·\\nabla_\\theta J(\\theta) θ=θ−η⋅∇θJ(θ)
随机梯度下降
随机梯度下降算法(Stochastic Gradient descent,SG)
FG计算了全部样本,导致速度很慢且容易陷入局部最优解,故提出了SG。所谓『随机』就是每次随机带入一个样本进行计算即可,不再是全体样本误差。
使用单个样本误差更新权重,然后再随机下一个样本重复此过程,直到损失函数值停止下降,为此速度大幅提高,但是也由于每次只使用一个样本迭代,若随机到噪声样本则容易陷入局部最优解。
θ
=
θ
−
η
⋅
∇
θ
J
(
θ
;
x
(
i
)
;
y
(
i
)
)
\\theta=\\theta-\\eta·\\nabla_\\theta J(\\theta;x^(i);y^(i))
θ=θ−η⋅∇θJ(θ;x(i);y(i))
其中,
x
(
i
)
x_(i)
x(i)是训练样本
i
i
i的特征值,
y
(
i
)
y_(i)
y(i)是训练样本
i
i
i的标签值。
小批量梯度下降
小批量梯度下降算法(Mini-batch Gradient descent)
所谓『小批量』就是全部与一个的折中方案,兼顾了FG和SG两种方法的优点。即每次从训练样本集上随机抽取一个小样本集,在该小样本集上用FG来迭代更新权重。
抽出的小样本集所含样本点的个数(batch.size)通常设为2的幂次方,为了方便GPU加速处理。如果batch.size=1,就是SG;若batch.size=n就是FG。
θ = θ − η ⋅ ∇ θ J ( θ ; x ( i : i + n ) ; y ( i : i + n ) ) \\theta=\\theta-\\eta·\\nabla_\\theta J(\\theta;x^(i:i+n);y^(i:i+n)) θ=θ−η⋅∇θJ(θ;x(i:i+n);y(i:i+n))
(
插播反爬信息)博主CSDN地址:https://wzlodq.blog.csdn.net/
随机平均梯度下降
随机平均梯度下降算法 (Stochastic Average Gradient descent,SAG)
所谓『随机平均』是在内存中为每一个样本都维护了一个旧的梯度,随机选择第
i
i
i个样本来更新此样本的梯度,其他样本的梯度保持不变,求得所有梯度的平均值来更新参数。
如此一来,每一轮更新仅需计算随机的一个样本梯度,同SG一样,但是收敛速度快得多,对大数据训练而言更有效。
模拟退火
为了更好理解梯度下降,引入实际应用背景:
物理的退火降温的过程:
给一个处于高温度的物体降温,使物体内能降到最低。
一般的思维是越快越好,尽快的温度迅速地降低。但实际上,过快地降温使得物体来不及有序地收缩,难以形成结晶,而结晶态才是物体真正内能降到最低的形态。
正确的做法,是徐徐降温,也就是退火,才能使得物体的每一个粒子都有足够的时间找到自己的最佳位置并紧密有序地排列。开始温度高的时候,粒子活跃地运动并逐渐找到一个合适的状态。在这过程中温度也会越降越低,温度低下来了,那么粒子也渐渐稳定下来,相较于以前不那么活跃了。这时候就可以慢慢形成最终稳定的结晶态了。
也就是说,不同学习率(步长)可能导致完全不同的结果。
若过大,则可能来回震荡,无法到达最优点;
若过小,则可能陷入局部最优;
合适的学习率才能取到全局最优。一般设置为0.1左右。
import numpy as np
import matplotlib.pyplot as plt
def func(x): # 函数定义
return x ** 4 + 2 * x ** 3 - 3 * x ** 2 - 3 * x
def grad_func(x): # 求导
return 4 * x ** 3 + 6 * x ** 2 - 6 * x - 3
if __name__ == "__main__":
x = np.linspace(-3, 1.9) # 定义域[-3,1.9]
fx = func(x)
plt.plot(x, fx, '--') # 虚线画出曲线
eta = 0.08 # 学习率
x0 = 1.8 # 初始值(山顶)
record_x = []
record_y = []
for i in range(50):
y0 = func(x0)
record_x.append(x0)
record_y.append(y0)
x0 -= eta * grad_func(x0) # 梯度下降
# 可视化
plt.title("学习率=0.08")
plt.scatter(record_x, record_y, marker='x', color="red")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()
在sklearn库中,封装了SGD*
随机梯度下降算法的应用,如分类SGDClassifier()
、回归SGDRegressor()
等(☆▽☆)。
原创不易,请勿转载(
本不富裕的访问量雪上加霜)
博主首页:https://wzlodq.blog.csdn.net/
来都来了,不评论两句吗👀
如果文章对你有帮助,记得一键三连❤
浅谈梯度下降与模拟退火算法(代码片段)
文章目录简介全梯度下降随机梯度下降小批量梯度下降随机平均梯度下降模拟退火前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。简介简单来说,梯... 查看详情
浅谈模拟退火(代码片段)
原谅我将模拟退火放到骚操作的范畴,比较玄学调参,玄学AC。。。。。。(我要当欧皇TAT)模拟退火算法模拟退火是一种随机化算法,用于求函数的极值qwq比如给出一个问题,我们要求最优解的值,但是可能的方案数量极大,直接搜... 查看详情
梯度下降&模拟退火
吴恩达老师的机器学习公开课的第二课主要讲了随机梯度下降算法,我记录了一些要点并写了一点自己的想法于此。 以上便是第二节课的核心内容。另外的内容还有随机梯度下降法。思想是很平凡的,当数据较多的时候... 查看详情
浅谈欧洲算法——模拟退火(代码片段)
初听说退火这个名词感觉就很(zhuang)帅(A__CDEFG...)直到学了退火之后,我才发现:退火不只是帅,而且非常万能甚至比D(大)F(法)S(师)还要万能简直就是骗(de)分神器啊简介作为一个计算机算法,它竟然在百度上有物理词... 查看详情
数学建模系列:模拟退火算法(代码片段)
...优解;如果(X)连续,且函数(f(x))是一个凹函数,那么通过梯度下降,三分法等来求得最小值;但是如果函数连续且非凹,就有可能只是求得局部最优解的情况;然后第三种也是最常见的情况,那么通过模拟退火算法就能够高效准... 查看详情
浅谈模拟退火(代码片段)
...火,与各位巨佬来分享一下自己的见解,不足之处望多指教浅谈模拟退火Part1:何为模拟退火首先,模拟退火=模拟退火,它本质上是对冶金学中退火过程的一种模拟.在某些问题中,我们可以把问题抽象成一个函数.这个函数的最大/最小值... 查看详情
深度学习的损失函数优化方法(代码片段)
目录1梯度下降算法2反向传播算法(BP算法)2.1前向传播与反向传播2.2链式法则2.3反向传播算法3梯度下降优化方法3.1动量算法(Momentum)3.2指数加权平均3.3动量梯度下降算法3.4AdaGrad3.5RMSprop3.6Adam4学习率退火4.1分段... 查看详情
数学建模:模拟退火算法(sa)(代码片段)
...模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。模拟退火算法是通过赋予搜索过程一种时变且... 查看详情
模拟退火算法(代码片段)
...能量函数。大致过程如下 初始高温=>温度缓慢下降=>终止在低温(这时能量函数达到最小,目标函数最小) 在热力学中的退火过程大致是变温物体缓慢降温而达到分子之间能量最低的状态。设热... 查看详情
浅谈模拟退火(代码片段)
模拟退火,很有力的一个偏分武器。对于一类搜索,或者是有明确答案空间的题目,且不会写正解,爆搜过不去,剪枝减不了的时候,我们可以考虑用模拟退火偏分。模拟退火模拟的是一个物理过程,即一个物体由高温逐步降温... 查看详情
sparkmlib:梯度下降算法实现(代码片段)
声明:本文参考《 大数据:Sparkmlib(三)GradientDescent梯度下降算法之Spark实现》1.什么是梯度下降?梯度下降法(英语:Gradientdescent)是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找到一个函数的局部极小... 查看详情
备战数学建模45-模拟退火算法sa(攻坚站9)(代码片段)
...退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。目录一、模拟退火算法1.1、模拟退火算法基... 查看详情
优化算法—梯度下降(代码片段)
转自:https://www.cnblogs.com/shixiangwan/p/7532858.html梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法。本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法... 查看详情
模拟退火算法(sa)简介及python实现(代码片段)
...。 模拟退火算法在某一初温下,伴随温数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解。即在局部最优解的空间内能概率性地跳出并最终趋于全局最优。二、模拟退火算法一、算法的主... 查看详情
梯度下降算法(gradientdescent)(代码片段)
近期在搞论文,须要用梯度下降算法求解,所以又一次整理分享在这里。主要包含梯度介绍、公式求导、学习速率选择、代码实现。梯度下降的性质:1.求得的解和选取的初始点有关2.能够保证找到局部最优解,由于梯... 查看详情
python使用模拟退火(simulatedannealing)算法构建优化器获取机器学习模型最优超参数组合(hyperparameter)实战+代码
Python使用模拟退火(SimulatedAnnealing)算法构建优化器获取机器学习模型最优超参数组合(hyperparameter)实战+代码目录 查看详情
模拟退火算法(代码片段)
一、什么是模拟退火算法1、爬山算法在了解模拟退火算法之前,先来看一下爬山算法:爬山算法是一种贪心算法,该算法每次从当前的解空间中选取一个解作为最优解,直到达到一个局部最优解。假设函数f(x)的图像如下图:现... 查看详情
matlab应用实战系列(五十三)-模拟退火算法(附源码)
模拟退火算法模拟退火算法在处理全局优化、离散变量优化等困难问题中,具有传统优化算法无可比拟的优势。这里描述模拟退火算法的原理及其基本框架结构,给出用模拟退火算法求解TSP问题的具体实现方法以下是我为大家准... 查看详情