目录
摘要
abstract
一、BERT
1、应用场景
任务一:单句子分类任务
任务二:单句子标注任务
任务三:句子对分类任务
任务四:问答系统
2、pre-train model
3、fine tune微调
input&output
how to fine tune
二、总结
摘要
本周学习了BERT的基本使用场景、预训练模型的结构及其改进,以及微调的输入输出和微调的方式。在学习Bert的过程中,对seq2seq model进行了复习。Bert主要应用在GLUE任务中,它可以完成单句子分类任务、单句子标注任务、句子对分类任务和问答任务,这四种下游任务是基于不同的输入输出,其中不同任务的task specific layer也是不相同的。
abstract
This week, we have learned the basic usage scenarios of BERT, the structure of the pre-trained model and its improvement, as well as the inputs and outputs of fine-tuning and the ways of fine-tuning. In the process of learning Bert, the seq2seq model was reviewed.Bert is mainly used in GLUE tasks, which can accomplish single-sentence classification tasks, single-sentence labeling tasks, sentence-pair classification tasks, and question-and-answer tasks, which are four downstream tasks based on different inputs and outputs, where the task-specific layer of the different tasks are also different .
一、BERT
1、应用场景
GLUE任务
其中各个任务的得分结果如下:
如何在GLUE中使用BERT?
任务一:单句子分类任务
在上图任务中,BERT属于是一种semi-supervision的学习模型
典型的任务有文本二分类、情感分析等
举例:Bert进行文本分类
# 使用bert进行文本分类
from transformers import BertForSequenceClassification, BertTokenizer
import torchtokenizer = BertTokenizer.from_pretrained('E:\/bert\/bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('E:\/bert\/bert-base-uncased')text = "This movie was amazing!"
inputs = tokenizer(text, return_tensors='pt')
outputs = model(**inputs)
predictions = torch.argmax(outputs.logits, dim=1)
print(predictions)
预测结果如下:
任务二:单句子标注任务
输入一个句子,输出为一个长度相同的句子,类似于self-attention中的任务。输入的句子在bert中被分割为一个个token,每一个token都有一个对应的向量,每个向量分别去做对应的linear transform,最终每个词都得到相应的类别(也就是词性)。
需要有一部分已标注的资料,在bert中的pre-train中设定好了一组较好的初始化参数。
典型的任务有词性标注、实体识别
举例:使用Bert标记器对文本进行标记
# 使用BERT标记器对文本进行标记
from transformers import BertTokenizertokenizer = BertTokenizer.from_pretrained('E:\/bert\/bert-base-uncased')
text = "BERT preprocessing is essential."
tokens = tokenizer.tokenize(text)print(tokens)
标记结果如下:
任务三:句子对分类任务
输入两个句子,输出一个类别,一般都是判断给定两个句子的相似程度来得到对立、赞成、中立的态度。 输入两个分隔开来的句子,在bert中处理之后会生成一组长度相同的向量,我们只取[CLS]中的向量来进行linear transform,最终得到一个类别(两个句子是否是矛盾对立的)
典型的任务有评论立场分析、自然语言推断
任务四:问答系统
输入被[SEP]分隔开的问题和文章,有两个随机初始化的向量。首先,将橙色的向量与输入文章的bert处理后的向量进行inner product,最后经过softmax函数后比较大小,得到的最大值的向量位置记为初始位置s;接着,相同操作,将蓝色的向量与输入文章的bert处理后的向量进行inner product,最后经过softmax函数后比较大小,得到的最大值的向量位置记为长度e。
简而言之,就是答案在文章当中,然后通过确定其起始位置和答案长度来确定输出。
典型的任务有QA
2、pre-train model
pre-train model:将每一个输入的token转化为embedding的向量
在之前的预训练模型中,一个输入对应一个vector(提前已经设定好了不同输入所确定的vector)
问题:token转化为vector的时候没办法结合上下文考虑
解决:将pre-train model看作是encoder
3、fine tune微调
fine-tune:在pre-train model的基础上,加一个task-specific layer,这样的话该模型可以用于不同的NLP的任务上。
input&output
上面展示了NLP tasks的基本要求,下面给出其输入输出的形式
输入要么是一个长句子,分析其情感立场等;要么是多个需要分隔开的句子,QA任务或者是蕴含任务等,各个句子之间需要[SEP]分隔。
输出的情况较多,比如直接经过task specific layer得到一个类别(情感分析),或者在bert中输出的每个token都得到一个类别(词性标注),或者QA任务,得到的输出是来自输入的一部分,又或者是一些看作为seq2seq的任务。
将上述NLP的任务看成是seq2seq model,分为encoder和decoder两部分,如下:
将输入序列放入Bert中去,最终经过task specific layer得到输出。其中Bert model相当于encoder,task specific layer相当于decoder。
问题:task specific layer没有经过pre-train,所以最终效果可能不好
解决:如下所示
输入序列在经过Bert model之后分为了一个个token,每个token经过各自的task specific layer得到的token会重新作为输入,这样的话,task specific layer也就等同于有了pre-train一样(Bert model中有pre-train)。
how to fine tune
问题:如果fine tune整个model,那么每个任务不同会导致训练完后的model不一样。每个model的参数不同且很多,存储不易
解决:局部微调,仅仅fine tune adaptor
在pre-train model中引入adaptor,这样的话,model大体上是相同的,只有Apt一小部分是不同的。所以改进后的参数量的存储变少了很多。
现在很多预训练模型中都是使用了Transformer的结构,研究者在Transformer结构中插入Adaptor层,通过训练微调Adaptor,而不去修改其他已经训练好的参数。
我们在BERT中,是把模型最后一层的输出feature作为了各个token的embedding,但不同层学到的是不同的feature,不同的任务可能需要不同的侧重,所以可以对不同层的feature进行加权。如下所示,考虑到了各层的输出feature:
参考文章:一文彻底搞懂Bert(代码+手撕)-CSDN博客
二、总结
本周主要对bert的应用场景进行了分析,以及预训练模型个微调技术。下周继续学习bert,并且加入代码实践。