自学参考:
BERT: Pre-training of Deep Bidirectional Transformers for
Language Understanding
BERT 论文逐段精读
视频课
课件+资料
笔记
一、概述
自监督学习模型与芝麻街~
-
参数量
- ELMO:94M
- BERT:340M
- GPT-2:1542M
- Megatron:8B
- T5:11B
- Turing NLG:17B
- GPT-3:175B
- Switch Transformer:1.6T
-
“自监督学习”数据本身没有标签,所以属于无监督学习;但是训练过程中实际上“有标签”,标签是“自己生成的”。
想办法把训练数据分为“两部分”,一部分作为作为“输入数据、另一部分作为“标注”。
二、BERT
BERT是一个transformer的Encoder,BERT可以输入一行向量,然后输出另一行向量,输出的长度与输入的长度相同。
作为transformer,理论上BERT的输入长度没有限制。但是为了避免过大的计算代价,在实践中并不能输入太长的序列。
事实上,在训练中,会将文章截成片段输入BERT进行训练,而不是使用整篇文章,避免距离过长的问题。
BERT一般用于自然语言处理,一般来说,它的输入是一串文本。当然,也可以输入语音、图像等“序列”。
Masking Input
随机盖住一些输入的文字,被mask的部分是随机决定的。
- MASK的方法:
- 第一种方法是,用一个特殊的符号替换句子中的一个词,我们用 "MASK " 标记来表示这个特殊符号,你可以把它看作一个新字,这个字完全是一个新词,它不在你的字典里,这意味着mask了原文。
- 另外一种方法,随机把某一个字换成另一个字。中文的 "湾"字被放在这里,然后你可以选择另一个中文字来替换它,它可以变成 "一 "字,变成 "天 "字,变成 "大 "字,或者变成 "小 "字,我们只是用随机选择的某个字来替换它
两种方法都可以使用,使用哪种方法也是随机决定的。
train
本质上,就是在解决一个分类问题。BERT要做的是预测什么被盖住。
- 向BERT输入一个句子,先随机决定哪一部分的汉字将被mask。
- 输入一个序列,我们把BERT的相应输出看作是另一个序列
- 在输入序列中寻找mask部分的相应输出,将这个向量通过一个Linear transform(矩阵相乘),并做Softmax得到一个分布。
- 用一个one-hot vector来表示MASK的字符,并使输出和one-hot vector之间的交叉熵损失最小。
application
Next Sentence Prediction
不太有用!
从数据库中拿出两个句子,两个句子之间添加一个特殊标记[SEP],在句子的开头添加一个特殊标记[CLS]。这样,BERT就可以知道,这两个句子是不同的句子。
只看CLS的输出,我们将把它乘以一个Linear transform,做一个二分类问题,输出yes/no,预测两句是否前后连续。
ALBERT
Sentence order prediction,SOP(句子顺序预测)
- 挑选的两个句子是相连的。可能有两种可能性供BERT猜测:
- 句子1在句子2后面相连,
- 句子2在句子1后面相连。
Downstream Tasks
-
预训练:产生BERT的过程
-
微调:利用一些特别的信息,使BERT能够完成某种任务
BERT只学习了两个“填空”任务。 -
一个是掩盖一些字符,然后要求它填补缺失的字符。
-
预测两个句子是否有顺序关系。
但是,BERT可以应用在其他任务上,可能与“完形填空”无关甚至完全不同。类似于干细胞的功能,当我们想让BERT学习做某些任务时,只需一些标记信息,就能“激发潜能”
Evaluation
为了测试self-supervised的学习能力,通常会在一个任务集上测试它的准确性,取平均值得到总分
- GLUE(General Language Understanding Evaluation):对BERT的评价任务集
- 性能衡量:人类的准确度是1,如果他们比人类好,这些点的值就会大于1
How to use BERT
Sentiment analysis
给机器一个句子,让它判断这个句子是正面的还是负面的。
-
给它一个句子,把CLS标记放在这个句子的前面,只看CLS的部分。CLS在这里输出一个向量,我们对它进行Linear transform+Softmax,得到类别。
对下游任务,需要标注资料。
在训练的时候,Linear transform和BERT模型都是利用Gradient descent来更新参数的。- Linear transform的参数是随机初始化的
- 而BERT的参数是由学会填空的BERT初始化的。⇒将获得比随机初始化BERT更好的性能。
-
对比预训练与随机初始化
- "fine-tune"是指模型被用于预训练,这是网络的BERT部分。该部分的参数是由学习到的BERT的参数来初始化的,以填补空白。
- scratch表示整个模型,包括BERT和Encoder部分都是随机初始化的。
scratch与用学习填空的BERT初始化的网络相比,损失下降得比较慢,最后,用随机初始化参数的网络的损失高于用学习填空的BERT初始化的参数
-
使用BERT的整个过程是连续应用Pre-Train+Fine-Tune,它可以被视为一种半监督方法(semi-supervised learning)
- 当你进行Self-supervised学习时,你使用了大量的无标记数据⇒unsupervised learning
- Downstream Tasks 需要少量的标记数据。
POS tagging
BERT部分,即网络的Encoder部分,其参数不是随机初始化的。
在预训练过程中,它已经找到了不错的参数。
Natural Language Inference(NLI)
给出前提和假设,机器要做的是判断,是否有可能从前提中推断出假设。
⇒预测“赞成、反对”
你只要给它两个句子,我们在这两个句子之间放一个特殊的标记SEP,并在最开始放CLS标记。最终考察CLS标记对应的输出向量,将其放入Linear transform的输入得到分类。
Extraction-based Question Answering (QA)
输入序列包含一篇文章和一个问题,文章和问题都是一个序列。
对于中文来说,每个d代表一个汉字,每个q代表一个汉字。把d和q放入QA模型中,希望它输出两个正整数s和e。根据这两个正整数,可以直接从文章中截取一段,它就是答案。这个片段就是正确的答案。
对于BERT来说,你必须向它展示一个问题,一篇文章,以及在问题和文章之间的一个特殊标记,然后我们在开头放一个CLS标记。
在这个任务中,你唯一需要随机初始化从头训练两个向量,分别对应与答案的开始与结束,用橙色向量和蓝色向量来表示,这两个向量的长度与BERT的输出相同。
- 首先,计算这个橙色向量和那些与document相对应的输出向量(黄色向量)的内积,计算内积,通过softmax函数,找到数值最大的位置,即为答案的开始位置。
【这个内积和attention很相似,可以把橙色部分看成是query,黄色部分看成是key,这是一个attention,那么我们应该尝试找到分数最大的位置】 - 类似地,利用蓝色向量可以找到答案的结尾位置。
Pre-training a seq2seq model
输入是一串句子,输出也是一串句子,中间用cross attention连接,其中故意在encoder的输入上做一些干扰。
encoder看到的是被破坏的结果,decoder应该输出被破坏前的结果,训练这个模型实际上是预训练一个seq2seq模型
- 破坏方式
- MASS⇒MASK
- BART⇒删除一些词,打乱词的顺序,旋转词的顺序。或者插入一个MASK,再去掉一些词。
- T5(Transfer Text-To-Text Transformer)⇒在C4语料库(Colossal Clean Crawled Corpus)上尝试了各种组合