- 本文收录于《深入浅出讲解自然语言处理》专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅!
- 个人主页:有梦想的程序星空
- 个人介绍:小编是人工智能领域硕士,全栈工程师,深耕Flask后端开发、数据挖掘、NLP、Android开发、自动化等领域,有较丰富的软件系统、人工智能算法服务的研究和开发经验。
- 如果文章对你有帮助,欢迎
关注
、点赞
、收藏
、订阅。
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模型对这两种类型取长补短,在各种语言任务中取得优异的表现。
图1 Bert算法与OpenAI GPT以及ELMo的结构对比图
Model | 获取长距离语义信息程度 | 能否左右上下文语义 | 是否可以并行 |
Word2Vec | 1 | 能 | 能 |
单向LSTM | 2 | 不能 | 不能 |
ELMo | 2 | 能 | 不能 |
GPT | 3 | 不能 | 能 |
BERT | 3 | 能 | 能 |
图2 Bert算法与其他算法的性能对比
Bert算法的优势:
相对于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。
如下图所示,其中Token Embeddings表示的是词向量模型(用于分类任务),Segment Embeddings用于区分句子的类型(用于语句分类),Position Embeddings是位置信息,通过模型学习得到。
图3 Bert算法输入表征结构图
4.Bert算法的预训练过程
Bert算法使用两种新的无监督方式进行预训练,分别是Masked LM和Next Sentence Prediction。
(1)MLM方式
MLM(Masked Language Model)通过随机掩盖句子中的部分词语,然后使用上下文对掩盖的词语进行预测。这个方式融合了双向的文本信息,因而可以预训练深度双向的Transformer模型。
(2)NSP方式
NSP(Next Sentence Prediction)可以通过预测上下句的连贯性来判断上下句的关系。其中一部分数据是上下文连续的句子,另一部分数据是上下文不连续的句子,对于很多NLP任务如QA都需要这样的理解。