详解NLP多任务统一框架T5:揭秘T5的全能之谜

Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer

1910.10683.pdf (arxiv.org)

1.Abstract

预训练可以让模型学习到可以被迁移到下游任务重的通用能力和知识。在迁移学习中,模型首先在数据丰富的任务上进行预训练,然后在下游任务上进行微调。现存的缺陷:

  1. 训练结构:近期涌现了很多种不同的NLP迁移学习方法,这些方法使用不同的预训练目标、不同的数据集、不同的benckmark和不同的fine-tuning方法。

  2. 模型结构:几乎所有的pretrain+finetune的范式,都需要在下游的某个特定的nlp任务中添加新的layer,将模型的输出转化为任务特定的输出格式。

T5通过引入一个统一的框架来探索NLP的迁移学习技术的前景,该框架将所有基于文本的语言问题转换为文本到文本的格式。其基本思想

把每一个文本相关的问题都建模为“文本到文本”问题,即T5不需要对原始的模型添加任何参数,只需要对下游的数据添加**任务声明前缀。**这样做的好处在于可以使用同一个模型、目标函数、训练和解码过程来对待每一个NLP任务,灵活性非常高;并且可以对比不同的迁移学习目标、标注数据和其他因素的影响,同时通过放大模型和数据的规模来探索NLP迁移学习的极限。

2.Model construction

2.1.Model

img

本质上T5使用的生成式的方法来完成所有的nlp任务,经过测试发现 encoder-decoder的结构最好,于是最终T5的架构选型就为encoder-decoder结构(即原始的transformer结构)。

它的输入首先会通过采用Self-Attention机制的(Transformer)Encoder来进行编码(句子各部分均参与Attention计算),这里的Self-Attention机制可以让时刻的输入关注到其左右两边和位置的信息。之后,Encoder的输出会通过(Transformer)Encoder-Decoder(也是利用Self-Attention机制)来关联时刻的输出,也就是关联和。最后,利用Masked Self-Attention机制的(Transformer)Decoder会关联时刻输出和其前序的输出。

在细节上,T5与原生的Transformer结构非常类似,区别在于:

  1. 作者采用了一种简化版的Layer Normalization,去除了Layer Norm 的bias;将Layer Norm放在残差连接外面。

  2. 位置编码:T5使用了一种简化版的相对位置编码,即每个位置编码都是一个标量,被加到logits上用于计算注意力权重。各层共享位置编码,但是在同一层内,不同的注意力头的位置编码都是独立学习的。一定数量的位置Embedding,每一个对应一个可能的 key-query 位置差。作者学习了32个Embedding,至多适用于长度为128的位置差,超过位置差的位置编码都使用相同的Embedding。

2.2.预训练任务

img

对于原始文本(Original Text),T5首先会随机Mask掉某个区间的词并用特殊的标识符(如,,等)来替换被Mask掉的区间(Span), 来作为模型的输入(Inputs)。

之后在预训练阶段(Pretrain)阶段,类似于BERT的MLM,T5会预测被Mask的区间是哪些词,但与BERT不同的是,T5的预训练标签(Targets)会通过,,等带有顺序信息的特殊字符来与输入中的, , 等特殊标识符做对齐(Align)。

这是因为T5采用的Text-to-Text框架,需要通过这样的标识符来对齐被Mask的区间(Span)和相应的预训练标签(Targets)。

为什么选择这种结构的预训练任务呢?

img

与训练方式的选择从四方面来进行比较

1.高层次方法(自监督的预训练方法)对比,总共三种方式:

  • 语言模型式,就是 GPT2那种方式,从左到右预测;
  • BERT-style式,就是像 BERT 一样将一部分给破坏掉,然后还原出来;
  • DE shuffling(顺序还原)式,就是将文本打乱,然后还原出来。

其中,发现 Bert-style 最好

2.对文本一部分进行破坏时的策略,也分三种方法:

  • Mask法,如现在大多模型的做法,将被破坏 token 换成特殊符如 [M]
  • replace span(小段替换)法,可以把它当作是把上面 Mask 法中相邻 [M] 都合成了一个特殊符,每一小段替换一个特殊符,提高计算效率;
  • Drop法,没有替换操作,直接随机丢弃一些字符。

其中,发现 Replace Span 最好,类似做法如 SpanBERT 也证明了有效性。

3.对文本百分之多少进行破坏(Corruption Rate,挑了 4 个值:

  • 10%
  • 15%
  • 25%
  • 50%

其中,发现 BERT 的15%是最好的。

4.因Replace Span需要决定对大概多长的小段进行破坏(Corrupted Span Length,于是对不同长度探索:

  • 2
  • 3
  • 5
  • 10

其中,最后发现3结果最好。

最终的T5完整的模型结构和训练结构如下:

  • Transformer Encoder-Decoder 模型
  • BERT-style式的破坏方法
  • Replace Span的破坏策略
  • 15 %的Mask比例
  • Corrupted Span Length选择3 长度的破坏句子中小段

img

2.3.微调任务

img

添加图片注释,不超过 140 字(可选)

Input and Output Format

上图中,绿色部分表示翻译任务,红色表示文本分类任务,黄色表示文本相似度任务,蓝色部分表示摘要任务,左侧的框图表示T5的输入数据格式,右边则表示输出的结果。

可以看出:T5将自然语言处理任务转化为几乎一致的格式,即输入是任务前缀声明+原始文本,输出的文本序列为相应的生成结果。

这种输入和输出的格式类似于GPT3在few shot learning下的设定,但GPT3由于受限于decoder-only的模型结构,只在文本生成类的任务上具有独特的又是,T5则同时适用于所有自然语言处理任务。

为了让模型知道在执行什么任务,在输入文本前加上任务相关的前缀。作者发现变换前缀的用词对结果影响不大,因此并未探讨不同的前缀词的影响:

1.对于翻译任务,只需将训练数据集的输入部分前加上“translate English to German” 的任务前缀声明即,额完成英文到德文的翻译。

2.对于文本分类任务,输入"sentiment:This movie is terrible!",前面加“sentiment:”的前缀,就能输出"negative"的判定结果。

3.对于需要输出连续值的文本语义相似度任务,则是以 0.2 为间隔,从 1 到 5 分之间分成 21 个值作为输出分类任务。比如上图中,输出 3.8 其实不是数值,而是一串文本。

模型的微调和预测阶段,输入输出构造:

模型输入:前缀(提示词)+输入文本

模型输出:文本(翻译、摘要等可以直接用,分类等可以通过简单的转换得到预测结果)

2.4.训练策略

者受到MT-DNN多任务学习的启发,设计了以下五组对比实验,来验证多任务学习在Text-to-Text的框架内是否可以带来提升,以及应该选择什么样的方式完成训练:

img

Leave-one-out multi-task training:在训练数据和下游数据(除了目标任务的数据)进行预训练,之后再在目标任务上进行微调。

Multi-task pre-training + fine-tuning:首先在训练数据和下游数据(多个任务)进行预训练,其中,下游数据包括文本分类,阅读理解,文本匹配等加入前缀的训练数据集。之后,在每个具体下游任务进行微调。

作者发现:

  1. 没有大规模无标语料预训练的Supervised multi-task pre-training效果最差,再次说明了大规模无标语料的预训练对模型效果影响。

  2. 对比Multi-task training和Multi-task pre-training + fine-tuning可以发现两阶段的训练(Pretain +Fine-tune)方式优于单阶段的训练方式(合并Pretain +Fine-tune)。

  3. 对比Leave-one-out multi-task training和Multi-task pre-training + fine-tuning, 可以发现缺少具体任务的预训练(Pretrain),会一定程度降低模型的效果。

  4. Unsupervised pre-training + fine-tuning和Multi-task pre-training + fine-tuning,取得了相当的效果。

最终,作者认为同时在大规模无标语料和下游任务上训练对模型泛化性有好处,因此选择了:

Multi-task pre-training + fine-tuning作为T5实际采用的训练策略。

3.Conclusion

T5证明了pre-train+text-text这一框架的效果很好,考虑的各方面都很全面。其实,GPT2和GPT3都在尝试类似的事情。本质上,Text-to-Text就是一种自然的NLP多任务建模方式,因为人类本身在做NLP任务时采用的就是这种方式。另外,统一的预训练模型可以共享不同任务(Task)但同领域(Domain)的数据,这样对同领域的不同任务效果提升也会有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/485717.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI绘画与修图:重塑数字艺术的新纪元

文章目录 一、AI绘画与修图的原理二、AI绘画的应用三、AI修图的优势四、面临的挑战五、未来发展趋势《AI绘画与修图实战:PhotoshopFirefly从入门到精通 轻松玩转AI绘画与修图实战》亮点内容简介作者简介 随着人工智能技术的飞速发展,AI绘画与修图已经成为…

【Linux取经路】文件系统之缓冲区

文章目录 一、先看现象二、用户缓冲区的引入三、用户缓冲区的刷新策略四、为什么要有用户缓冲区五、现象解释六、结语 一、先看现象 #include <stdio.h> #include <string.h> #include <unistd.h>int main() {const char* fstr "Hello fwrite\n"…

使用k-近邻算法改进约会网站的配对效果(kNN)

目录 谷歌笔记本&#xff08;可选&#xff09; 准备数据&#xff1a;从文本文件中解析数据 编写算法&#xff1a;编写kNN算法 分析数据&#xff1a;使用Matplotlib创建散点图 准备数据&#xff1a;归一化数值 测试算法&#xff1a;作为完整程序验证分类器 使用算法&…

vulvhub-----Hacker-KID靶机

打靶详细教程 1.网段探测2.端口服务扫描3.目录扫描4.收集信息burp suite抓包 5.dig命令6.XXE漏洞读取.bashrc文件 7.SSTI漏洞8.提权1.查看python是否具备这个能力2.使用python执行exp.py脚本&#xff0c;如果提权成功&#xff0c;靶机则会开放5600端口 1.网段探测 ┌──(root…

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁

PublishFolderCleaner – Github 测试环境: .Net 8 Program.cs 代码 // https://github.com/dotnet-campus/dotnetcampus.DotNETBuildSDK/tree/master/PublishFolderCleanerusing System.Diagnostics; using System.Text;// 名称, 不用写 .exe var exeName "AbpDemo&…

基于Spring Boot+Mybatis+Shiro+EasyUI的宠物医院管理系统

项目介绍 本系统前台面向的用户是客户&#xff0c;客户可以进行预约、浏览医院发布的文章、进入医院商城为宠物购物、如有疑问可以向官方留言、还可以查看关于自己的所有记录信息&#xff0c;如&#xff1a;看病记录、预约记录、疫苗注射记录等。后台面向的用户是医院人员&…

一些可以参考的文档集合16

之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合5…

个人网站如何调用微信公司的登录接口,实现微信登录

个人网站如何调用微信公司的登录接口,实现微信登录&#xff01;如果你个人网站想使用微信公司的登录接口&#xff0c;目前是需要收费的&#xff0c;微信公司登录接口不再是免费的了。需要缴纳认证费&#xff0c;每年认证费是300元/年。才能调用微信的登录接口。 如图&#xff0…

FairyGUI × Cocos Creator 3.x 使用方式

前言 上一篇文章 FariyGUI Cocos Creator 入门 简单介绍了FairyGUI&#xff0c;并且按照官方demo成功在Cocos Creator2.4.0上运行起来了。 当我今天使用Creator 3.x 再引入2.x的Lib时&#xff0c;发现出现了报错。 这篇文章将介绍如何在Creator 3.x上使用fgui。 引入 首先&…

安泰高压放大器用途有哪些呢

高压放大器是一种功能强大的放大器&#xff0c;其广泛的用途使其在众多领域中发挥着重要作用。下面安泰电子将详细介绍高压放大器的用途和应用场景。 实验室仪器&#xff1a;在科研实验室中&#xff0c;高压放大器通常用于各种实验设备中&#xff0c;如光谱仪、质谱仪、电化学分…

【Appium UI自动化】pytest运行常见错误解决办法

通过Appium工具录制代码在pycharm上运行报错&#xff1a; 错误一&#xff1a; 1.提示 setup() 方法运行 error failed 解决办法&#xff1a;未创建 init __ 方法&#xff0c;创建一个空的__init.py文件就解决了。 原因&#xff1a; 错误二&#xff1a; 2.运行代码&#xff…

如何进行非线性负载测试?

非线性负载测试是模拟真实用户行为和系统性能的测试方法&#xff0c;它可以帮助我们发现系统在高并发、高负载情况下的性能瓶颈和潜在问题。以下是进行非线性负载测试的一些建议&#xff1a; 在进行非线性负载测试之前&#xff0c;首先要明确测试的目标&#xff0c;例如测试系统…

ESP8266智能家居(3)——单片机数据发送到mqtt服务器

1.主要思想 前期已学习如何用ESP8266连接WIFI&#xff0c;并发送数据到服务器。现在只需要在单片机与nodeMCU之间建立起串口通信&#xff0c;这样单片机就可以将传感器测到的数据&#xff1a;光照&#xff0c;温度&#xff0c;湿度等等传递给8266了&#xff0c;然后8266再对数据…

NATS学习笔记(一)

NATS是什么&#xff1f; NATS是一个开源的、轻量级、高性能的消息传递系统&#xff0c;它基于发布/订阅模式&#xff0c;由Apcera公司开发和维护。 NATS的功能 发布/订阅&#xff1a;NATS的核心是一个发布/订阅消息传递系统&#xff0c;允许消息生产者发布消息到特定的主题…

ONLYOFFICE 桌面应用程序 v8.0 发布:全新 RTL 界面、本地主题、Moodle 集成等你期待的功能来了!

目录 &#x1f4d8; 前言 &#x1f4df; 一、什么是 ONLYOFFICE 桌面编辑器&#xff1f; &#x1f4df; 二、ONLYOFFICE 8.0版本新增了那些特别的实用模块&#xff1f; 2.1. 可填写的 PDF 表单 2.2. 双向文本 2.3. 电子表格中的新增功能 单变量求解&#xff1a;…

核密度分析

一.算法介绍 核密度估计&#xff08;Kernel Density Estimation&#xff09;是一种用于估计数据分布的非参数统计方法。它可以用于多种目的和应用&#xff0c;包括&#xff1a; 数据可视化&#xff1a;核密度估计可以用来绘制平滑的密度曲线或热力图&#xff0c;从而直观地表…

nginx服务基础用法(概念、安装、热升级)

目录 一、I/O模型概述 1、I/O概念 1.1 计算机的I/O 1.2 Linux的I/O 2、零拷贝技术 3、同步/异步&#xff08;消息反馈机制&#xff09; 4、阻塞/非阻塞 5、网络I/O模型 5.1 阻塞型 I/O 模型&#xff08;blocking IO&#xff09; 5.2 非阻塞型 I/O 模型 (nonblocking …

基于Android的记单词App系统的研究与实现,附附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

超级实用的python代码片段汇总和详细解析(16个)

目录 1. 生成随机文本 2. 计算文本文件中的字数 3. 替换文件文件中的字串 4. 多文件名的批量替换 5. 从网站提取数据 6. 批量下载图片 7.批量删除空文件夹 8.Excel表格读写 9.合并Excel表格工作簿 10.数据库SQL查询 11. 系统进程查杀 12.图像尺寸调整和裁剪 13.图…

数据湖Iceberg、Hudi和Paimon比较

1.社区发展现状 项目Apache IcebergApache HudiApache Paimon开源时间2018/11/62019/1/172023/3/12LicenseApache-2.0Apache-2.0Apache-2.0Github Watch1481.2k70Github Star5.3k4.9k 1.7k Github Fork1.9k2.3k702Github issue(Open)898481263Github issue(closed)20542410488…