一、简介
预训练大语言模型(LLM)具备强大的通用能力,但在需要深入理解技术语言或特定领域知识的专业领域中,它们往往表现不佳。因此,虽然预训练使LLM能够捕捉通用知识,但微调(Fine-tuning)对于将这些模型适应特定领域至关重要。
微调通过将预训练模型适配到具体任务,提升了其在医疗、法律分析或科学研究等领域的性能。例如,经过微调的模型能够更有效地识别领域特定术语,推理复杂关系,并提供更准确且符合语境的响应。
传统上,微调通常涉及更新模型的所有参数。如今,大型语言模型通常拥有数十亿个参数,因此传统的微调方法需要消耗大量的计算和存储资源。
此外,部分云端托管的大语言模型(如ChatGPT、Gemini等)定期使用新数据更新参数。这使得下游用户不得不在每次模型更新后重新对更新后的模型进行重复微调。这一过程会消耗大量的时间和计算资源,显然在应用上是不现实的。
针对上述挑战,本文分享三篇相关研究:LoRA、Q-LoRA和PortLLM。LoRA通过矩阵分解巧妙地降低了微调阶段的计算成本;Q-LoRA提出通过4位量化的预训练模型传播LoRA的梯度,进一步提升了效率;PortLLM在LoRA的基础上引入一种类似知识迁移的机制,使得微调阶段的模型参数增量可以在不同版本的模型间移植。
二、LoRA (Low-Rank Adaption)
LoRA通过对特征矩阵进行低秩分解为两个低秩矩阵的乘积,在训练过程中只对分解后的低秩矩阵进行更新,从而降低了可训练的参数量。
2.1.更新矩阵的低秩分解
神经网络包含许多执行矩阵乘法的密集层。这些层中的权重矩阵通常具有满秩。过去的工作指出,在适应特定任务时,预训练语言模型具有较低的“内在维度”,即使在随机投影到较小的子空间中时,仍能高效学习。受此启发,我们假设在适应过程中,权重更新也具有较低的“内在秩”。
对于预训练的权重矩阵,对其更新进行低秩分解, 从而,其中,且秩。在训练过程中,被冻结,不接收梯度更新,而和包含可训练的参数。对于前向传播,LoRA将其修改为:
2.2. 将LoRA应用到Transformer中
原则上,LoRA可以应用到神经网络中的任何权重矩阵,以减少可训练参数的数量。在Transformer架构中,自注意力模块中有四个权重矩阵(、、、), MLP模块中有两个权重矩阵,将(或、)视为一个维度为的单一矩阵。为了简化和参数效率,本文仅调整注意力权重以用于下游任务,并冻结MLP模块。
2.3. 实验效果
本文基于以下实验验证了LoRA方法:
- RoBERTa Base/Large实验:在GLUE基准8项任务中,以0.3M/0.8M参数量取得87.2/89.0平均分,提升参数效率(仅为全微调的0.1%-1%),达到或超越全微调性能。
- DeBERTa XXL实验:针对1.5B大模型,仅用4.7M参数(全微调0.3%)取得91.3平均分,提升训练效率,证明大模型场景下的参数高效性。
- GPT-2生成实验:在E2E NLG任务中,以0.35M/0.77M参数使BLEU达70.4/媲美全微调,提升生成质量与训练速度,节省99%显存开销。
- GPT-3 175B扩展实验:以4.7M参数(全微调0.01%)在WikiSQL、MNLI等任务中匹配或超越全微调,提升部署灵活性,内存需求降低3倍且无推理延迟。
LoRA在各类模型(RoBERTa、DeBERTa、GPT-2/3)和任务(NLU、NLG)中,以极低参数量(全微调的0.01%-1%)实现与全微调相当或更优的性能,同时显著降低计算和存储成本。
三、QLoRA(Quantized Low-Rank Adapters)
QLoRA是一种高效微调方法,能够在极低内存消耗下(单块48GB GPU)微调超大规模语言模型(如65B参数),同时保持与16位全精度微调相当的性能。
QLoRA的主要提出三种优化策略:
- 4位标准浮点数量化(4-bit NormalFloat Quantization);
- 双重量化(Double Quantization);
- 分页优化(Paged Optimizer)。
3.1. 4位标准浮点数量化
NormalFloat (NF,标准浮点数)是一种数据类型,它基于分位数量化(Quantile quantization),是一种信息论上最优的数据类型,可以确保每个量化区间从输入张量中分配相同数量的值。分位数量化通过经验累积分布函数估计输入张量的分位数来工作。分位数量化的主要局限性在于分位数估计的这个过程会比较费力。
在神经网络中,预训练的权重通常具有零中心的正态分布,标准差为σ。通过缩放σ,可以使得分布恰好适应NF的范围。对于NF,作者设置了一个任意的范围[-1, 1]。因此,数据类型和神经网络权重的分位数都需要被归一化到这个范围。
对于范围在[-1, 1]内的零均值正态分布,QLoRA计算信息理论上最优的数据类型。方法如下:
- 估计理论N(0, 1)分布的个分位数,得到一个k位的分位数量化数据类型;
- 将这个NF的值归一化到[-1, 1]范围;
- 通过绝对最大值重标定,将输入权重张量归一化到[-1, 1]范围,然后进行量化。
之后,按如下方式估计数据类型的个值:
3.2.双重量化
由于4位标准浮点量化保存模型时我们不仅要保存量化后的结果,还要保存每个块的量化常数,从而造成了额外的内存占用。因此引入双重量化对量化常数进行量化以进一步节省内存。
QLoRA的双重量化就是对这个量化常数再做一次8bit的量化,在进行量化常数的量化时,QLoRA以每256个量化常数为一组再做一次量化。因此它额外增加的内存消耗有两部分组成,一部分是量化后的8bit的第一层的量化常数,第二部分是为量化常数做量化的第二层的32bit的量化常数。双重量化的每次量化几乎不增加额外的内存占用。
3.3. 分页优化
分页优化是针对梯度检查点做的进一步优化,以防止在显存使用峰值时发生显存OOM的问题。
QLoRA分页优化借鉴了操作系统内存分页调度策略,将保存的部分检查点转移到CPU内存上,以节省对显存的使用。
3.4. QLoRA
使用上述组件,我们为量化基础模型中的单个线性层定义QLORA,如下所示:
其中定义为:
四、PortLLM
PortLLM提供了一种无需训练的框架,这个框架基于最初的预训练模型进行微调以获得微调后的参数变化(模型补丁),并将模型补丁应用于后续更新的预训练模型以节约微调成本。
4.1 假设
如下图所示,PortLLM将预训练的大语言模型的第一个版本记为, 其后续的更新预训练版本记为。类似地,使用表示基于第一个大模型版本微调得到的模型,表示基于更新后的预训练模型微调后得到的模型。两个微调过程的模型补丁记为和, 而预训练模型演进的参数增量。为方便表示,称和为个性化适配器,和为继续预训练适配器。
**假设:**个性化适配器和的秩远小于继续预训练适配器和的秩:
4.2 基本方法
PortLLM旨在通过将较旧的个性化适配器(模型补丁)应用于继续预训练模型,来近似微调后的更新模型,即
换句话说,可以将先前微调过程中的额外知识直接添加到最新的LLM中,从而以极低的成本取得与基于最新的模型微调得到的模型接近的效果。
4.3 PortLLM可移植性分析
理论依据:经过微调的更新模型可以分解为一个朴素更新项和一个残差矩阵C,如下所示:
由于4.1中的假设:个性化适配器和的秩远小于继续预训练适配器和的秩,其次确保了, 基于上述原因,容易得出结论:残差矩阵的秩远小于朴素更新矩阵的秩。
我们声称残差矩阵与朴素更新相比可以忽略不计。证明:首先,回顾第3.2节中的假设,即∆θ′_i和∆θi的秩远小于∆θ的秩。其次,θ′ = θ + ∆θ确保了rank(θ′) ≥ rank(θ)。因此,我们得出结论:残差矩阵的秩远小于朴素更新矩阵的秩。
实验验证:如下图所示,朴素更新项是残差矩阵的66-136倍。因此可以验证结论残差矩阵相较于朴素更新可以忽略不计。
4.4 实验结果
上图为PortLLM与传统方法在不同下游任务上的Zero-shot对比实验,通过实验结果表明PortLLM的模型补丁能够在不同模型版本之间传递个性化知识,并且取得了与传统方法相当的准确率。
上图为PortLLM的计算效率实验,相较于传统方法,PortLLM无需可训练参数,减少了近2000万个训练参数量,把操作时间从微调所需的数小时缩短到几秒钟。而且PORTLLM方法即插即用,减少了对昂贵云基础设施的需求,尤其是在大规模微调场景中。
五、总结
本文介绍了三种高效微调大语言模型的方法,旨在解决传统微调中高计算和存储成本的问题:
- LoRA:通过低秩矩阵分解,仅更新少量参数(全微调的0.01%-1%),在多项任务中达到或超越全微调性能,显存需求降低3倍且无推理延迟。
- Q-LoRA:结合4位量化、双重量化和分页优化,单卡即可微调650亿参数模型,内存节省75%且性能无损。
- PortLLM:提出“模型补丁”概念,将旧版模型的微调增量直接迁移到新版预训练模型,实现零训练参数、秒级适配,准确率与重新微调相当。
实验表明,这些方法在医疗、法律等下游任务领域显著降低模型微调成本,为低成本、高效率的模型微调提供了实用方案。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。