九、BERT 扩展
9.1 BERT-wwm-ext
原始版本的
BERT
采用了WordPiece tokenize
来预处理,即把每个单词拆解一些wordpiece token
。wordpiece token
是由wordpice model:WMP
生成的,最初是为了解决谷歌语音识别系统遇到的日语/韩语分割问题。该模型是数据驱动,并且确保任何可能的字符序列的确定性分割。如:文本
Jet makers feud over seat width with big orders at stake
被分割成的wordpiece token
为:_J et _makers _fe ud _over _seat _width _with _big _orders _at _stake
其中
_
表示单词的开始标记。这种预处理为
BERT
带来一个严重的问题:有可能仅仅对一个单词的某个部分wordpiece token
执行了mask
。此时MLM
模型预测的只是单词的一部分,相当于模型对一个错误的目标进行预测。这非常不利于模型的学习。
有鉴于此,谷歌后续发布了
BERT
的Whole Word Masking:WWM
版本BERT-WWM
。在该版本中,一个单词要么没有被mask
、要么该单词所有的workpiece token
都被mask
。事实上,百度也提出了类似思想的
ERNIE
模型。BERT-wwm-ext
是BERT-WWM
的中文版本,该模型对中文的整个汉语单词而不是单个汉字进行mask
,在最新的中文维基百科上训练。仅仅利用中文维基百科训练,没有利用任何额外的数据,也未执行繁体-简体转换。因为该模型是为简体中文、繁体中文提供一个通用的
NLP
模型。其目标是:在不改变现有
BERT
的网络结构、超参数的情况下,为中文BERT
提供简单的、可扩展性的方法从而提高模型的能力。论文的主要贡献:
- 预训练好了一个中文
BERT-WWM
模型供人们使用。 - 在
BERT/BERT-WWM/ERNIE
上做了一些实验,验证该方法的有效性。 - 给出了中文
NLP
预训练的一些技巧。
- 预训练好了一个中文
数据预处理:
下载最新的
wikipedia dump
并用WikiExtractor.py
预处理,最终解压成 1307个文件。其中包含简体中文、繁体中文,无需执行繁体到简体的转换。清除
html
标记并拆分文档,最终得到 1360万行文本。通过哈工大的
LTP
分词工具来分词使用
create_pretraining_data.py
将文本转换成预训练样本,从而作为BERT
的输入。一共生成两组训练集,其中一组样本的最大长度为 128 个
token
,另一组样本的最大长度为 512 个token
。采用
BERT-WWM
相同的网络结构和超参数(如mask
比例)。
预处理的例子如下所示:
可以将
BERT-wwm-ext
视为BERT
的一个添加了单词边界的补丁版,而不是一个新的模型。- 预训练阶段:直接参考
BERT
。 - 微调阶段:直接使用
BERT-wwm-ext
替代原来的中文BERT
预训练模型,甚至不需要修改配置文件。
- 预训练阶段:直接参考
预训练参数:
使用
LAMB
优化器替代BERT
的Adam
权重衰减优化器。首先在最大长度 128 的样本上训练,
batch-size = 2560
,初始化学习率1e-4
,warm-up
比例 10%,训练 10万步。然后在最大长度 512 的样本上训练,
batch-size = 384
,初始化学习率1e-4
,warm-up
比例 10%,也训练 10万步。
预训练语料及其参数如下表所示:
中文微调任务:涵盖了从
sentence-level
到doc-level
、各种文本长度的任务。机器阅读理解
Machine Reading Comprehension:MRC
:从给定文本中提取出连续的片段来回答问题。数据集:
CMRC 2018
:由中国信息处理学会、IFLYTEK
和哈工大发布的机器阅读理解数据集。DRCD
:由Delta
研究所发布的繁体中文机器阅读理解数据集,通过工具将它转换为简体中文。CJRC
:来自中国法律判决文件的数据集,类似CoQA
。其中包括yes/no
二元答案问题、span-extraction
问题、以及没有答案的问题。
命名实体识别
Named Entity Recognition: NER
:识别出文本中的命名实体。其中命名实体的标签包括:O, B-PER, I-PER, B-ORG, I-ORG, B-LOC, I-LOC
。使用
seqeval16
来评估模型在Precision,Recall,F-score
方面的得分。数据集:
People Daily
:人民日报网站收集的新闻数据,包含官方正式新闻。MSRA-NER
:微软亚洲研究院发布的命名实体识别数据集。
自然语言推理
Natural Language Inference:NLI
:判定两个给定句子之间的蕴含关系。数据集:
XNLI
。情感分析
Sentiment Analysis:SA
:判定给定的句子情感是积极的还是消极的。数据集:
ChnSentiCorp
数据集。该数据集包含酒店、书籍和PC
等多个领域的评论。Sina Weibo
数据集:包含12万个带有正面、负面情感标签的新浪微博短文本。
句子语义匹配
Sentence Pair Matching:SPM
:判断给定两个句子是否语义相似。数据集:
LCQMC
:哈工大 2018年发布的语义相似数据集BQ Corpus
:由哈工大和WeBank
在 2018年EMNLP
上发布的语义相似数据集
文档分类
Document Classification:DC
:判断一篇文章属于哪个类别。数据集:
THUCNews
:包含不同主题(金融、体育、科技…)的新浪新闻,是THUCTC
的一部分。
为公平起见,对同一个任务的不同模型
BERT/BERT-wwm-ext/ERNIE
采用相同超参数(如下图所示),其中 † 表示该数据集在BERT
中也被评估, ‡ 表示该数据集在ERNIE
中也被评估 。为确保结果可靠性,每个任务进行十次相同的实验并给出最高分和平均分(括号里给出的得分)。其中最佳初始化学习率通过验证集来挑选。
机器阅读理解
MRC
结果:最佳初始化学习率:
BERT BERT-wwm ERNIE
CMRC 数据集: 3e-5 3e-5 8e-5
DRCD 数据集: 3e-5 3e-5 8e-5
CJRC 数据集: 4e-5 4e-5 8e-5
ERNIE
在DRCD
没有表现出竞争力,说明它不适合处理繁体中文文本。检查
ERNIE
的词汇表之后发现繁体中文字符被删除了,因此导致它在繁体中文任务上性能较差。在
CJRC
中,BERT-wwm
比BERT
和ERNIE
有所改善但是不是很显著,有两个原因:CJRC
中的文本是以专业的方式撰写。这说明专业领域的任务需要进一步的专业适配。- 在专业领域,中文分词器的分词准确率也有所下降。这导致依赖于中文分词的
ERNIE/BERT-wwm
性能下降。
命名实体识别
NER
结果:最佳初始化学习率:
BERT BERT-wwm ERNIE
人民日报 数据集: 3e-5 3e-5 5e-5
MSR-NER 数据集: 3e-5 4e-5 5e-5
平均而言
ERNIE
性能最好,因为ERNIE
采用了更多的训练数据。
自然语言推理
NLI
结果:最佳初始化学习率:
BERT BERT-wwm ERNIE
XNLI 数据集: 3e-5 3e-5 5e-5
情感分析
SA
结果:最佳初始化学习率:
BERT BERT-wwm ERNIE
ChnSentiCorp 数据集: 2e-5 2e-5 5e-5
新浪微博 数据集: 2e-5 3e-5 3e-5
句子语义匹配
SPM
结果:最佳初始化学习率:
BERT BERT-wwm ERNIE
LCQMC 数据集: 2e-5 2e-5 5e-5
BQ 数据集: 2e-5 3e-5 3e-5
文档分类
DC
结果:最佳初始化学习率:
BERT BERT-wwm ERNIE
LCQMC 数据集: 2e-5 2e-5 5e-5
中文
NLP
任务经验技巧:- 初始学习率是最重要的超参数。应该永远对其择优,从而获得能力更强的模型。
- 由于
BERT
和BERT-wwm
在维基百科上训练,因此它们在正式文本上表现较好;而ERNIE
在包括网络文本在内的更大数据的训练,因此对微博等非正式文本更有效果。 - 处理繁体中文时,选择
BERT
或者bert-wwm
。
9.2 RoBERTa
预训练模型能够显著的提升任务效果,但是不同预训练模型的比较非常困难。
- 首先,每个预训练模型的训练成本很高,无法一一训练并进行比较。
- 其次,不同预训练模型通常是在不同规模大小的数据集上训练的,难以评估效果的好坏是预训练模型引起的还是预训练数据引起的。
- 最后,超参数的选择对预训练模型的表现影响很大。同一个预训练模型的不同超参数,其比较结果会有很大不同。
RoBERTa
主要工作是复现BERT
,然后对BERT
的模型架构、训练目标、训练细节(如数据集大小、训练时间)的重要性进行探索,从而提出了改进方案,这个改进方案称为RoBERTa
。主要修改:
- 更大的
batch size
、更多的数据、更长的预训练时间 - 移除
NSP
任务 - 使用更长的输入序列
- 使用动态
mask
- 更大的
RoBERTa
采用160 G
训练文本,远超BERT
的16G
文本,其中包括:BOOKCORPUS
和英文维基百科:原始BERT
的训练集,大小16GB
。CC-NEWS
:包含2016年9月到2019年2月爬取的6300万篇英文新闻,大小76 GB
(经过过滤之后)。OPENWEBTEXT
:从Reddit
上共享的URL
(至少3个点赞)中提取的网页内容,大小38 GB
。STORIES
:CommonCrawl
数据集的一个子集,包含Winograd
模式的故事风格,大小31GB
。
9.2.1 实验探索
静态
mask
VS
动态mask
:原始静态
mask
:在预处理的时候对整个数据集执行一次mask
,后续的每个训练步都采用相同的mask
。这是原始BERT
的做法。修改版静态
mask
:在预处理的时候将数据集拷贝 10 次,每次拷贝采用不同的mask
。同时每个拷贝被训练 4 个epoch
。这等价于原始的数据集采用10种静态
mask
来训练 40个epoch
。动态
mask
:并没有在预处理的时候执行mask
,而是在每次向模型提供输入时动态生成mask
。
不同模式的实验效果如下表所示。其中
reference
为BERT
用到的原始静态mask
,static
为修改版的静态mask
。使用
NSP
VS
抛弃NSP
:SEGMENT-PAIR + NSP
:输入包含两部分,每个部分是来自同一文档或者不同文档的segment
(segment
是连续的多个句子),这两个segment
的token
总数少于 512 。预训练包含MLM
任务和NSP
任务。这是原始
BERT
的做法。SENTENCE-PAIR + NSP
:输入也是包含两部分,每个部分是来自同一个文档或者不同文档的单个句子,这两个句子的token
总数少于 512 。预训练包含MLM
任务和NSP
任务。FULL-SENTENCES
:输入只有一部分(而不是两部分),来自同一个文档或者不同文档的连续句子,token
总数不超过 512 。如果跨文档,则在文档末尾添加文档边界token
。预训练不包含
NSP
任务。DOC-SENTENCES
:输入只有一部分(而不是两部分),来自同一个文档的连续句子,token
总数不超过 512 。预训练不包含
NSP
任务。
不同方式的效果如下图所示。结果表明:
使用
SENTENCE-PAIR + NSP
有损于下游任务。猜测的原因是:单个句子对于长期依赖性建模效果不好。移除
NSP
任务相比原始BERT
效果更好。猜测的原因是:原始BERT
实现采用的是SEGMENT-PARI
输入,但是移除了NSP
任务。在移除
NSP
的两种策略中,DOC-SENTENCES
效果比FULL-SENTENCES
更好。但是
DOC-SENTENCES
策略中,位于文档末尾的样本可能小于 512 个token
。为了保证每个batch
的token
总数维持在一个较高水平,需要动态调整batch-size
。
更大的
batch-size
:在
Neural Machine Translation:NMT
任务研究中发现:当学习率适当增加、batch-size
非常大时,可以提高训练速度、提升模型能力。经过实验观察发现,大的
batch-size
对于BERT
也有类似帮助。注:在相同的训练代价下,其中
训练代价 = steps x batch_size
。BPE
文本编码:Byte-Pair Encoding:BPE
是字符级和单词级表示的混合,它不是完整的单词而是sub-word
单元。BPE
通过训练语料库的统计分析得到的,其词表大小通常在 1万到 10万之间。有两种
BPE
实现方式:- 基于
char-level
:原始BERT
的方式,它通过对输入文本进行启发式的词干化之后处理得到。 - 基于
bytes-level
:与char-level
的区别在于bytes-level
使用bytes
而不是unicode
字符作为sub-word
的基本单位,因此可以编码任何输入文本而不会引入UNKOWN
标记。
当采用
bytes-level
的BPE
之后,词表大小从3万(原始BERT
的char-level
)增加到 5万。这分别为BERT BASE
和BERT LARGE
增加了 1500万和2000万额外的参数。有研究表明,这样的做法会导致轻微的性能下降。但是
SoBERTa
的作者相信:这种统一编码的优势会超过性能的轻微下降。- 基于
汇总这些改进点即可得到一个更稳定
Roustly
、更好optimized
的BERT
实现approch
,称之为RoBERTa
。其中包括:动态掩码、抛弃NSP
的FULL-SENTENCES
、更大的batch-size
、bytes-level BPE
。除此之外还包括一些细节,包括:更大的预训练数据、更多的训练步数。
9.2.2 实验结果
在微调实验中,
BERT,RoBERT, XLNET
都采用了BERT LARGE
的网络参数: ,参数总量大约 3.55 亿。微调任务:
General Language Understanding Evaluation: GLUE
:是一组各种NLP
文本任务。Stanford Question Answering Dataset:SQuAD
:一个大型阅读理解数据集,包含SQuAD 1.1
和SQuAD 2.0
。其中SQuAD 1.1
中的问题总是有答案,而SQuAD 2.0
中的问题可能没有答案。ReAding Comprehension from Examinations: RACE
:包含了12到18岁中国初中、高中英语考试中的近10万个问题,答案由人工专家生成。涉及到挑战性的推理问题,所以它是最困难的阅读理解数据集之一。另外,该数据集每篇文章平均超过300个段落,远远超过其它流行的阅读理解数据集(如
SQuAD
) 。 因此该数据集对于长文本理解来说是个具有挑战性的baseline
。
GLUE
微调结果:目前有两种微调策略:
single-task
:基于每个GLUE
任务的标记数据来训练该任务。multi-task
:基于多个GLUE
任务的标记数据来多任务训练,然后再微调具体的任务。
RoBERTa
执行的是single-task
微调策略,其结果如下图所示。其中:RoBERTa
的ensembles
基于single-task
得到的多个模型的集成。这种方式在 9 个任务中的 4 个做到了SOA
。论文作者预期:一旦使用多任务微调策略,则
RoBERTa
的成绩会更好。QNLI
通常都被视为一个二分类问题,但是近期的研究将其视为ranking
问题。RoBERTa
也延续了ranking
的思路。论文使用
SupserGLUE
的WNLI
来替代NLI
。single-task
在dev
上,RoBERTa
在所有 9 个任务都取得了SOA
。
SQuAD
微调结果:BERT
和XLNet
都使用额外的高质量标记数据来扩充训练集,而RoBERTa
仅使用指定的标记数据。结果如下图所示,其中 † 表示依赖于额外的标记数据。
Race
微调结果: