活动介绍

深度神经网络训练中的快速优化器与学习率规划

立即解锁
发布时间: 2025-09-03 00:41:42 阅读量: 8 订阅数: 45 AIGC
# 深度神经网络训练中的快速优化器与学习率规划 ## 1 引言 在深度神经网络的训练过程中,当网络规模非常大时,训练速度可能会变得极其缓慢。为了加速训练并获得更好的解决方案,我们可以采用多种方法,如良好的连接权重初始化策略、合适的激活函数、批量归一化以及复用预训练网络的部分内容。此外,使用比普通梯度下降优化器更快的优化器,也能显著提升训练速度。接下来,我们将介绍一些常见的优化器。 ## 2 快速优化器介绍 ### 2.1 动量优化(Momentum Optimization) 动量优化的灵感来源于保龄球在轻微倾斜的光滑表面上滚动的过程。保龄球起初滚动缓慢,但很快会加速,直至达到最大速度。而传统的梯度下降则是沿着斜坡缓慢而规律地前进,到达终点所需的时间更长。 传统梯度下降更新权重的公式为:$\theta \leftarrow \theta - \eta\nabla_{\theta}J(\theta)$,它没有考虑之前的梯度信息。如果局部梯度非常小,它的前进速度就会很慢。 动量优化则非常关注之前的梯度:在每次迭代中,它将局部梯度从惯性向量 $m$ 中减去(乘以学习率 $\eta$),然后通过简单地加上这个惯性向量来更新权重 $\theta$。公式如下: 1. $m \leftarrow \beta m - \eta\nabla_{\theta}J(\theta)$ 2. $\theta \leftarrow \theta + m$ 为了模拟摩擦并防止速度过快,该算法引入了一个新的超参数 $\beta$,称为惯性(momentum),其值应介于 0(高摩擦)和 1(无摩擦)之间,常用值为 0.9。 如果梯度保持不变,最终速度(即权重更新的最大幅度)等于该梯度乘以学习率 $\eta$ 再乘以 $1/(1 - \beta)$。例如,当 $\beta = 0.9$ 时,最终速度是梯度乘以学习率的 10 倍,这意味着动量优化比梯度下降快达 10 倍。它能够更快地跳出虚假平坦区域,尤其在输入尺度差异较大的情况下,函数的代价看起来像一个细长的碗,梯度下降在陡峭斜坡上下降较快,但在山谷中下降则需要很长时间,而动量优化则会越来越快地向山谷底部前进,直至到达最优解。 不过,由于惯性的存在,优化器有时可能会走过头,然后返回,再走过头,多次振荡后才会稳定在最小值处。因此,在系统中设置一定的摩擦是有益的,它可以避免这些振荡,加速收敛。 在 Keras 中实现动量优化非常简单,只需使用 SGD 优化器并设置其 momentum 超参数即可: ```python optimizer = keras.optimizers.SGD(lr=0.001, momentum=0.9) ``` 动量优化的缺点是增加了一个需要调整的超参数,但在实践中,0.9 这个值通常效果较好,几乎总能比梯度下降更快。 ### 2.2 涅斯捷罗夫加速梯度(Nesterov Accelerated Gradient,NAG) 涅斯捷罗夫加速梯度是动量优化的一个小变体,通常比原始版本更快。它不是在当前位置 $\theta$ 处测量代价函数的梯度,而是在惯性方向上稍微向前的位置 $\theta + \beta m$ 处测量梯度。公式如下: 1. $m \leftarrow \beta m - \eta\nabla_{\theta + \beta m}J(\theta)$ 2. $\theta \leftarrow \theta + m$ 由于惯性向量通常指向最优解的方向,因此在这个方向上稍微向前测量梯度会更准确。随着时间的推移,这些小的改进会累积起来,使得 NAG 比普通的动量优化快得多。此外,当惯性推动权重穿过山谷时,普通动量优化的梯度会继续推动穿过山谷,而 NAG 的梯度会将权重推回山谷底部,从而减少振荡,更快地收敛。 在 Keras 中使用 NAG 很简单,只需在创建 SGD 优化器时指定 `nesterov=True`: ```python optimizer = keras.optimizers.SGD(lr=0.001, momentum=0.9, nesterov=True) ``` ### 2.3 AdaGrad 考虑细长碗的问题,梯度下降首先会快速沿着最陡峭的斜坡下降,但这个方向并不直接指向全局最优解,然后它会缓慢地向山谷底部前进。AdaGrad 算法通过减小最陡峭维度上的梯度向量来解决这个问题。 算法步骤如下: 1. $s \leftarrow s + \nabla_{\theta}J(\theta) \otimes \nabla_{\theta}J(\theta)$ 2. $\theta \leftarrow \theta - \frac{\eta}{\sqrt{s + \epsilon}} \odot \nabla_{\theta}J(\theta)$ 第一步将梯度的平方累积到向量 $s$ 中,即对于向量 $s$ 的每个元素 $s_i$,$s_i \leftarrow s_i + (\frac{\partial J(\theta)}{\partial \theta_i})^2$。如果代价函数在第 $i$ 个维度上有陡峭的斜坡,那么 $s_i$ 在每次迭代中都会增加。 第二步与梯度下降类似,但梯度向量会被 $\sqrt{s + \epsilon}$ 减小。$\epsilon$ 是一个平滑项,用于避免除以零,通常取值为 $10^{-10}$。 AdaGrad 算法逐渐降低学习率,并且在陡峭维度上的降低速度比平缓维度上更快,因此具有自适应学习率的特点。这使得更新结果更直接地指向全局最优解,并且对学习率超参数 $\eta$ 的调整要求较低。 然而,AdaGrad 在训练神经网络时往往过早停止,因为学习率下降得太快,导致算法在到达全局最优解之前就完全停止。因此,虽然 Keras 提供了 Adagrad 优化器,但不建议用于训练深度神经网络,不过它对于一些简单任务,如线性回归,仍然可能有效。 ### 2.4 RMSProp AdaGrad 的缺点是收敛速度过快,最终无法收敛到全局最优解。RMSProp 算法通过仅累积最近迭代的梯度(而不是从训练开始的所有梯度)来解决这个问题。它在第一步使用指数移动平均: 1. $s \leftarrow \beta s + (1 - \beta)\nabla_{\theta}J(\theta) \otimes \nabla_{\theta}J(\theta)$ 2. $\theta \leftarrow \theta - \frac{\eta}{\sqrt{s + \epsilon}} \odot \nabla_{\theta}J(\theta)$ 衰减率 $\beta$ 通常固定为 0.9,这是一个新的超参数,但默认值通常适用,很少需要调整。 在 Keras 中使用 RMSProp 优化器的代码如下: ```python optimizer = keras.optimizers.RMSprop(lr=0.001, rho=0.9) ``` 除了非常简单的问题,RMSProp 优化器的性能几乎总是优于 AdaGrad。在 Adam 优化器出现之前,它是许多研究人员首选的优化算法。 ### 2.5 Adam 和 Nadam 优化 Adam(Adaptive Moment Estimation)结合了动量优化和 RMSProp 的思想。它像动量优化一样维护梯度的指数移动平均,像 RMSProp 一样维护过去梯度平方的指数移动平均。算法步骤如下: 1. $m \leftarrow \beta_1 m + (1 - \beta_1)\nabla_{\theta}J(\theta)$ 2. $s \leftarrow \beta_2 s + (1 - \beta_2)\nabla_{\theta}J(\theta) \ot
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

张_伟_杰

人工智能专家
人工智能和大数据领域有超过10年的工作经验,拥有深厚的技术功底,曾先后就职于多家知名科技公司。职业生涯中,曾担任人工智能工程师和数据科学家,负责开发和优化各种人工智能和大数据应用。在人工智能算法和技术,包括机器学习、深度学习、自然语言处理等领域有一定的研究
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看