大模型微调总结

最近,深度学习的研究中出现了许多大型预训练模型,例如 GPT-3ChatGPTGPT4、ChatGLM-130B 等,这些模型可以在多种自然语言处理任务中取得优异的性能表现。而其中,ChatGPT 模型因为在对话生成方面的表现而备受瞩目,成为了自然语言处理领域的热门研究方向。

img

然而,这些大型预训练模型的训练成本非常高昂,需要庞大的计算资源和大量的数据,一般人难以承受。这也导致了一些研究人员难以重复和验证先前的研究成果。为了解决这个问题,研究人员开始研究 Parameter-Efficient Fine-Tuning (PEFT) 技术。PEFT 技术旨在通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本。这样一来,即使计算资源受限,也可以利用预训练模型的知识来迅速适应新任务,实现高效的迁移学习。因此,PEFT 技术可以在提高模型效果的同时,大大缩短模型训练时间和计算成本,让更多人能够参与到深度学习研究中来。

img

在上一篇文章中,介绍了 PEFT 技术中的常用方法 LORA,使得百亿(10B)参数的大模型可以在单卡上训练(显存大小>=40G)。

绝密伏击:LORA:大模型轻量级微调925 赞同 · 40 评论文章img

今天介绍下另外几种常用的方法,包括 Adapter Tuning、Prompt Tuning、Prefix Tuning、P-Tuning、P-Tuning v2 和 AdaLoRA

img

1. Adapter Tuning

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

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

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

img

从实验结果来看,该方法能够在只额外对增加的 3.6% 参数规模(相比原来预训练模型的参数量)的情况下取得和Full-Finetuning 接近的效果(GLUE指标在0.4%以内)。

img

2. Prefix Tuning

2021年斯坦福的研究人员在论文《Prefix-Tuning: Optimizing Continuous Prompts for Generation》中提出了 Prefix Tuning 方法。与Full-finetuning 更新所有参数的方式不同,该方法是在输入 token 之前构造一段任务相关的 virtual tokens 作为 Prefix,然后训练的时候只更新 Prefix 部分的参数,而 Transformer 中的其他部分参数固定。该方法其实和构造 Prompt 类似,只是 Prompt 是人为构造的“显式”的提示,并且无法更新参数,而Prefix 则是可以学习的“隐式”的提示。

img

同时,为了防止直接更新 Prefix 的参数导致训练不稳定的情况,他们在 Prefix 层前面加了 MLP 结构(相当于将Prefix 分解为更小维度的 Input 与 MLP 的组合后输出的结果),训练完成后,只保留 Prefix 的参数。

embedding = torch.nn.Embedding(num_virtual_tokens, token_dim)
transform = torch.nn.Sequential(
    torch.nn.Linear(token_dim, encoder_hidden_size),
    torch.nn.Tanh(),
    torch.nn.Linear(encoder_hidden_size, num_layers * 2 * token_dim),
)

3. Prompt Tuning

Prompt Tuning 是2021年谷歌在论文《The Power of Scale for Parameter-Efficient Prompt Tuning》中提出的微调方法。

该方法可以看作是 Prefix Tuning 的简化版本,只在输入层加入 prompt tokens,并不需要加入 MLP 进行调整来解决难训练的问题,主要在 T5 预训练模型上做实验。似乎只要预训练模型足够强大,其他的一切都不是问题。作者也做实验说明随着预训练模型参数量的增加,Prompt Tuning的方法会逼近 Fine-tune 的结果。

固定预训练参数,为每一个任务额外添加一个或多个 embedding,之后拼接 query 正常输入 LLM,并只训练这些 embedding。左图为单任务全参数微调,右图为 Prompt tuning。

img

img

作者做了一系列对比实验,都在说明:随着预训练模型参数的增加,一切的问题都不是问题,最简单的设置也能达到极好的效果。

  • Prompt 长度影响:模型参数达到一定量级时,Prompt 长度为1也能达到不错的效果,Prompt 长度为20就能达到极好效果。
  • Prompt初始化方式影响:Random Uniform 方式明显弱于其他两种,但是当模型参数达到一定量级,这种差异也不复存在。
  • 预训练的方式:LM Adaptation 的方式效果好,但是当模型达到一定规模,差异又几乎没有了。
  • 微调步数影响:模型参数较小时,步数越多,效果越好。同样随着模型参数达到一定规模,zero shot 也能取得不错效果。
  • 当参数达到100亿规模与全参数微调方式效果无异。
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)

4. P-Tuning v1

img

P-Tuning 方法的提出主要是为了解决这样一个问题:大模型的 Prompt 构造方式严重影响下游任务的效果。

img

P-Tuning 提出将 Prompt 转换为可以学习的 Embedding 层,只是考虑到直接对 Embedding 参数进行优化会存在这样两个挑战:

  • Discretenes: 对输入正常语料的 Embedding 层已经经过预训练,而如果直接对输入的 prompt embedding进行随机初始化训练,容易陷入局部最优。
  • Association:没法捕捉到 prompt embedding 之间的相关关系。

作者在这里提出用 MLP + LSTM 的方式来对 prompt embedding 进行一层处理:

(1)hi=MLP([hi→:hi←])=MLP([LSTM(h0:i):LSTM(hi:m)])P-tuning 依然是固定 LLM 参数,利用多层感知机和 LSTM 对 Prompt 进行编码,编码之后与其他向量进行拼接之后正常输入 LLM。注意,训练之后只保留 Prompt 编码之后的向量即可,无需保留编码器。

self.lstm_head = torch.nn.LSTM(
                    input_size=self.input_size,
                    hidden_size=self.hidden_size,
                    num_layers=num_layers,
                    dropout=lstm_dropout,
                    bidirectional=True,
                    batch_first=True,
  )

self.mlp_head = torch.nn.Sequential(
    torch.nn.Linear(self.hidden_size * 2, self.hidden_size * 2),
    torch.nn.ReLU(),
    torch.nn.Linear(self.hidden_size * 2, self.output_size),
)
self.mlp_head(self.lstm_head(input_embeds)[0])

4.1 与Prefix-Tuning的区别

P-Tuning 和 Prefix-Tuning 差不多同时提出,做法其实也有一些相似之处,主要区别在:

  • Prefix Tuning 是将额外的 embedding 加在开头,看起来更像是模仿 Instruction 指令;而 P-Tuning 的位置则不固定。
  • Prefix Tuning 通过在每个 Attention 层都加入 Prefix Embedding 来增加额外的参数,通过 MLP 来初始化;而 P-Tuning 只是在输入的时候加入 Embedding,并通过 LSTM+MLP 来初始化。

5. P-Tuning v2

P-Tuning 的问题是在小参数量模型上表现差(如上图所示)。

img

于是就有了v2版本:《P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks》。

从标题就可以看出,P-Tuning v2 的目标就是要让 Prompt Tuning 能够在不同参数规模的预训练模型、针对不同下游任务的结果上都达到匹敌 Fine-tuning 的结果。

那也就是说当前 Prompt Tuning 方法在这两个方面都存在局限性。

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

5.1 主要结构

相比 Prompt Tuning 和 P-tuning 的方法, P-tuning v2 方法在多层加入了 Prompts tokens 作为输入,带来两个方面的好处:

  1. 带来更多可学习的参数(从 P-tuning 和 Prompt Tuning 的0.1%增加到0.1%-3%),同时也足够 parameter-efficient。
  2. 加入到更深层结构中的 Prompt 能给模型预测带来更直接的影响。

v1 到 v2 的可视化:蓝色部分为参数冻结,橙色部分为可训练部分。

img

5.2 几个关键设计因素

  • Reparameterization:Prefix Tuning 和 P-tuning 中都有 MLP 来构造可训练的 embedding。本文发现在自然语言理解领域,面对不同的任务以及不同的数据集,这种方法可能带来完全相反的结论。
  • Prompt Length: 不同的任务对应的最合适的 Prompt Length 不一样,比如简单分类任务下 length=20 最好,而复杂的任务需要更长的 Prompt Length。
  • Multi-task Learning 多任务对于 P-Tuning v2 是可选的,但可以利用它提供更好的初始化来进一步提高性能。
  • Classification Head 使用 LM head 来预测动词是 Prompt Tuning 的核心,但我们发现在完整的数据设置中没有必要这样做,并且这样做与序列标记不兼容。P-tuning v2 采用和 BERT 一样的方式,在第一个 token 处应用随机初始化的分类头。

5.3 实验结果

  • 不同预训练模型大小下的表现,在小模型下取得与 Full-finetuning 相近的结果,并远远优于 P-Tuning。
  • 不同任务下的 P-Tuning v2 效果都很好,而 P-Tuning 和 Prompt Learning 效果不好;同时,采用多任务学习的方式能在多数任务上取得最好的结果。

6. AdaLoRA

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

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

img

7. Towards a Unified View of PETL

这篇 ICLR2022 的文章研究了典型的 PEFT 方法,试图将 PEFT 统一到一个框架下,找出它们起作用的具体原因,并进行改进。主要研究了三个问题:

  • 典型的 PEFT 方法有什么联系?
  • 典型的 PEFT 方法中是哪些关键模块在起作用?
  • 能否对这些关键模块进行排列组合,找出更有用的 PEFT 方法?

7.1 通用形式

通过对 Prefix Tuning 的推导,得出了和 Adapter Tuning 以及 LoRA 形式一致的形式。

通过对Prefix Tuning的推导,得出了和Adapter Tuning以及LoRA形式一致的形式。

img

img

img

包括这几大要素:

  • △h 的形式
  • 嵌入 Transformer 结构的方式(分为 Parrell 和 Sequential 两种。Parallel 指的是在输入层嵌入,这样与原有结构可以并行计算;Sequential 指的是在输出层嵌入,相当于增加了网路的深度,与原有结构存在依赖关系)
  • 修改表示层(主要指对 attention 层的修改还是对 ffn 层的修改)
  • 组合方式。怎么与原有的参数组合,包括简单相加(Adapter)、门控式(Prefix Tuning)、缩放式(LoRA)三种)

根据这个统一的框架,还另外设计了三种变体 Parallel Adapter、Multi-head Parallel Adapter、Scaled Parallel Adapter。

大模型岗位需求

大模型时代,企业对人才的需求变了,AIGC相关岗位人才难求,薪资持续走高,AI运营薪资平均值约18457元,AI工程师薪资平均值约37336元,大模型算法薪资平均值约39607元。
在这里插入图片描述

掌握大模型技术你还能拥有更多可能性

• 成为一名全栈大模型工程师,包括Prompt,LangChain,LoRA等技术开发、运营、产品等方向全栈工程;

• 能够拥有模型二次训练和微调能力,带领大家完成智能对话、文生图等热门应用;

• 薪资上浮10%-20%,覆盖更多高薪岗位,这是一个高需求、高待遇的热门方向和领域;

• 更优质的项目可以为未来创新创业提供基石。

可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把全套AI技术和大模型入门资料、操作变现玩法都打包整理好,希望能够真正帮助到大家。

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

零基础入门AI大模型

今天贴心为大家准备好了一系列AI大模型资源,包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

有需要的小伙伴,可以点击下方链接免费领取【保证100%免费

点击领取 《AI大模型&人工智能&入门进阶学习资源包》*

1.学习路线图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果大家想领取完整的学习路线及大模型学习资料包,可以扫下方二维码获取
在这里插入图片描述
👉2.大模型配套视频👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。(篇幅有限,仅展示部分)

img

大模型教程

👉3.大模型经典学习电子书👈

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(篇幅有限,仅展示部分,公众号内领取)

img

电子书

👉4.大模型面试题&答案👈

截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(篇幅有限,仅展示部分,公众号内领取)

img

大模型面试

**因篇幅有限,仅展示部分资料,**有需要的小伙伴,可以点击下方链接免费领取【保证100%免费

点击领取 《AI大模型&人工智能&入门进阶学习资源包》

**或扫描下方二维码领取 **

在这里插入图片描述

<think>好的,我现在需要处理用户关于大模型微调技术的查询。首先,用户提到了系统级指令,要求使用中文回答,正确使用LaTeX格式,生成相关问题,并在引用处添加标识。同时,用户提供了四个引用内容,需要整合这些信息来构建回答。 首先,我需要理解大模型微调技术的基本概念。根据引用[1],微调是在预训练模型基础上通过少量参数调整适应特定任务的技术。接下来,引用[2]详细说明了不同的微调方法,比如微调所有层、顶层、冻结底层、逐层微调和迁移学习。这些方法需要被清晰地分类和解释。 然后,用户还提到了框架和实现部分。引用[3]和[4]提到了一些资源和注意事项,比如过拟合的问题。不过用户的问题主要集中在技术方法、框架和实现上,所以可能需要更关注前两个引用,尤其是引用[2]中的方法。 接下来,我需要确保回答结构清晰,分步骤讲解。可能的结构是先介绍微调技术的基本概念,然后详细说明不同方法,接着讨论常用框架,最后提到实现时的注意事项。同时,每个部分需要自然地插入引用标识。 在生成相关问题的时候,需要基于用户提供的引用内容来设计,例如询问不同方法的区别、如何选择框架、过拟合如何解决等。这些问题应该覆盖用户可能感兴趣的后续方向。 需要注意的是,用户可能对技术细节和实际应用比较关注,因此在回答中需要结合理论和实践,比如举例说明Hugging Face Transformers的使用,或者如何冻结底层参数。同时,避免使用复杂术语,保持语言简洁明了。 最后,检查LaTeX格式是否正确,所有数学表达式如层数$L$是否正确用$包裹,独立公式如损失函数是否用$$...$$。确保引用标识正确对应到提供的参考文献,比如引用[1]对应大模型微调技术的基本定义,引用[2]对应具体方法,引用[4]对应过拟合问题。 可能还需要注意用户提到的“系统级指令”中的要求,如生成相关问题和回答结构清晰。因此,回答需要分为几个部分,每个部分有小标题,使用中文,并且问题部分要合理覆盖用户可能想深入了解的方向。 总结一下,回答的大纲可能是: 1. 大模型微调技术概述 2. 核心方法(分点列出不同方法) 3. 常用框架(如Transformers、DeepSpeed等) 4. 实现步骤(数据、模型调整、训练配置、评估) 5. 注意事项(过拟合、计算资源、评估指标) 6. 相关问题 每个部分引用相应的文献,并确保格式正确。现在需要将这些内容整合成一个自然流畅的回答,同时符合用户的所有格式和内容要求。</think>### 大模型微调技术详解 #### 1. **大模型微调技术概述** 大模型微调(Fine-tuning)是在预训练模型(如GPT、BERT)的基础上,通过少量任务特定数据调整参数,使其适应下游任务的技术[^1]。核心目标是**平衡通用知识与领域特异性**,避免从头训练的高成本。例如,数学上可表示为优化损失函数: $$ \mathcal{L}(\theta) = \sum_{(x,y) \in D} \ell(f_\theta(x), y) $$ 其中$\theta$为模型参数,$D$为目标领域数据集。 #### 2. **核心微调方法** 根据参数调整范围,主要分为以下方法[^2]: 1. **全参数微调** 调整所有层参数,适合数据量充足且任务差异大的场景,但计算成本高。 *实现示例*:使用PyTorch时,`model.parameters()`全部参与梯度更新。 2. **顶层微调(Top-layer Tuning)** 仅微调最后$k$层(如分类头),冻结底层参数。公式化表示为: $$ \theta_{\text{new}} = \{\theta_{\text{top}} \cup \theta_{\text{frozen}}\} $$ 适用于小数据集或任务与原预训练目标高度相关。 3. **逐层解冻(Layer-wise Unfreezing)** 从顶层到底层逐步解冻参数,分阶段训练。例如,先训练最后3层,收敛后加入第4层,迭代至全部解冻。 4. **适配器(Adapter)** 在Transformer层中插入轻量级模块(如两层MLP),仅训练适配器参数。计算效率高,适合资源受限场景。 #### 3. **常用微调框架** | 框架 | 特点 | |-----------------|----------------------------------------------------------------------| | Hugging Face Transformers | 提供`Trainer`类支持分布式训练,集成多种优化策略(如混合精度训练) | | DeepSpeed | 微软开发,支持ZeRO优化,显存效率高,适合百亿参数模型 | | PEFT (Parameter-Efficient Fine-Tuning) | 专门针对高效微调,实现LoRA、Prefix Tuning等方法 | #### 4. **实现步骤与示例** 1. **数据准备** 使用领域数据(如医疗文本)构建数据集,通常需数千到数万样本。 2. **模型调整** ```python from transformers import AutoModelForSequenceClassification model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=5) # 冻结底层参数 for param in model.bert.parameters(): param.requires_grad = False ``` 3. **训练配置** 选择优化器(如AdamW)、学习率($10^{-5}$量级)与早停策略。 4. **评估与部署** 使用验证集监控指标(如准确率、F1值),导出模型至ONNX或TorchScript格式。 #### 5. **关键注意事项** - **过拟合风险**:小数据场景需结合正则化(如Dropout率提升至0.3)或数据增强[^4]。 - **计算资源**:全参数微调百亿模型可能需要16+张A100 GPU,适配器方法可降至1-2张。 - **评估指标**:除任务指标外,需检查模型输出稳定性(如困惑度$PPL$)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员一粟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值