精华:每个词最终的目标向量,充分得编码了该词前面的部分和该词后面的部分(充分利用了双向的上下文信息);
牛在哪里:双向深度编码很有用;预训练做得好,省去了复杂的Task定制;在11个NLP任务上胜出;
一个句子来了,每个单词有3个embedding相加,输入到Transformer里,每个词得到一个目标向量;
预训练是同时训练以下2方面:
1. Masked word:把句子的一小部分词盖住,用被盖住词的目标向量来预测该词(最后过softmax层,多分类任务,交叉熵损失函数);80%MASK,10%随机词,10%原词;(encoding时把这些MASK也给encoding进去了,而fine-tune阶段是没有MASK的,为了尽可能的把模型调教的忽略这些标记的影响,要让编码器知道哪些是噪声)
2. 学习Sentence-Pair的关系:句子级Negative Sampling(给定句子A,它在原文中的下一句B做正例,随机采样一个句子C做负例,则正例<A,B>, 负例<A,C>),转成2分类任务,在句子开头加个<CLS>标志,这个标志的目标向量就是句子的目标向量(因为Transformer对词距离不care,所以<CLS>放最前面即可);跟以往方法2个句子自己编码自己的不同,BERT是把2个句子一起编码的,即你中有我我中有你
3个embedding: word-embedding + segment-embedding(属于前句子or后句子) + 位置embedding(50个位置就有50个embedding)
输入层的word-embedding可以视为词的特征,输出层的embedding可以视为包含了上下文信息的词的特征;
有点儿像迁移学习,先在大数据集上训练一个任务,然后把最后一两层改改放到另一个类似任务上;
Word-embedding使用WordPiece, 合并频繁项来得到最频繁出现的词根,从而减少词表大小,对未登录词也有一定的组合作用;
预训练完成后,接到具体Task上时,之前的网络全盘拿过来,后面加上一两层Task-specific层,然后一起训练;
预训练耗时几天,则Task Fine-tune只耗时几小时;
在小数据量的数据集上,也发现模型参数越多越能提高效果!
feature-based: Task训练阶段,把句子输入到BERT网络里,把词得到的不同层向量们加权加和起来,放到Task相关模型里去做;(应该不是每个词用固定的向量,还是跟句子有关);实验证明,最后4层contatenate起来的性能最好,带上前面的层反而变差;
pre-training based: 就是BERT,把预训练的模型整个搬到Task相关任务中,最后加个一两层;
Task们:
GLUE Benchmark: (把<CLS>最顶向量*W,过softmax即可(回归任务不确定是不是))
1. 二分类,判断两个句子是意思相近, 矛盾, 还是无关的;
2. 二分类,判断两个问句是否语义等价;
3. 二分类,判断<问题,段落>pair的"段落"是否包含"问题"的答案;
4. 二分类,判断句子的正负情感(从电影评论中抽出的句子们)
5. 二分类,判断句子的语法是否正确;
6. 回归,预测2个句子的语义相似度分数(label是1~5)
7. 二分类,判断2个句子是否语义等价;
8. 二分类,同1;
SQuAD v1.1: 找Span的Start的和End: (Fine-tune阶段,多出2个向量S和E,每个词顶层向量分别和S点乘得到一个数,这N个数过softmax得到N个概率(各个词是目标句子起始位置的概率);和E点乘并过softmax同理得到N个概率(各个词是目标句子终止位置的概率),使得两个概率之乘积最大的那对就是结果)
Wikipedia上找的<问句,段落>,要判断具体答案在段落的哪个位置;
SQuAD v2.0: (把不包含答案的情况的B和E都放在<CLS>上;预测的时候有个阈值,正常答案和空答案只差大于这个阈值,则取正常答案;阈值是在验证集上试出来的)
有些段落里不包含答案,要能预测出"包含 or 不包含"答案,如果包含要预测出答案的位置;
SWAG: (4个句子选项做4个B,把4个<A,B>依次训练,<CLS>输出点乘一个向量得到分数)
一个句子A后面有4个句子选项,判断哪个选项跟在A后面最合理;
细节:
用的GELU激活函数:输出=x*权值;GELU的权值取决于当前的输入input有多大的概率p大于其余的inputs(概率p=乘以1的概率;1-概率p=乘以0的概率);相当于结合了ReLU和dropout和zoneout.
fine-tune阶段,前面的模型参数是不用变的,变的只有batch-size, learning-rate, epochs;
[MASK]进行80%10%10%的目的,是为了应对: 预训练中有MASK,fine-tune中没有MASK.
GPT和BERT最大的区别:GPT用的单向语言模型,Bert用的双向语言模型做预训练