优化理论及应用精解【25】

news/2024/10/8 10:18:15 标签: 优化, 高等数学, 优化算法

文章目录

  • 优化
    • 学习率调度
      • 1. 阶梯衰减(Step Decay)
      • 2. 余弦退火(Cosine Annealing)
      • 3. 多项式衰减(Polynomial Decay)
      • 4. 指数衰减(Exponential Decay)
      • 总结
    • 梯度弥散效应
  • 参考文献

优化

学习率调度

是深度学习中一个重要的技术,它根据训练的进程动态调整学习率,以提高模型训练的效果和稳定性。下面将分别详细介绍几种常见的学习率调度策略的定义、数学原理、公式、计算、例子和例题。

1. 阶梯衰减(Step Decay)

定义
阶梯衰减是一种常见的学习率调度策略,它每隔一定数量的周期(epoch)或迭代步骤就将学习率乘以一个较小的因子(衰减率),从而降低学习率。

数学原理
阶梯衰减基于这样的假设:在训练的早期阶段,较大的学习率有助于模型快速收敛;而在训练的后期阶段,较小的学习率有助于模型在最优解附近进行更精细的调整。

公式
decayed_learning_rate = learning_rate × decay_rate ( global_step decay_steps ) \text{decayed\_learning\_rate} = \text{learning\_rate} \times \text{decay\_rate}^{\left(\frac{\text{global\_step}}{\text{decay\_steps}}\right)} decayed_learning_rate=learning_rate×decay_rate(decay_stepsglobal_step)
其中,learning_rate是初始学习率,decay_rate是衰减率,global_step是当前迭代轮数,decay_steps是衰减步长(即每隔多少个周期或迭代步骤衰减一次)。

计算
假设初始学习率为0.1,衰减率为0.5,衰减步长为10,则在第10轮、第20轮、第30轮等时,学习率将分别衰减为0.05、0.025、0.0125等。

例子
在PyTorch中,可以使用torch.optim.lr_scheduler.StepLR来实现阶梯衰减。

例题
假设初始学习率为0.1,衰减率为0.5,衰减步长为10,请计算并列出前30轮的学习率。

2. 余弦退火(Cosine Annealing)

定义
余弦退火是一种学习率调度策略,它使学习率按照余弦函数的周期变化来衰减。这种方法在训练的早期阶段允许较大的学习率波动,有助于模型跳出局部最优解;而在训练的后期阶段,学习率逐渐减小,有助于模型收敛。

数学原理
余弦退火基于余弦函数的周期性和对称性,模拟了自然界中的退火过程。在训练的早期阶段,较大的学习率波动有助于模型探索参数空间;而在训练的后期阶段,较小的学习率有助于模型在最优解附近进行精细调整。

公式
lr = lr_min + 1 2 ( lr_max − lr_min ) ( 1 + cos ⁡ ( T cur T max π ) ) \text{lr} = \text{lr\_min} + \frac{1}{2} (\text{lr\_max} - \text{lr\_min}) \left(1 + \cos\left(\frac{T_{\text{cur}}}{T_{\text{max}}} \pi\right)\right) lr=lr_min+21(lr_maxlr_min)(1+cos(TmaxTcurπ))
其中,lr是当前学习率,lr_min是最小学习率,lr_max是最大学习率(通常是初始学习率),T_cur是当前周期(epoch)数,T_max是最大周期数。

计算
假设初始学习率为0.1,最小学习率为0.001,最大周期数为50,则可以使用上述公式计算每个周期的学习率。

例子
在PyTorch中,可以使用torch.optim.lr_scheduler.CosineAnnealingLR来实现余弦退火。

例题
假设初始学习率为0.1,最小学习率为0.001,最大周期数为50,请计算并列出前10个周期的学习率。

3. 多项式衰减(Polynomial Decay)

定义
多项式衰减是一种学习率调度策略,它使学习率按照多项式函数的形状逐渐减小。这种方法在训练的早期阶段允许较大的学习率,随着训练的进行逐渐减小学习率。

数学原理
多项式衰减基于多项式函数的性质,通过调整多项式的幂来控制学习率衰减的速度。较大的幂值会导致学习率快速衰减,而较小的幂值则会导致学习率缓慢衰减。

公式
lr = initial_lr × ( 1 − epoch max_epochs ) power \text{lr} = \text{initial\_lr} \times \left(1 - \frac{\text{epoch}}{\text{max\_epochs}}\right)^{\text{power}} lr=initial_lr×(1max_epochsepoch)power
其中,initial_lr是初始学习率,epoch是当前迭代轮数,max_epochs是最大迭代轮数,power是多项式的幂。

计算
假设初始学习率为0.1,最大迭代轮数为50,多项式的幂为2,则可以使用上述公式计算每个周期的学习率。

例子
在PyTorch中,可以使用torch.optim.lr_scheduler.LambdaLR配合自定义的lambda函数来实现多项式衰减。

例题
假设初始学习率为0.1,最大迭代轮数为50,多项式的幂为2,请计算并列出前10个周期的学习率。

4. 指数衰减(Exponential Decay)

定义
指数衰减是一种学习率调度策略,它使学习率按照指数函数的形状逐渐减小。这种方法在训练的早期阶段允许较大的学习率,随着训练的进行学习率迅速衰减。

数学原理
指数衰减基于指数函数的性质,通过调整衰减率来控制学习率衰减的速度。较大的衰减率会导致学习率快速衰减,而较小的衰减率则会导致学习率缓慢衰减。

公式
lr = initial_lr × decay_rate epoch \text{lr} = \text{initial\_lr} \times \text{decay\_rate}^{\text{epoch}} lr=initial_lr×decay_rateepoch
其中,initial_lr是初始学习率,epoch是当前迭代轮数,decay_rate是衰减率。

计算
假设初始学习率为0.1,衰减率为0.95,则可以使用上述公式计算每个周期的学习率。

例子
在PyTorch中,可以使用torch.optim.lr_scheduler.ExponentialLR来实现指数衰减。

例题
假设初始学习率为0.1,衰减率为0.95,请计算并列出前10个周期的学习率。

总结

以上介绍了四种常见的学习率调度策略:阶梯衰减、余弦退火、多项式衰减和指数衰减。每种策略都有其独特的数学原理、公式和应用场景。在实际应用中,可以根据模型的特点和训练的需求选择合适的学习率调度策略。

梯度弥散效应

也被称为梯度消失,是深度学习中一个常见的问题。它主要发生在反向传播过程中,当梯度在通过网络层传播时逐渐减小,最终导致梯度接近于零。这种现象会导致靠近输入层的隐藏层梯度非常小,参数更新变得非常缓慢,几乎就和初始状态一样随机分布。由于神经网络前几层的权重更新过慢或者没有更新,整个网络的学习性能会下降,无法达到训练的标准。

梯度弥散效应的原因主要有以下几点:

  1. 激活函数的“饱和”:在反向传播的过程中,需要计算激活函数的导数。当激活函数的输入值落入其饱和区时,其导数会变得非常小。例如,sigmoid函数在输入值非常大或非常小时,其导数会趋近于零,这会导致梯度弥散。
  2. 网络层数过深:在深度网络中,梯度需要通过多层网络进行反向传播。由于每层网络都会乘以一个小于1的梯度值(在梯度弥散的情况下),多层相乘后梯度值会急剧减小,导致梯度弥散问题更加严重。

梯度弥散效应的数学原理可以通过链式法则来解释。在反向传播过程中,梯度是通过链式法则逐层传递的。如果每一层的梯度都小于1,那么多层相乘后梯度值会迅速减小到接近于零。这种现象在数学上表现为梯度连乘的结果趋于零。

为了解决梯度弥散效应,研究者们提出了多种方法,包括但不限于:

  1. 使用非饱和激活函数:如ReLU(Rectified Linear Unit)及其变种,这些激活函数在输入为正时导数恒为1,有助于缓解梯度弥散问题。
  2. 梯度裁剪:在反向传播过程中,对梯度值进行裁剪,使其保持在一个合理的范围内,避免梯度过大或过小。
  3. 批归一化(Batch Normalization):通过对每一层的输入进行归一化处理,使得输入值保持在一个稳定的分布范围内,从而缓解梯度弥散问题。
  4. 残差网络(Residual Networks):通过引入残差连接,使得网络能够学习到恒等映射,有助于缓解深层网络中的梯度弥散问题。

总的来说,梯度弥散效应是深度学习中一个需要重视的问题。通过选择合适的激活函数、应用梯度裁剪和批归一化等技术手段,可以有效地缓解梯度弥散问题,提高深度神经网络的训练效果。

参考文献

  1. 文心一言

http://www.niftyadmin.cn/n/5694005.html

相关文章

R知识图谱1—tidyverse玩转数据处理120题

以下是本人依据张老师提供的tidyverse题库自行刷题后的tidyverse Rmd文件,部分解法参考张老师提示,部分解法我本人灵感提供 数据下载来源https://github.com/zhjx19/tidyverse120/tree/main/data 参考https://github.com/MaybeBio/R_cheatsheet/tree/mai…

【VUE】Vue2与Vue3两者Diff流程的区别

Vue2和Vue3在Diff算法的实现上有一些显著的区别,主要表现在以下几个方面: 源码架构:Vue2的Diff算法是在虚拟DOM模块中实现的,需与渲染模块和事件模块耦合在一起。而Vue3则将Diff算法单独抽离为一个模块,便于维护和重用…

selenium的webdriver常用方法和属性介绍(2)

selenium的webdriver介绍 从selenium导入webdriver模块,在pycharm中跳转webdriver模块的__init__.py文件,内容如图所示:从selenium包的子目录中导入了很多模块并做了重命名,用于支持如下 Chrome/Edge/Ie/Firefox/Safari浏览器。 使…

请解释一下数据库的分区和分片?请解释一下数据库的日志和日志的重要性?

请解释一下数据库的分区和分片? 数据库的分区和分片是两种用于提高数据库性能和可扩展性的技术,它们各自具有不同的特点和应用场景。以下是对这两种技术的详细解释: 一、数据库分区 定义: 数据库分区是将一个大型的数据库表或索…

QT-数据类型容器类窗口控件模态框

1. Qt 数据类型 1.1 数字类型 整型: qint8、qint16、qint32、qint64 无符号整型: quint8、quint16、quint32、quint64 qintptr: 指针类型 根据系统类型不同而不同,32位系统为qint32、64位系统为qint64 (Linux) 浮点…

IL2CPP和Mono的区别

Mono 是一种开源的跨平台 .NET 框架实现,能够执行 C# 代码。Unity 使用 Mono 来处理 C# 脚本,并通过 JIT(Just-In-Time)即时编译器将托管代码转换为本地机器代码,随后在目标平台上执行 IL2CPP 代表 Intermediate Lang…

【STM32 Blue Pill编程实例】-OLED显示DHT22传感器数据

OLED显示DHT22传感器数据 文章目录 OLED显示DHT22传感器数据1、DHT22介绍2、硬件准备与接线3、模块配置3.1 定时器配置3.2 DHT22引脚配置3.3 OLED配置4、代码实现在本文中,我们将介绍如何将 DHT22 温度和湿度传感器与 STM32 Blue Pill 开发板连接,并使用 HAL 库在 STM32CubeI…

SQL server数据压缩

1. 数据压缩对系统的影响 使用数据压缩主要有以下几方面的影响: 1.1 存储空间减少 行压缩(ROW Compression):它通过减少存储数据的冗余空间,优化定长数据类型的存储效率。行压缩适用于大部分表,对减少磁盘…