当前位置:   article > 正文

【关于nlp领域的预训练模型的预训练目标方法的总结】_npl模型怎么训练

npl模型怎么训练

关于nlp领域的预训练模型的预训练目标方法的总结——将逐渐更新

综合比较

BERT UniLM GLM T5 BART GPT&GPT2&Bloom
<======================================>
越左边越像BERT,越右边越像GPT,XLNet是个像GPT的怪胎

UniLM

该论文的地址:https://arxiv.org/abs/1905.03197

以下是UniLM模型的预训练目标和方法的简要描述:

首先模型全部所有的预训练目标和方法都是类似于BERT挖空填空的完形填空(cloze)的方法,即原地预测被挖掉位置[mask]处的单词。还transformer架构,Encoder结构,个transformer结构。似乎还是比较偏向于BERT类型,与GPT模型的相似度较远,看起来不好承担生成任务。一共四种完形填空方法:

  1. 单向建模(Unidirectional LM):即只能利用前面的token的信息来预测[mask]位置的单词(对于从左到右的顺序);而对于而对于从右到左的顺序,则用后面的token的信息来预测[mask]位置的单词。
    假设序列为: x 1 , x 2 , [ m a s k ] , x 4 x_1, x_2, [mask], x_4 x1,x2,[mask],x4
    对于从左到右顺序,在mask矩阵中,把 [ m a s k ] [mask] [mask]后面的token全部掩盖掉了,模型只能利用的token只有: x 1 , x 2 , [ m a s k ] x_1, x_2, [mask] x1,x2,[mask]
    对于从右到左顺序,在mask矩阵中,把 [ m a s k ] [mask] [mask]前面的token全部掩盖掉了,模型只能利用的token只有: [ m a s k ] , x 4 [mask], x_4 [mask],x4
    这种方法形成的mask矩阵的情况:
    Unidirectional LM的mask矩阵的情况

  2. 双向建模(Bidirectional LM):该种情况和BERT用的预训练方法和目标一样,即都是用前后两侧的token来预测中间挖空的[mask]位置的单词。
    假设序列为: x 1 , x 2 , [ m a s k ] , x 4 x_1, x_2, [mask], x_4 x1,x2,[mask],x4
    模型能够利用的token信息有: x 1 , x 2 , [ m a s k ] , x 4 x_1, x_2, [mask], x_4 x1,x2,[mask],x4
    这种方法形成的mask矩阵的情况:
    Bidirectional LM的mask矩阵的情况

  3. 序列到序列建模(Sequence-to-Sequence LM):该种方法是针对输入句子对这种情况,即输入为两个句子 S 1 , S 2 S_1, S_2 S1,S2。模型此时可以认为是Encoder-Decoder模型。在句子 S 1 S_1 S1中挖的空[mask],在预测时可以利用句子 S 1 S_1 S1中的所有token,却不能利用 S 2 S_2 S2中的任何token。在句子 S 2 S_2 S2中的[mask],在预测时可以利用 S 1 S_1 S1中的所有token和 S 2 S_2 S2中[mask]及前面的token。
    假设序列为下面情况,其中 [ S O S ] [SOS] [SOS]表示序列的开头, [ E O S ] [EOS] [EOS]表示序列的分割和序列的结尾:
    [ S O S ] , x 1 , [ m a s k 1 ] , x 3 , [ E O S ] , x 4 , [ m a s k 2 ] , x 6 , [ E O S ] [SOS], x_1, [{mask}_1], x_3, [EOS], x_4, [{mask}_2], x_6, [EOS] [SOS],x1,[mask1],x3,[EOS],x4,[mask2],x6,[EOS]
    模型在预测 [ m a s k 1 ] [{mask}_1] [mask1]能够利用到的信息有:
    [ S O S ] , x 1 , [ m a s k 1 ] , x 3 , [ E O S ] [SOS], x_1, [{mask}_1], x_3, [EOS] [SOS],x1,[mask1],x3,[EOS]
    而模型在预测 [ m a s k 2 ] [{mask}_2] [mask2]能够利用到的信息有:
    [ S O S ] , x 1 , [ m a s k 1 ] , x 3 , [ E O S ] , x 4 , [ m a s k 2 ] [SOS], x_1, [{mask}_1], x_3, [EOS], x_4, [{mask}_2] [SOS],x1,[mask1],x3,[EOS],x4,[mask2]
    这种方法形成的mask矩阵的情况:
    Sequence-to-Sequence LM

  4. 是否为相邻句子的预测(Next Sentence Prediction):类似于BERT,在Bidirectional LM中,同时进行了输入句子 S 1 , S 2 S_1, S_2 S1,S2是否为相邻的上下两个句子的预测。

个人感觉(碎碎念):
这种完形填空类cloze的预训练时并没有自回归任务让其生成文本,在后续生成文本的时候应该也是最右边一个[mask]一个[mask]来预测,最终生成文本。这感觉在类似文本生成任务中也会导致在预训练和预测时的不一致的问题,因为在预训练的过程中,并没有训练模型从0开始逐渐预测的能力,而是在给定一定的上下文(未挖掉的token)的前提下对[mask]位置的预测。

给我的感受,感觉训练目标还是不够统一有些割裂,有种强行把BERT和GPT凑起来的感觉。单向的训练模型利用单一方向信息的能力,双向训练模型利用双边信息的能力,序列到序列则同时训练两种能力,整体上似乎还是更加倾向于和BERT相似而在文本生成类型任务上略微不匹配的感觉。

BART

该论文的地址:https://arxiv.org/abs/1910.13461

以下是BART模型的预训练目标和方法的简要描述:
首先BART的架构还是Transformer架构,但是结构是Encoder-Decoder的结构,应该是个transformer结构 (It is implemented as a sequence-to-sequence model with a bidirectional encoder over corrupted text and a left-to-right autoregressive decoder) 。预训练目标是先挖空形成破坏后的文本,然后再将破坏后的文本输入到Encoder模型中进行编码,之后让Decoder模型进行解码输出原始的未破坏的文本。
BART模型的结构
一共5种破坏的重建的策略:

  1. 遮盖单词预测(Token Masking):这个破坏方法和BERT的方法相同,即将原输入随机挖掉一定个数的单词用[mask]代替,然后让模型补全对应的单词。但与BERT不同的是BERT在原位置进行单词预测,而BART则用生成的方式重建整个句子,在这个过程中把[mask]单词预测出来。过程如下:
    x 1 , x 2 , [ m a s k ] , x 4 = = > x 1 , x 2 , x 3 , x 4 x_1, x_2, [mask], x_4 ==> x_1, x_2, x_3, x_4 x1,x2,[mask],x4==>x1,x2,x3,x4
  2. 删除单词预测(Token Deletion):这个方法与Token Masking不同的地方在于该方法并不留下[mask]来代替被挖掉的单词,而是让模型额外在生成的过程中增加补全该删除的单词。过程如下:
    x 1 , x 2 , x 4 ( x 3 被删除 ) = = > x 1 , x 2 , x 3 , x 4 x_1, x_2, x_4 (x_3被删除) ==> x_1, x_2, x_3, x_4 x1,x2,x4(x3被删除)==>x1,x2,x3,x4
  3. 遮盖词组预测(Text Infilling):这个方法与Token Masking的不同在于,一次性挖掉连续几个单词(词组),然后仅用一个[mask]来代替。这种方法与Span-BERT的方法类似,能够提升模型的性能,但与Span-BERT有一点区别的是,在BART里允许挖掉长度为0的词组,也就是模型需要预测对应的[mask]位置是否为空。过程如下:
    x 1 , [ m a s k ] , x 4 = = > x 1 , x 2 , x 3 , x 4 x_1, [mask], x_4 ==> x_1, x_2, x_3, x_4 x1,[mask],x4==>x1,x2,x3,x4 x 1 , [ m a s k ] , x 2 , x 3 , x 4 = = > x 1 , x 2 , x 3 , x 4 x_1, [mask], x_2, x_3, x_4 ==> x_1, x_2, x_3, x_4 x1,[mask],x2,x3,x4==>x1,x2,x3,x4
  4. 句子排列(Sentence Permutation):在这个任务中,整个document被按句号分成了多个句子,并且随机打乱了顺序并输入给模型,模型需要按照原本的顺序将句子生成出来。过程如下:
    x 3 , x 4 , x 5 。 x 1 , x 2 。 = = > x 1 , x 2 。 x 3 , x 4 , x 5 。 x_3, x_4, x_5。x_1, x_2。 ==> x_1, x_2。 x_3, x_4, x_5。 x3,x4,x5x1,x2==>x1,x2x3,x4,x5
  5. 文档旋转(Document Rotation):在这个任务中,document中的某个随机的token被选中,并且该tonken前面的内容会完全平移到尾部,使该token变成开头,再输入到模型中,模型的任务是重新生成出正确的顺序。过程如下,此时选中的token为 x 4 x_4 x4
    x 4 , x 5 。 x 1 , x 2 。 x 3 , = = > x 1 , x 2 。 x 3 , x 4 , x 5 。 x_4, x_5。x_1, x_2。x_3, ==> x_1, x_2。 x_3, x_4, x_5。 x4,x5x1,x2x3,==>x1,x2x3,x4,x5
    原论文中各种破坏重建策略的示意图:
    BART中各种破坏重建的策略

个人感觉(碎碎念):

感觉上BART的预训练目标都是损坏原文本修复的工作,输入输出都来自于同一个句子,确实能够比较好的训练得到token和token之间的关系,句子内部的规律应该能够比较好的把握。但也正是因为输入输出都来自于同一个句子,在文本生成任务中是否会忽略了句子间的规律呢?毕竟生成任务不能一直输入前文生成前文对吧。虽说有 句子排列(Sentence Permutation) 的任务作为预训练任务让模型意识到句子和句子之间的关系,但是就BERT后续研究反馈来看,是否为相邻句子的预测(Next Sentence Prediction) 似乎并没有起到太多的作用,因此在这里也比较怀疑 句子排列(Sentence Permutation) 的有效性。

T5

该论文的地址:https://arxiv.org/abs/1910.10683

这篇论文很长啊(足足67页),但是其实在模型架构上还挺简单的,还是原本的transformer架构,Encoder+Decoder结构,个transformer (Our baseline model is designed so that the encoder and decoder are each similar in size and configuration to a “BERTBASE” (Devlin et al., 2018) stack.)(This is roughly twice the number of parameters of BERTBASE since our baseline model contains two layer stacks instead of one),重要的是能力。还有主要是将所有的NLP问题都转换为“text-to-text”的模式。这点和目前23年的LLM契合。

以下是T5模型的预训练目标和方法的简要描述:
预训练目标和方法和方法和BART中的 遮盖词组预测(Text Infilling) 很相似,也是将原句子挖掉一定长度的token(词组),并且在生成中预测被挖掉的token词组。只不过与BART的区别在于,BART重建整个原句子;而T5只预测被挖掉的部分(文中说是为了减少在预训练过程中的计算资源开销,Our choices to mask consecutive spans of tokens and only predict dropped-out tokens were made to reduce the computational cost of pre-training)。

预训练过程的示意表示:
x 1 , x 2 , [ X ] , x 5 , [ Y ] , x 7 = = > [ X ] , x 3 , x 4 , [ Y ] , x 6 , [ Z ] x_1, x_2, [X], x_5, [Y], x_7 ==> [X], x_3, x_4, [Y], x_6, [Z] x1,x2,[X],x5,[Y],x7==>[X],x3,x4,[Y],x6,[Z]其中用[X], [Y]等特殊定义的token来代表不同的挖空,并且在输出的时候用这些token来作为输出内容的开始,并且设置特殊token [Z]来表示生成的结束。也就是只生成被挖掉的内容。
T5的预训练示意图
个人感觉(碎碎念):
其实感觉和span-BERT的预训练目标相差不多,只是把span-BERT预测的位置改成了末尾,并且把多个[mask]融合成了一个而已。这边感觉还是没有在原有的类BERT模型上与生成模型进行更好的融合,通过更大的模型和数据集堆上来的工作。在生成任务上似乎也没有弥补预训练过程和实际生成过程的gap,即生成出来的内容不会是预训练过程中要求的挖空内容。
引用别人的说法:
https://zhuanlan.zhihu.com/p/88727133 中评论
在这里插入图片描述
https://zhuanlan.zhihu.com/p/88377084 中作者看法
在这里插入图片描述

GLM

该论文的地址:https://arxiv.org/abs/2103.10360
glm-130b论文地址:https://arxiv.org/abs/2210.02414

下面是GLM论文中的模型示意图,可以看出来从预训练目标上GLM和T5很像啊,原文也说了 (While blanking filling has been used in T5 (Raffel et al., 2020) for text-to-text pre-training, we propose two improvements, namely span shuffling and 2D positional encoding)。同样也是随机mask掉一定数量的词组,同样也是只生成被mask掉的词组。只不过在生成挖掉的内容时随机打乱了内容的顺序,并且把原本用特殊token标识的挖空位置改为了用position来表示了,使用的是2Dposition编码。But这里只用了个transformer结构 (GLM uses a single Transformer with several modifications to the architecture) ,既做了encoder,又做了decoder,是通过特殊的mask矩阵来实现的。
GLM论文中模型示意图
以下是所使用到的预训练任务:

  1. 自回归完形填空(Autoregressive Blank Infilling):
    这个任务目标和T5的预训练任务很像,也是在原始文本中挖空,并且产生被挖掉的内容而不是完整输入,但是不同在于生成挖掉的内容时随机打乱了内容的生成顺序,并且把原本用特殊token标识的挖空位置改为了用position来标识了,使用的是2Dposition编码。
    x 1 , x 2 , [ M ] , x 5 , [ M ] , x 7 , [ S ] = = > x 6 x_1, x_2, [M], x_5, [M], x_7, [S] ==> x_6 x1,x2,[M],x5,[M],x7,[S]==>x6 x 1 , x 2 , [ M ] , x 5 , [ M ] , x 7 , [ S ] , x 6 = = > [ E ] x_1, x_2, [M], x_5, [M], x_7, [S], x_6 ==> [E] x1,x2,[M],x5,[M],x7,[S],x6==>[E] x 1 , x 2 , [ M ] , x 5 , [ M ] , x 7 , [ S ] , x 6 , [ E ] = = > x 3 x_1, x_2, [M], x_5, [M], x_7, [S], x_6, [E] ==> x_3 x1,x2,[M],x5,[M],x7,[S],x6,[E]==>x3 x 1 , x 2 , [ M ] , x 5 , [ M ] , x 7 , [ S ] , x 6 , [ E ] , x 3 = = > x 4 x_1, x_2, [M], x_5, [M], x_7, [S], x_6, [E], x_3 ==> x_4 x1,x2,[M],x5,[M],x7,[S],x6,[E],x3==>x4 x 1 , x 2 , [ M ] , x 5 , [ M ] , x 7 , [ S ] , x 6 , [ E ] , x 3 , x 4 = = > [ E ] x_1, x_2, [M], x_5, [M], x_7, [S], x_6, [E], x_3 , x_4 ==> [E] x1,x2,[M],x5,[M],x7,[S],x6,[E],x3,x4==>[E] x 1 , x 2 , [ M ] , x 5 , [ M ] , x 7 , [ S ] , x 6 , [ E ] , x 3 , x 4 , [ E ] x_1, x_2, [M], x_5, [M], x_7, [S], x_6, [E], x_3 , x_4, [E] x1,x2,[M],x5,[M],x7,[S],x6,[E],x3,x4,[E]
  2. (Multi-Task Pretraining:Document-level):
    与之前挖掉多个短的词组相比,这里原则是挖掉单一的长的空,以此来让模型适应生成任务。这边挖掉的长度在50%~100%之间,然后让模型逐个生成出来。
    x 1 , [ M ] , x 6 , [ S ] = = > x 2 x_1, [M], x_6, [S] ==> x_2 x1,[M],x6,[S]==>x2 x 1 , [ M ] , x 6 , [ S ] , x 2 = = > x 3 x_1, [M], x_6, [S], x_2 ==> x_3 x1,[M],x6,[S],x2==>x3 x 1 , [ M ] , x 6 , [ S ] , x 2 , x 3 = = > x 4 x_1, [M], x_6, [S], x_2, x_3 ==> x_4 x1,[M],x6,[S],x2,x3==>x4 x 1 , [ M ] , x 6 , [ S ] , x 2 , x 3 , x 4 = = > x 5 x_1, [M], x_6, [S], x_2, x_3, x_4 ==> x_5 x1,[M],x6,[S],x2,x3,x4==>x5 x 1 , [ M ] , x 6 , [ S ] , x 2 , x 3 , x 4 , x 5 = = > [ E ] x_1, [M], x_6, [S], x_2, x_3, x_4, x_5==> [E] x1,[M],x6,[S],x2,x3,x4,x5==>[E] x 1 , [ M ] , x 6 , [ S ] , x 2 , x 3 , x 4 , x 5 , [ E ] x_1, [M], x_6, [S], x_2, x_3, x_4, x_5, [E] x1,[M],x6,[S],x2,x3,x4,x5,[E]
  3. (Multi-Task Pretraining:Sentence-level):
    和Document-level类似,都是挖掉较长的空,只不过这里一定得挖掉一整句话,用来帮助seq2seq任务,因为这些通常都要预测一整个句子。

个人感觉(碎碎念):
把BERT的 MLM双向编码 拿来了;把GPT的 单向序列自回归编码 拿来了,融合在一个transformer结构里面,把T5做在一个transformer结构的感觉。双向编码被挖掉之后剩下的部分,单向序列自回归编码出被挖掉的内容。

Well,就 自回归完形填空(Autoregressive Blank Infilling) 这个预训练任务来看,感觉比T5更像span-BERT了,T5好歹也是用了一个transformer作为Encoder,一个transformer作为Decoder,这直接就是一个transformer结构了,只不过把挖空放在了最后进行预测。就是把span-Bert的空的预测放到了最后面,相较span-Bert还少了一些token交互(attention矩阵有一块是黑的不连接,而span-Bert是全连接图)。
原论文中图
就总结来看,UniLM是把GPT和BERT综合起来中更加偏向于BERT的类型;而GLM则是把GPT和BERT结合起来中更加偏向GPT的类型,弥补了之前在T5时吐槽的预训练过程与生成过程差距过大的gap,更能易于生成任务。做的还算完善,注意了token和token之间的联系-预测被mask的单词,在生成过程中对于前面的部分采用的是类Bert双向编码-弥补了GPT单向编码的缺陷。算是Bert和GPT结合的很好了。

在生成的过程中,还是只能按照序列顺序生成;另外生成被mask的token和生成整个句子似乎还存在gap,是两个任务,也确实被称之为Multi-Task Pretraining,这点在后续的工作GLM-130B中也体现了,因为用了[MASK]和[gMASK]两种mask token分别来表示两种任务。在GLM-130B工作中也没有用前面说的2Dposition编码而是用的RoPE(Rotary Positional Encoding旋转位置编码)

XLNet

该论文地址:https://arxiv.org/abs/1906.08237
这个模型的预训练目标可以从下图中得到,首先将原始输入token打乱顺序,然后用类似GPT的方式自回归重建出打乱后的文本。图中很清楚,该模型后续也没有工作了,在这也不做过多介绍。
XLNet模型的示意图
个人感觉(碎碎念):
这个模型怎么说呢,就是觉得很怪,动机也很奇怪,不符合直觉。像我们在上小学的时候,英语课上有完形填空-对应BERT的MLM,GPT可能对应写作文吧,这个模型但凡是把打乱词顺序重新排序组成句子,我都认为他对应组词成句任务了。可是它不是,是按照打乱之后词顺序做自回归,原本的顺序1,2,3,4,5这样自回归好歹能认为是可以找规律,这打乱之后用自回归,谁才得到后面的是什么啊,就非常奇怪。

引用自https://zhuanlan.zhihu.com/p/107350079的评论中,觉得说的挺对的。
在这里插入图片描述
在这里插入图片描述

GPT & GPT2 & Bloom

鉴于这三者的结构以及框架都是相似的,只是做出了比较少的改变,因此不重复赘述,将其合在一起论述。关于他们的差别主要在层归一化的位置,位置编码,训练数据大小,模型层数和大小等方面,在预训练任务目标上是相同的。用的都是transformer架构,Decoder结构。具体想了解详细差别的可以阅读其原始论文和查看他人的总结。
知乎问题:GPT-1和GPT-2差别的总结
GPT-1的原论文:https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf
GPT-2的原论文:https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf
Bloom在实现过程中参考的论文模型是Megatron-LM GPT2,Bloom论文地址为:https://arxiv.org/abs/2211.05100

Hugging Face 上Bloom模型对于自己的详细介绍(地址:https://huggingface.co/bigscience/bloom#training-data):
Hugging Face上Bloom对自己的结构的描述
GPT-1和GPT-2在层归一化上的调整,图源(https://blog.csdn.net/beilizhang/article/details/109282032)
GPT-1和GPT-2的层归一化的调整

接下来要介绍最最经典的GPT的自回归编码结构了,用前面的输入的序列,预测下一个要输出的token,并且把输出的token加入到输入序列当中,继续预测再下一个要输出的token,以此循环往复,直到预测完所有的token预测到结束token为止。用形式化表示如下面所示:
x 1 , x 2 , x 3 = = > x 4 x_1, x_2, x_3 ==> x_4 x1,x2,x3==>x4 x 1 , x 2 , x 3 , x 4 = = > x 5 x_1, x_2, x_3, x_4 ==> x_5 x1,x2,x3,x4==>x5 x 1 , x 2 , x 3 , x 4 , x 5 = = > x 6 x_1, x_2, x_3, x_4, x_5 ==> x_6 x1,x2,x3,x4,x5==>x6 x 1 , x 2 , x 3 , x 4 , x 5 , x 6 = = > [ E n d ] x_1, x_2, x_3, x_4, x_5, x_6 ==> [End] x1,x2,x3,x4,x5,x6==>[End] x 1 , x 2 , x 3 , x 4 , x 5 , x 6 , [ E n d ] x_1, x_2, x_3, x_4, x_5, x_6, [End] x1,x2,x3,x4,x5,x6,[End]
GPT模型结构的示意图,第i个token只能看到前面的token而不能看到后面的token
GPT模型结构的示意图
个人感觉(碎碎念):
简单而且有效是这个模型最大的优点,然后配上大力出奇迹往里面灌大量的无标注数据进行无监督自回归预训练,就能够表现出较好的生成方面的性能,但是由于是单向建模的,在自然语言理解方面相较于双向建模还是存在着劣势。后续的GPT-3和ChatGPT还有GPT4都没有开源,这里暂且不去讨论。

这种序列化建模存在一定的缺点,首先是单向建模没办法看到后面的内容,导致对于文本的理解可能存在一定的问题。其次一个一个字的生成感觉效率不是特别高,要是能同时生成多个字符就好了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/955708
推荐阅读
相关标签
  

闽ICP备14008679号