前言:
该部分[1]主要是对Transformer的变体路线——Encoder-Decoder架构、Decoder-only架构仅解码器架构的描述,介绍了2种主要的Encoder-Decoder架构模型(T5、BART)与3种主要的Decoder-only架构模型(GPT、 LLaMA、GLM)。所以首先对“多头放缩点积掩码自注意力机制”进行回顾,然后对解码器模块进行分析,然后以Encoder-Decoder、Decoder-only概念模型作为主要研究对象分析,并梳理Encoder-Decoder、Encoder-only相关模型的研究。
1 多头放缩点积掩码自注意力机制
首先是注意力机制,然后采用放缩点积的形式进行相似度计算,采用多头的形式并行,最后Q与K/V来自同一序列,因此是“自注意力”。同时采用掩码来遮盖住未来的信息,让模型只能通过“要预测目标”之前的token,来预测当前目标token。为了便于称呼,后续简称为“掩码自注意力”。
代入Task2博客“2 多头点积注意力”(datawhale:Happy-LLM 打卡-Task02:注意力机制与Transformer的Encoder-Decoder架构《Attention Is All You Need》-CSDN博客)中的具体计算过程,可以得到如下计算过程:
2 解码器模块
解码器模块,由N个解码器层堆叠而成。每个解码器层由一个掩码多头自注意力层(MMHA层)、一个多头交叉注意力层(MHCA层)与一个前馈神经网络层(FFN层)构成。输入文本序列,需要的输出是最后一层的向量表示,作为以已生成序列为主体、充分融合了输入序列的信息。如下图所示:
可以看出,解码器层先在已生成序列的token上,对每个位置上之前的token进行信息融合(MMHA层,单向,只能与当前及之前的token交互),然后融合来自输入序列的信息,再对每个token的特征进行非线性变换的语义提炼(FFN层,单个token特征变换)。每一个token都与当前及之前的token、以及来自编码器的token进行了充分的交互,最终得到只包含上文信息、输入序列信息的向量表示。每个位置的token向量,目的是负责预测它右边那个token是什么(根据上文、参考文,预测下文)。
可以看出,Transformer的解码器中有交叉注意力部分,依赖于来自编码器的信息,分为了“上文”、“参考文”、“下文”,这与其定位的翻译问题密切相关。翻译正是需要不断对照原文,根据已经翻译的内容继续翻译输出。实现了对“参考文”的充分理解,以及对下文的生成。
3 Encoder-Decoder架构
Transformer在2017年提出,本身就是Encoder-Decoder架构。2019年,Google 提出了 T5(Text-to-Text Transfer Transformer)。按照Transformer的Encoder-Decoder架构,即为“Encoder-Decoder 编码器-解码器”架构了,其进展到预训练-微调范式反而在Encoder-only与Decoder-only之后了(参数过多?)。对语言上的“Encoder-Decoder”架构给出概念定义:
由多层 Transformer 编码器与多层 Transformer 解码器堆叠组合构成,通过去噪序列到序列重构类任务进行自监督预训练,同时具备输入序列双向上下文建模与目标序列自回归生成能力的预训练语言模型。核心是“双向编码与自回归解码”。
其特点包括:
- 架构:符合Transformer典型结构,多层 Transformer 编码器与多层 Transformer 解码器堆叠,编码器层包含多头自注意力(MHA)与前馈神经网络(FFN)两个核心子层,解码器层包含掩码多头自注意力(MMHA)、多头交叉注意力(MHCA)与前馈神经网络(FFN)三个核心子层,并采用词嵌入(token embedding)与位置编码(positional encoding,也叫位置嵌入position embedding)表示输入的内容。通过编码器保留了类似 BERT 的双向语义理解能力,又通过解码器训练了类似 GPT 的自回归生成能力。
- 预训练任务:采用去噪序列到序列重构(Denoising Sequence-to-Sequence Reconstruction)的预训练任务,可归纳为三步:扰动加噪、双向编码、自回归重构。首先对原始文本施加某种形式的 “破坏 / 噪声”,得到被扰动的输入序列,然后将被扰动的序列送入编码器,由编码器进行双向上下文建模,提取完整的语义表示,最后用解码器以自回归的方式,基于编码器的语义输出,还原出目标文本。
- 下游适配:编码器对完整输入文本进行双向语义编码得到全局语义表示,解码器基于该表示自回归生成完整的目标输出文本,通过“输入文本 - 输出文本”的形式进一步微调。
“Transformer-Encoder-Decoder”的典型架构图,,就是Transformer的架构图了。
将图中“Inputs”称为“参考文”,“Outputs(shifted right)”称为“上文”,“Output Probabilities”称为“下文”,“Outputs”合称为“目标文”。
对于只针对翻译任务的Transformer原始模型而言,就是深度理解根据“参考文”,根据“上文”,不断生成“下文”,从而实现将“参考文”翻译为“目标文”。
对于预训练的“Encoder-Decoder”架构而言有所不同。
在预训练阶段,对文本进行扰动,添加噪声(说白了就是破坏完好的文本序列,MLM其实也算)。然后将破坏后的文本作为“参考文”,送到编码器中提取深层次语义,交给解码器进行预测,得到对“下文”的概率预测矩阵P。
解码器部分应该输入“上文”,真正输入的是“目标文”。由于掩码自注意力的原因,在内部将其掩码成了“上文”,实际上就是对当前token及之前的token进行交互。
真实标签,也就是训练时候的'“下文”,来源于要输出的序列左移一位。概率预测矩阵P与真实标签进行交叉熵的损失函数计算,只有在标签对应位置的 token 才会产生损失并求平均。
输出头得到预测概率矩阵P,即对象A的m个位置,每个位置上是对下一个词的预测,表现为对整个词表的概率分布p。
注:这里可以参考“Task03”中的“4 输出头”与“5 预测概率矩阵P的使用”。(datawhale:Happy-LLM 打卡-Task03:2.3搭建一个Transformer(tokenizer分词器、Embedding 层token嵌入、位置编码、输出头)-CSDN博客)
以Transformer与T5为例,预训练的输入、输出如下图所示:
其中,“<pad>”代表起始,“<EOS>”与“</s>”代表结束,“<X>”与“<Y>”是T5使用的“哨兵标记”,代表被遮盖了需要预测的位置。
在下游任务阶段,可以通过“输入文本-输出文本”的形式进一步微调。比如进行翻译任务,“参考文”为待翻译的内容,“上文”为译文,“下文”(也就是真实标签)是译文左移一位。
推理的时候,根据“参考文”,将起始标记作为最初的“上文”输入,解码器便自回归地逐个输出“下文”,并将已经输出的“下文”逐个拼接到“上文”,直到输出结束标记或者达到最大长度。
以翻译为例,参考文为“I love learning.”,上文先传入“<pad>”,解码器输出预测概率矩阵P1,只有一行p1,取出得到“我”。然后将“我”拼接到上文,成为“<pad>我”,然后传入解码器,输出预测概率矩阵P2,有两一行p1、p2,这时候要看预测概率矩阵P2的最后一行p2,代表了对下一个词的预测,应该取出得到“爱”。而p1没有变化,因为掩码的机制,“我”这个后面token的信息不会影响到第一个位置token的预测,p1取出还是会得到“我”。
结构非常好,唯一的问题就是,编码器-解码器架构“太沉重”了,而且根据解码目标更新编码器,个人感觉“太远”了。
- 注:可以看出,解码器在生成的时候会参考来自编码器的深层含义。如果将“编码器”换成图像编码器、音频编码器,,然后通过交叉注意力进行融合,就变成了“跨模态”。
4 Decoder-only架构
Transformer在2017年提出。2018年,OpenAI 选择了 Decoder-only路线,通过将 Decoder 层进⾏堆叠,发布了GPT作为代表性模型。
只使用解码器模块,即为“Decoder-only仅解码器”架构了。需要注意的是,由于没有了来自编码器的信息,所以解码器模块就不需要交叉注意力层了。对语言上的“Decoder-only仅解码器”架构给出概念定义:
仅由多层 Transformer 解码器堆叠构成,通过自回归语言模型(Autoregressive Language Model,AR)预训练任务(或者叫因果语⾔模型,Casual Language Model,CLM)进行自监督预训练,具备自回归预测下一个 token、逐词续写的预训练语言模型。核心是“因果建模”。
其特点包括:
- 架构:采用多层 Transformer 解码器堆叠,每层包含掩码多头自注意力(MMHA)与前馈神经网络(FFN)两个核心子层,并采用词嵌入(token embedding)与位置编码(positional encoding,也叫位置嵌入position embedding)表示输入的内容。
- 预训练任务:采用自回归语言模型(Autoregressive Language Model,AR)(或者叫因果语⾔模型,Casual Language Model,CLM)的预训练任务,从左到右逐词预测,根据上文生成下文,然后把下文拼接到上文继续生成。
- 下游适配:就是进行下一个词的预测输出,然后根据具体任务进行“文本到文本”的微调。
参考Transformer编码器-解码器架构图,给出“Transformer-Decoder-only仅解码器”的典型架构图如下:
- 注:归一化当然可以放到前面Pre-Norm,但是为了与“Transformer编码器-解码器架构图”呼应,仍然保留了放在后面的形式Post-Norm,不影响架构本质,毕竟是概念模型。
将图中“Inputs”称为“上文”,“Output Probabilities”称为“下文”,两者合称“目标文”。
在预训练阶段,将文本交给解码器进行预测,得到对“下文”的概率预测矩阵P。
解码器部分应该输入“上文”,真正输入的是“目标文”。由于掩码自注意力的原因,在内部将其掩码成了“上文”,实际上就是对当前token及之前的token进行交互。
对文本进行左移一位,作为“真实标签”。概率预测矩阵P与真实标签进行交叉熵的损失函数计算。
输出头得到预测概率矩阵P,即对象A的m个位置,每个位置上是对下一个词的预测,表现为对整个词表的概率分布p。
注:这里可以参考“Task03”中的“4 输出头”与“5 预测概率矩阵P的使用”。(datawhale:Happy-LLM 打卡-Task03:2.3搭建一个Transformer(tokenizer分词器、Embedding 层token嵌入、位置编码、输出头)-CSDN博客)
预训练的输入、输出如下图所示:
在下游任务阶段,可以通过“输入文本-输出文本”的形式进一步微调,核心还是“预测下一个词”,只是数据格式不同。比如进行翻译任务,“上文”为待翻译的内容与译文拼接而成的完整序列,“下文”(也就是真实标签)是译文左移一位,训练时只会对目标输出部分(译文、答案)计算损失,前面的输入前缀(待翻译原文、问题)不参与损失计算 。或者说,进行问答对形式的监督学习。让模型学会遵循人类的指令格式、输出符合预期的回答。
推理的时候,将输入内容(比如用户问的问题)作为最初的“上文”输入,解码器便自回归地逐个输出“下文”,并将已经输出的“下文”逐个拼接到“上文”,直到输出结束标记或者达到最大长度。对于问答问题,最后返回给用户的就是输出的“下文”。
- 注1:可以看出,这种架构与N-gram模型高度契合,核⼼思想都是基于⻢尔可夫假设,认为⼀个词的出现概率仅依赖于它前⾯的N-1个词,就是通过前面的N-1个词去推断第N个词。
- 注2:在有的文献或者地方,又被称为了语言建模(Language Modeling, LM)任务(狭义上的,但其实指的就是因果语言建模 CLM,自左向右的语言建模)。经典定义下的语言建模概念,指的是根据前文预测文本序列中下一个词的概率分布,语言模型就是实现这一任务的系统。但是由于有了“掩码语言模型”,,可能语言建模、语言模型的概念需要进一步延伸了。比如个人认为,广义的文本语言建模应当是“学习大规模文本数据,对自然语言序列的概率分布进行参数化建模”。(定语越来越多了...毕竟语言学认为语言有声音和文本两种形式...)
具体而言,“掩码自注意力”是核心,它赋予了Decoder-only架构模型四大特点。
(1)学习信号密集:通过“上三角矩阵”方法遮蔽了未来信息,能够把一个由m个token组成的序列,变成m条监督数据。比如“我爱学习”假设是4个token,那么就会有4条训练数据,在训练的时候是并行的,每个位置都预测下一个词,然后计算损失函数,训练数据利用率高。
(2)KV能够缓存:还有由于“上三角矩阵”方法遮蔽了未来信息,历史 token 的 K 和 V 向量不会随后续新 token 的生成而改变。对于第4个token,需要计算1-3个token的KV数据,但是对于第5个token,要计算1-4个token的KV数据,但其实1-3个token的KV数据没有改变。有利于加快推理阶段生成速度,用空间换时间。
(3)注重生成:通过预测下一个词的训练目标,本身就是在不断进行生成,基于前⾯的token来预测下⼀个 token,不断重复。训练与推理的目标对齐,架构本身天然适配生成性质的任务。
(4)便于规模化:通过基础模块堆叠扩大规模,通过简单的上三角矩阵即可实现掩码,有助于做“大”。
5 Encoder-Decoder相关模型
与经典的Tranformer架构相比,在一些分词方法、网络维度、堆叠数量、训练数据、位置编码方式、激活函数使用等细节的不同就不提了。。。主要在预训练方法上差异较大。
5.1 T5
谷歌团队2019年10月份提出[2]。
采用跨度损坏(Span Corruption)的预训练模式。随机选取文本中若干段连续 token(span),将每段整体替换为一个唯一的哨兵特殊标记(如 <X>、<Y>)来进行噪声的添加。解码器按顺序输出所有被遮蔽的片段内容,无需还原完整原文。
采用 Pre-Norm 结构,层归一化放在每个子层的输入之前,并采用了RMSNorm。
5.2BART
Facebook AI 2019年10月份提出[3]。
采用全序列去噪重构的预训练模式。组合多种文本破坏策略,包括单个 token 掩码、随机删除 token、打乱句子顺序、长文本旋转、文本片段填充等。解码器需要还原出完整的原始干净文本,而非仅被破坏的部分。
如摘要所言:“采用基于Transformer的标准神经机器翻译架构”(当然在一些细节上调整了)
It uses a standard Tranformer-based neural machine translation architecture
6 Decoder-only相关模型
6.1 GPT
2018 年 6 月,OpenAI 提出[4],《Improving Language Understanding by Generative Pre-Training》。
其实是更早的“预训练-微调”范式,“生成式”指的就是自回归地训练,从左到右逐词预测。如下面的论文原图所示,左边是预训练的自解码器架构,右边是在分类、文本语义、相似性、多分类等问题上进行微调。蓝色的算是特殊标记,辅助把结构化的数据转化为单个序列的形式。
GPT1、2、3非常有意义,推荐看原文。。或者这个总结GPT-1/GPT-2/GPT-3简介
2019年《Language Models are Unsupervised Multitask Learners》https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf
2020年《Language Models are Few-Shot Learners》[2005.14165] Language Models are Few-Shot Learners
从“预训练-微调”,到多任务、不需要微调,再到0样本、单样本、少样本的上下文学习(in-context learning)。GPT3就基本算是“大语言模型”了,准确的说是“大 自回归(仅解码器) 语言模型”。
然后到2022年人类对齐,22年底ChatGPT面向社会开放,确立了“大 [自回归(仅解码器)] 语言模型”的技术主流地位与应用广泛落地。
6.2 LLaMA
2023年2月Meta(原Facebook)提出[5]。《LLaMA: Open and Efficient Foundation Language Models》
最早复刻GPT并开源的,而且有小规模版本。对于研究非常有意义,开源可复现呐。
归一化改进为RMSNorm,位置编码改进为RoPE,激活函数改进为SwiGLU,AdamW优化器、学习率等等,还有许多工程上的优化。
6.3 GLM
清华大学2022年提出[6](现在也可以叫智谱公司了)《GLM: General Language Model Pretraining with Autoregressive Blank Infilling》
22年10月论文《GLM-130B: An Open Bilingual Pre-trained Model》,预训练语言模型[2210.02414] GLM-130B: An Open Bilingual Pre-trained Model
23年3⽉发布了第⼀个中⽂开源大语言模型 LLM ChatGLM-6B。[2406.12793] ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools
(当然,百度其实也挺早,,2019年3月ERNIE 1.0就是自编码架构,2021年7月ERNIE 3.0就积累不少了。。。[2107.02137] ERNIE 3.0: Large-scale Knowledge Enhanced Pre-training for Language Understanding and Generation)
架构还属于自解码器,主要是预训练方法很特殊,叫做“自回归空白填充”(Autoregressive Blank Infilling),结合了MLM与CLM的思想。(特别像T5的预训练方法放到自回归架构上...)
具体而言,把文本进行破坏,然后要求模型从被破坏的文本中以自回归方式预测片段中的缺失 token。在预测一个片段的缺失 token 时,模型可以访问被破坏的文本和之前预测的片段。(把Encoder-Decoder架构的“参考文”与“上文”放在了一起...)然后为了遮蔽,使用了二维位置编码,和比较特殊的掩码自注意力处理方法。
具体的中文翻译可以看这篇https://juejin.cn/post/7350482843533410342
6.4 其他
2023 年 9 月,阿里通义实验室Qwen技术报告,以及后续极为丰富的生态。
Deepseek从第一代的复刻,到R1的训练方法。
这些应当归于“大模型”的研究范畴了。。。
预训练得到的是“预训练基础模型”,日常使用的需要经过监督微调、强化学习对齐等等。
[1]GitHub - datawhalechina/happy-llm: 📚 从零开始构建大模型 · GitHub
[2][1910.10683] Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
[3][1910.13461] BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension
[4]https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf
[5][2302.13971] LLaMA: Open and Efficient Foundation Language Models
[6]GLM: General Language Model Pretraining with Autoregressive Blank Infilling - ACL Anthology