前言
- 翻译文章《Finetuning LLMs with LoRA and QLoRA: Insights from Hundreds of Experiments》原文地址
- 因译者水平有限,翻译过程中有错误请在评论区指出
提要
LoRA
是用于训练自定义LLM
的最广泛使用、参数效率最高的微调技术之一。从使用QLoRA
节省内存到选择最佳 LoRA
设置,本文为有兴趣应用它的人提供了实用的见解。
引言:充分利用LoRA
在过去的几个月里,我已经进行了数百次涉及LoRA
的实验。几周前,我花时间深入研究了一些LoRA
超参数的选择。
这更像是一本按顺序呈现的实验日记。我希望它对一些人有用。具体来说,我的目标是解决有关QLoRA
的价值、是否用SGD
替换AdamW
、scheduler
的潜在用途以及如何调整LoRA
超参数的问题。
实验方面有很多内容需要讨论,因此我将简要介绍LoRA
。
简而言之,LoRA
是Low-Rank Adaptation
的缩写(Hu et al 2021),他在模型中添加少量可训练参数,而原始模型参数保持冻结。
LoRA
将权重矩阵分解为两个较小的权重矩阵,如下图所示,以以更有效的参数方式近似于完全监督微调。
有关LoRA
的更多详细信息,请参阅我的深度解析文章Parameter-Efficient LLM Finetuning With Low-Rank Adaptation (LoRA)
我们将在本文中讨论以下主题:
- 评估任务和数据集
- 代码框架
- 选择良好的基础模型
- 评估
LoRA
默认值 - 使用
QLoRA
节省内存 - 学习率调度(
scheduler
)计划和SGD
- 多次迭代数据集
LoRA
超参数调节(一):训练所有层的LoRA
LoRA
超参数调节(二):增加R
LoRA
超参数调节(三):更改Alpha
LoRA
超参数调节(四):非常大的R
- 排行榜展示
- 结论
评估任务和数据集
本文的重点是选择最佳参数。为了保持在合理的范围内,我保持数据集固定,并仅专注于LLMs
的监督指令微调(SFT
)
对于模型评估,我从Eleuther AI
的评估工具中选择了一小部分任务,包括TruthfulQA、BLiMP Causative、 MMLU Global Facts以及具有两位数(算术 2ds)和四位数字(算术 4ds)的简单算术任务。
在每个基准测试中,模型性能得分都标准化在0和1之间,其中1是满分。TruthfulQA
展示两个分数,定义如下:
- MSC1:给定一个问题和4~5个答案选项,选择唯一正确的答案。模型选择的答案是它认为完成问题的对数概率最高的答案选项,与其他答案选项无关。得分即为所有问题的简单准确率。
- MSC2:给定一个问题和多个真/假参考答案,得分就是分配给一组真答案的归一化总概率。
作为参考,175B GPT-3模型的TruthfulQA
MC1和MC2值分别为0.21和0.33。
下面通过两个例子来说明算术2ds和算术4ds之间的区别:
- 算术2ds:“59减38等于多少”。“21”
- 算术4ds:“2762加2751等于多少”。“5513”
如上所述,我保持数据集固定,使用经过充分研究或相当常用的Alpaca 数据集进行监督指令微调。当然,还有许多其他数据集可用于指令微调,包括LIMA
、Dolly
、LongForm
、FLAN
等。当然,探索多个数据集和数据集混合的训练将是未来研究的一个有趣的主题。
Alpaca数据集由大约50k个用于训练的指令-响应对组成,输入长度的中位数为110个token(使用Llama 2 SentencePiece tokenizer),如下面的直方图所示。
数据集任务本身的结构如下图所示。
代码框架
我在本文中使用的自定义LLM
微调代码基于开源的Lit-GPT存储库。为了使本文保持简短,我不会详细介绍使用细节,但您可以在此处的Lit-GPT
教程部分找到更详细的介绍。
简单来说,用法如下:
(1)克隆存储库并安装依赖
git clone https://github.com/Lightning-AI/lit-gpt
cd lit-gpt
pip install -rrequirements.txt
(2)下载模型权重文件
python scripts/download.py \
--repo_id mistralai/Mistral-7B-Instruct-v0.1
python scripts/convert_hf_checkpoint.py \
--checkpoint_dir checkpoints/mistralai/Mistral-7B-Instruct-v0.1
(3)准备数据集
python scripts/prepare_alpaca.py \
--checkpoint_dir checkpoints/mistralai/Mistral-7B-Instruct-v0.1
# 也可以加载本地CSV文件
python scripts/prepare_csv.py