作者丨Zhe Zhao
机构丨RUC DBIIR & Tencent Research
研究方向丨自然语言处理
项目简介
预训练模型已经成为了 NLP 领域最重要的资源之一。当我们拿到一个 NLP 数据集时,首要任务是寻找一个预训练模型。当然,目前大家会趋同的选择 Google 发布的 BERT 模型 [1]。
不过本文将为大家提供更多的中文预训练模型的选择!本文将介绍如何利用一个预训练模型框架 UER(Universal Encoder Representations)去使用性质各异的中文预训练模型,从而在下游任务上取得比 Google BERT 更好的效果。
预训练模型一般分成四个部分:语料、编码器、目标任务以及微调策略。已有的工作从这四个部分中选择不同的模块(比如选择不同的目标任务),构成一个预训练模型(如下图所示)[1,2,3]。
▲ 图1. 预训练模型和它们使用的模块。BERT模型使用12层Transformer编码器,遮罩语言模型+下一句子预测作为目标任务,并将整个模型迁移到下游任务进行微调
语料、编码器、目标任务对于一个预训练模型的性质有着重要的影响。虽然目前 Google BERT 模型一枝独秀,但是 Google BERT 选择的语料、编码器、目标任务对于很多的下游任务数据集未必是合适的(Google BERT 使用中文维基百科语料+12 层 Transformer 编码器+遮罩语言模型任务&句子预测任务)。
因此,我们这里提供了一个基于不同语料、不同编码器以及不同目标任务的中文预训练模型仓库(model zoo)。UER 的代码和模型仓库可以在这里获取:
https://github.com/dbiir/UER-py
用户在模型仓库中选择适合下游任务的预训练模型进行下载并在上面微调。话不多说,下面我们一起看看如何用 UER 和它的模型仓库为我们的下游任务带来 SOTA 的效果!
快速上手
我们首先以非常火的 BERT 模型 [1] 和豆瓣书评情感分类数据集 [6] 为例,看看 UER 配合着模型仓库如何带来更好的预训练模型使用体验(更好的表现&更高的效率)。我们以使用者的角度,来上手操作一番。
我们首先要下载预训练模型。第一个下载的是 Google 官方的预训练模型(github 项目包含了所有预训练模型的下载地址)。我们把下载好的预训练模型放到 models 文件夹中。然后我们执行如下命令:
这里简单介绍一下各个选项的意义:--pretrained_model_path 指定预训练模型的路径;--vocab_path 指定词典的路径;下游任务数据集路径通过 --train_path、--dev_path、--test_path 指定;--encoder 指定我们使用的编码器,这里使用 BERT 中的 12 层 Transformer 编码器。
通过在 Google BERT 模型上微调,这里得到了 87.01 的结果。这个结果和 UER 项目中给的 87.5 的准确率有差距。如果更改 seed 的话结果会有一定的波动。UER 项目给的结果是多次取平均得到的。
下面,我们尝试其它的预训练模型,期待获得更好的效果。这里首先通过在一个小规模书评语料上预训练来得到一个更适合书评分类数据集的预训练模型。
我们加载 Google BERT 预训练模型,然后在小规模书评语料上进行无监督的预训练。本文侧重微调阶段,即如何在下游任务上利用好模型仓库中的预训练模型。至于预训练方面的细节,本文不加赘述。