Transformer架构变体全景图:从BERT到GPT的演化路径

作者:七宝大爷日期:2025/12/5

引言:从单一架构到多元生态

2017年,Vaswani等人发表的《Attention is All You Need》论文提出了Transformer架构,彻底改变了自然语言处理领域的发展轨迹。最初的Transformer采用编码器-解码器结构,为机器翻译任务而设计。然而,在随后的发展中,研究人员发现这种架构的各个组件具有独立的实用价值,从而衍生出三大主流技术路线:仅编码器架构仅解码器架构编码器-解码器架构

本文将系统梳理Transformer架构的主要变体,分析其技术特点、适用场景及演化逻辑,为研究者和工程师提供全面的技术图谱。

1. 原始Transformer:技术基石

原始Transformer架构奠定了所有变体的基础,其核心组件包括:

1.1 自注意力机制

1import torch
2import torch.nn as nn
3import math
4
5class MultiHeadAttention(nn.Module):
6    def __init__(self, d_model, num_heads):
7        super(MultiHeadAttention, self).__init__()
8        self.d_model = d_model
9        self.num_heads = num_heads
10        self.d_k = d_model // num_heads
11        
12        self.W_q = nn.Linear(d_model, d_model)
13        self.W_k = nn.Linear(d_model, d_model)
14        self.W_v = nn.Linear(d_model, d_model)
15        self.W_o = nn.Linear(d_model, d_model)
16        
17    def scaled_dot_product_attention(self, Q, K, V, mask=None):
18        scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.d_k)
19        if mask is not None:
20            scores = scores.masked_fill(mask == 0, -1e9)
21        attention_weights = torch.softmax(scores, dim=-1)
22        output = torch.matmul(attention_weights, V)
23        return output, attention_weights
24

1.2 位置编码

1class PositionalEncoding(nn.Module):
2    def __init__(self, d_model, max_len=5000):
3        super(PositionalEncoding, self).__init__()
4        
5        pe = torch.zeros(max_len, d_model)
6        position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
7        div_term = torch.exp(torch.arange(0, d_model, 2).float() * 
8                           (-math.log(10000.0) / d_model))
9        
10        pe[:, 0::2] = torch.sin(position * div_term)
11        pe[:, 1::2] = torch.cos(position * div_term)
12        pe = pe.unsqueeze(0)
13        self.register_buffer('pe', pe)
14        
15    def forward(self, x):
16        return x + self.pe[:, :x.size(1)]
17

2. 仅编码器架构:理解型模型的崛起

2.1 BERT:双向编码的代表

BERT(Bidirectional Encoder Representations from Transformers)开启了预训练-微调范式的新时代。其核心创新在于:

技术特点:

  • 掩码语言建模(MLM):随机遮盖15%的token进行预测
  • 下一句预测(NSP):判断两个句子是否连续
  • 纯编码器架构,适合理解任务
1# BERT风格的掩码语言建模示例
2class MLMHead(nn.Module):
3    def __init__(self, d_model, vocab_size):
4        super(MLMHead, self).__init__()
5        self.dense = nn.Linear(d_model, d_model)
6        self.layer_norm = nn.LayerNorm(d_model)
7        self.decoder = nn.Linear(d_model, vocab_size)
8        
9    def forward(self, hidden_states):
10        hidden_states = self.dense(hidden_states)
11        hidden_states = torch.gelu(hidden_states)
12        hidden_states = self.layer_norm(hidden_states)
13        prediction_scores = self.decoder(hidden_states)
14        return prediction_scores
15

2.2 RoBERTa、ALBERT等改进变体

基于BERT的改进主要集中在预训练策略和模型效率上:

模型核心改进参数量主要特点
BERT-base基准模型110MMLM + NSP, 12层
RoBERTa优化训练125M移除NSP, 更大批次, 更多数据
ALBERT参数效率12M参数共享, 因式分解嵌入
DistilBERT模型压缩66M知识蒸馏, 减少层数
ELECTRA样本效率110M替换token检测, 更高效预训练

3. 仅解码器架构:生成式模型的辉煌

3.1 GPT系列:自回归生成的演进

GPT(Generative Pre-trained Transformer)系列代表了仅解码器架构的发展主线:

技术演进路径:

  • GPT-1:验证预训练+微调的有效性
  • GPT-2:证明零样本学习能力,参数量15亿
  • GPT-3:突破规模限制,参数量1750亿
  • GPT-4:多模态能力,混合专家架构
1class GPTBlock(nn.Module):
2    def __init__(self, d_model, num_heads, dropout=0.1):
3        super(GPTBlock, self).__init__()
4        self.ln1 = nn.LayerNorm(d_model)
5        self.attn = MultiHeadAttention(d_model, num_heads)
6        self.ln2 = nn.LayerNorm(d_model)
7        self.mlp = nn.Sequential(
8            nn.Linear(d_model, 4 * d_model),
9            nn.GELU(),
10            nn.Linear(4 * d_model, d_model),
11            nn.Dropout(dropout)
12        )
13        
14    def forward(self, x, attention_mask=None):
15        # 自注意力 + 残差连接
16        attn_output, _ = self.attn(self.ln1(x), self.ln1(x), self.ln1(x), attention_mask)
17        x = x + attn_output
18        
19        # 前馈网络 + 残差连接
20        ff_output = self.mlp(self.ln2(x))
21        x = x + ff_output
22        return x
23

3.2 因果自注意力机制

仅解码器架构的核心是因果自注意力,确保每个位置只能关注之前的位置:

1def causal_attention_mask(seq_len, device):
2    """生成因果注意力掩码"""
3    mask = torch.tril(torch.ones(seq_len, seq_len, device=device))
4    return mask.view(1, 1, seq_len, seq_len)
5
6# 在注意力计算中的应用
7scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(d_k)
8causal_mask = causal_attention_mask(seq_len, Q.device)
9scores = scores.masked_fill(causal_mask == 0, -1e9)
10attention_weights = torch.softmax(scores, dim=-1)
11

4. 编码器-解码器架构:序列到学习的延续

4.1 T5:文本到文本的统一框架

T5(Text-to-Text Transfer Transformer)将所有NLP任务统一为文本到文本的格式:

1class T5Architecture(nn.Module):
2    def __init__(self, vocab_size, d_model, num_layers, num_heads):
3        super(T5Architecture, self).__init__()
4        self.encoder = TransformerEncoder(vocab_size, d_model, num_layers, num_heads)
5        self.decoder = TransformerDecoder(vocab_size, d_model, num_layers, num_heads)
6        
7    def forward(self, encoder_inputs, decoder_inputs):
8        encoder_output = self.encoder(encoder_inputs)
9        decoder_output = self.decoder(decoder_inputs, encoder_output)
10        return decoder_output
11

4.2 BART:去噪自编码器方法

BART结合了BERT的去噪预训练和GPT的自回归生成:

预训练任务:

  • 文本填充
  • 句子重排
  • 文档旋转
  • token删除

5. 稀疏与高效架构:应对计算挑战

5.1 稀疏注意力变体

1class SparseAttention(nn.Module):
2    def __init__(self, d_model, num_heads, block_size=64):
3        super(SparseAttention, self).__init__()
4        self.d_model = d_model
5        self.num_heads = num_heads
6        self.block_size = block_size
7        self.d_k = d_model // num_heads
8        
9    def block_sparse_attention(self, Q, K, V):
10        batch_size, seq_len, d_model = Q.shape
11        
12        # 将序列分块
13        num_blocks = seq_len // self.block_size
14        Q_blocks = Q.view(batch_size, num_blocks, self.block_size, d_model)
15        K_blocks = K.view(batch_size, num_blocks, self.block_size, d_model)
16        
17        # 块间注意力计算
18        output_blocks = []
19        for i in range(num_blocks):
20            # 每个块只与相邻块计算注意力
21            start_block = max(0, i - 1)
22            end_block = min(num_blocks, i + 2)
23            
24            relevant_K = K_blocks[:, start_block:end_block, :, :]
25            relevant_V = V_blocks[:, start_block:end_block, :, :]
26            
27            # 计算块间注意力
28            block_output = self.compute_block_attention(
29                Q_blocks[:, i:i+1, :, :], 
30                relevant_K, 
31                relevant_V
32            )
33            output_blocks.append(block_output)
34            
35        return torch.cat(output_blocks, dim=1)
36

5.2 高效变体对比

模型注意力类型复杂度适用场景
Transformer全注意力O(n²)通用任务
Longformer局部+全局注意力O(n)长文档
BigBird块稀疏注意力O(n)极长序列
Performer线性注意力O(n)资源受限
Linformer低秩投影O(n)资源受限

6. 专家混合架构:规模化的新范式

6.1 Switch Transformer

1class MoELayer(nn.Module):
2    def __init__(self, d_model, num_experts, expert_capacity):
3        super(MoELayer, self).__init__()
4        self.experts = nn.ModuleList([
5            nn.Sequential(
6                nn.Linear(d_model, 4 * d_model),
7                nn.GELU(),
8                nn.Linear(4 * d_model, d_model)
9            ) for _ in range(num_experts)
10        ])
11        self.gate = nn.Linear(d_model, num_experts)
12        self.num_experts = num_experts
13        self.expert_capacity = expert_capacity
14        
15    def forward(self, x):
16        # 门控网络决定路由
17        gate_scores = self.gate(x)
18        routing_weights = torch.softmax(gate_scores, dim=-1)
19        
20        # 选择top-k专家
21        top_k = 2  # 通常选择1或2个专家
22        routing_weights, selected_experts = torch.topk(routing_weights, top_k, dim=-1)
23        
24        # 归一化权重
25        routing_weights = routing_weights / routing_weights.sum(dim=-1, keepdim=True)
26        
27        # 专家计算
28        final_output = torch.zeros_like(x)
29        for expert_idx in range(self.num_experts):
30            expert_mask = (selected_experts == expert_idx).any(dim=-1)
31            if expert_mask.any():
32                expert_input = x[expert_mask]
33                expert_output = self.experts[expert_idx](expert_input)
34                
35                # 加权求和
36                expert_weights = routing_weights[expert_mask]
37                final_output[expert_mask] += expert_output * expert_weights.unsqueeze(-1)
38                
39        return final_output
40

7. 技术演进趋势与未来展望

7.1 架构融合趋势

当前的技术发展显示出明显的融合趋势:

  1. 编码器-解码器的边界模糊化:如UNILM统一了理解和生成任务
  2. 稀疏与稠密注意力结合:根据任务需求动态选择注意力模式
  3. 预训练范式统一:各种架构逐渐采用相似的预训练目标

7.2 关键技术挑战

1# 未来架构可能的发展方向示例
2class AdaptiveTransformer(nn.Module):
3    def __init__(self, config):
4        super().__init__()
5        self.config = config
6        # 动态选择注意力机制
7        self.attention_router = AttentionRouter(d_model=config.d_model)
8        # 可变的计算路径
9        self.computation_path = DynamicComputationPath()
10        
11    def forward(self, x, task_type=None):
12        # 根据输入特性和任务类型选择最佳计算路径
13        attention_type = self.attention_router(x, task_type)
14        if attention_type == "sparse":
15            output = self.sparse_attention(x)
16        elif attention_type == "dense":
17            output = self.dense_attention(x)
18        elif attention_type == "linear":
19            output = self.linear_attention(x)
20        return output
21

7.3 性能对比分析

下表展示了不同架构变体在各项指标上的表现:

架构类型代表模型训练效率推理速度可扩展性任务适应性
仅编码器BERT中等理解任务优秀
仅解码器GPT系列中等中等优秀生成任务优秀
编码器-解码器T5较低较低良好通用性强
稀疏架构Longformer中等优秀长序列处理
混合专家Switch Transformer可变极优秀大规模预训练

结论

Transformer架构的演化路径体现了深度学习领域的技术发展逻辑:从通用架构到专用优化,从单一范式到多元融合。BERT和GPT作为两大技术路线代表,分别推动了理解型和生成型模型的发展,而后续的变体则在效率、规模和适用性方面不断突破。


Transformer架构变体全景图:从BERT到GPT的演化路径》 是转载文章,点击查看原文


相关推荐


国内直连!Gemini 3.0最新免费使用教程
Lethehong2025/12/2

近日,谷歌新一代AI模型Gemini 3.0再次引爆科技圈,其强大的代码生成和多模态理解能力令人惊叹。无论是一键生成完整操作系统界面、视频编辑器,还是解析复杂的手写文档,Gemini 3.0都展现出了碾压级的性能表现。 对于国内用户来说,最大的好消息是:现在无需特殊网络环境,也能直接使用这一尖端AI技术。本文将为大家详细介绍几种国内直连Gemini 3.0的免费方法。 这段时间,下面这个在海外平台爆火,短时间里突破了一百万的点击量。 展示了一个复刻MacOS的操作系统界面,重点是,它完全


别让 API Key 裸奔:基于 TRAE SOLO 的大模型安全配置最佳实践
Java私教2025/11/30

前言:前几天,我的一位创业朋友半夜给我打电话,声音都在抖。因为开发实习生不小心把带有 sk- 开头的 OpenAI Key 提交到了 GitHub 公开仓库。短短 15 分钟,信用卡被刷爆了 2000 美元。 这种“惨案”在 AI 开发圈子里简直太常见了。很多时候,我们只顾着让模型跑起来,却忘了给它穿上“防弹衣”。 今天不谈复杂的 DevSecOps,只聊聊在日常开发中,如何利用 TRAE SOLO 的原生能力,以最低的成本构建一套“防手抖”的 API Key 安全管理流程。 那些年我们踩过的


K8S 本地机器 windows 推送官方镜像到本地镜像仓库 (Docker) -- 以curl镜像为例
究極の法則に通じた野犬2025/11/27

1、我的私有镜像仓库为:192.168.152.135:5000 (实际上为我的本地虚拟机 linux操作系统)     先查看下它上面已经有哪些镜像了: 命令 curl http://192.168.152.135:5000/v2/_catalog 如图,可以看到当前本地镜像仓库中已经有了 busybox 和 nacos 两个镜像。 2、我本地的机器为win 11 先通过win11的powershell进入ubuntu子系统(预先要装好docker) 再从官方库拉取curl镜


外汇历史行情查询教程(接口调用篇)
quant_19862025/11/25

在外汇交易中,历史行情数据是一项非常重要的基础资源,它不仅用于策略开发、回测,也为技术分析、行情研究和长期市场规律总结提供数据支持。本教程将带你一步步学习如何通过 Infoway API 查询外汇历史价格数据,并完成一次真实的接口调用。 一、为什么需要外汇历史行情数据 1. 用于策略开发与回测 在进行交易策略设计时,我们不能仅靠理论想象,需要通过历史数据进行回测。在模拟历史行情中运行策略,可以: 评估策略是否具备可行性 分析策略在不同市场阶段的表现 找出策略的弱点并优化参数 没


Lua 的 ipairs 函数
IMPYLH2025/11/23

Lua 的 ipairs 函数 是一个用于迭代数组类型 table 的内置函数。它专门用于遍历从索引 1 开始的连续整数索引的数组部分。下面是关于 ipairs 的详细说明: 基本用法 ipairs 会返回三个值: 迭代器函数要遍历的 table初始索引值(通常为 0) 典型用法: for i, v in ipairs(t) do -- 循环体 end 工作特点 从索引 1 开始顺序遍历遇到 nil 值或非连续索引时会停止不会遍历 table 中的非数字键或非连续数字键


LangChain v1 重大更新讲解⚠⚠⚠
吴佳浩2025/11/21

LangChain v1 重大更新讲解 为什么没有先发布demo教学而是先发布一个什么重大更新 因为langchain更新了,更新还挺多的所以建议大家还是从新版本开始学习 作者:吴佳浩 最后更新:2025-11-22 适用版本:LangChain v1.0+ 目录 📌 一、LangChain v1 为什么是一次“大版本革命”? 🚀 二、v0.1 → v1.0:差异对照表(核心必读) 🧱 三、LangChain v1 架构总览 🧰 四、create_agent:全新的 Agent


2 种方法!用 n8n 自动发公众号
麦麦麦造2025/11/19

大家好,我是 MAI麦造 前段时间有朋友找我咨询 ==n8n 中如何自动发公众号的问题==,刚好发现了一些新手可能会遇到的坑,所以这里分享一下! [!Note] 我用了两种方法来实现,分别是: 自己手动配置 http 节点,实现公众号接口。 使用社区节点 各有自己适合的场景,所以根据自己的需求来选择即可。 不过都需要用到公众号的官方接口,所以先需要在公众号后台进行一下配置! 公众号后台配置 1. 获取 开发者 ID 和 开发者密码 通过设置与开发——开发接口管理——账号开发信息获取


某电商大厂技术面试场景解析
360_go_php2025/11/19

​ 在某电商大厂的技术面试中,候选人通常会面临一系列关于分布式系统、性能优化、数据一致性等问题。以下是一些常见的面试问题和解答,帮助你为面试做好准备。 1. 如果我的服务器IP地址变了,客户端如何感知到呢?​编辑 当服务器的IP地址发生变化时,客户端通常无法直接感知到变化,除非有特定的机制来解决这个问题。常见的解决方案包括: DNS(域名系统):通过DNS解析来动态更新服务器的IP地址。客户端会定期请求DNS,以获取最新的服务器IP。 负载均衡器:客户端通过负载均衡器进行访问,负载均衡器会维


STM32通信接口----USART
雾岛听风眠2025/11/17

STM32芯片里面集成了很多功能模块,如定时器计数、PWM输出、AD采集等,这些都是芯片内部的电路,这些电路的配置寄存器、数据寄存器斗殴在芯片里面,操作这些寄存器直接读写即可。但也有一些功能是STM32内部没有的,如蓝牙无线遥控功能、陀螺仪加速度计测量姿态的功能,只能外挂芯片来完成,外挂的芯片,数据都在STM32外面,STM32若想获取这些数据,则需在两个设备之间连接上一根或多跟通信线,通过通信线路发送或接收数据,完成数据交换,从而实现控制外挂模块和读取外挂模块数据的目的。 全双工:通信双方能


我开发了一款关于病历管理的app:安康记
叶子的技术碎碎念2025/11/16

上线了!上线了!基于Vibe Coding我终于也能独立开发出一款属于自己的app-安康记,目前终于成功上架App Store啦。 独立开发app这个事情我很早之前就有点念头,但学习Swift过程还挺痛苦的,总觉的各种语法糖很膈应,导致进度缓慢,后面就一直搁置了。ChatGPT出来之后也尝试了一点,但还是觉得当时的AI能力不够,并且纯靠聊天还是不太行,自从Cursor、Windsurf、CC、Codex这一类AI开发工具出来之后,Vibe Coding的概念也随之火热,我想也是时候重启自己的开发

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读