深入浅出讲解BERT算法

1.预训练模型简介

在之前的文章中,我们介绍了非常有名的BiLSTM-CRF算法,其算法性能和精确度是鹤立鸡群,下面我们介绍Google推出的“王炸级”预训练模型Bert算法,其在NLP任务中刷新了多项记录,并取得state of the art的成绩。

Bert(Bidirectional Encoder Representations from Transformers)算法,顾名思义,是基于Transformer算法的双向编码表征算法,Transformer算法基于多头注意力(Multi-Head attention)机制,而Bert又堆叠了多个Transfromer模型,并通过调节所有层中的双向Transformer来预先训练双向深度表示,而且预训练的Bert模型可以通过一个额外的输出层来进行微调,适用性更广,并且不需要做更多重复性的模型训练工作。

目前,预训练的语言模型主要有两种方式,第一种是基于特征的语言模型,比如ELMo模型,另一种是基于fine-tuning的语言模型,如OpenAI GPT模型,而Bert模型对这两种类型取长补短,在各种语言任务中取得优异的表现,下图是Bert算法与OpenAI GPT以及ELMo的结构对比图。

Model

获取长距离语义信息程度

能否左右上下文语义

是否可以并行

Word2Vec

1

单向LSTM

2

不能

不能

ELMo

2

不能

GPT

3

不能

BERT

3

 

相对于ELMo和OpenAI GPT模型,Bert算法不仅在模型结构上更优,而且,传统的ELMo和GPT模型需要耗费大量的人力来标注预训练的数据,而Bert则采用无监督学习的方式,不需要人工标注,低成本地训练语料模型,只需要微调就能适应多种任务场景,无需从头训练语言模型。

2.Bert模型简介

模型基本步骤如下:

(1)使用Masked LM方式将语料中的某一部分的词语掩盖住,模型通过上下文预测被掩盖的词语,从而训练出初步的模型。

(2)在语料中选出连续的上下文语句,并使用Transformer模块识别语句的连续性。

(3)通过(1)和(2)实现通过上下文进行双向预测的预训练语言表征模型。

(4)然后通过少量经过标记的数据以监督学习的方式对模型进行fine-tuning。

Bert有两个模型,一个是1.1亿参数的base模型,另一个是3.4亿参数的large模型。

Bert算法的论文:https://arxiv.org/abs/1810.04805

Bert算法的开源代码:https://github.com/google-research/bert

3.Bert算法的输入表征

Bert的输入表示由三部分的Embedding组成,如下图所示,其中Token Embeddings表示的是词向量模型(用于分类任务),Segment Embeddings用于区分句子的类型(用于语句分类),Position Embeddings是位置信息,通过模型学习得到。

4.Bert算法的预训练过程

Bert算法使用两种新的无监督方式进行预训练,分别是Masked LM和Next Sentence Prediction。

(1)MLM

MLM(Masked Language Model)通过随机掩盖句子中的部分词语,然后使用上下文对掩盖的词语进行预测。这个方式融合了双向的文本信息,因而可以预训练深度双向的Transformer模型。

(2)NSP

NSP(Next Sentence Prediction)可以通过预测上下句的连贯性来判断上下句的关系。其中一部分数据是上下文连续的句子,另一部分数据是上下文不连续的句子,对于很多NLP任务如QA都需要这样的理解。