BERT
介绍BERT相关知识
BERT是双向的Transformer中的Encoder,其设计可以让其通用与许多NLP任务
1.Embedding

Token Embeddings是词向量,第一个单词是CLS标志,可以用于之后的分类任务
Segment Embeddings用来区别两种句子,因为预训练不光做LM还要做以两个句子为输入的分类任务
Position Embeddings和Transformer中的不一样,不是三角函数,而是学习出来的
2.pre-training
在Pre-training中有两个任务
2.1 Task #1 Masked LM
在 BERT 中,Masked LM构建了语言模型,随机遮盖或替换一句话里面的任意字或词,然后让模型通过上下文预测那一个被遮盖或替换的部分,之后做 Loss 的时候也只计算被遮盖部分的 Loss,这其实是一个很容易理解的任务,实际操作如下:
- 随机把一句话中 15% 的 token(字或词)替换成以下内容:
- 这些 token 有 80% 的几率被替换成 [MASK],例如 my dog is hairy→my dog is [MASK]
- 有 10% 的几率被替换成任意一个其它的 token,例如 my dog is hairy→my dog is apple
- 有 10% 的几率原封不动,例如 my dog is hairy→my dog is hairy
- 之后让模型预测和还原被遮盖掉或替换掉的部分,计算损失的时候,只计算在第 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对于不同任务所采用的输出不相同

具体来说分为4类
3.1 classification
如果现在的任务是 classification,首先在输入句子的开头加一个代表分类的符号 [CLS],然后将该位置的 output,丢给 Linear Classifier,让其 predict 一个 class 即可。整个过程中 Linear Classifier 的参数是需要从头开始学习的,而 BERT 中的参数微调就可以了
3.2 Slot Filling
如果现在的任务是 Slot Filling,将句子中各个字对应位置的 output 分别送入不同的 Linear,预测出该字的标签。其实这本质上还是个分类问题,只不过是对每个字都要预测一个类别
3.3 NLI
如果现在的任务是 NLI,即给定一个前提,然后给出一个假设,模型要判断出这个假设是 正确、错误还是不知道
这本质上是一个三分类的问题,和 classification 差不多,对 [CLS] 的 output 进行预测即可
3.4 QA
首先将问题和文章通过 [SEP] 分隔,送入 BERT 之后,得到上图中黄色的输出。此时我们还要训练两个 vector,即上图中橙色和黄色的向量。首先将橙色和所有的黄色向量进行 dot product,然后通过 softmax,看哪一个输出的值最大,例如上图中 d2 对应的输出概率最大,那我们就认为 s=2
参考以下文章