当前位置: 首页 > news >正文

transformers中学习率warmup策略具体如何设置

在使用 get_linear_schedule_with_warmup(如 Hugging Face Transformers 库中的学习率调度器)时,参数的合理设置需要结合 数据量(dataset size)批次大小(batch size) 和 训练轮数(epochs) 来确定。以下是分步指南和公式说明:

1. 核心参数解析

get_linear_schedule_with_warmup 的主要参数:

  • num_warmup_steps: 学习率预热步数(逐渐增大学习率的阶段)

  • num_training_steps: 总训练步数(学习率从峰值线性衰减到 0 的总步数)

2. 参数计算公式

(1) 计算总训练步数 (num_training_steps)

总训练步数 = 每轮(epoch)的步数 × 训练轮数(epochs)
每轮的步数 = ⌈ 数据总量 / batch_size ⌉ (向上取整)

公式

num_training_steps=epochs×⌈dataset_size/batch_size⌉

(2) 设置预热步数 (num_warmup_steps)

经验法则:

  • 小规模数据(< 10k 样本): 预热步数占总步数的 10%~20%

  • 中/大规模数据(> 10k 样本): 预热步数占总步数的 5%~10%

  • 超大数据(> 1M 样本): 预热步数可设为 1%~2%

公式

num_warmup_steps=max(100,num_training_steps×warmup_ratio)num_warmup_steps=max(100,num_training_steps×warmup_ratio)

max 确保至少 100 步预热,避免极端情况)

3. 参数设置建议

参数设置原则
num_warmup_steps避免过长(占用过多训练时间)或过短(学习率上升不稳定)
num_training_steps确保准确计算,否则学习率衰减可能提前结束或未完成
动态调整策略使用验证集监控,如果模型收敛不稳定,适当增加预热步数或调整预热比例

通过合理设置 num_warmup_steps 和 num_training_steps,可以确保学习率在训练初期稳定上升(预热阶段),随后线性衰减至零,从而优化模型收敛速度和最终性能。根据数据规模和任务特性灵活调整预热比例是关键。

4. 当使用多卡机器与梯度累加步骤结合时,应该如何计算?

可能存在的误区是,梯度累积是在每个卡上独立进行的,还是跨卡同步的。例如,如果每个卡在本地累积了A步梯度,然后进行同步和参数更新,那么总的梯度累积步数仍然是A,而不是卡数乘以A。因此,总的有效批量大小应该是卡数 × 单卡batch size × 梯度累积步数。

此外,在分布式训练中,每个卡处理的样本数是总样本数除以卡数,因此每个卡每个epoch的步数是(总样本数 / 卡数) / 单卡batch size,再乘以梯度累积步数得到参数更新次数。

假设以下参数:

  • 总样本数(dataset_size): 50,000

  • 每卡批量大小(per_device_batch_size): 32

  • 训练轮数(epochs): 3

  • 梯度累积步数(gradient_accumulation_steps): 4

  • GPU数量(num_gpus): 4

  • 预热比例(warmup_ratio): 10%

计算总的有效批量大小

有效批量大小=num_gpus×per_device_batch_size×gradient_accumulation_steps=4×32×4=512


计算每个epoch的参数更新次数

每个epoch的更新次数=⌈dataset_size/有效批量大小⌉=⌈50,000/512⌉=98


计算总训练步数(num_training_steps)

num_training_steps=每个epoch的更新次数×epochs=98×3=294


计算预热步数(num_warmup_steps)

num_warmup_steps

=max⁡(100,num_training_steps×warmup_ratio)

=max⁡(100,294×0.1)

=max⁡(100,29.4)=100

(若数据量较大,可适当降低预热比例)

5. 代码

from transformers import get_linear_schedule_with_warmup

# 输入参数
dataset_size = 50_000
per_device_batch_size = 32
epochs = 3
num_gpus = 4
gradient_accumulation_steps = 4
warmup_ratio = 0.1  # 10%

# 计算总有效批量大小
effective_batch_size = num_gpus * per_device_batch_size * gradient_accumulation_steps

# 计算每个epoch的更新次数
updates_per_epoch = (dataset_size + effective_batch_size - 1) // effective_batch_size  # 向上取整

# 计算总训练步数
num_training_steps = updates_per_epoch * epochs

# 计算预热步数(确保最小100步)
num_warmup_steps = max(100, int(num_training_steps * warmup_ratio))

# 创建调度器
optimizer = ...  # 初始化优化器
scheduler = get_linear_schedule_with_warmup(
    optimizer,
    num_warmup_steps=num_warmup_steps,
    num_training_steps=num_training_steps
)

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

相关文章:

  • ElementUI元件库——提升Axure原型设计效率与质量
  • 传统神经网络、CNN与RNN
  • R-GCN-Modeling Relational Data with GraphConvolutional Networks(论文笔记)
  • 【第30节】MFC编程:ListCtrl控件和TreeCtrl控件
  • 如何使用腾讯云HAI快速、高质量生成Stable Diffusion图片
  • 容器C++ ——STL常用容器
  • Flask(五)表单处理与验证
  • 浅析车规芯片软错误防护加固的重要性
  • (常识)C++中的模板(函数模板、类模板)——参数传递方式?继承与模板?分文件编写?
  • Spring的 @Conditional @ConditionalOnProperty 注解 笔记250330
  • Redis 01
  • 09-SpringBoot3入门-整合Mybatis
  • 青少年软件编程(C语言)等级考试试卷(三级)
  • WP Mail 邮件发送:WordPress Mail SMTP设置
  • Python + Chrome 爬虫:如何抓取 AJAX 动态加载数据?
  • 《剑指数据库:MySQL玄阶查术秘典·下卷》
  • C++——类和对象
  • Dear ImGui for Unity 常见问题解决方案
  • 【Agent】OpenManus-Prompt组件详细分析
  • 【安全运营】关于攻击面管理相关概念的梳理(一)
  • Burp Suite从入门到实战之配置启动
  • 【Linux探索学习】第二十九弹——线程概念:Linux线程的基本概念与线程控制详解
  • 如何高效备考蓝桥杯(c/c++)组
  • 蓝桥杯python编程每日刷题 day 21
  • 我的机器学习学习之路
  • 手机蓝牙项目
  • 《构建有效的AI代理》学习笔记
  • QT五 文件系统,QFile,QfileInfo
  • Go 语言规范学习(5)
  • 关于gige与MFC的界面交互