Transformers 如何解决任务:语音、视觉与 NLP 任务的架构原理与源码级解读
发布时间:2026/9/10 5:24:58 作者:尧图编辑部 阅读量:1,286

Transformers 如何解决任务语音、视觉与 NLP 任务的架构原理与源码级解读【免费下载链接】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本文以 Hugging Face Transformers 仓库中的《如何解决任务日文版》为骨架逐层拆解 Wav2Vec2、ViT、ConvNeXT、DETR、Mask2Former、GLPN、BERT、GPT-2、BART 等代表性模型内部到底发生了什么并对照仓库源码给出可验证的实现证据。读完本文你将理解 Transformer 的编码器Encoder、解码器Decoder与编码器-解码器Encoder-Decoder三种结构如何被复用到不同任务以及在预训练模型上加一个任务头Head这一核心设计模式是如何贯穿语音、视觉与 NLP 三大领域的。概览Transformer 架构家族与本文的讲解路径在上一篇《 Transformers 能做什么》中我们了解了 NLP、语音与音频、计算机视觉三大类任务及其重要应用。本篇则深入模型的内部回答模型是如何解决这些任务的。解决特定任务的方法有很多不同模型可能实现了特定技巧或从新角度切入任务但对 Transformer 而言总体思路是一致的得益于灵活的架构大多数模型都是编码器、解码器或编码器-解码器结构的变体。此外Transformers 库中仍保留了一些用于计算机视觉任务的卷积神经网络CNN例如 ConvNeXT本文也会说明现代 CNN 的工作原理。为了具体说明任务如何被解决本文以以下模型为线索展开对应仓库 model_doc 文档 中的模型卡片领域模型解决的典型任务语音与音频Wav2Vec2音频分类、自动语音识别ASR计算机视觉Vision TransformerViT、ConvNeXT图像分类计算机视觉DETR目标检测计算机视觉Mask2Former图像分割计算机视觉GLPN深度估计NLPBERT文本分类、标记分类、问答编码器NLPGPT-2文本生成解码器NLPBART摘要、翻译编码器-解码器 提示继续之前建议先了解原始 Transformer 架构的基本知识——编码器、解码器与注意力如何工作能帮助你理解不同 Transformer 模型的差异。官方提供了免费课程含 Transformer 入门章节需要入门或复习时可以查阅其内容也可以在仓库的 英文版任务指南 与 术语表 中找到对应概念解释。语音与音频以 Wav2Vec2 为例Wav2Vec2 是一个**自监督self-supervised**模型先在未标注的语音数据上预训练再在有标注的数据上针对音频分类或自动语音识别做微调。其 PyTorch 实现位于 modeling_wav2vec2.py核心组件在源码中均有对应类。Wav2Vec2 预训练架构的四大组件特征编码器Feature Encoder接收原始语音波形先将均值归零、归一化为单位方差再转换为每 20ms 一个的特征向量序列。源码对应Wav2Vec2FeatureEncodermodeling_wav2vec2.py 第 385 行之后还有一层Wav2Vec2FeatureProjection第 425 行将特征投影到 Transformer 输入维度。量化模块Quantization Module波形在自然界是连续的而文本序列可以被切分成单词因此特征向量会送入量化模块学习离散的语音单元speech unit。语音单元从码本codebook可理解为词表中的一组码字里选取从码本中选择最能代表连续音频输入的向量即语音单元可视为目标标签再送入模型。源码中的Wav2Vec2GumbelVectorQuantizer第 747 行通过num_codevector_groups码本组数与num_codevectors_per_group每组码字数量配置码本结构。上下文网络Context Network约一半的特征向量被随机掩码mask被掩码的特征向量送入上下文网络——一个同时添加了相对位置编码的 Transformer 编码器对应源码中的Wav2Vec2Encoder第 651 行。注意Wav2Vec2 的掩码是时间步级别的掩码源码中通过mask_time_indices控制哪些时间步被掩码。对比学习目标Contrastive Task上下文网络的预训练目标是对比任务模型必须从一组伪预测中找出被掩码预测对应的真实量化语音表征即被促使去找到最相似的上下文向量与量化语音单元目标标签。源码的Wav2Vec2ForPreTraining第 1315 行实现了这一目标其输出中包含contrastive_loss对比损失记为 L_m与多样性损失L_d并借助_sample_negative_indices从同批次中采样负样本。完成预训练后Wav2Vec2 就可以针对音频分类或自动语音识别进行微调了。音频分类Audio Classification加一个序列分类头将预训练模型用于音频分类时做法是在基础 Wav2Vec2 模型之上添加一个序列分类头Sequence Classification Head分类头是一个线性层接收编码器的隐藏状态这些隐藏状态表示从每个音频帧中学到的特征由于隐藏状态长度不一需要先对隐藏状态做池化pooling再转换为各类别标签的 logits计算 logits 与目标之间的交叉熵损失cross-entropy loss据此找出最可能的类别。源码中的Wav2Vec2ForSequenceClassificationmodeling_wav2vec2.py 第 1656 行正是这一基础模型 分类头的组合。想动手实践可参考完整的 音频分类指南学习如何微调 Wav2Vec2 并用于推理。自动语音识别ASR加一个 CTC 语言建模头将预训练模型用于自动语音识别时做法是在基础 Wav2Vec2 模型之上添加一个用于CTCConnectionist Temporal Classification的语言建模头语言建模头接收编码器的隐藏状态并将其转换为 logits每个 logit 代表一个标记类别标记数量来自任务词表计算 logits 与目标之间的 CTC 损失再转录为文本。CTC 的定义可参考 术语表 中 connectionist temporal classification 词条。源码中的Wav2Vec2ForCTCmodeling_wav2vec2.py 第 1518 行即此实现。想动手实践可参考完整的 自动语音识别指南。补充同一份Wav2Vec2Model第 1190 行之上还派生出了Wav2Vec2ForAudioFrameClassification帧级分类第 1753 行与Wav2Vec2ForXVector说话人向量第 1899 行印证了共享预训练骨干、按任务换头的设计哲学。计算机视觉Transformer 与 CNN 两条路线计算机视觉任务有两种主流切入方式把图像切成 patch 序列用 Transformer 并行处理——代表是 ViT使用现代 CNN例如 ConvNeXT——仍以卷积层为核心但采用了现代化的网络设计。 提示还有第三种思路是同时结合 Transformer 与卷积例如 Convolutional Vision TransformerCvT 或 LeViT本文不展开讨论但它们本质上是下面两种方案的组合。ViT 与 ConvNeXT 常用于图像分类而对于目标检测、分割、深度估计等更复杂的视觉任务DETR、Mask2Former、GLPN 等模型更为合适。图像分类Transformer 路线ViTViT 用纯 Transformer 架构取代了卷积。如果你熟悉原始 Transformer那么理解 ViT 已经完成了大半——它引入的主要变化在于**图像如何喂给 Transformer**其实现对应 modeling_vit.py 中的ViTEmbeddings第 72 行Patch 分割与 Patch 嵌入图像被切分为正方形、互不重叠的 patch 序列每个 patch 转换为一个向量即patch embedding。patch embedding 由一个 2D 卷积层生成以产生合适的输入维度基础 Transformer 的每个 patch embedding 有 768 个值。例如一张 224×224 的图像可以切成 16×16 的图像 patch。正如文本被分词为单词图像被分词为 patch 序列。可学习的[CLS]嵌入与 BERT 类似一个特殊的[CLS]token 被追加到 patch embedding 序列的开头。[CLS]token 的最终隐藏状态被用作分类头的输入其余输出被忽略。该 token 帮助模型学习如何编码整张图像的表示。位置嵌入Position Embeddings模型并不知道图像 patch 的排列顺序因此加入可学习的位置嵌入其大小与 patch embedding 相同。最终所有嵌入一起送入 Transformer 编码器。MLP 分类头输出中只有[CLS]token 的表示被送入多层感知机MLP头。ViT 的预训练目标就是简单的分类MLP 头把输出转换为各类别标签的 logits计算交叉熵损失以找出最可能的类别。源码中的ViTForImageClassification第 522 行即ViT 骨干 分类头的完整封装ViTModel骨干本体在第 336 行。想动手实践可参考完整的 图像分类指南学习如何微调 ViT 并用于推理。图像分类CNN 路线ConvNeXT 提示本小节简要介绍卷积预先理解图像形状与尺寸如何变化会有帮助。如果不熟悉卷积可以参考开源书籍《Deep Learning for Coders》fastai 版中的卷积神经网络章节。ConvNeXT 是一种采用现代网络设计来提升性能的 CNN 架构但卷积仍是模型的核心。从高层看卷积convolution是一个小矩阵核/kernel与图像中一小块像素窗口相乘的操作用于计算特定纹理、线条曲率等特征然后移动到下一个像素窗口卷积移动的距离称为步幅stride无填充、无步幅的基础卷积示意可见论文《Convolution Arithmetic for Deep Learning》arXiv 1603.07285。将该输出再送入另一个卷积层每一层网络都会学到更复杂、更抽象的概念如热狗火箭。在卷积层之间通常还会插入池化层pooling用于降低特征维度并使模型对特征位置的轻微变化更鲁棒。ConvNeXT 通过以下 5 个方面对 CNN 进行现代化改造实现见 modeling_convnext.py其中ConvNextEmbeddings在第 65 行、ConvNextLayer在第 114 行、ConvNextStage在第 157 行、ConvNextModel在第 251 行改变各阶段stage的块数并用更大的步幅与对应的核大小对图像做patch 化——这种不重叠的滑动窗口策略与 ViT 把图像切成 patch 的思路类似。瓶颈层bottleneck先缩小通道数再恢复。1×1 卷积执行速度快且能增加深度逆瓶颈inverted bottleneck则相反先扩通道再缩小内存效率更高。将瓶颈层内普通的 3×3 卷积替换为深度可分离卷积depthwise convolution对每个输入通道独立做卷积最后再堆叠起来从而在提升性能的同时加宽网络。ViT 拥有全局感受野注意力机制使其能一次看到图像的大部分ConvNeXT 尝试复现这一效果把核大小增大到 7×7。仿效 Transformer 做了一些层设计上的改动使用更少的激活层与归一化层激活函数从 ReLU 换成GELU归一化从 BatchNorm 换成LayerNorm。卷积块的输出被送入分类头转换为 logits并通过交叉熵损失找出最可能的标签。ConvNextModel之上同样由ConvNextForImageClassification完成分类头的组装。目标检测DETRDETRDEtectionTRansformer是一个端到端的目标检测模型结合了 CNN 与 Transformer 的编码器-解码器结构实现位于 modeling_detr.py。其工作流程分为三步CNN 骨干提取特征预训练的 CNN backbone如 ResNet接收以像素值表示的图像生成低分辨率特征图随后对特征图施加 1×1 卷积做降维得到携带高层图像表示的新特征图。由于 Transformer 是序列模型特征图被展平为特征向量序列并与位置嵌入相结合。编码器-解码器与对象查询Object Queries特征向量送入编码器DetrEncoder第 933 行利用注意力层学习图像表示编码器的隐藏状态再与解码器DetrDecoder第 994 行的对象查询结合。对象查询是可学习的嵌入负责关注图像的不同区域并在逐层注意力中不断更新。解码器隐藏状态被送入前馈网络为每个对象查询预测边界框坐标与类别标签或无对象。 DETR并行解码每个对象查询一次性输出N个最终预测N为查询数量。与典型自回归模型逐个预测不同目标检测是一个集合预测任务预测边界框 类别标签的集合因此一次前向即可得到N个预测。二分匹配损失Bipartite Matching Loss训练时DETR 用二分匹配损失将固定数量的预测与固定数量的真实标签集合做一一配对。当真实标签少于N个时用无对象类填充预测与真实标签在边界框或类别上不匹配即产生损失若 DETR 预测出并不存在的对象则受到惩罚。这种设计促使 DETR 关注图像中的其他对象而不是只聚焦单个显著目标。在DetrModel第 1115 行之上DetrForObjectDetection第 1309 行添加了目标检测头它包含两个组件——将解码器隐藏状态转换为类别 logits 的线性层以及预测边界框的 MLP。想动手实践可参考完整的 目标检测指南学习如何微调 DETR 并用于推理。图像分割Mask2FormerMask2Former 是解决所有类型图像分割任务的统一架构。传统分割模型通常针对实例分割、语义分割或全景分割的特定子任务设计而 Mask2Former 将这三类任务统一视为**掩码分类mask classification**问题把像素分组为N个片段对给定图像预测N个掩码及其对应的类别标签。实现位于 modeling_mask2former.py主要组件如下Swin 骨干Backbone接收图像通过 3 个连续的 3×3 卷积生成低分辨率图像特征图。像素解码器Pixel Decoder将低分辨率特征逐步上采样为高分辨率像素嵌入。像素解码器Mask2FormerPixelDecoder第 1236 行实际会生成原图像 1/32、1/16、1/8 三个尺度的多尺度特征同时包含低分辨率与高分辨率特征。掩码注意力Masked Attention解码器每个不同尺度的特征图都会送入一层 Transformer 解码器高分辨率特征用于捕捉小物体。Mask2Former 的要点在于解码器使用的掩码注意力机制交叉注意力可以关注整幅图像而掩码注意力只聚焦图像的特定区域——更快而且仅凭局部图像特征就能学习从而提升性能。集合预测与 DETR 类似Mask2Former 也使用可学习的对象查询与图像特征结合输出集合预测类别标签掩码预测。解码器隐藏状态被送入线性层转换为类别 logits用交叉熵损失找出最可能的类别掩码预测则由像素嵌入与最终解码器隐藏状态组合生成并在 logits 与真实掩码之间使用sigmoid 交叉熵损失与 Dice 损失找出最可能的掩码。相关损失与匹配逻辑集中在Mask2FormerLoss第 485 行与Mask2FormerForUniversalSegmentation第 2278 行中。想动手实践可参考完整的 图像分割指南其中也涉及 SegFormer 的微调。深度估计GLPNGLPNGlobal-LocalPathNetwork适用于分割、深度估计等密集预测任务它以 SegFormer 编码器结合轻量解码器构建了一个基于 Transformer 的深度估计模型。实现位于 modeling_glpn.py工作流程分四步小 patch 分割与 ViT 类似图像被切成 patch 序列但这里的 patch 更小——这对分割、深度估计等密集预测任务更合适。图像 patch 转换为 patch embedding细节见上文 图像分类 一节送入编码器。分层编码器编码器接收 patch embedding经过多个编码器块每个块包含注意力层与Mix-FFN层后者负责提供位置信息。每个编码器块末尾有patch merging层用于构建分层表示将相邻 patch 组的特征拼接对拼接结果施加线性层把 patch 数量降到 1/4 分辨率。该输出作为下一编码器块的输入整个过程重复最终得到原图像 1/8、1/16、1/32 分辨率的图像特征。SegFormer 编码器实现见 modeling_segformer.py 中的SegformerModel第 376 行。轻量解码器与选择性特征融合SFF轻量解码器接收编码器最后一张特征图1/32 尺度上采样到 1/16随后特征进入SFFSelective Feature Fusion模块从各特征对应的注意力图中选择并结合局部与全局特征再上采样到 1/8该过程反复进行直到解码特征与原始图像尺寸一致。密集预测输出解码后的特征被送入最终预测头。语义分割时特征转换为各类别 logits用交叉熵损失优化深度估计时特征转换为深度图使用**平均绝对误差MAE或均方误差MSE**损失。仓库中的GLPNForDepthEstimationmodeling_glpn.py 第 565 行即深度估计任务的完整封装。想动手实践可参考完整的 单目深度估计指南。自然语言处理编码器、解码器与编码器-解码器Transformer 最初是为机器翻译设计的如今已成为解决大多数 NLP 任务的默认架构。不同任务适配不同结构有的任务适合编码器结构有的适合解码器结构还有的任务需要使用编码器-解码器结构。文本分类BERT编码器BERT 是**仅编码器encoder-only**模型也是首个通过双向关注词语来实现深度双向性的模型能够学习文本的丰富表示。实现位于 modeling_bert.py输入嵌入BERT 使用 WordPiece 分词生成 token 嵌入。为区分单句与句对加入特殊的[SEP]token同时在所有文本序列开头加入[CLS]token——[CLS]的最终输出将作为分类任务的输入。BERT 还加入了段嵌入segment embeddings指示 token 属于句对中的第一句还是第二句。两个预训练目标掩码语言建模MLM输入 token 的一部分被随机掩码模型需要预测它们。这解决了模型看过所有词就无法预测下一个词的双向性问题。被掩码 token 的最终隐藏状态被送入带 softmax 的前馈网络用于预测被掩码的词。下一句预测NSP模型需预测句子 A 之后是否真的跟句子 B。一半情况下 B 是真正的下一句另一半情况下 B 是随机句子预测结果是否为下一句被送入带 softmax 的二分类前馈网络IsNext/NotNext两个类别。多层编码器输入嵌入经过多个编码器层如BertSelfAttention在第 139 行、BertModel在第 594 行输出最终隐藏状态。将预训练模型用于文本分类时在基础 BERT 之上添加序列分类头这是一个线性层接收最终隐藏状态并转换为 logits计算 logits 与目标间的交叉熵损失以找出最可能的标签。对应源码为BertForSequenceClassificationmodeling_bert.py 第 1072 行。想动手实践可参考 文本分类指南英文版学习如何微调 DistilBERT 并用于推理。标记分类BERT Token 分类头将 BERT 用于命名实体识别NER等标记分类任务时在基础 BERT 之上添加标记分类头token classification head该线性层接收最终隐藏状态并转换为 logits计算 logits 与每个 token之间的交叉熵损失以找出每个 token 最可能的标签。对应源码为BertForTokenClassificationmodeling_bert.py 第 1251 行。想动手实践可参考完整的 标记分类指南学习如何微调 DistilBERT 并用于推理。问答BERT 跨度分类头将 BERT 用于问答时在基础 BERT 之上添加跨度分类头span classification head该线性层接收最终隐藏状态计算答案对应文本跨度的起始与结束 logits通过交叉熵损失找出 logits 与标签位置之间最可能的文本跨度。对应源码为BertForQuestionAnsweringmodeling_bert.py 第 1311 行。想动手实践可参考完整的 问答指南。 请注意上述 BERT 示例展示了一个核心思想——预训练完成后同一个 BERT 可被轻松用于各种不同任务只需在预训练模型上添加特定头部将隐藏状态转换为期望的输出即可BertForMaskedLM位于第 909 行也属于换头家族的一员。文本生成GPT-2解码器GPT-2 是在海量文本上预训练的**仅解码器decoder-only**模型给定提示prompt即可生成令人信服的文本即使没有显式训练也能完成问答等其他 NLP 任务。实现位于 modeling_gpt2.py掩码自注意力GPT-2 使用 BPE字节对编码对单词分词并生成 token 嵌入位置编码加到 token 嵌入上以指示各 token 的位置。输入嵌入经过多个解码器块输出最终隐藏状态。每个解码器块内使用掩码自注意力masked self-attention层——GPT-2不能关注未来 token只能关注左侧的 token。这与 BERT 的[mask]token 不同掩码自注意力通过注意力掩码把未来 token 的得分置为0。语言建模头解码器输出被送入语言建模头做线性变换把最终隐藏状态转换为 logits。标签是序列中的下一个 token由 logits 右移一位生成计算移位后的 logits 与标签间的交叉熵损失输出最可能的 token。对应源码GPT2Model在第 486 行、GPT2LMHeadModel继承GenerationMixin在第 636 行。GPT-2 的预训练目标完全基于因果语言建模预测序列中的下一个词这使得 GPT-2 在文本生成等任务上尤其出色。想动手实践可参考 因果语言建模指南学习如何微调 DistilGPT-2 并用于推理。关于生成的更多细节可查阅 文本生成策略 指南。摘要BART编码器-解码器BART 与 T5 这类编码器-解码器模型专为摘要等序列到序列任务设计。以 BART 为例说明其工作方式对应 modeling_bart.py去噪预训练Denoising PretrainingBART 的编码器架构与 BERT 非常相似接收文本的 token 与位置嵌入BartEncoder在第 463 行。BART 通过破坏输入、再由解码器重建来预训练与其他使用特定破坏策略的编码器不同BART 可应用任意种类的破坏其中文本填充text infilling破坏策略效果最好。文本填充会把若干文本跨度替换为单个[mask]token——这很关键因为模型必须预测被掩码的 token从而迫使模型预测缺失 token 的数量。输入嵌入与被掩码的跨度经编码器输出最终隐藏状态与 BERT 不同BART 在末尾不添加用于预测单词的前馈网络。解码器重建编码器输出送入解码器解码器必须从编码器输出中预测被掩码的 token 与未被破坏的 token——这为解码器恢复原文本提供了额外上下文。解码器输出送入语言建模头做线性变换得到 logits交叉熵损失在 logits 与标签即右移一位的 token之间计算。对应源码为BartModel第 680 行与BartForConditionalGeneration第 801 行继承GenerationMixin。想动手实践可参考完整的 摘要指南学习如何微调 T5 并用于推理。关于生成的更多细节可查阅 文本生成策略 指南。翻译BART 的两阶段适配与多语言 mBART翻译是另一个序列到序列任务同样可用 BART 或 T5 这类编码器-解码器模型完成。以 BART 为例BART 通过额外添加一个随机初始化的编码器来适配翻译使其能将源语言解码为目标语言这个新编码器的嵌入取代原有词嵌入送入预训练编码器训练分两步第一步固定模型参数仅通过模型输出的交叉熵损失更新源编码器、位置嵌入与输入嵌入第二步再让所有模型参数一起联合训练。此后多语言版mBART问世作为在多语言上预训练的模型可用于翻译任务。想动手实践可参考完整的 翻译指南学习如何微调 T5 并用于推理原文此处的链接指向摘要页按其主题应指向翻译指南。总结一次预训练处处换头纵观本文的八个模型可以提炼出 Transformers 库解决任务的两条主线架构决定理解方式编码器结构BERT通过双向注意力学习完整上下文表示适合分类、标记分类、问答等理解型任务解码器结构GPT-2通过掩码自注意力做因果建模适合文本生成编码器-解码器结构BART/T5适合摘要、翻译等序列到序列任务。视觉领域同理ViT/ConvNeXT 负责图像分类DETR/Mask2Former/GLPN 通过 Transformer 或现代 CNN 骨架解决检测、分割与深度估计。任务头决定输出形式预训练模型是共享的骨干不同任务只需在骨干之上追加不同头部——序列分类头、token 分类头、跨度分类头、CTC 头、检测头、掩码头、深度头——把隐藏状态转换为期望的输出再用对应的损失函数交叉熵、CTC、二分匹配、Dice、MAE/MSE 等优化。这正是一次预训练、多处复用的核心工程模式也解释了为什么同一个 Wav2Vec2Model、BertModel 或 BartModel 能衍生出数量众多的任务模型。想继续深入可以从 任务指南总览日文版 中选择具体任务音频分类、ASR、图像分类、目标检测、语义分割、单目深度估计、标记分类、问答、语言建模、摘要、翻译等结合 英文版任务指南 与 模型文档 中的架构说明动手微调并部署自己的模型。【免费下载链接】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),仅供参考