如今,几乎每个人都在日常生活中使用ChatGPT来获取信息。但你相信吗?正是Google在2017年发表的研究成果孕育了ChatGPT背后的架构,并引发了Google内部的红色警报,促使他们匆忙开发Bard和Gemini,加入这场GenAI(生成式人工智能)的竞赛。这篇文章将深入探讨Transformer架构,它正是Google这篇论文的核心,也是包括ChatGPT在内的众多大型语言模型(LLMs)的基石。

Google的困境与Transformer的诞生

在2017年之前,Google的翻译系统面临着挑战。当时的行业标准是循环神经网络(RNNs),但对于长句子来说,RNNs的速度非常慢,因为它们需要按顺序翻译每个单词,而且难以在长序列中保持上下文。为了寻找替代方案,Google的科学家探索了卷积神经网络(CNNs),虽然CNNs在单词的并行化处理方面表现更好,但仍然无法满足需求。最终,Google的工程师提出了一个大胆的想法:完全基于自注意力机制。2017年上半年,Google的研究团队发布了一篇名为“Attention is all you Need”的深度学习白皮书,正式推出了Transformer架构

Transformer架构:LLM的核心动力

Transformer架构在训练速度和效率上都远超RNNs,并且具有良好的并行化能力。顾名思义,注意力机制Transformer的核心。我们熟知的OpenAI的聊天机器人ChatGPT,其GPT正是“Generative Pre-trained Transformer”(生成式预训练Transformer)的缩写。其中,Generative表示输出是由ChatGPT生成的,Pre-trained表示输出是基于预训练模型生成的,而Transformer则表示ChatGPT使用了Transformer架构

我们常常将ChatGPT这样的LLM想象成阿拉丁神灯一样的魔法,但实际上,它只是一个花哨的“下一个词预测器”。LLM并非像人类一样理解完整的句子结构,而是通过循环预测的方式逐字生成答案。例如,当你向LLM提问“哪个宝可梦最受粉丝欢迎?”时,它的回答过程如下:

  • Query: “哪个宝可梦最受粉丝欢迎?”
  • Response: “是”
  • Query: “哪个宝可梦最受粉丝欢迎? 是”
  • Response: “路卡利欧。”
  • Query: “哪个宝可梦最受粉丝欢迎? 是 路卡利欧。”
  • Response: {END}

这种“下一个词预测”的能力使得ChatGPT能够完成撰写文章、故事、诗歌、回答问题、翻译、聊天等多种任务。一个简单的“下一个词预测器”的例子是搜索引擎上的搜索自动完成功能。另一个例子是手机键盘上的联想输入。虽然这些例子能够保持对小段文字的上下文理解,但在处理长序列时,它们往往无法维持上下文。而基于Transformer架构的“下一个词预测器”则更加高效,能够很好地处理长序列,并保持上下文的连贯性。

Transformer架构的组成部分

Transformer架构可以分解为以下几个关键阶段:

  1. Tokenization(分词)
  2. Vector Embeddings(向量嵌入)
  3. Positional Encodings(位置编码)
  4. Attention(注意力机制)
    • Self Attention(自注意力机制)
    • Multi Head Attention(多头注意力机制)
  5. Transformer Blocks(Transformer块)
  6. Linear and Softmax Layers(线性层和Softmax层)

接下来,我们将逐一深入了解这些阶段。

1. Tokenization(分词)

虽然人类能够轻松理解和处理完整的句子,但LLM却并非如此。在Transformer架构中,文本会被分解成更小的单词或字符序列,并将这些序列转换成数字,这些数字被称为“Token”,这个过程被称为“Tokenization”(分词)。

例如,对于文本“Hi, How are you?”,使用ChatGPT 4o模型进行Tokenization,会得到以下结果:

import tiktoken

enc = tiktoken.encoding_for_model("gpt-4o")
text = "Hi, How are you?"
token = enc.encode(text)
print("Tokens: ", token)

# Output: Tokens:  [12194, 11, 3253, 553, 481, 30]

这意味着:

  • Hi => 12194
  • , => 11
  • how => 3253
  • are => 553
  • you => 481
  • ? => 30

不同的LLM模型,包括Google的开源LLM模型Gemma,其Tokenization的方式也可能不同。比如Gemma会将“Hi”分解为两个token:2 和 2151。

2. Vector Embeddings(向量嵌入)

Vector Embeddings是用于表示token的高维矩阵,它们充当数值表示,以便为数据中的对象分配语义意义和关系。例如,“法国”到“巴黎”的关系与“德国”到“柏林”的关系相同(都是国家到首都的关系),因此它们在向量空间中拥有相似的向量。

类似地,“男人”到“女人”的关系与“父亲”到“母亲”的关系相同(都是相反性别),因此它们在向量空间中也拥有相似的向量。在Vector Embeddings过程中,每个token ID通过一个嵌入层转换为一个稠密向量,该嵌入层是一个大小为[V × d]的矩阵,其中V是词汇表大小(即模型识别的唯一token数量),d是嵌入维度。

你可以使用OpenAI API (付费) 或Gemini API (有免费额度) 来查看ChatGPT和Gemini的Vector Embeddings

3. Positional Encodings(位置编码)

由于Transformer并行处理序列中的token,我们需要一些关于它们在序列中的位置信息,以保持上下文。如果没有位置信息,“不饿但困”和“不困但饿”将变得相同,但这两个句子完全不同。因此,我们提供一些额外的数值表示来提供位置信息,这种数值表示被称为“Positional Encodings”(位置编码)。

例如,经过Positional Encoding后,“不饿但困”可能会变成“不[0] 饿[1] 但[2] 困[3]”(仅用于可视化)。这种编码使用正弦和余弦函数:

PE(pos, 2i) = sin(pos/10000^(2i/d_model))

PE(pos, 2i+1) = cos(pos/10000^(2i/d_model))

4. Attention(注意力机制)

AttentionTransformer的核心。作为一种机器学习技术,它帮助模型重视输入序列的相关部分。与RNNs不同,它通过动态加权输入对象的重要性来实现并行计算。给定一个输入序列,注意力机制计算单词之间的分数,以确定它们的上下文相关性。这些分数加权来自其他token的贡献,使模型能够专注于关键信息,同时忽略无用的噪声。注意力机制对于在大型序列中进行上下文理解至关重要。

Self Attention(自注意力机制)

Self Attention(自注意力)是应用于单个序列中的一种注意力机制。它计算所有输入元素的加权和,权重根据它们的相互关系动态确定。这允许捕获句子中远处单词之间的依赖关系。在这个过程中,输入token的权重是根据输入序列中的token分配的。它可以被描述为将“查询”(query)和一组“键-值”(key-value)对映射到输出。输出是“值”的加权和,权重由“查询”与相应“键”的兼容性函数确定。

Transformer中,对于每个输入token的嵌入,通过将嵌入乘以学习的权重矩阵生成三个不同的向量:

  • Query (Q) vector(查询向量): 表示特定token正在“寻找”的信息。它用于计算其他token如何影响其含义或上下文。
  • Key (K) vector(键向量): 表示每个token“包含”的信息。查询向量和键向量的点积用于计算注意力权重,表明键token与查询token的相关程度。
  • Value (V) vector(值向量): “返回”来自每个键的信息,并按其相应的注意力权重进行缩放。与查询强烈对齐的键的贡献被更重地加权,允许模型专注于最相关的上下文信息。

注意力权重是通过将查询向量与所有键向量的点积,除以键向量维度的平方根(以稳定梯度),然后应用softmax函数将这些分数标准化为概率来计算的。最后,这些概率用于计算值向量的加权和,从而产生一个捕获原始token上下文表示的新向量。

公式如下:

Attention(Q, K, V) = softmax(QKT / √dk)V

其中,dk 是键/查询的维度。

例如,在使用“树木”这个词的两个句子中:“树木对环境有贡献。”和“树木是重要的数据结构”,自注意力机制会将“树木”分别与“环境”和“数据结构”联系起来,从而建立“树木”的不同语境。

Multi Head Attention(多头注意力机制)

Multi Head Attention(多头注意力)是一种技术,其中通过将输入分成多个“注意力头”来应用多个自注意力机制。与其执行单个注意力机制,不如使用每组不同的查询、键和值权重矩阵,将输入token嵌入多次投影到不同的“表示子空间”中。

这样做通常是为了让每个头学习数据中不同的方面或模式。多头注意力的重要性在于它能够让模型共同关注来自不同表示子空间和不同位置的信息。单个注意力头可能专注于token之间的一种“相关性”(例如:句法关系)。通过拥有多个头,模型可以同时学习各种关系。例如,一个头可能学习关注下一个单词,而另一个头可能专注于动宾关系。

来自每个注意力头的输出然后被连接起来,并通过一个最终的线性投影矩阵传递,以产生最终的多头注意力向量。这种并行计算和捕获多方面关系的能力增强了模型对输入序列中复杂依赖关系的理解。

5. Transformer Blocks(Transformer块)

Transformer模型是通过堆叠多个“Transformer Blocks”来构建的。Transformer Blocks是由堆叠层组成的编码器-解码器架构。每个Transformer Block层包含一个多头自注意力子层,然后是一个前馈神经网络子层。每个子层的输出都通过一个dropout层、一个层归一化步骤,并采用残差连接来促进训练期间的梯度流动。层归一化应用于子层之前和之后,以稳定训练。

  • Feed Forward Network (FFN) Layer(前馈神经网络层): 这是一个完全连接的前馈网络,分别且相同地应用于每个位置。它由两个线性变换组成,中间有一个ReLU激活函数。FFN提供对注意力输出的额外非线性处理,并显着贡献于模型的参数。该层通常后跟一个Softmax层。
  • Residual Connections(残差连接): Transformer实现残差(或跳跃)连接,允许信息绕过多个层,从而改善梯度流动并防止信息丢失。这些连接在深层Transformer堆栈中尤为重要,它们确保原始信息保持完整,并有助于缓解梯度消失问题。
  • Layer Normalization(层归一化): 层归一化通过归一化特征上的激活来帮助稳定训练,从而减少内部协变量偏移并提高收敛速度。在训练期间,这种归一化可以防止特征幅度发生突然变化,从而使学习过程更加一致。
  • Encoder-Decoder Architecture(编码器-解码器架构): 编码器处理输入序列,解码器生成输出序列。编码器和解码器都有自己的层堆栈,解码器还采用掩码自注意力,以确保每个位置在生成期间仅查看先前的位置。

6. Linear and Softmax Layers(线性层和Softmax层)

Transformer的编码器和解码器处理完输入后,来自解码器的输出向量通过线性层,然后通过Softmax层,这为我们提供了一组概率,最终预测的单词是概率最高的单词。Transformer中的线性层是一个完全连接的神经网络层,它将学习到的线性变换应用于其输入向量。如果解码器输出一个大小为dmodel的向量,则线性层将其乘以形状为[dmodel × V]的权重矩阵,其中V是词汇表大小。结果是一个长度为V的logits向量,每个值代表一个可能的输出单词的未归一化分数。

Softmax层跟随线性层,接受输出logits向量,并将其转换为词汇表上的概率分布,输出分布中的所有输出值都在[0,1]范围内,并且分布中所有值的总和为1。对应于分布中最高概率的token最终被Transformer作为预测输出产生。

结论:Google的遗产与GenAI的未来

现在,您已经了解了Transformer架构,也就明白了像ChatGPT这样的LLM是如何训练的。令人惊叹的是,Google撰写的研究论文引入了Transformer架构,而它恰恰成为了ChatGPT的核心组件,如今ChatGPT已成为了Google的“头疼”所在。我建议大家更深入地研究这些组件,并构建自己的Transformer。虽然ChatGPT的崛起给Google带来了竞争压力,但不可否认的是,Google在GenAI领域的贡献是开创性的。未来,我们将看到更多基于Transformer架构的创新应用,它们将深刻地改变我们与信息互动的方式。

通过对TokenizationVector EmbeddingsPositional EncodingsAttention机制Self AttentionMulti Head Attention以及其他Transformer架构组件的理解,我们可以更好的理解和应用这些强大的工具。