pytorch 参数冻结 parameter-efficient fine-tuning

2024-08-27 08:12

本文主要是介绍pytorch 参数冻结 parameter-efficient fine-tuning,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目标:在网络中冻结部分参数进行高效训练

框架:pytorch (version 1.11.0)

基本实现

  1. 需要学习的参数requires_grad设置为True,冻结的设置为False
  2. 需要学习的参数要加到 optimizer的List中;对于冻结的参数,可以直接不加进去,(应该也可以加进去,但是requires_grad=False)

注意事项
3. 如果不传递参数的层,记得前向操作是要设置 with torch.no_grad,否则即便没有需要更新的参数,其layer的梯度也回传,效率低。

  1. 要保证所有参与前向的操作,都被用于计算loss。例如,a=self.layer(b),只要前向里出现了这个操作,就要保证a(或a的后续输出)要参与loss的计算。如果a算完了不用,是不可以的。(不论self.layer里是否有需要更新的参数)。ps:这点和不冻结设置下的要求不一样,如果所有参数都学,即便中间有一些变量操作是冗余的,也不会报错,只是增加计算代价而已。(比如,在clip框架里,如果不用text prompt, 就不要提取该特征)
  2. 要保证,所有需要更新的参数,都用于前向计算了。如何比较二者的参数,见下:

a. 记录需要梯度回传的参数:

grad_params = set()
for name, param in model.named_parameters():if param.requires_grad:grad_params.add(name)

b. 记录前向中使用的参数:

used_params = set()
def forward(self, x):for name, param in self.named_parameters():if param.requires_grad:param.register_hook(lambda grad, name=name: used_params.add(name))return self.model(x)

c. 比较二者差异

unused_params = grad_params - used_params
if unused_params:print("以下参数未在 forward 函数中使用:", unused_params)
else:print("所有需要计算梯度的参数都在 forward 函数中使用了。")

ps. 好像也可以通过在nn.parallel.DistributedDataParallel中设置find_unused_parameters=True来找到未使用的变量。(不过我没试过

这篇关于pytorch 参数冻结 parameter-efficient fine-tuning的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p