BERT
相信热爱NLP的朋友都对BERT十分熟悉,google提出的这个模型在NLP的多项任务中都取得了惊人的成绩,是目前NLP领域最厉害的武器之一。本文会以原论文为基础来详细解读一下BERT的来龙去脉。
在此声明一下,我并不会完全按照原论文的顺序进行解读,而是根据自己的理解来重点介绍我认为核心或者比较重要的部分。OK,我们开始。
首先我们先来看一下论文的abstract部分的关于BERT的介绍。
这句高亮语句其实已经对BERT做出了非常准确的说明。首先,BERT是一个已经经过预训练的模型,同时BERT预训练使用的就是无标签的文本数据集合,还有就是BERT相较于其他的语言模型,每一层都充分地利用整个文本信息,既包括当前位置token的左边也包括右边,也就是实现双向信息利用。OK,接下来我来为大家做具体说明。
Model Architecture
关于BERT的模型架构,其实简单来说就是Transformer的encoder部分的多重堆叠。如果大家对Transformer的架构还不理解的话,可以阅读一下我之前的一篇文章----Transformer详解:基于self-attention的大杀器 或者也可以阅读Google2017年的介绍Transformer的原paper:Attention is all you need.
那么在本文中,作者使用的是12个Transformer block的堆叠,关于embedding的维度,作者选择的768,对于self-attention 的num_head,作者选取的参数是12.原文如下
然后我们把BERT和其他两个相关的模型OpenAI GPT 和 ELMo做一个简单的比较,如果大家对这两个模型的细节感兴趣,可以去阅读一下相关的paper,这里不会过多展开。先看一下在原论文附录中的这张图。
正如图中所示,BERT的每一层的transformer都是充分接收双向的信息,而对于GPT而言,它实现的是一个单向(left-to-right)的transformer。而对于ELMo,对于每个位置的token的输出,EMLo利用两个方向的LSTM的模型的输出的concate最终输出,确实这样的做法某种程度上也可以说完整利用了整个text的信息,但是毕竟这两个任务是独立的,相较于BERT的做法,这种concate的方法在语义的特征输出上只能算是次优的。
Model Input/Output Represent