在介绍当下最火热的BERT模型之前,我们先来看两个概念,Auto-Regressive和Auto-Encoding。
Auto-Regressive如上图所示,其实很像是一个语言模型,遵循的是链式法则,即根据 t t t时刻之前的词预测当前的 x t x_t xt,目标函数为 l o g p ( x ∣ θ ) = l o g ∑ t = 1 T p ( x t ∣ x 1 : t − 1 , θ ) log{p(x|\theta)}=log\sum_{t=1}^T{p(x_t|x_{1:{t-1}},\theta)} logp(x∣θ)=log∑t=1Tp(xt∣x1:t−1,θ)。其实在Seq2Seq模型中,如果我们不对Decoder部分使用teacher forcing,那它就是一个Auto-Regressive。
Auto-Regressive的优点:是无偏差的,因为它严格遵循链式法则
Auto-Regressive的缺点:是一个单向模型,在预测当前词的时候看不到后面的信息
最原始的Auto-Encoding是将原本的输入 x x x经过一个模型得到一个输出 x ^ \hat{x} x^,然后我们希望 ∑ ∣ ∣ x − x ^ ∣ ∣ 2 \sum||x-\hat{x}||_2 ∑∣∣x−x^∣∣2最小化。而另外一种叫做Denosing的Auto-Encoder,即我们的输入是 x + δ x+\delta x+δ。如上图所示,输入中的[MASK]就是我们的噪声 δ \delta δ,我们希望模型能够还原这些[MASK]。它的目标函数是 l o g p ( x ∣ x 1 : t − 1 , θ ) ≈ ∑ t = 1 T m t p ( x t ∣ x 1 : t − 1 , θ ) log{p(x|x_{1:{t-1}},\theta)}\approx{\sum_{t=1}^T{m_t p(x_t|x_{1:{t-1}},\theta)}} logp(x∣x1:t−1,θ)≈∑t=1Tmtp(xt∣x1:t−1,θ),之所以是约等号,是因为它并不遵循链式法则,是一个双向的模型。
Auto-Encoding的优点:双向模型
Auto-Encoding的缺点:1、有偏差(discrepancy)
2、没有考虑[MASK]词之间的关系,即[MASK]之间是independent的
BERT的全称是Bidirectional Encoder Representation from Transformer,由此可见,BERT模型的主要部分是Transformer中的Encoder。
BERT是一个预训练模型,对于一个预训练模型,要考虑的问题通常有两个:
BERT就是利用了Transformer中的Encoder,模型结构上没有太大创新。
BERT模型有两种,一种叫 B E R T b a s e BERT_{base} BERTbase,另一种叫做 B E R T l a r g e BERT_{large} BERTlarge,这两者只是模型复杂度上的不同。
B E R T b a s e BERT_{base} BERTbase: L a y e r : 12 Layer:12 Layer:12, H i d d e n _ d i m : 768 Hidden\_dim:768 Hidden_dim:768, A t t n _ H e a d : 12 Attn\_Head:12 Attn_Head:12, T o t a l _ P a r a m : 110 M Total\_Param: 110M Total_Param:110M
B E R T l a r g e BERT_{large} BERTlarge: L a y e r : 24 Layer:24 Layer:24, H i d d e n _ d i m : 1024 Hidden\_dim:1024 Hidden_dim:1024, A t t n _ H e a d : 16 Attn\_Head:16 Attn_Head:16, T o t a l _ P a r a m : 340 M Total\_Param: 340M Total_Param:340M
这一部分是BERT的核心,BERT之所以取得了巨大的成功,源于其设计的预训练任务和在预训练中使用了大量的文本。接下来我们分别介绍。
MLM任务是BERT的核心,它的intuition其实就来自于我们高中英语非常常见的一种题型:完形填空。在模型中,作者将输入的文本进行MASK填充,具体细节如下:
MLM任务是在token级别进行学习,而NSP任务就是学习句子之间的特征。首先,我们来看一下BERT输入的构成
我们可以看到,除了Transformer中原有的Token Embedding和Position Embedding之外,BERT中增加了一个Segment Embedding。 Segment Embedding是用来区分每个token属于A句子还是B句子,而NSP的任务就是预测同时输入的A句和B句是不是上下句的关系,最后仍然使用[CLS]token映射到二维进行标签分类。
BERT模型能做的下游任务很多,但是不包括文本生成任务。因为文本生成的时候模型是不能看到当前位置以及之后的信息的,而BERT只使用了Encoder部分,做的是Self-Attention,因此不适于用来做文本生成任务。
BERT进行Fine-tuning后可以完成的downstream tasks有:
这些我们在这里不详述,感兴趣可再去详细了解。