大模型微调
什么是微调?
大模型微调(Fine-tuning):通过在预训练的大型语言模型上使用特定数据集进行进一步训练,使模型能够更好地适应特定任务或领域。在我的理解中,与只会做“填空题”的Bert通过微调来胜任不同特定任务的工作。更具体来说,预训练的大语言模型是“通才”(AGI),不是“专才”,在特定垂直领域表现不佳。为了使其在细分领域有较好表现,就需要提供细分领域数据进行训练学习,无需重新训练模型,只需对大语言模型进行微调即可。
常见的轻量化微调
常用的轻量化微调技术有LoRA、Adapter 和 Prompt Tuning。
微调有什么好处?
-
减少数据需求:对于一些数据稀缺的领域或任务,微调可以在相对较少的数据量下实现较好的性能提升,因为模型已经具备了大量的通用语言知识(因为已经预训练好了)
-
适应性增强:微调使模型能够更好地适应特定用户或场景的需求,提供更加个性化和定制化的推理服务。
-
上下文理解提升:微调过程中使用的特定数据集可以帮助模型更好地理解特定任务的上下文,从而在推理时能够考虑到更多的相关信息和细节。(和微调喂垂类数据集有关)
-
性能优化:微调可以针对特定任务优化模型的性能,使其在处理该任务时达到更高的准确率和更低的错误率。这对于需要高可靠性和准确性的推理任务尤为重要。
大模型微调为什么困难?
大模型参数数量级太大, 训练的成本非常高昂(算力),即使是微调(使用较小数量级,特定任务数量集)也对计算资源有很高要求(微调只是训练的step少, 对显存等计算资源的占用并没有少?)。 在此背景下,提出了更高效的微调方法——LoRA微调
什么是LoRA微调?
LoRA(Low-Rank Adaptation)微调是一种高效的模型微调技术,特别适用于大型预训练语言模型的适应性调整。LoRA的核心思想是通过引入低秩矩阵来调整模型的权重,从而在不显著增加模型参数数量的情况下,实现对模型的微调。
LoRA微调高效在哪里?LoRA的原理?
LoRA微调高效在哪里?LoRA的原理?
自然语言处理的一个重要范例是对一般领域数据进行大规模预训练,并适应特定的任务或领域。当我们预训练更大的模型时,重新训练所有模型参数的完全微调变得不太可行。以GPT-3 175B为例,部署独立的微调模型实例,每个实例都有175B参数,这是非常昂贵的。我们提出了低秩自适应(Low-Rank Adaptation, LoRA),它冻结了预训练的模型权重,并将可训练的秩分解矩阵注入到Transformer架构的每一层,从而大大减少了下游任务的可训练参数的数量。与经过Adam微调的GPT-3 175B相比,LoRA可以将可训练参数的数量减少10,000倍,GPU内存需求减少3倍。
LoRA引入了两个矩阵A和B,如果参数W的原始矩阵的大小为d × d,则矩阵A和B的大小分别为d × r和r × d,其中r要小得多(通常小于100)。参数r称为秩。如果使用秩为r=16的LoRA,则这些矩阵的形状为16 x d,这样就大大减少了需要训练的参数数量。
矩阵B初始化为完全零矩阵。这确保了LoRA矩阵从一开始就不会以随机的方式改变原始W的输出
来源:- https://arxiv.org/pdf/2106.09685
其他高效微调方法
LoRA+:相比LoRA,在优化器设置上有所改进,修改学习率,使矩阵A与矩阵B的学习率不同。研究表明,这样设置,能够使训练更高效。
文献: Hayou, S., Ghosh, N., & Yu, B. (2024). LoRA+: Efficient Low Rank Adaptation of Large Models. arXiv preprint arXiv:2402.12354.)
VeRA: 共享权重参数初始化矩阵A、B(所有层中所有矩阵A和B都具有相同的权值),添加两个新的向量d、b,仅微调这两个向量,不训练矩阵了。VeRA模型产生的性能仅略低于完全微调的模型或使用原始LoRA技术的模型,但参数量在有些例子中相比LoRA减少了97%。
文献:Kopiczko, D. J., Blankevoort, T., & Asano, Y. M. (2023). Vera: Vector-based random matrix adaptation. arXiv preprint arXiv:2310.11454.
LoRA-FA:在LoRA-FA中,矩阵A在初始化后被冻结,因此作为随机投影。矩阵B不是添加新的向量,而是在用零初始化之后进行训练。这将参数数量减半,同时具有与普通LoRA相当的性能。
文献:Zhang, L., Zhang, L., Shi, S., Chu, X., & Li, B. (2023). Lora-fa: Memory-efficient low-rank adaptation for large language models fine-tuning. arXiv preprint arXiv:2308.03303.
LoRA-drop: 引入了一种算法来决定哪些层由LoRA微调,哪些层不需要。 LoRA-drop包括两个步骤:在第一步中对数据的一个子集进行采样,训练LoRA进行几次迭代。然后将每个LoRA适配器的重要性计算为BAx,其中A和B是LoRA矩阵,x是输入。这是添加到冻结层输出中的LoRA的输出。如果这个输出很大,说明它会更剧烈地改变行为。如果它很小,这表明LoRA对冻结层的影响很小可以忽略。(看不太懂)
文献:Zhou, H., Lu, X., Xu, W., Zhu, C., & Zhao, T. (2024). LoRA-drop: Efficient LoRA Parameter Pruning based on Output Evaluation. arXiv preprint arXiv:2402.07721.
AdaLoRA: 将矩阵的奇异值作为评估哪些LoRA矩阵重要性的指标。AdaLoRA各个矩阵的秩不同,但总的参数量与LoRA相同。AdaLoRA可以决定不同的适配器具有不同的秩(与LoRA-drop相比)
文献:Zhang, Q., Chen, M., Bukharin, A., He, P., Cheng, Y., Chen, W., & Zhao, T. (2023). Adaptive budget allocation for parameter-efficient fine-tuning. arXiv preprint arXiv:2303.10512.
DoRA:DoRA的作者介绍了一种方法,通过将预训练矩阵W分离为大小为1 x d的大小向量m和方向矩阵V,从而独立训练大小和方向。然后方向矩阵V通过B* a增强,然后m按原样训练。虽然LoRA倾向于同时改变幅度和方向(正如这两者之间高度正相关所表明的那样),DoRA可以更容易地将二者分开调整,或者用另一个的负变化来补偿一个的变化
文献:Liu, S. Y., Wang, C. Y., Yin, H., Molchanov, P., Wang, Y. C. F., Cheng, K. T., & Chen, M. H. (2024). DoRA: Weight-Decomposed Low-Rank Adaptation. arXiv preprint arXiv:2402.09353.
Delta-LoRA: 使用AB矩阵的梯度更新原来大模型里面的预训练矩阵W。这在几乎没有计算开销的情况下引入了更多需要训练的参数。不必像在微调中那样计算整个矩阵W的梯度,而是用在LoRA训练中已经得到的梯度来更新它。相比LoRA,模型性能更好,因为让W发挥作用。
来源:
https://blog.csdn.net/deephub/article/details/136735670
实例
源2.0-2B微调实战——AI简历助手
Step0 开通阿里云PAI-DSW试用
需要在魔搭社区进行授权
链接:https://www.modelscope.cn/my/mynotebook/authorization
Step1 魔搭社区创建PAI实例
ps:最好再创建一个新的实例
Step2 准备
打开实例,并进入终端
在终端输入命令,下载文件
git lfs install
git clone https://www.modelscope.cn/datasets/Datawhale/AICamp_yuan_baseline.git
cp AICamp_yuan_baseline/Task\ 4:源大模型微调实战/* .
接下来运行文件Task 4:源大模型微调实战
全部代码。
一开始在运行时可能遇到导入库时报错
from transformers import AutoTokenizer, AutoModelForCausalLM
解决方案:在终端先卸载keras,再下载tf-keras库
在终端输入以下代码,打开交互页面
streamlit run Task\ 4\ 案例:AI简历助手.py --server.address 127.0.0.1 --server.port 6006
最终得到如图界面
本学习笔记的参考原文链接如下:
Datawhale
https://linklearner.com/activity/14/11/25
声明:
本学习笔记为此笔记发布者使用,以便完成Datawhale AI 夏令营第四期大模型应用开发Task04打卡任务,同时记录自己的学习过程。该笔记在原文的基础上进行删改,对个别部分黑体着重强调以便及时记忆理解。本笔记并不做任何以盈利为目的的用途,仅供个人学习使用,若有侵权,请第一时间告知本人,侵删。