当前位置: 首页 > article >正文

组会 | 大语言模型 + LoRA

目录

    • 1 大语言模型概述
      • 1.1 模型的架构
      • 1.2 模型的细节:标记化和嵌入化
      • 1.3 模型的核心
    • 2 多头注意力机制
    • 3 LoRA 概述
      • 3.1 冻结部分模型参数
      • 3.2 低秩适配(LoRA)
        • 3.2.1 核心工作原理:冻结模型参数
        • 3.2.2 核心工作原理:添加低秩权重矩阵
      • 3.3 QLoRA


⚠️ 本博客仅记录了组会里提及的内容



1 大语言模型概述

1.1 模型的架构

在这里插入图片描述

模型的训练过程包含以下步骤:

  1. 标记化:将文本划分为更小的片段,即标记,便于模型处理;
  2. 嵌入化:将标记转换为向量,以捕捉语义信息;
  3. 前向传播:向量在模型中逐层传递并计算输出,直到生成最终的预测值;
  4. 计算损失:使用损失函数计算预测值与真实值之间的差距;
  5. 反向传播:根据链式法则,计算损失函数相对于模型中每个参数的梯度;
  6. 优化器:根据计算出的梯度以及所采用的策略来更新模型的参数;
  7. 训练迭代:模型多次遍历数据,每次遍历称为一个 epoch,如此循环直至训练收敛。


1.2 模型的细节:标记化和嵌入化

在这里插入图片描述

标记化的步骤包括:

  1. 将输入文本分解为单个句子;
  2. 将句子进一步分解为标记,即一个小而有意义的单位。

说明:可以根据实际任务需求设置 “标记” 的大小,即它不仅可以是单词,还可以细分到标点,甚至是字母。

嵌入化的步骤包括:

  1. 将标记映射到词汇字典中的唯一 ID;
  2. 将 ID 转换为模型可以理解的向量。

注意:正如上周组会所提到的,Embedding 的过程中需要考虑上下文语境。比如,我们希望使用不同的向量来表示 “an apple and an orange” 和 “an apple phone” 中的 “apple” 一词,这是因为 “apple” 在两个句子中的语义不同。



1.3 模型的核心

语言模型的核心由编码器、解码器和注意力机制组成:

  • 编码器:处理输入文本并生成丰富的语义表示;
  • 解码器:利用编码器的表示生成输出文本,通常以自回归方式逐步预测;
  • 注意力机制:帮助模型在生成输出文本时,关注于输入文本中最相关的部分。

我的理解:编码器负责转换为模型理解的形式,解码器负责转换为人类理解的形式。



2 多头注意力机制

这里回顾多头注意力机制,貌似是因为 LoRA 从中汲取了灵感 😇

在这里插入图片描述

先计算每个头,公式如下:

h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) head_i=\mathrm{Attention}(QW_i^Q, KW_i^K, VW_i^V) headi=Attention(QWiQ,KWiK,VWiV)

再拼接所有头,公式如下:

M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d n ) W O \mathrm{MultiHead}(Q,K,V)=\mathrm{Concat}(head_1,...,head_n)W^O MultiHead(Q,K,V)=Concat(head1,...,headn)WO

我们可以通过牺牲模型的表达能力,来换取更快的计算速度。

上图将 Q Q Q K K K 分成四部分,而我们可以只将 Q Q Q K K K 分成两部分。虽然 Q i Q_i Qi K i K_i Ki 的个数减少了,但通过与个数保持不变的 V i V_i Vi 相乘,仍然可以保持 h e a d i head_i headi 的个数保持不变。如下图所示:

在这里插入图片描述

我的理解:本质上是减少了 W i Q W_i^Q WiQ W i K W_i^K WiK 的个数。



3 LoRA 概述

3.1 冻结部分模型参数

之所以介绍本小节内容,是因为 LoRA 有用到

  • 目的:优化内存使用
  • 含义:冻结参数在模型训练过程中不会参与更新
  • 该方式使得我们无需保存冻结参数的梯度,从而减少 GPU 内存的使用

例如,我们可以只保留 Transformer 中最后的线性层作为可训练部分,如下图所示:

在这里插入图片描述
虽然该方法减少了内存占用并加快了训练速度,但也限制了模型的表达能力和性能。



3.2 低秩适配(LoRA)

  • 全称:Low-Rank Adaptation
  • 作用:是一种高效的微调方法,旨在减少内存占用和计算资源,同时保持良好的性能表现

3.2.1 核心工作原理:冻结模型参数
  • 在使用 LoRA 时,预训练模型的所有参数将被冻结,即这些参数在微调过程中不会被更新;
  • 其目的是减少内存占用,同时保留预训练模型所具备的知识。

3.2.2 核心工作原理:添加低秩权重矩阵
  • 含义:在模型的某些 “冻结模型参数” 矩阵上,添加一个新的、可训练的低秩矩阵;
  • 其中低秩矩阵是两个较小的矩阵 A A A B B B 的乘积结果,即: Δ W = A × B \Delta W=A\times B ΔW=A×B
  • 由于矩阵 A A A B B B 的维度较小,因此能够显著减小可训练参数的数量。

在这里插入图片描述

上图中超参数 r r r 的取值为 8 8 8

超参数: r r r B e t a = A l p h a / r \mathrm{Beta}=\mathrm{Alpha}/r Beta=Alpha/r

B e t a \mathrm{Beta} Beta 参数的作用:

  • 使得模型能够学习对新领域的适配方法,同时又不会偏离原始模型太远;
  • 防止过拟合,同时避免遗忘预训练模型已经学到的知识。

GPT:Beta 参数用于控制低秩矩阵对原始模型输出的影响程度。如果 Beta 值较大,那么低秩矩阵的影响会更显著;如果 Beta 值较小,那么其影响则会减弱。



3.3 QLoRA

  • QLoRA 在 LoRA 的基础上,进一步对模型参数进行了量化;
  • 即在微调前,将模型参数从高精度(如 float32 或 float16)量化到低精度(如 float8 或更低);
  • 该方法大幅减少了模型的内存占用,同时保持了较高的计算效率。



http://www.kler.cn/a/412695.html

相关文章:

  • 【前端】JavaScript中的字面量概念与应用详解
  • 自定义协议
  • 【机器学习】如何使用Python的Scikit-learn库实现机器学习模型,并对数据进行预处理和特征缩放以提高模型性能?
  • vue3项目部署在阿里云轻量应用服务器上
  • 基于Kubernetes编排部署EFK日志收集系统
  • C++ 二叉搜索树(Binary Search Tree, BST)深度解析与全面指南:从基础概念到高级应用、算法优化及实战案例
  • chrome允许http网站打开摄像头和麦克风
  • C++优质学习资源汇总
  • 【开源项目】ChinaAddressCrawler 中国行政区划数据(1980-2023年)采集及转换(Java版),含SQL格式及JSON格式
  • python+django自动化部署日志采用‌WebSocket前端实时展示
  • 第76期 | GPTSecurity周报
  • 23种设计模式-生成器(Builder)设计模式
  • 解决首次加载数据空指针异常
  • scp比rz sz传文件更好
  • 海康VsionMaster学习笔记(学习工具+思路)
  • faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-6
  • C#面向对象,封装、继承、多态、委托与事件实例
  • Linux环境实现c语言编程
  • Linux介绍与安装指南:从入门到精通
  • 【Kubernetes 指南】基础入门——Kubernetes 简介(一)
  • 鸿蒙手势密码
  • Java入门:17.正则表达式,String的intern方法,StringBuilder可变字符串特点与应用,+连接字符串特点--001
  • 循环神经网络(RNN)在自然语言处理(NLP)中的应用
  • MySQL【11】事务
  • 【简单好抄保姆级教学】javascript调用本地exe程序(谷歌,edge,百度,主流浏览器都可以使用....)
  • Git 进程占用报错-解决方案