广告行业中那些趣事系列23:一个大一统的NLP处理框架T5

导读:本文是“数据拾光者”专栏的第二十三篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本文主要从从理论到实践分享了NLP领域的T5模型,对于希望将T5模型应用到实际的机器学习项目的小伙伴可能会有帮助。

欢迎转载,转载请注明出处以及链接,更多关于自然语言处理、推荐系统优质内容请关注如下频道。

知乎专栏:数据拾光者

公众号:数据拾光者

摘要:本篇从理论到实践分享了NLP领域的T5模型。首先讲了下为啥要学习T5,作为一个大一统的NLP处理框架,T5的目标是通过添加补充信息把所有的NLP任务都改造成一种Text2Text格式的任务。T5不仅具有很强的通用性,并且效果惊人;然后详解了T5模型,重点从实验的方式一步步构建T5模型,包括预训练模型结构的选择、自监督的预训练方式的选择、文本破坏方式的选择、文本破坏比例的选择以及小段替换长度的选择等;最后从中文实战的角度实践了T5模型,使用多国语言版权重MT5来完成CLS标题生成任务。希望对T5模型感兴趣的小伙伴有所帮助。

 

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


 

01 为啥要学习T5

 

1.1 一个大一统的NLP处理框架

2018年BERT横空出世,基本上一统NLU领域。可以说使用BERT能解决80%以上的自然语言理解任务,并且得到的模型效果还很不错。目前我主要是基于BERT做文本分类任务,后面会出一个系列文章讲下使用BERT做分词、实体抽取、事件抽取、命名体识别、文本生成等任务,让BERT能更好的满足下游五花八门的任务。把BERT搞懂搞透,然后以一招去胜万招,这也是我后面的努力方向,也是BERT这类通用性模型的优点。

 

正在大家为BERT欢呼雀跃的时候,2019年谷歌放出了T5模型。BERT主要做NLU任务,对于NLG自然语言生成类任务显得有点力不从心,但是T5用一种大一统的思想把NLU和NLG任务一起解决了,这一种大一统的思想就是:把所有的NLP任务都转化成了文本到文本Text2Text格式的任务。怎么理解这种思想呢?咱们看看下面这张T5的图。

图1 T5的通用性NLP任务处理框架

 

下面咱们举几个中文化的例子说明T5是如何把所有的NLP任务转化成Text2Text格式的任务的:

先拿我主要做的文本分类任务来举例,假如我要识别用户的搜索是不是对汽车感兴趣,使用T5之前的数据输入格式是text, 输出是label,其中text是用户搜索文本”最近汽车降价了,打算买一辆奥迪A4”,label则代表标签1或者0,1代表感兴趣,0代表不感兴趣。使用T5之后把文本分类任务转化成了输入是“识别下面一句话是不是对汽车感兴趣:最近汽车降价了,打算买一辆奥迪A4”,输出是“感兴趣”。

 

再来个中文翻译成英文的任务,使用T5之前的数据输入是“我喜欢跑步”,输出是“I like running”。使用T5之后数据输入变成了“把中文翻译成英文:我喜欢跑步”,输出是“I like running”;

 

最后再看个阅读理解任务,使用T5之前的数据输入是“今天天气很好,本来想出去跑个步,不过朋友邀请我排位,后来就去打农药了。我后面去干什么了?”,输出是“打农药”。使用T5之后数据输入变成了“阅读理解:今天天气很好,本来想出去跑个步,不过朋友邀请我排位,后来就去打农药了。根据以上内容回答问题:我后面去干什么了?”,输出是“打农药”。

 

通过上面三个例子,我们发现了一个共同的现象,不管是文本分类任务、翻译任务还是阅读理解任务,T5通过添加一定的补充信息(上面三个例子中的标红的内容)把各种NLP任务都转化成了一个Text2Text任务。这也是T5最重要的作用:给NLP预训练模型领域提供了一个大一统的通用框架,把各式各样的任务都转化成Text2Text格式的任务。

这种思想最开始是在GPT-2的论文中提出来的,之前也写过一篇GPT系列的文章,感兴趣的小伙伴可以翻来看看《广告行业中那些趣事系列20:GPT、GPT-2到GPT-3,你想要的这里都有》

 

1.2 T5惊人的屠榜效果

T5最牛逼的不仅仅是提出了一个通用的预训练模型框架,最可怕的是这种模型效果还好到惊人。下面是T5模型在2019年出来时的榜单战绩图:

图2 T5的榜单战绩图

 

从上面的T5榜单战绩图中可以看出T5轻松碾压各种榜单。这样就给咱们NLPer解决了很多问题:之前各种五花八门的NLP任务咱们可能需要学习各种各样的模型,现在有了T5模型,咱们只需要一招胜万招,好好去思考给任务添加补充信息把下游的任务都转化成Text2Text模式的任务,然后放到T5模型里面就能应用于业务。这是多么惬意的一件事!对应于我们实际的业务中,可以用T5去完成文本分类任务、广告文案自动生成任务、实体抽取、标题自动生成等等,这样的模型值得每一个NLPer去学习。

 

02 T5详解

 

2.1 为啥叫T5

上面讲了T5提出了一个大一统的NLP处理框架和惊人的效果,下面正式介绍T5。T5是2019年谷歌提出来的,至于为啥叫T5,因为这是“Transfer Text-to-Text Transformer”的缩写。作者在论文中提出了一个统一框架,靠着大力出奇迹将所有的NLP任务都转化成了文本到文本的Text2Text任务。

 

2.2 手把手教你做一个NLP领域的“银弹”

与其说提出T5的《Exploringthe Limits of Transfer Learning with a Unified Text-to-Text Transformer》是一篇论文,不如说是一篇手把手教我们做一个NLP领域的“银弹”的大型实验探索论文。这篇整整34页的论文完整的介绍了NLP预训练模型领域的各项成果,通过各种各样丰富的实验帮助我们一步步探索并完成一个通用框架模型。下面是论文的作者们尝试的各种实验:

图3 T5模型的各种实验尝试

 

上面密密麻麻的实验数据包含了论文中多达70多项的实验。这些看似大大小小的实验对于咱们一般的公司或者个人非常艰难,因为预训练模型正在往使用更多数据、更大模型对应的更多算力消耗的路上狂奔,所以大部分人更多的是把开源的模型下载下来使用就好。而对于这种情况NLP领域的大佬们给大家(尤其是刚毕业从事NLP行业的小伙伴们)的建议是往应用型领域走,将这些预训练模型应用到实际的业务场景中产生收益,体现出技术的价值。使用这些模型你可以轻松的获得不错的效果,为企业产生效益,并为自己挣得一席之地。

 

说到这里结合自己的一些工作经历也感慨几句:关于人工智能行业被大家诟病最多的是各种吹牛逼的技术满天飞,但是真正能落地的很少。所以不管是刚入坑或者是已经身处人工智能行业的小伙伴们,大部分情况下进入到企业中最最重要的事是考虑如何把人工智能技术应用到企业中产生看得见的产出,不管是增加效益还是降低成本都行,这才是我们工程师的安身之本。明确了最重要的事,接下来就是如何快速高效的产出。而像BERT、T5这一类模型就是帮助我们快速输出的利器。咱们可能不需要像以前那样学各式各样的模型就能很好的应对下游各式各样的任务,这真的是咱们NLPer的福音。至于团队方面,如果只管你自己那么就为你自己的产出负责,如果你带几个人那么你就必须为你的小团体的产出负责。一点反思,希望和大家共勉。

上面扯远了,咱们言归正传。T5模型结合目前NLP领域前沿的预训练技术,通过实验探索的方式手把手教咱们做一个通用模型。下面咱们顺着论文的轨迹一步一步探索。

 

(1)  预训练模型结构的选择

T5模型本质还是基于Transformer架构,关于Transformer详细说明小伙伴们可以翻看我之前分享的一篇文章《广告行业中那些趣事系列4:详解从配角到C位出道的Transformer》。目前基于Transformer的模型架构主要有编码器解码器结构Encoder-Decoder、语言模型Language model和基于前缀的语言模型Prefix LM三种。下面是三种模型架构图:

图4 三种预训练模型架构图

 

第一种是编码器解码器结构Encoder-Decoder。这种结构是Seq2seq常用的模型,主要分成编码器和解码器。比如咱们输入一段话sequence,编码器中输入的每个字符可以看到全体,也就是可以看到包括自己的全部字符。而解码器不同,解码器的输出只能看到当前字符以及之前的字符。比如输出的首字符y1只能看到自己,而第二个字符y2可以同时看到自己和之前的字符y1;

 

第二种是语言模型Language model。LM可以理解成前面Encode-Dedcoder中的Decoder部分,可以理解成是单向的,每次只能看到当前以及之前的部分。就比如我们现在有一句话“我想吃苹果,还想跑步。”。语言模型在进行推理的时候是根据已知的字符来推断后面的字符,比如模型知道了“我想吃苹”,然后根据已知的去推断后面的字符“果”,然后不断的结合前面的内容去推断后续内容。这种模型的典型代表就是单向语言模型GPT模型;

 

第三种是基于前缀的语言模型Prefix LM。这种模型感觉更像是上面两种模型的融合体。对于Prefix LM来说,前面一部分文本可以理解为前缀像编码器一样各个字符可以看到前缀部分的所有内容,而后面剩下的部分则像Decoder那样是单向的,只能看到自己以及之前的内容。Prefix LM的典型的代表是微软的UNILM,它提供了一种优雅的方式可以让BERT模型做Seq2Seq任务。

 

上面三种基于Transformer的架构最本质的区别是对注意力机制的Mask掩码操作。下面咱们通过例子进行说明:


图5 三种不同的注意力机制掩码操作

 

从上图中我们输入“我想吃苹果”这句话,看看三种不同的注意力机制掩码操作是如何运转的:第一种双向可见的机制比较简单,每个字符不管顺序都可以看到全体;第二种单向可见的机制是考虑顺序的,每个字符只能看到当前以及之前的部分,比如对于字符“吃”来说只能看到“吃”以及之前的字符“我”和“想”;最麻烦的是第三种前缀双向可见的机制,这种机制是部分考虑顺序的。对于前缀“我想吃”来说每个字符是双向可见的,但是对于后面的字符“苹果”来说是单向的。比如前缀中(上图中最右边部分黑色方框内属于前缀范围)的字符“想”可以同时看到“我想吃”,但是前缀之后的字符“苹”却看不到之后的“果”。

 

通过实验发现Encoder-decoder架构的模型效果最好,所以T5模型本质上来说是一个基于Transformer的Encoder-decoder模型。下面是实验对比数据:

图6 三种基于Transformer的架构实验对比图

 

确定了模型的基本架构之后就是对预训练目标的扩大范围搜索流程,下面是论文中关键步骤的探索流程图:

图7 T5模型关键步骤探索流程图

 

(2)  自监督的预训练方法的选择

接下来需要搜索的是自监督的预训练方法的选择,可选的方式主要有三种:

  • 第一种是语言模型的预训练方式,主要是单向的从左到右依次预测,典型的代表就是GPT系列模型;

  • 第二种是类BERT方式的预训练方式,主要是先随机破坏掉一部分内容,然后进行还原;

  • 第三种是顺序还原的方式,主要是将文本的顺序打乱,然后再还原回来。


图8 自监督的预训练方式举例

 

如上图所示,假如有一条原始文本是“Thank you for inviting me to your party last week”,对于语言模型来说就是根据一部分内容“Thank you for inviting”来依次预测后面的内容“me to your party last week”;对于类BERT方式来说是破坏掉一部分内容比如随机Mask一部分内容“Thank you for 【Mask】me to your 【Mask】 last week”,然后使模型还原原始文本;对于顺序还原的方式来说就是打乱语句的顺序“party me for your to. last week. Thank you inviting”,然后使模型还原原始文本。

通过实验的方式发现使用类BERT方式的效果最好,所以T5模型确定使用类BERT方式的随机掩码的预训练方式。下面是三种自监督的预训练方式实验对比图:

图9 三种自监督的预训练方式实验对比图

 

(3)  文本破坏方式的选择

上面已经确定了使用类BERT方式破坏掉部分内容,主流的文本破坏方式有以下三种:假如现在有一句话“我喜欢吃苹果,还喜欢跑步”。第一种是原生BERT使用的是随机掩码的操作,也就是随机选择一部分比例来进行掩码,主要是单字,经过第一种文本破坏方式可能得到“我喜欢吃苹【Mask】,还喜欢【Mask】步”;第二种随机小段替换的方式Replace spans。这里随机小段的替换方式会把相邻内容进行替换,可能更多会考虑一个完整的词,比如经过第二种文本破坏方式可能得到“我喜欢吃【Mask】,还喜欢【Mask】”。相比于第一种将苹和跑两个单字掩码掉,第二种会将完整的词苹果和跑步都进行掩码操作;第三种方式是drop法,直接将部分内容删除掉。

通过实验发现第二种随机小段替换的方式效果最好。之前SpanBERT和基于全词掩码的BERT-WWM也采用的是这种方式。下面是三种文本破坏方式实验对比图:

图10 三种文本破坏方式实验对比图

 

(4)  文本破坏比例的选择

确定了使用随机小段替换的文本破坏方式之后下一步是替换比例的选择。原生BERT使用的是15%,而T5模型的作者选了4个值10%、15%、25%、50%。最后通过实验发现15%的比例是不错的,这也证明了BERT模型的选择是正确的。下面是四种随机小段比例的选择实验对比图:

图11 四种随机小段比例的选择实验对比图

 

(5)  小段替换长度的选择

确定好文本破坏比例的选择之后需要确定小段替换的长度。T5模型主要对比了2、3、5、10这四个值,最终发现替换的长度为3的效果是最好的。下面是四种替换长度的选择实验对比图:

图12 四种替换长度的选择实验对比图

 

关于这个实验需要明确一下,T5模型使用的是英文,而对于中文场景来说哈工大的基于全词掩码的BERT-WWM和百度的ERNIE模型使用的是基于全词掩码的预训练方式,所以可能涉及到分词,同时掩去的主要是实体词,所以个人感觉这组实验对于中文可能会有所差异。

 

2.3 T5的训练数据C4

T5模型使用的训练数据是从一个公开的网页存档数据集Common Crawl中清洗和加工出来的,大小为750GB,作者取名为C4,Colossal Clean Crawled Corpus (超大型干净爬取数据)。这也是T5模型给咱们的另一大贡献:提供了一个超大并且干净的数据集。虽然处理的是英文数据,但是其中一些文本数据的清理思路还是值得我们学习,下面是C4数据集的清洗过程:

  • 只保留结尾是正常符号的行;

  • 删除任何包含不好的词的页面,具体词表参考List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words库(笔者按:宝藏库,到里面转了一圈,看了看熟悉的几门语言,瞬间涨了不少新姿势);

  • 包含 Javascript 词的行全去掉;

  • 包含编程语言中常用大括号的页面;

  • 任何包含”lorem ipsum(用于排版测试)“的页面;

  • 连续三句话重复出现情况,保留一个。

2.4 T5的模型版本

T5模型训练并开放了以下5个从小到大版本的预训练模型权重:

  • Small:这是最小的版本,使用8头注意力机制,每个编码器和解码器只包含6层,总共有6千万参数;

  • Base:这是基础版本,使用12头注意力机制,每个编码器和解码器只包含12层,总共有2.2亿参数;

  • Large:这是相比于Base更大的版本,模型参数类比BERT-large版本,使用16头注意力机制,每个编码器和解码器包含24层,总共有7.7亿参数;

  • 3B:3B版本使用的是32头注意力机制,每个编码器和解码器包含24层,总共有30亿参数;

  • 11B :11B版本使用的是128头注意力机制,每个编码器和解码器包含24层,总共有110亿参数。

 

T5模型再一次论证了参数量越大模型的效果也会越好。下面是各版本T5模型在不同数据集上的实验效果图:

图13 各版本T5模型在不同个数据集上的实验效果图

 

小结下,本章重点讲解了T5模型。首先讲了下T5取名的由来,因为是“Transfer Text-to-TextTransformer”的缩写;然后详细剖析了T5模型的训练步骤,主要包括预训练模型结构的选择、自监督的预训练方式的选择、文本破坏方式的选择、文本破坏比例的选择以及小段替换长度的选择;接着讲了下T5的训练数据C4以及清洗和加工步骤,对于日常处理文本数据会有所帮助;最后讲了下T5开放的模型版本,以及再一次验证了模型越大对效果的提升影响。

 

03 实践T5模型

 

3.1中文版本的T5模型

上面一章重点详解了T5模型,很多小伙伴们摩拳擦掌想实践下看看效果。只可惜一开始T5主要是用英文的数据集训练的,而我们国人更多的是中文场景的NLP任务,所以没法直接用。所幸后来T5开源了多国语言版MT5(Multilingual T5)。MT5模型出自论文《mT5: A massively multilingualpre-trained text-to-text transformer》。

Github地址为:https://github.com/google-research/multilingual-t5

 

总体来说MT5使用的是T5的最新方案,也就是使用Gated Linear Unit(GLU)来增加前馈神经网络FFN的效果。下面是修改前后的FFN:

图14 T5修改前后的FFN

 

3.2 MT5的效果

MT5的效果也是非常不错的。下面是MT5的效果图:

图15 MT5的效果图

 

3.3 实践MT5来完成CLS标题生成任务

下面是苏神分享的一个使用MT5模型来完成CLS标题生成任务的github地址,感兴趣的小伙伴们可以跑跑看。下面是Github的地址:

https://github.com/bojone/bert4keras/blob/master/examples/task_seq2seq_autotitle_csl_mt5.py

 

后面打算在现有的文本分类任务上尝试下MT5模型,后续也会把实验的结果来和大家分享。

 

总结

本篇从理论到实践分享了NLP领域的T5模型。首先讲了下为啥要学习T5,作为一个大一统的NLP处理框架,T5的目标是通过添加补充信息把所有的NLP任务都改造成一种Text2Text格式的任务。T5不仅具有很强的通用性,并且效果惊人;然后详解了T5模型,重点从实验的方式一步步构建T5模型,包括预训练模型结构的选择、自监督的预训练方式的选择、文本破坏方式的选择、文本破坏比例的选择以及小段替换长度的选择等;最后从中文实战的角度实践了T5模型,使用多国语言版权重MT5来完成CLS标题生成任务。希望对T5模型感兴趣的小伙伴有所帮助。

 

参考资料

[1]《Exploring the Limits ofTransfer Learning with a Unified Text-to-Text Transformer》

[2]《mT5: A massively multilingual pre-trained text-to-text transformer》

 

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

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,基于 LangChain 自然语言处理框架的知识库 demo 的实现步骤如下: 1. 在 LangChain 节点上创建一个新的链,用于存储知识库合约和相关数据。具体操作方法可以参考 LangChain 官方文档。 2. 使用 Solidity 编写一个智能合约,该合约可以接收和存储用户输入的问题和答案。合约需要定义一个结构体,包含问题和答案两个字段,并提供相应的函数来添加和查询问题和答案。 ```solidity pragma solidity ^0.8.0; contract KnowledgeBase { struct QnA { string question; string answer; } mapping (uint256 => QnA) private qnaList; uint256 private qnaCount; function addQnA(string memory _question, string memory _answer) public { QnA memory newQnA = QnA(_question, _answer); qnaList[qnaCount] = newQnA; qnaCount++; } function getAnswer(string memory _question) public view returns (string memory) { for (uint256 i = 0; i < qnaCount; i++) { if (keccak256(abi.encodePacked(qnaList[i].question)) == keccak256(abi.encodePacked(_question))) { return qnaList[i].answer; } } return "Sorry, I don't know the answer."; } } ``` 3. 使用 LangChain 提供的命令行工具部署合约到新创建的链上。具体操作方法可以参考 LangChain 官方文档。 4. 使用 LangChain 自然语言处理框架,在前端界面实现自然语言识别和问题匹配,并调用智能合约提供的函数来查询问题和答案。 ```javascript // 初始化 LangChain SDK 连接 var LangChain = require("langchain-sdk"); var provider = new LangChain.providers.HttpProvider("http://localhost:8545"); var web3 = new LangChain(provider); // 获取合约实例 var contractAddress = "0x1234567890123456789012345678901234567890"; var contractABI = [...]; var knowledgeBase = new web3.eth.Contract(contractABI, contractAddress); // 识别用户输入的问题 var inputQuestion = "What is LangChain?"; // 查询问题的答案 knowledgeBase.methods.getAnswer(inputQuestion).call().then(function(answer) { console.log(answer); }); ``` 这就是一个基于 LangChain 自然语言处理框架的知识库 demo 的实现步骤。当然,实际上还需要考虑更多的安全性和用户体验等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值