SUPER-NATURALINSTRUCTIONS: Generalization via Declarative Instructions on 1600+ NLP Tasks

工作贡献

作者提出了SUPER-NATURALINSTRUCTIONS数据集,包含了1616个不同的NLP任务(分为76个不同的任务类型,包含55种语言)以及专家手写的Instruction。

DatasetCompare

作者构建了T$k$-INSTRUCT模型,该模型可以遵循多种多样的In-context Instructions(包含通俗易懂的任务定义以及$k$个任务示例)。

InContextInstruction

作者将泛化性作为各种缩放参数(例如观察到的任务数量、每个任务的示例数量和模型的大小)的函数进行了进一步的分析。

数据集质量控制

  1. 贡献者们在github上提交自己的数据集时,会立即进行自动测试。这个过程会验证提交的文件是否包含了预期的字段并符合我们期望的属性(例如,没有重复实例,输出标签不会严重不平衡等)。

  2. 由1-2位专家对数据进行迭代评审,以确保指令的清晰性和充分性。具体来说,评审人员被要求验证指令是否足够清晰且足以让普通人解决示例任务,同时语法流畅且简洁。

  3. 最后,将添加的任务交给大量的数据标注人员,收集他们对提供的指令的反馈,例如拼写错误、清晰度或其他问题。根据这些反馈,作者改进了实例的任务定义。

    实验结果

    1. 经过instruction tuning的T$k$-INSTRUCT的泛化能力明显优于其他模型,包括InstructGPT,但在新任务上表现依旧不及在该数据集上的监督学习模型。

      res

    2. 模型泛化能力跟instruction数据集中任务数量呈现一个对数线性关系。增加特定任务下的训练数据不会有太大帮助,训练时每个任务包含64个样本是一个比较合理的设置。模型规模跟模型泛化能力是正相关的。

      scale

    3. Instruction指令模版对于模型性能有明显影响。DEFINITION能帮助模型更好泛化,加入POSITIVE EXAMPLES也有提升,但是增加正样本数量就没有太大影响。此外,训练跟推理时的instruction指令设置也会影响具体推理效果。例如训练时用的instruction指令模版只涉及DEFINITION,推理时的模版只涉及POSITIVE EXAMPLES,那么推理效果会比较差。但是如果训练时struction指令模版涉及DEFINITION跟POSITIVE EXAMPLES,推理时的模版只涉及DEFINITION跟POSITIVE EXAMPLES其中之一,那么推理效果都还不错。

      combination

    总结

    Instruction tuning也属于In-context learing的范畴,跟传统的In-context learning的区别在于引入了任务指令instruction,可以通过让模型在instrcution数据上训练从而提高语言模型的ICL能力,通过提升语言模型理解任务指令的能力,进一步提升泛化能力,在新任务下往往有出人意外的效果。对于instruction的获取方式,除了人工撰写的方式外,目前也有一些工作利用语言模型去生成。除此之外,前面这几个工作都得出了一些相对一致的结论,具体如下:

    1. 增加instruction任务数,增加模型规模,都能提升模型的泛化能力,提升在新任务上的性能跟zero-shot能力。
    2. 加入COT数据可以提升模型的推理能力,混合COT跟非COT数据的instruction tuning可以保证模型在所有数据集上的表现。
    3. Instruction指令模版很重要,其中的DEFINITION跟POSITIVE EXAMPLES必不可少,而NEGATIVE EXAMPLES则可有可无。同时需要注意训练跟推理时instruction指令模版设置的差异。
    4. 注意不同任务下的数据均衡,每个任务下的训练样本数不需要太多。
    5. Instruction tuning的模型在新任务上的表现依旧不及在该数据集finetune的监督学习模型。

Scaling Down to Scale Up: A Guide to Parameter-Efficient Fine-Tuning

整篇论文的思维导图如下:

Mindmap

背景

  1. 当前模型、硬件发展速度差异过大
    • 2018-2023年间,模型的参数量增长了500余倍,但显存增长还不到10倍,这使得fine-tuning预训练模型不太可行。
    • 训练模型需要模型权重12-20倍的空间才行
  2. In-context learning虽然成为了调整预训练模型的标准方式,但仍存在问题
    • transformer有限的上下文大小人为地将训练集限制到了几个例子
    • 扩大上下文大小会导致推理成本的二次增加
    • 尽管当前语言模型在few-shot下表现出色,但“更多数据”始终是更可靠的方式
  3. PEFT(Parameter-efficient fine-tuning)应运而生
    • PEFT旨在通过训练当前模型中的一小部分参数或者当前模型以外的参数来撬动杠杆,微调预训练模型

分类

taxonomy

  1. Additive方法(目前研究最多的方法)
    1. 核心思想:使用额外的参数或者层来增强现有的预训练模型,并且只训练新添加的参数

    2. Adapters

      • 核心思想:在Transformer的子层之后添加一个小的全连接网络

      • 变体:更改Adapters的放置位置,剪枝,重参数化

      • Adapters

        • 核心思想:在注意力层和FFN层之后添加全连接网络

        • 只微调4%的参数就媲美完整的fine-tuning

        • 伪代码

          adapter

      • AdaMix

        • 核心思想:以专家混合的方式使用多个adapters

        • 伪代码

          AdaMix

    3. Soft Prompts

      • 核心思想:通过将输入变成任务描述和一些任务示例的组合体来控制语言模型的行为
      • 缺点:难以优化且被模型的最大输入长度限制了示例的数目
      • 变体:通过梯度下降调整模型的输入embedding,将离散优化问题变成了连续优化问题
      • Prompt tuning
        • 核心思想:将一个可训练的向量拼接到模型的输入embedding之前

        • 伪代码

          PromptTuning

      • Prefix tuning
        • 核心思想:将可训练的参数拼接到所有层的隐藏状态之前

        • 伪代码

          PrefixTuning

      • Intrinsic Prompt Tuning (IPT)
        • 核心思想:使用autoencoder来(解)压缩soft prompt

        • 伪代码

          IPT

    4. Other Approaches

      • LeTS,LST,(IA)$^3$等降低了存储占用,降低了计算成本,提高了模型准确性
      • Ladder-Side Tuning (LST)
        • 核心思想:在预训练网络的旁边训练一个小的transformer,然后将两者的隐状态组合起来更新只更新小的模型

        • 伪代码

          LST

      • (IA)$^3$
        • 核心思想:每个transformer块只学习三个新的参数$l_v$,$l_k$,$l_{ff}$(分别代表rescale key,rescale value,FFN的激活函数)

        • 伪代码

          IA3

  2. Selective方法
    • 核心思想:选择性地更新模型的一部分参数
    • 变体:只更新顶层参数,稀疏更新
    • BitFit
      • 核心思想:只微调模型的biases

      • 伪代码

        BitFit

    • DiffPruning
      • 核心思想:在微调过程中学习mask掉一些参数,以实现权重的稀疏更新

      • 伪代码
        $$
        \delta=z\circ\Delta W
        $$

    • Freeze and Reconfigure (FAR)
      • 核心思想:选择参数矩阵的列进行修剪,并将线性层重新配置为可训练的和冻结的

      • 伪代码

        FAR

    • FishMask
      • 核心思想:基于他们的Fisher information选取top-p个参数进行微调

      • 伪代码

        fisher

        FishMask

  3. Reparametrization-based方法
    • 核心思想:使用低秩表示来最小化可训练参数的数量

    • Intrinsic SAID

      • 核心思想:使用Fastfood变换来重参数化模型权重的更新
    • LoRa

      • 核心思想:将权重矩阵的参数更新分解成两个低秩矩阵的乘积

      • 伪代码

        lora

    • KronA

      • 核心思想:使用Kronecker积代替原来的分解方式来减小Lora的计算开支

      • 伪代码

        KronA

  4. Hybrid方法
    • 核心思想:将前述几种类别的方法进行组合

    • SparseAdapter

      • 核心思想:使用一个大的hidden dimension,然后剪枝掉40%
    • MAM Adapters

      • 核心思想:将adapter并行化和soft prompt相结合

      • 伪代码

        MAM

    • UniPELT

      • 核心思想:将LoRa,prefix-tuning,adapters使用门机制组合

      • 伪代码

        UniPELT

    • Compacter

      • 核心思想:使用Kronecker积,低秩矩阵,并且在各层之间参数共享来产生adapter的权重

      • 伪代码

        compacter

    • S4

      • 核心思想:将连续的层分为四个不均匀的组,然后分别进行PEFT技巧的多种组合

      • 组合方式

        S4

对比

从五个方面对PEFT方法进行比较:存储效率,内存效率,计算效率,准确性,推理开销

compare

compare2

对比中的问题

  1. 参数量不一致
    • 参数量可以分为三种:可训练参数量,原始模型和微调模型之间改变的参数量,原始模型和微调模型之间的差异的秩
    • 即使可训练参数量是内存效率最可靠的评价指标,也依旧不完美,例如Ladder-side Tuning方法使用了一个单独的侧网络,其参数比LoRa或BitFit多,但由于不对主网络进行反向传播计算,因此需要更少的RAM
  2. 模型大小
    • 较大的模型在微调过程中需要更新的参数数量更少,无论是在百分比还是绝对值方面,当模型足够大时,甚至能达到绝对值减少的效果
  3. 没有标准的benchmark和metric
    • 新的方法通常在不同的模型/数据集组合上进行评估,这使得得出有意义的结论变得困难。
  4. 开源实现的问题
    • 开源代码经常不可重用,缺乏详细的文档或示例

最佳实践

  1. 明确指出参数量的类型,或者最好是三种参数量都有统计
  2. 使用不同大小的模型进行评估
  3. 除了与sota方法比较之外还应当与相似的方法进行比较
  4. 构建标准化的PEFT benchmarks
  5. 确保开源代码的简洁易懂,易于重用