BERT

介绍BERT相关知识

BERT是双向的Transformer中的Encoder,其设计可以让其通用与许多NLP任务

1.Embedding

img

Token Embeddings是词向量,第一个单词是CLS标志,可以用于之后的分类任务

Segment Embeddings用来区别两种句子,因为预训练不光做LM还要做以两个句子为输入的分类任务

Position Embeddings和Transformer中的不一样,不是三角函数,而是学习出来的

image-20210112100222553

2.pre-training

在Pre-training中有两个任务

2.1 Task #1 Masked LM

在 BERT 中,Masked LM构建了语言模型,随机遮盖或替换一句话里面的任意字或词,然后让模型通过上下文预测那一个被遮盖或替换的部分,之后做 Loss 的时候也只计算被遮盖部分的 Loss,这其实是一个很容易理解的任务,实际操作如下:

  1. 随机把一句话中 15% 的 token(字或词)替换成以下内容:
    1. 这些 token 有 80% 的几率被替换成 [MASK],例如 my dog is hairy→my dog is [MASK]
    2. 有 10% 的几率被替换成任意一个其它的 token,例如 my dog is hairy→my dog is apple
    3. 有 10% 的几率原封不动,例如 my dog is hairy→my dog is hairy
  2. 之后让模型预测和还原被遮盖掉或替换掉的部分,计算损失的时候,只计算在第 1 步里被随机遮盖或替换的部分,其余部分不做损失,其余部分无论输出什么东西,都无所谓

这样做的好处是,BERT 并不知道 [MASK] 替换的是哪一个词,而且任何一个词都有可能是被替换掉的,比如它看到的 apple 可能是被替换的词。这样强迫模型在编码当前时刻词的时候不能太依赖当前的词,而要考虑它的上下文,甚至根据上下文进行 "纠错"。比如上面的例子中,模型在编码 apple 时,根据上下文 my dog is,应该把 apple 编码成 hairy 的语义而不是 apple 的语义

2.2 Task #2 Next Sentence Prediction (NSP)

首先拿到属于上下文的一对句子,也就是两个句子,之后在这两个句子中加一些特殊的 token:[CLS]上一句话[SEP]下一句话[SEP]。也就是在句子开头加一个 [CLS],在两句话之间和句末加 [SEP]

3.fine-tuning

在该阶段BERT对于不同任务所采用的输出不相同

img

具体来说分为4类

3.1 classification

img

如果现在的任务是 classification,首先在输入句子的开头加一个代表分类的符号 [CLS],然后将该位置的 output,丢给 Linear Classifier,让其 predict 一个 class 即可。整个过程中 Linear Classifier 的参数是需要从头开始学习的,而 BERT 中的参数微调就可以了

3.2 Slot Filling

img

如果现在的任务是 Slot Filling,将句子中各个字对应位置的 output 分别送入不同的 Linear,预测出该字的标签。其实这本质上还是个分类问题,只不过是对每个字都要预测一个类别

3.3 NLI

img

如果现在的任务是 NLI,即给定一个前提,然后给出一个假设,模型要判断出这个假设是 正确、错误还是不知道

这本质上是一个三分类的问题,和 classification 差不多,对 [CLS] 的 output 进行预测即可

3.4 QA

img

首先将问题和文章通过 [SEP] 分隔,送入 BERT 之后,得到上图中黄色的输出。此时我们还要训练两个 vector,即上图中橙色和黄色的向量。首先将橙色和所有的黄色向量进行 dot product,然后通过 softmax,看哪一个输出的值最大,例如上图中 d2 对应的输出概率最大,那我们就认为 s=2

参考以下文章

BERT详解