
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本文以 Transformers 官方文档《¿Cómo los Transformers resuelven tareas?》为骨架逐层拆解 Wav2Vec2、ViT、ConvNeXT、DETR、Mask2Former、GLPN、BERT、GPT-2、BART 等模型在语音/音频、计算机视觉与 NLP 三类任务上的内部工作方式并结合本仓库 src/transformers/models 下的真实实现进行源码级印证。读完本文你将掌握 Transformer 编码器、解码器、编码器-解码器三种架构各自的适用任务、各类任务头head的挂接原理以及现代 CNN 的改进思路从而能根据自己的任务选择并正确使用这些模型。一、总览几乎所有模型都是三种架构的变体在 官方任务概览 中我们了解到 Transformers 覆盖了 NLP、语音音频与计算机视觉任务。而本文的核心问题是模型内部到底做了什么才产生出有用的预测答案是得益于 Transformer 灵活的架构绝大多数模型只是**编码器encoder、解码器decoder或编码器-解码器encoder-decoder**三种结构之一的变体编码器双向建模适合需要理解整段输入的任务文本分类、Token 分类、问答、图像分类解码器因果单向建模适合自回归式生成文本生成编码器-解码器序列到序列适合摘要、翻译等输入与输出均为序列的任务。此外本仓库还保留了多款现代卷积神经网络CNN它们至今仍是计算机视觉任务的主力之一。后文会分别展开。 前提提示在深入之前建议先具备原始 Transformer 架构的基础知识——理解编码器、解码器与注意力机制能帮助你快速理解下文所有模型的运作方式。二、语音与音频以 Wav2Vec2 为例Wav2Vec2 是一个自监督预训练模型先用大量无标注语音数据预训练再用带标签数据微调即可用于音频分类与自动语音识别ASR。其实现位于 modeling_wav2vec2.py从源码结构看模型由以下四个核心组件构成。2.1 特征编码器从原始波形到特征向量**特征编码器feature encoder**接收原始音频波形先将其归一化为零均值、单位方差再转换为特征向量序列每个向量约覆盖 20ms 的音频。在源码中对应 Wav2Vec2FeatureEncoder 类其后的 Wav2Vec2FeatureProjection 负责将卷积提取的特征投影到 Transformer 所需的隐藏维度。2.2 量化模块把连续波形变成离散语音单元与文本可以切分成词不同波形在本质上是连续的无法天然切分为独立单元。因此特征向量需要经过量化模块quantization module其目标是学习离散的语音单元从一组码字集合——即codebook可理解为语音的词表——中选出最能代表当前连续音频输入的向量再送入模型。源码对应 Wav2Vec2GumbelVectorQuantizer采用 Gumbel-Softmax 完成离散选择的近似可微化。2.3 上下文网络掩码 对比学习的预训练目标预训练阶段约一半的特征向量会被随机掩码掩码后的特征被送入上下文网络context network——一个附加了相对位置编码的 Transformer 编码器。预训练目标是对比学习任务模型需要从一组干扰项中选出被掩码位置对应的真实量化语音表示这促使模型学习让上下文向量与正确的量化语音单元目标标签最相似。值得说明的是该对比损失contrastive loss与多样性损失diversity loss共同构成预训练总损失这一设计在 Wav2Vec2ForPreTrainingOutput 的字段注释中有明确记录。预训练完成后就可以用你的数据微调 Wav2Vec2 完成音频分类或 ASR。2.4 音频分类在基座模型上加序列分类头将预训练模型用于音频分类时只需在 Wav2Vec2 基座模型之上加一个序列分类层分类层是一个线性层接收编码器的隐藏状态隐藏状态表示每个音频帧学习到的特征但各帧长度可变因此先对隐藏状态做池化得到定长向量再转换为各类别标签上的 logits计算 logits 与目标之间的交叉熵损失找出最可能的类别。在源码中对应 Wav2Vec2ForSequenceClassification其projector将hidden_size投影到classifier_proj_size再由classifier线性层映射到num_labels。同时它提供了freeze_feature_encoder()与freeze_base_model()两个方法分别用于冻结特征编码器或整个基座模型、只训练分类头——这是微调时的常用手段。完整的微调与推理流程可参考 音频分类任务指南。2.5 自动语音识别ASRCTC 语言建模头用于 ASR 时在 Wav2Vec2 基座模型上加一个CTCConnectionist Temporal Classification时序分类语言建模层该层是线性层接收编码器隐藏状态并转换为 logits每个 logits 对应一个 token 类别token 数量来自任务词表计算 logits 与目标之间的CTC 损失找出最可能的 token 序列再解码为最终转录文本。实现对应 Wav2Vec2ForCTC。CTC 的引入解决了语音帧数远多于输出字符数、且帧与字符无对齐标注的难题。完整微调流程见 ASR 任务指南。三、计算机视觉Transformer 与现代 CNN 两条路线计算机视觉任务有两条主流路线将图像切分为补丁序列用 Transformer 并行处理如 ViT使用现代 CNN如 ConvNeXT仍然基于卷积层但吸收现代网络设计。还有第三种思路把 Transformer 与卷积结合如 Convolutional Vision Transformer (CvT)、LeViT。它们本质上是前两种方案的组合本文不展开。图像分类通常用 ViT 与 ConvNeXT而目标检测、分割、深度估计则分别更适合 DETR、Mask2Former 与 GLPN。3.1 图像分类ViT 的纯 Transformer 路线ViT 完全用纯 Transformer 架构取代卷积。其关键创新在于图像如何喂给 Transformer切分为补丁并生成补丁嵌入图像被切成互不重叠的方形补丁每个补丁经 2D 卷积层转换为向量补丁嵌入。对 base 规模模型每个补丁嵌入是 768 维例如 224×224 的图像可切成 196 个 16×16 的补丁。正如文本被分词图像被分补丁成序列。源码 ViTPatchEmbeddings 正是用一个kernel_sizepatch_size, stridepatch_size的Conv2d一次性完成投影再flatten(2).transpose(1, 2)得到序列加入[CLS]学习嵌入仿照 BERT在补丁嵌入序列前拼接一个特殊可学习 token[CLS]其最终隐藏状态作为分类头的输入其他输出被忽略帮助模型学习编码整张图像的表示加入可学习的位置嵌入Transformer 本身不知道补丁的排列顺序因此加上与补丁嵌入同尺寸的可学习位置嵌入之后全部嵌入送入 Transformer 编码器。这两步对应 ViTEmbeddingsMLP 分类头只取[CLS]对应输出送入 MLP 头转换为各类别 logits用交叉熵损失寻找最可能的类别。ViT 的预训练目标就是分类本身。基座与分类头分别对应 ViTModel 与 ViTForImageClassification。微调流程见 图像分类任务指南。3.2 图像分类ConvNeXT 的现代 CNN 路线ConvNeXT 是吸收现代网络设计思想改良的 CNN卷积仍是核心。卷积基础从高层看卷积是用一个较小的矩阵kernel与图像的一小块像素窗口相乘提取某种特征如特定纹理、线条曲率然后滑动到下一个窗口卷积每次移动的距离称为stride。卷积输出可继续喂给下一层卷积网络逐层学到更复杂抽象的特征。在卷积层之间通常插入池化层降低维度使模型对特征位置的轻微变化更鲁棒。ConvNeXT 从五个方面现代化CNN调整各阶段 block 数量并用更大 stride/kernel 对图像分块非重叠滑动窗口的分块策略与 ViT 切补丁的思路相似引入瓶颈层bottleneck先降通道再恢复因为 1×1 卷积更快且可加深网络而倒置瓶颈则先扩通道再降维更省内存用 depthwise 卷积替换瓶颈层中的 3×3 卷积对每个输入通道分别做卷积再堆叠从而加宽网络以提升性能增大 kernel 到 7×7ViT 依靠注意力拥有全局感受野ConvNeXT 通过增大卷积核尝试复现这一效果吸收 Transformer 的层设计减少激活层与归一化层数量激活函数由 ReLU 改为 GELU用 LayerNorm 取代 BatchNorm。卷积块的输出送入分类头转换为 logits 并计算交叉熵损失以确定最可能的标签。3.3 目标检测DETR 的端到端范式DETRDEtection TRansformer是端到端目标检测模型将 CNN 与 Transformer 编码器-解码器结合实现位于 modeling_detr.pyCNN backbone 提取特征预训练 CNN backbone 接收像素表示的图像生成低分辨率特征图再用 1×1 卷积降维得到高层语义的新特征图。由于 Transformer 是序列模型特征图被展平为特征向量序列并与位置嵌入拼接编码器 解码器 目标查询特征向量送入编码器通过注意力层学习图像表示编码器隐藏状态与目标查询object queries在解码器中结合。目标查询是可学习嵌入聚焦图像的不同区域并在逐层注意力中不断更新。解码器隐藏状态经前馈网络预测每个目标查询的边界框坐标与类别标签无目标则预测no object并行解码 N 个预测与自回归模型逐个预测不同目标检测是集合预测任务(边界框, 类别)DETR 对每个目标查询并行解码一步产出 N 个预测二分匹配损失训练时用二分匹配损失将固定数量的预测与固定数量的真值标签配对。若 N 个标签中真值不足则用no object类填充。该损失促使 DETR 找到预测与真值的一一对应边界框或类别不对会引入损失预测了不存在的物体也会被惩罚——这鼓励 DETR 去发现图像中的其他物体而不是只盯着最显眼的目标。检测头包含两部分线性层将解码器隐藏状态转为类别 logitsMLP 预测边界框。整体对应 DetrForObjectDetection。微调流程见 目标检测任务指南。3.4 图像分割Mask2Former 的统一掩码分类架构Mask2Former 是解决所有类型图像分割任务实例、语义、全景的通用架构实现位于 modeling_mask2former.py。传统分割模型通常针对某一特定分割任务定制Mask2Former 则将每种分割任务都建模为**掩码分类mask classification**问题把像素聚成 N 个片段为给定图像预测 N 个掩码及其对应的类别标签。其三大核心组件Swin backbone接收图像经 3 个连续的 3×3 卷积生成低分辨率图像特征图像素解码器pixel decoder逐步把低分辨率特征上采样为高分辨率逐像素嵌入输出多尺度特征分辨率分别为原图的 1/32、1/16 与 1/8Transformer 解码器层 掩码注意力各尺度的特征图被逐次送入一个 Transformer 解码器层以从高分辨率特征中捕捉小物体。关键在于解码器中的掩码注意力masked attention——不同于可关注整幅图像的交叉注意力掩码注意力只聚焦图像中特定区域既更快又更好因为局部特征足以让模型学习。与 DETR 类似Mask2Former 也使用可学习目标查询并与像素解码器的图像特征结合做集合预测(类别标签, 掩码预测)解码器隐藏状态经线性层转为类别 logits用交叉熵损失求最可能类别掩码预测则由像素嵌入与解码器最终隐藏状态结合生成并用sigmoid 交叉熵损失 DICE 损失对比真值掩码找出最可能的掩码。整体对应 Mask2FormerForUniversalSegmentation。微调流程见 语义分割任务指南。3.5 深度估计GLPN 的全局-局部路径网络GLPNGlobal-Local Path Network将 SegFormer 编码器与轻量解码器结合用于深度估计实现位于 modeling_glpn.py更小的图像补丁与 ViT 一样把图像切成补丁序列但补丁更小——这更适合分割、深度估计这类稠密预测任务。补丁经 GLPNOverlapPatchEmbeddings 转为补丁嵌入后送入编码器层次化编码器GLPNEncoder 接收补丁嵌入经过多个编码器块每个块由注意力层与Mix-FFN负责提供位置信息组成。每个编码器块末尾有一个补丁融合层把相邻补丁组的特征拼接再用线性层降维将补丁数量降到 1/4 分辨率作为下一编码器块的输入如此重复最终得到 1/8、1/16、1/32 分辨率的图像特征轻量解码器 选择性特征融合SFFGLPNDecoder 接收编码器最后一个特征图1/32 尺度上采样到 1/16随后经过 GLPNSelectiveFeatureFusionSFF 模块从注意力图中为每个特征选择并融合局部与全局特征再上采样到 1/8此过程重复直至解码特征与原始图像同尺寸。输出经两层卷积后应用sigmoid 激活逐像素预测深度。训练目标采用SiLog LossSiLogLoss是深度估计常用的尺度不变对数损失。模型入口为 GLPNForDepthEstimation。四、自然语言处理编码器、解码器与序列到序列Transformer 最初为机器翻译设计如今几乎成为所有 NLP 任务的默认架构。不同任务适配不同结构有的适合编码器有的适合解码器还有的需要编码器-解码器。4.1 文本分类BERT 的编码器范式BERT 是仅编码器模型也是首个有效实现深度双向性的模型——通过同时关注左右两侧的词来学习更丰富的文本表示实现位于 modeling_bert.py。输入表示BERT 使用 WordPiece 分词 生成 token 嵌入用特殊 token[SEP]区分单句与句对在每段文本开头加特殊 token[CLS]还加入分段嵌入segment embedding标识 token 属于句对中的第一句还是第二句。两个预训练目标掩码语言建模MLM随机掩码一定比例的输入 token让模型预测它们。这解决了双向性的作弊问题——否则模型能看见全部词从而预测下一个词。被掩码 token 的最终隐藏状态送入带 softmax 的前馈网络在整个词表上预测被掩码的词下一句预测NSP模型判断句子 B 是否紧随句子 A。一半时间 B 是真实下一句另一半是随机句。判断结果送入带 softmax 的前馈网络在两类IsNext与NotNext上预测。微调时的头机制文本分类在基座模型上加序列分类头——线性层接收[CLS]的最终隐藏状态线性变换为 logits交叉熵损失求最可能的标签。对应 BertForSequenceClassification。微调流程见 文本分类任务指南Token 分类如 NER加 token 分类头——线性层接收每个 token 的最终隐藏状态对每个 token 计算 logits 与交叉熵损失。对应 BertForTokenClassification。见 Token 分类任务指南问答加span 分类头——线性层将最终隐藏状态变换为答案span的起始与结束 logits用交叉熵损失找出对应答案的最可能文本区间。对应 BertForQuestionAnswering。见 问答任务指南。 注意一旦 BERT 预训练完成做不同任务有多容易只需在预训练模型上挂一个任务专属的头把隐藏状态加工成想要的输出即可。4.2 文本生成GPT-2 的解码器范式GPT-2 是仅解码器模型在大规模文本上预训练给定提示即可生成令人信服尽管不一定真实的文本也能完成问答等其他 NLP 任务——尽管没有为此显式训练。实现位于 modeling_gpt2.py。BPE 分词与掩码自注意力GPT-2 用 BPE字节对编码 分词并生成 token 嵌入加上位置嵌入指示 token 位置。输入嵌入经过多个解码器块每个块内使用掩码自注意力masked self-attentionGPT-2 不能关注未来 token只能关注左侧 token。这与 BERT 的[mask]token 不同——掩码自注意力是用注意力掩码把未来 token 的注意力分数置为0语言建模头与因果目标解码器输出送入语言建模头线性变换隐藏状态为 logits标签是序列中的下一个 token把 logits 右移一位得到计算交叉熵损失得到最可能的下一 token。GPT-2 的预训练目标完全基于因果语言建模CLM——预测序列中的下一个词这使它尤其擅长文本生成类任务。对应 GPT2LMHeadModel。微调见 语言建模任务指南 的因果语言建模部分生成细节另见 文本生成策略指南。4.3 摘要BART 的序列到序列范式BART 与 T5 这类编码器-解码器模型专为摘要等序列到序列任务设计实现位于 modeling_bart.py。架构与预训练BART 的编码器结构与 BERT 很相似接收文本的 token 与位置嵌入。BART 的预训练方式是破坏输入、再用解码器重建。与其他编码器使用特定破坏策略不同BART 可施加任意类型的破坏但text infilling文本填充策略效果最好把若干段文本替换为一个[mask]token。这很重要——模型必须预测被掩码的 token从而学会预测缺失 token 的数量。输入嵌入与掩码片段经编码器产生最终隐藏状态与 BERT 不同BART 末尾不接预测词的前馈网络。解码与损失编码器输出送入解码器解码器须从编码器输出中预测被掩码的 token 以及任何未破坏的 token——这提供了额外上下文帮助解码器恢复原文。解码器输出经语言建模头线性变换为 logits交叉熵损失以右移一位的 token 为标签。对应 BartForConditionalGeneration。微调见 摘要任务指南。4.4 翻译BART 的跨语言适配与 mBART翻译同样是序列到序列任务可用 BART 或 T5 完成。BART 适配翻译的方式是添加一个随机初始化的独立编码器将源语言映射为可在目标语言中解码的输入新编码器的嵌入送入预训练编码器替代原有词嵌入。训练分两步第一步用模型输出的交叉熵损失更新源编码器、位置嵌入与输入嵌入模型其他参数冻结第二步所有参数一起训练。此后 BART 有了多语言版本mBART见 model_doc/mbart针对翻译在多种语言上预训练。微调见 翻译任务指南生成策略详见 文本生成策略指南。五、结语一条主线贯穿所有任务回看全文无论是 20ms 一帧的语音特征、16×16 的图像补丁还是 WordPiece/BPE 切出的文本 token Transformers 中所有模型都在遵循同一条主线把原始输入离散化成序列 → 用编码器/解码器/编码器-解码器架构提取表示 → 挂一个任务专属的头把隐藏状态变换为目标输出类别、span、边界框、掩码、下一 token 或深度图。预训练模型是通用特征提取器任务头则是任务专用适配器——这正是你可以用同一套预训练权重快速解决多种任务的根本原因。据此在动手微调任意模型前你都可以先问自己三个问题我的输入适合哪种离散化方式哪种架构结构与我的任务最匹配该任务的输出应该由哪种头来产生【免费下载链接】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),仅供参考