论文地址: https://arxiv.org/abs/1909.05658 https://github.com/dbiir/UER-py
UER介绍
UER-py(Universal Encoder Representations)是一个用于对通用语料进行预训练并对下游任务进行微调的工具包。UER-py遵循模块化的设计原则。通过模块的组合,用户能迅速精准的复现已有的预训练模型,并利用已有的接口进一步开发更多的预训练模型。
UER-py有如下几方面优势:
- 可复现 UER-py已在许多数据集上进行了测试,与原始预训练模型实现(例如BERT、GPT-2、ELMo、T5)的表现相匹配
- 模块化 UER-py使用解耦的模块化设计框架。框架分成Embedding、Encoder、Target等多个部分。各个部分之间有着清晰的接口并且每个部分包括了丰富的模块。可以对不同模块进行组合,构建出性质不同的预训练模型
- 模型训练 UER-py支持CPU、单机单GPU、单机多GPU、多机多GPU训练模式,并支持使用DeepSpeed优化库进行超大模型训练
- 模型仓库 我们维护并持续发布预训练模型。用户可以根据具体任务的要求,从中选择合适的预训练模型使用
- SOTA结果 UER-py支持全面的下游任务,包括文本分类、文本对分类、序列标注、阅读理解等,并提供了多个竞赛获胜解决方案
预训练相关功能 UER-py提供了丰富的预训练相关的功能和优化,包括特征抽取、近义词检索、预训练模型转换、模型集成、文本生成等
UER框架组成
UER 主要由四个部分组成:副编码器(subencoder)、主编码器(encoder)、target 和微调(fine-tuning)。
每个部分又包含大量可执行模型,用户可以根据自己的需求调用相应模型,也可以根据需求自己设计相应模型。
此外,为了能够取得更好的预训练效果,在 UER 中还可以将不同模型进行组合使用。
1)副编码器
该部分主要用于学习 word 的底层特征。对于英文单词来说,底层特征主要指组成单词的各字母;
- 对于中文来说,底层特征可以用字符的偏旁部首或者拼音来表示。如果想基于词进行微调和推理,那么首先我们要对语料进行分词,词与词之间用空格分隔 —delimiter space
通过学习,模型可以获知 word 的内部结构。UER 采用 CNN 和 RNN 做为副编码器,并且使用平均池化或最大池化的策略来获得固定长度的词向量(word vector)。
2)主编码器
该部分主要用于学习词向量的主要特征。UER 可以直接执行基础的编码器,如 LSTM、GRU、CNN、GatedCNN、AttentionNN 等。也可以根据需求,实现不同编码器的组合,构建任意的网络结构。
近年来,Transformer 技术在文本特征提取任务上表现出优越的性能。因此 UER 的主编码器部分也整合了 Transformer 模块,为 BERT 等模型的执行提供便利。
3)Target
这个是目标层,即预训练的目标是什么。选用恰当的 target 是预训练成功的关键,虽然现有的 target 有很多种,但是它们都有各自的优缺点。UER 中包含有很多的 target,用户可以使用一种或多种 target,并赋予它们不同的权值。根据原理的不同,这些 target 可以分为有监督和无监督类型。
无监督目标:
- 基于词,例如 Language model(LM)、Masked LM(MLM)和 Autoencoder(AE)等 target 属于字符层面的 target,主要用于单词词义的预测;
- 基于句:Next sentence prediction(NSP)模型主要用于判断两个句子之间是否具有连续性。
有监督 target
- 主要包括 Neural machine translation(NMT)和 Classification(CLS)两种。有监督 target 往往可以为模型提供源语料库中无法提供的额外信息。
4)微调
UER 开发了与 ULMFiT、GPT 和 BERT 相似的微调策略,用于下游任务的模型往往具有和预训练模型相似的结构与参数,因此预训练模型只需经过微调即可使用。
UER支持3阶段训练:
- 在广义领域语料库上的预训练
- 在下游数据库上的预训练
- 及在下游数据库的微调。
这样做的好处是模型可以提前熟知下游数据库的数据分布,从而在微调环节取得更好的训练效果。
结果验证
为了验证 UER 性能的好坏,作者基于不同的数据集设计了一系列实验。
在论文中,作者以基于 BERT 的英文和中文模型为例,对 UER 的模型再现性(即能够产生目标模型的能力)进行评估,并讨论了在选取不同 target 和编码器时,UER 性能的提升效果。
1)模型再现性
前文已经提到,UER 中已经内嵌了大量的模型,用户可以直接调用这些模型,无需自己编写模型代码。
调用的方法也非常简单,用户只需要根据自己的需求,编写几行代码即可完成:
图中分别演示了执行不同模型时的模型调用方法,可以看到模型调用代码非常简单,即使对于第一次接触 UER 的用户来说也可以快速上手,这也是 UER 的特色之一。
在完成模型的调用之后,需要验证在 UER 中调用的模型与实际模型是否存在偏差,即验证 UER 中模型的准确性。论文中以 BERT 模型为例,分别对英文和中文的自然语言处理结果进行验证。
在英文验证部分,论文使用 GLUE 基准,并将 UER 取得的测试结果与 HuggingFace 的测试结果进行对比(表 1):
在中文验证部分,论文使用百度 ERNIE 基准,并将 UER 取得的测试结果与 ERNIE 提供的测试结果进行对比(表 2):
通过对比结果可以看出,UER 取得的测试结果与 HuggingFace 和 ERNIE 的测试结果相近,因此可以认为使用 UER 并不会影响模型训练效果。
2)target 和编码器对测试结果的影响
在选择不同的 target 和编码器时,模型的测试结果也是不同的。论文中,作者分别选择了不同的 target 和编码器,并记录采用 UER 的预训练模型在数据集上的测试结果。这里采用了豆瓣书评、亚马逊商品用户评价和 Chnsenticorp 三个中文情感分析数据集做为下游数据集。
首先,作者在 UER 中采用 BERT-base 的中文模型进行预训练,然后将预训练完成的模型在下游数据集上进行微调。为了进行对比,作者分别采用 MLM 和 CLS 做为 target,并记录测试结果(表3):
通过比较不难发现,选用不同的 target 会对预训练模型的性能产生较大影响,当采用 CLS 作为 target 时模型可以取得最高的测试结果。
由于 BERT 对计算力要求较高,为了提高运算效率,作者在 UER 中采用 2 层的 LTSM 编码器来代替原始 12 层的 Transformer,并记录在编码器改变时预训练模型的测试结果(表 4):
通过数据对比可以看出,选用 LSTM 编码器的预训练模型可以获得与 BERT 模型相近甚至更好的测试结果。该试验证明了采用 UER 进行模型预训练时可以灵活选择不同的 target 和编码器,来取得更好的训练效果及更高的训练效率。
总结
论文中提出了一种开源的 NLP 模型预训练工具箱,并详细介绍了其组成部分及使用方法。借助于 UER,用户可以方便、高效地执行各类预训练模型,并根据需求对模型进行调整,从而取得模型性能及训练速度的提升。