赞
踩
目前在nlp领域,比较流行的一种方式就是“pretrain+finetune”
为什么是这种模式呢?
上周提到的ELMO是采用了加入双层双向LSTM的方式进行预训练,获得词的上下文信息,本文要提及的BERT和GPT则是使用transformer替代LSTM,相对而言,transformer鲁棒性更好,可以叠加计算的层数更多,在长距离的表现也更好。(另外,GPT和BERT与ELMO还有一个最本质的区别,就是ELMO pretrain的结果是fintune模型的一个特征输入,而GPT和BERT就是在fintune模型上做pretrain)
GPT和BERT之间的区别则是:GPT选择了transformer中decoder阶段结构作为预训练结构;而BERT选择了transformer中encoder阶段结构作为预训练结构。
这样首先需要知道encoder结构和decoder结构之间的利弊:
encoder | decoder |
---|---|
双向网络 | 单向网络 |
没有天然的预测目标(Bert自己构造mask) | 有天然的预测目标(天然mask+预测下一个词) |
能看到所有词(更适合做语言理解) | 只能看到一个词前面的词(更适合做语言预测) |
上述这些优缺点其实也就是GPT和BERT的主要区别。
如上面所说,GPT使用了transformer的decoder部分,每层Trms构成了一个自左向右单层的transformer,总共堆叠了12层Trms。
GPT去掉了原先decoder中使用encoder进行attention的部分(因为没使用encoder啊),每层Trms只有一个 Masked Multi Self-Attention(768 维向量+12个Attention Head)和一个 Feed Forward,如下图所示:
训练目标:给定一个无监督的标记语料库U={u1,u2…un} ,我们使用一个标准的语言建模目标来最大化以下可能性:
具体训练方式如前面所说,将token的词嵌入和位置嵌入作为输入h0(0表示第一层),然后叠加12层transformer,最后通过softmax获得预测的下一个单词的概率。
其中U=(u-k,……,u-1)是当前token前的k个tokens,n是模型层数(12层),We是tokens词嵌入的embedding矩阵(句子长度embed纬度),Wp是位置嵌入的embedding矩阵(语料库词汇大小embed纬度)。(两个embedding均为随机初始化)。
我们假设一个有标记的数据集C,由一组输入tokens序列x1,……,xm,还有一个标签y组成,
将这些tokens输入pretrain的模型获得最终层transformer的输出hlm,
然后将其输入到一个附加的线性输出层,通过参数Wy来预测标签y:
最终有监督finetune期望的目标是,最大化以下目标:
在实验中发现,将pretrain中的目标L1一起加入进来可以更好的范化监督模型,而且可以加速收敛,所以最终finetune阶段的目标为:
总的来说,在finetune阶段,我们需要的唯一额外参数是Wy和分隔符标记的tokens。
对于文本分类任务,直接使用上述的finetune即可,但对于其他任务,如文本蕴含、文本相似度、问答等,由于我们的pretrain模型是在连续的文本序列上进行训练的,所以我们需要进行一些修改来将其应用于这些任务。
为了防止模型有比较大的改动,主要对输入进行了改动,如下图所示,这些改动包括增加了新的linear层,以及为tokens之间增加了start、delim、extract这些分隔符、标识位。
下面为三种任务的输入改动:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。