提示学习soft prompt浅尝,启发了p-tuing

这篇具有很好参考价值的文章主要介绍了提示学习soft prompt浅尝,启发了p-tuing。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

在高质量标注数据稀缺的工业界来说,少样本学习或者零样本学习的方法特别受欢迎,后面出现过一些少样本和零样本的方法,例如对比学习和prompt等,主流prompt的工作分为离散型和连续型模板。离散型主要还是插入bert特殊的token为主,连续型则是插入数字token离散型可解释性强于连续型,我这里讲的soft prompt则是连续型的。

大型预训练语言模型的规模不断扩大,在许多自然语言处理 (NLP) 基准测试中取得了最先进的结果。自GPT和BERT开发以来,标准做法一直是在下游任务上微调模型,这涉及调整网络中的每个权重(即模型调整)。然而,随着模型变得越来越大,为每个下游任务存储和提供模型的微调变得不切实际。

一个吸引人的替代方案是在所有下游任务中共享一个单一的冻结预训练语言模型,其中所有权重都是固定的。在一个令人兴奋的发展中,GPT-3令人信服地表明,可以通过“上下文”学习来调节冻结模型以执行不同的任务。使用这种方法,用户通过提示设计为给定任务准备模型,即手工制作带有手头任务描述或示例的文本提示。例如,要为情感分析设置模型,可以附加提示“以下电影评论是正面的还是负面的?” 在输入序列之前,“这部电影太棒了!

二、soft prompt

跨任务共享相同的冻结模型极大地简化了服务并允许有效的混合任务推理,但不幸的是,这是以牺牲任务性能为代价的。文本提示需要人工设计,即使是精心设计的提示与模型调优相比仍然表现不佳。例如,在SuperGLUE基准测试中冻结的 GPT-3 175B 参数模型的性能比使用少 800 倍参数 的微调T5 模型低 5 个点。

在EMNLP 2021上发表的“参数高效提示调整的规模力量”中,我们探索了提示调整,一种使用可调软提示调节冻结模型的更有效方法。就像工程文本提示一样,软提示连接到输入文本。但不是从现有的词汇项目中选择,软提示的“标记”是可学习的向量。这意味着可以在训练数据集上端到端优化软提示。除了消除手动设计的需要之外,这还允许提示从包含数千或数百万个示例的数据集中压缩信息。相比之下,由于模型输入长度的限制,离散文本提示通常限制在 50 个以下示例。

提示学习soft prompt浅尝,启发了p-tuing

要为给定任务创建软提示,我们首先将提示初始化为固定长度的向量序列(例如,20 个token长)。我们将这些向量附加到每个嵌入输入的开头,并将组合序列输入模型。将模型的预测与目标进行比较以计算损失,并将误差反向传播以计算梯度,但是我们仅将这些梯度更新应用于我们的新可学习向量——保持核心模型冻结。虽然以这种方式学习的软提示不能立即解释,但在直观的层面上,软提示正在从标记的数据集中提取有关如何执行任务的证据,其作用与手动编写的文本提示相同,但​​不需要限于离散的语言。

提示学习soft prompt浅尝,启发了p-tuing

soft prompt是参数越多效果越好,引自Google发表原文。

提示学习soft prompt浅尝,启发了p-tuing

三、soft prompt实现

import torch
import torch.nn as nn

class SoftEmbedding(nn.Module):
    def __init__(self, 
                wte: nn.Embedding,
                n_tokens: int = 10, 
                random_range: float = 0.5,
                initialize_from_vocab: bool = True):
        """appends learned embedding to 
        Args:
            wte (nn.Embedding): original transformer word embedding
            n_tokens (int, optional): number of tokens for task. Defaults to 10.
            random_range (float, optional): range to init embedding (if not initialize from vocab). Defaults to 0.5.
            initialize_from_vocab (bool, optional): initalizes from default vocab. Defaults to True.
        """
        super(SoftEmbedding, self).__init__()
        self.wte = wte
        self.n_tokens = n_tokens
        self.learned_embedding = nn.parameter.Parameter(self.initialize_embedding(wte,
                                                                               n_tokens, 
                                                                               random_range, 
                                                                               initialize_from_vocab))
            
    def initialize_embedding(self, 
                             wte: nn.Embedding,
                             n_tokens: int = 10, 
                             random_range: float = 0.5, 
                             initialize_from_vocab: bool = True):
        """initializes learned embedding
        Args:
            same as __init__
        Returns:
            torch.float: initialized using original schemes
        """
        if initialize_from_vocab:
            return self.wte.weight[:n_tokens].clone().detach()
        return torch.FloatTensor(n_tokens, wte.weight.size(1)).uniform_(-random_range, random_range)
            
    def forward(self, tokens):
        """run forward pass
        Args:
            tokens (torch.long): input tokens before encoding
        Returns:
            torch.float: encoding of text concatenated with learned task specifc embedding
        """
        input_embedding = self.wte(tokens[:, self.n_tokens:])
        learned_embedding = self.learned_embedding.repeat(input_embedding.size(0), 1, 1)
        return torch.cat([learned_embedding, input_embedding], 1)
from transformers import AutoConfig, AdamW, AutoTokenizer, AutoModel
import torch
import torch.nn as nn
from soft_embedding import SoftEmbedding

n_tokens = 20
initialize_from_vocab = True
tokenizer = AutoTokenizer.from_pretrained("nezha-base-wwm")
config = AutoConfig.from_pretrained("nezha-base-wwm", num_labels=num_class)
config.output_hidden_states = True  # 需要设置为true才输出
model = AutoModel.from_pretrained(self.model_path, config=config)
s_wte = SoftEmbedding(model.get_input_embeddings(), 
                      n_tokens=n_tokens, 
                      initialize_from_vocab=initialize_from_vocab)
model.set_input_embeddings(s_wte)
inputs = tokenizer("May the force be", return_tensors="pt")

# need to pad attention_mask and input_ids to be full seq_len + n_learned_tokens
# even though it does not matter what you pad input_ids with, it's just to make HF happy
inputs['input_ids'] = torch.cat([torch.full((1,n_tokens), 50256), inputs['input_ids']], 1)
inputs['attention_mask'] = torch.cat([torch.full((1,n_tokens), 1), inputs['attention_mask']], 1)

outputs = model(**inputs)

四、总结

soft prompt比较依赖于模型参数大小,更加适合零样本和小样本,如果用来大数据量下微调模型,效果可能会比普通微调差不多或者更差点。文章来源地址https://www.toymoban.com/news/detail-487999.html

到了这里,关于提示学习soft prompt浅尝,启发了p-tuing的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 浅尝prompt咒语设计:one-shot微调chatglm-6b实践信息抽取

    近期以chatgpt等文生成LLMS爆火,国内也逐渐开源了中文版的chatgpt,本文以清华大学开源的6b的chatglm为例,实践one-shot微调,设计prompt咒语在信息抽取领域的实验效果。 给定一个JD的职位要求,需要从描述中抽取出相应的实体。 例如: 相应的schema的实体为: prompt设计主要点:

    2024年02月11日
    浏览(49)
  • 【提示学习论文七】Visual Prompt Tuning论文原理

    这篇文章于2022年发表在ECCV(European Conference on Computer Vision),作者是Menglin Jia, Luming Tang,Bor-Chun Chen, Claire Cardie, Serge Belongie,Bharath Hariharan, Ser-Nam Lim。 VPT是一种有效的用于大规模Transformer的视觉微调,只需要在输入空间引入少量可训练参数,同时冻结backbone。 目前适应预训练模

    2024年01月17日
    浏览(59)
  • 【提示学习论文六】MaPLe: Multi-modal Prompt Learning论文原理

    这篇文章于2023年发表在CVPR(Conference on Computer Vision and Pattern Recognition),作者是Muhammad Uzair Khattak,Hanoona Rasheed,Muhammad Maaz,Salman Khan,Fahad Shahbaz Khan。 研究发现Clip的问题:在单个分支(语言或视觉)中使用prompt来调整表示是次优的,它不能在下游任务上灵活地动态调整两个

    2024年01月22日
    浏览(43)
  • Element浅尝辄止8:Tooltip 文字提示组件

    常用于展示鼠标 hover 时的提示信息。   展示多行文本或者是设置文本内容的格式 除了这些基本设置外,还有一些属性可以让使用者更好的定制自己的效果: transition  属性可以定制显隐的动画效果,默认为 fade-in-linear 。 如果需要关闭  tooltip  功能, disabled  属性可以满足

    2024年02月11日
    浏览(41)
  • AI提示词工程师/AIGC提示词工程师/prompt工程师/AI训练师学习路线图(元壤教育)

    系统学习,公众号搜索【元壤教育】开始学习吧 先窥全貌:Prompt工程师课程概述介绍 Prompt 工程师 优化工作流程 在 GPT 中编写提示词 文本到视觉 Midjourney prompts GPT-3.5/4 概述 GPT的未来 专家访谈 从概念开始:简单理解AIGC发展和产业机遇 AIGC的概念与起源 AIGC的发展三阶段 AIGC的

    2024年02月09日
    浏览(64)
  • 【AIGC提示词工程师、AI提示词工程师、Prompts工程师、Midjourney培训】电商行业AIGC图像生成与内容创作学习路线图

    导言 关注【元壤教育】公众号进入平台开始系统学习之路。 AIGC(Stable Diffusion、DALL-E 和 Midjourney)助力电商行业降本增效、提升10倍生产力 一门深入全面的课程,专为对AI图像生成在电商行业应用感兴趣的人士打造,旨在帮助他们从零基础迈向专家级别。无需拥有任何相关经

    2024年02月10日
    浏览(52)
  • LLM提示词工程和提示词工程师Prompting and prompt engineering

    你输入模型的文本被称为提示,生成文本的行为被称为推断,输出文本被称为完成。用于提示的文本或可用的内存的全部量被称为上下文窗口。尽管这里的示例显示模型表现良好,但你经常会遇到模型在第一次尝试时无法产生你想要的结果的情况。你可能需要多次修改提示中

    2024年02月12日
    浏览(44)
  • 在学习DNS的过程中给我的启发

    在国内,关于DNS相关的话题一直络绎不绝,比如DNS根服务器为什么中国没有,还有Anycast BGP实现负载,为什么DNS只有13个,还有DNS over HTTPS 和 DNS over TLS的优劣等等问题,接下来我会找出几个一一说一下其中的原理,并谈谈通过研究这些问题后我的收获。 DNS和我们每天的上网动

    2024年02月09日
    浏览(40)
  • 提示词(prompt)工程指南(五):ChatGPT 提示工程

    在本节中,我们介绍ChatGPT的最新提示工程技术,包括提示、应用、限制、论文和其他阅读资料。 完整的中文版本指南和更丰富的参考资料在 Github 和 Gitee 中,自动持续翻译更新: 🐙 关于提示词工程(prompt)的指南、论文、讲座、笔记本和资源大全 https://github.com/yunwei37/Pr

    2024年02月03日
    浏览(60)
  • 关于提示词 Prompt

    原则1 提供清晰明确的指示 注意在提示词中添加正确的分割符号 可以指定输出格式,如:Json、HTML 提示词中可以提供少量实例,如让它写有步骤的操作,可以在提示词中添加 原则2 给模型充分的时间运算 有时候LLM的回答并不是我们需要的,这时需要将需求一步步分解,让模

    2024年02月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包