LLM 发展简史:带你看懂 NLP 进化史,从 NLP 到 LLM 的非凡旅程(一)!
目录
四、Transformer 和预训练模型的崛起(2020年代)
- Transformer模型
- Transformer(2017年):Vaswani等人提出的Transformer模型,基于自注意力机制,显著提高了并行计算效率和性能。
- BERT(2018年):谷歌提出的双向编码器表示,从双向上下文中学习语义信息,在多项NLP任务上取得了突破性成果。
- 预训练和微调
- GPT系列:OpenAI的GPT模型,通过大规模预训练和任务微调,实现了高质量的文本生成、对话系统等应用。
- T5和BART:其他预训练模型,如谷歌的T5和Facebook的BART,进一步推动了NLP技术的发展。
- Transformer创始八子
- Jakob:提出用自注意力机制替换RNN的想法,并开始评估。
- Ashish与Illia:设计并实现了第一个Transformer模型,并在工作中发挥了关键作用。
- Noam:提出了缩放点积注意力、多头注意力和无参数位置表示,并深入参与工作细节。
- Niki:在原始代码库和tensor2tensor中设计、实现、调优和评估模型变体。
- Llion:尝试新型模型变体,负责初始代码库,以及高效推理和可视化。
- Lukasz和Aidan:设计和实现tensor2tensor,取代早期代码库,改进结果,加速研究。
1. 解读 Transformer
1. 介绍
Transformer 是一种基于注意力机制(Attention Mechanism)的神经网络,最初用于机器翻译任务。由于其高效的并行计算能力和出色的性能。Transformer 在 NLP 领域广泛应用,解决了传统序列模型在长序列处理上的瓶颈问题,显著提升了NLP任务的性能和效率。
2. 结构
-
编码器(Encoder):由多层堆叠的相同结构组成,每层包括多头自注意力机制和前馈神经网络。
- 多头自注意力机制(Multi-Head Self-Attention Mechanism):
- 自注意力机制允许每个位置的表示向量(词或子词)根据序列中的其他位置进行更新。
- 多头机制是指在不同的子空间中同时执行多个自注意力计算,然后将它们的结果拼接并线性变换。
- 注意力层只是做线性组合(加权平均),本身是线性的,不会改变输入数据的线性结构。
- 前馈神经网络(Feed-Forward Neural Network):
- 在每个位置上独立地应用两个线性变换和一个ReLU激活函数,,它负责对每个位置(token)的表示进行非线性变换和特征提取。
第一层线性变换:提取初步特征
非线性变换(如 ReLU):引入非线性,打破线性限制
第二层线性变换:映射回原始维度
- 多头自注意力机制(Multi-Head Self-Attention Mechanism):
-
解码器(Decoder):解码器与编码器类似,但每个解码器层多了一个子层,编码器-解码器注意力机制:
- 多头自注意力机制:
- 类似于编码器的自注意力,但只关注解码器先前位置的表示,确保预测时不会看到未来的信息(通过掩码机制实现)。
- 编码器-解码器注意力机制(Encoder-Decoder Attention Mechanism):
- 这个子层通过注意力机制在解码器的位置和编码器的输出之间建立联系,帮助解码器利用输入序列的信息进行预测。
- 前馈神经网络:
- 与编码器中的前馈神经网络相同。
- 多头自注意力机制:
-
多头自注意力机制(Multi-Head Self-Attention):通过在多个子空间中独立计算注意力,捕捉序列中的依赖关系,并将它们的结果拼接在一起,然后通过线性变换合并,增强了模型的表达能力。具体来说,多头注意力机制包括以下步骤:
- 线性变换:将输入分别线性变换为查询(Query)、键(Key)、值(Value)矩阵。
- 计算注意力:在每个头上计算注意力分数,然后加权求和得到输出。
- 拼接和线性变换:将所有头的输出拼接起来,并通过线性变换得到最终的多头注意力输出。
-
位置编码(Positional Encoding):由于Transformer没有循环和卷积,无法处理序列的顺序信息。为了引入序列中的位置信息,Transformer使用了位置编码(Positional Encoding)。位置编码向量被加到输入嵌入(Input Embeddings)中,使得模型能够区分不同位置的词。
3. 应用及翻译案例
- 自然语言理解:如文本分类、命名实体识别。
- 机器翻译:将一种语言翻译成另一种语言。
- 文本生成:生成高质量的自然语言文本。
Transformer架构被广泛应用于各种NLP任务,包括机器翻译(如Google的BERT和OpenAI的GPT系列)、文本生成、摘要生成和问答系统等。
翻译案例:
Input Embedding 负责将输入的离散词汇(即单词或子词的索引)转换为连续的、密集的向量表示,便于模型进行处理。这是因为深度学习模型(包括Transformer)并不能直接操作词汇表中的离散符号,必须将这些符号映射为可以处理的向量形式。(eg:用于指导生成中文翻译。)
Output Embedding 的作用在于将解码器生成的概率分布(logits)映射回词汇空间,转化为具体的词。尽管这个过程不总是称为 “嵌入” 操作,它实际上是与 Input Embedding 紧密相关的嵌入矩阵的逆过程,通常称为 输出层(Output Layer) 或 投影层(Projection Layer)。(outputs (shifted right)
的来源是目标语言的输出序列,通常是在训练阶段提供的真实翻译(即目标句子),例如机器翻译中的中文句子 “你好吗?”。)
在训练过程中,模型需要大量的句子对(源语言和目标语言)。这对句子是已知的,用于训练模型。
- 源语言(英语): “How are you?”
- 目标语言(中文): “你好吗?”
a. 词汇映射
在解码阶段,Transformer的解码器生成每个时间步的隐藏状态(隐藏向量)。这些隐藏状态并不是具体的词,而是高维的连续向量。
Output Embedding 或 输出层 通过一个线性变换,将这些隐藏状态映射回到词汇表的空间。也就是说,解码器的输出首先是一个连续向量,Output Embedding
将这个向量投影到词汇表的维度上,从而得到每个词的概率分布
。b. 预测下一个词
- 解码器输出的向量通过 线性层 和 Softmax层 转换为一个词汇表大小的概率分布,每个词对应一个生成的概率。
- 模型根据这些概率选择下一个词,从而生成整个序列。
在Transformer模型中,位置编码(Positional Encoding, PE)用于向模型中注入序列中各个位置的信息,以弥补模型缺乏对序列顺序的感知。Transformer模型在处理序列时,采用的是自注意力机制(Self-Attention Mechanism),这种机制并不像传统的循环神经网络(RNN)一样逐个时间步处理数据,而是将序列的所有元素同时输入。因此,模型本身并没有顺序感知能力,需要通过位置编码来告诉模型每个位置的相对或绝对位置信息。
计算1,编码器基于:自注意力机制,前馈神经网络对“英文待翻译的数据”进行编码(待译的英文编码结果)
计算2,解码器基于:带有掩码的自注意力机制对“中文标注的数据”进行编码(标注的中文编码结果)
当解码器运行时,它以自回归方式(Autoregressive)生成序列:
计算3,解码器的第二个注意力层:对两组数据一起解码,得到解码器的最终输出
( ̄︶ ̄)↗ 精讲堂
多头自注意力机制:Q、K、V 三个线性层会分别将输入线性变换为查询(Query)、键(Key)、值(Value)矩阵。通过在多个子空间中独立计算注意力,捕捉序列中的依赖关系,并将它们的结果拼接在一起,然后通过线性变换合并,增强了模型的表达能力,最终的多头注意力输出。
WQ,WK,WV 是训练过程中学习到的权重矩阵,它们的尺寸取决于输入向量的维度与 Q、K、V 的输出维度。
多头:同时通过多个“自注意力机制”,进行特征提取
编码器中自注意力机制的计算过程:输入的数据 ”X词向量矩阵“ (是经过位置编码后的“are you ok ?”)
X会分别和Q、K、V三个线性层会分别将输入线性变换,得到三组结果qx、kx、vx。
后Attention(Q,K,V) 对q、k、v三组结果进行选择和融合,得到一个最终的注意力结果。
最后使用线性层Linear将多个自注意力结果合并
残差(Add & normal)
所谓残差就是在经神经网络多层传递后加上最初的向量。作用是当网络层级深时可以有效防止梯度消失。
前馈神经网络层
Transformer中所谓的前馈神经网络就是MLP( Multi-Layer Perceptron 多层感知机)的结构。唯一值得一提的是在这个MLP中,输入向量和输出向量是一样的,中间隐藏层的维度可随意调整。
对自注意力的输出进行进一步的非线性变换。
将高维表示进一步处理以捕捉更复杂的特征。
e.g.
左图:线性模型彻底失败
- 它只能画“直线”决策边界
- 但数据是“同心圆”,根本无法用直线分隔
- 所以几乎全错分类
右图:带非线性的神经网络
- 决策边界是“圆形”的!
- 成功区分了内圈和外圈
- 这是非线性激活(比如 ReLU)赋予的强大拟合能力
(o゚v゚)ノ 小白课堂:
🔥 Transformer 时代(2017 - 2020)
Transformer = 彻底淘汰 RNN/LSTM,计算更快、效果更好!
📌 2017 年,Google 研究团队发表《Attention Is All You Need》,提出 Transformer。
🔹 Transformer 为什么比 LSTM 强?
- 不按顺序读取文本(可以并行处理)
- LSTM 需要一个词一个词地读,而 Transformer 可以同时处理整段话,速度更快。
- 自注意力机制(Self-Attention)
- 让计算机理解哪个词和哪个词关系更紧密。
- 例子:
- “小明出生在中国,他会说中文。”
- Transformer 知道“他”指的是“小明”,不会误解。
🔹 代表性 NLP 模型
- BERT(2018, Google)
- 可以双向理解句子(不像 GPT 只看前面的词)。
- 例子:
- “苹果是一家公司” vs “苹果是一种水果”
- BERT 能区分这两种情况,因为它可以同时看句子的前后文。
- GPT-3(2020, OpenAI)
- 基于 Transformer,擅长写文章、对话、编程。
- 例子:
- “写一首关于春天的诗” → GPT-3 生成一首完整的诗。
✅ Transformer 适用于所有 NLP 任务:翻译、问答、对话、代码生成、写作。
2. 详细流程整理 (e.g: 翻译)
整体流程概述
-
输入准备
- 分词
- 输入嵌入
- 位置编码
-
编码器
- 多层编码器结构
- 多头自注意力机制
- 前馈神经网络
- Add & Norm
-
解码器
- 输入准备
- 多层解码器结构
- Masked Multi-Head Self-Attention
- Encoder-Decoder Attention
- 前馈神经网络
- Add & Norm
- 线性变换和 Softmax
-
生成输出
- 逐步生成目标序列
1. 输入准备
a. 分词
在处理句子之前,首先需要对句子进行分词。这一步骤将句子转化为模型可以理解的单词或子词表示。
- 输入句子:“How are you?”
- 分词结果:
["How", "are", "you", "?"]
b. 输入嵌入(Input Embedding)
将分词结果转换为向量表示。这通常通过查找预训练的嵌入矩阵来完成。
- 嵌入后得到的表示(假设是随机值):
E("How")
E("are")
E("you")
E("?")
c. 位置编码(Positional Encoding)
由于 Transformer 模型没有顺序信息,因此需要添加位置编码来保留单词在句子中的顺序。
- 对每个单词的嵌入向量加上相应的位置信息,形成新的嵌入:
PE(0) + E("How")
PE(1) + E("are")
PE(2) + E("you")
PE(3) + E("?")
2. 编码器
编码器由多个相同的层堆叠而成,每层具有以下几个关键组件:
a. 多头自注意力机制(Multi-Head Self-Attention)
- 每个词向量会通过自注意力机制计算与输入序列中其他词的关系,生成上下文表示。
- 例如,对于 “How”,模型计算与 “are”、“you” 和 “?” 的注意力:
Attention("How", "How")
Attention("How", "are")
Attention("How", "you")
Attention("How", "?")
b. Add & Norm
- 残差连接:自注意力的输出与输入进行相加。
- 层归一化:对相加后的结果进行归一化,防止信息损失和数值波动。
c. 前馈神经网络(Feed Forward Network, FFN)
- 自注意力层的输出会通过一个前馈神经网络,这个网络通常包含两个线性变换和一个激活函数(例如 ReLU)。
d. 再次 Add & Norm
- 前馈神经网络的输出会与进入该层的输入进行残差连接,随后进行归一化。
e. 多层编码器输出
- 这一过程会在多个编码器层中重复,每层的输出作为下一层的输入,逐步提取输入句子的深层语义信息。
- 最后,编码器的输出是对整个输入句子的上下文表示,这些输出会传递给解码器。
3. 解码器
解码器的 Output Embedding 是在编码器输出后运行的
解码器也由多个相同的层堆叠而成,每层的处理流程如下:
a. 输入准备
解码器的输入是目标语言的嵌入。对于翻译任务,初始输入是一个特殊的开始标记(例如 <START>
),并且目标语言序列会右移。
- 目标语言序列(例如 “你好吗?”):
["你", "好", "吗", "?"]
- 右移后的序列:
["<START>", "你", "好", "吗"]
b. Masked Multi-Head Self-Attention
- 解码器的第一层只基于当前和之前生成的词(即
<START>
)进行自注意力计算,通过掩码机制保证模型无法看到未来的词。
c. Add & Norm
- 残差连接与归一化,处理过的结果为下一层的输入。
d. Encoder-Decoder Attention
- 解码器通过与编码器的输出结合,进一步考虑输入的上下文信息。例如,生成 “你” 时,解码器会利用编码器的上下文向量,调整生成策略。
e. 前馈神经网络(Feed Forward Network, FFN)
- 将解码器的输出通过前馈神经网络进行非线性变换。
f. 再次 Add & Norm
- 对当前层的输出进行残差连接和归一化处理。
4. 生成输出
a. 线性变换和 Softmax
- 解码器的最后输出通过一个线性变换映射到目标语言词汇表中,并使用 Softmax 计算每个词的概率分布。
- 例如,输出概率分布:
P("你")
P("好")
P("吗")
P("?")
b. 逐步生成目标序列
- 解码器根据概率分布选择最高概率的词作为输出,通常使用贪心算法(选择最高概率的词)或者束搜索(Beam Search)来生成更自然的句子。
- 生成 “你”:输入
<START>
,结合编码器的上下文,输出第一个词。 - 输入 “你”:再生成 “好”。
- 输入 “好”:再生成 “吗”。
- 输入 “吗”:再生成 “?”。
最终输出:
- 完整的目标语言句子为 “你好吗?”。
Decoder输出流动过程
第一步:生成第一个词
- Decoder 的初始输入是
<sos>
(开始符号)。- Masked Multi-Head Attention:此时没有历史的目标语言词,因此它对
<sos>
的自注意力是没有实际作用的。- Encoder-Decoder Multi-Head Attention:Decoder 使用 Encoder 的输出(源语言信息)来指导生成第一个词。
- 线性变换 + Softmax:最终的输出会经过线性变换层,然后通过 Softmax 计算出下一个词的概率分布,并选出最可能的词(例如 “你”)。
第二步:生成下一个词
- 输入*:现在 Decoder 的输入是之前生成的词(例如
<sos>, 你
)。**- Masked Multi-Head Attention**:此时会计算 “你” 和
<sos>
之间的依赖关系,避免看到 “好” 和 “吗”。- Encoder-Decoder Multi-Head Attention:再次使用 Encoder 的输出(源语言信息)来帮助生成下一个目标词(例如 “好”)。
- 线性变换 + Softmax:计算下一个目标词的概率,并选出最可能的词。
第三步:生成下一个词
- 输入*:Decoder 的输入现在是之前生成的部分(例如
<sos>, 你, 好
)。**- Masked Multi-Head Attention**:计算目标语言中“你” 和 “好” 之间的依赖关系。**
- Encoder-Decoder Multi-Head Attention**:利用源语言 “How are you?” 的信息,帮助生成最后的目标词 “吗”。**
- 线性变换 + Softmax**:输出下一个词的概率,生成 “吗”。
总结
通过这个详细的流程,Transformer 模型在处理输入句子(如 “How are you?”)时,首先经过编码器提取出深层语义信息,然后利用解码器逐步生成目标语言序列(如 “你好吗?”),确保每个步骤都基于上下文和历史信息,保持信息的一致性与准确性。编码器和解码器的多层结构使得模型能够处理复杂的语言关系,提升翻译的效果。
编码器和解码器的逐层处理
- 顺序执行:
- 在编码器中,第一层的输出会作为第二层的输入,第二层的输出会作为第三层的输入,以此类推,直到最后一层。这意味着每一层都依赖于前一层的计算结果,无法并行执行。
- 解码器也是类似的,第一层处理的结果必须传递给第二层,直到所有层都完成。
- 多层结构的作用:
- 深层特征提取:通过多层堆叠,模型可以在不同的层次上捕捉到输入数据的各种特征和关系。较低层可能学习到基本的语法和词汇关系,而较高层则能够理解更复杂的语义关系。
- 信息整合:每一层的输出不仅仅是简单的特征提取,而是将前一层的上下文信息进行整合和转换。多层结构允许模型逐步加深对输入的理解,并构建更加丰富的表示。
- 非线性变换:多层结构通过前馈神经网络的非线性变换,使得模型能够学习到复杂的映射关系。每层中的激活函数(如 ReLU)引入了非线性,使得模型能够处理复杂的数据模式。
- 残差连接的作用:
- 每一层的输出与输入进行残差连接(Add & Norm)有助于缓解深度网络中的梯度消失问题。通过这种方式,模型可以更容易地学习到每一层的变化,从而加快收敛速度。
- 残差连接确保了即使是较深的网络也能够保留原始输入信息,使得信息在经过多层处理后不会丢失。
逐层处理的价值保留
- 层间信息传递:逐层传递的信息不仅是每层的输出,而是每层输出与前一层的输入相结合,形成了一种信息的传递机制。这样可以确保不同层次的特征可以被综合考虑。
- 逐步细化:每一层对输入的处理都是在前一层的基础上进行的,这使得模型能够在每一步逐步细化输入的表示,直到最后一层生成对整个输入的全面理解。
例子说明
以翻译任务为例,考虑输入句子 “How are you?”。通过编码器的多层结构,模型可能在不同层次上学习到以下信息:
- 第一层:可能关注单词间的基本关系,如 “How” 与 “are” 的关系。
- 第二层:可能开始理解上下文,处理 “How are” 的短语结构。
- 第三层:更高层可能理解句子的整体含义,即询问状态的表达。
最终,编码器的最后一层生成的表示将包含对整个句子 “How are you?” 的深层理解,这些信息将传递给解码器以生成目标语言的输出。
因此,尽管编码器和解码器的每一层不是并行计算的,但这种逐层的结构和处理方式能够有效地提取和整合输入数据的特征,确保信息在多层网络中的有效保留和转换,从而提高模型的性能。
3. Transformer 编码器 & 解码器并行性对比
(~ ̄▽ ̄)~ 训练阶段 vs. 推理阶段:
计算步骤 | 训练阶段(并行) | 推理阶段(顺序/并行) |
---|---|---|
编码器输入 | ✅ 整个源序列一次性输入(并行) | ✅ 整个源序列一次性输入(并行) |
源序列的 Embedding | ✅ 一次性计算整个输入序列的 Embedding | ✅ 一次性计算整个输入序列的 Embedding |
编码器自注意力(Self-Attention) | ✅ 整个输入序列同时计算(并行) | ✅ 整个输入序列同时计算(并行) |
编码器前馈神经网络(FFN) | ✅ 所有 token 并行计算 | ✅ 所有 token 并行计算 |
编码器输出 | ✅ 并行输出所有 token 表示 | ✅ 并行输出所有 token 表示 |
— | — | — |
解码器输入 | ✅ 整个目标序列一次性输入(Teacher Forcing) | 🚫 逐步输入(从 <start> 开始,生成一个词后再输入下一个) |
目标词的 Embedding 计算 | ✅ 整个目标序列同时计算 | 🚫 每次只计算当前时间步的目标词 |
Masked Self-Attention(解码器自注意力) | ✅ 计算整个目标序列(并行) | 🚫 只能看到已生成的部分,必须逐步计算 |
编码器-解码器注意力 | ✅ 所有目标词同时访问编码器输出(并行) | ✅ 所有目标词都可以并行访问编码器输出 |
解码器前馈神经网络(FFN) | ✅ 所有目标 token 一起计算(并行) | ✅ 当前时间步的 token 可以并行计算 |
Softmax 预测下一个词 | ❌ 不需要(直接使用 Teacher Forcing 提供的目标词) | ✅ 每次预测一个新词 |
序列生成方式 | 一次性输出整个目标序列(Teacher Forcing) | 逐步输出,每次预测一个新词,直到 <EOS> |
总结:NLP 综合比对
…(* ̄0 ̄)ノ 特性比对 CNN、RNN、Transformer:
特性 | CNN | RNN (LSTM / GRU) | Transformer |
---|---|---|---|
适用数据类型 | 图像、视频 | 序列数据(文本、时间序列) | 序列数据(文本)、图像等 |
主要结构 | 卷积层、池化层、全连接层 | 循环层(隐藏层)、LSTM、GRU | 编码器、解码器、多头自注意力机制 |
处理能力 | 局部特征提取、空间特征 | 序列依赖、时间特征 | 全局依赖关系、高效并行计算 |
计算复杂度 | 相对较低 | 处理长序列时较高,难以并行化 | 相对较高,但可并行处理 |
训练难度 | 易于训练 | 难以训练长距离依赖、梯度消失问题 | 易于训练,依赖大量数据和计算资源 |
代表应用 | 图像分类、物体检测、图像分割 | 机器翻译、语音识别、文本生成 | 机器翻译、文本生成、自然语言理解,图像处理、多模态任务,聊天机器人。 |
典型模型 | TextCNN | 基本RNN、LSTM、GRU | BERT、GPT系列、T5、Vision Transformer、DeepSeek |
结论:卷积神经网络(CNN)、循环神经网络(RNN)和 Transformer 各有其独特的结构和应用场景。CNN 擅长处理图像数据,RNN 适用于序列数据,尤其是长距离依赖任务,而 Transformer 则凭借其高效的并行计算能力和卓越的性能,成为自然语言处理领域的主流模型。在实际应用中,选择合适的模型需要根据具体任务和数据特点进行综合考虑。
LLM 发展简史:带你看懂 NLP 进化史,从 NLP 到 LLM 的非凡旅程(三)!