RobBERT:基于RoBERTa的荷兰语言模型
RobBERT是最先进的荷兰语BERT模型。 它是一个大型预训练的通用荷兰语言模型,可以在给定数据集上进行微调,以执行任何文本分类、回归或标记标注任务。 因此,它已被许多研究人员和从业者成功用于在广泛的荷兰语自然语言处理任务中实现最先进的性能,包括:
- 情感检测
- 情感分析(书评、新闻文章*)
- 共指消解
- 命名实体识别(CoNLL、职位*、SoNaR)
- 词性标注(Small UD Lassy、CGN)
- 零样本词预测
- 幽默检测
- 网络欺凌检测
- 纠正dt拼写错误*
并在以下任务中取得了出色的、接近最先进的结果:
- 自然语言推理*
- 评论分类*
* 注意,一些评估使用的是RobBERT-v1,而第二个改进版RobBERT-v2在我们测试的所有方面都优于第一个模型
(还请注意,这个列表并不详尽。如果您在应用中使用了RobBERT,我们很乐意了解!请发邮件给我们,或者通过发送包含编辑内容的拉取请求自行将其添加到此列表中!)
要使用HuggingFace transformers的RobBERT模型,请使用名称pdelobelle/robbert-v2-dutch-base
。
有关RobBERT的更深入信息可以在我们的博客文章和论文中找到。
目录
使用方法
RobBERT使用RoBERTa架构和预训练方法,但采用了荷兰语分词器和训练数据。RoBERTa是经过稳健优化的英语BERT模型,使其比原始BERT模型更加强大。鉴于这种相同的架构,RobBERT可以轻松地使用用于微调RoBERTa的代码和大多数用于BERT模型的代码进行微调和推理,例如HuggingFace Transformers库提供的代码。
RobBERT可以通过两种不同的方式轻松使用,即使用Fairseq RoBERTa代码或使用HuggingFace Transformers
默认情况下,RobBERT带有训练中使用的掩码语言模型头。这可以作为一种零样本方式来填充句子中的掩码。您可以在Huggingface的RobBERT托管推理API上免费测试。您还可以通过使用任何HuggingFace的RoBERTa运行器、他们的微调笔记本(将模型名称更改为pdelobelle/robbert-v2-dutch-base
)或使用原始的fairseq RoBERTa训练方案来为您自己的任务创建新的预测头。
使用Huggingface Transformers(最简单)
您可以使用🤗 Transformers轻松下载RobBERT v2。 使用以下代码下载基础模型并自行微调,或使用我们的一个微调模型(在我们的项目网站上有文档)。
from transformers import RobertaTokenizer, RobertaForSequenceClassification
tokenizer = RobertaTokenizer.from_pretrained("pdelobelle/robbert-v2-dutch-base")
model = RobertaForSequenceClassification.from_pretrained("pdelobelle/robbert-v2-dutch-base")
从transformers v2.4.0
开始(或从源代码安装),您可以使用AutoTokenizer和AutoModel。
然后您可以使用大多数HuggingFace基于BERT的笔记本来在您的荷兰语数据集类型上微调RobBERT。
使用Fairseq(较难)
或者,您也可以使用[RoBERTa架构代码](https://github.com/iPieter/RobBERT/blob/master/(https://github.com/pytorch/fairseq/tree/master/examples/roberta)来使用RobBERT。
您可以在这里下载RobBERT v2的Fairseq模型:(RobBERT-base, 1.5 GB)。
使用RobBERT的model.pt
,这种方法允许您使用RoBERTa的所有其他功能。
论文中的技术细节
我们的性能评估结果
所有实验在我们的论文中有更详细的描述,代码在我们的GitHub仓库中。
情感分析
使用荷兰语图书评论数据集预测评论是正面还是负面。
模型 | 准确率 [%] |
---|---|
ULMFiT | 93.8 |
BERTje | 93.0 |
RobBERT v2 | 95.1 |
Die/Dat(指代消解)
我们通过预测应该在句子中填入"die"还是"dat"来衡量模型进行指代消解的能力。 为此,我们使用了EuroParl语料库。
在整个数据集上微调
模型 | 准确率 [%] | F1 [%] |
---|---|---|
基线 (LSTM) | 75.03 | |
mBERT | 98.285 | 98.033 |
BERTje | 98.268 | 98.014 |
RobBERT v2 | 99.232 | 99.121 |
在10K个示例上微调
我们还测量了仅使用10K个训练示例的性能。 这个实验清楚地说明,当数据量较少时,RobBERT的表现优于其他模型。
模型 | 准确率 [%] | F1 [%] |
---|---|---|
mBERT | 92.157 | 90.898 |
BERTje | 93.096 | 91.279 |
RobBERT v2 | 97.816 | 97.514 |
使用零样本词掩码任务
由于BERT模型是使用词掩码任务预训练的,我们可以使用这个来预测"die"或"dat"哪个更可能。 这个实验表明,RobBERT比其他模型内化了更多关于荷兰语的信息。
模型 | 准确率 [%] |
---|---|
ZeroR | 66.70 |
mBERT | 90.21 |
BERTje | 94.94 |
RobBERT v2 | 98.75 |
词性标注
使用Lassy UD数据集。
模型 | 准确率 [%] |
---|---|
Frog | 91.7 |
mBERT | 96.5 |
BERTje | 96.3 |
RobBERT v2 | 96.4 |
有趣的是,我们发现在处理小型数据集时,RobBERT v2的表现显著优于其他模型。
命名实体识别
模型 | 准确率 [%] |
---|---|
Frog | 57.31 |
mBERT | 90.94 |
BERT-NL | 89.7 |
BERTje | 88.3 |
RobBERT v2 | 89.08 |
预训练过程详情
我们使用RoBERTa的训练方案对RobBERT进行了预训练。我们在OSCAR语料库的荷兰语部分上预训练了我们的模型。OSCAR是一个大型多语言语料库,通过对Common Crawl语料库进行语言分类获得。这个荷兰语语料库大小为39GB,包含66亿个词,分布在1.26亿行文本中,每行可能包含多个句子,因此使用的数据量比同期开发的荷兰语BERT模型更多。
RobBERT的架构与RoBERTa的基础模型相同,后者本身是对BERT的复制和改进。与BERT一样,它的架构由12个自注意力层组成,每层有12个头,共有1.17亿个可训练参数。与原始BERT模型的一个区别是由RoBERTa指定的不同预训练任务,仅使用MLM任务而不使用NSP任务。在预训练过程中,它只预测给定句子中某些位置的被掩蔽词。训练过程使用Adam优化器,学习率多项式衰减为l_r=10^-6,预热期为1000次迭代,超参数beta_1=0.9,以及RoBERTa默认的beta_2=0.98。此外,0.1的权重衰减和0.1的小dropout有助于防止模型过拟合。
RobBERT在一个计算集群上训练,每个节点有4个Nvidia P100 GPU,节点数量根据情况动态调整,同时保持固定的批量大小为8192个句子。最多使用20个节点(即80个GPU),中位数为5个节点。通过使用梯度累积,批量大小可以独立于可用的GPU数量设置,以最大限度地利用集群。使用Fairseq库,模型训练了两个epoch,相当于总共超过16k个批次,在计算集群上花费了约三天时间。在计算集群的训练任务之间,2个Nvidia 1080 Ti也承担了RobBERT v2的一些参数更新。
调查局限性和偏见
在RobBERT论文中,我们还调查了RobBERT潜在的偏见来源。
我们发现,对于大多数职业,零样本模型在简化的模板句子中估计hij(他)的概率高于zij(她),而不考虑现实中的实际工作性别比例。
通过在DBRB荷兰语图书情感分析数据集中增加评论作者的性别信息,我们发现RobBERT通常能更准确地检测出女性撰写的高度正面评论为积极的,相比男性撰写的评论。
如何复现我们论文中的实验
你可以按照以下步骤复现我们论文中的实验。你可以通过requirements.txt或pipenv安装所需的依赖:
- 使用
pip install -r requirements.txt
从requirements.txt文件安装依赖 - 或者使用Pipenv(通过在终端运行
pip install pipenv
安装)运行pipenv install
进行安装。
分类
在本节中,我们描述如何使用我们提供的脚本来微调模型,这些脚本应该足够通用,可以重用于其他所需的文本分类任务。
使用荷兰语图书评论数据集进行情感分析
- 从https://github.com/benjaminvdb/DBRD下载荷兰语书评数据集,并保存到
data/raw/DBRD
目录 - 运行
src/preprocess_dbrd.py
来准备数据集 - 为了在训练过程中不至于盲目进行,我们建议从训练集中保留一小部分作为评估集。为此请运行
src/split_dbrd_training.sh
- 按照
notebooks/finetune_dbrd.ipynb
笔记本的步骤来微调模型
预测荷兰语代词 die 和 dat
我们在荷兰语欧洲议会语料库上微调我们的模型。你可以先用以下命令下载它:
cd data\raw\europarl\
wget -N 'http://www.statmt.org/europarl/v7/nl-en.tgz'
tar zxvf nl-en.tgz
作为完整性检查,现在你的data/raw/europarl
文件夹中应该有以下文件:
europarl-v7.nl-en.en
europarl-v7.nl-en.nl
nl-en.tgz
然后你可以用以下脚本运行预处理,它会首先处理欧洲议会语料库以删除不包含任何 die 或 dat 的句子。
之后,它会翻转代词并用<sep>
标记将两个句子连接在一起。
python src/preprocess_diedat.py
. src/preprocess_diedat.sh
注意:你可以通过watch -n 2 wc -l data/europarl-v7.nl-en.nl.sentences
来监控第一个预处理步骤的进度。这将需要一段时间,但并不需要使用所有输入。这毕竟是你想要使用预训练语言模型的原因。你可以随时终止Python脚本,第二个步骤只会使用那些已处理的部分。
RobBERT 的名称由来
大多数类BERT模型的名称中都包含BERT这个词(例如RoBERTa、ALBERT、CamemBERT以及许多其他模型)。 因此,我们使用新训练的模型的掩码语言模型功能,让它用*<mask>bert*来为自己命名,使用了各种不同的提示,它一致地称呼自己为RobBERT。 我们认为这个名字非常贴切,因为RobBERT是一个非常荷兰化的名字(因此显然是一个荷兰语言模型),而且与其根源架构RoBERTa有很高的相似度。
由于*"rob"*在荷兰语中意为海豹,我们决定画一只海豹并将其打扮成芝麻街的Bert作为RobBERT的标志。
致谢和引用
本项目由Pieter Delobelle、Thomas Winters和Bettina Berendt创建。
我们感谢Liesbeth Allein在die-dat消歧方面的工作,感谢Huggingface提供的transformer包,感谢Facebook提供的Fairseq包,以及所有其他我们使用过其工作的人。
我们在MIT许可下发布我们的模型和此代码。
如果你想引用我们的论文或模型,你可以使用以下BibTeX代码:
@inproceedings{delobelle2020robbert,
title = "{R}ob{BERT}: a {D}utch {R}o{BERT}a-based {L}anguage {M}odel",
author = "Delobelle, Pieter and
Winters, Thomas and
Berendt, Bettina",
booktitle = "Findings of the Association for Computational Linguistics: EMNLP 2020",
month = nov,
year = "2020",
address = "Online",
publisher = "Association for Computational Linguistics",
url = "https://www.aclweb.org/anthology/2020.findings-emnlp.292",
doi = "10.18653/v1/2020.findings-emnlp.292",
pages = "3255--3265"
}