ViT 结构描述:从 Patch Embedding 到 Transformer 编码器

副标题 / 摘要 ViT 把图像切成 patch 序列,再交给 Transformer 编码器处理。本文用 ACERS 框架拆解 ViT 的核心结构与工程选择,并提供最小可运行的 PyTorch 示例。 预计阅读时长:16~20 分钟 标签:vit、transformer、vision SEO 关键词:ViT, Vision Transformer, Patch Embedding, 图像分类 元描述:系统描述 ViT 架构与工程实践,含最小 PyTorch 示例。 目标读者 想理解 ViT 架构的入门读者 需要做视觉模型选型的工程实践者 想从 CNN 迁移到 Transformer 的开发者 背景 / 动机 CNN 通过局部卷积捕获特征,但长程依赖与全局建模能力有限。 ViT 把图像当成序列,直接用自注意力做全局建模, 在大规模数据预训练下表现非常强。 核心概念 Patch Embedding:将图像切成 patch 并线性投影。 Position Embedding:补充位置信息。 [CLS] Token:聚合全局特征用于分类。 Transformer Encoder:多头自注意力 + FFN 堆叠。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 ViT 的核心流程: 把图像切成固定大小 patch。 每个 patch 拉平成向量并投影成 token。 加上位置编码和 [CLS] token。 送入 Transformer Encoder 得到全局表征。 用 [CLS] token 输出做分类。 基础示例(1) 图像 224x224,patch 16x16 → 196 个 patch + 1 个 [CLS]。 基础示例(2) 只保留编码器,就能做图像分类与检索。 实践指南 / 步骤 选择 patch 大小(8/16/32)。 设置隐藏维度与层数(如 12 层,768 维)。 添加位置编码与 [CLS] token。 训练:优先用预训练权重再微调。 可运行示例(最小 ViT 前向) import torch import torch.nn as nn torch.manual_seed(42) class MiniViT(nn.Module): def __init__(self, img_size=32, patch=8, dim=64, depth=2, heads=4): super().__init__() self.patch = patch self.unfold = nn.Unfold(kernel_size=patch, stride=patch) num_patches = (img_size // patch) ** 2 self.proj = nn.Linear(3 * patch * patch, dim) self.cls = nn.Parameter(torch.zeros(1, 1, dim)) self.pos = nn.Parameter(torch.zeros(1, num_patches + 1, dim)) enc_layer = nn.TransformerEncoderLayer(d_model=dim, nhead=heads, batch_first=True) self.encoder = nn.TransformerEncoder(enc_layer, num_layers=depth) self.head = nn.Linear(dim, 10) def forward(self, x): patches = self.unfold(x).transpose(1, 2) # B, N, patch_dim tokens = self.proj(patches) cls = self.cls.expand(x.size(0), -1, -1) tokens = torch.cat([cls, tokens], dim=1) + self.pos z = self.encoder(tokens) return self.head(z[:, 0]) x = torch.randn(2, 3, 32, 32) model = MiniViT() print(model(x).shape) 解释与原理 patch embedding 把图像变成序列。 self-attention 能在全局范围建模依赖。 [CLS] token 作为全局聚合向量用于分类。 C — Concepts(核心思想) 方法类型 ViT 属于基于注意力的视觉表征模型,用 Transformer Encoder 替代卷积堆叠。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

BN 与 Dropout:训练与推理时的关键区别

副标题 / 摘要 BatchNorm 在训练使用 batch 统计、推理使用滑动均值方差;Dropout 训练时随机失活、推理时关闭。本文用 ACERS 框架解释两者差异并给出最小 PyTorch 示例。 预计阅读时长:12~16 分钟 标签:batchnorm、dropout、training SEO 关键词:BatchNorm, Dropout, 训练, 推理 元描述:对比 BN 与 Dropout 在训练与推理阶段的行为与工程取舍。 目标读者 想系统理解 BN/Dropout 差异的入门读者 需要调试训练/推理不一致问题的工程实践者 关注模型稳定性与泛化的开发者 背景 / 动机 很多线上问题来自“训练正常、推理异常”。 BN 与 Dropout 在训练/推理阶段的行为不同,是常见根因。 理解它们的机制差异,能显著减少定位成本。 核心概念 BatchNorm:用 batch 统计归一化特征,并维护 running mean/var。 Dropout:训练时随机失活部分神经元以正则化。 Train/Eval 模式:控制 BN/Dropout 行为的关键开关。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 BN 训练时用当前 batch 的均值与方差;推理时用历史统计。 Dropout 训练时随机丢弃;推理时关闭、输出稳定。 基础示例(1) BN:小 batch 训练可能统计不稳定,推理偏移明显。 基础示例(2) Dropout:训练输出有噪声,推理输出确定。 实践指南 / 步骤 训练时使用 model.train()。 推理时使用 model.eval()。 如果 batch 很小,考虑替代 BN(LayerNorm/GroupNorm)。 可运行示例(最小 PyTorch 对比) import torch import torch.nn as nn torch.manual_seed(42) model = nn.Sequential( nn.Linear(4, 4), nn.BatchNorm1d(4), nn.Dropout(p=0.5), ) x = torch.randn(3, 4) model.train() train_out1 = model(x) train_out2 = model(x) model.eval() eval_out1 = model(x) eval_out2 = model(x) print(torch.allclose(train_out1, train_out2)) # False (Dropout) print(torch.allclose(eval_out1, eval_out2)) # True 解释与原理 BN 在训练中依赖 batch 统计,推理依赖 running 统计。 Dropout 在训练中丢弃神经元以提升泛化,推理关闭以稳定输出。 C — Concepts(核心思想) 方法类型 BN 属于归一化技术,Dropout 属于正则化技术。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

Transformer 中可以用 BatchNorm 吗?

副标题 / 摘要 Transformer 默认使用 LayerNorm,但在某些视觉模型中也能看到 BatchNorm。本文解释 BN 在 Transformer 中的可行性、限制与适用场景,并提供最小 PyTorch 示例。 预计阅读时长:14~18 分钟 标签:transformer、batchnorm、layernorm SEO 关键词:BatchNorm, Transformer, LayerNorm 元描述:分析 Transformer 中使用 BatchNorm 的利弊与工程建议。 目标读者 想理解归一化策略差异的入门读者 需要提升训练稳定性的工程实践者 从事 NLP/视觉 Transformer 研发的开发者 背景 / 动机 Transformer 结构中常用 LayerNorm,但很多工程师会问:能不能用 BN? BN 在 CNN 中非常有效,但在序列模型上常受 batch 维度影响。 理解其差异能帮助你在不同场景下做更合理的选择。 核心概念 BatchNorm(BN):按 batch 维度归一化。 LayerNorm(LN):按特征维度归一化。 统计依赖:BN 依赖 batch 统计,LN 不依赖。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 BN 会把“整批样本”的均值/方差作为归一化基准。 LN 只看单个样本内部特征,更稳定。 基础示例(1) 小 batch 训练时,BN 的均值/方差噪声大,容易不稳定。 基础示例(2) CV Transformer 大 batch 训练时,BN 有时能提供更快收敛。 实践指南 / 步骤 NLP/小 batch → LN 更稳。 CV/大 batch → 可尝试 BN。 先做对比实验,再决定归一化方案。 可运行示例(最小 PyTorch 对比) import torch import torch.nn as nn torch.manual_seed(42) x = torch.randn(4, 8, 16) # batch, seq, dim # LayerNorm:按特征维度 ln = nn.LayerNorm(16) out_ln = ln(x) # BatchNorm:需要把特征维度转为 channel bn = nn.BatchNorm1d(16) out_bn = bn(x.transpose(1, 2)).transpose(1, 2) print(out_ln.mean(dim=-1).shape) print(out_bn.mean(dim=-1).shape) 解释与原理 BN 依赖 batch 统计,推理时使用滑动均值/方差。 LN 不依赖 batch,训练/推理一致。 Transformer 多用 LN 是为了适配小 batch 与序列任务。 C — Concepts(核心思想) 方法类型 BN/LN 都属于归一化方法,用于稳定训练与加速收敛。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

BN 与 LN 的区别:训练稳定性与工程取舍

副标题 / 摘要 BatchNorm 利用批内统计稳定训练,LayerNorm 基于单样本统计适配变长序列。本文用 ACERS 框架对比两者原理、场景与取舍,并给出最小 PyTorch 示例。 预计阅读时长:14~18 分钟 标签:batchnorm、layernorm、normalization SEO 关键词:BatchNorm, LayerNorm, 归一化 元描述:系统对比 BN 与 LN 的机制差异、工程成本与适用场景。 目标读者 想理解归一化差异的入门读者 需要在 CNN/Transformer 中做结构选型的工程实践者 关注训练稳定性与推理一致性的开发者 背景 / 动机 归一化是深度学习训练稳定性的核心技术。 BN 在视觉模型中表现优秀,但在 NLP/小批量场景中常不稳定。 LN 则不依赖 batch 大小,成为 Transformer 的默认选择。 核心概念 BatchNorm(BN):按 batch 维度统计均值/方差。 LayerNorm(LN):按特征维度统计均值/方差。 训练/推理差异:BN 需要 running stats,LN 不需要。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 BN:用“整批样本”的统计量做归一化。 LN:用“单个样本”的特征统计量做归一化。 基础示例(1) CNN 大 batch 训练时,BN 统计稳定,收敛更快。 基础示例(2) Transformer 小 batch/变长序列时,LN 更稳定。 实践指南 / 步骤 图像模型 + 大 batch → 首选 BN。 语言模型/小 batch → 首选 LN。 多卡训练 → 评估 SyncBN 或改用 LN。 推理时注意 BN 的 running stats 是否正确。 可运行示例(最小 PyTorch 对比) import torch import torch.nn as nn torch.manual_seed(42) x = torch.randn(4, 8) bn = nn.BatchNorm1d(8) ln = nn.LayerNorm(8) out_bn = bn(x) out_ln = ln(x) print(out_bn.mean(dim=0)) print(out_ln.mean(dim=1)) 解释与原理 BN 使用 batch 统计,训练时依赖 batch size。 LN 使用样本内统计,不依赖 batch。 推理阶段 BN 使用 running mean/var,而 LN 直接使用当前样本。 C — Concepts(核心思想) 方法类型 BN 与 LN 都属于特征归一化,用于稳定训练与改善梯度流。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

为什么注意力要除以 √(d_k):从数值稳定到工程收益

副标题 / 摘要 注意力中的缩放项 \u221a(d_k) 不是装饰,而是数值稳定的关键:它控制 QK^T 的方差,避免 softmax 饱和和梯度消失。本文用公式与实验解释其必要性,并给出工程场景建议。 预计阅读时长:12~16 分钟 标签:attention、transformer、scaled-dot-product SEO 关键词:Attention, Scaled Dot-Product, \u221a(d_k) 元描述:解释注意力缩放项的数学动机与工程收益。 目标读者 想理解 Transformer 注意力细节的入门读者 需要排查训练不稳定问题的工程实践者 关注数值稳定性与性能优化的开发者 背景 / 动机 在点积注意力中,维度越大,QK^T 的数值越大,softmax 越容易饱和。 一旦饱和,梯度接近 0,训练会变慢甚至不稳定。 \u221a(d_k) 的缩放项就是为了解决这个问题。 核心概念 点积注意力:$QK^\top$ 衡量相似度。 缩放项 \u221a(d_k):控制相似度的尺度。 softmax 饱和:输入过大导致概率趋近 0/1,梯度变小。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 维度大时,QK^T 变大,softmax 过于“自信”。 缩放 \u221a(d_k) 后,数值回到合理范围,梯度更健康。 基础示例(1) d_k=64 时,如果不缩放,softmax 输出会非常尖锐。 基础示例(2) d_k=512 时,缩放与否会直接影响训练是否稳定。 实践指南 / 步骤 使用标准缩放:$QK^\top / \sqrt{d_k}$。 如果做自定义注意力,先验证 softmax 分布是否过尖锐。 在混合精度训练下,缩放更重要。 可运行示例(缩放与不缩放的对比) import torch import torch.nn.functional as F def attn_scores(d, scale=True): q = torch.randn(1, 1, d) k = torch.randn(1, 8, d) scores = q @ k.transpose(-2, -1) if scale: scores = scores / (d ** 0.5) probs = F.softmax(scores, dim=-1) return probs.max().item(), probs.min().item() for d in [32, 128, 512]: mx_s, mn_s = attn_scores(d, scale=True) mx_u, mn_u = attn_scores(d, scale=False) print(f"d={d} scaled max={mx_s:.3f} min={mn_s:.3f} | unscaled max={mx_u:.3f} min={mn_u:.3f}") 解释与原理 如果 $q_i, k_i \sim \mathcal{N}(0, 1)$, ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

残差连接的作用:为什么深度网络离不开它

副标题 / 摘要 残差连接通过“旁路”让梯度更容易传播,是深层网络可训练的关键。本文从原理到工程实践梳理残差的作用,并给出最小 PyTorch 示例。 预计阅读时长:12~16 分钟 标签:residual、skip-connection、transformer SEO 关键词:残差连接, ResNet, Transformer 元描述:系统解释残差连接为何能提升深度网络训练稳定性,并给出可运行示例。 目标读者 想理解残差连接价值的入门读者 在深层网络训练中遇到不稳定的工程实践者 关注 Transformer/ResNet 结构设计的开发者 背景 / 动机 深层网络容易梯度消失或爆炸,训练难以收敛。 残差连接通过“恒等映射”提供一条更短的梯度通道,使深层网络可训练。 它也是 ResNet 与 Transformer 的基础结构之一。 核心概念 残差连接(Skip/Residual):输出 = 输入 + 子层变换。 恒等映射:让网络学习“增量”而非全部映射。 梯度流动:减少梯度衰减,提高可训练性。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 残差连接的思路是: 如果一个深层网络难以直接学习映射 H(x),那就让它学习 F(x) = H(x) - x。 这样输出变成 x + F(x),训练更容易。 基础示例(1) 深层 MLP 加残差后 loss 更稳定、收敛更快。 基础示例(2) Transformer 每个子层都带残差,保证梯度可传播。 实践指南 / 步骤 在深层块中加入 x + f(x) 结构。 若维度不一致,用线性投影对齐。 配合 LayerNorm/RMSNorm 提升稳定性。 可运行示例(最小残差对比) import torch import torch.nn as nn torch.manual_seed(42) class PlainMLP(nn.Module): def __init__(self, dim=64, depth=6): super().__init__() layers = [] for _ in range(depth): layers += [nn.Linear(dim, dim), nn.ReLU()] self.net = nn.Sequential(*layers) def forward(self, x): return self.net(x) class ResMLP(nn.Module): def __init__(self, dim=64, depth=6): super().__init__() self.blocks = nn.ModuleList([ nn.Sequential(nn.Linear(dim, dim), nn.ReLU()) for _ in range(depth) ]) def forward(self, x): for block in self.blocks: x = x + block(x) return x x = torch.randn(8, 64) plain = PlainMLP() res = ResMLP() print(plain(x).shape, res(x).shape) 解释与原理 残差提供恒等路径,使梯度能绕过非线性层。 深层网络更容易学习“增量”,降低优化难度。 在 Transformer 中,残差 + 归一化是稳定训练核心。 C — Concepts(核心思想) 方法类型 残差连接属于架构层面的优化技巧,目的是改善训练稳定性与可扩展性。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

Attention 的复杂度与为什么需要位置编码

副标题 / 摘要 Self-attention 的 O(n^2) 复杂度是 Transformer 的主要瓶颈;位置编码则让模型区分顺序与相对位置。本文用 ACERS 框架解释复杂度来源与位置编码必要性,并提供最小示例。 预计阅读时长:14~18 分钟 标签:attention、positional-encoding、complexity SEO 关键词:Attention, 位置编码, 复杂度, Transformer 元描述:说明注意力复杂度与位置编码必要性,附可运行示例。 目标读者 想理解 Transformer 性能瓶颈的入门读者 需要处理长序列的工程实践者 关注注意力优化方案的开发者 背景 / 动机 Transformer 的性能瓶颈主要来自注意力矩阵的二次复杂度。 此外,注意力本身对顺序不敏感,必须引入位置编码。 理解这两点,才能合理设计模型与优化策略。 核心概念 注意力矩阵:n x n 的相似度矩阵。 时间/空间复杂度:自注意力随序列长度二次增长。 位置编码:赋予序列位置信息,避免“顺序不分”。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 注意力需要比较每个 token 与所有 token → 复杂度是 O(n^2)。 不加位置编码,模型无法区分“我爱你”和“你爱我”。 基础示例(1) 序列长度从 128 到 1024,注意力矩阵大小从 16K 到 1M。 基础示例(2) 句子顺序交换,位置编码缺失时模型输出相同。 实践指南 / 步骤 估算序列长度与注意力矩阵大小。 需要长序列时考虑稀疏/线性注意力。 选择位置编码方案(绝对/相对/旋转)。 可运行示例(复杂度与位置编码) import torch # 注意力矩阵规模示例 for n in [128, 256, 512, 1024]: mat = n * n print(n, "->", mat, "elements") # 位置编码示例(绝对位置) seq = torch.randn(1, 4, 8) pos = torch.arange(4).unsqueeze(0) pe = torch.sin(pos.float().unsqueeze(-1) / 10000) seq_with_pos = seq + pe print(seq_with_pos.shape) 解释与原理 QK^T 产生 n x n 矩阵,这是 O(n^2) 来源。 没有位置编码,注意力对序列顺序“置换不变”。 C — Concepts(核心思想) 方法类型 复杂度分析属于算法复杂度范畴,位置编码属于序列建模补偿机制。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

为什么使用多头注意力机制:能力、稳定性与工程取舍

副标题 / 摘要 多头注意力并不是“多次重复”,而是让模型在不同子空间中同时关注不同关系。本文从原理、复杂度与工程场景出发解释其必要性,并给出最小 PyTorch 示例。 预计阅读时长:14~18 分钟 标签:multi-head-attention、attention、transformer SEO 关键词:多头注意力, Multi-Head Attention, Transformer 元描述:系统解释多头注意力机制的优势与工程取舍,含最小示例。 目标读者 想理解 Transformer 关键设计的入门读者 需要做模型结构选型的工程实践者 关注注意力可解释性与效率的开发者 背景 / 动机 单头注意力只能在一个投影空间里“看关系”。 而自然语言/多模态里存在多种关系(语法、语义、位置、对齐)。 多头注意力让模型并行捕捉多种关系,提高表达能力与泛化。 核心概念 Head(注意力头):一个独立的注意力子空间。 子空间投影:每个头有独立的 Q/K/V 线性投影。 拼接与映射:多个头输出拼接后再线性映射回模型维度。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 单头注意力像“单一视角”。 多头注意力像“多视角协作”,同时关注不同关系。 基础示例(1) 机器翻译中,一个头关注语法对齐,另一个头关注实体对齐。 基础示例(2) 同一序列中,一个头关注局部邻近词,另一个头关注长距离依赖。 实践指南 / 步骤 选择头数 h,保持 d_model % h == 0。 每个头在子空间 d_head = d_model / h 中计算注意力。 拼接各头输出,线性投影回 d_model。 观察注意力分布是否更丰富。 可运行示例(最小多头注意力) import torch import torch.nn as nn torch.manual_seed(42) mha = nn.MultiheadAttention(embed_dim=32, num_heads=4, batch_first=True) x = torch.randn(2, 5, 32) attn_out, attn_weights = mha(x, x, x) print(attn_out.shape) print(attn_weights.shape) 解释与原理 每个头在不同线性子空间建模关系。 多头输出拼接后,模型获得更丰富的特征组合。 这使得同一层能同时学习多种依赖模式。 C — Concepts(核心思想) 方法类型 多头注意力属于并行子空间注意力建模范式。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

Transformer 结构描述:从编码器到解码器

副标题 / 摘要 Transformer 由编码器与解码器堆叠而成,核心是自注意力与前馈网络。本文从结构出发解释各模块职责,并提供最小可运行示例与工程场景。 预计阅读时长:16~20 分钟 标签:transformer、attention、encoder-decoder SEO 关键词:Transformer, 编码器, 解码器, 注意力机制 元描述:系统描述 Transformer 结构与工程应用,含最小示例。 目标读者 想理解 Transformer 结构的入门读者 需要搭建 NLP/多模态模型的工程实践者 关注模型架构取舍的开发者 背景 / 动机 在 Transformer 出现之前,序列建模主要依赖 RNN。 Transformer 用注意力替代循环,大幅提升并行性与可扩展性。 理解其结构,是学习大模型的起点。 核心概念 Encoder/Decoder:编码器负责理解输入,解码器负责生成输出。 Self-Attention:同一序列内部建模依赖。 Cross-Attention:解码器对编码器输出做对齐。 FFN:逐位置前馈网络。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 Transformer 的流程可以理解为: 编码器把输入序列变成上下文表示。 解码器在生成时,通过 cross-attention 读取编码器信息。 多层堆叠形成深层表达。 基础示例(1) 机器翻译:编码器读英文,解码器生成中文。 基础示例(2) 文本生成:只保留解码器,逐词预测下一个 token。 实践指南 / 步骤 选择结构:encoder-decoder(翻译)或 decoder-only(生成)。 设置模型参数:层数、隐藏维度、注意力头数。 训练:使用适当的损失(MLM/CLM)。 推理:启用因果 mask 或 cross-attention。 可运行示例(最小 Transformer 模块) import torch import torch.nn as nn torch.manual_seed(42) model = nn.Transformer( d_model=32, nhead=4, num_encoder_layers=2, num_decoder_layers=2, dim_feedforward=64, batch_first=True, ) src = torch.randn(2, 5, 32) tgt = torch.randn(2, 4, 32) out = model(src, tgt) print(out.shape) 解释与原理 编码器输出为“上下文记忆”。 解码器 self-attn 保证自回归顺序。 cross-attn 让解码器读取编码器信息。 C — Concepts(核心思想) 方法类型 Transformer 属于注意力驱动的序列建模架构。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]

为什么 GPT 是 Decoder-Only:自回归生成的最佳形态

副标题 / 摘要 GPT 采用 decoder-only 结构是为了极致匹配自回归生成任务:因果注意力保证顺序一致性,结构简化降低训练与推理成本。本文对比 encoder-only 与 encoder-decoder,并给出最小 PyTorch 示例。 预计阅读时长:14~18 分钟 标签:gpt、decoder-only、autoregressive SEO 关键词:GPT, Decoder-Only, 自回归, Causal Attention 元描述:从任务目标到工程成本,解释 GPT 为什么选择 decoder-only 结构。 目标读者 想理解 GPT 架构选择的入门读者 需要做生成模型选型的工程实践者 想对比不同 Transformer 结构的开发者 背景 / 动机 在文本生成任务中,模型必须严格遵循“从左到右”的因果顺序。 GPT 的 decoder-only 结构天然满足这一目标,同时简化了模型设计。 但它与 encoder-only、encoder-decoder 的差异常被混淆,需要系统梳理。 核心概念 Decoder-only:仅使用解码器堆叠 + 因果自注意力。 Encoder-only:双向自注意力,擅长理解任务。 Encoder-decoder:编码输入再解码输出,擅长序列到序列任务。 Causal Mask:确保 token 只能看见左侧历史。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 GPT 的任务是“预测下一个词”,所以只需要解码器并遵守因果顺序。 Encoder-only(如 BERT)不适合生成,因为它能看到未来词。 Encoder-decoder(如 T5)适合翻译/摘要,但结构更复杂。 基础示例(1) 输入:“今天是” → 模型预测“周五”。 这要求模型只能看到“今天是”,不能看到未来词。 基础示例(2) 机器翻译需要“源序列 → 目标序列”,更适合 encoder-decoder。 实践指南 / 步骤 任务为生成/续写 → 优先 decoder-only。 任务为理解/分类 → 优先 encoder-only。 任务为序列到序列 → 优先 encoder-decoder。 可运行示例(最小因果注意力) import torch import torch.nn.functional as F def causal_attention(x): # x: (batch, seq, dim) scores = x @ x.transpose(-2, -1) seq = x.size(1) mask = torch.tril(torch.ones(seq, seq)).bool() scores = scores.masked_fill(~mask, float("-inf")) weights = F.softmax(scores, dim=-1) return weights @ x x = torch.randn(1, 4, 8) out = causal_attention(x) print(out.shape) 解释与原理 因果 mask 保证 token 只依赖左侧历史。 这与自回归目标完全一致,避免信息泄露。 Decoder-only 结构也更容易并行化与扩展模型规模。 C — Concepts(核心思想) 方法类型 GPT 属于自回归生成模型,采用 decoder-only 结构 + 因果自注意力。 ...

2026年1月24日 · 2 分钟 · map[name:Jeanphilo]