seed+transformer+finetune+图文融合+VLP+Prompt Learning整合

2023-11-09

1.Seed

在神经网络中,参数默认是进行随机初始化的。不同的初始化参数往往会导致不同的结果,如果不设置的话每次训练时的初始化都是随机的,导致结果不确定。当得到比较好的结果时我们通常希望这个结果是可以复现的,如果设置初始化,则每次初始化都是固定的,在pytorch中,通过设置随机数种子也可以达到这么目的。

#固定随机种子 args.seed=SEED(SEED之前已经设置初值,如31)
在设置随机数种子时需在最前面加上  
np.random.seed(args.seed) #给numpy也设置随机数种子(没有使用GPU的时候设置的固定生成的随机数)   
torch.manual_seed(args.seed) #为CPU设置种子用于生成随机数,以使得结果是确定的   
torch.cuda.manual_seed(args.seed) #为当前GPU设置随机种子;

torch.cuda.manual_seed_all()为所有的GPU设置种子。

从每堆种子里选出来的数都是不会变的,从不同的堆里选随机种子每次都不一样,若想每次都能得到相同的随机数,每次产生随机数之前,都需要调用一次seed()。

个人小结:
直接三连即可

np.random.seed(config["general"]["seed"])
torch.manual_seed(config["general"]["seed"])
torch.cuda.manual_seed_all(config["general"]["seed"])

参考
https://www.zhihu.com/question/288350769/answer/1344058217
https://blog.csdn.net/qq_30129009/article/details/102730646

2.Transfomer

注意力机制考虑随意线索
-随意线索被称之为查询(query) 有意识
-每个输入是一个值(value)和不随意线索(key)的对
-通过注意力池化(汇聚)层来有偏向性的选择某些输入

Transformer是一个纯使用注意力的编码-解码器,类似Seq2Seq
Encoder和Decoder都有n个transformer块
每个块里使用多头(自)注意力,基于位置的前馈网络,和层归一化
而Bert是一个双向12层block的Transfomer,且只有Encoder(同时输入两句话,采用,分开)
多了个segment编码,和位置嵌入是可学习的
任务则是完形填空和预测下一句子,所以只能用来预训练。

图像做Transfomer可以吗?->图像标注与监督问题
一般认为,图像级的标注是弱标注(例如图像分类的类别标注),像素级的标注是强标注(例如分割标注的mask标注),对于普通的分割任务来说:数据是图像,标注是mask,这属于完全监督问题Supervised;如果标注是annotations或者图像级标注,这属于弱监督问题Weakly-supervised;如果标注只有少部分是mask,剩余是annotations或者图像级标注,这属于半监督问题Semi-supervised。

图片转token
(1)首先是ViT简单粗暴的patch划分,以及MLP映射,变成了一个个的image token。这是目前的主流方案,包括各种多模态算法,如CLIP等只要用到ViT结构都是原样照搬;
(2)后续BEiT使用离散VAE来生成image token;
(3)11月中旬 中科大和MSRA提出的PeCo,引入感知相似性的思想,通过VQ-VAE进行token生成。性能上也略微超过MAE。

PS:VAE即Variational Autoencoders,是一种去压缩数据抽取核心特征的技巧,可以将复杂高维度的数据简化。

Autoencoders通常由编码器和解码器两部分组成。Encoder一般就是几层神经网络(可以是全连接或者是卷积)组成的,它负责压缩输入数据,获得输入数据紧凑低维度的表达形式,我们一般把它的结果称为bottleneck;
Decoder以Encoder输出的bottleneck作为输入,它也由几层全连接或卷积网络组成,它负责重构输入数据。

这个网络的最后步骤就是比较重构后的输入与原始输入的区别,计算reconstruction loss用于训练。
事实上,训练一个编解码器结构的过程就是一种寻找数据压缩方式的过程。

VAE 与 autoencoder 的区别在于,autoencoder 的重构目标是固定的结果向量本身,而 VAE的目标则是输入的分布状况。
在实现过程中,两者之间的唯一差别在于autoencoder 中的 bottelneck 向量,在VAE 中会拆成两个———均值向量和标准差向量。然后使用均值方差参数进行采样,将采样的结果再送入到解码器中。

VAE 的loss通常由两部分组成:
在这里插入图片描述
VAE 结构中值得注意的一点是bottleneck之后的采样方式如何选取。有一个问题是普通的采样过程不可以通过backpropogation回传梯度。我们在这里需要用到reparameterization 技巧,我们把结果看成 如下表达,

z = μ + σ ⊙ ε, ε ~ Normal(0,1)

这样就可以计算μ和σ的梯度,epsilon的值我们不需要在意, 把它固定看成正态分布就可以了。

3.Finetune

微调指导事项
1.通常的做法是截断预先训练好的网络的最后一-层( softmax层) , 并用与我们自己的问题相关的新的softmax层替换它。例如, ImageNet上预先训练好的网络带有1000个类别的softmax图层。如果我们的任务是对10个类别的分类,则网络的新softmax层将由10个类别组成,而不是1000个类别。然后,我们在网络上运行预先训练的权重。确保执行交叉验证,以便网络能够很好地推广。

2.使用较小的学习率来训练网络。由于我们预计预先训练的权重相对于随机初始化的权重已经相当不错,我们不想过快地扭曲它们太多。通常的做法是使初始学习率比用于从头开始训练(Training from scratch )的初始学习率小10倍。

3.如果数据集数量过少,我们进来只训练最后一-层 ,如果数据集数量中等,冻结预训练网络的前几层的权重也是一种常见做法。这是因为前几个图层捕捉了与我们的新问题相关的通用特征,如曲线和边。我们希望保持这些权重不变。相反,我们会让网络专注于学习后续深层中特定于数据集的特征。

不同数据集下使用微调
数据集1 - 数据量少,但数据相似度非常高-在这种情况下, 我们所做的只是修改最后几层或最终的softmax图层的输出类别。

数据集2 -数据量少,数据相似度低.在这种情况下,我们可以冻结预训练模型的初始层(比如k层),并再次训练剩余的( n-k )层。由于新数据集的相似度较低,因此根据新数据集对较高层进行重新训练具有重要意义。

数据集3 -数据量大,数据相似度低-在这种情况下,由于我们有一个大的数据集 ,我们的神经网络训练将会很有效。但是,由于我们的数据与用于训练我们的预训练模型的数据相比有很大不同。使用预训练模型进行的预测不会有效。因此,最好根据你的数据从头开始训练神经网络( Training from scatch )。

数据集4 -数据量大,数据相似度高-这是理想情况。在这种情况下,预训练模型应该是最有效的。使用模型的最好方法是保留模型的体系结构和模型的初始权重。然后,我们可以使用在预先训练的模型中的权重来重新训练该模型

4.如何评价FAIR最新研究ViT-based Mask R-CNN? 建议想了解的可以去知乎看下

5.图文融合的趋势,来自知乎 王宁的回复

(1)多模态任务主要分为Align和Fuse两大派系。也有称为light fusion和heavy fusion
前者的fusion方式通常十分简单,如向量内积,代表是CLIP和ALIGN,他们是一种双塔结构,重点在于多模态的对齐,以便于图文匹配、检索等下游任务。
后者的fusion方式便是Transformer,代表有VLP、OSCAR、UNITER、VINVL等,他们可看做是一种单塔结构,重点在于利用attention机制融合多模态信息,可以做更多的任务,可实现VQA、caption等需要信息融合和理解的下游任务,这一点是Align类算法做不到的。但话说回来,这类方法在检索的效率上又不如CLIP,毕竟每一对img-text pair都要经过BERT融合,再用CLS embedding做分类。而CLIP等算法可以预先存储好img和text的特征,再逐一比对即可。
归结而来,用什么算法要看任务而定。而目前也隐隐出现了两类方法一统的趋势:双塔模型作为底座,单塔模型在上层融合,先做好align再做好fusion。
Transformer中的attention,具备着不同特征空间(multi-head)以及全局范围(non-local)的特征聚合能力,确实适合多模特征表达的对齐和融合。

(2)先给结论,王宁个人推荐ALBEF和BLIP,原因两点:端到端模型,单塔和双塔统一。
优秀的"图像+文本"的多模态论文有很多,比如早期的VILBERT [1], LXMERT [2], VLP [3], UNITER [4], Oscar [5]等。这些方法大都借鉴BERT的思想进行masked language modeling对齐多模态,有时加入或干脆使用其它约束,比如Oscar利用目标检测器得到的图片tag作为anchor辅助多模态的对齐,UNIMO主要使用contrastive loss进行多模态对齐。这些方法很优秀,但是主要不足在于,这些框架的图片特征大多都源于目标检测算法,例如Faster RCNN得到的RoI特征,整个框架不是端到端的训练。

趋势是端到端训练(比如CVPR 2021的oral论文SOHO [7]),另外便是单塔和双塔模型的统一。在上一个回答中王宁感觉先做好双塔模型的对齐,再做好单塔的特征融合可能是一种趋势。不久后,王宁就看到这篇"align before fuse" [10],不禁感慨大佬做得真早。论文的主要思想就是利用双塔结构,visual encoder+text encoder(BERT前6层)使用contrastive loss进行对齐,然后再利用BERT的后6层初始化一个单塔模型,进行多模态信息融合,因此该算法可以以双塔形式快速地img-text检索,上面的单塔模型可以做各种VL任务如captioning和VQA。最近这位大佬继续发力,扩展出了BLIP算法 [11]。贴上流程图:

视觉部分是ViT模型, 可以端到端训练。text encoder部分是一个BERT模型,作者巧妙地设计了一个局部模块共享和非共享的策略。当不插入cross-attention模块时,这个BERT模型就充当纯粹的text encoder,因而可以和ViT分支组合成双塔模型,也就是说,上图的前两个分支可组合成一个CLIP的结构。当插入cross-attention模块后,BERT模型就可以以一种相对heavy fusion的方式融合图像和文本特征,可以实现生成等任务,比如image captioning。作者多种任务联合训练,并使用不同的special token来区分不同任务。
[7] Seeing out of the box: End-to-end pre-training for vision-language representation learning. In CVPR, 2021.
[10] Align before fuse: Vision and language representation learning with momentum distillation. In NeurIPS, 2021.
[11] BLIP: Bootstrapping language-image pretraining for unified vision-language understanding and generation. arXiv preprint arXiv:2201.12086, 2022.
试玩地址
https://huggingface.co/spaces/Salesforce/BLIP/tree/main

6.VLP

VLP模型的预训练任务可以分为两类:图像-文本对比学习任务和基于语言建模任务

E2E-VLP【目标检测和图像字幕生成,自然语言视觉推理、跨模态检索】

Before:主要采用两步训练过程,即首先使用预训练的目标检测器提取基于区域的视觉特征,然后将图像表示和文本嵌入串联起来作为Transformer的输入进行训练 。

Disadvantage:视觉表示泛化能力弱【目标检测知识受限,限制模型性能 】、以及二阶段pipeline计算效率低下【目标检测提取区域特征非常耗时额外约束模型】
本文提出了第一个用于V+L理解和生成的端到端视觉语言预训练模型(E2E-VLP),在该模型中,作者建立了一个统一的Transformer[Encoder,Decoder]框架,直接从图像像素级学习视觉区域特征和跨模态表示,用于联合学习视觉表示和图像与文本之间的语义对齐。

E2E-VLP可以灵活地应用于基于编码器模块的视觉语言理解任务 和基于编码器-解码器模块的视觉语言生成任务 。

图像表示
(像素级)CNN主干网络来从图片中提取低分辨率的特征图。然后在使用一个1x1的卷积将通道维度降低,得到新的特征图。由于Transformer编码器需要输入一个一维的序列,因此还需要把特征图在空间维度上进行flatten得到。并加入了位置信息,得到最终的图像表示。(Transformer对位置不敏感)

跨模态的编码器预训练
Transformer学习图像grid特征和语言token之间的跨模态注意。为实现细粒度的特征级语义融合,将图像特征和文本嵌入concat构成输入序列(Pretrain task:MLM,ITM)
MLM设的15%,除了context还借助图特征进行预测,以解决歧义
ITM随机采样50%不匹配的图文对和50%匹配的对,并基于encoder最后一层的[CLS] token,来训练分类器进行预测图像和句子是否相互匹配。

视觉增强解码器
CNN特征图没有对象级语义,很难将其与语言嵌入之间的跨模态语义直接对齐。而Transformer解码器能来帮助捕捉视觉特征的细粒度语义。目标检测和图像字幕共享相同的解码器注意参数,但使用不同的head。

Joint Training:用所有编码器和解码器的预训练任务(即掩蔽语言建模、图文匹配、目标检测、图像字幕)联合对E2E-VLP进行预训练,最小化以下四个损失函数。

优点:
1.端到端联合学习图像和文本之间的视觉表示和语义对齐,去除目标检测器的依赖,因为它不仅降低了模型的预测速度 ,目标检测任务中预定义的类别也会成为各种多模态任务的瓶颈 ,此外,区域特征中对于区域外的上下文特征捕获能力也较差 。
2.提出使用了可扩展性更强和更有效的grid特征来进行视觉语言预训练。但其不能获取图像的对象级信息了,所以作者又提出了两个任务来克服这个缺点,即目标检测和图像字幕。目标检测用于捕获对象级的视觉特征,图像字幕用于将不同的对象与文本对齐,以增强跨模态表示。

异议的点

  1. 细粒度特征融合就只是I和T的feature concat?
  2. 如果多借助图特征预测mask value,是不是应该多mask
    3.匹配和不匹配的图文对如何确定,这里大概率是数据内提前预定义好,或者自己制造的不匹配(如拿数据中不同对的caption和image)
  3. 不用目标检测和图像字幕,只借助MLM和ITM任务是否行得通

FILIP【细粒度交互式语言-图像预训练】

Before:要不然是通过每个模态全局相似度(ROI感兴趣区域)对跨模态交互建模,but缺乏充足信息;或者使用基于视觉和文本token的交叉/自注意力对跨模态(细粒度)交互建模。然而,交叉/自注意力在训练和推理过程中效率低下。
请添加图片描述

也就是单双塔模型,双塔交互程度低,模型参数集中在各模态编码器中,Efficent,灵活部署在下游任务上,不过是全局特征(整句话和图)对齐。单塔细粒度对齐带来笨重低效。

在本文中,引入一种大规模细粒度交互语言-图像预训练,灵活且高效,通过一种跨模态后交互机制实现更加细粒度的对齐,该机制使用图像patch和文本token之间token最大相似度指导对比目标->来自ColBert。(类似CLIP相似度矩阵,十个文本promt,zeroshot predict)
较为典型的单塔模型有阿里提出的M6,拼接后提交到Transformer中,使得视觉语言模块在前向传播中得到深度交互,并通过4种掩码策略丰富预训练任务,LM

SOHO和SimVLM,试图通过视觉字典或PrefixLM消除这目标检测器可扩展性较低这一负担。

遵循双流方案保证灵活且高效推理的同时,进一步提出了一种新的多模态交互机制用于捕捉细粒度表示。

ImageEncoder:ViT;TextEncoder:根据CLIP使用49408大小的小写Byte Pair Encoding,BPE,序列以[BOS]开始,以[EOS]结束。和GPT2相同,在word embedding层之后,token嵌入被送到仅解码器的Transformer模型中。在图像和文本编码器之上,文本token和视觉token的表示线性投影到多模态公共(语义)空间,并分别进行L2归一化。

细粒度对比学习:效果比预测表征学习好,图文对正样本,其余负样本
跨模态后期交互:比较每个视觉token和所有文本token相似度,选最大,随后使用所有图像(文本)非填充(padding)token的平均token-wise最大相似度作为图像到文本(文本到图像)的相似度,当然I2T和T2I不一定相等.
notice:计算相似度时,排除padding文本token,因为损害性能,且用均值而非sum,因为非padding tokens num不一;并用对比损失而非成对损失

Efficient Trick

  1. embedding from 768/512 to 256(效果提升)
  2. Use fp16半精度计算和分布式通信
  3. 两个模态select 25%最相似的tokens用于分布式通信(保证足够的性能)

prompt template<-由于预训练过程中的多义性和不一致的问题
[prefix]{label},[category description].[suffix]
[prefix]”是一个上下文描述,“a photo of a”;“label”是数据集的类标签;“[category description]”描述的是对一些细粒度图像分类数据集有帮助的类别,“a type of pet”

图像和文本增强,预训练数据集,预训练细节:自动混合精度和梯度检查点

未来工作
其架构和训练过程仍还有进一步优化的空间。在未来,可以使用更加先进的图像编码器和精心设计的交互层来提高性能。此外,可以进一步增加更多的Masked语言/图像Loss以支持更多的生成任务。

近年来,由于基于Transformer的视觉-语言模型的发展,联合文本-图像嵌入得到了显著的改善。尽管有这些进步,我们仍然需要更好地理解这些模型产生的表示。在本文中,我们在视觉、语言和多模态水平上比较了预训练和微调的表征。为此,我们使用了一组探测任务来评估最先进的视觉语言模型的性能,并引入了专门用于多模态探测的新数据集。这些数据集经过精心设计,以处理一系列多模态功能,同时最大限度地减少模型依赖偏差的可能性。虽然结果证实了视觉语言模型在多模态水平上理解颜色的能力,但模型似乎更倾向于依赖文本数据中物体的位置和大小的偏差。在语义对抗的例子中,我们发现这些模型能够精确地指出细粒度的多模态差异。最后,我们还注意到,在多模态任务上对视觉-语言模型进行微调并不一定能提高其多模态能力。我们提供所有的数据集和代码来复制实验。

7.Prompt Learning

1.Prompt-tuning,Prefix-tuning,P-tuning

也许Prompting Tuning会成为Feature Engineering问题,设计合理的Prompts将会很有意思
可以让GPT-3处理各种类型的任务,甚至拥有直接处理零样本和小样本学习能力。

prompting 更加依赖先验,而 fine-tuning 更加依赖后验。
Fine-tuning中:是预训练语言模型“迁就“各种下游任务。具体体现就是通过引入各种辅助任务loss,将其添加到预训练模型中,然后继续pre-training,以便让其更加适配下游任务,这个过程中,预训练语言模型做出了更多的牺牲。
Prompting中,是各种下游任务“迁就“预训练语言模型。具体体现将人为的规则给到预训练模型,使模型可以更好地理解人的指令的一项技术,我们需要对不同任务进行重构,使得它达到适配预训练语言模型的效果,这个过程中,是下游任务做出了更多的牺牲。

Fine-tune(110亿)需要为每个下游任务都存下整个预训练模型的副本,并且推理必须在单独的批次中执行。
参数量要小很多(5个数量级,20K),只需要为每个任务存储一个特定于下游任务的小单元,并使用原始的预先训练过的模型启用混合任务推理即可。
thinking: 多任务可能更适合,但如果做单个特定的下游任务的话,

cloze prompt([z]在句中)。适合使用掩码 (Mask) LM 解决的任务。
prefix prompt([z]在句末)。适合有关生成的任务或使用标准自回归 LM 解决的任务,因为它们与模型从左到右的性质刚好吻合。
suffix prompt (),前缀是CLIP, prompt 模板则必须包含至少两个输入的空间
如方面级情感分析是Text-span CLS类型,Template为[X]What about service?[Z],人工设计模板或者自动化搜索模板

answer 工程的目的是搜索一个 answer 空间 Z 和一个到原始输出 Y 的映射,从而得到更细粒度的预测模型。
有效性:prompt 可以看做是对预训练语言模型中已经记忆的知识的一种检索方式,其任务形式就是预训练任务,因此predicate时得到“提示,所需使用的信息量更多,所以样本的类别分布在prompt视角下都是稀疏的->few shot效果显著

Prefix-Tuning:提出任务特定的trainable前缀prefix,这样直接为不同任务保存不同的前缀即可。因此实现上只需要存储一个大型transformer模型和多个学习的任务特定的prefix参数。

对于自回归模型,加入前缀后的模型输入表示:z = [ P R E F I X ; x ; y ] z=[PREFIX;x;y]z=[PREFIX;x;y]
或者为编码器和编码器都添加prefix:z = [ P R E F I X ; x ; P R E F I X ′ ; y ] z=[PREFIX;x;PREFIX’;y]z=[PREFIX;x;PREFIX′;y]。

“GPT Understands, Too“ P-tuning V1首次提出了用连续空间搜索的 embedding 做 prompt。

不关心模版长什么样, 只需要知道模版由哪些 token 组成,该插入到哪里,插入后能不能完成我们的下游任务,输出的候选空间是什么就可以了。即不关心模版的“自然语言”要求,它只是为了更好地实现“一致性”但不是必须的。

连续的Prefix-Tuning和P-tuning 放弃了“模版由自然语言构成”这一要求,从而将其变成了可以简单梯度下降求解的连续参数问题,效果还更好。
P-tuning在一些复杂的自然语言理解NLU任务上效果很差(任务不通用)+预训练的参数量不能小(规模不通用)。因此V2版本主要是基于P-tuning和Prefix-tuning,引入Deep Prompt Encoding和Multi-task Learning等策略进行优化的。

多模态预训练中的Prompt(MAnTiS,ActionCLIP,CPT,CoOp,ALPRO,Frozen)

Multimodal Conditionality for Natural Language Generation
Prompt用于Natural Language Generation多模态NLG任务。
先从NLG任务过渡到Vision-language的应用吧,这篇文章主要是利用图片信息来增强文本的生成。

ActionCLIP: A New Paradigm for Video Action Recognition

Prompt用于Action Recognition动作识别问题。
在输入端就纳入label信息,将其与对应的视频特征进行关联。这样做不仅可以增强视频表征的语义性,同时能够具备很强的zero-shot的迁移能力。另一个优势是,这种多模态输入完全可以利用现在已经做了大量工作的多模态预训练模型。
“pre-train, prompt, and fine-tune”,模型图如下。pre-train指利用现有的多模态预训练模型,然后改装我们的任务适应模型,最后再在自己的数据集上进行fine-tune。这样的做法,通过prompt保持住pre-trained模型的强大表征性能,又节省了很多的计算资源。

CPT:Colorful Prompt Tuning for Pre-Training Vision-Language Models

Prompt用于Visual Grounding视觉定位问题。在图像和文本中使用共同的颜色来标识,以将视觉定位问题变成填空问题来解决跨模态差异。

Learning to Prompt for Vision-Language Models

CLIP中用到Prompt的地方也是它处理句子-图像对的方式,CoOp实际是在CLIP(图文匹配的双流分支)的基础上进一步进行的改进。不过它受到了AutoPrompt的启发会更多一些,是一个learnable context
模型是不一定需要符合自然语言的连贯性的。learnable context将和不同类别的word embedding拼接之后再进行后面的过程。然后其他地方,image encoder和text encoder和CLIP都比较类似,优化的目标也是使得和图片对应的prompt预测分数最大。
另外还有两种有意思的变体:

1.在class的前后都插入learnable context,以增加prompt的灵活性。
2.设计class-specific context(CSC),让所有类别的prompt参数独立(目前是所有参数都是共享的),实验结果证明这种做法在一些细粒度分类任务中效果更好。

Align and Prompt: Video-and-Language Pre-training with Entity Prompts

ALPRO模型(Align and Prompt),即对齐模态同时给细粒度提示,结合Prompt和对比学习来实施目标软标签。新增视频文本对比损失VTC,和提示实体建模PEM。其中,VTC强调捕获视频文本对的实例级对齐,PEM鼓励模型将局部视频区域与文本实体对齐。

Multimodal Few-Shot Learning with Frozen Language Models
连续的图片prompts,训练时完全固定Language Model,因此反向传播只更新vision encoder的参数,目的是将visual特征拉到文本特征的空间中,实现两个模态的对齐。

Prompting as Multimodal Fusing

在上一篇的基础上解耦提取特征和对齐空间,即把visual encoder也固定,和Language Model一样只理解图像特征,而对齐空间则由prompt向量来做。
只有prompt参数可训练,可以使架构更模块化,并可以灵活调整和加入其他模态。

总结

单模型主要改进BERT的输入,双模型主要做co/cross的BERT。
全图片只能预测特征,masked的精髓在于图片的局部区域,可特征可label。
预训练任务的单模态以mask为主,视频可以打乱帧时序,细化可以到object关系。多模态以语义对齐为主,一直做到caption的细粒度对齐。
大规模,多任务的训练,多显卡高算力。可以看一下OpenAI发布的必看论文 CLIP,DALL-E,论文解读传送门。
下游任务丰富。
个人偏向于单流模型,参数较少较轻便且端到端,性能不差。

异议的点

prompt你到底行不行
prompt从最开始的人工设计模板,到自动prompt再到连续prompt,逐渐变的畸形。
最开始的人工设计模板就是为了利用好BERT的pretrain阶段学习到的MLM能力然后用在下游,但是人工设计模型存在不稳定的问题,自动prompt效果又很差。
于是连续prompt开始表演,连续prompt已经没有prompt的味道了,把prompt弄成向量,通过训练希望模型能自己得到好的prompt向量,其实就是在finetune。
说句实话,到目前为止,我还是「有些失望的」,和我想象的并不一样。在工业落地方面,我们总是希望模型具有解决小样本、快速训练、快速推理的能力。那么prompt解决了吗?其实并没有。
所以prompt行不行,目前来看不如finetune。但是他具有一定的few shot能力,特别是离散prompt。在一些简单的任务是可以直接用离散prompt的方式做到few shot,这其实是利用BERT在pretrain阶段学习到的能力,但是一旦任务过难,那few shot效果会很差,远不如标几条数据finetune一下。这里就是涉及到泛化和精准,你想要一定的泛化性,那就一定牺牲了精准。
最后zeroprompt和T5,基本是把prompt的东西都玩完了,其实就是pretrain阶段和下游阶段是否一致的问题。

  • 现在说的解决few-shot甚至zero-shot,基本上都是基于超大参数的模型,推理速度可想而知,以机器问答场景举例,让用户等个几秒钟,是完全不可以接受的。
  • 很多论文都是自动模板、自动答案空间映射,并且还是全量参数在训练,训练时长不减反增,真的是心累。有哪些时间,你说我标点数据香不香。
  • 反正模型都很大,不是large就是xxlarge,或者一切软模版也是增加了部分参数,或多或少,反正推理时间是没变短。
  • 在真实情况下,NER任务中每个类别标个50-100条数据,分类任务中每个类别标个200-300条,都可以达到一个不错的效果,对于公司来说,标这点数据还是可以接受的,那么在这种数据规模下,prompt又能提高多少呢?
  • 在5-shot下,不用prompt是30,用了是40,确实提高了10个点,但是40的精读,模型能上线吗?

但是,我们依然要抱有希望,并且要冷静地看待新的技术。我并没有否定Prompt的价值,只是目前我现在很难在资源有限的情况下把它很好地落地,也许是自己的能力有限。

附录(Prompt相关论文)

[1] *Template-free Prompt Tuning for Few-shot NER

Github: https://github.com/rtmaww/EntLM/

[2]IDPG: An Instance-Dependent Prompt Generation Method

[3]Automatic Multi-Label Prompting: Simple and Interpretable Few-Shot Classification

Github: https://github.com/HanNight/AMuLaP

[4]ProQA: Structural Prompt-based Pre-training for Unified Question Answering

[5]On Transferability of Prompt Tuning for Natural Language Processing

Github: https://github.com/thunlp/Prompt-Transferability

[6]PROMPT WAYWARDNESS: The Curious Case of Discretized Interpretation of Continuous Prompts

Github: https://github.com/Alrope123/prompt-waywardness

[7]Learning to Transfer Prompts for Text Generation

Github: https://github.com/RUCAIBox/Transfer-Prompts-for-Text-Generation

[8]*Learning To Retrieve Prompts for In-Context Learning

Github: https://github.com/OhadRubin/EPR

[9]Do Prompt-Based Models Really Understand the Meaning of Their Prompts?

Github: https://github.com/awebson/prompt_semantics

[10]Go Back in Time: Generating Flashbacks in Stories with Event Plots and Temporal Prompts

Github: https://github.com/PlusLabNLP/flashback_gen

[11]Probing via Prompting and Pruning

[12]Contrastive Learning for Prompt-based Few-shot Language Learners

Github: https://github.com/yiren-jian/LM-SupCon

[13]Using Natural Sentence Prompts for Understanding Biases in Language Models

[14]Zero-Shot Event Detection Based on Ordered Contrastive Learning and Prompt-Based Prediction

[15]LiST: Lite Prompted Self-training Makes Efficient Few-shot Learners

Github: https://github.com/microsoft/LiST

[16]Exploring the Universal Vulnerability of Prompt-based Learning Paradigm

Github: https://github.com/leix28/prompt-universal-vulnerability

[17]Prompt Augmented Generative Replay via Supervised Contrastive Learning for Lifelong Intent Detection

[18]RGL: A Simple yet Effective Relation Graph Augmented Prompt-based Tuning Approach for Few-Shot Learning

[19]On Measuring Social Biases in Prompt-Based Learning

[20]Few-Shot Self-Rationalization with Natural Language Prompts

Github: https://github.com/allenai/feb

[21]SEQZERO: Few-shot Compositional Semantic Parsing with Sequential Prompts and Zero-shot Models

Github: https://github.com/amzn/SeqZero

[22]PromptGen: Automatically Generate Prompts using Generative Models

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

seed+transformer+finetune+图文融合+VLP+Prompt Learning整合 的相关文章

  • 改进现有的基本 GloVe 模型

    我正在使用 GloVe 作为我研究的一部分 我已经从以下位置下载了模型here https nlp stanford edu projects glove 我一直在使用 GloVe 进行句子分类 我正在分类的句子特定于特定领域 例如某些 S
  • 创建向量空间

    我有一个问题 我有很多文档 每一行都是由某种模式构建的 当然 我有这一系列的图案 我想创建一些向量空间 然后通过某种规则来向量这个模式 我还不知道这个规则是什么 即使这个模式像我的向量空间的 质心 然后向量当前文档的每一行 再次按照此规则
  • 我应该如何使用 scikit learn 对以下列表进行矢量化?

    我想用 scikit 进行矢量化学习一个有列表的列表 我转到有训练文本的路径 我阅读了它们 然后我得到如下内容 corpus this is spam SPAM this is ham HAM this is nothing NOTHING
  • 使用 nltk 中的meteor_score模块评估模型时如何实现meteor分数?

    我目前有 2 个文件 reference txt 和 model txt 这两个文本文件包含原始字幕和训练后生成的字幕 我可以简单地执行以下操作来获取流星分数 score nltk translate meteor score meteor
  • word2vec gensim 多种语言

    这个问题完全超出了我的想象 我正在使用 gensim 训练 Word2Vec 模型 我提供了多种语言的数据 即英语和印地语 当我试图找到最接近 人 的词时 我得到的是 model wv most similar positive man O
  • 如何使用 python 中的 spacy 库将句子转换为问题 [请参阅下面的我的代码进行更正]

    我需要使用 python 中的 spacy 将任何句子转换为问题 我下面的代码太长了 我需要做更多的工作才能将任何句子完成为问题格式 现在在这段代码中我根据以下条件制定条件是形式 需要形式 有形式 做形式通过检查过去时和现在时 输入 尼娜拉
  • 在非单一维度 1 处,张量 a (2) 的大小必须与张量 b (39) 的大小匹配

    这是我第一次从事文本分类工作 我正在使用 CamemBert 进行二进制文本分类 使用 fast bert 库 该库主要受到 fastai 的启发 当我运行下面的代码时 from fast bert data cls import Bert
  • 下载变压器模型以供离线使用

    我有一个训练有素的 Transformer NER 模型 我想在未连接到互联网的机器上使用它 加载此类模型时 当前会将缓存文件下载到 cache 文件夹 要离线加载并运行模型 需要将 cache 文件夹中的文件复制到离线机器上 然而 这些文
  • 在Python或Sklearn中用整数值对具有字符串值的列变量进行编码

    如何用整数值对数据表中字符串类型的列值进行编码 例如 我有两个特征变量 颜色 可能的字符串值 R G 和 B 和技能 可能的字符串值 C Java SQL 和 Python 给定数据表有两列 Color gt R G B B G R B G
  • SpaCy 的相似度是如何计算的?

    初学者 NLP 问题在这里 similarity 方法如何运作 哇 spaCy 太棒了 它的tfidf模型可以更容易预处理 但w2v只有一行代码 token vector 惊人的 In his spaCy 上的 10 行教程 https g
  • 如何计算两个文本文档之间的相似度?

    我正在考虑使用任何编程语言 尽管我更喜欢 Python 来从事 NLP 项目 我想获取两个文档并确定它们的相似程度 常见的方法是将文档转换为 TF IDF 向量 然后计算它们之间的余弦相似度 任何有关信息检索 IR 的教科书都涵盖了这一点
  • 词干函数错误:词干需要一个位置参数

    这里的stem函数显示错误 指出stem需要循环中的一个位置参数 如所讨论的 from nltk stem import PorterStemmer as ps text my name is pythonly and looking fo
  • 使用我自己的训练示例训练 spaCy 现有的 POS 标记器

    我正在尝试在我自己的词典上训练现有的词性标注器 而不是从头开始 我不想创建一个 空模型 在spaCy的文档中 它说 加载您想要统计的模型 下一步是 使用add label方法将标签映射添加到标记器 但是 当我尝试加载英文小模型并添加标签图时
  • Spacy 中的自定义句子分割

    I want spaCy使用我提供的句子分割边界而不是它自己的处理 例如 get sentences Bob meets Alice SentBoundary They play together gt Bob meets Alice Th
  • 从文本文件中提取与输入单词最相似的前 N ​​个单词

    我有一个文本文件 其中包含我使用 BeautifulSoup 提取的网页内容 我需要根据给定的单词从文本文件中找到 N 个相似的单词 流程如下 从中提取文本的网站 https en wikipedia org wiki Football h
  • 用于估计(一元)困惑度的 NLTK 包

    我正在尝试计算我所拥有的数据的困惑度 我正在使用的代码是 import sys sys path append usr local anaconda lib python2 7 site packages nltk from nltk co
  • ANEW 字典可以用于 Quanteda 中的情感分析吗?

    我正在尝试找到一种方法来实施英语单词情感规范 荷兰语 以便使用 Quanteda 进行纵向情感分析 我最终想要的是每年的 平均情绪 以显示任何纵向趋势 在数据集中 所有单词均由 64 名编码员按照 7 分李克特量表在四个类别上进行评分 这提
  • 使用正则表达式标记化进行 NLP 词干提取和词形还原

    定义一个函数 名为performStemAndLemma 它需要一个参数 第一个参数 textcontent 是一个字符串 编辑器中给出了函数定义代码存根 执行以下指定任务 1 对给出的所有单词进行分词textcontent 该单词应包含字
  • 如何检测文本是否可读?

    我想知道是否有一种方法可以告诉给定的文本是人类可读的 我所说的人类可读的意思是 它有一些含义 格式就像某人写的文章 或者至少是由软件翻译器生成的供人类阅读的文章 这是背景故事 最近我正在制作一个应用程序 允许用户将短文本上传到数据库 在部署
  • AttributeError:类型对象“Word2Vec”没有属性“load_word2vec_format”

    我正在尝试实现 word2vec 模型并收到属性错误 AttributeError 类型对象 Word2Vec 没有属性 load word2vec format 下面是代码 wv Word2Vec load word2vec format

随机推荐

  • 征服面试官:RxJava 原理篇 掌握这篇面试题汇总,吊打面试官!

    1 RxJava 如何实现线程切换 subscribeOn 是通过新建 Observable 的方式 使用 OnSubscribe 类的方式去做到线程切换的 observeOn 是通过 operator 操作符的形式去完成线程切换的 所以他
  • C++ 函数模板和类模板--泛型编程

    所谓函数模板 实际上是建立一个通用函数 其函数类型和形参类型不具体指定 用一个虚拟的类型来代表 这个通用函数就称为函数模板 凡是函数体相同的函数都可以用这个模板来代替 不必定义多个函数 只需在模板中定义一次即可 一 函数模板初识 1 为什么
  • java基础知识点

    作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于 Java基础教程系列 目前已经700 订阅 CSDN最
  • Java JDK11快速下载地址

    Linux deb 地址一 deb 地址二 rpm 地址一 rpm 地址二 tar gz 地址一 tar gz 地址二 MacOS dmg 地址一 dmg 地址二 tar gz 地址一 tar gz 地址二 Windows exe 地址一
  • Android studio导入图片出现下划红线怎么破

    首先 Android studio的图片命名需要全部字母小写 其次 导入的话 复制文件paste到drawable就可以 红线不是导入操作的问题
  • Vue的监视属性watch、深度监视以及监视的简写

    一 两种监视方式 1 watch属性直接监视 如果刚开始确定监视对象 在vue中可以直接使用watch属性实现监视 watch 正常写法 Info immediate true handler newValue oldValue conso
  • 栈、队列的基本概念和操作

    目录 一 栈 stack 了解 1 1 栈的实现和操作 二 队列 queue 了解 2 1 队列的实现与操作 2 2 双端队列 一 栈 stack 了解 概念 栈 stack 有些地方称为堆栈 是一种容器 可存入数据元素 访问元素 删除元素
  • hive指定字段插入数据,包含了分区表和非分区表

    1 建表 语句如下 CREATE EXTERNAL TABLE ods lineitem full l shipdate date l orderkey bigint l linenumber int l partkey int l sup
  • 【使用kubeadm安装部署K8S】

    问题 使用kubeadm安装部署K8S 该篇文章介绍利用kubeadm进行安装部署K8S 方法 1 准备环境 软件环境 软件 版本 操作系统 CentOS7 9 x64 mini Docker 19 ce Kubernetes 1 20 服
  • MFC中使用CBitmap类进行绘图

    大家看名字就可以知道 这个类是用来绘制位图的 即以 bmp 为后缀的图片 一般游戏之中 需要使用的图片比较多 都会将图片先存为文件 然后从文件中读取 而从文件中读取图片的步骤有以下几步 1 建立一个与窗口DC兼容的内存DC 我们加载的图片是
  • 推荐几个Python爬虫接单渠道

    说起兼职 我有一位做了4年Python工程师的朋友 爬虫做副业起码挣了20W 写各种奇葩爬虫挣钱 爬虫兼职方式多 单也很多 首先是爬虫外包活 国内有平台接单 价格500 4000不等 也可以帮互联网运营爬数据做网站 那群人一天到晚死磕数据
  • CXF拦截器

    引言 CXF拦截器是Apache CXF里面一个很重要的功能 它能够动态操作响应数据和请求数据 降低代码的耦合性 提供代码的内聚性 这对于CXF这个以处理消息为中心的服务框架来说是非常有用的 CXF通过在Interceptor中对消息进行特
  • mysql 创建订单表语句_MySQL创建表语句

    表 t admin tabs 列信息 Field Type Collation Null Key Default Extra Privileges Comment admin id int 11 unsigned NULL NO PRI N
  • local reference table overflow 内存泄露

    local reference table overflow JNI层coding经常会遇到ReferenceTable overflow问题 特别是当jni函数被反复调用上千上万次的时候 现汇总如下 未完待续 并欢迎补充 嘻嘻 总体原则
  • FileZilla连接阿里云服务器:尝试连接“ECONNREFUSED - 连接被服务器拒绝”失败

    4 FileZilla连接阿里云服务器 目的 可以更好的管理云文件 1 在远程服务器端通过指令vim etc ssh sshd config开放22号端口 2 设置云服务器的安全组ID 添加20 21 3 然后启动FileZilla 新建站
  • 6.143 指针习题10

    关于二维数组 指针运算问题 注意二维指针需要解两次引用 即第 0 个元素是 a 见下例 include
  • android studio 监听返回键,最强 Android Studio 使用小技巧和快捷键

    第一步 新建一个project 或者如果你已经有project的话 那就直接新建一个module 注意选择Java library 然后下一步 第二步 编写MyClass java 第三步 在MyClass java文件右击 选择run M
  • getjson ajax webpy,ajaxwebpy

    ajaxweb py is a framework for the library web py It which makes it very easy to make sites interactive using AJAX techno
  • 手机有时触摸失灵解决方法

    1 屏幕不干净造成的屏幕不灵敏 用干净的无尘布将手机上的脏污 水渍擦拭干净 2 手机有贴膜 确认用户是否贴膜之后出现屏幕失灵问题 可将膜去掉再使用对比 3 操作耽搁软件时屏幕失灵 可备份好软件数据 进入设置 应用与权限 更多设置 应用管理
  • seed+transformer+finetune+图文融合+VLP+Prompt Learning整合

    1 Seed 在神经网络中 参数默认是进行随机初始化的 不同的初始化参数往往会导致不同的结果 如果不设置的话每次训练时的初始化都是随机的 导致结果不确定 当得到比较好的结果时我们通常希望这个结果是可以复现的 如果设置初始化 则每次初始化都是