BERT是一种预训练语言表示的方法,这意味着我们在大型文本语料库(例如Wikipedia)上训练通用的“语言理解”模型,然后将该模型用于我们关心的下游NLP任务(例如问题 回答)。 BERT优于以前的方法,因为它是第一个用于预训练NLP的无监督,深度双向系统。
无监督意味着BERT仅使用纯文本语料库进行训练,这很重要,因为在网络上可以公开提供多种语言的大量纯文本数据。
预训练的表示也可以是无上下文或上下文的,并且上下文表示可以进一步是单向或双向的。 诸如word2vec或GloVe之类的上下文无关模型会为词汇表中的每个单词生成单个“单词嵌入”表示,因此bank
在bank deposit
和 river bank
的表示将相同。 上下文模型会根据句子中的其他单词生成每个单词的表示形式。
BERT建立在近期训练上下文相关表示的工作之上——包括半监督序列学习,生成式预训练,ELMo和ULMFit,但至关重要的是,这些模型都是单向或浅双向的。 这意味着每个单词仅使用其左侧(或右侧)的单词进行上下文化。
例如,在句子I made a bank deposit
中,bank
的单向表示仅基于I made a
而不是deposit
。 某些先前的工作确实结合了来自单独的左上下文模型和右上下文模型的表示,但是仅以“浅”方式进行。 BERT代表“bank”,同时使用其左右上下文——I made a ... deposit
,这从深度神经网络的最底部开始,因此它是双向的。
BERT为此使用一种简单的方法:我们屏蔽掉输入中15%的单词,通过深度双向Transformer编码器运行整个序列,然后仅预测被屏蔽的单词。 例如:
Input: the man went to the [MASK1] . he bought a [MASK2] of milk.
Labels: [MASK1] = store; [MASK2] = gallon
为了学习句子之间的关系,我们还训练了一个可以从任何单词语料库生成的简单任务:给定两个句子 A
和 B
,那么实际 B
之后的下一个句子是 A
,还是来自语料库的随机句子?
Sentence A: the man went to the store .
Sentence B: he bought a gallon of milk .
Label: IsNextSentence
Sentence A: the man went to the store .
Sentence B: penguins are flightless .
Label: NotNextSentence
然后,我们在一个大型语料库(Wikipedia + BookCorpus)上训练了一个大型模型(12层至24层Transformer)很长时间(每次更新1M),这就是BERT。
使用BERT有两个阶段:预训练和微调。
预训练相当贵(在4至16个Cloud TPU持续4天),但是每种语言都是一次性的程序(当前模型仅支持英语,但是不久将发布多语言模型)。
微调是便宜的。 从完全相同的预训练模型开始,论文中的所有结果最多可以在单个Cloud TPU上复制1个小时,或者在GPU上复制几个小时。 例如,可以在单个Cloud TPU上在大约30分钟内对SQuAD进行培训,以达到91.0%的Dev F1得分,这是单个系统的最新技术水平。
BERT的另一个重要方面是,它可以很容易地适应许多类型的NLP任务。
参考https://github.com/xuanzebi/BERT-CH-NER/tree/master/bert-master