Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

苏剑林作者追一科技单位NLP、神经网络研究方向

那个屠榜的T5模型,现在可以在中文上玩玩了

不知道大家对 Google 去年的屠榜之作 T5 还有没有印象?就是那个打着“万事皆可 Seq2Seq”的旗号、最大搞了 110 亿参数、一举刷新了GLUE、SuperGLUE 等多个 NLP 榜单的模型,而且过去一年了,T5 仍然是 SuperGLUE [1] 榜单上的第一,目前还稳妥地拉开着第二名 2% 的差距。

然而,对于中文界的朋友来说,T5 可能没有什么存在感,原因很简单:没有中文版 T5 可用。不过这个现状要改变了,因为 Google 最近放出了多国语言版的 T5(mT5),里边当然是包含了中文语言。虽然不是纯正的中文版,但也能凑合着用一下。

▲ “万事皆可Seq2Seq”的T5

本文将会对 T5 模型做一个简单的回顾与介绍,然后再介绍一下如何在 bert4keras 中调用 mT5 模型来做中文任务。作为一个原生的 Seq2Seq 预训练模型,mT5 在文本生成任务上的表现还是相当不错的,非常值得一试。

一、T5

跟 BERT 一样,T5 也是 Google 出品的预训练模型,来自论文为 Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer,代码已开源。T5的理念就是“万事皆可 Seq2Seq”,它使用了标准的 Encoder-Decoder 模型,并且构建了无监督/有监督的文本生成预训练任务,最终将效果推向了一个新高度。

论文标题:

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

论文链接:

https://arxiv.org/abs/1910.10683

代码链接:

https://github.com/google-research/text-to-text-transfer-transformer

1.1 训练

T5 的预训练包含无监督和有监督两部分。无监督部分使用的是 Google 构建的近 800G 的语料(论文称之为 C4),而训练目标则跟 BERT 类似,只不过改成了 Seq2Seq 版本,我们可以将它看成一个高级版的完形填空问题:

输入:明月几时有,[M0] 问青天,不知 [M1],今夕是何年。我欲[M2]归去,唯恐琼楼玉宇,高处 [M3];起舞 [M4] 清影,何似在人间。 

输出:[M0] 把酒 [M1] 天上宫阙 [M2] 乘风 [M3] 不胜寒 [M4] 弄

而有监督部分,则是收集了常见的 NLP 监督任务数据,并也统一转化为 SeqSeq 任务来训练。比如情感分类可以这样转化:

输入:识别该句子的情感倾向:这趟北京之旅我感觉很不错。

输出:正面

主题分类可以这样转化:

输入:下面是一则什么新闻?八个月了,终于又能在赛场上看到女排姑娘们了。

输出:体育

阅读理解可以这样转化:

输入:阅读理解:特朗普与拜登共同竞选下一任美国总统。根据上述信息回答问题:特朗普是哪国人?

输出:美国

可以看到,这种转化跟 GPT2、GPT3、PET 的思想都是一致的,都是希望用文字把我们要做的任务表达出来,然后都转化为文字的预测,读者还可以翻看旧作必须要GPT3吗?不,BERT的MLM模型也能小样本学习了解相关内容。

总的来说,在我们的内部实验里边,模型够大、数据够多以及有监督预训练都是 T5 成功的关键因素,“万事皆可 Seq2Seq ”则提供了有效地融合这些关键因素的方案。

1.2 结果

T5 的主要战绩汇总如下表:

▲ T5的战绩汇总

除了屠了多个榜单之外,T5 还对整个训练流程中很多可调的超参数都调试了一遍,比如模型架构究竟用标准的 Encoder-Decoder 好还是 UniLM 那种结构好,无监督预训练任务究竟是 BERT 的方式好还是其他方式好,随机 Mask 的比例是不是 15% 最好,等等。

最后给出了如下的表格,并还很遗憾地表达了一句“其实我们觉得 T5 的实验做得还不是很充分”,颇有一种“走别人的路,让别人无路可走”的感觉。当然,不管怎样,这些炼丹结果还是值得每一位要做语言模型的同学好好看看,或许能让我们少走一些弯路。

▲ T5那巨细无遗的“炼丹宝典”(点击可以看大图)

二、mT5

至于 mT5,即 Multilingual T5,T5 的多国语言版,出自最近的论文 mT5: A massively multilingual pre-trained text-to-text transformer,代码已开源。这也是将多语种 NLP 任务的榜单推到了一个新高度了。当然,对我们来说,最重要的是 mT5 里边包含了中文,因此我们终于有机会在中文任务中尝试下 T5 了。

论文标题:

mT5: A massively multilingual pre-trained text-to-text transformer

论文链接:

https://arxiv.org/abs/2010.11934

代码链接:

https://github.com/google-research/multilingual-t5

2.1 T5.1.1

总的来说,mT5 跟 T5 一脉相承的,整体基本一样,但在模型结构方面,mT5 用的是 T5.1.1方案,在此对它做个基本的介绍。

很多人都不知道的是,自从在去年 10 月发布后,T5 在今年还经历了一次低调的小升级,具体细节可以查看 Github [2] 链接,官方把升级前的 T5 称为 T5.1.0,而升级后的叫做 T5.1.1。

它主要的改动来自论文 GLU Variants Improve Transformer [3],主要是借用了Language Modeling with Gated Convolutional Networks [4] 的 GLU(Gated Linear Unit)来增强 FFN 部分的效果。具体来说,原来 T5 的 FFN 为(T5 没有 Bias):

现在改为了:

也就是把 relu 激活的第一个变化层改为了 gelu 激活的门控线性单元,这样 FFN 层增加了 50% 参数,但是从论文效果看效果明显增加。

此外,T5.1.1 还对 Embedding 层做了改动,原来在 T5.1.0 中,Encoder 和 Decoder 的Embedding 层、Decoder 最后预测概率分布的 Softmax 层都是共享同一个 Embedding 矩阵的。

现在 T5.1.1 只让 Encoder 和 Decoder 的 Embedding 层共享,而 Decoder 最后预测概率分布的 Softmax 层则用了一个独立的 Embedding 矩阵,当然这会让参数量大大增加,但 Google 的结论说这样做效果会更好,其结论被总结在最近的论文Rethinking embedding coupling in pre-trained language models [5] 中。还有最后一点改动,T5.1.1 在预训练阶段去掉了 Dropout,而只有在下游微调阶段才使用 Dropout

经过这些调整后,Google 重新训练并开放了全系列的 T5.1.1 模型,其下载地址可以在刚才的 Github 链接找到,注意 T5.1.1 只做了无监督预训练,但效果依然相当出色。由于 T5.1.1 提升明显,所以 mT5 也就继续使用了 T5.1.1 结构了

2.2 结果

mT5 其实就是重新构建了多国语言版的数据集 mC4,然后使用 T5.1.1 方案训练了一波,技术路线上没有什么明显的创新。关于训练细节,大家观察下原论文就好,论文其实也不长,毕竟 T5 已经把路都给铺好了。

至于 mT5 的战绩,主要就是集中在下面这张表内了:

▲ mT5的“战绩”

读者可能会有疑问,这种多国语言版的该用什么方式评测?简单的话,我们可以直接在此基础上 finetune 一个跨语种的机器翻译任务,看看效果的提升。

但事实上,对于多国语言版模型,研究人员更关心的是它在跨语种任务上的 Zero Shot 表现,说白了,就是同一种任务,在一个语种上进行 finetune,其模型能不能直接用于其余语种?这也是上图中“Cross-lingual zero-shot transfer(models fine-tuned on English data only)”的含义了,可以看到,mT5 的表现还是相当出色的。

三、实践

终于到了大家喜闻乐见的实践时间了,这里我们简单介绍一下在 bert4keras 上使用 mT5 模型来做中文文本生成任务的流程和技巧。bert4keras 从 0.9.1 版本开始支持调用 mT5 模型,如果要进行下述实验的读者,请先将 bert4keras 升级到 0.9.1 版或以上。

Github链接:

https://github.com/bojone/t5_in_bert4keras

## 基本

用bert4keras把mT5模型加载到keras中的基本代码为:

# 模型路径
config_path = '/root/kg/bert/mt5/mt5_small/t5_config.json'
checkpoint_path = '/root/kg/bert/mt5/mt5_small/model.ckpt-1000000'
spm_path = '/root/kg/bert/mt5/sentencepiece.model'

# 加载分词器
tokenizer = SpTokenizer(spm_path, token_start=None, token_end='</s>')

# 加载模型
t5 = build_transformer_model(
    config_path=config_path,
    checkpoint_path=checkpoint_path,
    model='t5.1.1',
    return_keras_model=False,
    name='T5',
)

encoder = t5.encoder
decoder = t5.decoder
model = t5.model

可以看到跟在 bert4keras 中加载 BERT 没太大区别,其中 t5_config.json 的构建了 model.ckpt-1000000 的下载在 Github 上有详细介绍,大家请移步去看。完整代码(训练和解码细节)在 Github 上也可以找到,这里就不展开了。

值得一提的是,对于中文来说,tokenizer 给出的结果是带有词的,即对于中文来说 mT5 是以词为单位的,只不过词颗粒度会比较少。这进一步说明了我们之前的工作提速不掉点:基于词颗粒度的中文 WoBERT [6] 的改进方向是正确的。

3.1 中文

相信大多数读者多数都只关心中文任务,部分读者可能也会关心英文任务,应该鲜有读者会关心中英文以外的任务了。然而,mT5 涵盖了 101 种语言,总词表有 25 万,而且它采用的 T5.1.1结构的 Softmax 还不共享参数,这就导致了 Embedding 层占用了相当多的参数量。

比如 mT5 small 的参数量为 3 亿,其中 Embedding 相关的就占了 2.5 亿,关键是里边的大部分参数我们都用不上,纯粹是不必要的浪费。因此,对于主要关心中文任务的我们来说,有必要精简一下这个 Embedding 层了。

对模型的精简很简单,只需要在两个 Embedding 矩阵中删除不需要的行就行了,关键在于如何决定要保留的 token,以及如何得到一个精简后的 sentencepiece 模型。

决定要保留的 token,简单来想就是把中文的 token 保留下来,但是也不只是中文,英文的也要保留一部分,看上去似乎只是一个正则表达式的问题,实际上没那么简单,用英文字母的也不一定是英语,用中文字的也不一定是中文,这是个让人纠结的事情。

于是笔者想了另外一个办法:用这个 25 万 token 的 tokenizer 对笔者收集的几十 G 中文语料分词,统计分词结果,然后按照词频选择前面的部分(最后保留了 3 万多个 token)。这样虽然费时一些,但是比较靠谱,能确保把我们比较需要的 token 保留下来。决定词表后,就要修改得到一个新的 sentencepiece 模型,这也有点麻烦,但最终经过搜索后还是把这个事情解决了,处理方法都分享在 Github 上。

经过这样处理后,要构建新的模型,则只需要多加三行代码 keep_tokens 相关的代码,所需要的显存就大大降低,并且中文生成的效果基本不变了:

# 模型路径
config_path = '/root/kg/bert/mt5/mt5_base/t5_config.json'
checkpoint_path = '/root/kg/bert/mt5/mt5_base/model.ckpt-1000000'
spm_path = '/root/kg/bert/mt5/sentencepiece_cn.model'
keep_tokens_path = '/root/kg/bert/mt5/sentencepiece_cn_keep_tokens.json'

# 加载分词器
tokenizer = SpTokenizer(spm_path, token_start=None, token_end='</s>')
keep_tokens = json.load(open(keep_tokens_path))

# 加载模型
t5 = build_transformer_model(
    config_path=config_path,
    checkpoint_path=checkpoint_path,
    keep_tokens=keep_tokens,
    model='t5.1.1',
    return_keras_model=False,
    name='T5',
)

encoder = t5.encoder
decoder = t5.decoder
model = t5.model

3.2 效果

最后,大家应该是关心折腾了这么久,生成效果究竟有没有提升,有没有使用的价值?这样说吧,用 mT5 small 版本 finetune 出来的 CSL 标题生成模型,BLEU 指标能持平基于 WoBERT 的 UniLM 模型,并且解码速度快 130%;而用 mT5  base 版本 finetune 出来的 CSL 标题生成模型,指标能超过基于 WoBERT 的 UniLM 模型 1% 以上,并且解码速度也能快 60%。

说白了,确实是又快又好。至于设备要求,平时跑过 BERT base 的同学,基本都应该能跑起 mT5 small/base 版,甚至 large 版也可以尝试一下,至于 XL 和 XXL,那就比较难搞了,建议还是放弃吧。

更多的惊喜,还是大家自己去挖掘吧。对了,顺便需要提醒一下,微调 T5 模型的时候,学习率要比微调 BERT大10 倍以上才行(即  级别,BERT 一般是  级别),这是两者模型架构差异决定的。

四、小结

本文回顾了一下 Google 去年发布的 T5 模型,然后介绍了最近发布的多国语言版的 mT5,最后介绍了如何在 bert4keras 中微调 mT5 来做中文任务,结果显示 mT5 在中文生成上有着很不错的表现,值得做文本生成任务的同学一试。


参考文献


[1] https://super.gluebenchmark.com/

[2] https://github.com/google-research/text-to-text-transfer-transformer/blob/master/released_checkpoints.md

[3] https://arxiv.org/abs/2002.05202

[4] https://arxiv.org/abs/1612.08083

[5] https://arxiv.org/abs/2010.12821

[6] https://kexue.fm/archives/7758

PaperWeekly
PaperWeekly

推荐、解读、讨论和报道人工智能前沿论文成果的学术平台。

入门自然语言处理
相关数据
Dropout技术

神经网络训练中防止过拟合的一种技术

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

概率分布技术

概率分布(probability distribution)或简称分布,是概率论的一个概念。广义地,它指称随机变量的概率性质--当我们说概率空间中的两个随机变量具有同样的分布(或同分布)时,我们是无法用概率来区别它们的。

学习率技术

在使用不同优化器(例如随机梯度下降,Adam)神经网络相关训练中,学习速率作为一个超参数控制了权重更新的幅度,以及训练的速度和精度。学习速率太大容易导致目标(代价)函数波动较大从而难以找到最优,而弱学习速率设置太小,则会导致收敛过慢耗时太长

超参数技术

在机器学习中,超参数是在学习过程开始之前设置其值的参数。 相反,其他参数的值是通过训练得出的。 不同的模型训练算法需要不同的超参数,一些简单的算法(如普通最小二乘回归)不需要。 给定这些超参数,训练算法从数据中学习参数。相同种类的机器学习模型可能需要不同的超参数来适应不同的数据模式,并且必须对其进行调整以便模型能够最优地解决机器学习问题。 在实际应用中一般需要对超参数进行优化,以找到一个超参数元组(tuple),由这些超参数元组形成一个最优化模型,该模型可以将在给定的独立数据上预定义的损失函数最小化。

机器翻译技术

机器翻译(MT)是利用机器的力量「自动将一种自然语言(源语言)的文本翻译成另一种语言(目标语言)」。机器翻译方法通常可分成三大类:基于规则的机器翻译(RBMT)、统计机器翻译(SMT)和神经机器翻译(NMT)。

生成模型技术

在概率统计理论中, 生成模型是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下。 它给观测值和标注数据序列指定一个联合概率分布。 在机器学习中,生成模型可以用来直接对数据建模(例如根据某个变量的概率密度函数进行数据采样),也可以用来建立变量间的条件概率分布。

语言模型技术

语言模型经常使用在许多自然语言处理方面的应用,如语音识别,机器翻译,词性标注,句法分析和资讯检索。由于字词与句子都是任意组合的长度,因此在训练过的语言模型中会出现未曾出现的字串(资料稀疏的问题),也使得在语料库中估算字串的机率变得很困难,这也是要使用近似的平滑n元语法(N-gram)模型之原因。

文本生成技术

文本生成是生成文本的任务,其目的是使人类书写文本难以区分。

小样本学习技术

人类非常擅长通过极少量的样本识别一个新物体,比如小孩子只需要书中的一些图片就可以认识什么是“斑马”,什么是“犀牛”。在人类的快速学习能力的启发下,研究人员希望机器学习模型在学习了一定类别的大量数据后,对于新的类别,只需要少量的样本就能快速学习,这就是 Few-shot Learning 要解决的问题。

情感分类技术

情感分类是对带有感情色彩的主观性文本进行分析、推理的过程,即分析对说话人的态度,倾向正面,还是反面。

暂无评论
暂无评论~