深度学习周报(11.25-12.1)
目录
摘要
Abstract
1 自监督学习(Self-supervised Learning)
2 BERT(Bidirectional Encoder Representation from Transformers)
2.1 Masking Input
2.2 Next Sentence Prediction
2.3 GLUE(General Language Understanding Evaluation)
3 怎么使用BERT
3.1 输入为序列,输出为类别
3.2 输入和输出是长度相同的序列
3.3 输入为两个序列,输出为一个类别
3.4 回答系统(QA)
4 训练BERT
4.1 训练BERT很有挑战性
4.2 预训练一个Seq2seq模型
5 为什么BERT有用
5.1 一词多义
5.2 CBOW(Continuous Bag-of-Words)
6 多语言(Multi-lingual) BERT
6.1 Zero-shot Reading Comprehension
6.2 Cross-lingual Alignment
总结
摘要
本周学习了李宏毅深度学习关于BERT的部分。了解了BERT架构实际上是Transformer中的Encoder,学习了BERT包含的两个预训练任务:掩码输入和下一句预测。然后了解了BERT的应用场景,例如:情感分析、词性标注、自然语言处理和回答系统等。还了解了训练BERT是十分困难的事,但是能够预训练Seq2seq模型,以及BERT的好用之处在于能够进行一词多义。最后认识到了多语言BERT在零样本和跨语言对齐上的优势。
Abstract
This week, I learned about the BERT part of Li Hongyi's deep learning. After understanding that the BERT architecture is actually an Encoder in Transformer, we learned that BERT contains two pre-training tasks: mask input and next sentence prediction. Then, we learned about the application scenarios of BERT, such as sentiment analysis, part-of-speech annotation, natural language processing, and answer systems. I also learned that training BERT is difficult, but being able to pre-train Seq2seq models, and the usefulness of BERT, is the ability to do polysemy. Finally, the advantages of multilingual BERT in terms of zero-shot and cross-language alignment are recognized.
1 自监督学习(Self-supervised Learning)
在监督学习中,输入模型的训练资料是带标签的,将输入模型后得到输出,对比 与标签 来训练模型。
而在自监督学习(也叫无监督学习)中,没有标签,自监督学习的做法是将数据分为两个部分,一部分叫,另一部分叫,然后将 输入模型后得到输出 ,通过对比 和 来训练模型。
2 BERT(Bidirectional Encoder Representation from Transformers)
在上周中,有提到BERT的结构就是Transformer的Encoder。BERT可以输入一行向量,然后输出另一行向量,输出的长度与输入的长度相同。
2.1 Masking Input
BERT一般用于自然语言处理,用于文本场景,所以一般来说,它的输入是一串文本,也是一串数据。当我们真正谈论Self-Attention的时候,我们也说不仅文本是一种序列,而且语音也可以看作是一种序列,甚至图像也可以看作是一堆向量。即BERT不仅用于NLP,或者用于文本,它也可以用于语音和视频。
在训练的时候,BERT的输入会随机掩盖(Mask)一些文字,如下图所示,输入“台湾大学”中的“湾”字被Mask了。
通常Mask有两种方式:
- 替换为特殊的Mask符:用一个特殊的符号替换句子中的一个词,用 "MASK "标记来表示这个特殊符号,可以把它看作一个新字,这个字完全是一个新词,它不在你的字典里,这意味着mask了原文。
- 随机把某一个字换成另一个字:中文的 "湾"字被放在这里,然后可以选择另一个中文字来替换它,它可以变成 "一 "字,变成 "天 "字,变成 "大 "字,或者变成 "小 "字,只是用随机选择的某个字来替换它
两种方法都可以使用,使用哪种方法也是随机决定的。
BERT的输出会连接线性层,最后经过SoftMax函数归一化,输出属于每个中文字符的概率。损失的计算就是用交叉熵损失。
2.2 Next Sentence Prediction
Next Sentence Prediction方法用来预测两个句子是不是应该被接在一起,即第二句是否是第一句的后续句:
- 从数据库中拿出两个句子,在这两个句子之间添加一个特殊标记。这样,BERT就可以知道,这两个句子是不同的句子,因为这两个句子之间有一个分隔符(SEP);
- 将在句子的开头添加一个特殊标记,用CLS来表示这个特殊标记;
- 现在就有一个很长的序列,包括两个句子,由SEP标记和前面的CLS标记分开。如果把它传给BERT,它应该输出一个序列,因为输入也是一个序列,这毕竟是Encoder的目的;
- 只看CLS的输出,把它乘以一个Linear transform;
- 现在它必须做一个二分类问题,有两个可能的输出:是或不是。
但是对于BERT要做的任务来说,这个方法并没有真正的帮助。这时,有一种类似的方法叫SOP(Sentence order prediction):最初挑选的两个句子可能是相连的,可能有两种可能性:要么句子1在句子2后面相连,要么句子2在句子1后面相连。有两种可能性,问BERT是哪一种。也许因为这个任务更难,它似乎更有效。
给BERT一些有标注的资料,BERT就可以做各式各样的下游任务(Downstream Tasks):
2.3 GLUE(General Language Understanding Evaluation)
最有名的测试BERT模型好坏的任务集是GLUE,它里面总共有9个任务:
- Corpus of Linguistic Acceptability(CoLA)
- Stanford Sentiment Treebank (SST-2)
- Microsoft Research Paraphrase Corpus (MRPC)
- Quora Question Pairs (QQP)
- Semantic Textual Similarity Benchmark (STS-B)
- Multi-Genre Natural Language Inference (MNLl)
- Question-answering NLl(QNLI)
- Recognizing Textual Entailment (RTE)
- Winograd NLI(WNLI)
一般来说,如果想知道像BERT这样的模型是否被训练得很好,可以看BERT模型在这9个任务集上的平均表现,即GLUE scores:
上图可以看出,模型在GLUE任务集上的平均表现(蓝色虚线)越来越好,并逐渐超过人类的表现(黑线)
3 怎么使用BERT
3.1 输入为序列,输出为类别
例如情感分析:给机器一个句子,让它判断这个句子是正面的还是负面的。
如下图所示,线性层的参数是随机初始化的,而BERT的参数是预训练后得到的:
预训练(Pre-train)微调 VS 随机初始化(Random Initialization)
如下图,横轴是训练周期,纵轴是训练损失:
由此证明,预训练的BERT模型,比随机初始化的BERT模型表现更好。
3.2 输入和输出是长度相同的序列
例如词性标注(POS tagging):给机器一个句子,给出这个句子中每个词的词性,即使这个词是相同的,也可能有不同的词性。
只需向BERT输入一个句子。之后,对于这个句子中的每一个标记,它是一个中文单词,有一个代表这个单词的相应向量。然后,这些向量会依次通过Linear transform和Softmax层。最后,网络会预测给定单词所属的类别,例如,它的词性。
3.3 输入为两个序列,输出为一个类别
例如自然语言处理(Natural Language Inferencee, NLI):给模型输入一个前提(premise)和假设(hypothesis),模型根据这个前提能否得到假设,输出矛盾(contradiction)、蕴含(entailment)或中立(neutral)。
同样的给BERT两个句子,在这两个句子之间放SEP标记,并在最开始放CLS标记。然后把CLS标记作为Linear transform的输入。
3.4 回答系统(QA)
回答系统(Extraction-based Question Answering):输入一篇文章和一个问题,输出问题的答案。(答案一定是出现在文章里的某个片段)
在这个任务中,一个输入序列包含一篇文章和一个问题,文章和问题都是一个序列。对于中文来说,每个d代表一个汉字,每个q代表一个汉字。把d的集合D和q的集合Q放入QA模型中,输出两个正整数s和e。根据这两个正整数,代表了答案在文章中的起始位置和结束位置,可以直接从文章中截取一段,它就是答案。这个片段就是正确的答案。
s等于17,e等于17,来表示gravity。因为它是整篇文章中的第17个词,所以s等于17,e等于17,意味着输出第17个词作为答案。或者举另一个例子,答案是,“within a cloud”,这是文章中的第77至79个词。你的模型要做的是,输出77和79这两个正整数,那么文章中从第77个词到第79个词的分割应该是最终的答案。
训练这个QA模型,可以使用BERT预训练的模型。对于BERT来说,首先必须向它展示一个问题,一篇文章(上图其实和Natural Language Inference的case类似,那个也是两个句子,一个是前提,一个是结论/假设;这边是一个是文章,一个是问题 ),以及在问题和文章之间的一个SEP标记,然后在开头放一个CLS标记。
找开始位置:计算这个橙色向量和那些与文件相对应的输出向量的内积,由于有3个代表文章的标记,它将输出三个向量,计算这三个向量与橙色向量的内积,将得到三个值,然后将它们通过softmax函数,将得到另外三个值。
找结束位置:蓝色部分代表答案的终点,计算这个蓝色向量与文章对应的黄色向量的内积,然后在这里也使用softmax,最后找到最大值。
4 训练BERT
4.1 训练BERT很有挑战性
BERT是这样一个著名的模型,它可以做任何事情,但是,实际训练它是很困难的,尤其训练它做填空题,这将需要大量的时间。
如下图,这个横轴是训练过程,参数大约有一百万次的更新,需要用TPU运行8天,如果在Colab上做至少要运行200天,甚至可能到明年才能得到结果。
4.2 预训练一个Seq2seq模型
虽然BERT很难训练,但是可以预训练Seq2seq模型的Decoder。通过将序列做一些扰动,再输入Encoder,Decoder的任务是输出和扰动前的序列越接近越好。
在MASS中,扰动的方法是,就像BERT做的那样,只要遮住一些地方就可以了,然后有各种方法来扰动它,比如,删除一些词,打乱词的顺序,旋转词的顺序。或者插入一个MASK,再去掉一些词。总之,有各种方法。在扰动了输入的句子之后,它可以通过Seq2Seq模型来恢复它。
而在BART中,把这些扰动的方法都用上了,实验证明这样的效果是比较好的:
T5的全称是Transfer Text-To-Text Transformer,在这个T5里面,它只是做了各种尝试,它做了你能想象的所有组合。T5是在一个语料库C4上训练的,全称为 “Colossal Clean Crawled Corpus”,使用C4来训练T5。
5 为什么BERT有用
当输入一串文本时,每个文本都有一个对应的向量。对于这个向量,称之为Embedding,这些向量代表了输入词的含义。
如果把这些词所对应的向量画出来,或者计算它们之间的距离,会发现,意思比较相似的词,它们的向量比较接近。例如,“果”和“草”都是植物,“鸟”和“鱼”是动物,所以它们可能更接近。
5.1 一词多义
特别之处在于,BERT可以实现一词多义。例如,同样的“果”字,在“吃苹果”和“苹果手机”中,由于上下文的不同,它的Embedding也不同。
接下来做个实验看看是不是真的可以做到识别同一个字在不同句子里的多义现象。可以输入不同句子,假设现在考虑 "苹果 "这个词,会收集很多有 "苹果 "这个词的句子,比如 “喝苹果汁”、"苹果电脑"等等。然后,把这些句子放入BERT中,来计算同一个字的相似度。
然后根据相似度绘制热力图。如下图所示,可以看到前五个 "苹果 "和后五个 "苹果 "之间的相似度相对较低。BERT知道,前五个 "苹果 "是指可食用的苹果,所以它们比较接近。最后五个 "苹果 "指的是苹果公司,所以它们比较接近。所以BERT知道,上下两堆 "苹果 "的含义不同,说明BERT可以识别出一词多义的情况。
5.2 CBOW(Continuous Bag-of-Words)
要知道一个词的意思,我们需要看它的 “Company”,也就是经常和它一起出现的词汇,也就是它的上下文。当在训练BERT时,给它 、 、 、 ,然后覆盖 并告诉它预测 ,而它就是从上下文中提取信息来预测 。所以这个向量是其上下文信息的精华,可以用来预测 是什么。
这样的想法在BERT之前已经存在了,在word embedding中,有一种技术叫做CBOW,它所做的与BERT完全一样,做一个空白,并要求它预测空白处的内容。这个CBOW技术可以给每个词汇一个向量,用来代表这个词汇的意义。
而如今在使用BERT的时候,就相当于一个深度学习版本的CBOW,可以做更复杂的事情,而且BERT还可以根据不同的语境,从同一个词汇产生不同的embedding(Contextualized word embedding)。
6 多语言(Multi-lingual) BERT
Multi-lingual BERT 指的是使用不同语言训练而成的BERT模型,如下图所示:
6.1 Zero-shot Reading Comprehension
零样本阅读理解(Zero-shot Reading Comprehension)指模型仅通过任务描述(Task Description)理解任务,并在没有任何示例的情况下预测输出结果。它完全依赖于预训练阶段中学习到的通用知识,不需要针对具体任务的额外数据。
例如,Google训练了一个Multi-lingual BERT,它能够做这104种语言的填空题。神奇之处在于,如果用英文问答数据训练它,它就会自动学习如何做中文问答。
下图为一些训练数据,使用的英文数据集为SQuAD,中文数据集为DRCD。在BERT提出之前,最强的模型是QANet,F1得分只有78.1%。如果允许用中文填空题进行BERT预训练,然后用中文Q&A数据集进行微调,那么它在中文Q&A测试集上的正确率达到89.1%,由此可以看到提升是很大的,虽然还是不如人的93.30%。
神奇的是,如果把一个Multi-lingual的BERT,用英文Q&A数据进行微调,它仍然可以回答中文Q&A问题,即使它从未接受过中文和英文之间的翻译训练,也从未阅读过中文Q&A的数据收集,并且回答的正确率也有78.8%,这几乎与QANet的准确性相同。
6.2 Cross-lingual Alignment
也许对于多语言的BERT来说,不同的语言并没有那么大的差异。无论是用中文还是英文显示,对于具有相同含义的单词,它们的embedding都很接近。汉语中的 "跳 "与英语中的 "jump "接近,汉语中的 "鱼 "与英语中的 "fish "接近,汉语中的 "游 "与英语中的 "swim "接近,也许在学习过程中它已经自动学会了,这就叫跨语言对齐(Cross-lingual Alignment)。
并且语言信息并没有隐藏得很深,把所有英语单词的embedding,放到多语言的BERT中,取embedding的平均值,对中文单词也做同样的事情。在这里,给Multi-lingual BERT一个英语句子,并得到它的embedding,然后加上一个蓝色的向量,即英语和汉语之间的差距,BERT就会觉得他读到的是中文的句子。
总结
通过本周的学习,学习了什么是自监督学习,BERT就是通过自监督进行预训练的。还学习了BERT所包含的两个预训练任务:掩码输入和下一句预测。掩码输入有替换为特殊的Mask符和随机替换两张方法,同时这两种方法的使用也是随机的。下一句预测使用CLS标记作为开始,SEP标记作为分隔符。类似的方法还有SOP,由此,BERT可以完成各种各样的下游任务。最后通过GLUE任务集测试BERT,使用GLUE score查看BERT表现情况。
然后了解了怎么使用BERT和BERT的一些应用场景,例如:情感分析、词性标注、自然语言处理和回答系统等。还了解了训练BERT是十分困难的事,但是能够预训练Seq2seq模型,例如MASS/BART方法,还有T5做各组组合然后在C4语料库上训练。以及BERT的好用之处在于能够进行一词多义,类似深度学习版本的CBOW。
最后认识到了多语言BERT在零样本和跨语言对齐上的优势,在使用别的语言训练时,会自动学会用另一种语言问答,通过添加一个偏移向量,从而BERT就会觉得他读到的是另一种语言的句子。