第十章:Transformer架构

学习目标

  • 理解Transformer架构的革命性意义
  • 掌握注意力机制和Self-Attention的工作原理
  • 理解多头注意力机制的设计动机和工作方式
  • 理解位置编码的必要性及数学公式
  • 区分Encoder-only、Decoder-only和Encoder-Decoder架构

前置要求

第五章:深度学习概述(理解神经网络结构)、第二章:数学基础(理解矩阵运算、Softmax函数)。

Transformer概述

Transformer是目前最主流的AI架构,GPT、BERT、Claude等几乎所有大语言模型都基于它。2017年由Google在论文"Attention is All You Need"中提出,彻底改变了自然语言处理领域。

Transformer Encoder-Decoder 架构图
图10-1 Transformer整体架构:左侧Encoder(编码器)理解输入,右侧Decoder(解码器)生成输出,核心组件为多头注意力和前馈网络

Transformer的革命性突破

之前的模型(RNN)需要逐词处理,慢且难并行。
Transformer可以同时处理整个句子,速度快、效果好。
这让大模型训练成为可能,开启了AI新时代。

Transformer的核心:注意力机制

注意力机制(Attention)让模型能关注输入中最相关的部分,就像人读书时会重点关注某些词句。

通俗理解

阅读句子"我喜欢编程,特别是Python"
处理"Python"这个词时,注意力会关注"编程"
因为它们语义相关,"Python"是"编程"的一种

这就是注意力机制的核心思想:根据当前词,找到相关词,重点参考。

Self-Attention(自注意力)详解

自注意力让序列中的每个词都能关注其他所有词,获取上下文信息。

Query、Key、Value的比喻

图书馆类比

想象你在图书馆找书:
Query(查询):你想要找什么内容(当前词的需求)
Key(标签):每本书的标签/目录(其他词的标识)
Value(内容):书里的实际内容(其他词的信息)

你的Query与每本书的Key对比,找到最匹配的书,取出Value(书的内容)。相似度越高,这本书对你的价值越大。

自注意力计算过程

  1. 创建向量:每个词生成Query、Key、Value三个向量
  2. 计算相似度:Query与所有Key的点积,得到注意力分数
  3. 归一化:分数除以\(\sqrt{d_k}\)(防止数值太大),再通过Softmax变成概率
  4. 加权求和:用概率权重对所有Value加权,得到新的词表示
Self-Attention QKV 计算流程图
图10-2 Self-Attention计算流程:输入词向量生成Q/K/V → Q与K点积计算注意力分数 → Softmax归一化 → 对V加权求和得到输出
输入:"我 爱 学习"
每个词生成Q/K/V
"学习"的Q与其他词的K匹配
得到注意力权重
加权组合得到新表示

注意力分数计算的数学公式

Self-Attention公式

\[ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V \]

其中:
• \(Q\) 是查询矩阵(Query),形状为 \((n \times d_k)\)
• \(K\) 是键矩阵(Key),形状为 \((n \times d_k)\)
• \(V\) 是值矩阵(Value),形状为 \((n \times d_v)\)
• \(d_k\) 是Key向量的维度,\(\sqrt{d_k}\)用于缩放防止梯度消失
• \(QK^T\) 计算所有词对之间的相似度
• softmax将相似度转为概率分布
• 最终用概率对V加权求和

Self-Attention的Python/NumPy代码实现

import numpy as np

def softmax(x):
    """计算softmax,防止数值溢出"""
    exp_x = np.exp(x - np.max(x, axis=-1, keepdims=True))
    return exp_x / np.sum(exp_x, axis=-1, keepdims=True)

def self_attention(Q, K, V):
    """
    Self-Attention计算
    Q: (seq_len, d_k) 查询矩阵
    K: (seq_len, d_k) 键矩阵
    V: (seq_len, d_v) 值矩阵
    """
    d_k = Q.shape[-1]

    # 1. 计算注意力分数: Q * K^T
    scores = Q @ K.T  # (seq_len, seq_len)

    # 2. 缩放
    scores = scores / np.sqrt(d_k)

    # 3. Softmax归一化
    attention_weights = softmax(scores)

    # 4. 加权求和
    output = attention_weights @ V  # (seq_len, d_v)

    return output, attention_weights

# 示例:3个词,每个词用4维向量表示
np.random.seed(42)
seq_len = 3
d_k = 4
d_v = 4

Q = np.random.randn(seq_len, d_k)
K = np.random.randn(seq_len, d_k)
V = np.random.randn(seq_len, d_v)

output, weights = self_attention(Q, K, V)

print("注意力权重矩阵:")
print(np.round(weights, 3))
# 每行表示一个词对其他词的关注程度
print(f"\n输出形状: {output.shape}")

多头注意力(Multi-Head Attention)

多头注意力是让模型从多个不同角度理解句子。

为什么需要"多头"?

一个注意力头只能关注一种关系:
• Head 1 可能关注语法关系(主语-谓语)
• Head 2 可能关注语义关系(名词-属性)
• Head 3 可能关注位置关系(上下文)

多个头可以同时关注不同类型的关系,理解更全面。
GPT-3使用了96个注意力头!

多头注意力工作原理

  • 把Query、Key、Value分成多份(比如8份)
  • 每份独立做一次自注意力计算
  • 得到8个不同的"视角"结果
  • 把8个结果合并,得到最终表示

位置编码(Positional Encoding)

位置编码告诉模型每个词在句子中的位置,弥补Transformer无法识别顺序的缺陷。

为什么需要位置编码?

Transformer同时处理所有词,不知道"我吃苹果"和"苹果吃我"的区别(词相同,顺序不同)。

位置编码给每个词添加一个"位置标签",让模型能区分:
"我"(位置1)+ "吃"(位置2)+ "苹果"(位置3)

这样模型就知道词的顺序,理解正确含义。

位置编码的数学公式

正弦-余弦位置编码

\[ PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) \]

\[ PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) \]

其中:
• \(pos\) 是词在序列中的位置(0, 1, 2, ...)
• \(i\) 是维度索引
• \(d_{\text{model}}\) 是模型的嵌入维度(如512、768、1024)

这种编码方式使模型能学习到相对位置关系。

Transformer架构详解

Transformer由两个主要部分组成:

Encoder(编码器)——理解输入

Encoder负责理解输入文本,提取其中的信息。

  • 输入:原始文本(如"把这段话翻译成英语")
  • 处理:多层自注意力+前馈网络,理解每个词及其上下文
  • 输出:每个词的深层语义表示
  • 代表模型:BERT(双向理解,适合分类、问答)

Decoder(解码器)——生成输出

Decoder负责生成输出文本,逐词预测下一个词。

  • 输入:Encoder的输出 + 已生成的词
  • 处理:自注意力(看已生成部分)+ 交叉注意力(看Encoder输出)
  • 输出:下一个词的概率分布,选择最可能的词
  • 代表模型:GPT(单向生成,适合写作、对话)
输入文本
Encoder
(理解)
语义表示
Decoder
(生成)
输出文本

Encoder vs Decoder 对比

维度 Encoder Decoder
注意力类型 自注意力(看全部输入) 自注意力(只能看已生成的词)+ 交叉注意力(看Encoder输出)
处理方式 双向理解 单向生成(从左到右)
代表模型 BERT、RoBERTa GPT、LLaMA、Qwen
适合任务 分类、问答、命名实体识别 写作、对话、代码生成

不同架构的应用场景

架构 模型 特点 适合任务
仅Encoder BERT、RoBERTa 双向理解整个文本 文本分类、情感分析、问答系统
仅Decoder GPT、LLaMA、Qwen 单向生成,预测下一个词 写作、对话、代码生成
Encoder-Decoder T5、BART 理解+生成结合 翻译、摘要、改写

关键创新总结

Transformer的三大创新:
自注意力:词与词直接关联,理解全面
多头机制:多个角度分析,更丰富
并行计算:同时处理,速度快

这三点让Transformer成为现代AI的基石。

推荐视频

如果你觉得文字讲解不够直观,推荐观看以下视频:

Transformer讲解

作者:李宏毅

为什么推荐:深入讲解Self-Attention机制

点击观看

本章小结

  1. Transformer通过注意力机制实现了并行处理序列数据,彻底取代了RNN的逐词处理方式,开启了AI新时代。
  2. Self-Attention的核心公式为 \(\text{Attention}(Q,K,V) = \text{softmax}(QK^T/\sqrt{d_k})V\),通过Q/K/V机制让每个词关注所有相关词。
  3. 多头注意力让模型从多个角度理解文本,位置编码通过正弦-余弦函数为词添加位置信息。
  4. Transformer由Encoder(理解输入)和Decoder(生成输出)组成,不同组合产生了BERT、GPT、T5等不同架构。
  5. 仅Encoder架构适合理解任务(分类、问答),仅Decoder架构适合生成任务(写作、对话),Encoder-Decoder适合序列转换任务(翻译、摘要)。

练习题

  1. Self-Attention公式中,除以\(\sqrt{d_k}\)的目的是什么?

    A. 加速计算
    B. 防止点积结果过大导致softmax梯度消失
    C. 增加模型参数
    D. 减少内存使用

    答案:B。当维度\(d_k\)较大时,点积结果会很大,softmax会进入梯度极小的区域。除以\(\sqrt{d_k}\)进行缩放可以缓解这个问题。

  2. GPT系列模型使用的是哪种Transformer架构?

    A. 仅Encoder
    B. 仅Decoder
    C. Encoder-Decoder
    D. 不使用Transformer

    答案:B。GPT使用仅Decoder架构,通过自回归方式逐词生成文本,适合写作和对话等生成任务。

  3. 为什么Transformer需要位置编码?

    A. 因为Transformer的计算速度太慢
    B. 因为Transformer同时处理所有词,本身不知道词的顺序
    C. 因为位置编码可以减少参数量
    D. 因为没有位置编码就无法训练

    答案:B。Transformer的核心优势是并行处理所有词,但代价是丢失了词序信息。位置编码通过给每个位置添加唯一编码来弥补这一缺陷。