人工智能 |手算CLIP模型

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 本文详解CLIP模型原理:突破传统CNN需重新训练的局限,通过4亿图文对联合训练文本与图像编码器,实现零样本迁移。利用对比学习对齐多模态特征,支持图文检索、零样本分类等应用,让AI像人一样理解未见过的概念。(239字)

 引入:当 CNN 遇到它没见过的世界

             传统的图像分类模型,比如经典的 CNN,本质上是一个“死记硬背”的选手

    你给它看一百万张猫的照片,它就能认出猫;但如果有一天你给它一张"米粉"的图片,而训练

集里从来没出现过这个类别——它就彻底懵了。更要命的是,每当你想让模型认识新事物,就得重

新收集数据、重新标注、重新训练。这个过程费时费力,扩展性极差。

image.gif

那有没有办法,让模型像人一样,看到没见过的东西也能"猜个八九不离十"?

CLIP(Contrastive Language–Image Pre-training)的作者们提出了一个很有意思的想法:与其让

模型死记图片的类别标签,不如直接让它从自然语言描述中学习图片的语义。

毕竟,互联网上充斥着海量的图文内容——一张图片配上一段描述,这样的数据俯拾皆是。于是,

OpenAI 的研究者们从网络上收集了 4 亿个图文对作为训练数据。每一条数据,就是一张图片加上

与之对应的一段简短文字描述。有了这样规模的数据,模型或许就能学会:图片里的视觉内容,和

自然语言的语义,到底是怎么对应起来的。

image.gif


文本编码器

网络结构

项目 官方数值 对应结构图位置
模型总参数量 63M 完整文本塔
Transformer 堆叠层数 12 层 图左侧 12x,重复堆叠 12 次同一个模块
特征隐藏维度(宽度) d_model=512 所有向量统一 512 维
注意力头数 8 头 Masked Multi Self Attention
最大文本序列长度 77(你写 76 是近似) 输入 [SOS]文本[EOS] 总长度
MLP 前馈中间维度 10656 Feed Forward 层
输入[SOS]词嵌入 → 位置编码Position Embedding
→ 12层Transformer块(掩码自注意力+残差→LayerNorm→FFN前馈+残差→LayerNorm)
→ 提取最后[EOS]token特征 → 输出文本特征

image.gif

为了徒手笔算,我们做小维度的 CLIP 文本编码器,结构和官方完全一致,只是把数字缩小:

隐藏维度 d_model=2(官方 512,逻辑完全一样)

Transformer 层数:1 层(官方 12 层,只是重复 12 次这套计算)

注意力头:1 头(官方 8 头,只是分成 8 份再拼接)

最大序列长度:3 token(官方 77):[SOS]、cat、[EOS]

MLP 中间维度:4(官方 10656,对应关系:迷你 2→4,官方 512→10656)

词嵌入:把每个 token 转为 2 维向量


加上位置编码 Position Embedding(固定位置向量)


相加得到 Transformer 输入:


Masked Multi Self Attention 掩码多头自注意力

掩码 Masked 含义:只能看到前面 token,看不到后面 token(因果掩码)。


LayerNorm 层归一化

Feed Forward 前馈网络


image.gif

                      最终图文对齐用的文本特征,唯一来自最后 [EOS] token

后续操作:

输入文字
12 层 Masked Self-Attention (类 Decoder 结构)
取最后 [EOS] 位置的输出 → 512 维
可学习线性层 (512 → 512)
L2 单位归一化
最终文本特征向量 t̂  (模长 = 1)

image.gif

image.gif


图片编码器

网络结构

部分 文本编码器 图像编码器
架构 Decoder(带掩码单向注意力) ViT Encoder(双向无掩码)
层数 12 层 12 层
隐藏维 512 512
FFN 中间维 10656 10656
全局特征来源 最后一位 EOS token 第一位 CLS token
原始空间 语言私有空间 视觉私有空间
投影层 Text Projection Wt Image Projection Wi
最终特征 512 共享空间文本特征 512 共享空间图像特征

具体流程

原始图片
(224, 224, 3)
切成 32×32 的 Patch,共 49 个
(49, 3072)        ← 49 个 patch,每个拉平是 32×32×3 = 3072
线性投影 (3072 → 768)
(49, 768)
+ 1 个 [CLS] token
(50, 768)
+ Positional Embedding
(50, 768)
× 12 层 Self-Attention
(50, 768)
取 [CLS] 位置的向量
(768,)
线性层 (768 → 512)
(512,)
L2 归一化
(512,)            ← 最终图像特征 î

image.gif

image.gif

图像编码器 = ViT Encoder,输出 CLS token;

文本编码器 = Masked Decoder,输出 EOS token;

各自经过投影进入同一共享空间然后进行归一化,再做图文对比学习。


图文相似度计算

                                下一步就是:算每张图片和每段文字之间的相似度。

image.gif

假设 batch 里有 3 个图文对

描述
图像 î₁ 一只猫
图像 î₂ 一只狗
图像 î₃ 一辆车

对应文本:

描述
文本 t̂₁ "a cat"
文本 t̂₂ "a dog"
文本 t̂₃ "a car"

相似度矩阵

因为都做了 L2 归一化,点积 = 余弦相似度,直接:

image.gif

绿色对角线 = 正确配对,值应该尽量大;其余位置是负样本,值应该尽量小。

乘以温度系数 τ

直接用原始相似度训练会不稳定,所以还要乘一个可学习的温度系数 τ(CLIP 初始化为 0.07):

image.gif

作用:放大相似度差异,让正样本更突出,负样本更拉开τ 越小,区分度越强;τ 越大,越平滑。


双向对比损失(Contrastive Loss)

     如图所示,在 CLIP 的训练迭代中,一个 Batch 包含 N 张图像和 N 段对应的文本。图像经过

ViT Encoder 编码,得到 N×D 的图像特征矩阵 image_features;文本经过 Masked Decoder 编

码,得到 N×D 的文本特征矩阵 text_features。这两个矩阵是后续计算 N×N 相似度矩阵 和 双向

对比损失 的原始数据基础。

image.gif

在得到图文特征矩阵后,CLIP 通过矩阵乘法计算双向相似度:

计算 图像对文本 的相似度矩阵 logits_per_image (形状 N×N),其中每一行代表一张图对所有文本

的相似性得分;

计算 文本对图像 的相似度矩阵 logits_per_text (形状 N×N),其中每一行代表一段文对所有图片

的相似性得分。 image.gif


image.gif 编辑

上面是图找所有文的相似度矩阵下面是文找所有图的相似度矩阵两个矩阵互为转置(行列互换),

完全对称。

image.gif

上图:把图片匹配文本,当成「N 分类任务」,类别是批量里所有文本

下图:把文本匹配图片,当成「N 分类任务」,类别是批量里所有图片

两个都是标准交叉熵分类损失,合起来就是CLIP 双向对比损失

模型目标:两个分类任务都能精准选中对角线的正样本配对

image.gif

先计算图像 - 文本双向相似度矩阵;

设定分类标签targets,对角线位置为正样本正确类别;

分别对两个相似度矩阵计算交叉熵损失;

CLIP 最终双向对比损失 = 图像方向损失 + 文本方向损失。

image.gif  


CLIP 推理阶段:Zero-Shot 预测

  • 计算 (余弦相似度)
  • 取 argmax,找出得分最高的类别
  • 最终输出:自然语言类别描述,如 "A photo of a dog."

image.gif


CLIP 的应用

图文检索

三个查询示例

文本查询 检索结果
"A bicyclist with a blue shirt" 找到了路口骑蓝色上衣自行车的人
"A white car" 找到了画面中央的白色轿车
"A truck with the text 'JCN'" 找到了带有 JCN 字样的货车

输入(两路)

文本端:一条自然语言查询,如 "A truck with the text 'JCN'",在线实时输入

图像端:监控视频拆出的所有图像帧(数据库),通常离线预先编码好存储

输出:数据库中与查询文本余弦相似度最高的那张图像(即最匹配的视频帧)

image.gif

image.gif

其它的应用

应用方向 一句话说明 是否需要微调 CLIP
零样本图像分类 不用训练,直接用文字描述类别给图片分类 ❌ 零样本,完全不用微调
图文检索 文字搜图片、图片搜文字 ❌ 零样本推理
开放词汇检测分割 识别任意新词物体,不用标注训练 ⚠️ 少量微调下游头
AIGC 生成打分引导 控制文生图图文匹配度 ❌ 直接复用特征
视频动作识别 零样本识别视频动作 ⚠️ 简单下游适配
多模态大模型底座 几乎所有图文大模型的基础组件 ✅ 后续二次开发微调
目录
相关文章
|
8天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
3677 16
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
16天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
3602 13
|
10天前
|
人工智能 自然语言处理 供应链
|
12天前
|
人工智能 Linux BI
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
JeecgBoot AI专题研究 一键脚本:Claude Code + JeecgBoot Skills + DeepSeek 全平台接入 一行命令装好 Claude Code + JeecgBoot Skills + DeepSeek 接入,无需翻墙使用 Claude Code,支持 Wind
2995 7
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
|
19天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
3727 25
|
10天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全+三种模式+记忆体系+实战工作流完整手册
Claude Code 是当前最流行的终端级 AI 编程助手,能够直接在命令行中完成代码生成、项目理解、文件修改、命令执行、错误修复等全流程开发工作。它不依赖图形界面、不占用额外资源,却能深度理解项目结构,自动生成规范代码,大幅提升研发效率。
1470 3
|
3天前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
498 0
|
17天前
|
存储 Linux iOS开发
【2026最新】MarkText中文版Markdown编辑器使用图解(附安装包)
MarkText是一款免费开源、跨平台的Markdown编辑器,主打所见即所得实时预览,支持Windows/macOS/Linux。内置数学公式、流程图、代码高亮、多主题及PDF/HTML导出,是Typora的轻量免费替代首选。(239字)