一起学Hugging Face Transformers(14)- “自定义训练循环”问题解答

文章目录

  • 前言
  • 问题一:可以详解下面这两段代码吗?
    • 1. 训练步骤的计算
    • 2. 学习率调度器的定义
    • 3. 作用总结
    • 4. 示例详细解释
  • 问题二:学习率是什么
      • 学习率的重要性
      • 例子
      • 学习率调度器
      • 学习率调度策略
      • 示例代码
  • 问题三:什么是 num_warmup_steps 预热步数呢
      • 预热步数的作用
      • 如何设置预热步数
  • 问题四:总训练步数num_training_steps 应该怎么确定呢
    • 1. 数据集大小和批次大小
    • 2. 训练轮数(Epochs)
    • 3. 学习率调度器的策略
    • 示例计算
    • 4. 小结
  • 问题六:训练轮数是怎么确定的呢
    • 1. 训练收敛性
    • 2. 训练时间和计算资源
    • 3. 训练效果监控
    • 4. 经验和实验
    • 5. 示例
  • 问题七:训练轮数在哪里配置


前言

前一篇文章 自定义训练循环 收到不少提问,在这里统一解答一下。

问题一:可以详解下面这两段代码吗?

num_training_steps = num_epochs * len(train_dataloader)
lr_scheduler = get_scheduler(
    name="linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=num_training_steps
)

1. 训练步骤的计算

num_training_steps = num_epochs * len(train_dataloader)
  • num_epochs:训练的轮数(epoch),表示整个训练数据集将被迭代多少次。
  • len(train_dataloader):训练数据加载器中的批次数(batch),表示一个epoch中有多少个批次。

这段代码的目的是计算训练的总步骤数(total training steps),即训练过程中将执行的前向和反向传播步骤的总次数。这是通过将每个epoch中的批次数与epoch数相乘得到的。这个值在设置学习率调度器时很重要。

2. 学习率调度器的定义

lr_scheduler = get_scheduler(
    name="linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=num_training_steps
)
  • get_scheduler:这是一个用于获取学习率调度器的函数。学习率调度器(Learning Rate Scheduler)在训练过程中调整学习率,以便更好地控制模型的优化过程。
  • name=“linear”:指定调度器的类型为线性调度器(linear scheduler),表示学习率将在训练期间线性地从初始值下降到最终值。
  • optimizer=optimizer:指定优化器,调度器将与这个优化器一起工作。
  • num_warmup_steps=0:指定学习率预热步骤(warmup steps)的数量。在预热阶段,学习率从0逐渐增加到初始值。这里设置为0,表示没有预热阶段。
  • num_training_steps=num_training_steps:指定训练的总步骤数,即之前计算的num_training_steps。这告诉调度器整个训练过程中有多少步,这样它就能在训练过程中正确地调整学习率。

3. 作用总结

  • 计算总训练步骤数:这是为了让学习率调度器知道整个训练过程的总步数,以便合理地调整学习率。
  • 定义学习率调度器:学习率调度器根据总训练步骤数和指定的调度策略(如线性下降)来调整优化器的学习率,从而改善模型的训练效果。

4. 示例详细解释

假设我们有一个数据集,通过train_dataloader可以得到每个epoch中的批次数是500,我们打算训练3个epoch。则总的训练步骤数为:

num_epochs = 3
len(train_dataloader) = 500

num_training_steps = num_epochs * len(train_dataloader)
num_training_steps = 3 * 500 = 1500

然后我们定义一个线性学习率调度器,这个调度器将在训练的1500步内从初始学习率线性下降到最终学习率。

lr_scheduler = get_scheduler(
    name="linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=1500
)

这样,在训练过程中,调度器将根据当前训练步数调整学习率,从而可能提高训练稳定性和模型的最终性能。

问题二:学习率是什么

学习率(Learning Rate)是深度学习模型训练中的一个超参数,它决定了在每次迭代更新模型参数时步长的大小。具体来说,学习率控制了每次参数更新的幅度,从而影响模型的收敛速度和训练稳定性。

学习率的重要性

  • 步长大小

    • 较高的学习率:如果学习率过高,模型参数更新的步长过大,可能会导致训练过程不稳定,甚至无法收敛,模型的损失函数会在高值和低值之间大幅波动。
    • 较低的学习率:如果学习率过低,模型参数更新的步长过小,训练过程会非常缓慢,可能需要更多的迭代次数才能达到收敛。此外,过低的学习率可能会使模型陷入局部最优,无法找到全局最优解。
  • 收敛速度和稳定性

    • 一个适当的学习率可以加速训练过程,使模型更快达到较好的性能,同时保持训练过程的稳定性,避免震荡或发散。

例子

假设你在训练一个神经网络,损失函数(Loss Function)用于衡量模型预测值与真实值之间的差距。学习率决定了每次迭代中参数调整的幅度。

  • 公式
    • 更新后的参数 = 当前参数 - 学习率 × 梯度

学习率调度器

在训练过程中,固定的学习率可能并不能始终有效。为此,通常会使用学习率调度器(Learning Rate Scheduler)来动态调整学习率。例如,开始时使用较高的学习率,加速模型的训练;在训练的中后期逐步降低学习率,以精细调整模型参数,提高模型的最终性能。

学习率调度策略

  1. 固定学习率:整个训练过程中保持不变。
  2. 阶梯式衰减(Step Decay):每隔一定的迭代次数将学习率降低一定比例。
  3. 指数衰减(Exponential Decay):学习率按指数规律逐步衰减。
  4. 余弦退火(Cosine Annealing):学习率按照余弦函数曲线进行变化,通常在训练后期逐步减小。
  5. 线性调度(Linear Scheduler):学习率在整个训练过程中线性下降。

示例代码

在使用Hugging Face Transformers库进行训练时,可以使用学习率调度器来调整学习率。以下是一个简化的示例:

from transformers import get_scheduler
import torch

# 假设我们使用Adam优化器
optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5)

# 设置训练的总步数和预热步数
num_training_steps = 1000  # 总步数
num_warmup_steps = 100  # 预热步数

# 使用线性学习率调度器
lr_scheduler = get_scheduler(
    name="linear", optimizer=optimizer, num_warmup_steps=num_warmup_steps, num_training_steps=num_training_steps
)

# 训练循环
for epoch in range(num_epochs):
    for step, batch in enumerate(train_dataloader):
        # 前向传播和损失计算
        outputs = model(**batch)
        loss = outputs.loss

        # 反向传播和参数更新
        loss.backward()
        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()

在这个例子中,我们使用了一个线性学习率调度器。在预热阶段(前100步),学习率从0逐步增加到初始学习率(5e-5),之后在整个训练过程中线性下降,直到训练结束。这种方法有助于加速前期的训练并在后期进行更精细的调整。

问题三:什么是 num_warmup_steps 预热步数呢

在深度学习中,特别是在使用学习率调度器(Learning Rate Scheduler)时,预热步数(num_warmup_steps)是指在训练初期逐步增加学习率的步数。预热步数的设定可以帮助模型在训练初期更快地找到合适的参数配置,从而加速收敛过程。

预热步数的作用

  1. 加速收敛:在训练初期,模型参数通常处于较差的初始化状态。通过逐步增加学习率,可以帮助模型更快地适应训练数据,加速模型参数的调整和优化,从而加快收敛速度。

  2. 稳定训练:预热步数还有助于确保训练过程的稳定性。过早的高学习率可能导致模型参数更新过大,从而影响训练的稳定性和收敛性。通过逐步增加学习率,可以在训练初期避免这种问题。

如何设置预热步数

预热步数通常是一个超参数,需要根据具体的任务和模型进行调整。一般来说,预热步数的设置不宜过长或过短,一般占总训练步数的一小部分,比如总步数的5%到20%之间。

在使用学习率调度器时,可以通过设置 num_warmup_steps 参数来指定预热步数。例如,在 Hugging Face Transformers 中,使用 get_scheduler 函数设置线性调度器时可以指定预热步数:

from transformers import get_scheduler
import torch

optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5)
num_training_steps = 1000  # 总步数
num_warmup_steps = 100  # 预热步数

lr_scheduler = get_scheduler(
    name="linear", optimizer=optimizer, num_warmup_steps=num_warmup_steps, num_training_steps=num_training_steps
)

在这个例子中,num_warmup_steps=100 表示在训练的前100步中,学习率将从0逐步增加到设定的初始学习率。这样做有助于平稳地启动训练过程,并为模型提供足够的时间适应训练数据。

问题四:总训练步数num_training_steps 应该怎么确定呢

确定总训练步数 num_training_steps 在深度学习中是非常重要的,它直接影响到模型的训练时长和效果。通常,确定总训练步数需要考虑以下几个因素:

1. 数据集大小和批次大小

  • 数据集大小:首先要考虑数据集中样本的总数,因为一个完整的训练步骤涉及整个数据集的多次迭代。

  • 批次大小:每个训练步骤中处理的样本数量。批次大小越大,每个epoch中的训练步骤就越少,总训练步数也会相应减少。

2. 训练轮数(Epochs)

  • 训练轮数:通常情况下,我们会设定一个训练的轮数,每个epoch表示将整个数据集训练一遍的次数。总训练步数应该考虑到每个epoch的批次数和训练轮数的乘积。

3. 学习率调度器的策略

  • 学习率调度器:如果使用了学习率调度器,需要确保总训练步数能够覆盖整个学习率策略所需的步数。例如,如果使用了一个线性调度器,就需要知道需要多少步来完全降低学习率。

示例计算

假设以下情况:

  • 数据集大小:10000个样本
  • 批次大小:32
  • 训练轮数:3个epoch
  • 学习率调度器:线性调度器,从初始学习率到最终学习率的过渡需要1000步

计算总训练步数的步骤如下:

1) 计算每个epoch中的训练步数:

num_batches_per_epoch = len(dataset) / batch_size

其中,len(dataset) 是数据集中的样本数量,batch_size 是每个批次中的样本数量。

假设 len(dataset) = 10000batch_size = 32,则:

num_batches_per_epoch = 10000 / 32 = 312.5

因为批次大小必须是整数,所以每个epoch中的实际批次数为 312

2) 计算总训练步数:

total_training_steps = num_batches_per_epoch * num_epochs

假设 num_epochs = 3,则:

total_training_steps = 312 * 3 = 936

3) 考虑学习率调度器:

如果还有学习率调度器,在计算总训练步数时要确保它能够完整执行其策略所需的步骤。例如,如果需要额外的1000步来完成学习率从初始到最终的过渡,则总训练步数应为:

total_training_steps = total_training_steps + 1000

4. 小结

确定总训练步数需要结合数据集大小、批次大小、训练轮数和任何使用的学习率调度器策略。这样可以确保训练过程充分覆盖所有数据,并根据需要调整学习率以优化模型的训练效果。

问题六:训练轮数是怎么确定的呢

确定训练轮数(epochs)通常需要考虑以下几个因素:

1. 训练收敛性

训练轮数应该足够多,使得模型能够在训练过程中逐渐收敛到一个较好的状态。一般来说,随着训练轮数的增加,模型的性能(如损失函数的减少、精度的提高)会逐步稳定。

2. 训练时间和计算资源

训练轮数的增加会导致训练时间的增加,尤其是在数据集较大或模型复杂的情况下。因此,需要在训练时间和计算资源之间进行权衡,选择一个合适的训练轮数。

3. 训练效果监控

可以通过监控训练过程中的指标变化来确定是否需要增加训练轮数。例如,可以观察损失函数的下降曲线是否趋于平稳,或者验证集上的性能是否达到了一个稳定的水平。

4. 经验和实验

通常,选择训练轮数也具有一定的经验性和试验性质。可以先尝试一些常见的训练轮数,如10、20轮,然后观察模型的表现。根据实际情况调整训练轮数,以达到最佳的训练效果。

5. 示例

假设你正在训练一个图像分类模型,通常情况下,可以按照以下步骤来确定训练轮数:

1) 初始尝试:开始时,可以选择一个相对较小的训练轮数(如5轮),观察模型在训练集和验证集上的表现。

2) 监控训练进展:通过训练过程中的损失函数变化、准确率等指标来评估模型的收敛情况。如果模型在几轮训练后仍在改善,可以继续增加训练轮数。

3) 早停策略:一种常见的做法是使用早停策略(Early Stopping),即当验证集上的性能不再提升时停止训练。这样可以避免过度拟合,并节省计算资源。

4) 超参数调整:在确定训练轮数的同时,还应该考虑其他超参数(如学习率、批次大小等)的调整,以优化模型的训练效果。

总之,确定训练轮数是一个根据实际情况进行调整和优化的过程,需要综合考虑模型的收敛速度、训练时间和计算资源等因素,以达到最佳的训练效果。

问题七:训练轮数在哪里配置

训练轮数通常在训练代码或训练脚本中进行配置和设定。具体来说,它可能涉及以下几个方面的设置:

  1. 训练循环中的epoch设置:在训练代码中,通常会有一个循环来迭代每个epoch。这个循环会设定训练轮数的具体次数。例如,在Python中的训练代码中可能会有如下形式的循环结构:

    num_epochs = 10  # 设置训练轮数为10
    for epoch in range(num_epochs):
        # 在每个epoch中执行训练步骤
        for batch in train_dataloader:
            # 训练逻辑
    

    这里的 num_epochs 变量就是设定的训练轮数。

  2. 训练脚本的参数配置:有时候训练脚本会接受命令行参数或配置文件来设定训练的相关参数,包括训练轮数。例如,可以通过命令行参数或配置文件中设置一个参数来指定训练轮数。

  3. 训练参数对象或类的属性:如果使用面向对象的方式编写训练代码,训练参数(如训练轮数)可能会作为对象的属性。在创建训练实例时,可以通过修改这些属性来设定训练轮数。

  4. 集成开发环境(IDE)或集成训练平台:一些集成开发环境或训练平台(如TensorBoard、PyTorch Lightning等)可能会提供图形化界面或配置文件来设置训练的各种参数,包括训练轮数。

具体到实际使用的情况,可以根据所用的深度学习框架和编程风格来确定如何设置和配置训练轮数。在编写和调试训练代码时,确保训练轮数的设置能够满足任务的需求,并在实验过程中根据训练结果进行必要的调整。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端Canvas入门——怎么用Canvas画一些简单的图案

Canvas作为前端的画图工具&#xff0c;其实用途还是蛮广泛的&#xff0c;但是很多前端学习课程其实都很少涉及到这块内容。 于是乎&#xff0c;就写下这个了。 当然啦&#xff0c;目前还在学习摸索中。 一些实战代码&#xff0c;仅供参考&#xff1a; <canvasid"ctx&…

Onekey正版steam分流下载工具

今天给大家介绍的是一款下载steam游戏的工具。Onekey工具&#xff0c;是一款游戏下载器&#xff0c;可以下载steam正版分流游戏。下载正版分流的网站很多&#xff0c;但是都是网盘或者迅雷下载&#xff0c;或者游戏盒子下载&#xff0c;速度都很慢。这款软件是用steam下载的&am…

《Windows API每日一练》9.1 资源-图标

本节讲述图标、鼠标指针位图、字符串资源表、自定义资源的添加和应用。 本节必须掌握的知识点&#xff1a; 图标 第56练&#xff1a;ICON图标资源 鼠标指针位图 字符串资源表 自定义资源 第57练&#xff1a;字符串资源表和自定义资源 9.1.1 图标 在 Windows 窗口编程中&…

机场的出租车问题折线图

分析并可视化机场离场车辆数数据 本文将详细介绍如何使用Python的正则表达式库re和绘图库matplotlib对机场离场车辆数数据进行分析和可视化。以下是具体步骤和代码实现。 数据资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rU-PRhrVSXq-8YdR6obc6Q?pwd1234 提…

AutoCAD 2025:探索设计的未来

AutoCAD 2025是Autodesk公司推出的一款最新版本的计算机辅助设计&#xff08;CAD&#xff09;软件。作为一名长期使用AutoCAD的用户&#xff0c;我深感这款软件在设计、绘图和建模方面的卓越性能。以下是我对AutoCAD 2025功能的详细介绍以及我的使用体验。 AutoCAD 2025的主要…

Linux学习笔记(二)账户和组

一、基本概念 用 户&#xff1a;用户id&#xff0c;被称为UID 基本组&#xff1a;账户id&#xff0c;被称为GID。用户只能加一个基本组。 0代表超级管理员&#xff0c;root账号。 附加组&#xff1a;用户能加多个基本组。 二、添加账户和组 创建用户名tom&#xff0c;失效…

星间链路与星地链路

目录 一、星间链路 1.1 层内星间链路&#xff08;Intra-layer ISLs&#xff09; 1.2 层间星间链路&#xff08;Inter-layer ISLs&#xff09; 1.3 实现方式 1.3.1 微波链路 1.3.2 激光链路 二、星地链路 2.1 星地链路的关键特性 2.1.2 Ka信关站 2.1.2 Q/V信关站 2.1…

【uniapp-ios】App端与webview端相互通信的方法以及注意事项

前言 在开发中&#xff0c;使用uniapp开发的项目开发效率是极高的&#xff0c;使用一套代码就能够同时在多端上线&#xff0c;像笔者之前写过的使用Flutter端和webview端之间的相互通信方法和问题&#xff0c;这种方式本质上实际上是h5和h5之间的通信&#xff0c;网上有非常多…

科研绘图系列:R语言分组柱状图一(Grouped Bar Chart)

介绍 分组柱状图(Grouped Bar Chart)是一种数据可视化图表,用于比较不同类别(分组)内各子类别(子组)的数值。在分组柱状图中,每个分组有一组并列的柱子,每个柱子代表一个子组的数值,不同的分组用不同的列来表示。 特点: 并列柱子:每个分组内的柱子是并列的,便于…

【LLM】二、python调用本地的ollama部署的大模型

系列文章目录 往期文章&#xff1a; 【LLM】一、利用ollama本地部署大模型 目录 文章目录 前言 一、ollama库调用 二、langchain调用 三、requests调用 四、相关参数说明&#xff1a; 总结 前言 本地部署了大模型&#xff0c;下一步任务便是如何调用的问题&#xff0c…

科普文:K8S中常见知识点梳理

简单说一下k8s集群内外网络如何互通的 要在 Kubernetes&#xff08;k8s&#xff09;集群内外建立网络互通&#xff0c;可以采取以下措施&#xff1a; 使用service&#xff1a; 使用Service类型为NodePort或LoadBalancer的Kubernetes服务。这可以使服务具有一个公共IP地址或端口…

探展2024世界人工智能大会之令人惊艳的扫描黑科技~

文章目录 ⭐️ 前言⭐️ AIGC古籍修复文化遗产焕新⭐️ 高效的文档图像处理解决方案⭐️ AIGC扫描黑科技一键全搞定⭐️ 行业级的知识库大模型加速器⭐️ 结语 ⭐️ 前言 大家好&#xff0c;我是 哈哥&#xff08;哈哥撩编程&#xff09;&#xff0c;这次非常荣幸受邀作为专业…

基于单片机的太阳能智能追光系统设计

摘 要&#xff1a; 光伏能源是一种发电新能源&#xff0c;具有高清洁度、高再生的特点&#xff0c;在能源紧张的当代其应用价值极高。目前&#xff0c;光伏能源发电主要利用光伏设备来实现&#xff0c;但在初期应用过程中&#xff0c;人们发现&#xff0c;太阳光的移动会决定光…

ElasticSearch学习篇14_《检索技术核心20讲》进阶篇之大倒排索引

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 内容 主要是海量数据的大倒排索引的一些原理设计思想&#xff0c;ES底层就是基于这些设计思想以及原理&#xff0c;主要涉及读写分离、索引分层等…

C++ | Leetcode C++题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; class Solution { public:int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {int area1 (ax2 - ax1) * (ay2 - ay1), area2 (bx2 - bx1) * (by2 - by1);int overlapWidth min(ax2, bx2) - max…

vb.netcad二开自学笔记9:界面之ribbon

一个成熟的软件怎么能没有ribbon呢&#xff0c;在前面的框架基础上再加个命令AddRibbon <CommandMethod("AddRibbon")> Public Sub AddRibbon() Dim ribbonControl As RibbonControl ComponentManager.Ribbon Dim tab As RibbonTab New RibbonTab() tab.Tit…

# 昇思25天学习打卡营第10天 | 使用静态图加速

昇思25天学习打卡营第10天 | 使用静态图加速 文章目录 昇思25天学习打卡营第10天 | 使用静态图加速动态图的开启方式静态图的开启方式基于全局context的开启方式基于修饰器的开启方式 总结打卡 AI编译框架分为两种运行模式&#xff1a; 动态图模式&#xff1a; 计算图的构建和计…

近红外光谱脑功能成像(fNIRS):2.实验设计、指标计算与多重比较

一、实验设计的策略与方法 近红外光谱成像&#xff08;INIRS&#xff09;作为一种非侵入性脑功能成像技术&#xff0c;为研究大脑活动提供了一种高效、生态效度高的方法。然而&#xff0c;为了充分利用INIRS技术并确保实验结果的准确性和可靠性&#xff0c;研究者必须精心设计实…

AGAST (角点检测)

AGAST检测原理 AGAST(Adaptive and Generic Accelerated Segment Test)算法是Elmar于2010年提出的特征检测算法,改进了FAST(Features from Accelerated Segment Test)特征检测方法,使其具有更快的速度和更好的鲁棒性。AGAST算法提供了比FAST算法更详细的特征标记方式和判断依…

DWM 相关实现代码 [自用]

1. DWM 缩略图和模糊隐藏实现半透明 #include <windows.h> #include <dwmapi.h> #include <string> #pragma comment(lib, "dwmapi.lib")// 检查 UWP 窗口是否可见 bool IsUWPWindowVisible(HWND hwnd) {DWORD cloaked 0;DwmGetWindowAttribute(…