- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
这一章我们介绍固定prompt微调LM的相关模型,他们的特点都是针对不同的下游任务设计不同的prompt模板,在微调过程中固定模板对预训练模型进行微调。以下按时间顺序介绍,支持任意NLP任务的T5,针对文本分类的两篇PET和LM-BFF.
在小样本场景,固定prompt微调LM对比常规微调的优点,在分类任务上比较直观我能想到的有三点(在下面PET中会细说) 。
- paper: 2019.10 Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
- Task: Everything
- Prompt: 前缀式人工prompt
- Model: Encoder-Decoder
- Take Away: 加入前缀Prompt,所有NLP任务都可以转化为文本生成任务
T5论文的初衷如标题所言,是为了全面公平的对比不同预训练和迁移策略的贡献和效果,避免在A模型上效果不好的预训练目标在B上可能效果更优的情况,对比项包括 。
说句题外话,再看论文结果发现Encoder-Decoder的模型结果+SpanMLM损失函数效果最好。不知道这是否是谷歌押注T5,而没有像OpenAI一样选择Deocder结构的原因.
具体对比结果这里不细说,本文只关注T5为了公平对比以上差异,提出的Text2Text的通用建模框架:用相同的模型,相同的预训练,相同的损失函数和解码方式,把文本分类,摘要,翻译,QA都转化成了生成任务,而转化的方式就是通过加入前缀prompt.
针对不同的下游微调任务,我们看下T5提出的Text2Text是如何构建prompt模板的 。
不难发现在T5的时代,prompt模板的构建还比较粗糙,更多是单纯的任务名称+任务类型来区分不同的NLP任务,只是让模型在解码时多一层条件概率,既给定不同prompt前缀在解码时采用不同的条件概率(attention)。并没有太多从语义和上下文关联的角度去进行prompt模板的构建,我猜这是T5在论文中提到他们尝试了不同的prompt模板发现效果影响有限的原因(哈哈因为都不太好所以没啥差异),不不能否定T5在通用LM上做出的贡献~ 。
- paper a: 2020.1 Exploiting Cloze Questions for Few Shot Text Classification and Natural
- prompt: 单字完形填空式人工Prompt
- Task: Text Classification
- Model: Roberta-large, XLM-R
- Take Away: 加入完形填空式Prompt把文本分类任务转化成单字MLM
和第一章的LAMA相似,PET-TC也是把输入映射成完形填空式的prompt模板,对掩码词进行预测作为分类标签。不过PET没有直接使用prompt,而是用了半监督的方案。用多个prompt模板微调模型后,对大规模无监督数据进行预测,然后在伪标签上进行常规的模型微调,哈哈绕了一个圈最后还是输出的常规微调的模型。我大胆猜测作者很看好prompt范式在微调时引入的前置语义信息,以及无额外参数的设定,但是对不同prompt和answer模板带来的不稳定性感到头疼,于是搞出这么个折中的方法~ 。
PET针对每个数据集人工设计了prompt模板和Answer词对标签的映射。针对单双文本输入分别举两个例子,以下a,b为原始输入文本,'_'位置为MASK词 。
可以看出作者构建prompt模板的思路是尽可能还原文本所在的上下文场景,Answer词的选取是一对一的构建模式,每个label只选取一个词来表示.
完形填空式的prompt模板在微调时的优势,我认为主要有以下三点 。
微调的损失函数是交叉熵,作者没有引入额外参数,而是把MASK位置上模型的预估logits在label上归一化来得到分类预测。例如上面的AG新闻分类任务,先得到MASK位置worlds,sports,business,science这四个词的预测logits,然后归一化得到预估概率,再和分类标签计算交叉熵.
为了避免灾难遗忘作者在下游任务微调时加入了预训练的MLM任务,于是微调的损失函数如下 。
这部分的设计可以和prompt的部分分开来看,是一个半监督方案。以上每个任务对应的多个prompt模板,分别固定prompt微调LM得到一版模型,然后在大量的未标注样本上进行预测,再对多个模型的预测值进行加权得到伪标签.
最终在为标签上使用常规的微调方案(加classifier head),训练模型作为输出,这一步类比知识蒸馏。所以PET最后输出的还是常规的监督微调模型,Prompt只是被当做了一种半监督方案。效果上在小样本的设定上比直接使用监督微调都有一定的效果提升.
作者还做了iPET对以上过程通过迭代逐步扩大数据集,提高伪标签准确率的方案,不过这么麻烦的实现一点都不适合我这种懒人,哈哈就不细说了~ 。
针对PET有几点疑问 。
后面介绍的几个模型,大多是基于PET上述问题的改良~ 。
- paper b: 2020.9 It’s not just size that matters: Small language models are also few-shot learners.
- Prompt: 多字完形填空式人工Prompt
- Task:Text Classification
- Model: Albert-xxlarge-v2
- Take Away: 支持多字的完形填空Prompt,效果超越GPT3
这篇paper和上面的PET-TC是同一作者,算是上文的续作,主要优化了Answer词单token设定,支持多个token作为标签词,不过限制性依旧较强是预先设定任务最大的token数,然后使用最大token数作为MASK数量,而非动态的任意数量的MASK填充.
论文对推理和训练中的多MASK填充做了不同的处理。在推理中需要向前传导K次,如下图所示 。
在训练过程中为了提升效率,论文使用了一次向前传导对多个位置同时完成预估,这时MASK长度是所有标签的最大长度。例如情感分类问题terr##ble长度为2,great长度为1,这时MASK填充长度为2,great只取第一个MASK词的概率,后面的忽略,概率计算如下 。
其他部分和PET基本一样这里不再重复。效果上这篇论文换成了Albert-xxlarge-v2模型和GPT-3 few-shot在superGLUE上进行效果对比。不过以下参数对比并不太合理,虽然Albert是层共享参数,但是推理速度并无提升,12层的xxlarge模型参与计算的参数量级应该是223M*12~2B,所以并不是严格意义上的小模型。调整参数后,32个小样本上PET的效果也是超过同等量级甚至更大的GPT3在few-shot上的效果的 。
- paper: 2020.12 Making Pre-trained Language Models Better Few-shot Learners
- Prompt: 完形填空自动搜索prompt
- Task: Text Classification
- Model: Bert or Roberta
- Take Away: 把人工构建prompt模板和标签词优化为自动搜索
LM-BFF是陈丹琦团队在20年底提出的针对few-shot场景,自动搜索模板和触发词的Prompt方案,prompt模板延续了PET的完型填空形式,把人工构建prompt和标签词的构建优化成了自动搜索。论文先是验证了相同模板不同标签词,和相同标签词不同模板对模型效果都有显著影响,如下 。
以下介绍自动搜索的部分 。
考虑在全vocab上搜索标签词搜索空间太大,在少量样本上直接微调选择最优的标签词会存在过拟合的问题。作者先通过zero-shot缩小候选词范围,再通过微调选择最优标签词.
如下,固定prompt模板(L),作者用训练集中每个分类(c)的数据,在预训练模型上分别计算该分类下MASK词的概率分布,选择概率之和在Top-k的单词作为候选词。再结合所有分类Top-K的候选词,得到n个标签词组合。这里的n和k都是超参,在100~1000不等.
然后在n个候选标签词组合中,针对微调后在验证集的准确率,选择效果最好的标签词组合.
固定标签词,作者使用T5来进行模板生成,让T5负责在标签词前、后生成符合上下文语义的prompt指令,再在所有训练样本中选择整体表现最优的prompt模板.
如下, 固定二分类的标签词是great和terrible,T5的模型输入为Input+MASK+标签对应标签词+MASK,让模型来完成对MASK部分的填充。现在预训练模型中通过Beam-Search得到多个模板,再在下游任务中微调得到表现最好的一个或多个prompt模板 。
以上自动搜索prompt和标签词得到的部分结果如下,该说不说这种方案得到的标签词,至少直观看上去比AutoPrompt合(人)理(类)不(能)少(懂):
经过以上搜素得到最优标签词组合和prompt模板后,作者的微调过程模仿了GPT3的few-shot构建方式。如上图,先把输入填充进prompt模板,再从各个分类中各采样1个样本作为指令样本拼接进输入,为待预测文本补充更丰富的上下文,一起输入模型。在训练和推理时,补充的指令样本都是从训练集中采样.
同时为了避免加入的指令样本和待预测样本之间差异较大,导致模型可能直接无视接在prompt后面的指令样本,作者使用Sentence-Bert来筛选语义相似的样本作为指令样本.
效果上,作者给出了每类采样16个样本的小样本场景下, Roberta-Large的效果,可以得到以下insights 。
最后此篇关于解密Prompt系列2.冻结Prompt微调LM:T5&PET&LM-BFF的文章就讲到这里了,如果你想了解更多关于解密Prompt系列2.冻结Prompt微调LM:T5&PET&LM-BFF的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
好的,我最近有great answers to a question about how to do some sub-selects in an activerecord query .我现在有一个
我有一个简单的宠物应用程序。 该应用程序显示所有宠物商店以及当您单击宠物商店时。你会看到所有的宠物名字,图片。 问题是在我创建了第一个宠物和其他宠物之后。该模板不会更新新的 pets 。所以,它只显示
我正在为 Android 创建一个有机体模拟器,所以我想算法最好是用 Java 编写。我知道 youtube 上有一整套关于机器学习的斯坦福类(class),但我根本没有时间看完整个类(class),
嗨,我正在尝试使用 PET解析器,但提供的使用文档不足。谁能给我推荐一篇关于使用 PET 的好文章或教程?它支持utf-8吗? 最佳答案 要使用 PET 解析器,首先必须为感兴趣的语言加载语法。语法必
我想从带有时区 PET 的 API 中解析日期字符串。所以我创建了 NSDateFormatter 并将字符串转换为日期,但不幸的是它不起作用。结果我没有得到。任何解决方法? NSDateFormat
我在 django 中使用默认用户模型已经有一段时间了,我意识到,如果我需要进一步增强它,我将不得不在 django 1.5 中创建我自己的自定义用户模型。 我创建了我的自定义用户模型,并且我有一个允
简化示例。 我有一个有几个字段的模型: OwnerFirstName OwnerLastName List Pets (Pet is a few string fields) UI 需要允许用户添加任
我不知道ContainerBaCommand的来源,但这是我的错误: 我首先必须将javax.jar(具有servlet)类添加到C:\ JEE6SDKglassfish3 \ glassfish \
简化示例。 我有一个有几个字段的模型: OwnerFirstName OwnerLastName List Pets (Pet is a few string fields) UI 需要允许用户添加任
我刚刚为我的虚拟宠物添加了 sleep 和饥饿功能,但现在脚本无法运行,我不确定我做错了什么,因为一切看起来都很好。我将向您展示原始脚本(有效)和我修改后的脚本。 我不太确定我错过了什么,我花了相当多
我得到了一个练习,它应该适用于不同的类以及它们在不同类之间的关系。 作用于不同类的函数应该为一个抽象的基本类定义,然后在对象上使用,该类是基本类的子类。 在本练习中,我应该展示分离为接口(interf
这一章我们介绍固定prompt微调LM的相关模型,他们的特点都是针对不同的下游任务设计不同的prompt模板,在微调过程中固定模板对预训练模型进行微调。以下按时间顺序介绍,支持任意NLP任务的T5,针
我发现的 PET 的零页内存映射声称零页地址范围 $00C2..$00D9 用于静态数据,例如http://www.classiccmp.org/dunfield/pet/petmem.txt 说:
我想创建一个路径,它接受以逗号分隔的任意数量的 ID。它应该接受以下所有内容: GET /pets/1,2 # returns info about pets with ids 1, 2 GET /
我目前收到此错误: builtins.AttributeError: 'Pet' object has no attribute 'get_name' 它在程序末尾的 for 循环之后显示代码行 pr
我不熟悉如何通过原生制造商软件处理 DICOM 图像。我正在尝试将一组重建的经轴切片中的 PET 图像读入 MatLab。我的目的是做一些简单的分割,最后确定分割中的最大和最小像素值。但是,我无法将存
我正在尝试理解 Pybind11 docs here 中使用的静态转换.具体来说,他们使用语法 static_cast(&Pet::set) 因为在我努力解释并应用到我自己的代码之前我还没有见过这种语
我有一个 Ruby on Rails 应用程序,其中有以下资源:宠物、宠物类型、疫苗接种(给宠物接种疫苗的事件)和人员。所以,宠物属于一个类型(一个类型有很多宠物),疫苗接种属于宠物(一只宠物可以有很
我有一个 Ruby on Rails 应用程序,其中有以下资源:宠物、宠物类型、疫苗接种(给宠物接种疫苗的事件)和人员。所以,宠物属于一个类型(一个类型有很多宠物),疫苗接种属于宠物(一只宠物可以有很
我正在尝试让 pixy 宠物为我的项目工作。 https://learn.adafruit.com/pixy-pet-robot-color-vision-follower-using-pixycam
我是一名优秀的程序员,十分优秀!