【炼丹经验积累(一)】梯度消失 学习率自动调节 附代码

2024-08-22 19:44

本文主要是介绍【炼丹经验积累(一)】梯度消失 学习率自动调节 附代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述

  • 对 stable diffusion 3 进行 ip-adapter 微调,正常训练 2 w 步后,loss 出现不稳定状态,并出现 Not a number
  • 问题定位:由于 loss 并没有变成无限大(梯度爆炸),那么应该是梯度消失。
    在这里插入图片描述

解决方案

  1. 降低学习率
  • 参考 huggingface 官方论坛1,其中有用户提到:“我也遇到过几次了。就我而言,我能够通过降低学习率来解决这个问题,但你的学习率已经很低了,所以不幸的是,我不太确定。”
  • 该博客中的学习率已经是 learning_rate=1e-6,而本文的情况是 1e-4 会在 200步 nan,8e-05 会在 600步 nan,降到 1e-5 稳定训练很长时间后,一觉醒来,发现在 2 w 步之后出现 nan 🫠
  1. 自动调节学习率

自动调节学习率的方式很多2,本文先从最简单地尝试起来,即“线性调节”

(1)先 warm up,在前 1/10 个训练步中,学习率从 0 调节到设定的 1e-5
(2)再衰减,在后续的训练步中,线性地从 1e-5 逐渐减为 0

线性调节学习率代码

# S-TODO 学习率调节器 lr_scheduler refer to https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.LambdaLR.html#torch.optim.lr_scheduler.LambdaLRfrom torch.optim.lr_scheduler import LambdaLRdef get_linear_schedule_with_warmup(optimizer, num_warmup_steps, num_training_steps, last_epoch=-1):def lr_lambda(current_step):if current_step < num_warmup_steps:return float(current_step) / float(max(1.0, num_warmup_steps))return max(0.0, float(num_training_steps - current_step) / float(max(1.0, num_training_steps - num_warmup_steps)))return LambdaLR(optimizer, lr_lambda, last_epoch)
...optimizer = torch.optim.AdamW(xxx)# dataloadertrain_dataset = MyDataset(xxx)train_dataloader = torch.utils.data.DataLoader(xxx)# S-TODO Define the 学习率 的 schedulernum_training_steps = len(train_dataloader) * args.num_train_epochsnum_warmup_steps = int(0.1 * num_training_steps)  # 10% warmupscheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps, num_training_steps)
...
训练代码
...# Backpropagateaccelerator.backward(loss)optimizer.step()# 更新下一步的学习率scheduler.step() optimizer.zero_grad()
...

  1. https://discuss.huggingface.co/t/text-to-image-training-loss-becomes-nan-all-of-a-sudden/35224 ↩︎

  2. https://datawhalechina.github.io/thorough-pytorch/%E7%AC%AC%E5%85%AD%E7%AB%A0/6.2%20%E5%8A%A8%E6%80%81%E8%B0%83%E6%95%B4%E5%AD%A6%E4%B9%A0%E7%8E%87.html ↩︎

这篇关于【炼丹经验积累(一)】梯度消失 学习率自动调节 附代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097221

相关文章

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Java强制转化示例代码详解

《Java强制转化示例代码详解》:本文主要介绍Java编程语言中的类型转换,包括基本类型之间的强制类型转换和引用类型的强制类型转换,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录引入基本类型强制转换1.数字之间2.数字字符之间引入引用类型的强制转换总结引入在Java编程语言中,类型转换(无论