前言
介绍什么是pre-train模型,有了模型后怎么做fine-tune以及pre-train模型怎么被训练出来。
一、pre-train 模型
pre-train 模型希望把输入的每一个token表示成一个embedding vector,vector包含了token的语义,意思相近的token要有比较相近的embedding ,embedding 里面的某些维度可以看出语义的关联性。
contextualized word embedding和过去模型的不同之处就是过去的模型输入一个token输出一个embedding,现在的是吃一整个句子,把一整个句子都看过以后,了解了上下文才给每个token输出一个embedding。
他的模型架构如下:
怎么让BERT模型变小呢?
除了用一些network压缩方法让network变小以外,network architecture 设计的目标是为了让机器可以读非常长的序列。
比如Transformer-XL可以读将近一本书的token,Reformer和Longformer要做的是减少self-attention(n*n)带来的计算量。
二、How to fine-tune
fine-tune部分旨在根据预训练的model添加部分层从而可以解决下游任务,我们有了一个pre-trained model以后,我们希望在它上面再叠一层Task-specific的部分,接下来这个模型就可以用在特定的模型上。
先看一下NLP任务的分类:
根据输入分两类,根据输出分四类,
输入:
输入为一个句子,把输入丢到pre-trained model就可以了,如果输入是多个句子,第一个句子是问题。第二个是文件,在两个句子中间加分隔符SEP。
输出:
1.机器读一整个句子,输出一个class
在输入的时候加一个CLS,在pre-trained的时候要告诉机器看到CLS要产生跟整个句子有关的embedding ,把输出丢到模型中,模型在做分类的问题。在训练的时候没有cls的输入,就把所有输出都读进Task Specific进行分类。
2.每一个token都给他一个class
3.从输入做copy,比如Extraction-based QA
4.General Sequence,怎么把pre-trained的模型用在seq2seq模型里面。
版本一
第四个任务就是生成任务,BERT可以作为一个encoder,需要我们自己去设计一个decoder,但是decoder是没有经过预训练的。
版本二
也可以让pre-training模型当作decoder来使用,其方法就是输入一个[sep]之后让model输出一个东西,再将模型的输出作为模型的输入,以此类推,不断的得到输出结果。
假设有一些Task-specific模型怎么去fine-tune模型。
1.pre-trained模型训练完后就固定住了,变成一个Feature Extractor。
2,把pre-trained和Task-specific的部分接在一起,在fine-tune的时候不止调Task-specific也调pre-trained的模型。
再去微调整个模型,从上图可以看到pre-trained的模型在不同的任务中通过fine-tune以后都会变得不一样,每个任务都需要存一个新的model ,往往非常巨大,就有了Adaptor。只调pre-trained的一部分就好了,在pre-trained model中加入一些Apt,只调Apt的部分。
Weighted features
把不同层的features乘上weight加起来,再把每一层合起来的丢到任务中,w1\w2可以跟着task specific一起被学出来。
为什么需要pre-trained的模型?
pre-trained的模型带给我们比较好的performance,
黑线代表人类的能力,每个点代表每个模型在不同任务上的performance,蓝线代表不同任务的平均。机器以及可以与人相提并论了。
总结
本章在了解了BERT的内容后,具体了解了预训练和微调的内容。