BERT模型
BERT(Bidirectional Encoder Representation from Transformers),即双向Transformer的Encoder,是2018年10月由Google AI研究院提出的一种预训练模型。
模型结构
BERT模型的结构如下图:
一、BERT原理
1. 预训练与微调
1.预训练(pre-training):先对大量语料进行无监督学习
2.微调(Fine-tuning):再对少量标注语料进行监督学习,提升模型针对特定任务的表现能力。
复制代码
除此之外,预训练模型还有Open AI的GPT、AI2的 ELMo等。
大家都知道机器学习的关键在数据,自然语言处理的一个优势在于可以找到大量的语料,比如维基百科、各类书籍、各类网站等,通过对这些语料进行无监督学习就能让机器对判断文本的情感、上下文关系等有一个很好的效果。预训练是第三方机构(比如Google)用自己的服务器完成的,然后将训练好的模型公布出来。
但对个人或者小机构来讲,是很难实现的,需要在人才和硬件上有很大的投入,所以预训练大大降低了NLP的门槛。另外,我们需要按照训练好的模型的要求对输入数据进行预处理即可(后边会讲)。模型有人帮我们训练好了,我们只需要微调就可以了。
2.如何预训练
预训练需要同时进行两个任务,Masked LM和 NSP。
2.1 Masked LM(Masked Language Model)
重点在Masked(“遮挡”),即随机遮挡住语料中的一些字符,然后训练模型预测被遮挡的字符,其实就是完形填空,实现过程还是分为两步。
(1)从每个句子中随机选出15%的词,比如第 i 个词被选到,计为 word_i;
(2)对选中的第 i 个词做如下三件事情:
* 80%的概率将 word_i 替换成[MASK];
* 10%的概率将 word_i 随机替换成任何词;
* 10%的概率对 word_i 不做替换;
复制代码
(3)对 “Masked” 后的语料进行训练,交叉熵作为损失函数。以 比特币跌破50000万,未来何去何从。
为例:
从上述例子中可以体现出BERT中’B’的含义(Bidirectional,即双向),模型是通过上下文来预测跌破
的,双向指的就是上下文。而单向是说通过前文预测下文。
2.2 NSP(Next Sentence Prediction)
NSP的作用是理解句子之间的关系,判断句子A是否是句子B的下个语句。
(1) 50%的概率B真的是A的下个语句,返回 “IsNext” ;
(2) 50%的概率B为随机选择的语句,返回 “NotNext” 。比如我们有一个包含两句话的段落:
第二种情况明显就是前言不搭后语,返回NotNext。另外,NSP会在每段的开头加上[CLS]字符,用于存储分类有关的信息,在句子之间加上[SEP]字符用来分句。
3. 如何微调
利用预训练后的模型,我们可以对具体任务进行监督学习。[CLS]字符存储了分类信息,可以作为分类层的输入,得到分类结果。接下来再使用带标签的文本(比如金融新闻、微博等)进行训练微调BERT,从而提高针对特定任务的精度。
二、Tensorflow Hub中实现BERT
Tensorflow Hub的存在,使得BERT的实现更加简单,我们只需多做两步:
(1)导入BERT模型(也就是别人预训练好的模型)
(2)导入预处理模型
复制代码