AIGC-Transformer神经网络架构

Transformer 是一种完全基于注意力机制的神经网络架构,放弃了传统的循环和卷积结构,在机器翻译等序列到序列任务中表现出色,并成为当今大语言模型(如 GPT、BERT)的基石。

我们以最经典的 序列到序列任务(如机器翻译:将英文"I love you"翻译成中文"我爱你")为例,讲解其完整工作流。

核心思想

Transformer 的核心思想是:通过"自注意力"机制,让序列中的每个元素都能直接与序列中的所有其他元素进行交互,从而捕捉全局的上下文依赖关系。


整体架构图景

Transformer 采用 编码器-解码器 架构。

  • 编码器:负责理解和抽象化输入序列的信息,将其转化为一组富含上下文信息的"中间表示"。
  • 解码器:基于编码器的输出和之前已生成的输出,自回归地(一个接一个)生成目标序列。

一个标准的 Transformer 模型由 N 个(通常 N=6)相同的编码器层堆叠而成 ,和 N 个相同的解码器层堆叠而成


第一阶段:输入处理与嵌入

1. 词元化与嵌入
  • 输入:原始文本序列(如 "I love you")。

  • 步骤

    • 分词 :将句子分割成词元(Token),例如 ["I", "love", "you"]
    • 嵌入查找 :每个词元通过一个可学习的 嵌入矩阵 被转换成一个固定维度的向量(如 512 维)。这个向量称为 词嵌入,它试图在向量空间中编码该词元的语义信息。
  • 输出 :一个向量序列,维度为 [序列长度, 模型维度]

2. 位置编码
  • 问题 :自注意力机制本身是"排列不变"的,它没有内置的顺序概念。"A 打了 B""B 打了 A" 的词嵌入是一样的,但含义截然不同。

  • 解决方案位置编码

    • 为序列中的每个位置(第1个词,第2个词...)计算一个独一无二的、固定或可学习的向量。
    • 这个位置向量的维度与词嵌入相同。
    • 关键操作 :将 词嵌入向量位置编码向量 逐元素相加
  • 结果:得到的向量既包含了词的语义信息,也包含了其在序列中的绝对和相对位置信息。

至此,输入序列被转换为一个包含语义和位置信息的向量序列,准备送入编码器。


第二阶段:编码器处理

编码器层是 Transformer 的引擎,每个编码器层结构完全相同,包含两个核心子层:

子层 1:多头自注意力机制

这是 Transformer 的灵魂。

  • 目的:让序列中的每个词都能"关注"序列中的所有其他词,从而基于整个上下文来更新自己的表示。

  • 过程

    1. 线性投影 :对于每个位置的输入向量,通过三组不同的权重矩阵,并行地生成三组向量:查询向量键向量值向量

    2. "多头" :将模型维度分割成多个"头"(例如 8 个头,每个头维度为 64)。在每个头上独立地进行注意力计算。这允许模型在不同的表示子空间中并行地关注不同方面的信息(例如语法、语义、指代关系)。

    3. 缩放点积注意力计算(在每个头上):

      • 匹配 :计算当前词(查询 Q)与序列中所有词(键 K)的相似度得分(点积)。相似度 = Q · K^T
      • 缩放:将得分除以键向量维度的平方根,使训练更稳定。
      • 归一化:通过 Softmax 函数将相似度得分转换为概率分布(注意力权重),权重之和为 1。
      • 加权求和 :用得到的注意力权重对序列中所有词的 值向量 进行加权求和,得到当前词在该注意力头下的新表示。权重高的值向量对结果贡献大。
    4. 合并:将所有注意力头的输出拼接起来,并通过一个线性层进行融合。

  • 输出:每个词的新向量,都融合了序列中所有其他词的相关信息。

子层 2:前馈神经网络
  • 目的:对自注意力层的输出进行进一步的非线性变换和空间映射。
  • 结构:一个简单的两层全连接网络,通常中间层的维度更大(如 2048 维),使用 ReLU 激活函数。
  • 作用:为模型增加非线性能力和表达能力。
残差连接与层归一化
  • 每个子层 (自注意力、前馈网络)都被一个 残差连接层归一化 所包裹。

  • 流程输出 = LayerNorm(子层输入 + 子层函数(子层输入))

  • 作用

    • 残差连接:缓解深层网络中的梯度消失问题,使模型更容易训练。
    • 层归一化:稳定每一层的输入分布,加速训练。

经过 N 个编码器层的逐层处理后,输入序列被转化为一组高度精炼、富含全局上下文信息的"记忆"或"上下文向量"。这组向量将传递给解码器。


第三阶段:解码器处理

解码器也是自回归的,它一次生成一个词元。每个解码器层包含 三个 核心子层。

子层 1:掩码多头自注意力
  • 目的 :让解码器在生成当前词时,只能"看到"它 之前 已经生成的词(这是自回归生成的要求),而不能看到未来的词。
  • 实现 :在计算注意力权重时,使用一个 因果掩码。这是一个上三角矩阵,将未来位置的注意力权重设置为负无穷,这样在 Softmax 之后,未来位置的权重就变成了 0。
子层 2:编码器-解码器注意力(交叉注意力)
  • 目的:这是连接编码器和解码器的桥梁。它让解码器在生成当前词时,能够"询问"编码器:"基于我目前生成的上下文,源序列的哪些部分是相关的?"

  • 过程

    • Q(查询) 来自解码器上一层的输出。
    • K(键)和 V(值) 来自 最后一个编码器层的输出
    • 计算解码器当前状态(Q)与整个编码器输出序列(K)的相似度,得到注意力权重,然后用这些权重对编码器的值向量(V)进行加权求和。
  • 结果:解码器将编码器提供的源序列信息,动态地、有选择地整合到自己的生成过程中。

子层 3:前馈神经网络
  • 与编码器中的前馈网络完全相同。

同样,每个子层周围都有残差连接和层归一化。

经过 N 个解码器层的处理后,在最后一个解码器层的顶部,会输出一个向量序列(每个目标词位置对应一个向量)。


第四阶段:输出生成

  1. 线性投影 :将最后一个解码器层输出的每个位置的向量,通过一个可学习的线性层,投影到 目标语言词表大小 的维度。

  2. Softmax:对线性层的输出应用 Softmax 函数,将其转换为一个概率分布。这个分布表示在当前位置,生成词表中每个词的概率。

  3. 自回归生成

    • 训练时 :我们已知完整的目标序列("<SOS> 我 爱 你 <EOS>")。解码器会并行地处理整个目标序列(使用掩码),并试图预测下一个词。损失函数(如交叉熵)通过比较预测分布和真实的下一个词来计算。
    • 推理时
      a. 从起始符 <SOS> 开始。
      b. 将当前已生成的序列送入解码器,得到下一个词的概率分布。
      c. 通常采用 束搜索贪心采样 等策略,选择下一个词(例如选择概率最高的词"我")。
      d. 将新生成的词追加到序列末尾,重复步骤 b-c,直到生成结束符 <EOS>

工作流总结

  1. 输入预处理文本 -> 词元化 -> 词嵌入 + 位置编码 = 带位置的输入向量。

  2. 编码器堆栈 (N层):每层对输入进行 多头自注意力 (捕捉上下文)和 前馈变换 ,用 残差连接和层归一化 稳定训练。输出 上下文记忆

  3. 解码器堆栈(N层,自回归):

    • 掩码自注意力:关注已生成的部分。
    • 交叉注意力:查询编码器的上下文记忆,获取相关信息。
    • 前馈变换:进一步处理信息。
    • 每层同样使用 残差连接和层归一化
  4. 输出层解码器输出 -> 线性投影 -> Softmax -> 下一个词的概率分布 -> 自回归生成完整序列

关键创新与优势

  • 并行化:与 RNN 的串行处理不同,Transformer 对序列所有位置的注意力计算可以完全并行,极大提高了训练速度。
  • 长程依赖:自注意力机制允许任意两个位置直接交互,无论距离多远,有效解决了 RNN 的长程依赖衰减问题。
  • 可扩展性:模块化的层堆叠结构,使其能够通过增加层数、维度等轻松扩展成超大模型(如 GPT-3、PaLM)。

希望这个详细的流程能帮助你清晰地理解 Transformer 的内部工作机制。

生成md文档

我们按照Transformer的整体工作流程,将上述详细讲解整理成Markdown文档。注意,由于Markdown不支持复杂的图表,我们将用文字描述和简单的代码块来示意关键步骤。对于复杂的数学公式,我们将使用LaTeX格式。

注意:由于内容较长,我们将分章节进行整理。

Transformer 模型完整工作流程详解

概述

Transformer 是一种完全基于注意力机制的神经网络架构,由 Vaswani 等人在 2017 年的论文《Attention Is All You Need》中提出。它放弃了传统的循环神经网络和卷积神经网络,在序列到序列任务中表现出色,并成为当今大语言模型的基石。

核心架构图

一、输入处理阶段

1.1 词元化与嵌入

流程

text

复制代码
原始文本 → 分词 → 词嵌入查找 → 词向量序列
详细步骤

1. 分词(Tokenization)

  • 将输入文本分割成有意义的单元
  • 方法:BPE、WordPiece、SentencePiece 等
  • 示例:"I love you"["I", "love", "you"]

2. 词嵌入(Word Embedding)

  • 通过可学习的嵌入矩阵将词元映射为向量

  • 维度:通常为 512、768 或 1024 维

  • 数学表示:

    text

    ini 复制代码
    E ∈ ℝ^(V×d)  # 嵌入矩阵,V=词表大小,d=模型维度
    X_embed = E[token_ids]  # 形状: [batch_size, seq_len, d_model]

1.2 位置编码

目的

为模型提供序列顺序信息,因为自注意力机制本身是位置无关的。

实现方式

1. 正弦余弦位置编码(原始 Transformer)

python

perl 复制代码
# 公式
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i+1/d_model))

# 其中:
# - pos: 位置索引(0, 1, 2, ...)
# - i: 维度索引(0 ≤ i < d_model/2)
# - d_model: 模型维度

2. 可学习位置编码(如 BERT)

  • 为每个位置学习一个独立的嵌入向量
  • 适用于固定或有限的最大序列长度
最终输入表示

text

ini 复制代码
输入 = 词嵌入 + 位置编码
X = X_embed + PE

二、编码器架构

编码器由 N 个相同的层堆叠而成(通常 N=6)。

2.1 单编码器层结构

text

sql 复制代码
输入
    ↓
多头自注意力层
    ↓
Add & Norm(残差连接 + 层归一化)
    ↓
前馈神经网络层
    ↓
Add & Norm(残差连接 + 层归一化)
    ↓
输出

2.2 多头自注意力机制

计算流程

1. 线性投影生成 Q、K、V

text

ini 复制代码
Q = X · W_Q  # 查询矩阵
K = X · W_K  # 键矩阵
V = X · W_V  # 值矩阵

2. 分割成多个头

text

bash 复制代码
# 原始维度: [batch_size, seq_len, d_model]
# 分割后: [batch_size, num_heads, seq_len, d_k]
# 其中 d_k = d_model / num_heads

3. 缩放点积注意力计算

python

ini 复制代码
def scaled_dot_product_attention(Q, K, V, mask=None):
    # 计算注意力分数
    scores = torch.matmul(Q, K.transpose(-2, -1)) / sqrt(d_k)
    
    # 应用掩码(如果需要)
    if mask is not None:
        scores = scores.masked_fill(mask == 0, -1e9)
    
    # Softmax 归一化
    attention_weights = F.softmax(scores, dim=-1)
    
    # 加权求和
    output = torch.matmul(attention_weights, V)
    return output, attention_weights

4. 多头合并

python

ini 复制代码
# 1. 每个头独立计算注意力
head_i = attention(Q_i, K_i, V_i)

# 2. 拼接所有头
multi_head = concatenate(head_1, head_2, ..., head_h)

# 3. 线性投影
output = multi_head · W_O

2.3 前馈神经网络

结构

text

复制代码
输入 → 线性层(扩大维度) → ReLU激活 → 线性层(恢复维度) → 输出
数学表示

text

scss 复制代码
FFN(x) = max(0, xW_1 + b_1)W_2 + b_2

其中:

  • W_1 ∈ ℝ^(d_model×d_ff)d_ff 通常为 4×d_model
  • W_2 ∈ ℝ^(d_ff×d_model)

2.4 残差连接与层归一化

公式

text

scss 复制代码
子层输出 = LayerNorm(x + Sublayer(x))
作用
  1. 残差连接:缓解梯度消失,使深层网络易于训练
  2. 层归一化:稳定激活值分布,加速收敛

三、解码器架构

解码器也由 N 个相同的层堆叠而成。

3.1 单解码器层结构

text

sql 复制代码
输入
    ↓
掩码多头自注意力层
    ↓
Add & Norm
    ↓
编码器-解码器注意力层
    ↓
Add & Norm
    ↓
前馈神经网络层
    ↓
Add & Norm
    ↓
输出

3.2 三种注意力机制对比

类型 查询(Q)来源 键(K)/值(V)来源 作用
编码器自注意力 编码器输入 编码器输入 捕捉输入序列内部依赖
掩码自注意力 解码器输入 解码器输入 防止信息泄露,保证自回归性
编码器-解码器注意力 解码器上层输出 编码器输出 连接源语言和目标语言信息

3.3 掩码机制

因果掩码(Causal Mask)

python

ini 复制代码
# 上三角矩阵,主对角线及以下为1,以上为0
mask = torch.tril(torch.ones(seq_len, seq_len))
# 形状:[1, 1, seq_len, seq_len]
作用

确保在生成第 t 个词时,只能看到前 t-1 个词。

四、输出生成

4.1 线性投影与Softmax

text

复制代码
解码器输出 → 线性层 → Softmax → 概率分布
数学表示

text

ini 复制代码
logits = DecoderOutput · W_vocab  # W_vocab ∈ ℝ^(d_model×vocab_size)
probs = softmax(logits)

4.2 训练与推理模式

训练阶段(Teacher Forcing)

text

css 复制代码
输入: <SOS> 我 爱 你
目标: 我 爱 你 <EOS>

流程:
1. 解码器输入: <SOS> 我 爱 你
2. 预测下一个词: P(我), P(爱), P(你), P(<EOS>)
3. 计算交叉熵损失
推理阶段(自回归生成)

python

ini 复制代码
def generate(input_ids, max_length=50):
    # 编码器前向传播
    encoder_output = encoder(input_ids)
    
    # 初始化解码器输入
    decoder_input = torch.tensor([[SOS_TOKEN_ID]])
    
    for step in range(max_length):
        # 解码器前向传播
        decoder_output = decoder(decoder_input, encoder_output)
        
        # 获取下一个词的概率分布
        next_token_logits = lm_head(decoder_output[:, -1, :])
        next_token_probs = F.softmax(next_token_logits, dim=-1)
        
        # 选择下一个词(贪婪采样或束搜索)
        next_token_id = torch.argmax(next_token_probs, dim=-1)
        
        # 如果生成了结束符,停止生成
        if next_token_id == EOS_TOKEN_ID:
            break
            
        # 将新词元添加到输入中
        decoder_input = torch.cat([decoder_input, next_token_id.unsqueeze(0)], dim=1)
    
    return decoder_input

4.3 生成策略

策略 描述 优点 缺点
贪婪解码 每步选择概率最高的词元 简单快速 容易陷入局部最优,缺乏多样性
束搜索 每步保留 k 个最佳候选序列 质量更高 计算开销大,可能产生重复
采样 根据概率分布随机采样 多样性好 可能生成不连贯的文本
温度采样 调整概率分布的平滑度 平衡质量与多样性 需要调优温度参数
Top-k/p采样 限制采样空间 减少低质量输出 需要选择超参数

五、关键数学公式汇总

5.1 注意力机制

缩放点积注意力:

text

scss 复制代码
Attention(Q, K, V) = softmax(QK^T / √d_k) V

多头注意力:

text

scss 复制代码
MultiHead(Q, K, V) = Concat(head_1, ..., head_h) W^O
head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)

5.2 位置编码

正弦余弦编码:

text

scss 复制代码
PE(pos, 2i) = sin(pos / 10000^(2i/d))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d))

5.3 前馈网络

text

scss 复制代码
FFN(x) = max(0, xW_1 + b_1)W_2 + b_2

5.4 层归一化

text

scss 复制代码
LayerNorm(x) = γ ⊙ (x - μ) / √(σ² + ε) + β
其中 μ, σ 为均值和标准差,γ, β 为可学习参数

六、变体与扩展

6.1 仅编码器模型(如 BERT)

  • 用途:自然语言理解任务
  • 结构:仅使用编码器部分
  • 预训练任务:掩码语言建模、下一句预测

6.2 仅解码器模型(如 GPT 系列)

  • 用途:文本生成任务
  • 结构:仅使用解码器部分(移除编码器-解码器注意力)
  • 预训练任务:自回归语言建模

6.3 编码器-解码器模型(原始 Transformer)

  • 用途:序列到序列任务
  • 结构:完整的编码器-解码器架构
  • 应用:机器翻译、文本摘要

七、优化技巧

7.1 训练优化

  1. 梯度累积:模拟大批量训练
  2. 混合精度训练:减少内存占用,加快计算
  3. 学习率调度:Warmup + 衰减策略

7.2 内存优化

  1. 梯度检查点:用时间换空间
  2. 激活重计算:减少中间激活存储
  3. 模型并行:将模型分布到多个设备

7.3 推理优化

  1. 键值缓存:避免重复计算
  2. 量化:降低权重精度
  3. 模型剪枝:移除不重要的权重

八、应用场景

  1. 机器翻译:原始应用场景
  2. 文本生成:故事创作、代码生成
  3. 问答系统:阅读理解、开放域问答
  4. 文本摘要:提取式、生成式摘要
  5. 语音识别与合成:语音到文本、文本到语音

总结

Transformer 通过完全基于注意力机制的架构,解决了传统序列模型在并行化和长程依赖方面的局限性。其核心创新包括:

  1. 自注意力机制:允许序列中任意位置直接交互
  2. 位置编码:为模型注入顺序信息
  3. 多头注意力:并行捕捉不同子空间的信息
  4. 残差连接与层归一化:稳定深层网络训练

这种架构不仅成为自然语言处理的基石,也逐渐扩展到计算机视觉、多模态学习等领域,推动了深度学习的发展。

相关推荐
Light602 小时前
破局而立:制造业软件企业的模式重构与AI赋能新路径
人工智能·云原生·工业软件·商业模式创新·ai赋能·人机协同·制造业软件
Quintus五等升2 小时前
深度学习①|线性回归的实现
人工智能·python·深度学习·学习·机器学习·回归·线性回归
natide2 小时前
text-generateion-webui模型加载器(Model Loaders)选项
人工智能·llama
野生的码农2 小时前
码农的妇产科实习记录
android·java·人工智能
TechubNews2 小时前
2026 年观察名单:基于 a16z「重大构想」,详解稳定币、RWA 及 AI Agent 等 8 大流行趋势
大数据·人工智能·区块链
脑极体2 小时前
机器人的罪与罚
人工智能·机器人
三不原则2 小时前
故障案例:容器启动失败排查(AI运维场景)——从日志分析到根因定位
运维·人工智能·kubernetes
点云SLAM3 小时前
凸优化(Convex Optimization)理论(1)
人工智能·算法·slam·数学原理·凸优化·数值优化理论·机器人应用
会周易的程序员3 小时前
多模态AI 基于工业级编译技术的PLC数据结构解析与映射工具
数据结构·c++·人工智能·单例模式·信息可视化·架构
BlockWay3 小时前
WEEX 成为 LALIGA 西甲联赛香港及台湾地区官方区域合作伙伴
大数据·人工智能·安全