prompt的意义:
以前使用预训练模型都是Pre-train,Fine-tune的模式,这种模式的缺点就是当存在多个下游任务时,需要在上游复制多个模型,因为fine-tune后它们的参数因任务不同而不同。
如果有10个下游任务就要存储并训练10个上游模型,这样就很占空间和资源。
prompt采用Pre-trian,Prompt-tune的方式,上游的预训练模型不变,让下游的任务去适配上游。节省了空间和资源。
prompt的结构:
prompt包含两部分:template和verbalizer。
template负责让模型认识到这是什么任务,然后输出比如it is good,verbalizer就负责将这个good转化成对应的结果:positive。
AutoPrompt
trigger训练的那个语料来自下游任务相关的数据集。比如任务是情感分析,他就分析大量情感分析的数据集,按loss对每个词的一阶导,得到对这个任务最关键的那些词。
这些词只要加入模型里,模型就一定会输出固定的东西。比如检测到great就一定会输出positive,这种标志性的词。
那他针对一个任务,训练出最标志性的词,然后将他们作为prompt模板,这样就是机器认识这是什么任务,人类可能根本看不懂这个prompt句子(比如sentiment think is thought MASK,这个语法上不成句,但是是由一堆标志性的词组成,模型一定认识是个情感分析任务)
AutoPrompt & LM-BFF
首先用AutoPrompt搜索出来一组token作为template输入。
比如the capital of Japan is MASK。
以前的模型效果不好,就换模板,the city of Japan is MASK。
他提出来直接训练模板的embedding。因为模板:the capital of … is 都是一系列的embedding嘛,他直接训练这个embedding。
不过这个文章缺点在于他用的是最初的PET的方法来训练,也就是prompt模板是手工指定的。
prefix-tuning
直接固定PLM的参数,只训练prompt的参数。所以比如有10个下游任务,我们只需要训练10种prompt就可以了,大大减少了参数数量。
其实我们模型占显存的主要部分不是参数,而是参数的中间变量。比如要进行梯度回传,我们要保存所有中间变量的梯度,这个是最占资源的。而这个方法的优势就是大量的参数是在PLM中的,而他的参数是固定的,所以不用梯度回传,不用保存中间变量。大大节省资源。
P-Tuning v2
思路很简单,就是more parameters。
就是在中间层,给prompt部分,concatente几个embedding。
所以self-attention的个数增加了,大小没变。
相当于输入的prompt变长了,但是为什么不在输入端改呢?因为层数越靠后,效果越显著。在输入端优化,传到末端基本都没了。
大概的流程:一开始初始化ptompt embedding,然后去训,发现效果不好。然后用这个embedding去与其他任务的prompt embedding做一个余弦相似度判断,找出最相似的那个,然后作为新的初始化再进行训练,然后效果好很多。
CPT
task是一个问题:比如the horse watched by the woman,要指出是那一匹马。
我们有prompt方法,可以用mask预测遮掉的词。但是我们现在要预测视觉内容(是哪一匹马),所以他把所有的对象染上颜色,然后用分类判定这个mask的是什么颜色。
一个领域每周一两百篇文章,一个人是不可能读的完的。所以要进入一个领域,一定要组团做,大家一起读。