广告行业中那些趣事系列59:详解当前大火的提示学习promptlearning

author author     2022-12-31     194

关键词:


导读:本文是“数据拾光者”专栏的第五十九篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇主要从理论到实践介绍了当前超火的提示学习Prompt Learning,对于希望将Prompt Learning应用到实际业务中的小伙伴可能有帮助。

欢迎转载,转载请注明出处以及链接,更多关于自然语言处理、推荐系统优质内容请关注如下频道。知乎专栏:数据拾光者 公众号:数据拾光者

广告行业中那些趣事系列59:详解当前大火的提示学习prompt

摘要:本篇主要从理论到实践介绍了当前超火的提示学习Prompt Learning。首先介绍了背景,从NLP四大范式引出预训练+微调和当前大火的提示学习Prompt Learning。相比于预训练+微调是让预训练模型适配下游任务,提示学习Prompt Learning则是让下游任务来适配预训练模型,将几乎所有NLP任务统一转化成语言模型问题,提升预训练模型的利用率;然后重点介绍了Prompt Learning,主要包括Prompt的作用、Prompt文本分类流程、Prompt形状、如何设计Prompt和Prompt Learning的优势;最后基于百度paddleNLP实战Prompt Learning,在小样本场景下的多分类任务中对比了预训练+微调和Prompt Learning的效果,使用同样的预训练模型Prompt Learning提升效果很明显。对于希望将Prompt Learning应用到实际业务中的小伙伴可能有帮助。

下面主要按照如下思维导图进行学习分享:

广告行业中那些趣事系列59:详解当前大火的提示学习prompt

01 背景介绍

最近NLP又掀起了Prompt Learning提示学习的大潮,看看能不能落地到我们广告场景中。说起Prompt Learning,要先说下NLP四大范式:

广告行业中那些趣事系列59:详解当前大火的提示学习prompt

图1 NLP四大范式介绍图

  • 第一范式:非神经网络时代的完全监督学习(特征工程)。该阶段需要大量任务相关的训练数据,通过特征工程和算法,比较有代表的算法是朴素贝叶斯Naïve Bayes、支持向量机SVM、逻辑回归LR等;
  • 第二范式:基于神经网络的完全监督学习(架构工程)。该阶段也需要大量任务相关的训练数据,通过深度学习方法,自动获取特征(表示学习)进行端到端分类学习;
  • 第三范式:预训练,精调范式(目标工程):该阶段是当前使用比较多的预训练+微调范式,通过预训练的方式(比如掩码语言模型Masked Language Model)来学习海量的语言学知识,然后下游使用少量的任务相关的数据对预训练模型进行微调即可完成相关任务;
  • 第四范式:预训练,提示,预测范式(Prompt工程):当前进入了Prompt Learning提示学习的新范式,使用Few shot或者Zero shot即可完成下游任务。

以BERT为代表的预训练+微调范式在NLP领域引起了巨大的反响,不仅效果好,而且应用范围也非常广。但是预训练模型随着使用更多的数据、更大的模型效果也越来越好,比如GPT-3模型的参数量已经达到了恐怖的175B,伴随而来的问题是对这些“庞然大物”进行微调对硬件的要求和成本也越来越高。下面是预训练模型越来越大的介绍图:

广告行业中那些趣事系列59:详解当前大火的提示学习prompt

图2 预训练模型越来越“大”

为了解决预训练模型微调越来越困难的问题,提示学习Prompt Learning是一个不错的方向。Prompt Learning目标就是用一个完全无监督的预训练模型来解决下游各种问题,从而省去微调的步骤,让下游任务适配预训练模型。下面通过预训练+微调和Prompt Learning对比图查看两者的差异:

广告行业中那些趣事系列59:详解当前大火的提示学习prompt

图3 预训练+微调和Prompt Learning对比图

上图中左边是预训练+微调范式。对于下游不同的任务A、B、C,会对11B量级参数的预训练模型分别进行微调,得到3个微调之后不同的11B模型,核心是让预训练模型来适配下游任务。而Prompt Learning针对三个不同的下游任务只使用同一个预训练模型来构建任务,省去了微调的步骤,核心是让下游任务来适配预训练模型,这样可以充分利用已经训练好的预训练模型,大大提升预训练模型的使用效率。

02 Prompt Learning详解

2.1 Prompt的主要作用

Prompt Learning相比于预训练+微调来说最大的优势在于充分利用预训练模型的能力,通过添加提示信息将下游任务转化成预训练阶段的掩码预测任务。

2.2 Prompt文本分类流程

下面通过NLP中最常见的文本分类任务来对比介绍下预训练+微调和Prompt Learning提示学习流程:

广告行业中那些趣事系列59:详解当前大火的提示学习prompt

图3 预训练+微调和Prompt Learning流程对比

上图中左边部分是预训练+微调范式解决文本分类问题,将输入文本添加[CLS]开始标志和[SEP]结束标志,然后经过预训练模型编码得到encodding,将[CLS]标志作为句向量去进行文本分类流程,一般是经过一个softmax进行分类,得到正向/负向标签。而上图中右边部分则是Prompt Learning流程,该流程主要有以下四个步骤:

  • (1) 探索prompt模板,比如“我[MASK]喜欢”;
  • (2) 将输入转化成:"电影真好看!我[MASK]喜欢。";
  • (3) 利用预训练模型去预测答案,比如得到“不/很”等词;
  • (4) 构造映射函数,将答案转化成正向/负向分类的标签。比如预训练模型预测为“不”则会转化成负向的标签,如果预测为“很”则会转化成正向的标签。

Prompt Learning通过模板(Template)定义的提示语句,将原有任务转化为预测掩码位置的词,以及通过标签词(Verbalizer)的定义,建立预测词与真实标签之间的映射关系,就可以将下游任务转化成预训练阶段的掩码预测任务。Prompt Learning提示学习可以很好的应用到小样本甚至无样本场景中,解决下游任务。尤其对于我们广告场景中经常需要在小样本场景中进行文本分类更加适用。

2.3 Prompt形状

通过上面使用Prompt Learning进行文本分类任务的例子中可以看出来最重要的是如何得到Prompt模板,Prompt模板的数量和位置会直接影响下游任务的效果。

Prompt从位置上来看主要出现在句中或者句末,如果在句中称为cloze prompt,如果在句末称为prefix prompt。在句中时cloze prompt和Masked Language Model的训练方式就非常相似,非常适合 MLM任务,比如完形填空等任务。对于生成类或者自回归任务来说prefix prompt则非常合适,比如小说生成等任务。

Prompt从形式上来说可以是我们人类可理解的语言文本,也可以是人类无法直接理解但机器可以理解的向量embedding。

2.4 如何设计Prompt

设计Prompt可以通过手工设计模板,也可以自动学习模板。

2.4.1 手工设计模板

最开始Prompt就是通过手工设计模板,手工设计模板主要依赖人类的语言学知识,得到语义流畅且高效的模板。手工设计模板的好处在于可以直观可理解性较强,但是缺点也很明显,依赖很多人工经验和专业知识,代价比较大。

2.4.2 自动学习模板

相比于手工设计模板,自动学习模板则先进高效了很多。自动学习模板可以分为离散(Discrete Prompts)和连续(Continuous Prompts)两大类。离散的主要包括 Prompt Mining, Prompt Paraphrasing, Gradient-based Search, Prompt Generation 和 Prompt Scoring;连续的则主要包括Prefix Tuning, Tuning Initialized with Discrete Prompts 和 Hard-Soft Prompt Hybrid Tuning。

离散Prompts指的是自动生成由自然语言的词组成的Prompt,因此其搜索空间是离散的。常用的五种方法介绍如下图,主要参考资料【1】:

广告行业中那些趣事系列59:详解当前大火的提示学习prompt

图4 常用的离散Prompts方法

连续Prompts相比于离散Prompts来说不再拘泥于人类可以理解的语言,会将机器可以理解的向量embedding也作为Prompt模板。常用的三种方法介绍如下图,主要参考资料【1】:

广告行业中那些趣事系列59:详解当前大火的提示学习prompt

图5 常用的连续Prompts方法

2.5 Prompt Learning的优势

Prompt Learning核心在于充分利用无监督学习得到的预训练模型,省去了微调的步骤,将下游任务转化成预训练阶段的掩码预测任务。主要有两个优势:

一方面,Prompt Learning把所有的NLP任务统一转化成了语言模型的问题,避免了预训练和微调之间存在的差异,适用于几乎所有NLP任务,并且对于少样本和无样本场景也能取得不错的效果;

另一方面,相比于预训练+微调范式中让预训练模型适配下游任务,Prompt Learning是将下游任务进行重定义,让下游任务来适配预训练模型。可以更好的提升预训练模型的利用率。

03 基于paddleNLP实战Prompt Learning

上面从理论方面详解了Prompt Learning,下面基于百度paddleNLP实战Prompt Learning,开源项目github地址如下:

​https://github.com/PaddlePaddle/PaddleNLP/blob/develop/docs/advanced_guide/prompt.md​

Prompt API 提供了这类算法实现的基本模块,支持PET、P-Tuning、WARP、RGL等经典算法的快速实现。下面是Prompt API主要的目录结构,感兴趣的小伙伴可以到github详细了解并使用起来:

广告行业中那些趣事系列59:详解当前大火的提示学习prompt

图6 Prompt API主要的目录结构

对于文本分类任务来说,Prompt API实践教程分别提供了多分类文本分类示例、多标签文本分类示例和多层次文本分类示例。我们业务场景中主要是多分类任务,下面将PaddleNLP提供的Prompt Learning应用到公共数据集中并对比预训练+微调的效果。

小样本场景下的多分类任务github如下:

​https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/text_classification/multi_class/few-shot​

PaddleNLP提供了Prompt Learning端到端的实践案例,主要特点是标注成本低,在少样本(few-shot)的场景下取得比微调更好的分类效果,同时全流程打通,提供了从训练到部署的完整解决方案,可以低成本迁移至实际应用场景。相当于我们可以很容易的将Prompt Learning应用到我们下游任务中了,这对于快速落地到实际生产业务中是非常重要的。

效果方面,在公共数据集FewCLUE中的新闻分类(tnews)任务测试集中进行了测试,分别对比了预训练+微调和Prompt Learning的效果对比,下面是精度评价指标:

广告行业中那些趣事系列59:详解当前大火的提示学习prompt

图7 预训练+微调和Prompt Learning的效果对比

可以看出使用同样的预训练模型ernie-3.0-base-zh,Prompt Learning的效果提升非常明显。下一步我会应用到实际业务场景中,到时候有经验成果会和大家一起分享。

如果想在多标签文本分类任务中使用Prompt Learning可以查看以下github:

​https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/text_classification/multi_label/few-shot​

如果想在多层次文本分类任务中使用Prompt Learning可以查看以下github:

​https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/text_classification/hierarchical/few-shot​

总结和反思

本篇主要从理论到实践介绍了当前超火的提示学习Prompt Learning。首先介绍了背景,从NLP四大范式引出预训练+微调和当前大火的提示学习Prompt Learning。相比于预训练+微调是让预训练模型适配下游任务,提示学习Prompt Learning则是让下游任务来适配预训练模型,将几乎所有NLP任务统一转化成语言模型问题,提升预训练模型的利用率;然后重点介绍了Prompt Learning,主要包括Prompt的作用、Prompt文本分类流程、Prompt形状、如何设计Prompt和Prompt Learning的优势;最后基于百度paddleNLP实战Prompt Learning,在小样本场景下的多分类任务中对比了预训练+微调和Prompt Learning的效果,使用同样的预训练模型Prompt Learning提升效果很明显。对于希望将Prompt Learning应用到实际业务中的小伙伴可能有帮助。

参考资料

[1] NLP新宠——浅谈Prompt的前世今生, https://zhuanlan.zhihu.com/p/399295895

[2]https://github.com/PaddlePaddle/PaddleNLP/blob/develop/docs/advanced_guide/prompt.md

[3] NLP的四个范式, https://zhuanlan.zhihu.com/p/456951972

最新最全的文章请关注我的微信公众号或者知乎专栏:数据拾光者。

码字不易,欢迎小伙伴们点赞和分享。

广告行业中那些趣事系列10:推荐系统中不得不说的dssm双塔模型

摘要:本篇主要介绍了项目中用于商业兴趣建模的DSSM双塔模型。作为推荐领域中大火的双塔模型,因为效果不错并且对工业界十分友好,所以被各大厂广泛应用于推荐系统中。通过构建user和item两个独立的子网络,将训练好的两... 查看详情

广告行业中那些趣事系列10:推荐系统中不得不说的dssm双塔模型

...模型02DSSM模型理论知识03推荐领域中的DSSM双塔模型04实战广告推荐的双塔模型05总结 01为什么要学习DSSM双塔模型我们标签组主要的服务对象是广告主,服务目标是为广告主提供更好的广告转换效果。这里涉及到两种建模:一... 查看详情

广告行业中那些趣事系列6:bert线上化albert优化原理及项目实践(附github)

摘要:BERT因为效果好和适用范围广两大优点,所以在NLP领域具有里程碑意义。实际项目中主要使用BERT来做文本分类任务,其实就是给文本打标签。因为原生态BERT预训练模型动辄几百兆甚至上千兆的大小,模型训练速度非常慢,... 查看详情

你不知道的线程池构造方法的那些趣事?(代码片段)

(手机横屏看源码更方便)注:java源码分析部分如无特殊说明均基于java8版本。简介ThreadPoolExecutor的构造方法是创建线程池的入口,虽然比较简单,但是信息量很大,由此也能引发一系列的问题,同样地,这也是面试中经常被问... 查看详情

详解决策树-剪枝十分钟机器学习系列笔记

 决策树生成算法递归地产生决策树,直到不等你继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,模型结构过于复杂,即出现过拟合现象直接来看优秀的决策树一般要求... 查看详情

servletrequestattributes用法详解——spring系列学习笔记(代码片段)

之前想要拿到当前线程中的请求,直接在工具类中放了个ThreadLocal作为容器,当时候的需求只需要拿到request即可,所以那个方式是可以的。关于ThreadLocal相关知识,可以参考我的这篇博文——>https://zhanglong.blog.cs... 查看详情

servletrequestattributes用法详解——spring系列学习笔记(代码片段)

之前想要拿到当前线程中的请求,直接在工具类中放了个ThreadLocal作为容器,当时候的需求只需要拿到request即可,所以那个方式是可以的。关于ThreadLocal相关知识,可以参考我的这篇博文——>https://zhanglong.blog.cs... 查看详情

类型转换的那些趣事(is和as)(代码片段)

讲到类型转换我们不得不提一下值类型和引用类型。值类型int,double,bool,char,struct,enum~。引用类型string,object,class。staticvoidMain(string[]args)Demo_ValueValue=newDemo_Value();Value.numberA=10;Demo_ValueValue2=Value;//将改变前的值赋值给将要改变 查看详情

springboot官方文档怎么学习

...文章参考技术A先学springframework吧,把spring的原理,配置那些东西学会了,理解了再去用springboot很容易上手,其实springboot就是把很多spring的配置都简化了,很多东西在properties配置文件里写了之后,springboot就会自动帮你把相关的b... 查看详情

详解linux中的ps命令

...Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。要对进程进行监测和控制,... 查看详情

java深入学习11:lock锁详解(代码片段)

...常用的类与接口(lock是jdk1.5后新增的)  Lock接口支持那些语义不同(重入、公平等)的锁规则,可以在非阻塞式结构的上下文(包括hand-over-hand和锁重排算法)中使用这些规则。主要的实现是ReentrantLock。  Lock实现提供了比... 查看详情

fm算法详解

...欢迎大家star,留言,一起学习进步1.FM背景在计算广告中,CTR预估(click-throughrate)是非常重要的一个环节,因为DSP后面的出价要依赖于CTR预估的结果。在前面的相关博文中,我们已经提到了CTR中相关特征工程的... 查看详情

linux命令提示符[root@localhost~]#详解

[[email protected]~]# 1、@之前代表当前登录用户在Linux中管理员用户是root,还有一些普通用户;在此例中,root代表当前登录用户 2、@之后代表当前计算机主机名在此例中,localhost为当前计算机主机名 3、~当前用户的家... 查看详情

大数据学习系列之三-----hbasejavaapi图文详解(代码片段)

引言在上一篇中大数据学习系列之二-----HBase环境搭建(单机)中,成功搭建了Hadoop+HBase的环境,本文则主要讲述使用Java对HBase的一些操作。一、事前准备1.确认hadoop和hbase成功启动2.确认防火墙是否关闭3.maven所需要的依赖架包<!--h... 查看详情

别在学习今日头条互联网广告推广抖音视频营销方案产品运营框架了,那些让你起飞的计算机基础知识。

千万级大表如何优化,这是一个很有今日头条互联网广告推广抖音视频营销方案产品运营WX1526062597技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区,在此我想做一些补充和梳理,想和大家做一些这方面的经验... 查看详情

python中当前时间表示方法详解(代码片段)

在Python中获取当前时间是许多与时间有关的操作的一个很好的起点。一个非常重要的用例是创建时间戳。在本教程中,你将学习如何用datetime模块获取、显示和格式化当前时间。我们将学习如何读取当前时间的属性,如年... 查看详情

python中当前时间表示方法详解(代码片段)

在Python中获取当前时间是许多与时间有关的操作的一个很好的起点。一个非常重要的用例是创建时间戳。在本教程中,你将学习如何用datetime模块获取、显示和格式化当前时间。我们将学习如何读取当前时间的属性,如年... 查看详情

streamsets学习系列之streamsets的集群安装(图文详解)

...同的操作。    见    见StreamSets学习系列之StreamSets的CoreTarball方式安装(图文详解)        &nbs 查看详情