Transformer:从自然语言处理到计算机视觉的革命性架构

Transformer 架构自 2017 年由 Vaswani 等人在论文《Attention Is All You Need》中提出后,迅速成为人工智能领域的基石,彻底改变了自然语言处理(NLP)的格局,并成功跨界至计算机视觉(CV)等多个领域,催生了以 GPT、BERT 为代表的大语言模型(LLM)时代 。

一、核心思想:自注意力机制

Transformer 摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),完全依赖自注意力机制来建模序列中任意两个元素之间的依赖关系,无论它们之间的距离有多远。

自注意力机制的核心计算过程如下:

import torch
import torch.nn.functional as F

def scaled_dot_product_attention(query, key, value, mask=None):
    """
缩放点积注意力机制 Args:
        query: 查询张量,形状为 (batch_size, num_heads, seq_len_q, depth)
        key: 键张量,形状为 (batch_size, num_heads, seq_len_k, depth)
        value: 值张量,形状为 (batch_size, num_heads, seq_len_v, depth_v)
        mask: 可选的掩码张量
    Returns:
        注意力加权的输出,注意力权重
    """
    # 1. 计算 Q和 K 的点积
    matmul_qk = torch.matmul(query, key.transpose(-2, -1))  # (..., seq_len_q, seq_len_k)

    # 2. 缩放:除以 sqrt(d_k),防止点积过大导致 softmax 梯度消失 d_k = query.size(-1)
    scaled_attention_logits = matmul_qk / torch.sqrt(torch.tensor(d_k, dtype=torch.float32))

    # 3. 应用掩码(如需要,在解码器中屏蔽未来位置)
    if mask is not None:
        scaled_attention_logits += (mask * -1e9)

    # 4. 应用 softmax 获取注意力权重
    attention_weights = F.softmax(scaled_attention_logits, dim=-1)  # (..., seq_len_q, seq_len_k)

    # 5. 用注意力权重加权 Value 值 output = torch.matmul(attention_weights, value)  # (..., seq_len_q, depth_v)

    return output, attention_weights

这种机制使得模型能够并行处理整个序列,极大提升了训练效率,并有效解决了长距离依赖问题 。

二、Transformer 架构详解

标准的 Transformer 模型由编码器(Encoder)和解码器(Decoder)堆叠而成。

1. 编码器与解码器结构对比

组件 编码器 (Encoder) 解码器 (Decoder)
核心层数 N x (相同) N x (相同)
子层构成 1. 多头自注意力层
2. 前馈神经网络层
1. 掩码多头自注意力层
2. 编码器-解码器注意力层
3. 前馈神经网络层
注意力机制 自注意力:关注输入序列自身所有位置。 1. 掩码自注意力:仅关注当前位置及之前的输出序列,防止信息泄露。
2. 交叉注意力:关注编码器的最终输出。
主要功能 提取输入序列的上下文表示。 基于编码器表示和已生成部分,自回归地生成输出序列。
典型应用 BERT(仅使用编码器) GPT(仅使用解码器)

2. 关键子模块* 位置编码 (Positional Encoding):由于 Transformer 本身不具备序列顺序信息,需要向输入嵌入中添加位置编码。通常使用正弦和余弦函数来生成 。

  • 前馈神经网络 (Feed-Forward Network, FFN):每个注意力层后接一个全连接前馈网络,通常包含两个线性变换和一个 ReLU 激活函数,对每个位置独立进行非线性变换 。
  • 残差连接与层归一化:每个子层(注意力、FFN)都采用残差连接,并后接层归一化,以缓解深层网络训练中的梯度消失问题,稳定训练过程。

三、Transformer 的变体与应用演进

Transformer 的灵活性催生了多种变体,适应不同任务。

1. 仅编码器模型 (Encoder-Only)

BERT 为代表,通过“掩码语言模型”进行双向预训练,擅长理解类任务,如文本分类、命名实体识别、问答系统 。

2. 仅解码器模型 (Decoder-Only)

GPT 系列 为代表,采用自回归语言建模进行预训练,从左到右生成文本,在文本生成、对话、代码补全等方面表现卓越 。ChatGPT 的核心 GPT-3.5 模型即基于此架构,并通过 RLHF(基于人类反馈的强化学习)进行对齐优化 。

3. 编码器-解码器模型 (Encoder-Decoder)

原始 Transformer 结构,适用于需要根据输入生成输出的任务,如机器翻译、文本摘要。T5、BART 是典型代表。

4. 在计算机视觉中的应用

Transformer 成功跨界 CV,催生了 Vision Transformer (ViT)。MaskDINO 是近期一个突出代表,它将 Transformer 的统一查询机制与掩码生成能力结合,在实例分割、全景分割和语义分割等多个视觉分割任务上达到了领先水平 。其核心创新在于统一的可学习查询机制混合匹配策略,显著提升了模型处理复杂场景和小目标的能力 。

四、核心优势与当前挑战

优势

  1. 强大的长程依赖建模能力:自注意力机制直接连接序列中任意位置。
  2. 高度的并行化:摆脱了 RNN 的序列依赖,训练速度大幅提升。
  3. 可扩展性:模型性能通常随参数规模和数据量的增加而显著提升。
  4. 架构统一:为 NLP、CV、多模态任务提供了统一的建模框架。

挑战与局限

  1. 计算与内存开销大:自注意力的计算复杂度随序列长度呈二次方增长,处理长文本或高分辨率图像时成本高昂。
  2. “幻觉”问题:生成模型可能产生看似合理但不符合事实或逻辑的内容,这是大语言模型面临的主要挑战之一 。
  3. 知识截止与更新滞后:模型的知识局限于训练数据,无法实时获取新信息 。
  4. 缺乏真正的推理与规划能力:模型本质上是基于统计模式的相关性计算,而非逻辑推理 。

五、代码实践:简易 Transformer 编码器层

以下是一个使用 PyTorch 实现的简化版 Transformer 编码器层:

import torch
import torch.nn as nnclass TransformerEncoderLayer(nn.Module):
    """简化版 Transformer 编码器层"""
    def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1):
        super().__init__()
        self.self_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout, batch_first=True)
        # 前馈网络 self.linear1 = nn.Linear(d_model, dim_feedforward)
        self.dropout = nn.Dropout(dropout)
        self.linear2 = nn.Linear(dim_feedforward, d_model)
        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        self.dropout1 = nn.Dropout(dropout)
        self.dropout2 = nn.Dropout(dropout)
        self.activation = nn.ReLU()

    def forward(self, src, src_mask=None, src_key_padding_mask=None):
        # 第一部分:多头自注意力 + 残差 & 层归一化 src2 = self.self_attn(src, src, src, attn_mask=src_mask,
 key_padding_mask=src_key_padding_mask)[0]
        src = src + self.dropout1(src2)
        src = self.norm1(src)

        # 第二部分:前馈网络 + 残差 & 层归一化
        src2 = self.linear2(self.dropout(self.activation(self.linear1(src))))
        src = src + self.dropout2(src2)
        src = self.norm2(src)
        return src

# 示例用法
if __name__ == "__main__":
    batch_size = 4
    seq_len = 10 d_model = 512
    num_heads = 8

    encoder_layer = TransformerEncoderLayer(d_model=d_model, nhead=num_heads)
    # 模拟输入:形状为 (batch_size, sequence_length, d_model)
    x = torch.randn(batch_size, seq_len, d_model)
    output = encoder_layer(x)
    print(f"输入形状: {x.shape}")
    print(f"编码器层输出形状: {output.shape}")  # 应保持 (4, 10, 512)

总结

Transformer 架构以其核心的自注意力机制,为序列建模提供了强大、并行且可扩展的解决方案。它不仅是当今大语言模型(如 GPT、ChatGPT)的引擎 ,也正在重塑计算机视觉等领域 。尽管面临计算成本、幻觉等挑战 ,但其作为基础架构的潜力仍在不断被挖掘,持续推动着人工智能技术的发展。理解 Transformer是深入现代 AI,尤其是 NLP 和 CV 前沿应用的关键。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐