一、LoRA 简介
LoRA,即低秩适应(Low-Rank Adaptation),是一种用于微调大型语言模型的技术,旨在以较小的计算资源和数据量实现模型的快速适应特定任务或领域。
LoRA 方法通过引入低秩近似的思想,对大型预训练语言模型的部分权重进行高效且轻量级的调整。在大型语言模型中,权重矩阵通常是高维且密集的,包含大量参数。LoRA 引入低秩矩阵,这些矩阵更小、更简单,但仍然能够捕获新任务所需的基本变化。例如,假设模型有一个 100 行 100 列的矩阵,需要存储 10000 个数字,而 LoRA 将矩阵分解成一个 1000x2 矩阵和一个 2x100 矩阵,只有 400 个数字需要存储,大大减少了参数量。
LoRA 主要对 Stable Diffusion 模型中最关键的交叉注意力层进行小的修改。研究人员发现,微调这部分模型就足以实现良好的训练。通过在交叉注意力层的权重矩阵中引入低秩矩阵,LoRA 可以在不显著影响模型性能的前提下,降低模型的存储需求和计算成本。
LoRA 的优势在于其高效性和灵活性。通过使用更少的参数,LoRA 显著降低了模型训练过程中的计算复杂性和显存使用量,使得在消费级 GPU 上训练大模型成为可能。同时,LoRA 可以提升模型的泛化性,防止在训练数据有限场景下的过拟合现象。此外,LoRA 可以无缝地集成到现有的神经网络架构中,以最小的额外训练成本对预训练模型进行微调和调整,非常适合迁移学习应用。
二、工作原理与关键技术要点
(一)低秩矩阵注入
在大型语言模型中,通常会在 Transformer 的注意力层等特定层引入一对低秩矩阵。以一个大型语言模型为例,假设其权重矩阵原本具有极高的维度,比如一个 的矩阵,直接微调整个模型所需的参数量巨大。而 LoRA 引入的低秩矩阵,矩阵 为 ,矩阵 为 ,其中秩 远小于基本矩阵维度 和 。这样一来,构建的参数量就大大减少了。比如,当原权重 的参数量为 时,若选择 LoRA 的秩 为 4,那么 和 的参数量均为 ,二者之和为 ,仅需训练 的参数就可以更新参数矩阵。
(二)微调过程
在微调阶段,LoRA 只训练低秩矩阵的参数,原模型的其他部分权重保持不变。通过在特定任务的数据集上对这些少量额外参数进行训练,可以引导模型有针对性地学习任务相关的语言模式和知识。比如在绘画应用 stable diffusion 中,LoRA 以插件的形式嵌入模型中,使得用户可以下载相对于原模型(GB 量级)更小的 LoRA 模型(MB 量级),从而达到调整生成图像风格的效果。在语言大模型 ChatGPT - 3 中,LoRA 可以优化它在特定领域的表现,如代码调试、法律咨询等领域。
(三)内存效率与计算效率
由于只需要训练一小部分参数,LoRA 在微调过程中显著降低了内存需求和计算成本。以 GPT - 3 175B 模型为例,原先需要 1.2TB 的显存才可以训练,使用 LoRA 后只需要 350GB 即可。当 设置为 4,且只调整 query 和 value 矩阵时,需要的显存进一步从 350GB 降至 35MB。在推理阶段,这些低秩矩阵可以在运行时动态地与原模型权重相加或相乘,无需改变模型结构或重新存储整个模型,进一步节省了资源。
三、应用与扩展
(一)NLP 任务应用
在自然语言处理任务中,LoRA 表现出了强大的适应性和高效性。例如,在文本分类任务中,使用 LoRA 微调的模型能够快速适应不同的分类需求,同时在减少大量参数的情况下,性能仅下降了极小的幅度。研究表明,在某些大规模文本分类数据集上,LoRA 微调后的模型在减少 90% 参数的情况下,性能仅下降了不到 1%。
在问答任务中,LoRA 可以通过微调预训练模型,使其更好地理解特定领域的问题,并给出更准确的答案。比如在医疗领域的问答系统中,通过对预训练语言模型进行 LoRA 微调,可以让模型更好地理解医学术语和病症描述,从而提高回答的准确性和专业性。
此外,LoRA 还可以与其他 NLP 技术结合,进一步提升模型性能。例如,与知识图谱结合,利用知识图谱中的实体和关系信息,引导 LoRA 微调过程,使模型在回答问题时能够更好地利用外部知识。
(二)插件式微调策略
LoRA 的插件式微调策略为用户提供了极大的便利。用户可以根据不同的任务需求,选择合适的预训练模型,并通过 LoRA 快速进行定制化调整。
这种插件式的设计使得模型的定制化过程更加灵活和高效。例如,当用户需要针对特定的文学作品进行分析时,可以选择一个通用的语言模型,然后使用 LoRA 对其进行微调,使其更好地理解该作品的风格和主题。
同时,LoRA 的插件式策略也使得模型的更新和维护更加容易。当新的任务出现或者数据发生变化时,用户可以只对 LoRA 部分进行调整,而无需重新训练整个模型。
总之,LoRA 的插件式微调策略为大型语言模型的应用提供了一种高效、灵活的解决方案,使得更多的用户能够在有限的资源下利用大型语言模型的强大能力。
四、微调实践
(一)环境配置
StarCoder 的微调实践需要特定的环境配置。例如,采用 A800 显卡,搭配 python3.8、torch2.0 和 CUDA11.6。在 python 环境中,transforemrs 和 peft 这两个包建议使用 "Development Mode" 安装。环境中主要包的版本也有明确要求,如 tqdm==4.65.0、transformers=4.31.0.dev0、peft=0.4.0.dev0、datasets==2.11.0、huggingface-hub==0.13.4、accelerate==0.18.0。这样的环境配置为后续的模型加载和微调提供了稳定的基础。
(二)模型加载
模型加载过程整合了 alpaca-lora 项目和 StarCoder 的 finetune 项目。首先,使用 AutoModelForCausalLM.from_pretrained 加载预训练模型,设置参数如 use_auth_token=True、use_cache=True、load_in_8bit=True 等,并通过 device_map 指定显卡索引。接着,使用 prepare_model_for_int8_training 对模型进行处理,然后设置 LoraConfig,指定参数如 r=16、lora_alpha=32、lora_dropout=0.05 等,并通过 get_peft_model 将原模型作为 base 模型,在各个 self-attention 层加入 LoRA 层,同时改写模型 forward 的计算方式。在模型加载时,load_in_8bit=True 的 8bit 量化优化了静态显存,是 bitsandbytes 库赋予的能力,会把加载模型转化成混合 8bit 的量化模型。模型量化本质是对浮点参数进行压缩的同时,降低压缩带来的误差,将原始 fp32(4 字节)压缩到 int8(1 字节),也就是实现了 1/4 的显存占用。
(三)参数选取
- Rank 的选取:作者对比了 1 - 64 的取值,在一般效果上,Rank 在 4 - 8 之间最好,再高并没有效果提升。不过论文的实验是面向下游单一监督任务的,因此在指令微调上,根据指令分布的广度,Rank 选择还是需要在 8 以上的取值进行测试。
- alpha 参数选取:alpha 其实是个缩放参数,训练后权重 merge 时的比例为 alpha/r。
- 初始化:矩阵 A 是 Uniform 初始化,B 是零初始化,这样最初的 lora 权重为 0,所以 lora 参数是从头学起,并没有那么容易收敛。对于哪些参数进行微调,基于 Transformer 结构,LoRA 只对每层的 Self-Attention 的部分进行微调,有四个映射层参数可以进行微调。像 StarCoder 模型 Multi - query 结构的 attention 层对应的参数名称是 attn.c_attn、attn.c_proj。
五、在大模型微调中的作用
(一)高效微调
大语言模型通常拥有海量的参数,全参数微调不仅计算成本高昂,而且耗时漫长。LoRA 以其独特的低秩矩阵注入方式,为大语言模型的微调带来了高效的解决方案。
以 GPT-3 175B 模型为例,全参数微调需要 1.2TB 的显存,而使用 LoRA 后,显存需求大幅降低。例如,当 设置为 4,且只调整 query 和 value 矩阵时,显存需求可从 1.2TB 降至 35MB,这为资源受限的环境提供了可行性。
在微调过程中,LoRA 只训练低秩矩阵的参数,原模型的其他部分权重保持不变。这种方式使得训练过程更加高效,能够在较短的时间内达到较好的效果。同时,由于参数量的大幅减少,训练过程中的计算复杂性也大大降低,避免了过拟合的风险,保持了模型的稳定性和可靠性。
(二)应用场景广泛
1. 智能客服领域
在智能客服领域,LoRA 微调后的大语言模型能够更加准确地理解客户的问题,并给出更加恰当的回答。一家企业使用经过 LoRA 微调的大语言模型来回答客户的问题,通过对大量客户咨询数据的学习和微调,模型能够快速适应不同类型的问题和客户需求。据统计,使用 LoRA 微调后的模型,客户满意度提高了 [X]%,同时大大降低了人工客服的成本。
2. 文本生成领域
对于文本生成任务,LoRA 微调也发挥了重要作用。一位作家利用经过 LoRA 微调的语言模型来辅助创作。这个模型可以根据作家提供的主题和关键词,生成富有创意和感染力的文本内容。作家可以在此基础上进行进一步的修改和完善,从而提高创作效率和质量。例如,在某些文学创作项目中,使用 LoRA 微调后的模型,创作效率提高了 [X]%。
3. 机器翻译领域
在机器翻译领域,LoRA 微调同样有着出色的表现。一个翻译团队使用经过 LoRA 微调的大语言模型来进行多语种翻译。通过对特定领域的翻译数据进行微调,这个模型能够更加准确地翻译专业术语和特定语境下的语句,提高了翻译的准确性和流畅性。实验表明,在特定领域的翻译任务中,LoRA 微调后的模型翻译准确率提高了 [X]%。
六、技术优势
(一)低秩矩阵近似高效
大语言模型往往拥有庞大的参数数量,这使得全参数微调面临着巨大的计算资源压力和时间成本。LoRA 巧妙地运用低秩矩阵近似的方法,对高维参数矩阵进行分解。例如,在一个拥有数十亿参数的大语言模型中,全参数微调可能需要数 TB 的显存空间以及漫长的训练时间。而 LoRA 可以将参数矩阵分解为低秩矩阵,假设原模型参数矩阵为 ,LoRA 可能将其分解为 和 的两个低秩矩阵,极大地减少了参数量。实验数据表明,这种低秩矩阵近似的方法可以将训练显存开销降低至全参数微调的约 1/3。在实际应用中,对于资源有限的环境,如消费级 GPU,LoRA 使得大模型的微调成为可能,大大提高了模型训练的效率和可行性。
(二)灵活插件式应用
LoRA 的插件式应用为不同任务的微调提供了极大的灵活性。在不同的应用场景中,可以针对特定任务训练出独立的 LoRA 参数,然后与预训练参数快速结合。以 Stable Diffusion(SD)与 LoRA 的结合为例,在图像生成领域,用户可以根据不同的风格需求下载相对较小的 LoRA 模型(通常为几十到几百 MB),与原有的 SD 模型(可能为几个 GB)结合使用。比如,当用户想要生成特定风格的图像时,只需要加载对应的 LoRA 模型,即可轻松实现风格的调整。这种插件式的设计方便快捷,使得用户可以在不改变原模型结构的情况下,快速适应不同的任务需求。同时,插件式应用也使得模型的更新和扩展更加容易,当新的任务或风格出现时,只需训练新的 LoRA 参数,而无需重新训练整个模型。
(三)不改变原模型
LoRA 微调的一个重要优势是不改变原有的预训练参数。在微调过程中,新的 LoRA 参数与原参数配合使用,不会增加推理时间。这意味着在实际应用中,可以在不影响模型性能的前提下,实现高效的任务微调。例如,在智能客服系统中,使用 LoRA 微调后的大语言模型可以在不改变原有的响应时间的情况下,更加准确地回答客户的问题。对于一些对实时性要求较高的应用场景,这一优势尤为重要。同时,不改变原模型也使得模型的稳定性得到了保障,避免了因大规模参数调整而可能导致的模型性能不稳定问题。在不同的任务中,LoRA 可以根据具体需求进行灵活的微调,而不会对原模型的整体性能产生负面影响。
结语
LoRA作为大模型微调技术中的一项创新成果,在多个方面展现出了卓越的性能和巨大的潜力。 从技术角度来看,其低秩矩阵注入的工作原理,为大模型微调在内存效率和计算效率方面提供了一种高效的解决方案。这种在特定层引入少量参数进行训练的方式,在不破坏原模型结构的基础上,实现了模型对特定任务的快速适应,这是传统微调方法难以企及的。 在应用层面,无论是自然语言处理领域的各种任务,还是扩展到其他如与图像生成模型结合的跨领域应用,LoRA都发挥着不可忽视的作用。它的插件式微调策略,使得不同领域、不同需求的用户能够方便地定制大型语言模型,满足多样化的实际需求。 随着人工智能技术的不断发展,大模型在各个行业的应用将越来越广泛。LoRA技术凭借其独特的优势,有望在未来的研究和实际应用中继续发挥重要的作用,进一步推动大模型在各个特定领域的优化和应用拓展,为实现更加精准、高效的人工智能服务奠定坚实的基础。同时,研究人员也将继续探索LoRA技术的更多可能性,例如如何进一步优化低秩矩阵的选择和训练,以及如何更好地与其他新兴技术相结合等,以适应不断变化的人工智能发展需求。