mysql优化的几种方法_sgd优化算法

mysql优化的几种方法_sgd优化算法1.SGDBatchGradientDescent在每一轮的训练过程中,BatchGradientDescent算法用整个训练集的数据计算costfuction的梯度,并用该梯度对模型参数进行更新:Θ=Θ−α⋅▽ΘJ(Θ)\Theta=\Theta-\alpha\cdot\triangledown_\ThetaJ(\Theta)优点:costfuction若为凸函数,能

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

1. SGD

Batch Gradient Descent

在每一轮的训练过程中,Batch Gradient Descent算法用整个训练集的数据计算cost fuction的梯度,并用该梯度对模型参数进行更新:

Θ = Θ − α ⋅ ▽ Θ J ( Θ ) \Theta = \Theta -\alpha \cdot \triangledown_\Theta J(\Theta ) Θ=ΘαΘJ(Θ)

优点:

  • cost fuction若为凸函数,能够保证收敛到全局最优值;若为非凸函数,能够收敛到局部最优值

缺点:

  • 由于每轮迭代都需要在整个数据集上计算一次,所以批量梯度下降可能非常慢
  • 训练数较多时,需要较大内存
  • 批量梯度下降不允许在线更新模型,例如新增实例。

Stochastic Gradient Descent

和批梯度下降算法相反,Stochastic gradient descent 算法每读入一个数据,便立刻计算cost fuction的梯度来更新参数:
Θ = Θ − α ⋅ ▽ Θ J ( Θ ; x ( i ) , y ( i ) ) \Theta = \Theta -\alpha \cdot \triangledown_\Theta J(\Theta ;x^{(i)},y^{(i)}) Θ=ΘαΘJ(Θ;x(i),y(i))

优点:

  • 算法收敛速度快(在Batch Gradient Descent算法中, 每轮会计算很多相似样本的梯度, 这部分是冗余的)
  • 可以在线更新
  • 有几率跳出一个比较差的局部最优而收敛到一个更好的局部最优甚至是全局最优

缺点:

  • 容易收敛到局部最优,并且容易被困在鞍点

Mini-batch Gradient Descent

mini-batch Gradient Descent的方法是在上述两个方法中取折衷, 每次从所有训练数据中取一个子集(mini-batch) 用于计算梯度:
Θ = Θ − α ⋅ ▽ Θ J ( Θ ; x ( i : i + n ) , y ( i : i + n ) ) \Theta = \Theta -\alpha \cdot \triangledown_\Theta J(\Theta ;x^{(i:i+n)},y^{(i:i+n)}) Θ=ΘαΘJ(Θ;x(i:i+n),y(i:i+n))

Mini-batch Gradient Descent在每轮迭代中仅仅计算一个mini-batch的梯度,不仅计算效率高,而且收敛较为稳定。该方法是目前深度学训练中的主流方法

上述三个方法面临的主要挑战如下:

  • 选择适当的学习率 α \alpha α 较为困难。太小的学习率会导致收敛缓慢,而学习速度太块会造成较大波动,妨碍收敛。
  • 目前可采用的方法是在训练过程中调整学习率大小,例如模拟退火算法:预先定义一个迭代次数m,每执行完m次训练便减小学习率,或者当cost function的值低于一个阈值时减小学习率。然而迭代次数和阈值必须事先定义,因此无法适应数据集的特点。
  • 上述方法中, 每个参数的 learning rate 都是相同的,这种做法是不合理的:如果训练数据是稀疏的,并且不同特征的出现频率差异较大,那么比较合理的做法是对于出现频率低的特征设置较大的学习速率,对于出现频率较大的特征数据设置较小的学习速率。
  • 近期的的研究表明,深层神经网络之所以比较难训练,并不是因为容易进入local minimum。相反,由于网络结构非常复杂,在绝大多数情况下即使是 local minimum 也可以得到非常好的结果。而之所以难训练是因为学习过程容易陷入到马鞍面中,即在坡面上,一部分点是上升的,一部分点是下降的。而这种情况比较容易出现在平坦区域,在这种区域中,所有方向的梯度值都几乎是 0。

2. Momentum

SGD方法的一个缺点是其更新方向完全依赖于当前batch计算出的梯度,因而十分不稳定。Momentum算法借用了物理中的动量概念,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力:

v t = γ ⋅ v t − 1 + α ⋅ ▽ Θ J ( Θ ) v_{t} = \gamma \cdot v_{t-1} + \alpha \cdot \triangledown_\Theta J(\Theta ) vt=γvt1+αΘJ(Θ)
Θ = Θ − v t \Theta = \Theta-v_{t} Θ=Θvt

Momentum算法会观察历史梯度 v t − 1 v_{t-1} vt1,若当前梯度的方向与历史梯度一致(表明当前样本不太可能为异常点),则会增强这个方向的梯度,若当前梯度与历史梯方向不一致,则梯度会衰减。**一种形象的解释是:**我们把一个球推下山,球在下坡时积聚动量,在途中变得越来越快,γ可视为空气阻力,若球的方向发生变化,则动量会衰减。

3. Nesterov Momentum

在小球向下滚动的过程中,我们希望小球能够提前知道在哪些地方坡面会上升,这样在遇到上升坡面之前,小球就开始减速。这方法就是Nesterov Momentum,其在凸优化中有较强的理论保证收敛。并且,在实践中Nesterov Momentum也比单纯的 Momentum 的效果好:

v t = γ ⋅ v t − 1 + α ⋅ ▽ Θ J ( Θ − γ v t − 1 ) v_{t} = \gamma \cdot v_{t-1} + \alpha \cdot \triangledown_\Theta J(\Theta -\gamma v_{t-1}) vt=γvt1+αΘJ(Θγvt1)
Θ = Θ − v t \Theta = \Theta-v_{t} Θ=Θvt

其核心思想是:注意到 momentum 方法,如果只看 γ * v 项,那么当前的 θ经过 momentum 的作用会变成 θ-γ * v。因此可以把 θ-γ * v这个位置看做是当前优化的一个”展望”位置。所以,可以在 θ-γ * v求导, 而不是原始的θ。
这里写图片描述

4. Adagrad

上述方法中,对于每一个参数 θ i θ_i θi 的训练都使用了相同的学习率α。Adagrad算法能够在训练中自动的对learning rate进行调整,对于出现频率较低参数采用较大的α更新;相反,对于出现频率较高的参数采用较小的α更新。因此,Adagrad非常适合处理稀疏数据。

我们设 g t , i g_{t,i} gt,i为第t轮第i个参数的梯度,即 g t , i = ▽ Θ J ( Θ i ) g_{t,i}=\triangledown_\Theta J(\Theta_i) gt,i=ΘJ(Θi)。因此,SGD中参数更新的过程可写为:

Θ t + 1 , i = Θ t , i − α ⋅ g t , i \Theta_{t+1,i} =\Theta_{t,i}-\alpha \cdot g_{t,i} Θt+1,i=Θt,iαgt,i

Adagrad在每轮训练中对每个参数 θ i θ_i θi的学习率进行更新,参数更新公式如下:

Θ t + 1 , i = Θ t , i − α G t , i i + ϵ ⋅ g t , i \Theta_{t+1,i} =\Theta_{t,i}- \frac{\alpha}{\sqrt{G_{t,ii}+\epsilon }}\cdot g_{t,i} Θt+1,i=Θt,iGt,ii+ϵ
α
gt,i

其中, G t ∈ R d × d G_t\in \mathbb{R}^{d\times d} GtRd×d为对角矩阵,每个对角线位置 i , i i,i i,i为对应参数 θ i θ_i θi从第1轮到第t轮梯度的平方和。ϵ是平滑项,用于避免分母为0,一般取值1e−8。Adagrad的缺点是在训练的中后期,分母上梯度平方的累加将会越来越大,从而梯度趋近于0,使得训练提前结束。

5. RMSprop

RMSprop是Geoff Hinton提出的一种自适应学习率方法。Adagrad会累加之前所有的梯度平方,而RMSprop仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。
E [ g 2 ] t = 0.9 E [ g 2 ] t − 1 + 0.1 g t 2 E[g^2]_t=0.9E[g^2]_{t-1}+0.1g_t^2 E[g2]t=0.9E[g2]t1+0.1gt2
Θ t + 1 = Θ t − α E [ g 2 ] t + ϵ ⋅ g t \Theta_{t+1} =\Theta_{t}- \frac{\alpha}{\sqrt{E[g^2]_t+\epsilon }}\cdot g_{t} Θt+1=ΘtE[g2]t+ϵ
α
gt

6. Adam

Adam(Adaptive Moment Estimation)是另一种自适应学习率的方法。它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t=\beta_1m_{t-1}+(1-\beta_1)g_t mt=β1mt1+(1β1)gt
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2 vt=β2vt1+(1β2)gt2
m ^ t = m t 1 − β 1 t \hat{m}_t=\frac{m_t}{1-\beta_1^t} m^t=1β1tmt
v ^ t = v t 1 − β 2 t \hat{v}_t=\frac{v_t}{1-\beta_2^t} v^t=1β2tvt
Θ t + 1 = Θ t − α v ^ t + ϵ m ^ t \Theta_{t+1} =\Theta_{t}- \frac{\alpha}{\sqrt{\hat{v}_t }+\epsilon }\hat{m}_t Θt+1=Θtv^t
+ϵ
α
m^t

其中, m t m_t mt v t v_t vt分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望 E [ g t ] E[g_t] E[gt] E [ g t 2 ] E[g_t^2] E[gt2]的近似; m t ^ \hat{m_t} mt^ v t ^ \hat{v_t} vt^是对 m t m_t mt v t v_t vt的校正,这样可以近似为对期望的无偏估计。 Adam算法的提出者建议 β 1 \beta_1 β1 的默认值为0.9, β 2 \beta_2 β2的默认值为.999,$\epsilon $默认为 1 0 − 8 10^{-8} 108。 另外,在数据比较稀疏的时候,adaptive的方法能得到更好的效果,例如Adagrad,RMSprop, Adam 等。Adam 方法也会比 RMSprop方法收敛的结果要好一些, 所以在实际应用中 ,Adam为最常用的方法,可以比较快地得到一个预估结果。

最后两张动图从直观上展现了算法的优化过程。第一张图为不同算法在损失平面等高线上随时间的变化情况,第二张图为不同算法在鞍点处的行为比较。
这里写图片描述

这里写图片描述

7. 参考资料

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201107.html原文链接:https://javaforall.net

(0)
上一篇 2025年8月18日 下午5:43
下一篇 2025年8月18日 下午6:15


相关推荐

  • 等价类划分法设计测试用例例题_有效等价类测试用例

    等价类划分法设计测试用例例题_有效等价类测试用例等价类划分法设计测试用例

    2022年10月18日
    6
  • VUE控制台报错

    VUE控制台报错

    2020年11月9日
    198
  • es 其实是不是就是数据库_初识ES数据库「建议收藏」

    es 其实是不是就是数据库_初识ES数据库「建议收藏」一、什么是Elasticsearch1、概念以及特点1、Elasticsearch和MongoDB/Redis/Memcache一样,是非关系型数据库。是一个接近实时的搜索平台,从索引这个文档到这个文档能够被搜索到只有一个轻微的延迟,企业应用定位:采用RestfulAPI标准的可扩展和高可用的实时数据分析的全文搜索工具。2、可拓展:支持一主多从且扩容简易,只要cluster.name一致且在同一…

    2022年5月30日
    94
  • Python+Tensorflow+Opencv人脸识别(任意数量人脸)[通俗易懂]

    Python+Tensorflow+Opencv人脸识别(任意数量人脸)[通俗易懂]Python+Tensorflow+Opencv的人脸识别简单的人脸识别准备工作开始——先获取必要的人脸图像训练——分类吧识别大脸简单的人脸识别一直想做机器学习的东东,最近由于工作的调整,终于有开始接触的机会了,哈哈。本文主要代码是来源于“就是这个七昂”的博文,传送门在此:https://blog.csdn.net/qq_42633819/article/details/81191308。”就…

    2022年6月7日
    36
  • HTTP传输数据压缩

    HTTP传输数据压缩

    2022年3月4日
    76
  • Fleck说明文档翻译

    Fleck说明文档翻译Fleck nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp Fleck 是一个在 C 中的 WebSocket 服务器端的一个实现 分支

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号