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

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

相关文章

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...