余弦退火:通过动态调整学习率增强深度学习

导 读

在快速发展的机器学习领域,特别是深度学习,训练算法的效率和有效性至关重要。学习率作为这些算法的一个关键因素,决定了梯度下降期间的步长。

而余弦退火作为用于优化学习率的一种新颖且日益流行的技术。本文将深入探讨了余弦退火的概念、其理论基础、实际应用以及它在深度学习领域提供的优势。

有需要的朋友关注公众号【小Z的科研日常】,获取更多内容

01、深度学习中学习率的概念

在理解余弦退火之前,有必要了解学习率在深度学习中的作用。学习率是一个超参数,控制神经网络在训练过程中调整权重的程度。

它影响网络收敛到损失函数的最小值——这是模型性能的关键因素。学习率太高可能会导致不稳定的行为,而学习率太低可能会导致训练过程极其缓慢或陷入局部最小值。

02、余弦退火:动态方法

余弦退火作为一种动态学习率调度方法出现。它按照余弦曲线调整学习率。该技术的灵感来自于余弦函数的数学特性,余弦函数以其平滑和周期性的特性而闻名。学习率从最大值开始,并在多个时期内沿着余弦曲线逐渐减小到最小值。

余弦退火是机器学习中用于在训练过程中调整学习率的一种方法。它基于余弦函数,其中学习率沿着余弦曲线逐渐减小。这种方法通常用于神经网络训练中,以微调学习率以获得更好的性能和收敛性。

基本思想是从较高的学习率开始,然后根据多个时期的余弦函数降低学习率。学习率表可以可视化为一条平滑曲线,从高开始并逐渐接近零。这种方法对于更有效地应对损失情况很有用,有可能在训练过程中产生更好的解决方案。

余弦退火对于避免损失景观中的局部极小值以及在训练的后期阶段微调模型特别有效。它是称为学习率调度的更广泛技术的一部分,这对于有效训练深度神经网络至关重要。

03、余弦退火总结分析

3.1理论基础

余弦退火的理论基础在于它能够驾驭深度神经网络复杂的高维损失场景。通过动态调整学习率,余弦退火在损失表面平坦时允许较大的步长,在表面陡峭时允许较小的步长。这种适应性有助于避免局部最小值和鞍点的陷阱——神经网络训练中的常见挑战。

3.2实际应用和好处

余弦退火在深度学习的各个领域(从图像识别到自然语言处理)都有广泛的应用。与恒定或基于步进的学习率计划相比,它的主要好处是实现更快的收敛。此外,余弦退火可以带来更好的泛化能力,降低过度拟合的风险。当模型的微调至关重要时,它在训练的后期阶段特别有效。

3.3与其他调度技术的比较分析

与步长衰减或指数衰减等其他学习率调度技术相比,余弦退火因其平滑过渡和适应性而脱颖而出。与步长衰减的突然变化不同,余弦函数确保学习率的平滑过渡,这对于维持训练过程的稳定性通常至关重要。

3.4挑战和考虑因素

尽管有其优点,但实施余弦退火需要仔细考虑初始学习率、最小学习率和轮数等因素。这些参数必须根据模型和数据集的特定需求进行调整。此外,余弦退火可能并不总是最适合每个问题或数据集,这凸显了上下文在选择正确学习率策略时的重要性。

04、代码示例

我将为您提供一个完整的 Python 示例,演示如何使用余弦退火在合成数据集上训练简单的神经网络模型。我们将包含用于生成合成数据集、定义神经网络模型、对学习率应用余弦退火、训练模型以及绘制结果的代码。

  1. 生成合成数据集:我们将创建一个适合分类任务的简单合成数据集。

  2. 定义神经网络模型:我们将使用 PyTorch 定义一个基本的神经网络。

  3. 实施余弦退火以进行学习率调度:我们将使用 PyTorchtorch.optim.lr_scheduler.CosineAnnealingLR来调整学习率。

  4. 训练模型:我们将使用余弦退火调度程序在合成数据集上训练模型。

  5. 绘制结果:我们将绘制学习率表和训练损失以观察余弦退火的效果。

在运行此代码之前,请确保您已安装必要的库:

pip install torch matplotlib sklearn

现在,我们继续代码实现:

import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from torch.utils.data import TensorDataset, DataLoader# 步骤 1:生成合成数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 转换为 PyTorch 张量
X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.long)
train_data = TensorDataset(X_train_tensor, y_train_tensor)
train_loader = DataLoader(train_data, batch_size=64, shuffle=True)# 第 2 步:定义神经网络模型
class SimpleNN(nn.Module):def __init__(self):super(SimpleNN, self).__init__()self.fc1 = nn.Linear(20, 64)self.relu = nn.ReLU()self.fc2 = nn.Linear(64, 2)def forward(self, x):x = self.fc1(x)x = self.relu(x)x = self.fc2(x)return xmodel = SimpleNN()# 第 3 步:余弦退火算法
optimizer = optim.Adam(model.parameters(), lr=0.01)
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10)# 第 4 步:训练模型
def train_model(model, train_loader, optimizer, scheduler, num_epochs=10):criterion = nn.CrossEntropyLoss()model.train()lr_list = []loss_list = []for epoch in range(num_epochs):for inputs, labels in train_loader:optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()scheduler.step()lr_list.append(optimizer.param_groups[0]['lr'])loss_list.append(loss.item())print(f'Epoch {epoch+1}/{num_epochs}, Loss: {loss.item():.4f}, LR: {optimizer.param_groups[0]["lr"]:.8f}')return lr_list, loss_listlr_list, loss_list = train_model(model, train_loader, optimizer, scheduler)# 第 5 步:绘制结果图
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(lr_list)
plt.title('Learning Rate Schedule')
plt.xlabel('Epoch')
plt.ylabel('Learning Rate')plt.subplot(1, 2, 2)
plt.plot(loss_list)
plt.title('Training Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()

该代码将在合成数据集上训练一个简单的神经网络,并使用余弦退火调整学习率。这些图将显示学习率如何随时期变化以及训练过程中损失如何减少。

Epoch 1/10, Loss: 0.3937, LR: 0.00975528
Epoch 2/10, Loss: 0.1473, LR: 0.00904508
Epoch 3/10, Loss: 0.2108, LR: 0.00793893
Epoch 4/10, Loss: 0.3277, LR: 0.00654508
Epoch 5/10, Loss: 0.3179, LR: 0.00500000
Epoch 6/10, Loss: 0.3957, LR: 0.00345492
Epoch 7/10, Loss: 0.2031, LR: 0.00206107
Epoch 8/10, Loss: 0.1712, LR: 0.00095492
Epoch 9/10, Loss: 0.1581, LR: 0.00024472
Epoch 10/10, Loss: 0.2143, LR: 0.00000000

05、结论

余弦退火代表了深度学习优化策略的重大进步。通过采用动态、适应性强的学习率调度方法,它提供了一种更高效、更有效的神经网络训练途径。

随着机器学习领域的不断发展,余弦退火等技术将在突破人工智能可能的界限方面发挥至关重要的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/479556.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SwiftUI 更自然地向自定义视图传递参数的“另类”方式

概览 在 SwiftUI 中,正是自定义视图让我们的 App 变得与众不同!然而,除了传统的视图接口定义方式以外,我们其实还可以有更“银杏化”的选择。 如上图所示:对于 SubView 子视图所需的参数我们一开始并没有操之过急&…

软件工具安装遇到bug、报错不知道怎么解决?看这里!

前言 本文举例了几个常见的软件工具使用问题,文末会提供一些我自己整理和使用的工具资料 。 "在追逐零 Bug 的路上,我们不断学习、改进,更加坚定自己的技术信念。让我们相信,每一个 Bug 都是我们成长的机会。" 一、VM…

【Java EE初阶十五】网络编程TCP/IP协议(二)

1. 关于TCP 1.1 TCP 的socket api tcp的socket api和U大片的socket api差异很大,但是和前面所讲的文件操作很密切的联系 下面主要讲解两个关键的类: 1、ServerSocket:给服务器使用的类,使用这个类来绑定端口号 2、Socket&#xf…

如何使用IP代理解决亚马逊账号IP关联问题?

亚马逊账号IP关联问题是指当同一个IP地址下有多个亚马逊账号进行活动时,亚马逊会将它们关联在一起,从而可能导致账号被封禁或限制。 为了避免这种情况,许多人选择使用IP代理。 IP代理为什么可以解决亚马逊IP关联问题? IP代理是…

15-55V输入自动升降压 光伏MPPT自动跟踪充电方案 大功率300瓦

1.MPPT原理--简介 MPPT,全称为Maximum Power Point Tracking,即最大功点跟踪,它是一种通过调节电气模块的工作状态,使光伏板能够输出更多电能的电气系统能够将太阳能电池板发出的直流电有效地贮存在蓄电池中,可有效地…

ITK 图像分割(一):阈值ThresholdImageFilter

效果: Video: 区域增加分割 1、itkThresholdImageFilter 该类的主要功能是通过设置低阈值、高阈值或介于高低阈值之间,则将图像值输出为用户指定的值。 如果图像值低于、高于或介于设置的阈值之间,该类就将图像值设置为用户指定的“外部”值…

《Solidity 简易速速上手小册》第3章:Solidity 语法基础(2024 最新版)

文章目录 3.1 变量和类型3.1.1 基础知识解析详细解析变量类型深入数据类型理解变量可见性 3.1.2 重点案例:创建一个简单的存储合约案例 Demo:编写一个简单的数字存储合约案例代码:SimpleStorage.sol在 Remix 中进行交互:拓展操作&…

Java使用Redis实现消息队列

近期刷Java面试题刷到了“如何使用Redis实现消息队列”,解答如下: 一般使用 list 结构作为队列, rpush 生产消息, lpop 消费消息。当 lpop 没有消息的时候,要适当sleep 一会再重试。若不使用sleep,则可以用…

解决npm淘宝镜像到期问题

1 背景 由于node安装插件是从国外服务器下载,如果没有“特殊手法”,就可能会遇到下载速度慢、或其它异常问题。 所以如果npm的服务器在中国就好了,于是我们乐于分享的淘宝团队干了这事。你可以用此只读的淘宝服务代替官方版本,且…

Vue源码系列讲解——生命周期篇【一】(综述)

1. 前言 在Vue中,每个Vue实例从被创建出来到最终被销毁都会经历一个过程,就像人一样,从出生到死亡。在这一过程里会发生许许多多的事,例如设置数据监听,编译模板,组件挂载等。在Vue中,把Vue实例…

国开电大计算机科学与技术网络技术与应用试题及答案,分享几个实用搜题和学习工具 #媒体#其他#知识分享

这些软件以其强大的搜索引擎和智能化的算法,为广大大学生提供了便捷、高效的解题方式。下面,让我们一起来了解几款备受大学生欢迎的搜题软件吧! 1.三羊搜题 这个是公众号 支持文字和语音查题!!! 学习通,知到,mooc等等平台的网课题目答案都…

【HarmonyOS应用开发】云开发(十九)

HarmonyOS云开发是DevEco Studio新推出的功能,可以让您在一个项目工程中,使用一种语言完成端侧和云侧功能的开发。 基于AppGallery Connect Serverless构建的云侧能力,让您无需构建和管理云端资源,随需使用,大大提高构…