T5 PEGASUS:开源一个中文生成式预训练模型
By 苏剑林 | 2021-03-03 | 216314位读者 |去年在文章《那个屠榜的T5模型,现在可以在中文上玩玩了》中我们介绍了Google的多国语言版T5模型(mT5),并给出了用mT5进行中文文本生成任务的例子。诚然,mT5做中文生成任务也是一个可用的方案,但缺乏完全由中文语料训练出来模型总感觉有点别扭,于是决心要搞一个出来。
经过反复斟酌测试,我们决定以mT5为基础架构和初始权重,先结合中文的特点完善Tokenizer,然后模仿PEGASUS来构建预训练任务,从而训练一版新的T5模型,这就是本文所开源的T5 PEGASUS。
Tokenizer #
首先,这里介绍我们对Tokenizer的完善工作。mT5使用的Tokenizer是sentencepiece,这是一个C++所写的分词库,具有高效轻便的特点,但是很遗憾,对于中文来说它并不是特别友好,主要体现为:
1、sentencepiece会把某些全角符号强制转化为半角符号,这在某些情况下是难以接受的,而且还可能影响任务的评测结果;
2、sentencepiece内置的算法虽然有能力分出中文词来,但对于中文分词来说其实还是不够智能的;
3、sentencepiece用C++写的,虽然开源了,但对于用惯Python的人来说C++就相当于黑箱,难以阅读源码,改起来也不容易。
这些特点让我们决定将Tokenizer切换回BERT的Tokenizer。但直接替换原始版本的中文BERT的Tokenizer是不够的,一来是我们之前的工作《提速不掉点:基于词颗粒度的中文WoBERT》已经表明以词为单位来做生成模型能获得更好的效果,二来哪怕只看字中文BERT的vocab.txt也是很不完善的,漏了一些常见的标点符号(如双引号)和中文字(比如“琊”等)。为此,我们选择给BERT的tokenizer加入分词功能,并进一步完善vocab.txt。
具体来说,我们往原始中文BERT的token_dict里边加入结巴分词的前20万个词,然后修改Tokenizer的逻辑,使得它能够切分出词来,这些改动都已经内置在bert4keras中了,直接调用就行。接着,我们用这个修改后的Tokenizer去遍历切分我们准备的预训练语料,统计各个token的频数,最后只保留最高频的5万个token,得到一个规模为5万的vocab.txt来构建我们最终的Tokenizer。
除了用这个新Tokenizer来训练T5 PEGASUS外,我们还用它来重新训练了一版WoBERT模型(WoBERT+),也欢迎读者尝试(链接)。
预训练任务 #
对于预训练任务,我们希望更加接近自然语言生成(而不是像T5那样的只预测挖空部分),并且尽可能具有实用价值。为此,我们关注到了PEGASUS,来自论文《PEGASUS: Pre-training with Extracted Gap-sentences for Abstractive Summarization》。PEGASUS在其论文称是专门为摘要定制的预训练模型,但在我们看来,它也可以作为通用的生成式预训练任务。PEGASUS的大体思路是通过最长公共子序列的方式该摘要类似的数据对,T5 PEGASUS并没有完全复现PEGASUS的做法,只是借鉴了PEGASUS的思路做语料构建。
具体来说,假设一个文档有n个句子,我们从中挑出大约n/4个句子(可以不连续),使得这n/4个句子拼起来的文本,跟剩下的3n/4个句子拼起来的文本,最长公共子序列尽可能长,然后我们将3n/4个句子拼起来的文本视为原文,n/4个句子拼起来的文本视为摘要,这样就构成了一个“(原文, 摘要)”的伪摘要数据对了,就用这些数据对去训练Seq2Seq模型即可。注意,如果文档里没有重复句子的话,那么原文跟摘要的句子是不会有交集的,所以这样的生成任务并非是原文的简单复制,因此还是有一定难度的。
搜索算法则是通过如下的贪心算法逐步搜索至满足长度要求:
1、先找出1个句子,使得它跟生成的n−1个句子的最长公共子序列最长;
2、假设已经找到了k个句子,那么继续找第k+1个句子,使得这k+1个句子拼起来的文本,跟剩下的n−k−1个句子拼起来的文本的最长公共子序列最长。
参数与配置 #
目前开源的T5 PEGASUS是base版,总参数量为2.75亿,训练时最大长度为512,batch_size为96,学习率为10−4,使用6张3090训练了100万步,训练时间约13天,数据是30多G的精处理通用语料,训练acc约47%,训练loss约2.97。模型使用bert4keras进行编写、训练和测试。
实验与评测 #
在CSL和LCSTS两个文本生成任务上,T5 PEGASUS是我们已知的所有模型中的SOTA:
CSL摘要生成实验结果beam sizeRouge-LRouge-1Rouge-2BLEUBERT163.8165.4554.9145.52WoBERT166.3868.2257.8347.76mT5166.9669.0058.7449.79T5 PEGASUS167.6869.8759.849.37BERT264.4466.0955.7546.39WoBERT266.6568.6858.548.4mT5267.2569.1959.1050.17T5 PEGASUS268.2670.4560.5750.06BERT364.7566.3456.0646.7WoBERT366.8368.8158.6748.6mT5367.1769.1159.0550.13T5 PEGASUS368.3970.5460.6950.19LCSTS摘要生成实验结果beam sizeRouge-LRouge-1Rouge-2BLEUBERT127.9929.5718.0411.72WoBERT131.5132.9021.1313.74mT5128.9230.7519.5413.21T5 PEGASUS131.2133.5321.5414.47BERT229.2030.7019.1712.64WoBERT231.9133.3521.5514.13mT5229.9631.6720.4013.84T5 PEGASUS231.4734.0021.9814.75BERT329.4530.9519.5012.93WoBERT332.1933.7221.8114.29mT5330.1531.9720.7214.05T5 PEGASUS331.7834.1222.2314.96
更重要的是,T5 PEGASUS有着非常出色的小样本学习能力:
CSL摘要生成实验结果(小样本, beam size=1)样本数Rouge-LRouge-1Rouge-2BLEUWoBERT1000066.3868.2257.8347.76mT51000066.9669.0058.7449.79T5 PEGASUS1000067.6869.8759.849.37WoBERT100059.3460.4249.0737.87mT5100059.9161.5250.3840.87T5 PEGASUS100063.1265.2854.5443.55WoBERT10055.6855.3343.1031.55mT510055.3354.6242.7832.50T5 PEGASUS10060.8762.7852.3041.40WoBERT1026.3220.9912.295.76mT51026.6227.0017.9513.11T5 PEGASUS1055.8557.6647.5235.97
哪怕样本标注样本降低到10个,T5 PEGASUS依然可以微调出一个摘要(标题)生成模型出来,性能显著超过其他模型。在LCSTS上,T5 PEGASUS具有类似的小样本学习效果,只不过非T5 PEGASUS模型效果实在太差了,所以就没有把表格整理在此了。
小样本演示 #
下面是标注样本数为10个时训练出来的模型生成效果演示:
输入: 针对以超立方体网络为蓝本的多处理机系统的可靠性和容错能力的精准度量问题,结合多处理机系统遭受计算机病毒攻击时常常发生结构性故障的特点,研究了n维超立方体网络的结构连通性和子结构连通性评价问题。首先,使 用构造n维超立方体网络的3路结构割的方法得到其3路结构连通度的一个上界;然后,使用构造n维超立方体网络的3路子结构集的等价变换或约简变换的方法,得到其3路结构子连通度的一个下界;最后,利用任意网络的3路结构连通度不小于3路子结构连通度的性质,证实了超立方体网络的3路结构连通度和子结构连通度均为该超立方体网络维数
标题: 超立方体网络的3路结构连通度及子结构连通度
预测: 基于n维超立方体网络结构连通性和子结构连通性评价研究输入: 针对传统无线体域网(WBAN)预测模型对感知数据预测精度低、计算量大、能耗高的问题,提出一种基于惩罚误差矩阵的自适应三次指数平滑算法。首先在感知节点与路由节点之间建立轻量级预测模型,其次采用地毯式搜索方式 对预测模型进行参数优化处理,最后采用惩罚误差矩阵对预测模型参数作进一步的细粒化处理。实验结果表明,与Zig Bee协议相比,在1000时隙范围内,所提方法可节省12%左右的能量;而采用惩罚误差矩阵与地毯式搜索方式相比,预测精度提高了3. 306%。所提方法在有效降低计算复杂度的同时能进一步降低WBAN的能耗
标题: 基于惩罚误差矩阵的同步预测无线体域网节能方法
预测: 基于惩罚误差矩阵的自适应三次指数平滑算法输入: 针对车联网(IoV)环境下消息传输效率低下、网络资源开销较大等诸多问题,提出一种适用于城市交通场景下基于车辆节点认知交互的路由算法。首先,依据信任理论提出节点认知交互度的概念,并在此基础上对车联网中的车辆 节点进行分类,赋予它们不同的认知交互度初值;同时还引入车辆节点交互时间、交互频率、车辆节点物理间隔距离、间隔跳数以及消息生存时间等影响因子,进而构建了车辆节点认知交互评估模型。基于该模型计算并更新节点的认知 交互度,并通过比较对应车辆节点间的认知交互度值来选取认知交互度相对较高的邻居节点作为中继节点进行消息转
标题: 车联网环境下基于节点认知交互的路由算法
预测: 基于车辆节点认知交互的路由算法输入: 针对近场源波达方向(DOA)和距离的联合估计问题,提出一种近场迭代自适应算法(NF-IAA)。首先通过划分二维网格表示出近场区域内信源所有可能的位置,每个位置都看作存在一个潜在的信源入射到阵列上,表示出阵列输出的 数据模型;然后通过循环迭代利用上一次谱估计的结果构建信号的协方差矩阵,将协方差矩阵的逆作为加权矩阵估计出每个位置对应的潜在信源能量;最后绘制出三维能量谱图,由于只有真实存在的信源能量不为0,因此谱峰对应的位置即为真实存在信源的位置。仿真实验表明在10个快拍条件下,NF-IAA的DOA分辨概率达到了9
标题: 基于迭代自适应方法的近场源二维参数联合估计
预测: 基于nf-iaa的近场迭代自适应算法输入: 针对现有的软件众包工人选择机制对工人间协同开发考虑不足的问题,在竞标模式的基础上提出一种基于活跃时间分组的软件众包工人选择机制。首先,基于活跃时间将众包工人划分为多个协同开发组;然后,根据组内工人开发 能力和协同因子计算协同工作组权重;最后,选定权重最大的协同工作组为最优工作组,并根据模块复杂度为每个任务模块从该组内选择最适合的工人。实验结果表明,该机制相比能力优先选择方法在工人平均能力上仅有0. 57%的差距, 同时因为保证了工人间的协同而使项目风险平均降低了32%,能有效指导需多人协同进行的众包软件任务的工
标题: 基于活跃时间分组的软件众包工人选择机制
预测: 基于活跃时间分组的软件众包工人选择机制
可以看到哪怕标注样本很少,但依然能够得到可读性较好的生成结果,这得益于PEGASUS式的伪摘要预训练与下游任务是很贴近的。
简单的总结 #
本文主要分享了我们的中文生成式预训练模型T5 PEGASUS,它以mT5为基础,在中文语料上使用PEGASUS式的伪摘要预训练,最终有着不错的文本生成表现,尤其是出色的小样本学习能力,欢迎有文本生成需求的读者使用。
转载到请包括本文地址:https://kexue.fm/archives/8209
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Mar. 03, 2021). 《T5 PEGASUS:开源一个中文生成式预训练模型 》[Blog post]. Retrieved from https://kexue.fm/archives/8209
@online{kexuefm-8209,
title={T5 PEGASUS:开源一个中文生成式预训练模型},
author={苏剑林},
year={2021},
month={Mar},
url={\url{https://kexue.fm/archives/8209}},
}
March 9th, 2021
这个和先前您的一篇摘要生成文章对比呢?
SPACES:“抽取-生成”式长文本摘要(法研杯总结)
SPACES是一个混合模型,与T5 PEGASUS不矛盾,你可以把SPACES里边的生成部分换成T5 PEGASUS。
苏神,我在尝试将SPACES中生成部分的NEZHA模型换成T5 PEGASUS时,
model = build_transformer_model(
t5_config_path,
t5_checkpoint_path,
model='t5.1.1',
application='unilm',
with_mlm='linear',
keep_tokens=keep_tokens, # 只保留keep_tokens中的字,精简原字表
compound_tokens=compound_tokens,
)会报错,'UnifiedLanguageModel' object has no attribute 'with_mlm'看了源码 是t5模型不能与unilm共用吗?
请认真理解t5的用法:
https://github.com/ZhuiyiTechnology/t5-pegasus/blob/main/finetune.py
t5跟unilm并没有什么关系。
March 15th, 2021
赞!
不懂就问,请教下苏神,像PEGASUS这类non-causal的文本预训练方法,跟GPT这类causal的训练方法对比,哪个更好些?还是各有不同的应用场景?比如PEGASUS这个专门为摘要设计的,文本摘要方面应该要强些?GPT这种会在故事续写方便会好些?
PEGASUS也是causal的
谢谢指正!
March 15th, 2021
另外请教下苏神,6张3090,13天100万步的情况下可以轮几遍30G的数据?
估计五六遍吧
March 15th, 2021
有个疑问,最后的小样本学习是因为预训练就是基于摘要场景做的吗
你可以这么理解,由于下游任务也是摘要,所以需要的样本量比较少。如果下游任务是其他生成任务,那么依然可以用,但是所需要的标注样本可能会更多,但不管怎样,有了纯中文的生成预训练后,相对于其他非中文生成式预训练的模型来说,样本量需求应该是下降了的(或者反过来,相同样本量情况下效果可能提升了)。
March 16th, 2021
请问,为什么没有选用Pegasus论文中的Rouge1-F1来构造伪摘要呢,是pylcs运行速度比较快还是经过实验证明中文用最长公共子序列来构造比较好?
这个我没有对比,我只是直觉上觉得,目前摘要任务的主流评价指标是Rouge-L,而Rouge-L基于最长公共子序列,所以我就用最长公共子序列了,刚好pylcs实现速度也很快,就懒得挑了,这个差别可能也不大。前期我试用了编辑距离为指标,好像结果也差不多。
March 16th, 2021
请问苏神,需要finetune此模型的话,是整个模型一起finetune吗还是冻结一定成熟的T5?
整个模型一起微调比较好。
March 18th, 2021
请问苏神,在mt5中没有看到vocab.txt这个文件,那能否像BERT一样使用自定义的[unused]token吗?
mT5没有这个东西,T5 PEGASUS有。
老师,关于这套代码,我有几个问题:① T5是需要词表的,为什么MT5不需要词表呢?②T5PEGASUS 中关于的一些配置问题:源码中 #T5配置的这个 mt5_base_config.json 文件在哪里呢? ③ 源码中 # PEGASUS 配置的两个vocab.txt 文件是在哪里,我在 PEGASUS 开源的文件系统中只看到 c4.unigram.newline.10pct.96000.model 和 c4.unigram.newline.10pct.96000.vocab 两个文件,请问这两个文件和老师源码中的文件的区别是什么呢?还是说老师的代码中的两个 vocab.txt 文件时根据自己的语料构建起来的。 ④关于T5论文中说的损失函数问题,是一种去噪的目标函数(基于MLE),请问这种损失函数该如何理解,MT5采用的也是这种损失函数吗? ⑤就是老师关于基于T5OEGASUS 给出的文本抽取的测评,请问老师这种文本抽取的下游任务该如何制定,还是说老师的下游任务本身就是单纯地基于这个seq2seq结构直接生成的,如果是这样,那么损失该如何计算呢?是基于 rouge score 算法计算出来的 rouge-F1 得分作为损失吗?
========================
综上,还请老师不吝赐教帮帮学生,有的问题可能比较白痴,但是当局者迷,我可能是哪里迷住了,我明天也会仔细再去看看代码,尝试运行一下这些预训练模型。拜托了,再次谢过老师。
①T5和mT5都是基于sentencepiece,也就是你口中的“不需要词表”,至于T5 PEGASUS,认真读本文;
②mt5_base_config.json 是我自己按照BERT配置文件的格式写的,方便bert4keras读取而已,这些都是很灵活的,不要那么死板;
③认真阅读并理解本文;
④mT5跟T5的训练方式没什么区别,至于怎么理解最好自行体会;
⑤你可能需要先去了解一下什么是文本生成?什么是finetune?
嗯,多谢老师指点,我会按照老师的答复再仔细理解一下每一个点。
老师,这篇文章说是基于 MT5 的结构和 PEGASUS 的文本处理方式做出来的 PLM,所以我这两天又仔细地看了 T5 MT5 PEGASUS 的实现,我有个关于损失函数的问题想再请教一下老师,就是T5PEGASUS的语料是 1/4 和 3/4 抽取的伪摘要,这个过程确实很想 PEGASUS 的 GSG 的过程,那么损失函数什么样的呢?根据老师的指点,我在理解 MT5 这样的生成模型时是这样理解 MT5的损失的:因为 MT5 是 mask token 的方式,所以它是可以做交叉熵损失的(我不知道这个理解对不对,请老师明示)。那么对于 T5PEGASUS 这样的相当于 mask sequence 的方式呢?还可以用交叉熵损失吗?如果是,那就是是计算句子的概率分布了,请问句子的概率分布是如何统计出来的呢?如果不是,那么T5PEGASUS的损失函数究竟是什么样的呢?我想这个T5PEGASUS的损失函数应该是类似PEGASUS原文的损失函数吧(但是我不太理解PEGASUS的损失函数是什么,所以关于T5PESGASUS的损失函数这个问题的理解也会帮助我理解PEGASUS的损失吧),所以还请老师给我一个指点。 学生拜谢了。
T5、mT5、T5 PEGASUS的预训练任务都是seq2seq,seq2seq的损失函数默认都是交叉熵,上一位预测下一位。
T5PEGASUS的损失也确实是用的交叉熵,但是我总觉得我的理解好像还差点什么,所以还是希望老师针对上面一段的问题再稍微解释一下。谢谢老师了。
March 23rd, 2021
苏神,lcsts数据上finetune了几个epoch啊,我尝试了以下5个epoch之后训练loss持续下降,验证loss陡升,4个epoch的时候测试集loss最佳大概在3.2的样子
30个吧,我没有遇到陡增的。
March 31st, 2021
请问您在博文里使用的CSL数据集训练集数量是10K吗?https://github.com/CLUEbenchmark/CLGE上的训练数据只有3000
是的,10k
April 6th, 2021
[...]* 一种贪心匹配摘要算法 [...]