3.1 Encoder-only PLM
3.1.1 BERT
配合下文食用:
(42 封私信 / 80 条消息) 读懂BERT,看这一篇就够了 - 知乎https://zhuanlan.zhihu.com/p/403495863
BERT 是一个统一了多种思想的预训练模型。其所沿承的核心思想包括:Transformer 架构和预训练+微调范式。
模型架构——Encoder Only
BERT整体既是由 Embedding、Encoder 加上 prediction_heads 组成。
Embedding部分:文本序列Text通过分词器tokenizer转化为input_ids,然后进入Embedding层转化为特定维度的hidden_stats(包含Token Embeddings,Segment Embeddings以及Position Embeddings)。
Encoder部分:进过Embedding转化后的hidden_states在金国Encoder块。Encoder 块中是对叠起来的 N 层 Encoder Layer。
BERT 有两种规模的模型,分别是 base 版本(12层 Encoder Layer,768 的隐藏层维度,总参数量 110M),large 版本(24层 Encoder Layer,1024 的隐藏层维度,总参数量 340M)。
EncoderLayer: 每一层 Encoder Layer 都是和 Transformer 中的 Encoder Layer 结构类似的层。在EncoderLayer中,hidden_states先经过attention块。
在attention块中,hidden_states先完成注意力分数的计算获得attention_weight,再通过Position Embedding 层来融入相对位置信息,在进行softmax操作。
从attention块出来后,通过残差连接的机制和原输入相加,在进过一层 Intermediate 层得到最终输出。Intermediate 层是 BERT 的特殊称呼,其实就是一个线性层加上激活函数,所使用的激活函数是 GELU 函数。
GELU 的核心思路为将随机正则的思想引入激活函数,通过输入自身的概率分布,来决定抛弃还是保留自身的神经元。
通过Encoder 编码之后的最顶层 hidden_states 最后经过 prediction_heads 就得到了最后的类别概率,经过 Softmax 计算就可以计算出模型预测的类别。
预训练任务——MLM + NSP
MLM(掩码语言模型):
LM 使用上文预测下文的方式可以直接应用到任何文本中,但是,其直接拟合从左到右的语义关系,但忽略了双向的语义关系。
MLM 模拟的是“完形填空”。在一个文本序列中随机遮蔽部分 token,然后将所有未被遮蔽的 token 输入模型,要求模型根据输入预测被遮蔽的 token。同样,MLM 任务无需对文本进行任何人为的标注,只需要对文本进行随机遮蔽即可,因此也可以利用互联网所有文本语料实现预训练。
输入:I <MASK> you because you are <MASK>
输出:<MASK> - love; <MASK> - wonderful
在具体进行 MLM 训练时,会随机选择训练语料中 15% 的 token 进行遮蔽操作。在其中,80% 的部分会被替换成特殊标记 [MASK],10% 的部分会被替换成其他随机的单词,而剩下的 10% 部分则不做任何处理。
10% 保持不变就是为了消除预训练和微调的不一致。
10% 的随机替换核心意义在于迫使模型保持对上下文信息的学习。
通过引入部分随机 token,模型无法确定需要预测的 token,从而被迫保持每一个 token 的上下文表征分布,从而具备了对句子的特征表示能力。且由于随机 token 的概率很低,其并不会影响模型实质的语言理解能力。
NSP(下一句预测):
NSP 任务的核心思路是要求模型判断一个句对的两个句子是否是连续的上下文。通过要求模型判断句对关系,从而迫使模型拟合句子之间的关系,来适配句级的 NLU 任务。
输入:
Sentence A:I love you.
Sentence B: Because you are wonderful.
输出:
1(是连续上下文)
输入:
Sentence A:I love you.
Sentence B: Because today's dinner is so nice.
输出:
0(不是连续上下文)
下游任务微调
作为 NLP 领域里程碑式的成果,BERT 的一个重大意义就是正式确立了预训练-微调的两阶段思想,即在海量无监督语料上进行预训练来获得通用的文本理解与生成能力,再在对应的下游任务上进行微调。该种思想的一个重点在于,预训练得到的强大能力能否通过低成本的微调快速迁移到对应的下游任务上。
针对这一点,BERT 设计了更通用的输入和输出层来适配多任务下的迁移学习。对每一个输入的文本序列,BERT 会在其首部加入一个特殊 token <CLS>
。在后续编码中,该 token 代表的即是整句的状态,也就是句级的语义表征。在进行 NSP 预训练时,就使用了该 token 对应的特征向量来作为最后分类器的输入。
在完成预训练后,针对每一个下游任务,只需要使用一定量的全监督人工标注数据,对预训练的 BERT 在该任务上进行微调即可。所谓微调,其实和训练时更新模型参数的策略一致,只不过在特定的任务、更少的训练数据、更小的 batch_size 上进行训练,更新参数的幅度更小。对于绝大部分下游任务,都可以直接使用 BERT 的输出。例如,对于文本分类任务,可以直接修改模型结构中的 prediction_heads 最后的分类头即可。对于序列标注等任务,可以集成 BERT 多层的隐含层向量再输出最后的标注结果。对于文本生成任务,也同样可以取 Encoder 的输出直接解码得到最终生成结果。因此,BERT 可以非常高效地应用于多种 NLP 任务。
3.1.2 RoBERTa
优化一:去掉 NSP 预训练任务
RoBERTa 的模型架构与 BERT 完全一致,也就是使用了 BERT-large(24层 Encoder Layer,1024 的隐藏层维度,总参数量 340M)的模型参数。
RoBERTa 在预训练中去掉了 NSP,只使用 MLM 任务。
RoBERTa 将 Mask 操作放到了训练阶段,也就是动态遮蔽策略,从而让每一个 Epoch 的训练数据 Mask 的位置都不一致。在实验中,动态遮蔽仅有很微弱的优势优于静态遮蔽,但由于动态遮蔽更高效、易于实现,后续 MLM 任务基本都使用了动态遮蔽。
优化二:更大规模的预训练数据和预训练步长
RoBERTa 使用了共计 160GB 的数据,十倍于 BERT。全部在 512 长度上进行训练。
优化三:更大的 bpe 词表
BERT 原始的 BPE 词表大小为 30K,RoBERTa 选择了 50K 大小的词表来优化模型的编码能力。
3.1.3 ALBERT
通过对模型结构进行优化并对 NSP 预训练任务进行改进,ALBERT 成功地以更小规模的参数实现了超越 BERT 的能力。
优化一:将 Embedding 参数进行分解
ALBERT 设置了 Embedding 层的输出为 128,因此在 Embedding 层后面加入了一个 的线性矩阵来将 Embedding 层的输出再升维到隐藏层大小。
优化二:跨层进行参数共享
让各个 Encoder 层共享模型参数,来减少模型的参数量。
在具体实现上,其实就是 ALBERT 仅初始化了一个 Encoder 层。在计算过程中,仍然会进行 24次计算,但是每一次计算都是经过这一个 Encoder 层。
虽然 ALBERT 的参数量远小于 BERT,但训练效率却只略微优于 BERT,因为在模型的设置中,虽然各层共享权重,但计算时仍然要通过 24次 Encoder Layer 的计算,也就是说训练和推理时的速度相较 BERT 还会更慢。这也是 ALBERT 最终没能取代 BERT 的一个重要原因。
优化三:提出 SOP 预训练任务
正例同样由两个连续句子组成,但负例是将这两个的顺序反过来。也就是说,模型不仅要拟合两个句子之间的关系,更要学习其顺序关系,这样就大大提升了预训练的难度。
SOP 预训练任务对模型效果有显著提升。使用 MLM + SOP 预训练的模型效果优于仅使用 MLM 预训练的模型更优于使用 MLM + NSP 预训练的模型。
3.2 Encoder-Decoder PLM
3.2.1 T5
T5 基于 Transformer 架构,包含编码器和解码器两个部分,使用自注意力机制和多头注意力捕捉全局依赖关系,利用相对位置编码处理长序列中的位置信息,并在每层中包含前馈神经网络进一步处理特征。
模型结构:Encoder-Decoder
T5 则采用了 Encoder-Decoder 结构,其中编码器和解码器都是基于 Transformer 架构设计。编码器用于处理输入文本,解码器用于生成输出文本。编码器和解码器之间通过注意力机制进行信息交互,从而实现输入文本到输出文本的转换。
Embedding部分详见Bert,基本上是一样的操作。而作为T5model的主要部分,主要有EncoderLayers和DecoderLayers两部分组成。他们分别包括多个EncoderLaye和DecoderLayer,每个里面有都包含多头注意力机制、前馈神经网络和 Norm 层。
Encoder主要包括 Self-Attention 和前馈神经网络。前者用于捕捉输入序列中的全局依赖关系,后者用于处理特征的非线性变换。
Decoder 中还包含了 Encoder-Decoder Attention 结构,用于捕捉输入和输出序列之间的依赖关系。这两种 Attention 结构几乎完全一致,只有在位置编码和 Mask 机制上有所不同。
正文给出的模型图会让初学者感到迷糊,配合下文食用更佳: T5(Transfer Text-to-Text Transformer)详解 - 简书https://www.jianshu.com/p/627d4643f7a7
与原始 Transformer 模型不同,T5 模型的LayerNorm 采用了 RMSNorm。这种归一化有助于通过确保权重的规模不会变得过大或过小来稳定学习过程,这在具有许多层的深度学习模型中特别有用。RMSNorm 不涉及均值计算,数值更稳定。均方根归一化 RMSNorm 详解:原理、实现与应用-优快云博客https://blog.youkuaiyun.com/shizheng_Li/article/details/145830637
预训练任务
T5模型的预训练任务是 MLM。
大一统思想
T5模型的一个核心理念是“大一统思想”,即所有的 NLP 任务都可以统一为文本到文本的任务,这一思想在自然语言处理领域具有深远的影响。其设计理念是将所有不同类型的NLP任务(如文本分类、翻译、文本生成、问答等)转换为一个统一的格式:输入和输出都是纯文本。
例如:
- 对于文本分类任务,输入可以是“classify: 这是一个很好的产品”,输出是“正面”;
- 对于翻译任务,输入可以是“translate English to French: How are you?”, 输出是“Comment ça va?”。
3.3 Decoder-Only PLM
3.3.1 GPT
由于 Decoder-Only 结构也天生适用于文本生成任务,所以相较于更贴合 NLU 任务设计的 BERT,GPT 和 T5 的模型设计更契合于 NLG(自然语言生成) 任务和 Seq2Seq 任务。
模型架构——Decoder Only
输入的 input_ids 首先通过 Embedding 层,再经过 Positional Embedding 进行位置编码。不同于 BERT 选择了可训练的全连接层作为位置编码,GPT 沿用了 Transformer 的经典 Sinusoidal 位置编码,即通过三角函数进行绝对位置编码。
通过 Embedding 层和 Positional Embedding 层编码成 hidden_states 之后,就可以进入到解码器(Decoder),第一代 GPT 模型和原始 Transformer 模型类似,选择了 12层解码器层,但是在解码器层的内部,相较于 Transformer 原始 Decoder 层的双注意力层设计,GPT 的 Decoder 层反而更像 Encoder 层一点。由于不再有 Encoder 的编码输入,Decoder 层仅保留了一个带掩码的注意力层,并且将 LayerNorm 层从 Transformer 的注意力层之后提到了注意力层之前。hidden_states 输入 Decoder 层之后,会先进行 LayerNorm,再进行掩码注意力计算,然后经过残差连接和再一次 LayerNorm 进入到 MLP 中并得到最后输出。
由于不存在 Encoder 的编码结果,Decoder 层中的掩码注意力也是自注意力计算。也就是对一个输入的 hidden_states,会通过三个参数矩阵来生成 query、key 和 value,而不再是像 Transformer 中的 Decoder 那样由 Encoder 输出作为 key 和 value。后续的注意力计算过程则和 BERT 类似,只是在计算得到注意力权重之后,通过掩码矩阵来遮蔽了未来 token 的注意力权重,从而限制每一个 token 只能关注到它之前 token 的注意力,来实现掩码自注意力的计算。
另外一个结构上的区别在于,GPT 的 MLP 层没有选择线性矩阵来进行特征提取,而是选择了两个一维卷积核来提取,不过,从效果上说这两者是没有太大区别的。通过 N 个 Decoder 层后的 hidden_states 最后经过线性矩阵映射到词表维度,就可以转化成自然语言的 token,从而生成我们的目标序列。
预训练任务——CLM
Decoder-Only 的模型结构往往更适合于文本生成任务,因此,Decoder-Only 模型往往选择了最传统也最直接的预训练任务——因果语言模型,Casual Language Model,下简称 CLM。
类似于N-gram 语言模型,CLM 则是基于一个自然语言序列的前面所有 token 来预测下一个 token,通过不断重复该过程来实现目标文本序列的生成。例如,CLM 的输入和输出可以是:
input: 今天天气
output: 今天天气很
input: 今天天气很
output:今天天气很好
对于一个输入目标序列长度为 256,期待输出序列长度为 256 的任务,模型会不断根据前 256 个 token、257个 token(输入+预测出来的第一个 token)...... 进行 256 次计算,最后生成一个序列长度为 512 的输出文本,这个输出文本前 256 个 token 为输入,后 256 个 token 就是我们期待的模型输出。
CLM 是更直接的预训练任务,其天生和人类书写自然语言文本的习惯相契合,也和下游任务直接匹配,相对于 MLM 任务更加直接,可以在任何自然语言文本上直接应用。因此,CLM 也可以使用海量的自然语言语料进行大规模的预训练。
GPT 系列模型的发展
GPT-2 的模型结构和 GPT-1 大致相当,只是扩大了模型参数规模、将 Post-Norm 改为了 Pre-Norm(也就是先进行 LayerNorm 计算,再进入注意力层计算)。Pre Norm相对于因为有一部分参数直接加在了后面,不需要对这部分参数进行正则化,正好可以防止模型的梯度爆炸或者梯度消失。
GPT-2 的另一个重大突破是以 zero-shot(零样本学习)为主要目标,也就是不对模型进行微调,直接要求模型解决任务。
GPT-3 则是由于巨大的模型体量使用了稀疏注意力机制来取代传统的注意力机制。
GPT-3提出的 ew-shot 是在 zero-shot 上的改进,旨在提供给模型少样的示例来教会它完成任务。few-shot 一般会在 prompt(也就是模型的输入)中增加 3~5个示例,来帮助模型理解。例如,对于情感分类任务:
zero-shot:请你判断‘这真是一个绝佳的机会’的情感是正向还是负向,如果是正向,输出1;否则输出0
few-shot:请你判断‘这真是一个绝佳的机会’的情感是正向还是负向,如果是正向,输出1;否则输出0。你可以参考以下示例来判断:‘你的表现非常好’——1;‘太糟糕了’——0;‘真是一个好主意’——1。
3.3.2 LLaMA
模型架构——Decoder Only
3.3.3 GLM
GLM 系列模型是由智谱开发的主流中文 LLM 之一.
模型架构-相对于 GPT 的略微修正
使用 Post Norm 而非 Pre Norm。Post Norm 是指在进行残差连接计算时,先完成残差计算,再进行 LayerNorm 计算。由于在残差之后做归一化,对参数正则化的效果更强,进而模型的鲁棒性也会更好。
使用单个线性层实现最终 token 的预测,而不是使用 MLP;这样的结构更加简单也更加鲁棒,即减少了最终输出的参数量,将更大的参数量放在了模型本身;
预训练任务-GLM
GLM 的核心创新点主要在于其提出的 GLM(General Language Model,通用语言模型)任务。
GLM 通过优化一个自回归空白填充任务来实现 MLM 与 CLM 思想的结合。其核心思想是,对于一个输入序列,会类似于 MLM 一样进行随机的掩码,但遮蔽的不是和 MLM 一样的单个 token,而是每次遮蔽一连串 token;模型在学习时,既需要使用遮蔽部分的上下文预测遮蔽部分,在遮蔽部分内部又需要以 CLM 的方式完成被遮蔽的 tokens 的预测。
例如,输入和输出可能是:
输入:I <MASK> because you <MASK>
输出:<MASK> - love you; <MASK> - are a wonderful person
ChatGLM 系列模型也仅在第一代模型使用了 GLM 的预训练思想,从 ChatGLM2 开始,还是回归了传统的 CLM 建模。