PEFT(Parameter-Efficient Fine-Tuning参数高效微调)

  huggingface:PEFT (huggingface.co)

  github:GitHub - huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.

  概念:其核心理念是通过仅调整模型的一小部分参数,而保持大部分预训练参数不变,从而大幅减少计算资源和存储需求

 

LORA(Low-Rank Adaptation低秩适应)

github:GitHub - microsoft/LoRA: Code for loralib, an implementation of "LoRA: Low-Rank Adaptation of Large Language Models"

论文:2106.09685 (arxiv.org)

 

以下是LoRA微调的主要概念和步骤:

  1. 低秩矩阵的引入:在模型的某些层(例如注意力层或前馈层)中,引入低秩矩阵来替代完整的权重矩阵。这些低秩矩阵的参数远少于原始权重矩阵的参数,从而减少计算成本。

  2. 参数更新:只更新低秩矩阵的参数,而保持原始模型的大部分参数不变。这意味着微调过程中只有一小部分参数需要调整,极大地减少了计算量和内存需求。

 

矩阵的秩(Rank)

  表示输出空间的维数。例如,输入向量通过线性变化,被映射到输出空间中,这个空间是二维的,那么秩就是2 

  如果一个矩阵的秩 rrr 远小于其维度 mmm 和 nnn,则称其为低秩矩阵

  

  第三行是第一行的倍数,因此第三行可以由第一行线性表示(即它们是线性相关的)

  第二行是第一行的倍数,所以它们也是线性相关的

  矩阵的秩就是1 

低秩矩阵(Low-Rank Matrix)

  如果一个矩阵的秩 rrr 远小于其维度 mmm 和 nnn,则称其为低秩矩阵。例如,一个 1000×10001000 \times 10001000×1000 的矩阵,如果秩为10,则可以认为是低秩的

 

如何引入:

  参数分解:将模型的某些参数矩阵分解为两个较低秩的矩阵的乘积。例如,对于一个权重矩阵W,可以分解为UV,其中 U 和 V 是低秩的矩阵。

 

 

prompt(提示)

软提示:

  通过引入可学习的张量,与输入嵌入向量结合,显著减少了需要训练的参数数量,同时保持了模型在不同任务上的适应性。

硬提示

  虽然简单直观,但由于其需要手工制作,因此不如软提示方法高效和灵活。

 

软提示方法包括以下几种,这些方法都被集成在了🤗 PEFT(Parameter-Efficient Fine-Tuning)库中:

  1. Prompt Tuning

    • 将的通过一个固定的初始化文本来设置提示
  2. Prefix Tuning

    • 将可学习的前缀张量添加到输入序列的开头,并优化这些前缀以适应特定任务。
  3. P-Tuning

  4. Multitask Prompt Tuning

    • 为多个任务设计可学习的提示,通过共享提示张量来同时优化多个任务。

Prompt Tuning

PEFT configurations and models (huggingface.co)

蓝色的是预训练模型。

  • 模型调优(Model Tuning)

    • 左侧部分表示模型调优的过程。
    • 首先,有一个预训练的模型,包含110亿参数。
    • 针对每个任务(任务A、任务B、任务C),有相应的训练数据批次(如任务A的a1和a2,任务B的b1,任务C的c1和c2)。
    • 对于每个任务,预训练模型被分别微调,生成不同的任务特定模型(任务A模型、任务B模型、任务C模型),每个模型仍然包含110亿参数。
  • 提示调优(Prompt Tuning)

    • 右侧部分表示提示调优的过程。
    • 提示调优使用相同的预训练模型(110亿参数),而不对模型本身进行修改。
    • 不同任务的数据被混合成一个批次(Mixed-task Batch)。
    • 每个任务都有自己的提示(Task Prompts),每个提示包含2万参数。
    • 这些任务提示和相应的数据一起输入预训练模型,模型根据提示调整其行为以完成特定任务。

 

代码

 

 

 

 

 Prompt tuning 是专为文本分类任务开发的一种方法,最初应用于 T5 模型。其核心思想是将所有下游任务转换为文本生成任务。

工作原理

  1. 将任务转换为文本生成任务: 所有下游任务(如文本分类)都被转换为文本生成任务。例如,生成表示类别标签的标记。

  2. 固定模型参数: 预训练模型的参数保持不变,仅更新提示标记嵌入的梯度。

  3. 提示添加到输入中: 在输入文本前添加一系列提示标记,这些标记是模型在训练过程中学到的。

示例

假设我们有一个文本分类任务,要将输入句子分类为“积极”或“消极”。在传统方法中,模型会直接输出一个类别标签。而在提示调优中,输入句子前会加上提示标记,模型生成的输出则是表示类别标签的标记,例如:“这是一条[积极]评论”或“这是一条[消极]评论”。

prefix-tuning

PEFT configurations and models (huggingface.co)

 还是多个模型减少到一个模型

  • 微调(Fine-tuning)

    • 上半部分表示微调的过程。
    • 对于每个任务(如翻译、摘要、表格到文本),有单独的Transformer模型。
    • 每个任务的Transformer模型都经过专门的训练,以适应该任务的数据。
    • 输入(Input)是带有特定格式的文本,例如“name Starbucks type coffee shop”。
    • 模型生成相应的输出(Output),例如“Starbucks serves coffee”。
  • 前缀调优(Prefix-tuning)

    • 下半部分表示前缀调优的过程。
    • 只使用一个预训练的Transformer模型,不针对每个任务单独微调整个模型。
    • 每个任务有自己的前缀(Prefix),这些前缀是相对较小的参数集,分别用于不同的任务(如翻译、摘要、表格到文本)。
    • 输入(Input)与微调类似,但在输入之前附加了任务特定的前缀。
    • 预训练的Transformer模型根据输入和前缀生成相应的输出(Output)

 

Prefix tuning 是为自然语言生成(NLG)任务而设计的,特别应用于 GPT 模型。其工作原理与 Prompt Tuning 类似,都是在输入前添加一系列特定任务的向量,这些向量可以在保持预训练模型参数不变的情况下进行训练和更新

工作原理

  1. 任务特定向量的前缀: 在输入前添加一系列特定任务的向量,这些向量会贯穿模型的所有层。

  2. 前馈网络(FFN)优化: 使用一个独立的前馈网络来优化前缀参数,确保模型的稳定性和性能。FFN 在优化完成后会被丢弃。

  3. 保持预训练模型参数不变: 只需更新前缀参数,预训练模型的其他参数保持冻结状态。

示例

假设我们有一个生成任务,需要 GPT 模型根据输入文本生成相应的输出。在 Prefix tuning 中,我们会在输入前添加一系列特定任务的向量,这些向量会贯穿整个模型的所有层,确保在不改变预训练模型参数的情况下,优化生成的输出。

 

P-tuning

 

代码

 

 

posted on 2024-06-17 18:02  黑逍逍  阅读(39)  评论(0编辑  收藏  举报