Transformer架构深度解析:现代AI的基石


✨"俺はモンキー・D・ルフィ。海贼王になる男だ!"


引言

2017年,Google团队发表了划时代论文《Attention Is All You Need》,提出了Transformer架构。这个架构彻底改变了自然语言处理领域,成为了ChatGPT、BERT等大模型的基础。

为什么需要Transformer?

在Transformer之前,RNN和LSTM是处理序列数据的主流模型,但它们存在两个主要问题:

问题 说明
顺序计算限制 无法并行处理,训练速度慢
长距离依赖 难以记住长序列中的早期信息

Transformer通过自注意力机制解决了这些问题。

整体架构

解码器
编码器
Self-Attention层
Feed Forward层
Masked Self-Attention
Cross-Attention
Feed Forward层
输入嵌入
输出嵌入
线性+Softmax

核心组件详解

1. 自注意力机制(Self-Attention)

自注意力是Transformer的核心,让模型能够关注序列中不同位置的关系。
输入向量 X
生成 Q, K, V
计算 Attention Score
缩放点积
Softmax归一化
加权求和

计算公式
复制代码
Attention(Q, K, V) = softmax(QK^T / √d_k) × V
  • Q(Query):查询向量,表示要找什么
  • K(Key):键向量,表示被查询的内容
  • V(Value):值向量,表示实际内容
代码实现
python 复制代码
import torch
import torch.nn as nn
import torch.nn.functional as F

class SelfAttention(nn.Module):
    def __init__(self, embed_size, heads):
        super(SelfAttention, self).__init__()
        self.embed_size = embed_size
        self.heads = heads
        self.head_dim = embed_size // heads

        # 线性变换生成Q, K, V
        self.values = nn.Linear(self.head_dim, self.head_dim, bias=False)
        self.keys = nn.Linear(self.head_dim, self.head_dim, bias=False)
        self.queries = nn.Linear(self.head_dim, self.head_dim, bias=False)

        # 输出投影
        self.fc_out = nn.Linear(heads * self.head_dim, embed_size)

    def forward(self, values, keys, query, mask):
        N = query.shape[0]  # batch size
        value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]

        # 分割成多个头
        values = values.reshape(N, value_len, self.heads, self.head_dim)
        keys = keys.reshape(N, key_len, self.heads, self.head_dim)
        queries = query.reshape(N, query_len, self.heads, self.head_dim)

        # 计算注意力分数
        energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])

        # 缩放
        energy = energy / (self.embed_size ** (1/2))

        # Mask(可选,用于解码器)
        if mask is not None:
            energy = energy.masked_fill(mask == 0, float("-1e20"))

        # Softmax
        attention = torch.softmax(energy, dim=3)

        # 加权求和
        out = torch.einsum("nhql,nlhd->nqhd", [attention, values])

        # 拼接所有头
        out = out.reshape(N, query_len, self.heads * self.head_dim)

        return self.fc_out(out)

2. 多头注意力(Multi-Head Attention)

多头注意力让模型从不同角度理解输入:
输入
头1: 关注语法
头2: 关注语义
头3: 关注上下文
头4: 关注情感
拼接
线性变换

python 复制代码
class TransformerBlock(nn.Module):
    def __init__(self, embed_size, heads, dropout, forward_expansion):
        super(TransformerBlock, self).__init__()
        self.attention = SelfAttention(embed_size, heads)
        self.norm1 = nn.LayerNorm(embed_size)
        self.norm2 = nn.LayerNorm(embed_size)

        self.feed_forward = nn.Sequential(
            nn.Linear(embed_size, forward_expansion * embed_size),
            nn.ReLU(),
            nn.Linear(forward_expansion * embed_size, embed_size)
        )

        self.dropout = nn.Dropout(dropout)

    def forward(self, value, key, query, mask):
        # 多头注意力 + 残差连接
        attention = self.attention(value, key, query, mask)
        x = self.dropout(self.norm1(attention + query))

        # 前馈网络 + 残差连接
        forward = self.feed_forward(x)
        out = self.dropout(self.norm2(forward + x))
        return out

3. 位置编码(Positional Encoding)

由于注意力机制没有顺序概念,需要位置编码注入位置信息:

python 复制代码
class PositionalEncoding(nn.Module):
    def __init__(self, embed_size, max_len=5000):
        super(PositionalEncoding, self).__init__()

        # 创建位置编码矩阵
        pe = torch.zeros(max_len, embed_size)
        position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
        div_term = torch.exp(torch.arange(0, embed_size, 2).float() *
                             (-math.log(10000.0) / embed_size))

        pe[:, 0::2] = torch.sin(position * div_term)
        pe[:, 1::2] = torch.cos(position * div_term)
        pe = pe.unsqueeze(0)

        # 注册为buffer(不是参数,但会保存到模型)
        self.register_buffer('pe', pe)

    def forward(self, x):
        # x shape: [batch_size, seq_len, embed_size]
        return x + self.pe[:, :x.size(1)]

完整Transformer实现

python 复制代码
import math
import torch
import torch.nn as nn

class Transformer(nn.Module):
    def __init__(self, src_vocab_size, trg_vocab_size, embed_size=512,
                 num_layers=6, heads=8, forward_expansion=4, dropout=0.1):
        super(Transformer, self).__init__()

        # 词嵌入
        self.src_word_embedding = nn.Embedding(src_vocab_size, embed_size)
        self.trg_word_embedding = nn.Embedding(trg_vocab_size, embed_size)

        # 位置编码
        self.position_encoding = PositionalEncoding(embed_size)

        # 编码器层
        self.encoder = nn.ModuleList([
            TransformerBlock(embed_size, heads, dropout, forward_expansion)
            for _ in range(num_layers)
        ])

        # 解码器层
        self.decoder = nn.ModuleList([
            TransformerBlock(embed_size, heads, dropout, forward_expansion)
            for _ in range(num_layers)
        ])

        # 输出层
        self.fc_out = nn.Linear(embed_size, trg_vocab_size)
        self.dropout = nn.Dropout(dropout)

    def forward(self, src, trg, src_mask, trg_mask):
        # 嵌入 + 位置编码
        src_embed = self.dropout(self.position_encoding(self.src_word_embedding(src)))
        trg_embed = self.dropout(self.position_encoding(self.trg_word_embedding(trg)))

        # 编码器
        enc_output = src_embed
        for layer in self.encoder:
            enc_output = layer(enc_output, enc_output, enc_output, src_mask)

        # 解码器
        dec_output = trg_embed
        for layer in self.decoder:
            dec_output = layer(dec_output, enc_output, dec_output, trg_mask)

        # 输出预测
        out = self.fc_out(dec_output)
        return out

Transformer处理流程

输出概率 解码器×N层 编码器×N层 词嵌入+位置编码 输入序列 输出概率 解码器×N层 编码器×N层 词嵌入+位置编码 输入序列 Token IDs 添加位置信息 编码后的向量 多层注意力处理 编码器输出(作为K,V) 自注意力+交叉注意力 预测下一个词

实际应用示例:机器翻译

python 复制代码
# 简化的翻译模型使用示例
def translate_sentence(model, sentence, src_vocab, trg_vocab, device, max_length=50):
    model.eval()

    # 分词并转换为索引
    tokens = [src_vocab.get(token, src_vocab['<unk>']) for token in sentence.split()]
    tokens = torch.LongTensor(tokens).unsqueeze(0).to(device)

    # 创建目标序列(从<sos>开始)
    trg_tensor = torch.LongTensor([[trg_vocab['<sos>']]]).to(device)

    with torch.no_grad():
        for _ in range(max_length):
            # 生成mask
            trg_mask = (trg_tensor != trg_vocab['<pad>']).unsqueeze(1)

            # 前向传播
            output = model(tokens, trg_tensor, src_mask=None, trg_mask=trg_mask)

            # 获取预测的下一个词
            pred_token = output.argmax(2)[:, -1].item()

            # 如果是结束符,停止
            if pred_token == trg_vocab['<eos>']:
                break

            # 添加到输出序列
            trg_tensor = torch.cat([trg_tensor,
                                   torch.LongTensor([[pred_token]]).to(device)], dim=1)

    return trg_tensor

Transformer家族

Transformer
编码器为主
BERT
RoBERTa
ALBERT
解码器为主
GPT系列
BLOOM
LLaMA
编解码器
原始Transformer
T5
BART

总结

Transformer的核心优势:

  1. 并行计算:所有位置同时处理,训练速度快
  2. 长距离依赖:注意力机制直接连接任意位置
  3. 可扩展性:通过增加heads和layers提升性能
  4. 通用性强:适用于NLP、CV、多模态等多种任务

进一步学习

  • BERT:双向编码器,适合理解任务
  • GPT:自回归解码器,适合生成任务
  • ViT:将Transformer应用于计算机视觉
  • Efficient Transformer:线性注意力等优化方法

参考资料:

相关推荐
阿里云大数据AI技术4 分钟前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客4 分钟前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术1 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO1 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术2 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架2 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab2 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI2 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算
冬奇Lab2 小时前
【无标题】
人工智能·开源
专业贴准3 小时前
苏州SMT供料器设备选型分析:本地主流自动化企业技术特点与行业趋势
人工智能·自动化·制造