
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.pyVision Transformer (ViT)、ConvNeXT图像分类纯 Transformer / 现代 CNNmodeling_vit.py、modeling_convnext.pyDETR目标检测CNN 骨干 编码器-解码器modeling_detr.pyMask2Former图像分割编码器-解码器 掩码注意力modeling_mask2former.pyGLPN深度估计分层编码器 轻量解码器modeling_glpn.pyBERT文本分类、Token 分类、问答编码器编码器modeling_bert.pyGPT-2文本生成解码器解码器modeling_gpt2.pyBART摘要、翻译编码器-解码器编码器-解码器modeling_bart.py解决某项任务有许多种方式不同模型可能采用特定技术甚至全新视角切入但对 Transformer 模型而言总体思路一致。原文档给出的前置建议是在阅读本文前最好已了解 Transformer 原始架构——理解编码器、解码器与注意力机制的工作原理是理解下文各种模型的关键。音频与语音Wav2Vec2 的自监督预训练Wav2Vec2 是在未标注语音数据上自监督训练Self-Supervised的模型可在标注数据上微调Fine-tuning以完成音频分类与自动语音识别ASR。它的架构由四个主要组件构成以下逐一对应仓库源码。组件一特征编码器Feature Encoder特征编码器接收原始音频波形将其归一化Normalization为零均值、有限标准差并转换为一个特征向量序列每个向量长约 20 毫秒。从源码看Wav2Vec2FeatureEncoder由一串堆叠的卷积层nn.ModuleList实现第一层可以是 GroupNormfeat_extract_norm group或 LayerNormlayer卷积后续层均为无 LayerNorm 卷积。forward将一维波形input_values扩展为[:, None]后逐层卷积。随后Wav2Vec2FeatureProjection用nn.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(hardTrue)采样硬选择并计算困惑度perplexity推理时退化为argmax硬选择与文档从码本中挑选最合适的向量描述完全一致。组件三上下文网络Context Network约一半的特征向量被随机遮蔽被掩码的特征向量输入上下文网络。该网络是一个Transformer 编码器同时加入相对位置嵌入Relative Positional Embeddings。对应源码中的Wav2Vec2Encoder与Wav2Vec2Attention内置相对位置偏置。组件四对比学习任务Contrastive Objective上下文网络的预训练目标是对比任务模型必须在一堆错误表示中预测出与被掩码预测对应的正确量化语音表示从而促使模型学会找到最相似的上下文向量与量化语音单元即分类目标。从源码看Wav2Vec2ForPreTraining持有量化器与两个投影层project_hid/project_q其静态方法compute_contrastive_logits用余弦相似度计算预测向量与正确目标 负样本的相似度并除以温度temperature0.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 两条路线处理视觉任务有两条主流路线将图像切分为 patch 序列用 Transformer 并行处理使用如 ConvNeXT 这样的现代 CNN——核心仍是卷积层但采用现代网络设计。原文档还提示存在第三条卷积 Transformer混合路线如 CVT、LeViT因其只是上述两种思路的组合文中不再展开。ViT 与 ConvNeXT 常用于图像分类对于目标检测、分割、深度估计则分别考察 DETR、Mask2Former、GLPN——它们是各自任务更合适的模型。图像分类之一Vision Transformer (ViT)ViT 与 ConvNeXT 都能做图像分类核心区别在于ViT 使用注意力机制ConvNeXT 使用卷积。ViT 用纯 Transformer 结构完全取代卷积——如果你熟悉原始 Transformer就已经迈出了理解 ViT 的一半。ViT 的主要贡献在于图像如何喂给 TransformerPatch 化图像被切分为不重叠的方形 patch每个 patch 变成一个向量patch 表示。patch 嵌入由一个 2D 卷积层生成产生正确的输入维度基础 Transformer 中每个 patch 嵌入 768 维。224×224 的图像可切成 196 个 16×16 patch——就像文本分词图像被分词为 patch 序列。[CLS]标记如同 BERT在 patch 表示序列开头加入可学习的[CLS]token其最终隐藏状态作为分类头的输入其余输出被忽略。这类标记帮助模型学习如何编码整张图像的表示。位置表示由于模型不知道 patch 的顺序还需为 patch 表示与可学习标记加上位置表示它们同样可学习且与 patch 表示同维度。之后所有表示送入 Transformer 编码器。MLP 头编码器输出特指[CLS]的输出送入多层感知机MLP头。ViT 预训练目标仅为分类MLP 头把输出转为类别概率并计算交叉熵损失找最可能类别。仓库源码与上述描述一一对应ViTPatchEmbeddings用nn.Conv2d(kernel_sizepatch_size, stridepatch_size)一步完成切 patch 线性投影输出(batch, num_patches, hidden_size)ViTEmbeddings中cls_token为可学习参数position_embeddings的形状为(1, num_patches 1, hidden_size)1 即[CLS]的位置并提供interpolate_pos_encoding以支持更高分辨率输入。分类头见ViTForImageClassification。想动手实践可参考官方图像分类任务指南。图像分类之二现代卷积网络 ConvNeXTConvNeXT 是采用现代网络设计以提升性能的 CNN 架构卷积仍是其核心。宏观上卷积是指用一个更小矩阵核与图像一小块像素相乘、从中提取特征如特定纹理、曲线然后滑动到下一窗口像素的过程滑动距离称为步幅stride。该输出可送入下一卷积层每一层学到更复杂抽象的概念卷积层之间常加池化层降低维度、提升对特征位置变化的鲁棒性。ConvNeXT 从五个方面现代化了 CNN对应实现见 modeling_convnext.py 中ConvNextLayer与ConvNextModel调整各阶段块数并用更大步幅加匹配核尺寸压缩图像——这种不重叠下采样策略使压缩类似 ViT 的 patch 划分方式。瓶颈层先压缩通道数再恢复因为 1×1 卷积更快从而可以加深网络倒置瓶颈则先扩展再压缩通道更省内存。用深度卷积替代 3×3 标准卷积对每个输入通道独立卷积后再堆叠加宽网络以提升性能。ViT 凭注意力机制拥有全局感受野ConvNeXT 通过把核尺寸加大到7×7来模拟这一效果。一系列模仿 Transformer 的层设计变更更少的激活与归一化层、激活函数换成 GELU 而非 ReLU、用 LayerNorm 替代 BatchNorm。卷积块输出最后送入分类头转为概率并计算交叉熵损失得到最可能类别。目标检测DETRDEtection TRansformerDETR 是端到端的目标检测模型组合了 CNN 与编码器-解码器 Transformer预训练 CNN 骨干接收以像素值表示的图像生成低分辨率特征图对其做 1×1 卷积降维得到高层图像表示的新特征图。由于 Transformer 是序列模型特征图被展平为特征向量序列并与位置表示融合。源码中对应DetrConvEncoderCNN 特征提取、DetrSinePositionEmbedding与DetrLearnedPositionEmbedding两种位置编码。特征向量送入编码器用注意力层学习图像表示。随后编码器隐藏状态与对象查询object queries在解码器中融合。对象查询是可学习表示关注图像的不同区域并在穿过每层注意力时被更新。解码器隐藏状态送入前馈网络为每个对象查询预测边界框坐标 分类标签若无对象则预测no-object。DETR 并行解码全部对象查询一次输出N个最终预测N为查询数。与每次预测一个元素的自回归模型不同目标检测是一次遍历输出 N 个预测如bounding_box、class_label的集合预测任务。训练时 DETR 使用二分类匹配损失在固定数量预测与固定数量真值标注之间比较若真值少于N个则用no-object类别填充。该损失促使 DETR 找到预测与真值之间的一对一映射边界框或类别预测错误会付出损失若预测了不存在的对象也会受罚——这鼓励 DETR 去发现图中更多对象而不是只盯着一个显眼对象。DETR 之上附加目标检测头以定位对象类别与边界框坐标。检测头有两个部件一个把解码器隐藏状态转为类别概率的线性层和一个预测边界框的 MLP 网络见 modeling_detr.py 中DetrModelOutput/DetrObjectDetectionOutput相关定义。想动手实践可参考官方目标检测任务指南。图像分割Mask2FormerMask2Former 是解决各类图像分割任务的通用架构。传统分割模型通常针对某个特定子任务实例分割、语义分割、全景分割设计Mask2Former 把这些问题统一为掩码分类mask classification把像素聚为N个区域为图像预测N个掩码及对应类别标签。其主要组件模型定义见Mask2FormerModelSwin 骨干Swin Transformer接收图像经 3 次连续 3×3 卷积生成低分辨率特征图。**像素解码器pixel decoder**将低分辨率特征逐步上采样为逐像素高分辨率表示实际产出多尺度特征同时含低/高分辨率信息分辨率分别为原图的 1/32、1/16、1/8。不同尺度的特征图依次送入解码器层以捕获小物体高分辨率特征中信息更完整。Mask2Former 的钥匙在于解码器中的掩码注意力masked attention与可关注全图的标准交叉注意力不同掩码注意力只关注图像的特定区域——更快、效果更好因为局部特征已足以供模型学习。类似 DETRMask2Former 也使用可学习对象查询并与像素解码器的图像特征组合做集合预测class_labelmask prediction。解码器隐藏状态经线性层转为类别标签上的概率用交叉熵损失确定最可能类别。掩码预测则由像素表示与解码器最终隐藏状态组合生成用sigmoid 交叉熵损失与dice 损失在概率与真值掩码之间计算得到最可能掩码。想动手实践可参考官方语义分割任务指南。深度估计GLPN全局局部路径网络GLPN 是用于深度估计的 Transformer组合了 SegFormer 编码器与轻量解码器如同 ViT图像被切分为 patch 序列——但这些 patch更小更适合分割、深度估计等密集预测任务。patch 被转换为 patch 表示后送入编码器实现见GLPNOverlapPatchEmbeddings。编码器把 patch 表示穿过若干编码块每块由注意力层与Mix-FFN组成后者提供局部信息。每个编码块末尾有patch 合并层构建层次化表示每块相邻 patch 的特征被合并合并后特征经线性层降采样到 1/4 分辨率作为下一编码块的输入依次得到 1/8、1/16、1/32 分辨率的图像特征GLPNMixFFN、GLPNEncoder。轻量解码器取编码器最后一张特征图1/32 尺度上采样到 1/16随后特征进入**选择性特征融合SFF, Selective Feature Fusion**单元——对每个特征从注意力图中选择并融合局部与全局特征再上采样到 1/8如此循环直到解码特征恢复到原图尺寸。输出穿过两层卷积后应用 sigmoid 激活预测每个像素的深度。自然语言处理编码器、解码器与编码器-解码器Transformer 最初为机器翻译设计如今事实上是几乎所有 NLP 任务的默认架构。有些任务适合编码器结构有些更适合解码器还有些仍在使用编码器-解码器结构。文本分类BERT纯编码器BERT 是仅基于编码器的模型也是第一个通过关注双侧词语有效应用深度双向性、学到更丰富文本表示的模型BERT 使用 WordPiece 分词生成文本的 token 表示。为区分单句与句对加入特殊标记[SEP]每个文本序列开头加入[CLS]标记其最终输出作为分类头输入。BERT 还加入段嵌入segment embedding指示 token 属于句对中的第一句还是第二句。预训练使用两个目标掩码语言建模与下一句预测。掩码语言建模中随机遮蔽一定比例的输入 token 并要求模型预测它们——这解决了双向性问题否则模型可以看到所有词而作弊式预测下一词。被掩码 token 的最终隐藏状态送入带 Softmax跨语言词表的前馈网络预测被掩码词。第二个目标是下一句预测判断句 B 是否接续句 A——一半时间 B 是真正的下一句另一半时间是随机句是否下一句的预测送入带 Softmax跨IsNext/NotNext两类的前馈网络。输入表示穿过若干编码器层输出若干最终隐藏状态。用预训练模型做文本分类时在 BERT 基座之上加序列分类头一个接收最终隐藏状态、做线性变换得到 logits 的线性层再计算 logits 与目标间的交叉熵损失找最可能类别。想动手实践可参考文本分类任务指南使用 DistilBERT 微调与推理。Token 分类命名实体识别NER等用 BERT 做 Token 分类如命名实体识别 NER时在基座之上加Token 分类头一个接收最终隐藏状态、做线性变换得到 logits 的线性层交叉熵损失在 logits 与每个 token的目标之间计算找到最可能类别。实践入口见Token 分类任务指南。问答跨度span头用 BERT 做问答时在基座之上加跨度分类头线性层接收最终隐藏状态计算答案对应跨度的起始与结束logits交叉熵损失在 logits 与位置标注间计算找到最可能的答案文本跨度。实践入口见问答任务指南。值得注意BERT 一旦预训练完成适配新任务就非常容易——只需给预训练模型加一个对应头部把隐藏状态变换成所需输出即可。文本生成GPT-2纯解码器GPT-2 是基于大量文本预训练的纯解码器模型。它给定提示能生成流畅虽然并不总是正确的文本还能完成问答等其他 NLP 任务——即使从未被显式训练过这些任务。GPT-2 使用 BPE字节对编码 分词生成 token 表示并为每个 token 加位置表示以指示其在序列中的位置。输入表示穿过若干解码块输出最终隐藏状态。每个解码块内使用掩码自注意力GPT-2 无法注意未来的 token只能关注左侧 token。这与 BERT 的[mask]标记不同——掩码自注意力中用的是注意力掩码把未来 token 的注意力得分置为 0。解码器输出送入语言建模头做线性变换把隐藏状态转为 logits 概率。标签是序列中下一个 token通过将 logits 右移一位生成在移位 logits 与标签间计算交叉熵损失输出最可能的下一 token。GPT-2 的预训练目标完全基于 因果语言建模——预测序列中的下一个词这也使它特别适合文本生成类任务。想动手实践可参考语言建模任务指南因果语言建模章节。更多关于文本生成的信息可参考文本生成策略指南。摘要BART编码器-解码器BART 与 T5 这类编码器-解码器模型为序列到序列的摘要任务而生BART 的编码器结构与 BERT 相似接受 token 与位置表示。BART 通过先破坏输入再用解码器重建进行预训练。与其他采用固定破坏策略的编码器不同BART 可施加任意破坏其中文本填充text infilling策略效果最好将若干文本跨度替换为单个[mask]标记——这一点很关键因为模型需要预测被掩码的 token从而学会预测缺失的 token 数量。输入表示与被掩码跨度穿过编码器输出最终隐藏状态但不同于 BERTBART没有在末端加预测词的前馈网络。编码器输出送入解码器解码器需根据编码器结果预测被掩码 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跨度头用于 QACTC 头用于 ASRMLP/掩码头用于图像分类、检测与分割。范式匹配任务方向判别式输入→单一定长输出任务多用编码器自回归输入→变长文本任务用解码器序列→序列摘要、翻译与集合预测检测、分割用编码器-解码器。理解这一模式后你就可以在 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),仅供参考