在人工智能的发展历程中,2017年无疑是一个关键转折点。这一年,Google的研究团队发表了一篇具有里程碑意义的论文——《Attention Is All You Need》。这篇论文提出了一种全新的神经网络结构:Transformer。它不仅在机器翻译任务上刷新了性能记录,更重要的是,彻底颠覆了传统序列建模的方式。
在此前的时代,循环神经网络(RNN)及其衍生结构(如LSTM和GRU)主导着自然语言处理领域。它们通过逐词顺序处理文本,模拟人类阅读的过程。但这种方式存在两个致命缺陷:
而Transformer则以一种全新的思路破解了这些难题。它完全摒弃了循环机制,转而采用一种名为自注意力(Self-Attention)的核心机制。该机制允许模型在处理文本时,同时观察整个输入序列,并直接建立任意两个词之间的关联。这种全局性、并行化的处理方式,不仅极大提升了训练速度,也显著增强了对复杂语义关系的捕捉能力。
可以说,当今几乎所有大语言模型(LLM),包括GPT、BERT、Llama等,其底层都根植于Transformer。它是现代AI语言系统的基石。深入理解Transformer,是掌握当前AI技术浪潮本质的关键一步。
本章将是整个课程中最核心、最具挑战性的内容之一。我们将像拆解精密机械一样,借助图示与类比,层层揭开Transformer内部的工作原理。准备好了吗?让我们开启这场思维之旅。
原始Transformer是在《Attention Is All You Need》一文中为机器翻译任务设计的,因此其标准结构包含两个主要部分:编码器(Encoder) 和 解码器(Decoder)。
编码器(Encoder)的作用是“读取并理解”输入文本(例如一句德语)。它将原始词语序列转化为一组富含上下文信息的向量表示,相当于为后续生成提供语义基础。
解码器(Decoder)则负责“产出”目标语言的文本(例如对应的英文翻译)。它一边接收编码器输出的整体语义信息,一边结合已生成的部分结果,逐步预测下一个最合适的词。
graph TD
subgraph Transformer 整体架构
A[输入: "Das ist ein Apfel"] --> B(输入嵌入<br>Input Embedding);
B --> C(位置编码<br>Positional Encoding);
C --> D(N个编码器层<br>Encoder Stack);
D -- "富含上下文的向量表示" --> E(N个解码器层<br>Decoder Stack);
F[输出: "This is an apple"] --> G(输出嵌入<br>Output Embedding);
G --> H(位置编码<br>Positional Encoding);
H --> E;
E --> I(线性层<br>Linear);
I --> J(Softmax);
J --> K[最终输出概率];
end
style D fill:#cde,stroke:#333
style E fill:#f9f,stroke:#333
这一流程类似于人类翻译官的操作模式:
那么,GPT系列模型又是如何工作的呢?
需要注意的是,GPT(Generative Pre-trained Transformer)的核心功能是文本生成,而非双向翻译任务。因此,它仅采用了Transformer中的解码器部分,即所谓的“Decoder-only”架构。尽管如此,要真正理解这类模型的设计逻辑,仍需从原始的Encoder-Decoder框架入手,才能把握其思想精髓。
接下来,我们将深入这两个模块的内部构造,揭示它们是如何由一系列基础组件搭建而成的。
如果说Transformer是一座高楼,那么自注意力机制就是它的地基与主梁。这是整个架构最具革命性的创新所在,也是解决“词间关系建模”这一根本问题的关键。
考虑这样一个句子:“The animal didn’t cross the street because it was too tired.” 当我们读到代词“it”时,大脑会自然将其指向“The animal”,而不是“the street”。这个过程就是注意力的体现——我们自动聚焦于与当前词汇最相关的上下文片段。
自注意力机制正是让神经网络模仿这种能力。对于句子中的每一个词,模型都会计算出一组“注意力分数”,用以衡量在理解该词时,应给予其他所有词(包括自身)多少关注权重。这样,每个词都能动态地融合与其相关度最高的上下文信息。
为了实现上述过程,自注意力引入了三个核心概念:查询(Query, Q)、键(Key, K) 和 值(Value, V)。我们可以借助一个图书馆检索资料的比喻来理解它们的关系:
在模型中,每个输入词都会被映射成对应的Q、K、V向量。然后通过计算Query与所有Keys的相似度,得到注意力分布,再以此加权聚合对应的Values,最终输出一个融合了上下文信息的新表示。
在理解自注意力机制时,可以将其类比为一个高效查阅资料的过程。这个过程主要包含两个核心步骤:
1. 相关性计算:将当前的问题(Query)与每本书的标签(Key)进行匹配。例如,如果你的问题是“深度学习的发展历程”,那么书名中含有相关内容的书籍(如《深度学习发展史》)就会被赋予更高的相关性分数。
2. 加权求和:根据这些相关性分数,决定对每本书内容(Value)的关注程度。分数越高,代表该内容越重要,权重也越大。最终你所获得的知识,实际上是所有书籍内容按权重加权后的综合结果。
这种思维方式正是Transformer中自注意力机制的核心逻辑。
在模型内部,对于输入序列中的每一个词,都会生成三个专属向量:
我们以句子“Thinking Machines”中的第一个词“Thinking”为例,说明其上下文感知表示是如何生成的。
第一步:生成 Q, K, V 向量
每个输入词首先通过三个不同的可训练权重矩阵进行线性变换,从而得到对应的Q、K、V向量。这些矩阵是在训练过程中自动学习优化的。
具体操作如下:
thinking_vector × W_Q → q1 (“Thinking”的查询向量) thinking_vector × W_K → k1 (“Thinking”的标签向量) thinking_vector × W_V → v1 (“Thinking”的内容向量) machines_vector × W_Q → q2 machines_vector × W_K → k2 (“Machines”的标签向量) machines_vector × W_V → v2 (“Machines”的内容向量)
W_QW_KW_V
第二步:计算注意力分数
使用“Thinking”的Q向量(q1),分别与其他所有词的K向量做点积运算,得出原始的相关性得分。
score_11 = q1 · k1 score_12 = q1 · k2
q1k1k2
第三步:缩放与Softmax归一化
为了提升训练稳定性,将上述得分除以K向量维度的平方根(√d_k),再通过Softmax函数进行归一化处理,使输出值构成一组概率分布,即注意力权重。
weight_11, weight_12 = softmax(score_11 / √d_k, score_12 / √d_k)
假设最终得到的权重为 [0.88, 0.12],这意味着在理解“Thinking”时,模型分配了88%的注意力给它自己,12%给“Machines”。
sqrt(d_k)
第四步:加权求和生成输出
利用上一步得到的权重,对各个词的V向量进行加权求和,得到当前词的新表示。
z1 = weight_11 × v1 + weight_12 × v2
由此得到的向量 z1 就是“Thinking”融合了整句上下文信息后的新语义表达。它不再是孤立存在的词向量,而是包含了与句中其他词语关系的丰富信息。
z1
关键特性:这一整套流程并非逐词串行执行,而是对句子中所有词并行计算,极大提升了处理效率,这也是Transformer架构高性能的重要原因之一。
graph TD
subgraph 自注意力计算 (以Thinking为例)
A[输入词: Thinking] --> B{乘以W_Q, W_K, W_V};
B --> Q1(Query_Thinking);
B --> K1(Key_Thinking);
B --> V1(Value_Thinking);
C[输入词: Machines] --> D{乘以W_Q, W_K, W_V};
D --> K2(Key_Machines);
D --> V2(Value_Machines);
subgraph 计算注意力权重
Q1 -- "与所有Key做点积" --> S1(Score1 = Q1·K1);
Q1 -- "与所有Key做点积" --> S2(Score2 = Q1·K2);
S1 & S2 --> Scale(除以sqrt(d_k));
Scale --> Softmax(Softmax归一化);
Softmax --> W1(权重1 = 0.88);
Softmax --> W2(权重2 = 0.12);
end
subgraph 计算输出
W1 -- "乘以对应的Value" --> WV1(W1 * V1);
W2 -- "乘以对应的Value" --> WV2(W2 * V2);
WV1 & WV2 --> Sum{加权求和};
Sum --> Z1[最终输出向量Z_Thinking];
end
K1 & K2 --> S1 & S2;
V1 & V2 --> WV1 & WV2;
end
style Z1 fill:#cde,stroke:#333,stroke-
尽管自注意力机制已经非常强大,但它仅允许每个词从单一视角去关注上下文。然而,自然语言中的语义关系往往是多维度的。
举例来说,在句子“The tired animal didn’t cross the street”中,“tired”这个词可能同时存在多种关联:
如果只依赖一个注意力头,模型很难在同一时间捕捉到这两种不同性质的关系。
多头注意力的解决思路:引入多个并行的自注意力“头”,每个头独立学习一种特定类型的语义关系模式。
实现过程如下:
1. 分割Q, K, V向量
不再为每个词生成单组Q/K/V,而是生成多组(例如8个头)。每组的向量维度相应降低(如从512维降至64维),保证总计算量基本不变。
hh=8
2. 并行执行自注意力
每个注意力头独立完成完整的自注意力计算流程,包括打分、归一化和加权求和,最终各自产出一个输出向量。
Head_1 → z1_1 Head_2 → z1_2 ... Head_8 → z1_8
3. 拼接与合并
将所有头的输出向量拼接起来,形成一个高维向量,再通过一个线性变换层整合信息,输出最终的多头注意力结果。
这种方式使得模型能够同时从多个子空间、多个角度理解词语之间的复杂关系,显著增强了表达能力。
将各个注意力头输出的向量进行拼接(Concatenate),组合成一个高维的联合向量。
降维处理:通过引入一个独立的权重矩阵,对该拼接后的高维向量执行线性变换,将其维度压缩回原始输入的维度大小,以保证模型结构的稳定性与一致性。
W_O
graph TD
subgraph 多头注意力机制
Input[输入词向量] --> Split{划分成h份};
Split --> Head1(注意力头1);
Split --> Head2(注意力头2);
Split --> HeadN(...);
Split --> HeadH(注意力头h);
Head1 --> Z1[输出Z1];
Head2 --> Z2[输出Z2];
HeadN --> ZN[...];
HeadH --> ZH[输出Zh];
Z1 & Z2 & ZN & ZH --> Concat{拼接 Concat(Z1..Zh)};
Concat --> FinalLinear(乘以W_O矩阵);
FinalLinear --> Output[最终输出向量];
end
h
形象比喻:可以将这一过程类比为召开一场专家评审会。当面对一个复杂问题时,不是只依赖单一专家的意见,而是邀请8位来自不同领域的专家(例如经济学家、社会学家、历史学家等)共同参与评估。每位专家(即每个注意力头)基于自身专业背景对问题进行分析,并输出一个独立的结果向量Z。最终,我们将所有专家的观点汇总(拼接),再经过整合处理,得出一个全面且综合的决策结论(最终输出)。
多头注意力机制显著提升了模型识别和理解多种类型上下文关系的能力,是Transformer架构高性能的核心支撑之一。
自注意力机制存在一个关键局限:它不具备天然的序列顺序感知能力。举例来说,在句子“Tom hit Jerry”和“Jerry hit Tom”中,尽管语义完全不同,但从“hit”的视角看,“Tom”和“Jerry”的输入表示在自注意力计算过程中是完全对称的,模型无法判断主语与宾语的位置差异。
解决思路:在词嵌入向量送入Transformer之前,为其叠加一个由词语位置决定的“位置编码(Positional Encoding)”向量。该编码根据词在序列中的绝对位置(如第1位、第2位……)生成,为每个位置提供独特的数学标识,相当于一种“位置指纹”。
原始论文采用正弦(sin)和余弦(cos)函数交替的方式构建位置编码,具备两个重要优势:
最终输入表示为:
Input_with_position = Original_input_embedding + Positional_encoding
这样一来,即使两个词汇完全相同,只要它们出现在句子中的位置不同,其进入模型的初始向量就会有所区别,从而使模型能够有效识别词序信息。
sin
cos
在Transformer的每个编码器和解码器子层中,除了注意力模块外,还包含一个全连接前馈网络(Feed-Forward Network, FFN)。
功能说明:FFN作用于多头注意力输出之上,对其进行非线性变换,可视为对已提取特征的一次深度加工与信息提炼过程。
典型结构:一般由两个线性变换层构成,中间嵌入ReLU或GELU激活函数,形式如下:
FFN(x) = max(0, xW + b)W + b
残差连接(Residual Connections) 和 层归一化(Layer Normalization) 是支撑深层Transformer稳定训练的两大关键技术。
残差连接:在每一个子层(如多头注意力、FFN)的输入与输出之间建立一条直连通路,即输出 = 输入 + 子层处理结果。这种设计有效缓解了深度神经网络中的梯度消失问题,使得信息和梯度能够在深层结构中顺畅传递,如同为数据流开辟了一条“高速公路”。
Output = Layer(Input) + Input
层归一化:在每个子层运算后,对输出向量按样本维度进行标准化处理,使其各特征的均值接近0、方差接近1。这有助于提升训练稳定性,降低对初始化参数的敏感性。
结合上述机制,一个完整的Transformer子层处理流程如下所示:
Output = LayerNorm(SubLayer(Input) + Input)
我们已经系统剖析了Transformer的各项核心技术组件。现在,重新梳理其卓越性能的根本原因:
Transformer不仅仅是一个深度学习模型,更代表了一种全新的神经网络设计范式。正是这套简洁而高效的组合机制,点燃了现代人工智能的革命火种,催生了如今蓬勃发展的大语言模型时代。
在接下来的内容中,我们将进入实践环节,使用PyTorch从零开始逐个实现上述核心组件,并最终亲手搭建一个完整的GPT模型。从理论推导到代码落地,你将深入体验构建“数字大脑”的全过程,感受其中的技术魅力与挑战。
扫码加好友,拉您进群



收藏
