NLP千亿预训练模型的“第四范式”之Prompt Learning介绍分享

点击上方“AI遇见机器学习”,选择“星标”公众号
重磅干货,第一时间送达

论文转载自知乎专栏:ai炼丹师

作者:避暑山庄梁朝伟

一、背景

随着GPT-3诞生,最大的版本多达1750亿参数,是BERT-BASE的一千多倍。事实上GPT-3的论文叫做Language Models are Few-Shot Learner,顾名思义GPT-3主打的是小样本学习。GPT-3最大的创新是可以用prompt直接前向做下游任务,从而不引进新的参数,打破了传统pretrain+fintune的模式,本质是通过挖掘预训练语言模型的知识做下游任务。那么如何用较小的预训练模型充分发挥预训练语言模型作为语言模型的作用,做下游任务。所以引出了最近一系列工作,基于prompt的新的训练范式。

好处:

1.相比之前每个任务定义一套参数,在输入加上特定的信息,不需要改变整个模型的参数,从而提升效率和存储空间。

2.传统pretrain+fintune的训练方式是有gap的,需要从大规模无监督数据训练迁移到下游finetune的任务,prompt-based的方式打破了这个方式。

二、论文整理---按照时间线

1.Parameter-Efficient Transfer Learning for NLP ICML 2019 2019.2.2

motivation:

将adapter加入到transformer中,在针对某个下游任务微调时,改变的仅仅是 adapter 的参数。

4217ff526c9ce4a608b89f81bacfec94.png

2.To Tune or Not to Tune? Adapting Pretrained Representations to Diverse Tasks 2019 2019.3.14

motivation:

微调还是冻结?这是一个值得考虑的问题。当前有很多工作都集中在了预训练目标函数和模型结构的研究,而少有专门研究模型迁移的工作。本文讨论了冻结(frozen)和微调(fine-tuning)在不同任务上的表现,得到的结论是可以预想到的:不同迁移方式的表现取决于预训练任务和下游任务的相关性。

3.Commonsense Knowledge Mining from Pretrained Models 2019 2019.9.2

motivation:

利用LM score完成知识prompt的筛选

4.Language Models as Knowledge Bases? ACL 2019 -2019.9.3

motivation:

语言模型可以作为关系知识的潜在表示形式,对预先训练的现成语言模型(例如 ELMo 和 BERT)中已经存在的关系知识提取。在kownledge-base complete任务上利用语言模型预测的分数,完成知识提取,相比elmo等模型表现要好。需要人工标注query也就是模板。
method:

3cb141ceca3ef7525eebfab25d696a66.png

5.E-BERT: Efficient-Yet-Effective Entity Embeddings for BERT EMNLP 2020 2019.11.9

motivation:

将实体信息的embedding通过映射到bert embedding融入到Bert中,来增强bert对LAMA等知识探测数据集的能力,同时发现模型可以根据表面的实体名称来进行预测,而不是真正学习到了知识。例如,让模型预测某个人的母语时,模型可能会因为这个人的姓名较为偏向意大利的取名风格而直接预测他的母语是意大利语。

306ce0e5ceacebd00c6a5a27df60454f.png

6.How Can We Know What Language Models Know? TACL 2020 2019.11.28

motivation:

运用完形填空形式,运用一个检测语言模型是否具有某些知识的探针任务。LPAQA旨在改进LAMA的模版(query),为检测LM中的知识提供一个更严格的下界

method:

1.Mining-based Generation:基于远程监督的假设(即出现相同实体对的句子表达相同的关系),在Wikipedia sentence中寻找包含头尾实体h、t的句子,然后进一步提出了两种prompt抽取方法:2.Middle-word Prompts:对于h、t中间包含文本的句子形式,将h、t中间的文本当作prompt;3.Dependency-based Prompts:对于其他句子,使用句法依赖解析来提取h和t最短的路径,并将路径上的词作为prompt;3.Paraphrasing-based Generation:类似查询拓展技术,在保持原prompt语义同时增加词汇的多样性。这种方法依赖反向翻译(back-translation),即翻译到另一种语言再翻译回来,构成多个样本后根据往返概率(round-trip probability)筛选prompt。4.ensemble: Top-1 Prompt Selection:用LM,取acc最高的prompt;Rank-based Ensemble:除了Top-1方案,有时候需要保持多个模版来增强效果,即选取前K个模版;Optimized Ensemble:通过LM的预测为不同的prompt赋权。

7.Zero-shot Text Classification With Generative Language Models NeurIPS 2019 2019.12.10

motivation:

针对zero-shot任务进行任务统一(转换成qa问题),利用taskdescription(prompt),快速适应新的任务 method:

379e4a541c78b18631b801fdf271e0a0.png

8.Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference EACL 2021 2020.1.21

motivation:

如何用较小的预训练模型充分发挥预训练模型作为语言模型的作用,做fewshotlearning,做法是分类转化为完形填空

0367e6437d068c77e02215345516534d.png

9.How Context Affects Language Models' Factual Predictions AKBC 2020 2020.5.10

motivation:

模型在进行预训练时使用到的无监督文本语料非常庞大,包含了相当多的知识,很难保证现有的预训练模型能够将这些知识全部存储在模型参数中并且之后可以足够准确的将这些知识提取出来。针对这个问题,尝试通过加入有关的上下文信息来提升模型提取知识的准确率。method: Oracle-Based (ORA):挑选问题对应的事实样本在维基百科中的周围文本片段作为上下文。Retrieve (RET):选择DrQA的检索系统(TF-IDF)检索出的第一段文本作为上下文。Generate (GEN):将问题作为前缀输入语言模型,对上下文进行自回归生成。Adversary (ADV):利用和问题具有相同关系类型但不同实体答案的问题,以ORA的方式挑选出包含无关信息的上下文。

10.It’s Not Just Size That Matters: Small Language Models Are Also Few-Shot Learners NAACL 2021 2020.9.15

motivation:

解决label mask预测多token问题 method: 选择分数最高的一个token为基准计算,替代多个token完形填空的分数计算

2ed07d0ba23e410c608d371e68b9a12e.png

11.Automatically Identifying Words That Can Serve as Labels for Few-Shot Text Classification COLING 2020 2020.10.26

motivation:

小样本文本分类模型PET的基础上进行扩展,将原来目标中的多分类最大似然估计替换为多个one-vs-rest分类。这样就能够充分利用输入数据,同时减小标签和填空词之间的映射选择。通过这种方式,提出的方法就能够在小样本上也取得非常好的效果。同时通过实验发现,本文提出的方法找到的映射关系几乎可以与人工构建的映射关系一样好。

12.AutoPrompt: Eliciting Knowledge from Language Models with Automatically Generated Prompts EMNLP 2020 2020.10.29

motivation:

提出一种基于梯度的模版搜索方案
method:

b093edc869e1e333aef5cc4562cd99c1.png

12.Parameter-Efficient Transfer Learning with Diff Pruning 2020 2020.12.14
motivation: 
adapter的延续,将原来的参数上增加新参数(L0正则约束稀疏性)

13.Few-Shot Text Generation with Pattern-Exploiting Training 2020 2020.12.22motivation:

将PET运用到文本生成,模型采用谷歌PEGASES(encoder(mask),decoder(生成mask的部分),这种模型结构适合PET)

085f5d4262f9a645012f5f85c54de681.png

14.Making Pre-trained Language Models Better Few-shot Learners ACL 2021 2020.12.31

motivation:

AUTOPROMPT需要大量样本进行基于梯度搜索,提出基于t5进行模板生成的自动化pipline

method:

a)自动化选择标签词:1.通过未经微调的预训练模型,对于训练集中的每一个类别,选择top-k的单词使得条件概率最大 2.综合每个类别下的候选标签词,然后找出使得训练集正确率最大的top-n个分配方式 3.通过对dev集微调,从n个分配方式中选择最佳的一个标签词,构建标签映射关系M b)自动化选择模板 利用t5解码生成多个候选模板,然后对每一个候选模板利用dev集微调、选择其中一个最佳模板。

0be8dd759464483193c53d5f3b7a3d48.png

15.Prefix-Tuning: Optimizing Continuous Prompts for Generation ACL 2021 2021.1.1

motivation:

提出了Prefix-Tuning,一种轻量级fintune替代方法,用于对自然语言生成任务进行微调,在使语言模型参数冻结的同时,去优化一个参数量少的 continuous task-specific vector(称为prefix),用词表中的词初始化较好,并且和类别相关。在大多数任务上比finetune好。

method:

Prefix-tuning是做生成任务,它根据不同的模型结构定义了不同的Prompt拼接方式,在GPT类的自回归模型上采用[PREFIX, x, y],在T5类的encoder-decoder模型上采用[PREFIX, x, PREFIX', y] 1.把预训练大模型freeze住,因为大模型参数量大,精调起来效率低,毕竟prompt的出现就是要解决大模型少样本的适配 2.直接优化Prompt参数不太稳定,加了个更大的MLP,训练完只保存MLP变换后的参数就行了 3.实验证实只加到embedding上的效果不太好,因此作者在每层都加了prompt的参数,改动较大

202f6d5b2cc9f303c0fb5b9913235593.png

16.WARP: Word-level Adversarial ReProgramming ACL 2021 2021.1.1

motivation:

不同于Discrete Prompt需要手工寻找或者学习离散的token作为prompt,直接优化embedding作为prompt 。在few shot效果上超过PET和GPT3(lm-tune),没有超过iPET,full shot相差不多。节省效率。

method:

把prompt tokens 插入到输入序列中,再经过encoder和一个MLM head,然后通过计算分类的概率(分类交叉熵),同时证明了prompt少的话性能会下降。

4b692da5fe917775319005865ad53a24.png 148a7340ed82689df066a9d3d3a355fe.png

17.What Makes Good In-Context Examples for GPT-3? 2021 2021.1.17

motivation:

根据相似度选择In-Context,order根据相似度排序

caefa18f2532202b814aa9fda1f9851f.png

18.Calibrate Before Use: Improving Few-Shot Performance of Language Models ICML 2021 2021.2.19

motivation:

本文的动机是发现GPT-3,虽然可以在某种程度上实现zero/few shot learning,但performance非常不稳定,尤其是在三个方面:prompt的格式、few shot的训练样本,训练样本的顺序。Majority Label Bias 这种bias和监督学习中的样本不均衡现象类似,GPT-3总是倾向于预测出常见的label(其实,不仅是GPT-3,所有的机器学习模型都有这个问题),所以样本的分布影响着结果。Recency Bias GPT-3更倾向于预测离结尾最近的样本label,直觉上感觉这有点像灾难性遗忘,比如训练样本是PPNN,更倾向于预测出N。甚至这种bias的影响会大于第一种,比如PPPN,会大概率预测出N。所以,这种bias也解释了为什么样本的顺序会影响结果。Common Token Bias GPT-3倾向于预测一些常见的词(这个现象在前几年对话系统也经常会遇到,生成一个safe但meaningless的话)

method:

通过一个放射变换将原有的概率p映射到q,这里的w和b是需要学习的参数。但实际操作时存在一个问题,因为prompt based learning是一种zero/few shot learning方式,没有足够的样本来训练w和b。本文提出了一种context-free input来解决这个问题,用N/A作为输入,提供给GPT-3模型,因为N/A并不是有效的输入,理想情况下,GPT-3应该给出50-50的Pos和Neg比例,但实际给出了61.3%的Neg,这正式recency bias带来的问题。因此,可以通过手动设定w和b的值,来uniform model的输出。

19.PADA: A Prompt-based Autoregressive Approach for Adaptation to Unseen Domains 2021 2021.2.24

motivation:

利用t5的embedding,选择领域的代表关键词(利用互信息),然后进行领域迁移(挖掘领域共现关键)

d401e18b986351b49e045c342e9cfc83.png

20.How Many Data Points is a Prompt Worth? NAACL 2021 2021.3.15

motivation:

论文证明这个< MASK >方法比模型加一个线性层做分类任务性能好。这个方法比传统任务(例如:加一个线性层做分类任务)用的样本少,为几分之一。针对任务的不同,只需用到几百到几千的样本。

21.GPT Understands, Too 2021 2021.3.18

motivation:

P-tuning重新审视了关于模版的定义,放弃了“模版由自然语言构成”这一常规要求,从而将模版的构建转化为连续参数优化问题,虽然简单,但却有效。

3892398fc668fae7c9ea18709999386f.png

22.Improving and Simplifying Pattern Exploiting Training 2021 2021.3.22

motivation:

预测mask token的时候,只把和class相关的token的logit过softmax算概率,忽略了词表中其他非class token的信息。具体来说,adapet在预测mask token的时候,先把词表上所有token的logit过softmax算概率,然后把class相关的token拿出来,用bce loss去优化:最大化correct class token的概率,最小化非correct class token的概率。对于label words是multi token的情况,则最大化所有correct class token的subtoken的概率,最小化非correct class token的subtoken的概率。Label Conditioning:随机mask原文中的词,然后用bce loss。最后超过pet,没有超过ipet(用了无标签数据)

f837dcecd17ebe715a9783c714252a17.png

23.Factual Probing Is [MASK]: Learning vs. Learning to Recall NAACL 2021 2021.4.12

motivation:

将AutoPrompt离散搜索prompt的方式用于连续tuning的初始化,同时发现比随机初始化效果好,选择label词较好

89efa1fa02541e388aa44627e9cd69bf.png

24.Learning How to Ask: Querying LMs with Mixtures of Soft Prompts NAACL 2021 2021.4.14

motivation:

利用ensemble优化模板,学习哪个模板更有效,和如何融合模板:p-tuning+ensemble+em算法,prompt初始化是用挖掘的方式

10365d2f61fadaf0c7f33a15142d616f.png

3cafb591dccf00b8b7580aadf364dc56.png

25.KnowPrompt: Knowledge-aware Prompt-tuning with Synergistic Optimization for Relation Extraction 2021 2021.4.15

motivation:

融入外部知识(实体,关系)的embedding当做参数,将关系分类设置成模板,采用MASK的方式训练,同时增KE的loss

method:

e521da85b0ce4a6a18965a38c1a8a97d.png

26.Surface Form Competition-Why the Highest Probability Answer Isn’t Always Right 2021 2021.4.16

motivation:

多项选择任务中最高的概率回答是否最优的问题。但是,按字符串概率排序可以由于表面形式竞争而存在问题——其中不同的表面形式竞争概率质量,即使它们代表相同的基本概念,例如:“计算机”和“PC”。由于概率质量是有限的,由于来自其他字符串的竞争(如这是有效的答案,但不是多项选择选项之一),这降低了正确答案的概率。作者提出领域条件点互信息,一种替代评分函数,通过简单地根据与特定零样本任务上下文中的先验可能性成正比的项重新权衡每个选项,直接补偿表面形式的竞争。它在多种选择数据集,在所有 GPT-2 和GPT-3模型上的零样本性能方面取得了一致的收益。

27.The Power of Scale for Parameter-Efficient Prompt Tuning 2021 2021.4.18motivation:

验证当模型参数变大时候(比如百亿),prompt的长度,初始化,预训练目标和训练step变得不那么重要,同时简单的ensemble(投票)能提高效果。

dde3629cec08f0dae8284e33608e82e3.png

method:

总体上 Prompt Tuning 与 P-Tuning ( P-tuning-GPT Understands, Too) 较为相似。但 Prompt Tuning 的 prompt参数全部置于左侧,并且论文将注意力集中在了冻结模型权重的一系列实验上,更好的验证了prompt 的效果。初始化prompt: sampled vocab:从5000个T5字典最常用的token中提取。class label:从任务 label 对应的 token 中提取。由于任务label通常数量较少,当任务label不够满足prompt参数长度时,使用sampled vocab进行填充。当一个label 存在 multi-token 时,取其平均值。简单的ensemble能提升prompt-tuning的效果

28.Fantastically Ordered Prompts and Where to Find Them: Overcoming Few-Shot Prompt Order Sensitivity 2021 2021.4.18

motivation:

prompt demonstration permutations,将随机orders(24个)利用Global Entropy或者Local Entropy进行排序,选择最优的 method:

1528ab8de265e9696cd532ac2e09214e.png e72b36e956d1d833cc2e32fedef935c0.png

29.Entailment as Few-Shot Learner 2021 2021.4.29

motivation:

针对few-shot任务进行任务统一(转换成蕴含问题) ,利用taskdescription(prompt),快速适应新的任务

method:

54e33033a11451ee56c4a3f26ea6c5b4.png

30.PTR: Prompt Tuning with Rules for Text Classification 2021 2021.5.24

motivation: prompt tuning + discrete token解决多分类问题

5a0e5e307817f40278283e032f543d35.png

31.True Few-Shot Learning with Language Models 2021 2021.5.24

motivation:

之前那些 prompt 的方法用了大量验证集信息来调整超参、选择最好的 prompt。他们对性能的提升其实都来自验证集中蕴含的信息。针对在没有验证集的情况下提出了两个方法:k 折交叉验证:将数据集分为 k 个部分,用其中 k-1 个部分作为训练集,剩下的一个部分作为验证集。在后面的实验中,这种方法被称作 CV(cross validation)。类似在线学习的交叉验证:将数据集分为 k 个部分,第 1 轮用第 1 部分训练,第 2 部分验证,第 i 轮用前 i 部分训练,第 i+1 部分验证。在后面的实验中,这种方法被称作 MDL(minimum description lengthm),因为其本质上遵循的是最小描述长度准则。result: 在理想的验证集里,是能挑选出最好的 prompt 的,因此最好的 prompt 就代表了在理想的巨量验证集中挑选 prompt 最好的结果。在没有验证集时,提出的两个交叉验证方法只能带来理想验证集带来的大约 25% 的性能增益。因此,没了大量数据作为验证集,的确也就不能有很好的交叉验证效果了。

89465bb6d2f1d94218cab06f52f5db17.png

32.Template-Based Named Entity Recognition Using BART ACL 2021 2021.6.3

motivation:

利用bart和模版完成NER任务,随机抽取span长度1-8,正负样例1:5,loss为cross-entropy。
method:

4bfd577eff4ba23afd495450532f3eca.png

33.Reordering Examples Helps during Priming-based Few-Shot Learning 2021 2021.6.3

motivation:

prompt demonstration permutations select + tuning separators 迭代多次,寻找最优的prompt

method:

406270d60b5b25c49f02f93c0aa35d56.png

34.Can Generative Pre-trained Language Models Serve as Knowledge Bases for Closed-book QA ? ACL 2021 2021.6.3

motivation:

预训练语言模型在一些QA数据集上能够较好的完成闭卷问答任务的原因大部分是之前所使用的数据集(NaturalQuestions、WebQuestions和Trivia QA)的测试集和训练集的高重叠度,prompt会自动拟合数据分布,不依赖预训练语言模型中的知识。为此,基于SQuAD构造了一个测试集和训练集低重叠的Closed-Book QA数据集,并用BART模型进行了一系列实验测试,发现模型的表现的确很差。即使是在包含问题答案的文章语料上(SQuAD的passages)进一步预训练后,模型回答问题的准确率也相当低(1.8%),表明模型似乎并不具备较好的利用内部知识的能力。

method:

为了探究模型表现不好的原因,本文进一步构造了两阶段的实验,分别对模型的记忆能力和知识利用能力进行测试:记忆能力:第一部分实验首先让BART在包含问题答案的文章上用Token Infilling任务进一步训练(LM-finetuning),然后在测试阶段让模型完成一个背诵任务(Reciting),即把文章中的问题答案mask掉,让模型进行还原。结果显示模型只能对少量的文章进行记忆,具备较弱的记忆能力。知识利用能力:第二部分实验则选取上一步实验中能背诵出大于50%知识的模型和对应文章。让模型进一步进行QA-finetune来做Closed-book QA,以检验模型是否能利用记住的知识来回答问题。结果显示,即使已经能够背诵出文章中被mask掉的问题答案,模型还是无法很好的利用记住的知识对问题进行回答。

35.Adaptable and Interpretable Neural Memory Over Symbolic Knowledge NAACL 2021 2021.6.6

motivation:

在BERT的架构基础上加入了一个实体记忆模块和事实记忆模块,通过加入对实体、关系和三元组事实知识的编码信息来增强文本表示,并在一定程度上模块化的将模型中存储的事实知识分离出来。提出的两种记忆模块中分别存储了所有实体和三元组事实知识的嵌入表示,其中事实知识以Key-Value对的形式进行存储。模型通过在计算时对事实记忆模块中的相关知识进行检索,以得到有利的知识信息辅助下游任务的完成。

d8b0e81a79cc507797fdff1a8318e190.png

36.Knowledgeable or Educated Guess? Revisiting Language Models as Knowledge Bases ACL 2021 2021.6.17

motivation:

设计实验分析之前的方法所衡量的,并不是模型的信息抽取能力,而是设计的prompt对原始数据集的拟合程度。并且验证基于demonstration的方法,更多是相似type信息泄露,同一type的数据进行混合,发现只要type一致,最终的信息并不会差太多。

7a87663f0f0ded9aba46e94656408a05.png

37.Cutting Down on Prompts and Parameters: Simple Few-Shot Learning with Language Models 2021 2021.6.24

motivation:

在few-shot learning场景下,通过微调transformer中的bias,超过full-model finetuning(全量参数),节省参数存储,另外提出null prompt,效果接近略差于有prompt效果。

28be74251ee52b2d2712256cb25c2174.png

38.Multimodal Few-Shot Learning with Frozen Language Models 2021 2021.6.25
motivation:
基于prompt-tuning的多模态小样本学习模型

e02f2c9ffcc79f8343452fd8f635710e.png

39.Meta-tuning Language Models to Answer Prompts Better 2021 2021.7.16
motivation:

针对few-shot任务进行任务统一(先转换成蕴含,然后转换成qa问题) ,利用task description(prompt),快速适应新的任务
method:

bfdd4a1c2f2b8969cdbf72235ab1e938.png

40.Knowledgeable Prompt-tuning: Incorporating Knowledge into Prompt Verbalizer for Text Classification 2021 2021.8.4
motivation:

对标签词进行扩展,相当于引入外部知识

a29e768d6553ab2fcc274c7cff44681b.png

41.Differentiable Prompt Makes Pre-trained Language Models Better Few-shot Learners 2021.8.30

motivation:

label和prompt都改成连续的,增加模板mask词目标(代替p-tuning的lstm),效果优于p-tuning

14913a2b8e02d30af574780e188758e1.png

41.Finetuned Language Models Are Zero-Shot Learners 2021.9.3

motivation:

利用Instruction Tuning进行multi-task训练,在11个任务上训练(LM-tuning),在另一个没见过的任务上进行zero-shot测试,效果优于gpt3,进一步说明Instruction Tuning能激发语言模型的理解能力

032df0e8cc84786585e0ee2d20318203.png

42.PPT: Pre-trained Prompt Tuning for Few-shot Learning 2021.9.9

motivation:
prompt pretraining用于下游任务,提供好的初始化prompt,使得效果更稳定

8f4337b47da8b7afe3a03f7be00a42b0.png

43.Raise a Child in Large Language Model: Towards Effective and Generalizable Fine-tuning EMNLP 2021 2021.9.13
motivation:
利用大规模预训练模型提供的强大知识,决海量参数与少量标注样本的不匹配问题,在前向传播的时候保持与正常fine-tune一样,利用整个模型的参数来编码输入样本;在后向传播传播更新参数的时候,无需利用少量样本来调整海量参数,而是仅仅更新这么庞大的参数网络中的一部分,即网络中的一个Child Network。在full-shot和few-shot上超过finetune。整个方法没有利用prompt。
method:
Step1: 在预训练模型中发现确认Child Network,并生成对应的Gradients Mask;
Step2: 在后向传播计算完梯度之后,仅仅对Child Network中的参数进行更新,而其他参数保持不变。

ae6fe0c4ba74935b851de1b6d6e7d7e1.png

44.Multitask Prompted Training Enables Zero-Shot Task Generalization EMNLP 2021 2021.9.15

motivation:

和FLAN工作整体相似,区别是增加了任务和prompt数量(71个多任务数据集,总共创建了1939个prompt),减小了模型参数,效果超过FLAN,证明了多任务prompt学习能使模型更加鲁棒、泛化能力更强

0f4db99ed2aadade3071168f752d7f86.png

三、总结

目前难点:

1.PET:模板方差大,如何寻找好的模板

2.P-tuning/prompt-tning:局部优化,在初始化附近做sgd,还是依赖初始化embedding

2.由于训练数据少,如何寻找好的统一任务形式,提升任务效果和泛化能力

展望:

目前预训练语言模型对于知识和推理能力学习还不够好,导致基于prompt的方法效果还没发挥出来。不过从gpt3在few-shot上某些任务sota来看,随着预训练模型的发展越来越成熟,相信会带来prompt-based方法的突破。

欢迎关注我们,看通俗干货

2df8de86922cc226ff90b598b5edeb0d.png

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值