LOMO:在受限资源上全参数微调

news2024/11/20 16:23:45

LOMO:Full Parameter Fine-Tuning for large language models with limited resources

  • Introduction
    • Method
      • Rethink the functionality of optimizer
        • Using SGD
      • LOMO: LOw-Memory Optimization
  • 实验
  • 参考

Introduction

在这篇文章中,作者的目的是探索在有限资源上的全参数微调,作者通过各种分析,发现SGD在LLM场景下的全参数微调是很有前景的。于是作者进一步的改进SGD,最终版本称之为LOMO,可以在8块3090上微调65B。
这篇文章的主要贡献有:

  1. 提供为何SGD在LLM领域有前景。
  2. 提出了LOMO optimizer。
  3. 验证了LOMO的高效性。

Method

Rethink the functionality of optimizer

现在流行的optimizer是Adam一脉,但是储存它的的中间状态,也就是optimizer state,就多占用了2倍参数的内存,dominate 了内存使用。

Using SGD

尽管Adam目前已经十分成功在深度学习领域,但是由于内存的占用,作者想寻找一个更便宜的optimizer,于是SGD就进入了视野,它的内存占用更小。
以前的工作中,讨论了SGD的挑战有:

  1. large curvature surface
  2. local optimum
  3. saddle points

Smoother loss surface
上述的问题大多是基于以前的研究,那个时候模型还没有特别大,只是能解决特定的类别问题。然而到了大模型领域,作者发现损失函数的损失平面要比小模型的光滑很多,也就是模型训练要跟稳定(主要预训练语料与下游任务差别不大)。

Local optimum is good enough
作者认为在微调LLM的时候,不需要LLM彻底的大改变(也就是避免灾难性遗忘),而让损失函数到达局部最优解,也是一个不错的选择。

Distant saddle points
预训练后的模型损失函数的点一般位于山谷,但是如果在指令微调时,两种语料有一定的差异,可能造成模型陷入鞍点(鞍点多位于山顶与山谷中间),作者认为在预训练时期就引入指令数据可以有效的缓解此问题。

上述三点可能无法证明此问题,作者进行了进一步的公示推倒,证明了LLM的loss surface是光滑的。

LOMO: LOw-Memory Optimization

在这里插入图片描述
由于SGD不像Adam那样需要计算一些中间参数,也就不需要储存optimizer state,于是作者在SGD的基础上,合并了计算梯度与更新的参数的过程:
在这里插入图片描述
但是这样也无法normalize和clipping梯度,会对训练造成一定的弊端,为了缓解这个问题作者是用了一个人值得商榷的解决方案:

当前的训练框架根据所有参数计算梯度范数,并需要两个反向传播过程。节省额外的反向传播过程的一种解决方案是使用一组参数近似梯度张量的范数,例如,相邻的层。然而,这种方法实际上是有偏差的,因为它导致不同参数的更新步长不同。在更新过程中,根据梯度范数,参数会乘以一个比例因子。由于不同参数组之间的梯度范数不同,这样的近似会导致比例因子的差异。尽管存在这个限制,这种分组梯度剪裁方法可以被视为根据梯度范数向不同参数组应用动态学习率。
在这里插入图片描述

实验

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

参考

https://arxiv.org/pdf/2306.09782.pdf

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go 语言进阶 - 工程进阶

前言: \textcolor{Green}{前言:} 前言: 💞这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营 💞从这个专栏里面可以迅速获得Go的知识 今天的内容包括以下两个内容。关于实践的内容我会在后续发布出来。 01.语言…

新零售破局丨2023年探索全新电商运维模式——永倍达模式深度解析

新零售破局丨2023年探索全新电商运维模式——永倍达模式深度解析 大家好!我是微三云胡佳东,一家专业的电商软件开发公司的负责人。 近年来,随着电商的高速发展,不少电商平台成为了市场经济的优质榜样,互联网市场竞争也…

设计模型学习-UML图

1,简介 UML图有很多种类型,但掌握其中的类图、用例图和时序图就可以完成大部分的工作。其中最重要的便是「类图」,它是面向对象建模中最常用和最重要的图,是定义其他图的基础。 类图主要是用来显示系统中的类、接口以及它们之间的…

Ubuntu环境下读取罗技G29方向盘信息

本篇博客最早发布于实验室公共博客,但已无人维护,现迁移至个人博客 引言 实验室有这么酷的驾驶设备,来了一年还没有实际操作过,早就蠢蠢欲试了,哈哈哈不过之前负责的师兄还在就一直没敢用,现在他毕业了就可…

rust abc(2): 从 hello world 到整数、浮点类型

文章目录 1. 目的2. 搞懂 hello world2.1 代码2.2 fn 的含义2.3 main() 的含义2.4 println! 的含义2.5 行尾分号是必要的吗?2.6 左花括号可以放下一行吗? 3. 数据类型的例子3.1 代码3.2 rust 的注释3.3 编译运行结果3.4 基本数据类型 4. 整数类型的例子4…

SpringMVC系列-3 拦截器

背景 本文作为 SpringMVC系列 的第三篇,以SpringMVC系列-2 HTTP请求调用链为基础,介绍Spring MVC的拦截器。 1.拦截器 SpringMVC的核心实现是DispatcherServlet,本质是一个Servlet实现类,拦截器位于DispatcherServlet逻辑中&am…

MySQL进阶SQL语句2之表连接

目录 1.连接查询 1.1inner(内连接) 1.2left join(左连接) 1.3right join(右连接) 1.4直接查询两个表相同的字段值的数据 2. VIEW(视图) 2.1create view(创建视图…

设计模式之迭代器模式笔记

设计模式之迭代器模式笔记 说明Iterator(迭代器)目录迭代器模式示例类图学生类抽象迭代器角色接口具体迭代器角色类抽象聚合角色接口具体聚合角色类测试类 说明 记录下学习设计模式-迭代器模式的写法。JDK使用版本为1.8版本。 Iterator(迭代器) 意图:提供一种方法顺序访问一…

Python2、3下载安装、环境配置和Python2、3版本共存配置

一、python 版本简介 python 包括 python2、python3 两个大版本,其中 python3 改进了 python2 的一些不足,但由于以前很多应用是用 python2 开发的,维护这些应用还需用到 python2,故 python2 尚未被完全淘汰。 北京时间 2020 年 4…

近期参与开源的心得体会

引言 最近随着Kepler项目加入CNCF sandbox,写一篇blog来记录下参与这个项目半年的发展的心得体会。 运营 项目的运营最好还是专注于项目自身的发展,围绕项目的特点,创新点入手,为大家提供价值,从而自然而然的扩大自…

【计算机网络】计算机网络期末自测题(一)答案

2019-2020 学年第 2 学期自测题答案及评分标准 (卷 1) 计算机网络 一、 填空题: 参考答案: 1 、 01000101 、11100111 3 、 100Mbps、双绞线、基带、全双工 [10Mbps 要求单位] 4 、 报文 5 、 ICMP 6 、 虚电路 7 、 距离矢量、链路状态 …

什么是网络安全?

文章目录 一、概述1.1 网络安全的指标1.2 网络安全的特征 二、网络安全威胁2.1 黑客能破坏的2.2 Internet安全手段2.2.1 端口扫描2.2.2 分组嗅探sniffing2.2.3 IP欺骗Spoofing 2.3 Internet安全威胁2.3.1 DOS拒绝服务 三、密码学3.1 对称加密算法3.1.1 传统加密3.1.2 现代加密技…

Redis(七):Redis基础入门

Redis基础入门 Redis用途Redis优缺点docker运行RedisRedis常用命令String命令Hash命令List命令Set命令ZSet命令全局命令 Redis事务Redis持久化机制RDBAOFRDBAOF(默认) Redis内存淘汰机制Redis对过期Key的处理 Redis用途 Redis是一种开源的NoSQL内存数据库…

【MySql】多版本并发控制MVCC前置知识——隐藏字段、undo日志与Read View

文章目录 3个记录隐藏列字段undo日志模拟 MVCCRead View 数据库并发的场景有三种: 读-读 :不存在任何问题,也不需要并发控制 读-写 :有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读…

UOS系统下搭建qtcreator编译环境

文章目录 前言一、依赖包说明二、No valid kits found 问题现象三、No valid kits found 问题解决1.查找qt安装路径2.设置Qt Versions3.构建套件(kit)下选择Qt版本4.重新添加工程 前言 本文记录了在UOS系统下如何安装qtcreator以及涉及的依赖包安装&…

冷静期or跌落神坛:净水市场纠结,“易开得”们路在何方?

文丨琥珀消研社 作者丨余二 1986年11月1日,一场火灾拉开了世界三大水污染——莱茵河水污染的序幕。 是夜,位于瑞士巴塞尔市的桑多兹化学公司的一个化学品仓库发生火灾,装有约1250吨剧毒农药的钢罐爆炸,大火持续了4个多小时&…

SpringBoot 线上服务假死,CPU 内存正常,什么情况?

背景 开发小伙伴都知道线上服务挂掉,基本都是因为cpu或者内存不足,出现GC频繁OOM之类的情况。本篇文章区别以上的情况给小伙伴们带来不一样的服务挂掉。 还记得哔哩哔哩713事故中那场诡计多端的0吗? 图片 对就是这个0,和本次事…

团体程序设计天梯赛-练习集L2篇③

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

【golang中的变量 全局/局部/4中声明】

目录 变量变量的分析1.变量的创建的四种形式1.1总结1.2第一种 var a int 声明1.3 第二种 var a string "XXXX" 初始化1.4第三种 var a "XXXX"1.5第四种 a : XXXX 2.一次性声明多个变量3.一次初始化多个变量3.1交换值 4.全局变量--局部变量5. 声明和初始化…

Kafka生产调优源码

一、Kafka硬件配置选择 1.1 场景说明 100 万日活,每人每天 100 条日志,每天总共的日志条数是 100 万 * 100 条 1 亿条。 1 亿/24 小时/60 分/60 秒 1150 条/每秒钟。 每条日志大小:0.5k - 2k(取 1k)。 1150 条/…