听课(李宏毅老师的)笔记,方便梳理框架,以作复习之用。本节课主要以Bert和GPT为例,讲授了self-supervised learning for NLP相关内容。
Bert简介
名字由来
参数大小
340 Million=340×10^6^=3.4×10^8^ 个参数
比Bert更大的模型
各大模型的参数量统计对比图
Self-Supervised Learning
supervised learing 和 self-supervised learning的对比
Bert主要学习的内容
填空题:盖住文字,让bert补字
预测两个句子是否应该接在一起
Masking Input
输入一个向量,输出同等长度的向量。语音和图形也可以,但是最早是用于文字,所以用文字做例子。
token的单元是自己决定的,中文里是一个字是一个token。
有两种方法来实现盖住一部分文字:
- 用一个特殊的token,这个token在中文字典里从未出现过,表示盖住
- 随便换成另外一个字
bert的训练实际上是分类问题,目标是让遮起来的字要被正确地分类为"湾"这个类别。
Next Sentence Prediction
next sentence prediction: CLS输入Bert后再进入Linear后输出yes/no,表示两个句子是否应该接在一起。但是后来的研究表明next sentence prediction对于bert后面要做的事情没有特别的帮助,可能是因为分辨两个句子能否被接在一起这个任务太简单了。比如在文章中重新选一句接在sentence1后面,两句相似度不高,bert很容易判断出来不该接在一起,这对于bert来说没有学到太多东西。
SOP: 判断两个句子谁在前谁在后
但是只会做填空题的bert却可以用来做各种下游任务。
GLUE
任务集:9个任务
- CoLA (The Corpus of Linguistic Acceptability): 判断句子的语法是否合乎规范。
- SST-2 (Stanford Sentiment Treebank): 进行句子级的情感分类,任务是将句子分为正面或负面情感。
- MRPC (Microsoft Research Paraphrase Corpus): 句子对的分类任务,判断两个句子是否语义相似(同义句)。
- QQP (Quora Question Pairs): 判断两个问题是否为同义问题,类似于MRPC任务,但规模更大。
- STS-B(Semantic Textual Similarity Benchmark): 对两个句子的语义相似度进行评分,分数范围是0到5。
- MNLI (Multi-Genre Natural Language Inference):句子推理任务,判断前提句子和假设句子之间的关系,是否是蕴涵、矛盾或无关。
- QNLI (Question Natural Language Inference): 基于问答推理,判断一个句子是否正确回答了某个问题。
- RTE (Recognizing Textual Entailment): 判断前提和假设句子是否具有蕴涵关系。
- WNLI (Winograd NLI): 测试句子中指代消解问题,判断两个句子中指代是否正确。
微调bert成9个新的模型,在这9个任务上进行评价
图中黑线为人类在GLUE上的分数,虚线为各模型在GLUE上的分数
Bert的应用场景
case 1:分类问题
比如sentiment analysis
要解决这样的问题,需要在句子的最前面加入CLS token, 加入后输入到Bert里,输出句子对应的向量,但是只取CLS对应的那一个向量,再输入到Linear层,得出class。
在这个过程中,需要下游任务的标注资料(之前pretrained的时候没用标注的资料,但是这里用了少量的标注资料,所以整个pre-train+fine-tune过程是semi-supervised )。经过pretraing,只会填空题的Bert并没有凭空产生词性标注的能力,所以需要提供大量标注好正负情感的语句给Bert进行下游任务的训练。
在训练时,linear和Bert作为一个整体的模型进行学习,需要进行gradient decent。
但是在训练的过程中, linear的参数是随机初始化的,而bert的参数是之前pretrained后的参数。因为这样比随机初始化的参数效果好。
继承pre-train的bert参数和随机初始化bert参数对比
case 2:标注问题
比如词性标注问题
输入一个句子,句子里的每个token有一个对应的向量,这些向量经过linear层,得到一个分类。
其余就跟case1一样了,bert的参数是从pretrain阶段得到的,linear的参数随机初始化,下游任务的训练需要标注的资料。
case 3:自然语言推理
比如立场分析,输入文章和在这篇文章下的评论,输出评论的立场和文章是否相同
input:前提+假设
output:两个句子之间的关系
具体实现如下图,以CLS为开头,SEP为分割,输入两个句子,输出同等长度的向量,CLS对应的向量经过Linear层后得到最终输出Class。
在训练过程中,Linear和Bert的参数初始化同前两个case。
case 4:问答系统
比如答案出现在文章中的问答系统。
input:文章和问题
output:两个正整数s,e
从文章中的第s个字到第e个字,就是正确答案。
训练阶段,Bert的参数同case1,2,3,由预训练阶段得到。只需要随机初始化两个向量,如下图中的橙色和蓝色两个向量。这两个向量的维度和bert输出的向量维度一样。
将橙色的向量与文章的向量进行inner product,再经过softmax得到分数(这个阶段类似于attention)。分数最高的那一个向量的index记为s。再将蓝色的向量与文章的向量进行inner product,再经过softmax得到分数,分数最高的那一个向量的index记为e。
Training Bert is Challenging
训练数据有3B数据,即便是最简单的模型,TPU也跑了8天。
Pre-training a Seq2seq Model
bert只pre train了encoder,如果想要训练decoder怎么办呢?
想要pretrain decoder,也可以用预训练bert的方法。
比如只mask掉一个字,或者删除一个字,重排,旋转,删掉一部分再掩盖一部分。
在BART这篇论文里,这些方法都用上了,结论是都用上的话结果会比较好。
C4数据集大小为7T
Why Does Bert Work?
根据上下文,一个字的embedding会不一样。
比如吃苹果的果和苹果电脑的果的embedding就不一样。
计算不同语境下的果字的embedding的cosine similarity
越黄表示越相似,对角线为黄色表示自己与自己是最像的,左上角和右下角的两个偏绿色的区域表示比较相近。
了解一个词汇要知道它的上下文。bert通过了解一个词汇的语义进行工作。
但是bert真的学习到了语义吗?李老师提出一个DNA序列的例子。DNA是由四种我不记得这个专业术语叫啥了,反正就是四种什么什么酸,分别是ATCG编码而成,EI IE N是什么也不用管,就是一种分类。
建立一个ATCG与英文单词的对应表,这个对应表可以随便赋值。然后将这些序列对应的英文输入Bert进行训练。训练数据是标注好类别的DNA序列,Bert的参数由在英文资料上预训练得到的参数初始化。
结果即便我们输入这样乱七八糟的句子,居然分类的正确率还可以。bert可能本身初始化的参数就比较好,不见得与语义相关。
Multi-lingual Bert
Zero-shot Reading Comprehension
英文资料集:SQuAD
中文资料集:DRCDs
Bert在104种语言资料集上训练填空问题,在英文问答资料集上进行fine-tune,训练做问答任务。但是在测试阶段,用中文去问问题,Bert还是能回答上来。
在embedding中,表示同一意思的英文和中文的词的位置相近。
MRR是用于衡量各语言在embeding中对齐的程度。MRR越高,对齐程度越好。
Google 的multi-bert 的MRR非常高,李老师的multi-bert效果却怎么也达不到那么好的效果。于是他们选择增大数据集到1000k sentences。
在训两天之后loss都没有下降,到第三天时loss就降下去了。所以很多问题要在足够资料的情况下才能被观察到。
英文和中文的embedding肯定是不一样的。因为在训练的时候,分别用英文和中文的训练资料集让bert做填空题。如果embedding是一样的,那bert填空的时候就可能填另一种语言。但是bert知道用与训练集一样的语言进行填空,说明bert知道语言的信息。
如果计算中文和英文的平均embedding然后相减,就是两者之间的距离。如果将英文输入进multi-bert之后得到的embedding加上这个距离,对于multi-bert来说,这就是中文了,再让bert做中文的填空,bert就能做了。
输入英文,变成embedding,再加上蓝色的向量,就变成中文,再做填空题,把embedding变回句子之后就是下面的倒数三行的结果。
GPT简介
GPT和BERT的区别就在于,BERT是做填空题,而GPT是预测下一个token。GPT类似于transform里的decoder。而且预测下一个token只看已经输入的token,这一点很像decoder中的masked attention。
GPT为独角兽是因为让GPT生成了一则以独角兽为主要内容的新闻。
GPT太大,微调很困难。GPT的应用类似于人的思考方式。比如托福的听力测试,先给一个例子,和相应的答案,让ChatGPT学习之后再去做其他类似的题目。
在chatgpt中的few-shot learning,是没有gradient decent的
GPT在42个任务上的正确率不高。
在self-supervised learning这一领域,课上只讲了一小部分,除了文本的形式,还有语音和计算机视觉。课上只讲了关于NLP的预测。
Image
SimCLR
BYOL
李老师说不知道为什么会work,还出现了sota,感觉有巨大瑕疵,没细讲,跳过了。
Speech
训练语音版的bert。语音也可以做填空题,将部分语音盖起来让bert猜。也可以做语音版的ChatGPT,输入一段语音让语音版的ChatGPT预测下一段是什么。
Speech GLUE
到目前为止,还没有像GLUE一样的数据集。
李老师联合其他团队做了一个数据集叫SPUERB,包含十个评估任务。识别说话的内容,说话者,说话的情绪等。
self-supervised learning的技术不是只能用在NLP领域,也可以用在图像,语音等领域。
Q&A
BERT输入的长度是否有限制?
有的。毕竟self-attention的计算过程中产生的矩阵非常大。
填空题和文章问答有什么关系?