Transformers 如何完成任务:从 Wav2Vec2、ViT、DETR 到 BERT、GPT-2 的架构原理与任务头设计
2026/9/7 18:21:06 网站建设 项目流程

Transformers 如何完成任务:从 Wav2Vec2、ViT、DETR 到 BERT、GPT-2 的架构原理与任务头设计

【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers

本篇指南基于 Transformers 官方文档《Transformers 模型如何完成任务》(阿拉伯语版原文),结合仓库内模型源码逐层拆解:音频任务如何由 Wav2Vec2 通过"特征编码器 + Gumbel 向量量化 + 对比学习"完成自监督预训练,视觉任务如何由 ViT/ConvNeXT/DETR/Mask2Former/GLPN 分别解决分类、检测、分割与深度估计,NLP 任务如何由 BERT、GPT-2、BART 的编码器/解码器/编码器-解码器三种范式完成。读完本篇,你能理解每种模型"内部到底发生了什么",以及如何在预训练基座之上添加任务头(task head)微调出可推理的模型。

总览:三大架构范式与代表性模型

Transformers 库中的模型大多基于 Transformer 架构,可以归为三种结构变体:编码器(Encoder)解码器(Decoder)编码器-解码器(Encoder-Decoder);此外库中还有大量至今仍在计算机视觉任务中使用的卷积神经网络(CNN)。原文档给出了本篇覆盖的代表性模型与任务映射:

模型典型任务架构范式模型文档
Wav2Vec2音频分类、自动语音识别(ASR)编码器 + 量化modeling_wav2vec2.py
Vision Transformer (ViT)、ConvNeXT图像分类纯 Transformer / 现代 CNNmodeling_vit.py、modeling_convnext.py
DETR目标检测CNN 骨干 + 编码器-解码器modeling_detr.py
Mask2Former图像分割编码器-解码器 + 掩码注意力modeling_mask2former.py
GLPN深度估计分层编码器 + 轻量解码器modeling_glpn.py
BERT文本分类、Token 分类、问答(编码器)编码器modeling_bert.py
GPT-2文本生成(解码器)解码器modeling_gpt2.py
BART摘要、翻译(编码器-解码器)编码器-解码器modeling_bart.py

解决某项任务有许多种方式,不同模型可能采用特定技术甚至全新视角切入,但对 Transformer 模型而言总体思路一致。原文档给出的前置建议是:在阅读本文前,最好已了解 Transformer 原始架构——理解编码器、解码器与注意力机制的工作原理,是理解下文各种模型的关键。

音频与语音:Wav2Vec2 的自监督预训练

Wav2Vec2 是在未标注语音数据上自监督训练(Self-Supervised)的模型,可在标注数据上微调(Fine-tuning)以完成音频分类自动语音识别(ASR)。它的架构由四个主要组件构成,以下逐一对应仓库源码。

组件一:特征编码器(Feature Encoder)

特征编码器接收原始音频波形,将其归一化(Normalization)为零均值、有限标准差,并转换为一个特征向量序列,每个向量长约 20 毫秒。

从源码看,Wav2Vec2FeatureEncoder由一串堆叠的卷积层(nn.ModuleList)实现:第一层可以是 GroupNorm(feat_extract_norm == "group")或 LayerNorm("layer")卷积,后续层均为无 LayerNorm 卷积。forward将一维波形input_values扩展为[:, None]后逐层卷积。随后Wav2Vec2FeatureProjectionnn.LayerNorm + nn.Linear + nn.Dropout把卷积输出投影到config.hidden_size维,并保留未投影的归一化特征供量化使用。相关超参数(卷积通道数conv_dim、代码向量维度codevector_dim等)定义在 configuration_wav2vec2.py。

组件二:量化模块(Quantization Module)

由于音频波形本质是连续的,不能像文本序列分词那样直接切分为离散单元,因此特征向量会被送入量化模块,学习离散的"语音单元"。这些语音单元从一个固定码本(codebook,可类比为"词表")中选择:挑选出最能表示连续输入的向量(语音单元)送入模型。

源码中该模块是Wav2Vec2GumbelVectorQuantizer,它用 Gumbel-Softmax 实现可微向量量化:codevectors参数即码本,形状由num_codevector_groups × num_codevectors_per_group × codevector_dim决定;训练时用gumbel_softmax(hard=True)采样硬选择并计算困惑度(perplexity),推理时退化为argmax硬选择,与文档"从码本中挑选最合适的向量"描述完全一致。

组件三:上下文网络(Context Network)

约一半的特征向量被随机遮蔽,被掩码的特征向量输入上下文网络。该网络是一个Transformer 编码器,同时加入相对位置嵌入(Relative Positional Embeddings)。对应源码中的Wav2Vec2EncoderWav2Vec2Attention(内置相对位置偏置)。

组件四:对比学习任务(Contrastive Objective)

上下文网络的预训练目标是对比任务:模型必须在一堆错误表示中,预测出与被掩码预测对应的正确量化语音表示,从而促使模型学会找到"最相似"的上下文向量与量化语音单元(即分类目标)。

从源码看,Wav2Vec2ForPreTraining持有量化器与两个投影层(project_hid/project_q),其静态方法compute_contrastive_logits余弦相似度计算预测向量与"正确目标 + 负样本"的相似度,并除以温度temperature=0.1放大差异——这正是文档所述对比损失的实现。

完成上述预训练后,即可在自有数据上微调 Wav2Vec2 做音频分类或 ASR。

音频分类:加一个序列分类头

用预训练模型做音频分类时,在 Wav2Vec2 基座之上添加一个序列分类头。该头是一个线性层,接收编码器隐藏状态:这些隐藏状态是每个音频帧学到的特征,长度可变;先做池化(pooling)压缩为定长向量,再线性转换为类别上的概率,用交叉熵损失在概率与目标标签之间计算,得到最可能的类别。

仓库中对应Wav2Vec2ForSequenceClassification(类注释说明为"在池化输出之上的线性层")。想动手实践可参考官方音频分类任务指南。

自动语音识别(ASR):加一个 CTC 语言建模头

做 ASR 时,在 Wav2Vec2 基座之上添加一个面向 CTC(连接时序分类) 的语言建模头。该头同样是线性层,把编码器隐藏状态转换为概率——每个概率对应一个符号类别(符号数量来自任务词表)。在概率与目标之间计算 CTC 损失,得到最可能的符号序列,再解码为书面文本。

源码Wav2Vec2ForCTC中,lm_head = nn.Linear(output_hidden_size, config.vocab_size)forward内部调用nn.functional.ctc_loss(空白符取pad_token_id),并暴露freeze_feature_encoder()/freeze_base_model()便于冻结基座只训练头部。想动手实践可参考官方ASR 任务指南。

计算机视觉:Transformer 化与现代化 CNN 两条路线

处理视觉任务有两条主流路线:

  1. 将图像切分为 patch 序列,用 Transformer 并行处理;
  2. 使用如 ConvNeXT 这样的现代 CNN——核心仍是卷积层,但采用现代网络设计。

原文档还提示存在第三条"卷积 + Transformer"混合路线(如 CVT、LeViT),因其只是上述两种思路的组合,文中不再展开。ViT 与 ConvNeXT 常用于图像分类;对于目标检测、分割、深度估计,则分别考察 DETR、Mask2Former、GLPN——它们是各自任务更合适的模型。

图像分类之一:Vision Transformer (ViT)

ViT 与 ConvNeXT 都能做图像分类,核心区别在于:ViT 使用注意力机制,ConvNeXT 使用卷积。ViT 用纯 Transformer 结构完全取代卷积——如果你熟悉原始 Transformer,就已经迈出了理解 ViT 的一半。ViT 的主要贡献在于"图像如何喂给 Transformer":

  1. Patch 化:图像被切分为不重叠的方形 patch,每个 patch 变成一个向量("patch 表示")。patch 嵌入由一个 2D 卷积层生成,产生正确的输入维度(基础 Transformer 中每个 patch 嵌入 768 维)。224×224 的图像可切成 196 个 16×16 patch——就像文本分词,图像被"分词"为 patch 序列。
  2. [CLS]标记:如同 BERT,在 patch 表示序列开头加入可学习的[CLS]token;其最终隐藏状态作为分类头的输入,其余输出被忽略。这类标记帮助模型学习如何编码整张图像的表示。
  3. 位置表示:由于模型不知道 patch 的顺序,还需为 patch 表示与可学习标记加上"位置表示",它们同样可学习,且与 patch 表示同维度。之后所有表示送入 Transformer 编码器。
  4. MLP 头:编码器输出(特指[CLS]的输出)送入多层感知机(MLP)头。ViT 预训练目标仅为分类:MLP 头把输出转为类别概率,并计算交叉熵损失找最可能类别。

仓库源码与上述描述一一对应:ViTPatchEmbeddingsnn.Conv2d(kernel_size=patch_size, stride=patch_size)一步完成"切 patch + 线性投影",输出(batch, num_patches, hidden_size)ViTEmbeddingscls_token为可学习参数,position_embeddings的形状为(1, num_patches + 1, hidden_size)(+1 即[CLS]的位置),并提供interpolate_pos_encoding以支持更高分辨率输入。分类头见ViTForImageClassification。想动手实践可参考官方图像分类任务指南。

图像分类之二:现代卷积网络 ConvNeXT

ConvNeXT 是采用现代网络设计以提升性能的 CNN 架构,卷积仍是其核心。宏观上,卷积是指用一个更小矩阵()与图像一小块像素相乘、从中提取特征(如特定纹理、曲线),然后滑动到下一窗口像素的过程;滑动距离称为步幅(stride)。该输出可送入下一卷积层,每一层学到更复杂抽象的概念;卷积层之间常加池化层降低维度、提升对特征位置变化的鲁棒性。

ConvNeXT 从五个方面"现代化"了 CNN(对应实现见 modeling_convnext.py 中ConvNextLayerConvNextModel):

  1. 调整各阶段块数,并用更大步幅加匹配核尺寸"压缩"图像——这种不重叠下采样策略使"压缩"类似 ViT 的 patch 划分方式。
  2. 瓶颈层先压缩通道数再恢复(因为 1×1 卷积更快,从而可以加深网络);倒置瓶颈则先扩展再压缩通道,更省内存。
  3. 深度卷积替代 3×3 标准卷积:对每个输入通道独立卷积后再堆叠,加宽网络以提升性能。
  4. ViT 凭注意力机制拥有全局感受野,ConvNeXT 通过把核尺寸加大到7×7来模拟这一效果。
  5. 一系列模仿 Transformer 的层设计变更:更少的激活与归一化层、激活函数换成 GELU 而非 ReLU、用 LayerNorm 替代 BatchNorm。

卷积块输出最后送入分类头,转为概率并计算交叉熵损失,得到最可能类别。

目标检测:DETR(DEtection TRansformer)

DETR 是端到端的目标检测模型,组合了 CNN 与编码器-解码器 Transformer:

  1. 预训练 CNN 骨干接收以像素值表示的图像,生成低分辨率特征图;对其做 1×1 卷积降维,得到高层图像表示的新特征图。由于 Transformer 是序列模型,特征图被展平为特征向量序列,并与位置表示融合。源码中对应DetrConvEncoder(CNN 特征提取)、DetrSinePositionEmbeddingDetrLearnedPositionEmbedding两种位置编码。
  2. 特征向量送入编码器,用注意力层学习图像表示。随后编码器隐藏状态与对象查询(object queries)解码器中融合。对象查询是可学习表示,关注图像的不同区域,并在穿过每层注意力时被更新。解码器隐藏状态送入前馈网络,为每个对象查询预测边界框坐标 + 分类标签(若无对象则预测"no-object")。DETR 并行解码全部对象查询,一次输出N个最终预测(N为查询数)。与每次预测一个元素的自回归模型不同,目标检测是"一次遍历输出 N 个预测"(如bounding_boxclass_label)的集合预测任务。
  3. 训练时 DETR 使用二分类匹配损失,在固定数量预测与固定数量真值标注之间比较;若真值少于N个,则用"no-object"类别填充。该损失促使 DETR 找到预测与真值之间的一对一映射:边界框或类别预测错误会付出损失;若预测了不存在的对象也会受罚——这鼓励 DETR 去发现图中更多对象,而不是只盯着一个显眼对象。

DETR 之上附加目标检测头以定位对象类别与边界框坐标。检测头有两个部件:一个把解码器隐藏状态转为类别概率的线性层,和一个预测边界框的 MLP 网络(见 modeling_detr.py 中DetrModelOutput/DetrObjectDetectionOutput相关定义)。想动手实践可参考官方目标检测任务指南。

图像分割:Mask2Former

Mask2Former 是解决各类图像分割任务的通用架构。传统分割模型通常针对某个特定子任务(实例分割、语义分割、全景分割)设计;Mask2Former 把这些问题统一为掩码分类(mask classification):把像素聚为N个区域,为图像预测N个掩码及对应类别标签。其主要组件(模型定义见Mask2FormerModel):

  1. Swin 骨干(Swin Transformer)接收图像,经 3 次连续 3×3 卷积生成低分辨率特征图。
  2. **像素解码器(pixel decoder)**将低分辨率特征逐步上采样为逐像素高分辨率表示;实际产出多尺度特征(同时含低/高分辨率信息),分辨率分别为原图的 1/32、1/16、1/8。
  3. 不同尺度的特征图依次送入解码器层,以捕获小物体(高分辨率特征中信息更完整)。Mask2Former 的钥匙在于解码器中的掩码注意力(masked attention):与可关注全图的标准交叉注意力不同,掩码注意力只关注图像的特定区域——更快、效果更好,因为局部特征已足以供模型学习。
  4. 类似 DETR,Mask2Former 也使用可学习对象查询,并与像素解码器的图像特征组合做集合预测class_labelmask prediction)。解码器隐藏状态经线性层转为类别标签上的概率,用交叉熵损失确定最可能类别。掩码预测则由像素表示与解码器最终隐藏状态组合生成,用sigmoid 交叉熵损失dice 损失在概率与真值掩码之间计算,得到最可能掩码。

想动手实践可参考官方语义分割任务指南。

深度估计:GLPN(全局局部路径网络)

GLPN 是用于深度估计的 Transformer,组合了 SegFormer 编码器与轻量解码器:

  1. 如同 ViT,图像被切分为 patch 序列——但这些 patch更小,更适合分割、深度估计等密集预测任务。patch 被转换为 patch 表示后送入编码器(实现见GLPNOverlapPatchEmbeddings)。
  2. 编码器把 patch 表示穿过若干编码块;每块由注意力层与Mix-FFN组成,后者提供局部信息。每个编码块末尾有patch 合并层构建层次化表示:每块相邻 patch 的特征被合并,合并后特征经线性层降采样到 1/4 分辨率,作为下一编码块的输入,依次得到 1/8、1/16、1/32 分辨率的图像特征(GLPNMixFFNGLPNEncoder)。
  3. 轻量解码器取编码器最后一张特征图(1/32 尺度)上采样到 1/16;随后特征进入**选择性特征融合(SFF, Selective Feature Fusion)**单元——对每个特征从注意力图中选择并融合局部与全局特征,再上采样到 1/8;如此循环直到解码特征恢复到原图尺寸。输出穿过两层卷积后应用 sigmoid 激活,预测每个像素的深度。

自然语言处理:编码器、解码器与编码器-解码器

Transformer 最初为机器翻译设计,如今事实上是几乎所有 NLP 任务的默认架构。有些任务适合编码器结构,有些更适合解码器,还有些仍在使用编码器-解码器结构。

文本分类:BERT(纯编码器)

BERT 是仅基于编码器的模型,也是第一个通过"关注双侧词语"有效应用深度双向性、学到更丰富文本表示的模型:

  1. BERT 使用 WordPiece 分词生成文本的 token 表示。为区分单句与句对,加入特殊标记[SEP];每个文本序列开头加入[CLS]标记,其最终输出作为分类头输入。BERT 还加入段嵌入(segment embedding)指示 token 属于句对中的第一句还是第二句。
  2. 预训练使用两个目标:掩码语言建模下一句预测。掩码语言建模中,随机遮蔽一定比例的输入 token 并要求模型预测它们——这解决了双向性问题(否则模型可以看到所有词而"作弊"式预测下一词)。被掩码 token 的最终隐藏状态送入带 Softmax(跨语言词表)的前馈网络预测被掩码词。第二个目标是下一句预测:判断句 B 是否接续句 A——一半时间 B 是真正的下一句,另一半时间是随机句;"是否下一句"的预测送入带 Softmax(跨IsNext/NotNext两类)的前馈网络。
  3. 输入表示穿过若干编码器层,输出若干最终隐藏状态。

用预训练模型做文本分类时,在 BERT 基座之上加序列分类头:一个接收最终隐藏状态、做线性变换得到 logits 的线性层,再计算 logits 与目标间的交叉熵损失找最可能类别。想动手实践可参考文本分类任务指南(使用 DistilBERT 微调与推理)。

Token 分类:命名实体识别(NER)等

用 BERT 做 Token 分类(如命名实体识别 NER)时,在基座之上加Token 分类头:一个接收最终隐藏状态、做线性变换得到 logits 的线性层,交叉熵损失在 logits 与每个 token的目标之间计算,找到最可能类别。实践入口见Token 分类任务指南。

问答:跨度(span)头

用 BERT 做问答时,在基座之上加跨度分类头:线性层接收最终隐藏状态,计算答案对应"跨度"的起始与结束logits;交叉熵损失在 logits 与位置标注间计算,找到最可能的答案文本跨度。实践入口见问答任务指南。

值得注意:BERT 一旦预训练完成,适配新任务就非常容易——只需给预训练模型加一个对应头部,把隐藏状态变换成所需输出即可。

文本生成:GPT-2(纯解码器)

GPT-2 是基于大量文本预训练的纯解码器模型。它给定提示能生成流畅(虽然并不总是正确)的文本,还能完成问答等其他 NLP 任务——即使从未被显式训练过这些任务。

  1. GPT-2 使用 BPE(字节对编码) 分词生成 token 表示,并为每个 token 加位置表示以指示其在序列中的位置。输入表示穿过若干解码块,输出最终隐藏状态。每个解码块内使用掩码自注意力:GPT-2 无法注意"未来"的 token,只能关注左侧 token。这与 BERT 的[mask]标记不同——掩码自注意力中用的是注意力掩码,把未来 token 的注意力得分置为 0。
  2. 解码器输出送入语言建模头,做线性变换把隐藏状态转为 logits 概率。标签是序列中"下一个 token",通过将 logits 右移一位生成;在移位 logits 与标签间计算交叉熵损失,输出最可能的下一 token。

GPT-2 的预训练目标完全基于 因果语言建模——预测序列中的下一个词,这也使它特别适合文本生成类任务。想动手实践可参考语言建模任务指南(因果语言建模章节)。更多关于文本生成的信息可参考文本生成策略指南。

摘要:BART(编码器-解码器)

BART 与 T5 这类编码器-解码器模型为"序列到序列"的摘要任务而生:

  1. BART 的编码器结构与 BERT 相似,接受 token 与位置表示。BART 通过先破坏输入再用解码器重建进行预训练。与其他采用固定破坏策略的编码器不同,BART 可施加任意破坏;其中"文本填充(text infilling)"策略效果最好:将若干文本跨度替换为单个[mask]标记——这一点很关键,因为模型需要预测被掩码的 token,从而学会预测缺失的 token 数量。输入表示与被掩码跨度穿过编码器输出最终隐藏状态;但不同于 BERT,BART没有在末端加预测词的前馈网络。
  2. 编码器输出送入解码器,解码器需根据编码器结果预测被掩码 token 及未被破坏的 token——这为解码器提供额外上下文以恢复原文本。解码器结果送入语言建模头,做线性变换得到 logits;交叉熵损失在 logits 与标签(即右移一位的 token)之间计算。

想动手实践可参考摘要任务指南(使用 T5 微调与推理)。更多文本生成技巧见文本生成策略指南。

翻译:BART 与 mBART

翻译是另一个典型的序列到序列任务,可以使用 BART、T5 等编码器-解码器模型。BART 适配翻译的方式是:添加一个随机初始化的独立编码器,把源语言映射为可解码的目标语言输入;这个新编码器的表示(而非原始词表示)被送入预训练编码器。源语言编码器通过用模型输出的交叉熵损失更新其参数、位置表示与输入表示来训练。第一步冻结模型其余参数,第二步再联合训练全部参数。BART 的多语言版本mBART专为翻译设计,在多种语言上预训练。想动手实践可参考翻译任务指南。更多文本生成信息同样可参考文本生成策略指南。

小结:预训练基座 + 任务头的统一思路

把上述模型横向对比,可以提炼出贯穿 Transformers 的核心工程模式:

  • 预训练负责"表示学习":Wav2Vec2 用对比学习 + 量化学语音单元,BERT 用 MLM/NSP 学双向文本表示,GPT-2 用因果 LM 学自回归表示,BART 用破坏-重建学序列表示,ViT 用分类目标学 patch 表示。
  • 任务头负责"输出变换":序列分类头(池化 + 线性层)用于文本/音频分类,Token 分类头用于 NER,跨度头用于 QA,CTC 头用于 ASR,MLP/掩码头用于图像分类、检测与分割。
  • 范式匹配任务方向:判别式"输入→单一定长输出"任务多用编码器;自回归"输入→变长文本"任务用解码器;"序列→序列"(摘要、翻译)与集合预测(检测、分割)用编码器-解码器。

理解这一模式后,你就可以在 Wav2Vec2、ViT、DETR、BERT、GPT-2、BART 等模型文档中查看各自配置参数,并结合仓库内src/transformers/models/下的实现源码,为自己的数据选择合适的基座与任务头进行微调。

【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询