Auto-Regressive & Auto-Encoding
在介绍当下最火热的BERT模型之前,我们先来看两个概念,Auto-Regressive和Auto-Encoding。
Auto-Regressive
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
最原始的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
BERT的全称是Bidirectional Encoder Representation from Transformer,由此可见,BERT模型的主要部分是Transformer中的Encoder。
BERT是一个预训练模型,对于一个预训练模型,要考虑的问题通常有两个:
- model structure,即模型结构
- pre-train task,即用什么任务来做预训练
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的核心,BERT之所以取得了巨大的成功,源于其设计的预训练任务和在预训练中使用了大量的文本。接下来我们分别介绍。
Mask Language Model(MLM)
MLM任务是BERT的核心,它的intuition其实就来自于我们高中英语非常常见的一种题型:完形填空。在模型中,作者将输入的文本进行MASK填充,具体细节如下:
- 在句子开头加入[CLS]token,两个句子之间加入[SEP]token
- 随机选择输入中 15 % 15\% 15%的token进行[MASK]填充
- 在这 15 % 15\% 15%选中的部分中, 80 % 80\% 80%是真的填充为[MASK], 10 % 10\% 10%被填充任意随机的token,剩下 10 % 10\% 10%保持不变。
- 最后我们以训练好的[CLS]token的embedding作为当前文本的特征向量
Next Sentence Prediction(NSP)
MLM任务是在token级别进行学习,而NSP任务就是学习句子之间的特征。首先,我们来看一下BERT输入的构成
我们可以看到,除了Transformer中原有的Token Embedding和Position Embedding之外,BERT中增加了一个Segment Embedding。 Segment Embedding是用来区分每个token属于A句子还是B句子,而NSP的任务就是预测同时输入的A句和B句是不是上下句的关系,最后仍然使用[CLS]token映射到二维进行标签分类。
BERT的Fine-tune
BERT模型能做的下游任务很多,但是不包括文本生成任务。因为文本生成的时候模型是不能看到当前位置以及之后的信息的,而BERT只使用了Encoder部分,做的是Self-Attention,因此不适于用来做文本生成任务。
BERT进行Fine-tuning后可以完成的downstream tasks有:
- Sentence Pair Classification:这个很好理解,因为BERT本身就是同时训练两个句子,因此对于pair分类任务肯定能够完成
- Single Sentence Classification:就是文本分类,由于文本分类我们只会输入一个句子,因此这里的Segment Embedding只有一种
- Question Answering:这里的问答任务特指Stanford的问答数据集SQuAD v1.1,这个任务是一个问题对应一篇短文,而这个问题的答案就在文章当中。对于这个任务,BERT要做的只是多训练两个权重。首先,输入还是不变,同时输入Question和Paragraph。然后,我们定位问题答案的方式是判断答案[START]和[END]的位置,也就是找到答案区间。因此,我们给Paragraph中每个训练好的embedding一个[START]权重,一个[END]权重,其实就是训练两个全连接层,然后经过softmax得到概率,选择概率最大的作为[START]和[END]。
- Single Sentence Tagging:比如NER、POS-Tagging任务等,这个任务也比较好实现。
BERT模型的变体
- AlBERT:主要是进行参数量的缩减,作者注意到参数量主要集中在Embedding层中 ∣ V ∣ ∗ ∣ H ∣ |V|*|H| ∣V∣∗∣H∣的部分,因为 ∣ V ∣ |V| ∣V∣是非常大的,因此提出使用矩阵分解将 ∣ V ∣ ∗ ∣ H ∣ |V|*|H| ∣V∣∗∣H∣的矩阵分解为 ∣ V ∣ ∗ ∣ E ∣ + ∣ E ∣ ∗ ∣ H ∣ |V|*|E|+|E|*|H| ∣V∣∗∣E∣+∣E∣∗∣H∣的两个矩阵,而 E < < H E<<H E<<H,这样就大大减少了参数量并且模型的表现下降很小。
- RoBERTa:依然是进行了一些优化,然后提出了NSP任务没啥卵用。
- KBERT
- KGBERT
- FINBERT
- SpanBERT
这些我们在这里不详述,感兴趣可再去详细了解。