文章目录
- 背景&概览
- Prompt-learning
- delta tuning
- 增量式
- 指定式
- 重参数化式
- OpenPrompt工具包
对应视频P41-P57
如何高效使用大模型?涉及到NLP的前沿技术,如prompt-learning&delta tuning。
prompt-learning对学习大模型范式的改变,delta tuning是从参数高效的层面上微调大模型
背景&概览
如此繁多的大模型,如何去使用它呢?
NLP的下游任务:
在预训练语言模型的时代,似乎我们有一个具有泛化知识的基准模型,但是我们似乎还是需要针对不同任务设计出不同的训练策略。
以BERT举例,对token分类可以送token进入分类层,对句子分类送 [CLS] 进去。再训练分类器
而关系抽取可以用以下几种做法:对CLS分类;对所有Token聚合到一快再分类;对上下文字符标为0,实体标为1,2…;对实体上包裹特殊字符;…
这样的工作依赖于经验性,并且需要训练分类器,在早期还可以,现在就越来越不适用了
GPT的例子:对最后一个token的representation送进去分类层,与BERT的方式大同小异。
改变:从T5开始,出现了110亿参数的大模型,并且是encoder-decoder的范式。
策略发生了改变。
不再训练分类器了,将任务映射为seq2seq的结构,直接训练模型。如情感分类问题,不再输出0,1的label,而是输出positive、negative这样的词。可以将所有任务统一为seq2seq的框架。decoder输出我们需要的token
例子:GPT-3,千亿级别的参数,并且模型架构和GPT-1和GPT-2的架构没有区别,仍然是Transformer-Decoder方式来训练。
但是,这样一个大模型如何微调和使用呢?
微调这样的大模型,是不现实的。
于是在下游任务的使用中,加上prompt,如对任务的描述,给出示例。在这个过程中,模型的参数没有被微调过,这种方式被称作为incontext-learning。
为什么work?至今没有说法可以完全解释
趋势:
模型越来越大,因为模型越大效果越好
模型越来越难以微调,此时,论文中使用十亿以上大模型的很少
高效微调:
从task和data的角度:
prompt-learning:给模型的输入加上一些额外的上下文,但在提出时都没有对prompt的性质以及生成的token进行更深入的研究
从优化的角度:
只需要优化其中的千分之一甚至万分之一的参数就可以达到微调的效果
Prompt-learning
预训练和fine-tuning似乎存在一定的Gap,在BERT的预训练时是完型填空,fine-tuning对应下游任务如情感分类
因此,在fine-tuning阶段加入额外的上下文(template,也就是模板),将MASK作为标签。从而更加自然地处理NLP任务,不同任务只需要设置不同的prompt就可以了
完成情感分类的pipeline
需要考虑的因素:
- 选取的预训练模型:自回归模型有更好的生成能力,MLM具有更好的理解能力,…,以及针对特定领域的预训练模型
- 模板的设计:人工设计、自动生成
针对自回归的模型,prompt一般把MASK词放到最后。这样会导致不一定适用于特别长的文本,但当前的大模型都是这种结构
对理解的任务更好还是使用BERT,并且可以不用拘泥于MASK的位置,在句子最前、中间、最后,都可以
T5这类模型比较通用,对生成和理解的任务都比较通用
Template人为构造的效果都比较好,考虑任务的特性构造不同的Template,这就需要人类的先验知识。
自动生成Template,甚至可以不是文本形式的,只是用字符来训练,玄学但work。
更进一步可以使用结构化模板,完成多种任务
融合多个prompt,聚合多个弱的变成强的,减少特征工程的工作量
自动生成:
自动生成的template可能没有具体的语义,但是work。实际选择的还是选取语法通顺的
prompt使用没有含义的字符
Verbalizer:将标签映射为标签词的过程
人为构造:
同义词扩充
外部知识库扩充
虚拟的词代替标签
prompt-learning对训练范式的改变:
对传统神经网络是随机初始化的,在BERT之后出现了预训练-微调的范式,在T5时出现text2text的范式,在GPT之后模型太大很难调节参数了于是出现promp-learning的方式
soft prompt:小参数驱动大模型
soft prompt插入到预训练中:可以拥有更好的初始化
Instruction Learning
在80亿之后顿悟
应用:
难以学习到隐式表达;如何用于计算机视觉?
将图片不同位置框选,再输入
delta tuning
模型大部分参数不变,只调整很小一部分参数。
大模型抽象化的能力,加上一些参数用来解决具象化的任务
之所以work,是因为在下游微调中只是激发了大模型的能力
增量式:
额外增加一些参数
指定式:
指定哪些参数可训练,哪些参数固定
重参数化式:
用低秩矩阵来完成任务
增量式
只训练adapter,只需要训练很少参数就可以达到全参数微调的效果
将adapter放到了模型的外面:节省反向传播的计算,节省显存
指定式
BitFit:不动weights,只调整bias
重参数化式
假设优化的任务可以在低维的空间完成
LoRA:
假设优化任务的矩阵本质是低秩的(不是低维),就可以强行进行低秩分解
理论解释
在低维空间的优化过程
甚至随便选一些参数微调也可以达到很好的效果
OpenPrompt工具包
定义一个统一的prompt-tuning范式,模块化呈现