模型微调‌ 总结!大模型微调(Tuning)的常见方法

默认分类4天前发布 admin
1,000 0
ChatGPT国内版

前言

微调是指调整大型语言模型(LLM)的参数以适应特定任务的过程。这是通过在与任务相关的数据集上训练模型来完成的。所需的微调量取决于任务的复杂性和数据集的大小。

在深度学习中,微调是一种重要的技术,用于改进预训练模型的性能。除了微调之外,还有许多其他预训练模型可以进行微调。

PEFT是什么

PEFT(- Fine-)是 face开源的一个参数高效微调大模型的工具,里面集成了4种微调大模型的方法,可以通过微调少量参数就达到接近微调全量参数的效果,使得在GPU资源不足的情况下也可以微调大模型。

微调方法

微调可以分为全微调和重用两个方法:

微调预训练模型的方法: Fine

经典的Fine 方法包括将预训练模型与少量特定任务数据一起继续训练。在这个过程中,预训练模型的权重被更新,以更好地适应任务。所需的Fine-量取决于预训练语料库和任务特定语料库之间的相似性。如果两者相似,可能只需要少量的Fine 。如果两者不相似,则可能需要更多的Fine 。

(P-)

是2021年谷歌在论文《The Power of Scale for – 》中提出的微调方法。参数高效性微调方法中实现最简单的方法还是 (也就是我们常说的P-),固定模型前馈层参数,仅仅更新部分参数即可实现低成本微调大模型。

经典的 方式不涉及对底层模型的任何参数更新。相反,它侧重于精心制作可以指导预训练模型生成所需输出的输入提示或模板。主要结构是利用了一个 (+MLP),将一些 先(离散token)再与input 进行拼接,同时利用LSTM进行 加速训练,并引入少量自然语言提示的锚字符(,例如)进一步提升效果。然后结合(,)生成得到结果,再优化生成的部分。

但是P- v1有两个显著缺点:任务不通用和规模不通用。在一些复杂的自然语言理解NLU任务上效果很差,同时预训练模型的参数量不能过小。具体的效果论文中提到以下几点:

代码示例:

from peft import PromptTuningConfig, get_peft_model   peft_config = PromptTuningConfig(task_type="SEQ_CLS", num_virtual_tokens=10)   model = AutoModelForCausalLM.from_pretrained(model_name_or_path, return_dict=True)   model = get_peft_model(model, peft_config)

2021年论文《-: for 》中提出了 方法。与Full- 更新所有参数的方式不同,该方法是在输入 token 之前构造一段任务相关的 作为 ,然后训练的时候只更新 部分的参数,而 中的其他部分参数固定。

-技术,相对于fine-,在调节模型的过程中只优化一小段可学习的 task- ()而不是整个模型的参数。该方法其实和构造 类似,只是 是人为构造的“显式”的提示,并且无法更新参数,而 则是可以学习的“隐式”的提示。手动尝试最优的提示无异于大海捞针,于是便有了自动离散提示搜索的方法,但提示是离散的,神经网络是连续的,所以寻找的最优提示可能是次优的。

代码示例:

peft_config = PrefixTuningConfig(task_type="CAUSAL_LM", num_virtual_tokens=20)   model = AutoModelForCausalLM.from_pretrained(model_name_or_path, return_dict=True)   model = get_peft_model(model, peft_config)

GPT在P-的加持下可达到甚至超过BERT在NLU领域的性能。下图是细致的对比:

P- v2

V2版本主要是基于P-和-技术,引入Deep 和Multi-task 等策略进行优化的。实验表明,仅精调0.1%参数量,在330M到10B不同参数规模LM模型上,均取得和Fine-相比肩的性能。

论文《P- v2: Can Be to Fine- and Tasks》从标题就可以看出,P- v2 的目标就是要让 能够在不同参数规模的预训练模型、针对不同下游任务的结果上都达到匹敌 Fine- 的结果。也就是说当前 方法在这两个方面都存在局限性。

不同模型规模: 和 P- 这两种方法都是在预训练模型参数规模够足够大时,才能达到和Fine- 类似的效果,而参数规模较小时效果则很差。

不同任务类型: 和 P- 这两种方法在 任务上表现都很差。

v1到v2的可视化:蓝色部分为参数冻结,橙色部分为可训练部分,可以看到右侧的p- v2中,将 加在序列前端,并且每一层都加入可训练的。在左图v1模型中,只将插入input 中,会导致可训练的参数被句子的长度所限制。此外P- v2还包括以下改进:

P- v2几个关键设计因素:

代码示例:

模型微调‌ 总结!大模型微调(Tuning)的常见方法

peft_config = PrefixTuningConfig(task_type="SEQ_CLS", num_virtual_tokens=20)   model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path, return_dict=True)   model = get_peft_model(model, peft_config)

预训练语言模型中的不同权重参数对下游任务的贡献是不同的。因此需要更加智能地分配参数预算,以便在微调过程中更加高效地更新那些对模型性能贡献较大的参数。

具体来说,通过奇异值分解将权重矩阵分解为增量矩阵,并根据新的重要性度量动态地调整每个增量矩阵中奇异值的大小。这样可以使得在微调过程中只更新那些对模型性能贡献较大或必要的参数,从而提高了模型性能和参数效率。

代码示例:

peft_config = AdaLoraConfig(peft_type="ADALORA", task_type="SEQ_2_SEQ_LM", r=8, lora_alpha=32, target_modules=["q", "v"],lora_dropout=0.01)   model = AutoModelForCausalLM.from_pretrained(model_name_or_path, return_dict=True)   model = get_peft_model(model, peft_config)

GPT4模型微调分类 1. -based (基于适配器的方法):

《- for NLP》提出针对 BERT 的 PEFT微调方式,拉开了 PEFT 研究的序幕。他们指出,在面对特定的下游任务时,如果进行 Full-(即预训练模型中的所有参数都进行微调),太过低效;而如果采用固定预训练模型的某些层,只微调接近下游任务的那几层参数,又难以达到较好的效果。

于是他们设计了如下图所示的 结构,将其嵌入 的结构里面,在训练时,固定住原来预训练模型的参数不变,只对新增的 结构进行微调。同时为了保证训练的高效性(也就是尽可能少的引入更多参数),他们将 设计为这样的结构:

首先是一个 down- 层将高维度特征映射到低维特征;然后过一个非线形层之后,再用一个 up- 结构将低维特征映射回原来的高维特征;同时也设计了 skip- 结构,确保了在最差的情况下能够退化为(类似残差结构)。

这种方法节省了资源,因为它不需要对整个模型进行微调。示例有、 、 等。

2. -based (基于提示的方法):

这个分支侧重于使用连续的提示(如嵌入向量)来调整模型的行为,而不是直接修改模型的权重。这类方法通常用于生成任务,例如文本生成。提示可以视为模型输入的一部分,它们会被训练以激发模型生成特定的输出。示例包括-、 等,参加上文介绍。

3. Low-rank (低秩适配):

低秩适配方法致力于将模型权重的改变限制在一个低秩子空间内。这通常涉及对模型的权重矩阵进行分解,只微调其中的一小部分参数。这样可以有效减少计算资源的消耗,同时仍然允许模型有足够的灵活性来学习新任务。LoRA和它的变种,如Q-LoRA、Delta-LoRA、LoRA-FA等,都属于这个类别。

4. (稀疏方法):

这个分支包括那些仅更新模型中一小部分参数的方法。这些参数被选为最有可能影响到任务性能的,而其他参数则保持不变。稀疏方法的优点在于它们通常能够更高效地利用资源。例如有 SAID、Fish Mask、等。

5. (其他方法):

这一分支可能包括不易归类到上述任何一类的其他方法,或者是结合了多种技术的混合方法。这些方法可能包括特定的结构改变、算法优化等,用以提高微调过程的效率或者效果。

大模型微调步骤总结

大模型微调如上文所述有很多方法,并且对于每种方法都会有不同的微调流程、方式、准备工作和周期。然而大部分的大模型微调,都有以下几个主要步骤,并需要做相关的准备:

准备数据集:

收集和准备与目标任务相关的训练数据集。确保数据集质量和标注准确性,并进行必要的数据清洗和预处理。

选择预训练模型/基础模型:

根据目标任务的性质和数据集的特点,选择适合的预训练模型。

设定微调策略:

根据任务需求和可用资源,选择适当的微调策略。考虑是进行全微调还是部分微调,以及微调的层级和范围。

设置超参数:

确定微调过程中的超参数,如学习率、批量大小、训练轮数等。这些超参数的选择对微调的性能和收敛速度有重要影响。

初始化模型参数:

根据预训练模型的权重,初始化微调模型的参数。对于全微调,所有模型参数都会被随机初始化;对于部分微调,只有顶层或少数层的参数会被随机初始化。

进行微调训练:

使用准备好的数据集和微调策略,对模型进行训练。在训练过程中,根据设定的超参数和优化算法,逐渐调整模型参数以最小化损失函数。

模型评估和调优:

在训练过程中,使用验证集对模型进行定期评估,并根据评估结果调整超参数或微调策略。这有助于提高模型的性能和泛化能力。

测试模型性能:

模型微调‌ 总结!大模型微调(Tuning)的常见方法

在微调完成后,使用测试集对最终的微调模型进行评估,以获得最终的性能指标。这有助于评估模型在实际应用中的表现。

模型部署和应用:

将微调完成的模型部署到实际应用中,并进行进一步的优化和调整,以满足实际需求。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。

二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】

AI大模型学习路线汇总

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

大模型实战案例

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

大模型视频和PDF合集

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

学会后的收获:

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、开发框架和项目实战技能, 学会Fine-垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

获取方式:

有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】

323AI导航网发布

© 版权声明
广告也精彩

相关文章

暂无评论

暂无评论...