大模型学习笔记 - LLM指令微调

news2024/11/25 17:18:32

LLM 指令微调

  • LLM 指令微调
    • 0. 概览
    • 1. 指令数据的构建
      • 1.1 基于现有NLP任务数据集构建
      • 1.2 基于日常对话数据构建
      • 1.3 基于合成数据构建
      • 1.4 指令数据构建的提升方法
    • 2. 指令微调的策略
      • 2.1 优化设置
      • 2.2 数据组织策略
    • 3. 参数高效的模型微调
      • 3.1 低秩适配微调方法
      • 3.2 其他高效微调方法
    • 4. 与预训练的区别
    • 5. 实践经验

0. 概览

指令微调基本步骤:

  1. 准备预训练模型
  2. 准备微调数据集
  3. 设计输入输出格式
  4. 微调模型
  5. 评估测试
  6. 应用部署

1. 指令数据的构建

1.1 基于现有NLP任务数据集构建

1.2 基于日常对话数据构建

1.3 基于合成数据构建

1.4 指令数据构建的提升方法

2. 指令微调的策略

在训练方式上,指令微调与预训练较为相似,下面详细介绍指令微调所特有的策略。

2.1 优化设置

指令微调中优化器的设置(AdamW或者Adafactor)、 稳定训练技巧(权重衰减、梯度裁剪)和训练技术(3D并行、ZeRO和混合精度训练)都和预训练保持一致。完全可以沿用。
指令微调的不同之处:

  1. 目标函数:预训练阶段一般采用语言函数建模损失。指令微调可以被视为一个有监督的训练过程,通常采用的目标函数为序列到序列的损失,仅在输出部分计算损失,而不计算输入部分的损失。
  2. 批次大小与学习率:较小的批次大小和学习率。比如InstructGPT 微调的batchsize=8,学习率为5.0310-6.Alpaca的batchsize=128,学习率预热到210-5 然后采用余弦衰减策略.
  3. 多轮对话数据的高效训练:对于多轮对话数据,通常的训练是将其拆分成多个不同的对话数据进行单独训练。为了提升效率,可以采用特殊的掩码机制来实现多轮对话数据的高效训练。在因果解码架构中,由于输入输出没有明显的界限,可以将所有一个对话的多轮内容一次性输入模型,通过设计损失掩码来实现仅针对每轮对话的模型输出部分进行损失计算,从而显著减少重复前缀计算的开销。 只有因果解码架构可以实现这样的?

2.2 数据组织策略

  1. 平衡数据分布
  2. 多阶段指令数据微调
  3. 结合预训练数据与指令微调

3. 参数高效的模型微调

参数高效微调是一个重要研究方向,旨在减少需要训练的模型参数,同时保证微调后的模型性能 能够与全量微调的表现相媲美。

3.1 低秩适配微调方法

在这里插入图片描述

  1. LoRA 基础

    大语言模型汇总包含大量的线性变换层,其中参数矩阵的维度非常高,LoRA论文中发现模型在针对特定任务进行适配时,参数矩阵往往是过参数化的,其存在一个较低的内在秩。为了解决这个问题,LoRA提出在预训练模型的参数矩阵上添加低秩分解矩阵来近似每层的参数更新,从而减少适配下游任务所需要训练的参数。给定一个参数矩阵W,其更新过程可以一般性地表达为 W = W 0 + Δ W W = W_0 + \Delta W W=W0+ΔW
    其中 W 0 W_0 W0是原始参数矩阵, Δ W \Delta W ΔW是更新的梯度矩阵。
    LoRA的基本思想是冻结原始矩阵W0,通过低秩分解矩阵A(HR),B(HR)来近似参数更新矩阵 Δ W = A ∗ B T \Delta W = A*B^T ΔW=ABT,其中R<<H 是减小后的秩。在微调期间,原始矩阵参数W0,不会被更新,低秩分解矩阵A和B则时可训练参数用于适配下游任务。在前向传播过程中,原始计算中间状态 h = W 0 ∗ x h = W_0 * x h=W0x 的更是可以修改为 h = W 0 ∗ x + A ∗ B T ∗ x h = W_0*x + A*B^T*x h=W0x+ABTx
    在训练完成后,进一步将原始参数矩阵W0 和训练得到的权重A和B进行合并, W = W 0 + A B T W=W_0+AB^T W=W0+ABT,得到更新后的参数矩阵。因次LoRA 微调得到的模型在解码中不会增加额外开销。

  2. LoRA 所需的显存估计

    LoRA 微调需要的显存大小从全量微调的16P大幅减少为 2 P + 16 P L o R A 2P+16P_{LoRA} 2P+16PLoRA

  3. LoRA 变种

    在原始的LoRA中,每个低秩矩阵的低秩参数R都被设定为固定且相同的数值,并且在训练过程中无法进行调整,这种设定忽略了不同的秩在微调任务中可能产生的差异化影响。因此通过这种方式训练得到的低秩矩阵往往并非最优解。

    AdaLoRA 讨论了如何更好地进行秩的设置。它引入了一种动态低秩适应技术,在训练过程中 动态调整每个参数矩阵需要训练的秩的同时控制训练的参数总量。模型在微调过程中通过损失来衡量每个参数矩阵对训练结果的重要性,重要性较高的参数矩阵被赋予较高的秩,进而能更好地学习到有助于任务的信息。相对而言,不太重要的参数矩阵被赋予比较低的秩,来防止过拟合并节省计算资源。

    QLoRA 将原始的参数矩阵量化为4比特,而低秩参数部分仍使用16比特进行训练,在保持微调效果的同时进一步节省了显存开销。给定参数为P的模型,QLoRA微调所需的显存 由 LoRA微调所需显存2P 降低为0.5P,这样就可以在一个48GB的GPU上微调65B的模型,接近16比特模型微调的性能.
    - ZeroQuant,SmoothQuant

3.2 其他高效微调方法

  1. 适配器微调

    1. Adapter Tuning, 在transformer中引入小型神经网络模块。为了实现适配器微调,研究者提出使用瓶颈网络架构:首先将原始的特质向量压缩到较低维度,然后使用激活函数进行非线性变换,最后再恢复到原始维度。KaTeX parse error: Undefined control sequence: \sigmoid at position 9: h = h + \̲s̲i̲g̲m̲o̲i̲d̲(h*W^d)*W^u,其中𝑾𝑑 ∈ R(𝐻×𝑅),𝑾𝑢 ∈ R(𝑅×𝐻),且𝑅 ≪ 𝐻。通常来说,适配器模块将会被集成到Transformer 架构的每一层中,使用串行的方式分别插入在多头注意力层和前馈网络层之后、层归一化之前。在微调过程中,适配器模块将根据特定的任务目标进行优化,而原始的语言模型参数在这个过程中保持不变。通过这种方式,可以在微调过程中有效减少需要训练参数的数量
      在这里插入图片描述
  2. 前缀微调

    1. prefix Tuning. 在语言模型的每个多头注意力层中都添加一组前缀参数。这些前缀参数组成了一个可训练的连续矩阵,可以视为若干虚拟词元的嵌入向量,他们会根据特定任务进行学习。具体实现上,基于原始的注意力计算公式,一系列前缀词元被拼接到每个注意力的键向量与值向量(key 和value)之前,每个head的计算公式可以表示为: h e a d = A t t e n t i o n ( X W Q , P K ⊕ X W K , P V ⊕ X W V ) head = Attention(XW^Q,P^K⊕ XW^K, P^V⊕ XW^V) head=Attention(XWQ,PKXWK,PVXWV) 其中Attention代表原始的注意力操作,⊕ 表示矩阵拼接,PK,PV是(L*H),L代表前缀向量的长度,一般在10-100之间,可以根据任务场景调整。为了更好的优化前缀向量,研究者提出了一种重参数化的技巧,引入了一个多层感知机的映射函数 P = M L P θ ( P ′ ) P=MLP_\theta(P') P=MLPθ(P).重参数化技巧可以将较小的矩阵映射到前缀参数矩阵,而不是直接优化前缀,这一技巧对稳定训练很有帮助。经过优化后,映射函数将被舍弃,只保留最终得到的前缀参数𝑷 来增强特定任务的性能。在前缀微调中,整个模型中只有前缀参数会被训练,因此可以实现参数高效的模型优化。
      在这里插入图片描述
  3. 提示微调

    1. P-tuning,Prompt Tuning.
    2. 提示微调仅在输入嵌入层中加入可训练的提示向量。首先在输入文本端插入一组连续嵌入数值的提示词元,这些词元可以自由形式或前缀形式来增强输入文本,用于解决特定的下游任务。在具体实现中,只需要将可学习的特定任务提示向量与输入文本向量结合起来一起输入到语言模型中。
    3. P-tuning 提出了使用自由形式来组合输入文本和提示向量,通过双向LSTM来学习软提示词元的表示,它可以同时使用于自然语言理解和生成任务。
    4. Prompt Tuning 以前缀形式添加提示,直接在输入前拼接连续型向量。
    5. 在提示微调的训练过程中,只有提示的嵌入向量会根据特定任务进行监督学习,然而由于只在输入层中包含了极少量的可训练参数,有研究工作表明该方法的性能高度依赖底层语言模型的能力。
      在这里插入图片描述

4. 与预训练的区别

指令微调代码与预训练代码 高度一致,区别主要在于指令微调数据集的构建SFTData 和序列到序列损失的计算DataCollatorForSupervisedDataset.

  • 使用与下游任务更接近的指令能够带来更大的提升。
  • 提高指令复杂性和多样性能够促进语言模型性能的提升
  • 更大的参数规模有助于提升模型指令遵循能力。

5. 实践经验

  1. QLoRA + FlashAttention 更省资源

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

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

相关文章

【跨链机制】哈希锁定原理

随着区块链多年来的发展&#xff0c;在区块链生态中已经形成了不同特性的区块链网络&#xff0c;这些网络之间存在着一定的隔离和孤立性。为了打破这种局面&#xff0c;跨链技术应运而生&#xff0c;促进了区块链间的数据流通和价值交换。目前&#xff0c;主流的跨链机制包括公…

电路学习——经典运放电路之滞回比较器(施密特触发器)(2024.07.18)

参考链接1: 电子设计教程29&#xff1a;滞回比较器&#xff08;施密特触发器&#xff09; 参考链接2: 滞回比较器电路详细分析 参考链接3: 比较器精髓&#xff1a;施密特触发器&#xff0c;正反馈的妙用 参考链接4: 比较器反馈电阻选多大&#xff1f;理解滞后效应&#xff0c;轻…

Kafka之存储设计

文章目录 1. 分区和副本的存储结构1. 分区和副本的分布2. 存储目录结构3. 文件描述 2. 相关配置3. 数据文件类型4. 数据定位原理LogSegment 类UnifiedLog 类 5. 副本数据同步HW水位线LEO末端偏移量HW更新原理 6. 数据清除 1. 分区和副本的存储结构 在一个多 broker 的 Kafka 集…

如何学习Linux:糙快猛的大数据之路( 只讲大数据开发用到的)

引言 还记得第一次面对Linux命令行时的茫然吗&#xff1f;黑乎乎的终端&#xff0c;闪烁的光标&#xff0c;还有那些看起来像外星文的命令。 作为一个从0基础开始跨行到大数据领域的开发者&#xff0c;我深深体会到了学习Linux的重要性和挑战。今天&#xff0c;我想和大家分享…

谷粒商城实战-Vue学习过程中踩坑记录

一&#xff0c;自闭合的<script>标签 第一次使用Vue&#xff0c;按照步骤引入vue.js&#xff0c;创建div&#xff0c;创建Vue对象&#xff0c;但是未达预期效果。 插值表达式{{name}}没被替换为data对象中的属性值。 F12看了下网页源代码&#xff0c;发现创建Vue对象的…

计算机组成原理面试知识点总结1

#ウルトラマンゼット&#xff08;泽塔&#xff09; 1 计算机发展历程 1.1 计算机的硬件发展 电子管时代晶体管时代中小规模集成电路时代超大规模集成点电路时代 元件更新变化&#xff1a; 摩尔定律&#xff1a;18 个月晶体管翻一倍半导体存储器不断发展微处理器不断发展 1.2…

适合学生的护眼台灯哪个牌子最好?学生护眼台灯十大排名名单

适合学生的护眼台灯哪个牌子最好&#xff1f;作为一名当代的学生&#xff0c;经常会出现长时间用眼的情况&#xff0c;但是这种状况是难以改变的&#xff0c;我国的学习教育一直都在“内卷”&#xff0c;学生课业重&#xff0c;每日的夜间学习更是成了孩子的家常便饭&#xff0…

数据结构之字符串的最长公共子序列问题详解与示例(C,C++)

文章目录 1、最长公共子序列定义2、动态规划解法3、状态转移方程初始化构建最长公共子序列 4、C 和 C 实现示例C 语言实现C 语言实现 5、总结 字符串的最长公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;是计算机科学中的一个经典问题&#xff0c;属于动态…

08、Tomcat 部署及优化

8.1 Tomcat概述 8.1.1 Tomcat介绍 自从 JSP 发布之后,推出了各式各样的 JSP 引擎。Apache Group 在完成 GNUJSP1.0的开发以后&#xff0c;开始考虑在 SUN 的 JSWDK 基础上开发一个可以直接提供 Web 服务的 JSP服务器&#xff0c;当然同时也支持 Servlet, 这样 Tomcat 就诞生…

函数(递归)

递归&#xff1a;程序调用自身编程技巧称为递归。 在学习递归前需要粗略的了解一下内存&#xff0c;内存分为三类&#xff0c;分别是栈区、堆区和静态区。对于栈区来说&#xff0c;每调用一次函数都会为本次函数开辟一块空间&#xff0c;然而栈区也是有空间限制的&#xff0c;随…

GCN知识总结

关键点&#xff1a; 1.理解图结构的形式 2.如何使用邻接矩阵实现其图结构形式 3.GCN卷积是如何实现节点特征更新的 核心公式&#xff1a; 特征提取&#xff1a; 处理好的x 代表节点特征&#xff0c;然后*权重&#xff0c;再*邻接。 A尖换元后&#xff1a; forward函数 传播规则…

基于SpringBoot+Vue的篮球竞赛预约平台(带1w+文档)

基于SpringBootVue的篮球竞赛预约平台(带1w文档) 基于SpringBootVue的篮球竞赛预约平台(带1w文档) 本系统提供给管理员对首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;项目分类管理&#xff0c;竞赛项目管理&#xff0c;赛事预约管理&#xff0c;系统管理等诸多功…

C++中的模板函数和模板类

模板是 C 中的泛型编程的基础&#xff0c;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。 作为强类型语言&#xff0c;C 要求所有变量都具有特定类型&#xff0c;由程序员显式声明或编译器推导。 但是&#xff0c;许多数据结构和算法无论在哪种类型上操作&#x…

【Java开发实训】day05——数组常见算法

目录 一、数组翻转 1.1示例代码 1.2适用场景 二、冒泡排序 2.1示例代码 2.2适用场景 三、二分查找 3.1示例代码 3.2适用场景 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo…

Elasticsearch中任务管理怎么做?

一个ES集群研发在清理数据时使用了delete_by_query&#xff0c;导致集群性能严重受影响&#xff0c;影响了正常的业务。为了快速恢复集群正常状态&#xff0c;考虑把还在进行的delete_by_query任务清除掉。 先查看当前集群的任务 GET _cat/tasks?v发现delete_by_query的任务…

Git笔记:(上传Git、Git获取文件版本、删除、统计)

目录 一、上传文件到github 1.1 配置用户名和邮箱 1.2 初始化本地仓库 1.3 添加项目目录下所有文件至本地仓库 1.4 使用如下命令加入注释提交 1.5 将本地仓库与远程仓库相连接 1.6 将本地仓库中的文件推送至指定的远程仓库中 二、git获取不同版本 2.1 git下载特定历史…

[MySQL]02 存储引擎与索引,锁机制,SQL优化

Mysql存储引擎 可插拔式存储引擎 索引是在存储引擎底层上实现的 inno DB MySQL默认存储引擎: inno DB高可靠性和高性能的存储引擎 DML操作遵循ACID模型支持事务行级锁,提高并发访问性能支持外键 约束,保证数据完整性和可靠性 MySAM MySAM是MySQL的早期引擎 特点: 不支持事…

【数据结构_C语言】归并排序—文件类型

文章目录 1.排序定义2. 代码实现 1.排序定义 内排序&#xff1a;数据量相对少一些&#xff0c;可以放到内存中排序。 外排序&#xff1a;数据量较大&#xff0c;内存中放不下&#xff0c;数据放到磁盘文件中&#xff0c;需要排序。 归并排序&#xff1a; 2. 代码实现 void…

基于CNN-BiLSTM的数据回归预测

代码原理 基于CNN-BiLSTM的数据回归预测是一种结合卷积神经网络&#xff08;CNN&#xff09;和双向长短期记忆网络&#xff08;BiLSTM&#xff09;的混合模型&#xff0c;用于处理和预测时间序列数据。以下是该方法的简单原理及流程&#xff1a; 原理 &#xff08;1&#xf…

OSGB整体或自定义区域转换为3DTiles

工具 OSGB源数据灵易智模倾斜摄影编辑平台(下称OPEditor) 操作步骤 打开倾斜摄影 打开软件&#xff08;登录即注册&#xff0c;直接用手机号登录&#xff09;使用OPEditor打开OSGB原始倾斜数据&#xff0c;将会看到如下页面 整体导出为3DTiles 在右侧节点树上鼠标右键点…