来自:老刘说NLP
Zero-shot、One-shot以及Few-shot让人傻傻分不清,读了很多文章,也没搞清楚他们的差别,究竟什么叫zero-shot,其在应用过程中的nogradientupdate是什么含义,zero-shot是否为一个伪命题,成为了一些有趣的问题。
我们发现,如果引入incontext-learning这一思想,作为一个fewshot任务来提升ChatIE这类模型的性能,可能是一个很好的思路,在此基础上个配上一个开源项目进行解释能够增强了解。
先谈谈Zero-shot、One-shot以及Few-shot
也就是说,只有推理阶段,没有训练阶段。这个常见于chatgpt中qa形式,直接通过问题prompt,基于已训练好的大模型,进行直接预测。
Few-shot与One-shot
如果训练集中,不同类别的样本只有少量,则成为Few-shot,如果参与训练学习,也只能使用较少的样本数。
如果训练集中,不同类别的样本只有一个,则成为One-shot,属于Few-shot的一种特殊情况。
但其中的“nogradientupdate让人费解”,后面想了想,有2种理解:
单次微调,参数更新,但微调后模型不保存。
LLM由于参数量巨大,导致更新起来困难。因此很少对训练好的LLM做微调。但是为了在特殊任务上有较好的表现,但是又不固定微调后的模型,所以提出了one-shot、few-shot的方式,通过加入偏置,影响模型的最终输出。
而one-shot、few-shot可以变相的理解成用一个/多个example进行模型微调,但是微调后的模型不保存。每次提供inference都要微调一遍,Nogradientupdatesareperformed.就是说提供inference的模型参数保持不变,但这其实是tuning的范畴。
直接不微调,参数直接不更新
如果不更新参数,那么这种学习就是瞬间的,不构成learning。预训练模型自身训练完后本身有一套参数,finetune就是在预训练基础上继续训练,肯定会有梯度更新,因为finetune后参数会变,参数变了梯度必然会更新。直接推理出答案,后台梯度也不更新。
需要注意的是,如果以这个模型到底有没有见过标注样本,来划分zero-shot与其他的差别,就是主要见过,无论是在推理阶段用【不更新梯度】,还是加入finetune阶段参与训练【更新参数】,那就肯定不是zero-shot,否则就是数据泄漏。
这也就是说,如果在prompt中是否加入一个或者多个正确的例子,例如分类任务中,加入一些正确的任务描述例子,都不能算作是zero-shot,但是问题是你怎么能保证模型训练没有用过这些数据,他们当时训练就可能搜集到了,模型说不定都见过,也就是说至少不存在严格意义的zeroshot。
从ChatIE:面向REEENER三种任务的伪zero-shotprompt说起
最近有篇文章《Zero-ShotInformationExtractionviaChattingwithChatGPT》很有趣,该工作将零样本IE任务转变为一个两阶段框架的多轮问答问题,并在三个IE任务中广泛评估了该框架:实体关系三元组抽取、命名实体识别和事件抽取。在两个语言的6个数据集上的实验结果表明,ChatIE取得了非常好的效果,甚至在几个数据集上上超过了全监督模型的表现。
其实现基本原理为,通过制定任务实体关系三元组抽取、命名实体识别和事件抽取,并为每个任务设计了2个步骤的prompt-pattern,第一步用于识别类型,第二步用于识别指定类型的值。将抽取的任务定义进行prompt填充,然后调用chatgpt接口,在取得结果后进行规则解析,结构化相应答案。
例如,关系抽取的具体执行步骤包括:针对每类prompt,分别调用prompt-pattern,得到相应结果,以事件抽取prompt为例,
任务要素定义:
文章为作者独立观点,不代表股票交易接口观点