【入门】深度学习优化算法

【入门】深度学习优化算法文章目录优化算法局部最优鞍点与海森矩阵海森矩阵梯度消失批梯度下降 Mini Batch 梯度下降 mini banch 大小选择动量梯度下降指数加权平均怎么解决鞍点问题逐参数适应学习率方法学习目标 知

大家好,欢迎来到IT知识分享网。

学习目标:
– 知道局部最优问题、鞍点与海森矩阵
– 说明批梯度下降算法的优化
– 说明三种类型的优化算法
– 知道学习率退火策略
– 知道参数初始化策略与输入归一化策略
– 应用完成梯度下降算法的优化
1、为什么深度学习需要进行优化?
虽然硬件水平的提升,让我们可以很方便的构建大型神经网络,但是构建神经网络的算法,还是需要我们自己进行一些优化。所以深度学习是需要优化。
2、优化好处
帮助我们能够提高模型的计算效率

在这里插入图片描述

反思一个问题:深度学习里面的“优化算法”,指的是什么?以下说明本人的看法,欢迎各位一起讨论!我们平时所说的优化,在算法领域,我们都知道一个nlogn级别的算法要优于n^2级别的算法,这里讨论的优化算法是降低算法的时间复杂度,就好比在排序领域,我们将两次for循环n方级别的算法优化成nlong级别的算法。在深度学习领域,个人体会到所说的优化算法是将测试集的准确率尽可能的提高,也就是在训练集和测试机都得到一个错误率都比较小又比较接近的一个模型效果,这样一来,需要我们去解决最小值问题、鞍点问题等等一系列在深度学习模型中会遇到的问题。

优化算法

  • 优化的目标在于降低训练损失,只关注最小化目标函数上的表现
    深度学习问题中,我们通常会预先定义一个损失函数。有了损失函数之后,我们就可以用优化算法将其最小化。
    优化遇到的挑战:
    • 局部最有
    • 梯度消失



局部最优

在这里插入图片描述
比如:
在这里插入图片描述
该函数图像为:
在这里插入图片描述
如果扩展到多维:
在这里插入图片描述
也就是说,当一个优化问题的数值在局部最优解附近时,由于目标函数有关解的梯度接近或者变为零,最终迭代求得的数值可能只令目标函数局部最小而并非全局最小化。






鞍点与海森矩阵

在这里插入图片描述
下面这个点Y,是鞍点。
在这里插入图片描述
那么达到这个鞍点之后,有什么性质呢?函数在一阶导数为零处(驻点)的海森矩阵为不定矩阵。
当我们有优化问题时,遇到的最大的问题就是鞍点问题。
当函数的海森矩阵在梯度为0的位置上:
– 特征值全为正:局部最小值
– 特征值全为负:局部最大值
– 特征值有正有负:鞍点







海森矩阵

梯度消失

批梯度下降

Mini-Batch 梯度下降

  • banch梯度下降算法
    • 对所有样本执行一次梯度下降,每一次迭代时间较长,训练过程很慢。
    • 相对来说噪声会低,而且总体的成本函数总是朝着最小化的方向去。(毕竟用的是全部样本)
  • 随机梯度下降
    • 对每一个训练样本执行一次梯度下降,训练速度快,但是会丢失向量化带来的计算加速
    • 有很多噪声,需要减少学习率。成本函数总体趋势向全局最小值靠近,但是永远不会收敛,一直在最小值附近徘徊。
      在这里插入图片描述
      因此,选择一个合适大小进行mini-banch梯度下降,可以实现快速学习,也应用了向量化带来的好处,且成本函数的下降处于前两者之间。

mini-banch大小选择

以下的规则可以在论文或者工业界实际操作中应用:

  • 如果训练样本比较小,比如m<=2000时,用banch
  • 如果训练样本比较大,用mini-banch。选择mini-banch大小为2的幂次方,典型为2^6

动量梯度下降

指数加权平均

怎么解决鞍点问题

通过使用动量梯度下降的方法,使下降的时候偏离鞍点的方向,即可解决鞍点问题。

逐参数适应学习率方法

  • 对不同的参数,每个参数更新的学习率会自适应本身参数特点进行梯度更新
  • Adagrad
  • RMSprop
  • Adam

Adagrad

RMSProp算法

Adam算法

学习率退火

如果设置一个固定的学习率α,那么可能会出现两个问题:

  • 如果设置学习率过大,那么可能会在最优点附近来回震荡
  • 如果设置的学习率过小,那么下降的会非常慢
    刚开始下降的快,后面下降的慢,是我们所希望的。那么应该怎么做呢?这里有三种最常用的学习率退火方法:
    1、随步数衰减
    2、指数衰减
    在这里插入图片描述
    3、1/t衰减
    在这里插入图片描述
    对于大型的数据模型,需要使用这些方式去自动进行学习率衰减,而一些小型网络可以直接手动进行调整。






参数初始化策略和归一化输入

初始化的值考虑到上一层神经元的个数和下一层神经元的个数。其中输入层和输出层不需要进行权重初始化。

init = tf.keras.initializers.glorot_normal() 












免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/134359.html

(0)
上一篇 2025-07-12 21:20
下一篇 2025-07-12 21:26

相关推荐

发表回复

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

关注微信