Transformers 中 ALIGN 模型完全指南:EfficientNet + BERT 双编码器实现图文检索与零样本分类

发布时间:2026/9/11 18:02:24
Transformers 中 ALIGN 模型完全指南:EfficientNet + BERT 双编码器实现图文检索与零样本分类 Transformers 中 ALIGN 模型完全指南EfficientNet BERT 双编码器实现图文检索与零样本分类【免费下载链接】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/transformersALIGNA Large-scale ImaGe and Noisy-Text是由 Chao Jia 等人在论文《Scaling Up Visual and Vision-Language Representation Learning With Noisy Text Supervision》中提出的多模态视觉语言模型在 Hugging Face Transformers 中以 ALIGN 模型实现 的形式提供完整 PyTorch 实现。它采用 EfficientNet BERT 的双编码器结构通过对比学习将图像与文本映射到同一向量空间可用于图像-文本相似度计算与零样本图像分类。读完本文你将掌握 ALIGN 的架构原理、基于AlignProcessor与AlignModel的完整使用流程、全部配置参数含义以及底层对比损失与相似度计算的实现细节。ALIGN 模型概述ALIGN 是一个多模态视觉语言模型能够计算图像与文本之间的相似度并直接用于零样本图像分类。其核心设计理念可以概括为用数据规模弥补噪声。与此前依赖 ImageNet、OpenImages 等人工标注数据集或 Conceptual Captions、MSCOCO、CLIP 等需要昂贵清洗流程的数据集不同ALIGN 直接使用超过 10 亿个图像 alt-text 文本配对构成的噪声数据集进行训练并且省略了 Conceptual Captions 中昂贵的过滤和后处理步骤。论文的核心观点是经过预训练的表示已经成为许多 NLP 与感知任务的关键但视觉与视觉语言表示仍然严重依赖精心构造的训练数据集这类数据集要么昂贵、要么需要专业知识。ALIGN 利用超过 10 亿对图像 alt-text 配对不经过概念性字幕数据集的高成本过滤步骤训练一个简单的双编码器架构使用对比损失将图像与文本配对拉近、将不相似配对推远。实验证明语料库的规模足以弥补数据的噪声——即使学习方案非常简单也能得到接近最先进的表示。学习到的视觉表示在 ImageNet、VTAB 等分类任务上表现出强迁移性能对齐后的视觉与语言表示不仅能实现零样本图像分类还在 Flickr30K 与 MSCOCO 图像-文本检索基准上取得了当时的最先进结果并支持复杂的文本及文本图像跨模态检索。在 Transformers 仓库中该模型由 Alara Dirik 贡献。需要注意的是ALIGN 的原始代码并未公开仓库中的实现基于原论文与 Kakao Brain 的实现。官方预训练权重托管在 Kakao Brain 组织下如kakaobrain/align-base检查点。架构剖析EfficientNet 视觉编码器 BERT 文本编码器ALIGN 采用**双编码器dual-encoder**结构两个编码器各自独立地将输入映射为特征向量视觉编码器使用 EfficientNetB7 风格配置默认width_coefficient2.0、depth_coefficient3.1负责提取图像视觉特征文本编码器使用 BERTbase 规模12 层、768 隐藏维度负责提取文本语义特征。文本与视觉特征随后被投影到同一维度projection_dim640的潜在空间投影后的图像特征与文本特征之间的点积即作为相似度分数。整个结构可以在 modeling_align.py 的AlignModel类中看到端到端的组装AlignModel.__init__中实例化AlignTextModel(text_config)与AlignVisionModel(vision_config)并通过nn.Linear(text_embed_dim, projection_dim)构造text_projection投影层同时初始化一个可学习的temperature参数默认值由temperature_init_value控制初始为1.0用于缩放相似度分数forward中依次通过视觉模型与文本模型得到image_embeds与text_embeds对两者做 L2 归一化后计算余弦相似度并除以 temperature得到logits_per_text与logits_per_image见 modeling_align.py。视觉端EfficientNet 风格主干从源码结构看modeling_align.py视觉编码器完整复刻了 EfficientNet 的骨干设计包含AlignVisionEmbeddingsstem 模块由 ZeroPad2d 3×3 stride2 卷积 BatchNorm Swish 激活组成AlignVisionBlock每个基础块由**扩张Expansion→ 深度可分离卷积DepthwiseConv→ 挤压激励Squeeze-and-Excite→ 投影Projection**四阶段构成其中扩张比例、核大小、步长等均由配置决定AlignVisionEncoder依据depth_coefficient对每个阶段的块重复次数取整堆叠出完整网络池化层根据pooling_type在mean与max之间选择对hidden_dim大小的特征图做全局池化modeling_align.py。文本端BERT 风格编码器文本编码器结构与 BERT 保持一致源码中多处直接标注Copied from transformers.models.bert.modeling_bertAlignTextEmbeddings组合词嵌入、位置嵌入与 token 类型嵌入AlignTextEncoder堆叠 12 层AlignTextLayer每层包含多头自注意力AlignTextSelfAttention与前馈网络AlignTextIntermediateAlignTextOutput并支持梯度检查点GradientCheckpointingLayer。AlignTextPooler取序列首 token[CLS]位置的隐藏状态经过线性层与 Tanh 得到池化输出modeling_align.py。快速上手计算图像-文本相似度AlignProcessor将文本编码所需的BertTokenizer与图像预处理所需的EfficientNetImageProcessor封装进同一个实例同时处理文本编码与图像预处理。下面的示例演示如何用AlignProcessor与AlignModel计算图像-文本相似度分数源自 日语版 ALIGN 文档 的官方示例import requests import torch from PIL import Image from transformers import AlignProcessor, AlignModel processor AlignProcessor.from_pretrained(kakaobrain/align-base) model AlignModel.from_pretrained(kakaobrain/align-base) url http://images.cocodataset.org/val2017/000000039769.jpg image Image.open(requests.get(url, streamTrue).raw) candidate_labels [an image of a cat, an image of a dog] inputs processor(textcandidate_labels, imagesimage, return_tensorspt) with torch.no_grad(): outputs model(**inputs) # this is the image-text similarity score logits_per_image outputs.logits_per_image # we can take the softmax to get the label probabilities probs logits_per_image.softmax(dim1) print(probs)输出结果中logits_per_image形状为(image_batch_size, text_batch_size)表示每张图像与每个候选文本之间的相似度分数对 dim1 取 softmax 即可得到每个候选标签的概率概率最高的标签即为模型判定最匹配的类别。手工计算余弦相似度AlignModel.forward返回的AlignOutput中还包含text_embeds、image_embeds等字段。若需要手工复现相似度计算例如做检索排序可以先对嵌入做 L2 归一化再计算点积——这与源码中forward的内部逻辑一致image_embeds outputs.image_embeds / outputs.image_embeds.norm(p2, dim-1, keepdimTrue) text_embeds outputs.text_embeds / outputs.text_embeds.norm(p2, dim-1, keepdimTrue) similarity_scores torch.matmul(text_embeds, image_embeds.t()) probs torch.nn.functional.softmax(similarity_scores, dim0)零样本图像分类的两种官方用法在英文版 ALIGN 文档中提供了两种零样本图像分类的官方示例分别基于Pipeline与AutoModel接口在仓库内均可直接验证。方式一使用 pipelinefrom transformers import pipeline pipeline pipeline( taskzero-shot-image-classification, modelkakaobrain/align-base, device0, ) candidate_labels [ a photo of a dog, a photo of a cat, a photo of a person ] pipeline(https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg, candidate_labelscandidate_labels)方式二使用 AutoModelForZeroShotImageClassification 与 AutoProcessorimport requests import torch from PIL import Image from transformers import AutoModelForZeroShotImageClassification, AutoProcessor processor AutoProcessor.from_pretrained(kakaobrain/align-base) model AutoModelForZeroShotImageClassification.from_pretrained(kakaobrain/align-base, device_mapauto) url https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg image requests.get(url, streamTrue) inputs Image.open(image.raw).convert(RGB) image_inputs processor(imagesinputs, return_tensorspt).to(model.device) with torch.no_grad(): image_embeds model.get_image_features(**image_inputs) candidate_labels [a photo of a dog, a photo of a cat, a photo of a person] text_inputs processor(textcandidate_labels, paddingTrue, return_tensorspt).to(model.device) with torch.no_grad(): text_embeds model.get_text_features(**text_inputs) image_embeds image_embeds / image_embeds.norm(p2, dim-1, keepdimTrue) text_embeds text_embeds / text_embeds.norm(p2, dim-1, keepdimTrue) logits (image_embeds text_embeds.T) * 100.0 probs logits.softmax(dim-1).cpu().squeeze() for label, score in zip(candidate_labels, probs): print(f{label:20s} → {score.item():.4f})方式二展示了特征提取 API 的典型用法先用get_image_features提取图像特征再用get_text_features提取所有候选标签的文本特征最后通过点积与 softmax 得到分类概率。AlignProcessor 详解预处理管线AlignProcessor定义于 processing_align.py继承ProcessorMixin构造时接收image_processorEfficientNet 图像处理器与tokenizerBERT 分词器两个组件。从源码实现看处理器通过AlignProcessorKwargs提供了默认的文本处理行为padding默认为max_lengthmax_length默认为64。这意味着当你只传text而不显式指定 padding 策略时文本会被自动填充到最大长度 64return_tensorspt时返回 PyTorch 张量。如果候选标签数量较多或句子较长可显式传入paddingTrue或调整max_length以覆盖默认值。# 推荐显式指定 padding避免默认 max_length64 带来的截断 inputs processor(textcandidate_labels, imagesimage, return_tensorspt, paddingTrue)由于 ALIGN 的图像编码器为 EfficientNet其图像预处理缩放、归一化等由EfficientNetImageProcessor完成该处理器同样可以通过AutoProcessor.from_pretrained(kakaobrain/align-base)自动加载。配置类与全部参数说明ALIGN 在 configuration_align.py 中提供了三个配置类AlignConfig整体配置、AlignTextConfig文本子配置、AlignVisionConfig视觉子配置。AlignConfig整体配置AlignConfig的model_type为align通过sub_configs声明了text_config与vision_config两个子配置。核心参数参数默认值说明text_configAlignTextConfig()文本编码器子配置传入 dict 时会被自动实例化为AlignTextConfigvision_configAlignVisionConfig()视觉编码器子配置传入 dict 时会被自动实例化为AlignVisionConfigprojection_dim640文本与图像特征投影后的共同维度temperature_init_value1.0可学习温度参数的初始值遵循原始 ALIGN 实现initializer_range0.02权重初始化范围在__post_init__中若text_config或vision_config为None会自动用默认配置实例化对应子配置configuration_align.py。AlignTextConfigBERT 风格文本配置参数默认值说明vocab_size30522词表大小BERT uncased 风格hidden_size768隐藏层维度num_hidden_layers12Transformer 层数num_attention_heads12注意力头数intermediate_size3072前馈网络中间维度hidden_actgelu隐藏层激活函数hidden_dropout_prob0.1隐藏层 dropout 概率attention_probs_dropout_prob0.1注意力 dropout 概率max_position_embeddings512最大位置编码长度type_vocab_size2token 类型数量segment 区分initializer_range0.02初始化范围layer_norm_eps1e-12LayerNorm epsilonpad_token_id0填充 token idbos_token_id/eos_token_idNone开始/结束 token idAlignVisionConfigEfficientNet 风格视觉配置视觉配置的参数直接对应 EfficientNet 的复合缩放结构configuration_align.py参数默认值说明num_channels3输入图像通道数image_size600输入图像尺寸width_coefficient2.0每个阶段网络宽度缩放系数对应 EfficientNet-B7depth_coefficient3.1每个阶段网络深度缩放系数depth_divisor8网络宽度的单位通道数取整基数kernel_sizes[3, 3, 5, 3, 5, 5, 3]每个块的卷积核大小in_channels[32, 16, 24, 40, 80, 112, 192]每个阶段输入通道数out_channels[16, 24, 40, 80, 112, 192, 320]每个阶段输出通道数strides[1, 2, 2, 2, 1, 2, 1]每个阶段的卷积步长num_block_repeats[1, 2, 2, 3, 3, 4, 1]每个阶段块的重复次数expand_ratios[1, 6, 6, 6, 6, 6, 6]每个块的扩张比例squeeze_expansion_ratio0.25挤压激励层中间通道比例hidden_actswish激活函数EfficientNet 使用 Swishhidden_dim2560分类头之前的隐藏维度池化窗口大小pooling_typemean最终池化方式可选mean或maxinitializer_range0.02初始化范围batch_norm_eps0.001BatchNorm epsilonbatch_norm_momentum0.99BatchNorm 动量drop_connect_rate0.2跳跃连接skip connection的 drop 率注意AlignVisionConfig.__post_init__中会自动计算num_hidden_layers sum(num_block_repeats) * 4每个块内部 4 个阶段并将各列表参数转换为 list 以便 JSON 序列化保存configuration_align.py。组合子配置初始化整体模型AlignConfig支持从独立的文本、视觉配置组合而来便于自定义编码器规模from transformers import AlignConfig, AlignTextConfig, AlignVisionConfig, AlignModel # 初始化 ALIGN 文本与视觉配置 config_text AlignTextConfig() config_vision AlignVisionConfig() # 组合为整体配置 config AlignConfig(text_configconfig_text, vision_configconfig_vision) # 以随机权重初始化模型 model AlignModel(config)底层原理对比损失、温度缩放与相似度计算对比损失Contrastive Loss在 modeling_align.py 中对比损失被实现为对称形式的交叉熵def contrastive_loss(logits: torch.Tensor) - torch.Tensor: return nn.functional.cross_entropy(logits, torch.arange(len(logits), devicelogits.device), label_smoothing0.1) def align_loss(similarity: torch.Tensor) - torch.Tensor: caption_loss contrastive_loss(similarity) image_loss contrastive_loss(similarity.t()) return (caption_loss image_loss) / 2.0具体而言similarity矩阵的第 i 行第 j 列表示第 i 个文本与第 j 个图像的相似度对角线上的配对即真正的图文对是正样本。caption_loss沿文本方向、image_loss沿图像方向分别计算交叉熵取平均得到最终损失。损失中还使用了label_smoothing0.1做标签平滑。该实现改编自 CLIP 的对比损失版本训练时可通过AlignModel.forward(..., return_lossTrue)获取。温度参数与相似度分数AlignModel中temperature是一个可学习参数nn.Parameter初始值由temperature_init_value决定并通过_init_weights重置为配置值modeling_align.py。相似度分数的计算流程为视觉特征image_embeds来自视觉模型池化输出EfficientNet 全局池化后 reshape 为(batch, dim)文本特征取文本模型last_hidden_state的首 token[:, 0, :]经text_projection投影到 640 维两者分别做 L2 归一化logits_per_text text_embeds image_embeds.t() / temperaturelogits_per_image为其转置。这与文档中投影后的图像与文本特征间的点积作为相似度分数的描述完全一致。特征提取 APIget_text_features 与 get_image_featuresAlignModel提供两个独立的特征提取接口便于分别缓存图像/文本特征用于大规模检索modeling_align.pyget_text_features(input_ids, attention_mask, ...)返回文本特征。其内部取文本模型输出的首 token 隐藏状态经text_projection投影后写入pooler_outputget_image_features(pixel_values)直接返回视觉模型的池化输出。import torch from transformers import AlignProcessor, AlignModel model AlignModel.from_pretrained(kakaobrain/align-base) processor AlignProcessor.from_pretrained(kakaobrain/align-base) text_inputs processor(text[a photo of a cat, a photo of a dog], paddingTrue, return_tensorspt) with torch.inference_mode(): text_features model.get_text_features(**text_inputs) image_inputs processor(imagesimage, return_tensorspt) with torch.inference_mode(): image_features model.get_image_features(**image_inputs)这种方式适合先离线编码全部候选文本再对查询图像逐一打分的检索场景。AlignTextModel与AlignVisionModel则作为独立编码器类暴露供需要单独使用文本/视觉分支的场景如仅做图像特征提取或文本特征提取调用二者分别返回带池化的BaseModelOutputWithPooling与BaseModelOutputWithPoolingAndNoAttention输出。测试验证仓库中的行为保证仓库为 ALIGN 提供了完整的测试覆盖可作为行为依据tests/models/align/test_modeling_align.py 中的AlignModelTest继承ModelTesterMixin覆盖了模型前向、配置、输入嵌入、批量等价性test_batching_equivalence容差 atol/rtol 3e-4、梯度检查点训练、test_load_vision_text_config验证从整体配置加载视觉/文本子配置、test_inference推理等测试tests/models/align/test_processing_align.py 中的AlignProcessorTest继承ProcessorTesterMixin验证AlignProcessor对图像与文本输入的处理管线。这些测试从工程层面保证了AlignProcessor的预处理结果与AlignModel的前向输出在批处理、嵌入一致性等场景下的正确性。使用注意事项原始代码未公开官方文档明确说明 ALIGN 原始代码未公开Transformers 中的实现基于原论文与 Kakao Brain 的开源实现因此个别数值细节可能与论文原始实验存在细微差异。输入图像尺寸视觉配置默认image_size600预处理时会按 EfficientNet 的归一化与缩放策略处理请统一经由AlignProcessor/AutoProcessor输入不要手工缩放。文本长度AlignProcessor默认max_length64且按最大长度填充长文本候选标签请显式调整max_length或padding策略避免截断导致特征质量下降。相似度直接可用AlignModel.forward输出的logits_per_image/logits_per_text已经是经过归一化与温度缩放的相似度分数可直接取 softmax 得到概率手工计算嵌入余弦相似度时需自行归一化。推理时使用torch.no_grad()或torch.inference_mode()官方示例与文档一致采用无梯度上下文以节省显存并加速推理。参考资源关于 ALIGN 的更多资料官方文档推荐了以下几类均为社区/官方外部资源此处仅作指引Kakao Brain 发布的关于其开源 ViT、ALIGN 以及新的 COYO-700M 文本-图像数据集的博客文章英文文档中引用可用于了解数据集的构建动机基于 ALIGN 的零样本图像分类交互式演示空间应用kakaobrain/align-base检查点的模型卡其中包含基准评测结果与复现说明。如果想为文档补充新的参考资源可以按仓库的贡献流程提交 Pull Request由维护者评审后合入。小结本文围绕 日语版 ALIGN 模型文档 展开结合仓库源码完整讲解了ALIGN 以噪声数据 规模制胜为核心的双编码器设计EfficientNet 视觉编码器与 BERT 文本编码器的结构细节AlignProcessor的预处理管线与默认参数AlignConfig/AlignTextConfig/AlignVisionConfig三个配置类的全部参数对比损失、温度缩放与相似度分数的底层实现以及基于AlignModel、Pipeline、AutoModelForZeroShotImageClassification的图像-文本相似度计算与零样本分类实战。无论是直接使用官方预训练检查点还是基于配置类定制编码器规模都可以在本仓库 src/transformers/models/align 目录下找到对应的实现与测试支撑。【免费下载链接】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),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询