8 大模型微调

news2024/9/28 7:15:19

        

大部分接触大模型的同学大家可能都受限于资源的限制,无法对大模型重新训练。那么如何解决这一困境?我们暂且假定大模型为通用化模型,但是在某一方面的专业领域知识却不强,如果使用专业领域知识重新训练调整,这对资源还有人力都是极大的挑战,因此为在保证资源一定的条件下得到一个效果良好的模型,我们需要最大模型进行微调,对璞玉进行细琢,得到我们想要的样子。

       大型预训练模型的训练成本非常高昂,需要庞大的计算资源和大量的数据,一般人难以承受。这也导致了一些研究人员难以重复和验证先前的研究成果。为了解决这个问题,研究人员开始研究 Parameter-Efficient Fine-Tuning (PEFT) 技术。PEFT 技术旨在通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本。这样一来,即使计算资源受限,也可以利用预训练模型的知识来迅速适应新任务,实现高效的迁移学习。因此,PEFT 技术可以在提高模型效果的同时,大大缩短模型训练时间和计算成本,让更多人能够参与到深度学习研究中来。

1 大模型微调步骤

  1. 准备数据

    • 收集并预处理特定任务的数据集。
    • 数据集应包含输入(例如文本)和对应的标签(例如分类标签)。
  2. 选择模型

    • 选择一个适合特定任务的大模型,例如 BERT、GPT-3 或者其他相关的预训练模型。
  3. 模型加载

    • 加载预训练模型及其权重。
    • 通常使用框架提供的工具或API来加载模型。
  4. 定义任务层

    • 定义一个或多个附加的任务层,用于适应特定任务的需求。
    • 例如,对于文本分类任务,可以在模型顶部添加一个线性层和 softmax 函数。
  5. 冻结部分层(可选):

    • 为了防止预训练模型的学习效果被大幅改变,可以选择冻结部分模型层,仅对任务层进行训练。
    • 冻结某些层可以减少计算成本,并有助于防止过拟合。
  6. 设置训练参数

    • 选择合适的优化器(例如 AdamW)、学习率、批次大小等。
    • 设定训练轮数(epoch)和其他超参数。
  7. 训练模型

    • 使用特定任务的数据集对模型进行训练。
    • 训练过程中可以使用验证集来监测性能,并根据需要调整超参数。
  8. 评估和调整

    • 在测试集上评估模型性能。
    • 根据评估结果调整模型架构或超参数,以进一步优化性能。
  9. 保存模型

    • 保存微调后的模型及其权重,以便将来使用。

 一点建议:

  1. 在LLM时代,需要牢记 数据质量 > 数量;
  2. 全流程的LLM训练包括:预训练、监督微调、奖励模型、强化学习,多数情况下监督微调即可满足自身需求。
  3. 对于垂类模型,更应该关注PT的过程,而不是采集千万百万的SFT数据做训练,一般建议是 大规模预训练+小规模监督微调=超强的LLM模型
  4. 指令微调阶段不能够进行过多轮次训练:4~7次;
  5. 通常来说,使用lora的效果不如full-tuning(如LoRA results in 4-6% lower performance compared to full fine-tuning )

  6. 7B系列模型请优先采用全参数微调方式(条件不满足就P-tuning,动的参数越多效果通常会更好),13B及以上参数模型可使用LoRA,QLoRA等方法

  7. 如果要结合 LoRA,确保它在所有层上应用,而不仅仅是 Key 和 Value 矩阵中,这样才能最大限度地提升模型的性能。

  8. 如果受 GPU 内存的限制,QLoRA 提供了一种高性价比的折衷方案。它以运行时间增长 39% 的代价,节省了 33% 的内存。

  9. 调整 LoRA rank 和选择合适的 α 值至关重要,可以把 α 值设置成 rank 值的两倍

2 微调方法

2.1 Adapter Tuning

2019年谷歌的研究人员首次在论文《Parameter-Efficient Transfer Learning for NLP》提出针对 BERT 的 PEFT微调方式,拉开了 PEFT 研究的序幕。他们指出,在面对特定的下游任务时,如果进行 Full-Fintuning(即预训练模型中的所有参数都进行微调),太过低效;而如果采用固定预训练模型的某些层,只微调接近下游任务的那几层参数,又难以达到较好的效果。

于是他们设计了如下图所示的 Adapter 结构,将其嵌入 Transformer 的结构里面,在训练时,固定住原来预训练模型的参数不变,只对新增的 Adapter 结构进行微调。同时为了保证训练的高效性(也就是尽可能少的引入更多参数),他们将 Adapter 设计为这样的结构:

  • 首先是一个 down-project 层将高维度特征映射到低维特征
  • 然后过一个非线形层之后,再用一个 up-project 结构将低维特征映射回原来的高维特征
  • 同时也设计了 skip-connection 结构,确保了在最差的情况下能够退化为identity(类似残差结构)。

从实验结果来看,该方法能够在只额外对增加的 3.6% 参数规模(相比原来预训练模型的参数量)的情况下取得和Full-Finetuning 接近的效果(GLUE指标在0.4%以内)。

2.2. Prefix Tuning

2021年斯坦福的研究人员在论文《Prefix-Tuning: Optimizing Continuous Prompts for Generation》中提出了 Prefix Tuning 方法。与Full-finetuning 更新所有参数的方式不同,该方法是在输入 token 之前构造一段任务相关的 virtual tokens 作为 Prefix,然后训练的时候只更新 Prefix 部分的参数,而 Transformer 中的其他部分参数固定。该方法其实和构造 Prompt 类似,只是 Prompt 是人为构造的“显式”的提示,并且无法更新参数,而Prefix 则是可以学习的“隐式”的提示。

同时,为了防止直接更新 Prefix 的参数导致训练不稳定的情况,他们在 Prefix 层前面加了 MLP 结构(相当于将Prefix 分解为更小维度的 Input 与 MLP 的组合后输出的结果),训练完成后,只保留 Prefix 的参数。

2.3 . LoRA

简介
自然语言处理目前存在一个重要范式:一般领域数据的大规模预训练,对特定任务或领域的适应(finetune)。
但是随着预训练语言模型越来越大,这个范式存在以下问题:
● 当我们finetune大模型时,由于训练成本太高,不太可能重新训练所有模型参数
● 以前的方法(论文发表于2021年)都或多或少有其它性能问题,如adapter增加了模型层数,引入了额外的推理延迟;prefix-tuning比较难训练,效果不如直接finetune。
基于上述背景,论文作者得益于前人的一些关于内在维度(intrinsic dimension)的发现:模型是过参数化的,它们有更小的内在维度,模型主要依赖于这个低的内在维度(low intrinsic dimension)去做任务适配。假设模型在任务适配过程中权重的改变量是低秩(low rank)的,由此提出低秩自适应(LoRA)方法,LoRA允许我们通过优化适应过程中密集层变化的秩分解矩阵来间接训练神经网络中的一些密集层,同时保持预先训练的权重不变。
方法
LoRA的实现思想很简单,如下图所示,就是冻结一个预训练模型的矩阵参数,并选择用A和B矩阵来替代,在下游任务时只更新A和B。

结合图片来看,LoRA的实现流程如下:
● 在原始预训练语言模型(PLM)旁边增加一个旁路,做一个降维再升维的操作,来模拟所谓的内在秩。
● 训练的时候固定PLM的参数,只训练降维矩阵A与升维矩阵B。
● 模型的输入输出维度不变,输出时将BA与PLM的参数叠加。
● 用随机高斯分布初始化A,用0矩阵初始化B,保证训练的开始此旁路矩阵依然是0矩阵。
实现
接下来我们从公式上解释LoRA的实现。
假设要在下游任务微调一个预训练语言模型(如GPT3),则需要更新预训练模型参数,公式表示如下:
W0是预训练模型初始化的参数,ΔW就是需要更新的参数。如果是全参数微调,则它的参数量=W0参数量(如果是GPT3,则ΔW≈175B)。从这可以看出要全参数微调大语言模型,小家小户是不可能的。
由于前人的工作发现预训练的语言模型具有较低的“内部维度(intrinsic dimension)”,在任务适配过程中,即使随机投影到较小的子空间,仍然可以有效地学习。因此,LoRA做的就是增加小参数模块去学习改变量ΔW。

        在训练过程中,W0是固定不变的,只有A和B包含训练参数,是变化的。
而在推理的过程中,只需要把改变量放回原模型,就不会有任何延迟。
如果想切换任务,只需要切换任务的过程中,减去BA,然后换上用其它任务训练好的BʹAʹ就可以了。
总结
总的来说,基于大模型的内在低秩特性,增加旁路矩阵来模拟full finetuning,LoRA是一个能达成lightweight finetuning的简单有效的方案。目前该技术已经广泛应用于大模型的微调,如Alpaca,stable diffusion+LoRA,而且能和其它参数高效微调方法有效结合,例如 State-of-the-art Parameter-Efficient Fine-Tuning (PEFT)

ref:https://zhuanlan.zhihu.com/p/627642632 

https://zhuanlan.zhihu.com/p/636481171

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

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

相关文章

如何选到好的宠物空气净化器?有没有推荐的品牌?

从最初的手忙脚乱、对宠物养护知识一无所知的新手小白,到如今能够游刃有余地处理各种宠物问题、养宠多年的资深铲屎官,这么久,我也积累了不少的经验,就是希望能为自家的毛孩子提供最健康、最适合的生活。 这么久的养猫历程遇见的…

tcp/udp 可视化 调试工具; tcp/udp 发送客户端;查看tcp连接;netassist;packet sender;tcp view;

前言 最近对接物联设备,物联设备会往java端传送数据,在联调前,问厂商要来了样例数据,然后就找到了netassist和packetsender两款tcp发送工具,来模拟请求;还用tcpview来查看建立的连接。 netassist netass…

BERT:Pre-training of Deep Bidirectional Transformers forLanguage Understanding

个人觉着BERT是一篇读起来很爽的论文 摘要 我们引入了一种新的语言表示模型BERT,它代表Bidirectional Encoder Representations from Transformers。与最近的语言表示模型不同(Peters et al., 2018a;Radford et al., 2018), BER…

52.x86游戏实战-XXX获取房间坐标

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【Docker】个人笔记

文章目录 Docker三个基本概念镜像(Image)容器(Container)仓库(Repository) Docker命令基础命令查看版本信息显示详细信息从仓库拉取镜像列出本地存储的镜像删除一个或多个镜像列出所有运行中的容器运行一个新的容器停止一个运行中的容器启动一个已停止的容器重启一个容器删除一…

论文泛读: DETRs Beat YOLOs on Real-time Object Detection

[toc[ DETRs Beat YOLOs on Real-time Object Detection 论文地址: https://openaccess.thecvf.com/content/CVPR2024/html/Zhao_DETRs_Beat_YOLOs_on_Real-time_Object_Detection_CVPR_2024_paper.html 代码地址: https://zhao-yian.github.io/RTDETR 动机 现状 YOLO系列因…

车联网技术在智能交通系统中的设计与实现(论文+源码)

1系统方案设计 根据系统设计需求,展开系统详细方案设计。如图2.1所示为系统设计结构框图。系统以STM32单片机为主控制器,利用ATGM336 GPS模块实现车辆实时定位,借助倾斜检测模块监测车辆倾斜角度,并通过OLED液晶显示器实时显示监…

揭晓9款敏捷团队必备的协作工具选择

本文将介绍9款团队协作工具:1.Worktile;2. PingCode;3. 融云 (RongCloud);4. 好团队;5. 微软Teams;6. 小钉贴;7. Lark;8. Bit.ai;9. Hive。 在敏捷开发团队中&#xff0c…

Veeam Backup Replication v12.2 发布,新增功能概述

Veeam Backup & Replication v12.2 发布,新增功能概述 Veeam Data Platform | 面向混合云和多云的 备份和恢复 监控和分析 恢复编排 请访问原文链接:https://sysin.org/blog/veeam-backup-12/,查看最新版。原创作品,转载请保…

烂大街的测试左移和右移

01 测试左移与右移的定义 通俗的讲:左移是往开发阶段移,右移是往发布之后移。 正常测试:提测后的测试工作——到——发布验证完成阶段。 测试左移:提测之前的测试。 如:代码单元测试,代码质量检测&#x…

数据结构的三要素以及数据类型和抽象数据类型

一.数据结构的三要素: 二.逻辑结构: 三.数据的运算: 三.数据的物理结构(存储结构): 1.数据的存储结构:有4种 顺序存储 链式存储 索引存储 散列存储 注:顺序存储数据之间必须相…

没有编程基础?这款数据分析工具也能轻松上手

在当前快节奏的工业环境中,工厂管理者越来越依赖数据分析来优化生产流程、提升效率、降低成本。然而,很多传统的数据分析工具不仅操作复杂,而且费用高昂,让不少工厂望而却步。最近,我发现了一款非常实用的报表工具&…

[MySql]保姆级上手教程

介绍 通过数据库管理系统, 编写执行SQL语句, 实现对数据库数据的管理 数据库(DataBase): 储存和管理数据的仓库数据库管理系统(DBMS): 操作和管理数据库的软件SQL语言: 操作关系型数据库的通用语言数据库可以分为关系型数据库和非关系型数据库 相关产品 常见的关系型数据库产…

STM32G474之TIM1捕获1模式

STM32G474采用TIM8产生方波信号,使用TIM1工作于捕获1模式,并计算方波频率。捕获方波周期,在有些开发中,还是能用到。建议开发时使用HAL库自带的库函数。使用寄存器方法也可以实现,但是后期修改不太方便。 测试时&…

springboot学习(2)

1、springboot入门 需求:使用 Springboot 开发一个 web 应用,浏览器发起请求 /hello 后,给浏览器返回字符串 "hello world!" 2、基本尝试步骤 创建Maven工程导入 spring-boot-starter-web (起步依赖)编写Controller提供启动类 &…

无人机 PX4 飞控 | ROS应用层开发:offboard 模式切换详细总结

无人机 PX4 飞控 | ROS应用层开发:offboard 模式切换详细总结 PX4 offboard 模式介绍通过mavros 进行offboard模式切换代码测试 通过地面站进行offboard模式切换通过遥控器拨杆切换offboard模式 PX4 offboard 模式介绍 PX4 是一个广为熟知的开源飞控软件&#xff0…

Yolo环境搭建(深度学习基础环境)

需要安装的东西 CUDAcuDnn魔法 一、CUDA安装(Windows10环境) 第一:下载驱动 第二:查看显卡支持的最高CUDA的版本,以便下载对应的CUDA安装包 第三:确定CUDA版本对应的cuDNN版本,这个其实不用太关注,因为…

宾得相机sd卡格式化了怎么办?分享应对之策

对于摄影爱好者而言,‌相机不仅是捕捉美好瞬间的设备,‌更是珍藏回忆的宝库。‌然而,‌在使用宾得相机的过程中,‌可能会遇到SD卡意外格式化的情况,‌这无疑给许多摄影爱好者带来了不小的困扰。‌SD卡格式化后&#xf…

Shell脚本入门:多命令处理

我的后端学习大纲 我的Linux学习大纲 1.什么是多命令处理 1.多命令处理就是在Shell脚本文件中编写多个Shell命令 2.入门案例: 2.1.需求介绍: 1.在已知目录/root/itheima目录,执行batch.sh脚本,实现在/root/itheima/目录下创建一…

PDF文本指令解析与文本水印去除

上次我在《PDF批量加水印 与 去除水印实践》一文中完成了对图片水印和文字水印的去除。 链接:https://xxmdmst.blog.csdn.net/article/details/139483535 但是对于页面对象的内容对象是单层,不是数组的情况,无法去除水印。今天我们专门研究…