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

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.mzph.cn/web/49444.shtml

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

相关文章

使用flutter做圆形进度条 (桌面端)

前言 最近收到一个需求&#xff0c;需要使用flutter 来做一个圆形进度条&#xff0c;这可难倒我了&#xff0c;毕竟我是做前端的&#xff0c;flutter 之前接触的也少&#xff0c;但没办法&#xff0c;既然需求有了&#xff0c;也得硬着头皮上了&#xff0c;先来看看做的效果。…

C语言-TCP通信创建流程

TCP通信创建流程 1. 客户端创建TCP连接 在整个流程中, 主要涉及以下⼏个接⼝socket() : 创建套接字, 使⽤的套接字类型为流式套接字connect() : 连接服务器send() : 数据发送recv() : 数据接收创建套接字 首先&#xff0c;我们需要创建套接字&#xff0c;套接字是通信的基础…

构建查询洞察 UI

本文字数&#xff1a;2631&#xff1b;估计阅读时间&#xff1a;7 分钟 作者&#xff1a;Bucky Schwarz 本文在公众号【ClickHouseInc】首发 我们最近发布了 Query Insights 的初步实现&#xff0c;为 ClickHouse Cloud 用户提供了一种便捷的方法来查看和解释查询日志。该功能对…

MySQL索引、事务(数据库管理与高可用)

一、索引的概念 索引&#xff1a;排序的列表&#xff0c;对数据进行快速的查询&#xff1b; 针对不同的产品需求&#xff0c;或者不同的数据库结构&#xff0c;会创建不同的索引&#xff1b; 1&#xff1a;普通索引&#xff08;默认索引&#xff09; 2&#xff1a;唯一索引…

推荐一个酷炫高逼格的服务器探针的监控工具,免费开源(附源码)

背景 作为一名攻城狮&#xff0c;面对各种服务器内存飙高、CPU猛增、磁盘打满等等服务器问题&#xff0c;可谓是伤透了我们的心。 不仅要开发&#xff0c;还要处理这些问题&#xff0c;大把的时间浪费了&#xff0c;这时候一个好的全面的监控工具尤为重要了。 所以&#xff…

C++基础知识:函数重载相关注意事项:1.引用作为重载条件,2.2.函数重载遇见函数默认参数。

1.引用作为重载条件 #include<iostream>using namespace std;//1.引用作为重载的条件 //int 和 const int 类型不同&#xff0c;所以可以作用重载条件 void fn(int &a) //int &a10;不合法 //10放在了常量区&#xff0c;而引用要么在栈区&#xff0c;要么在堆区{…

Unity打包设置

1.Resolution and Presentation (分辨率和显示) Fullscreen Window (全屏窗口): 应用程序将以全屏窗口模式运行&#xff0c;但不会独占屏幕。适用于想要全屏显示但仍需访问其他窗口的情况。 Resizable Window (可调整大小的窗口): 允许用户调整应用程序窗口的大小。适用于窗口…

保险丝(常见元器件及电路基础知识)

分类&#xff1a;简单分为熔断式和非熔断式 电压&#xff1a;保险丝的额定电压是指它的公称额定电压, 通常就是保险丝断开后能够承受的最大电压值保险丝通电时两端所承受的电压大大小于其额定电压&#xff0c;因此额定电压基本上无关紧要。 电流&#xff1a; PFC为功率因数矫…

昇思25天学习打卡营第三十四天|Jack578

昇思25天学习打卡营第三十四天|Jack578 一、数据集Dataset&#xff08;一&#xff09;数据集加载&#xff08;二&#xff09;数据集迭代&#xff08;三&#xff09;数据集常用操作 一、数据集Dataset 数据是深度学习的基础&#xff0c;MindSpore提供基于Pipeline的数据引擎&am…

项目管理中的常用工件(二):可视化工件

项目管理中的常用工件&#xff08;二&#xff09;&#xff1a;可视化工件 亲和图&#xff08;affinity diagram&#xff09;因果图&#xff08;cause-and-effect diagram&#xff09;直方图&#xff08;histogram&#xff09;流程图&#xff08;flowchart&#xff09;散点图&am…

[练习]如何使用递归算法?

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1. 递归概述 2.汉诺塔问题 题目描述​编辑 题解 代码实现 3…

mac M1安装Roop教程及所遇到的问题

1.安装miniconda&#xff0c;下载地址&#xff1a; 按 Python 版本划分的最新 Miniconda 安装程序链接&#xff1a;https://docs.anaconda.com/miniconda/miniconda-other-installer-links/ 下载后直接默认安装即可。 我用的是&#xff1a;Python3.10对应的Miniconda 2.下载…

7月26日JavaSE学习笔记

反射 Java是面向对象的&#xff0c;有对象必须先有类&#xff0c; 有static修饰类的属性和方法&#xff1b;在Java中存储了类的内容&#xff0c;这个内容也应该是一个对象&#xff1b;Java中每一个用到的类都会加载一块内存&#xff0c;这每一块内存都是一个对象&#xff1b;这…

php+bootstrap 编写简易的步骤进度条

个人笔记记录&#xff0c;步骤进度条。 版本一&#xff1a; 初始版本&#xff0c; 当前版本单纯的根据bootstrapCSS进行完成的简易版本。这个比较简单 样式我放在了最底下。 <div class"form-group steps"><div class"steps-height"><di…

txt格式单词导入有道词典生词本 (java代码方式)

txt格式单词导入有道词典生词本 (java代码方式) 首先要求txt文档里单词的格式&#xff0c;大概需要像这种&#xff1a; 每行是一个单词&#xff0c;格式为&#xff1a;英文单词空格词性单词意思。 注意 导出单词本的名字就是你 txt 文件的名字 我这里是 公共英语三级 单词本 …

IAR使用调试详解

目录 1 IAR功能介绍 1.1 File文件菜单 1.2 Edit编辑菜单 1.3 View视图菜单 1.4 Projcet工程菜单 1.5Debug调试菜单 1.6 Disassembly反汇编菜单 1.7 Simulator下载调试工具 1.8 Tools工具菜单 1.9 Window窗口菜单 1.10 Help帮助菜单 2 IAR设置 2.1 插入/编辑模板 2…

如何选择最佳的云盘检测方案?

橡胶密封圈是一种用于填塞、密封或隔离物体之间空隙的圆形零件&#xff0c;通常由橡胶或类似材料制成。这些密封圈通常用于工程、机械或汽车领域&#xff0c;以防止液体、气体或其他物质泄漏。 橡胶密封圈通常对多种化学物质具有良好的耐腐蚀性能&#xff0c;使其适用于各种环…

一些关于颜色的网站

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 1、中国传统色 2、网页颜色选择器 3、渐变色网站 4、多风味色卡生成 5、波浪生成 6、半透明磨砂框 色卡组合

T-CNN——利用张量 CNN 增强缺陷检测

1. 摘要 缺陷检测是制造业中一个重要而具有挑战性的问题。本研究引入了张量卷积神经网络&#xff08;T-CNN&#xff09;&#xff0c;并在罗伯特-博世制造工厂生产的超声波传感器组件缺陷检测的实际应用中验证了其性能。与同类 CNN 模型相比&#xff0c;作者的量子启发 T-CNN 通…

【后端开发实习】Python基于Quart框架实现SSE数据传输

Python基于Quart框架实现SSE数据传输 前言SSE简介理论分析代码实现 前言 在类似Chatgpt的应用中要实现数据的流式传输&#xff0c;模仿实现打字机效果&#xff0c;SSE是不二之选。传统的Flask框架不能满足异步处理的要求&#xff0c;没有异步处理就很难实现实时交互的需求&…