随着预训练模型的参数越来越大,尤其是175B参数大小的GPT3发布以来,让很多中小公司和个人研究员对于大模型的全量微调望而却步,近年来研究者们提出了各种各样的参数高效迁移学习方法(Parameter-efficient Transfer Learning),即固定住Pretrain Language model(PLM)的大部分参数,仅调整模型的一小部分参数来达到与全部参数的微调接近的效果(调整的可以是模型自有的参数,也可以是额外加入的一些参数)。本文将介绍一些常见的参数高效微调技术,比如:BitFit、Prefix Tuning、Prompt Tuning、P-Tuning、P-Tuning v2、Adapter Tuning及其变体、LoRA、AdaLoRA、QLoRA、MAM Adapter、UniPELT等。
大模型PEFT技术原理(一):BitFit、Prefix Tuning、Prompt Tuning
论文地址:https://arxiv.org/pdf/2103.10385.pdf
代码地址:https://github.com/THUDM/P-tuning
P-Tuning和Prompt-Tuning几乎是同时出现,思路也很接近。之前很多Prompt设计都是人工的,不仅构造难度大,而且性能也不太稳定,很可能创建出导致性能大幅下降的对抗性提示。比如GPT3采用人工构造的模版来做上下文学习(in context learning),但人工设计的模版的变化特别敏感,加一个词或者少一个词,或者变动位置都会造成比较大的变化,如下图所示:
鉴于这些问题,最近的工作重点是自动搜索离散提示,也取得了一定的效果。然而,由于神经网络本质上是连续的,离散的提示可能是次优的。在这项工作中,作者提出了一种新方法——P-tuning,在连续空间中自动搜索提示。P-tuning 利用很少的连续自由参数来作为预训练语言模型输入的提示,并使用梯度下降作为离散提示搜索的替代方法来优化连续提示。
作者认为直接通过虚拟token引入prompt存在两个问题:
针对这两个问题,作者使用双向LSTM+2层MLP来对prompt进行表征, 这样LSTM的结构提高prompt的整体性,Relu激活函数的MLP提高离散型。这样更新prompt就是对应更新整个lstm+MLP部分的Prompt Encoder。下面是p-tuning和离散prompt的对比
相比Prefix Tuning,P-Tuning加入的可微virtual token,但仅限于输入层,没有在每一层都加;另外,virtual token的位置也不一定是前缀,插入的位置是可选的。这里的出发点实际是把传统人工设计模版中的真实token替换成可微的virtual token。
在知识探测任务中,默认是固定LM只微调prompt。效果上P-tuning对GPT这类单项语言模型的效果提升显著,显著优于人工构建模板和直接微调,使得GPT在不擅长的知识抽取任务中可以BERT的效果持平。
局限性:
论文地址:https://arxiv.org/pdf/2110.07602.pdf
代码地址:https://github.com/THUDM/P-tuning-v2
之前提到的Prompt Tuning,是只冻结大语言模型的参数来优化连续Prompts,这样可以大大减少每个任务的存储和训练时的内存使用,但是Prompt Tuning论文中表明当模型规模超过100亿个参数时,提示优化可以与全量微调相媲美。但是对于那些较小的模型(从100M到1B),提示优化和全量微调的表现有很大差异,这大大限制了提示优化的适用性。虽然在GLUE和SuperGLUE 基准测试上表现出一定的优势,然而在较难的硬序列标记任务(即序列标注)的有效性尚未得到验证。
基于此,作者提出了P-tuning v2,它利用深度提示优化(如:Prefix Tuning),对Prompt Tuning和P-Tuning进行改进,作为一个跨规模和NLU任务的通用解决方案。
与P-tuning相比,该方法在每一层都加入了Prompts tokens作为输入,而不是仅仅加在输入层,这带来两个方面的好处:
具体做法基本同Prefix Tuning,可以看作是将文本生成的Prefix Tuning技术适配到NLU任务中,然后做了一些改进: