你有没有经历过这种时刻:在相册里翻到一张照片,只记得“去年夏天海边,一把蓝白条纹的遮阳伞”,却怎么也找不到这张照片;又或者逛电商时看到一件喜欢的衣服,只想用“以图搜图”找到同款。对人类来说,把“一句描述”和“一张照片”关联起来毫不费力,但这件事对计算机并不容易——因为图片是一堆像素,而文字是一串符号,两者的“语言”完全不同。这篇文章就带你看懂,AI 是如何让图片和文字跨越“语言障碍”、在同一个语义空间里找对象的。 这场好戏,就像一档名为《默契大挑战》的综艺:来自“图片王国”的选手和来自“文字王国”的选手同台,语言不通,全靠后台一台“语义翻译机”把双方表达翻译成一套通用“默契密码”。跨模态检索正是这样一台翻译机——它把图文介绍到同一个“默契大厅”,用对比学习撮合正确配对、用难负样本制造高难环节、用温度旋钮控制评审严苛程度。从 CLIP 到 ALIGN,终于让这台翻译机在亿级图文数据里练成“王牌解说员”,真实商用落地。

岗位关联

对 AI 从业者而言,理解跨模态检索等于掌握多模态系统的“地基”,无论做搜索、推荐还是内容审核,你都能用这套方法让图文真正“听懂”彼此。

目录
  1. 可视化演示
  2. 跨模态检索概览:先搭起“默契大挑战”的擂台
  3. 共享语义空间:把图文翻译进同一个默契大厅
  4. 对比学习机制:配对法则如何训练出好翻译官
  5. 难负样本挖掘:节目组悄悄埋下的“高仿干扰项”
  6. 温度缩放优化:旋转裁判的严格度旋钮
  7. CLIP模型原理:看过四亿场综艺的王牌选手
  8. ALIGN与工程落地:从演播厅走进真实世界的检索系统
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

跨模态检索概览:先搭起“默契大挑战”的擂台

《默契大挑战》第一集的规则很简单:主持人给出一条文字线索,比如“一只橘猫蹲在窗台上”,台上的“文字选手”把这句话讲给后台,后台再帮 TA 从成百上千张图片中找到最匹配的那张。反过来,“图片选手”也可以拿出一张图,请后台从文字库中挑出描写它的句子。这个双向查找的过程,就是跨模态检索:用文本找图片叫“以文搜图”,用图片找文本叫“以图搜文”。

传统检索只能在同一模态内进行——关键字搜文档,图片名搜图片。可一旦跨越模态,问题就变成“像素怎么和字符比大小”?跨模态检索的思路是:先分别提取查询与候选的特征,再用一个统一的相似度函数打分。

就像节目中后台把所有选手的“默契密码”先统一成同一套度量,再按得分排序,检索就是“score 最高的候选胜出”。这也是电商拍照搜同款、视频素材库按一句话找镜头等应用的共同起点。

sim(I,T)=cos⁡(f(I), g(T))=f(I)⋅g(T)∥f(I)∥ ∥g(T)∥\displaystyle \mathrm{sim}(I,T)=\cos\bigl(f(I),\,g(T)\bigr)=\frac{f(I)\cdot g(T)}{\|f(I)\|\,\|g(T)\|}
公式把“图片 I 和文字 T 有多像”定义成两个向量的余弦夹角的接近程度,夹角越小,越默契。
  1. 图像编码器 f把图片的像素矩阵压缩成一个向量,例如 512 维的数值序列。
    v=f(I)\mathbf{v}=f(I)
  2. 文本编码器 g把句子“一只橘猫蹲在窗台上”也压缩成同一个维度的向量。
    u=g(T)\mathbf{u}=g(T)
  3. 余弦相似度计算两个向量的夹角余弦,结果越接近 1,表示图文语义越接近。
    u⋅v∥u∥∥v∥\frac{\mathbf{u}\cdot \mathbf{v}}{\|\mathbf{u}\|\|\mathbf{v}\|}

共享语义空间:把图文翻译进同一个默契大厅

两位选手来自“图片王国”和“文字王国”,母语完全不同。图片选手表达的是“橘色、猫、窗台”的视觉元素,文字选手表达的是抽象的词序和语义。要让它们互相理解,后台必须把所有表达翻译进一个“默契大厅”——在这个大厅里,大家说的是同一种“世界语”,每个概念都有固定的坐标位置。

在技术里,这个“默契大厅”就是共享语义空间。图片和文字原先存在不可直接比较的“语义鸿沟”,深度模型用两个编码器把它们分别映射成向量后,鸿沟就被填平了。图片和文字的距离越近,说明它们在语义上越接近。日常检索中常见的度量是余弦相似度:

“大厅”不是天上掉下来的,而是靠海量配对图文训练出来的。节目里选手之所以越来越有默契,是因为后台不断撮合、磨合;模型则是通过对比学习一点点把“该靠近的拉到一起、该分开的推开”学出来的。

cos⁡(u,v)=u⋅v∥u∥ ∥v∥\displaystyle \cos(\mathbf{u},\mathbf{v})=\frac{\mathbf{u}\cdot \mathbf{v}}{\|\mathbf{u}\|\,\|\mathbf{v}\|}
它只关心方向是否一致,不关心向量长度,特别适合比较两个语义特征是否“指向同一个概念”。
  1. 向量 u 和 v分别表示文本和图像在共享空间中的“坐标”。
    u=g(T),v=f(I)\mathbf{u}=g(T),\quad \mathbf{v}=f(I)
  2. 点积先计算两个向量在每一维上的乘积之和,用于衡量方向一致程度。
    u⋅v\mathbf{u}\cdot\mathbf{v}
  3. 模长归一化除以两个向量的长度,把结果拉到区间 \([-1,1]\),消除向量长度带来的干扰。
    ∥u∥ ∥v∥\|\mathbf{u}\|\,\|\mathbf{v}\|

对比学习机制:配对法则如何训练出好翻译官

《默契大挑战》有一个核心训练环节:每一轮节目组给出若干“图文组合”,正确的搭档要靠近,错误的组合要被拆开。比如“猫的照片”必须和“一只猫”的句子靠在一起,而不能和“一只狗”的句子靠在一起。这就是对比学习:拉近正样本对,推远负样本对。

在训练中,我们会采样一个 batch,里面包含若干图文对。每张图片与 batch 中每个文本都会算出一个相似度;我们希望对角线上的配对相似度最高。对每个文本,它和自己配对的图像是“正样本”,batch 中其他图像都是“负样本”。于是训练损失常写成 InfoNCE:

对比学习的巧妙之处在于,它不需要昂贵的人工标注,只要“网页里的图片 + 周围文字”这样天然成对的数据就够了。经过大量撮合,翻译机慢慢明白“橘色、毛茸茸、尖耳朵”这些视觉特征如何与“猫”这个词语对号入座。

LInfoNCE=−ln⁡exp⁡(sim(ui,vi)/τ)∑j=1Nexp⁡(sim(ui,vj)/τ)\displaystyle \mathcal{L}_{\text{InfoNCE}}=-\ln\frac{\exp\bigl(\mathrm{sim}(\mathbf{u}_i,\mathbf{v}_i)/\tau\bigr)}{\sum_{j=1}^{N}\exp\bigl(\mathrm{sim}(\mathbf{u}_i,\mathbf{v}_j)/\tau\bigr)}
它让“正确那一对”在分母所有配对中脱颖而出,相当于逼着模型把每个文本从 N 张候选图中“认出”自己的那张图。
  1. 分子中的配对相似度文本 \(i\) 与图片 \(i\) 的相似度越高,分子越大,损失越小。
    exp⁡(sim(ui,vi)/τ)\exp\bigl(\mathrm{sim}(\mathbf{u}_i,\mathbf{v}_i)/\tau\bigr)
  2. 分母中的全部候选求和范围覆盖 batch 中所有图片,相当于把“正确答案”和所有干扰项放在一起比较。
    ∑j=1Nexp⁡(sim(ui,vj)/τ)\sum_{j=1}^{N}\exp\bigl(\mathrm{sim}(\mathbf{u}_i,\mathbf{v}_j)/\tau\bigr)
  3. 负对数把“正确配对被选中的概率”取负对数,概率越高,损失越低。
    −ln⁡正确对得分全部候选得分-\ln \frac{\text{正确对得分}}{\text{全部候选得分}}

难负样本挖掘:节目组悄悄埋下的“高仿干扰项”

节目组为了不让选手松懈,总会在题库里安排“高仿题”:给一张“金毛犬”的图片,却配一句“拉布拉多正在草地上奔跑”。金毛和拉布拉多长得非常像,普通选手很容易被带偏。这类“看着极像、实则不匹配”的样本,在跨模态检索里叫难负样本。

如果负样本全是“猫 vs 汽车”这样差别巨大的例子,模型很快就能躺赢:只要抓住“汽车”和“猫”这种显眼区别就够了。可现实检索中,真正难倒系统的是那些相似的品类:比如同时搜“蓝色运动鞋”,候选里可能有七八双外观接近的鞋。难负样本挖掘就是在训练时主动挑选高相似度但不匹配的样本加入损失:

节目里的“高仿题”出现一次,选手就长一次教训。模型也是如此:难负样本让梯度更集中到模糊边界上,最终得到的不只是“认识猫”,而是“能分清金毛和拉布拉多”的精细判别力。

Lhard=−ln⁡exp⁡(sim(ui,vi)/τ)∑j∈H(i)∪{i}exp⁡(sim(ui,vj)/τ)\displaystyle \mathcal{L}_{\text{hard}}=-\ln\frac{\exp\left(\mathrm{sim}(\mathbf{u}_i,\mathbf{v}_i)/\tau\right)}{\sum_{j\in \mathcal{H}(i)\cup\{i\}}\exp\left(\mathrm{sim}(\mathbf{u}_i,\mathbf{v}_j)/\tau\right)}
这里的 \(\mathcal{H}(i)\) 是文本 \(i\) 的难负样本集合,用它们替换掉一部分过于简单的负样本,让模型被迫学到更细粒度的判别能力。
  1. 难负样本集合从 batch 中挑出与当前文本相似度最高、但并非正确配对的那几个样本。
    H(i)={j≠i ∣ sim(ui,vj) 较高}\mathcal{H}(i)=\{j\ne i\,|\,\mathrm{sim}(\mathbf{u}_i,\mathbf{v}_j)\ \text{较高}\}
  2. 分母保留难负样本求和时只算难负样本和真正样本,简单负样本不参与。
    ∑j∈H(i)∪{i}exp⁡(sim(ui,vj)/τ)\sum_{j\in \mathcal{H}(i)\cup\{i\}}\exp\bigl(\mathrm{sim}(\mathbf{u}_i,\mathbf{v}_j)/\tau\bigr)
  3. 目标不变仍让正确配对的分数在难负样本中排第一,但难度大幅提高。
    Lhard=−ln⁡(⋯ )\mathcal{L}_{\text{hard}}=-\ln(\cdots)

温度缩放优化:旋转裁判的严格度旋钮

《默契大挑战》的评委席上有一个旋钮,叫“严格度”。旋钮拧到很小,评委对轻微差异都零容忍,只要有一点点不像就不给配对;旋钮调大,评委又变得很宽松,差不多像就给过。训练模型时,这个旋钮就是温度系数 \(\tau\)。

温度系数作用于相似度分数,它决定了 Softmax 把相似度转换成概率时有多“尖锐”。当 \(\tau\) 很小时,概率分布会集中到最高分那个候选上,模型被要求“一锤定音”;当 \(\tau\) 很大时,各个候选的概率变得平滑,模型不用做太激进的决策。数学上,单看一个候选的得分概率:

CLIP 在预训练时使用很小的温度(约 0.07),相当于把配对要求调得很严。温度不是一个可以随便乱改的超参数,它直接影响梯度在难易样本上的分配:调太小,训练震荡;调太大,模型失去判别锐度。找到合适的“严格度”,节目才能既精彩又不翻车。

pi=exp⁡(zi/τ)∑j=1Kexp⁡(zj/τ)\displaystyle p_i=\frac{\exp(z_i/\tau)}{\sum_{j=1}^{K}\exp(z_j/\tau)}
温度 \(\tau\) 作为分母,把 logit 值缩放后再做指数归一化:\(\tau\) 越小,得分差距被放大,最大项越突出;\(\tau\) 越大,得分差距被压缩,分布越均匀。
  1. 缩放后的 logit把原始相似度除以温度,再取指数,放大了得分之间的差距。
    exp⁡(zi/τ)\exp(z_i/\tau)
  2. 归一化分母对 K 个候选全部做同样处理并求和,得到概率。
    ∑j=1Kexp⁡(zj/τ)\sum_{j=1}^{K}\exp(z_j/\tau)
  3. 取比值最终得到第 i 个候选被选中的概率,概率越高表示模型越有把握。
    pi=exp⁡(zi/τ)∑j=1Kexp⁡(zj/τ)p_i=\frac{\exp(z_i/\tau)}{\sum_{j=1}^{K}\exp(z_j/\tau)}

CLIP模型原理:看过四亿场综艺的王牌选手

如果《默契大挑战》连播四亿期,后台那位翻译官会变成什么样子?它一定见识过阳光、沙滩、城市夜景、宠物、美食、航天飞机……几乎所有人类用图像和文字描述过的场景。OpenAI 的 CLIP 就是这样一位“王牌翻译官”:它用 4 亿组从互联网上收集到的图文配对数据,训练两个编码器——图片塔和文本塔。

CLIP 的训练目标和对比学习完全一致:把成对图文向量拉近,把非配对图文推远。经过超大规模预训练后,图片塔和文本塔输出的向量在共享语义空间中排列得高度规整。于是,当用户给出一个全新的文本类别,比如“穿宇航服的泰迪熊”,CLIP 不需要再训练,直接把这个文本向量与所有候选图片向量算相似度,就能做 zero-shot 分类或检索:

CLIP 之所以能作为“王牌选手”出现,靠的正是“双塔结构 + 大规模对比学习 + zero-shot 迁移”三件套:双塔为图文提供统一编码,对比目标让空间对齐,大规模数据保证语义覆盖。它不依赖任何手工标注,真正做到了“见过世界,便能举一反三”。

max⁡θI,θT  E(x,y)∼D[cos⁡(fθI(x), gθT(y))]\displaystyle \max_{\theta_I,\theta_T}\ \ \mathbb{E}_{(x,y)\sim \mathcal{D}}\left[\cos\bigl(f_{\theta_I}(x),\,g_{\theta_T}(y)\bigr)\right]
这个式子表达训练目标:在所有真实图文对 \((x,y)\) 上,让图片编码器 \(f_{\theta_I}\) 和文本编码器 \(g_{\theta_T}\) 的输出向量平均余弦相似度尽量高。
  1. 模型参数\(\theta_I\) 和 \(\theta_T\) 分别是图片塔和文本塔的可学习参数。
    fθI,gθTf_{\theta_I},\quad g_{\theta_T}
  2. 数据期望在训练数据分布 \(\mathcal{D}\) 上对每个图文对求平均,代表“总体上的默契程度”。
    E(x,y)∼D\mathbb{E}_{(x,y)\sim \mathcal{D}}
  3. 最大化目标不断调整参数,让正确图文对的相似度期望越来越高,直到收敛。
    max⁡θI,θT E[cos⁡(⋅,⋅)]\max_{\theta_I,\theta_T}\ \mathbb{E}[\cos(\cdot,\cdot)]

ALIGN与工程落地:从演播厅走进真实世界的检索系统

《默契大挑战》之后又推出了“海选版”:节目组不再精心挑选选手,而是涌进巨量“野生素材”——随便一张社交平台上带文字的图片都可以成组。这种数据噪音很大,但量级惊人。谷歌的 ALIGN 模型走的正是这条路:它用约 18 亿组“噪声较大”的图文对训练,虽然配对质量参差不齐,但大规模数据反而让模型学到了更强的泛化能力。

从 CLIP 到 ALIGN,模型能力有了,工程落地还要解决“如何从千万条候选里快速找回结果”。实际检索系统通常先离线把全部图片编码成向量,建立向量索引;在线查询时,把文本编码成向量,再去索引库中做近似最近邻搜索。整个过程可以用一个打分排序函数概括:

到了真实系统里,还会有召回、粗排、精排等环节:先靠向量索引快速筛出成千上万个候选,再用更强的跨模态交互模型精排。从综艺舞台到实际产品,跨模态检索已经走进了电商、视频、设计素材等无数场景——这套“默契翻译官”终于开始服务普通用户。

R(q)=top-k⁡x∈C sim(f(q), g(x))\displaystyle \mathcal{R}(q)=\operatorname{top-k}_{x\in \mathcal{C}}\ \mathrm{sim}\bigl(f(q),\,g(x)\bigr)
给定查询 \(q\)(可能是文字也可能是图片),在候选集合 \(\mathcal{C}\) 中按相似度取前 k 个,这就是线上检索的核心逻辑。
  1. 查询编码把用户输入的文字或图片编码成查询向量。
    f(q)f(q)
  2. 候选排序把候选集合中的所有项编码后与查询算相似度,从高到低排序。
    sim(f(q), g(x))\mathrm{sim}\bigl(f(q),\,g(x)\bigr)
  3. 截断返回取排序后前 k 个结果返回,控制响应延迟和展示数量。
    top-k⁡\operatorname{top-k}

AI 应用场景

电商平台拍照搜同款

阶段:检索与推荐匹配

解决的问题:用户逛街时看到一件衣服,想在网上买同款,却难以用关键词描述。传统方案是先人工打标再文本搜索,效率低下且无法覆盖新商品。

具体案例:电商 App 的“拍照购”功能利用跨模态检索:用户上传街拍图,系统把商品图片和用户图片编码进共享语义空间,按相似度返回同款、相似款、可搭配单品。训练时用上亿商品图文对做对比学习,检索时结合难负样本挖掘,区分颜色、版型、材质的细微差异。

视频素材库以文搜片段

阶段:内容理解与召回

解决的问题:短视频创作者需要“雨天霓虹灯街道”的镜头,靠人工翻素材库要翻几个小时。跨模态检索能将一句描述直接映射到视频帧特征。

具体案例:素材平台先提取视频关键帧并用图文对比模型编码,用户输入自然语言,系统用文本向量在数十亿帧向量索引中做近似搜索,秒级返回对应镜头片段。在训练中,把“视频字幕-画面帧”当成弱配对图文对,就能自动生成训练数据。

内容审核与多模态证据关联

阶段:多模态分析与证据链组织

解决的问题:审核一张违规图片时,只有图没有上下文,很难判断它是否真的违规;通过图文互检能找到可疑图中大量相关的历史文字描述,形成证据链。

具体案例:在内容安全系统中,把违规图片作为查询去检索图文知识库中相似图片的标题、评论与传播文案。模型使用共享语义空间把视觉信息和文本记录对齐,帮助审核员快速判断一张图是“医疗科普”还是“违规广告”,大幅提升审核效率与可解释性。

Python 演示

python76 行
import torchimport torch.nn as nnimport torch.nn.functional as F torch.manual_seed(42)  class DualEncoder(nn.Module):    def __init__(self, img_dim=512, txt_dim=256, proj_dim=128):        super().__init__()        self.img_proj = nn.Linear(img_dim, proj_dim)        self.txt_proj = nn.Linear(txt_dim, proj_dim)     def encode_image(self, img_feat):        return F.normalize(self.img_proj(img_feat), dim=1)     def encode_text(self, txt_feat):        return F.normalize(self.txt_proj(txt_feat), dim=1)  def info_nce_loss(img_vec, txt_vec, temperature=0.07):    logits = img_vec @ txt_vec.T / temperature    batch = img_vec.size(0)    labels = torch.arange(batch)    loss_i = F.cross_entropy(logits, labels)    loss_t = F.cross_entropy(logits.T, labels)    return 0.5 * (loss_i + loss_t), logits  def hard_negative_loss(img_vec, txt_vec, temperature=0.07, keep_k=3):    logits = img_vec @ txt_vec.T / temperature    batch = img_vec.size(0)    labels = torch.arange(batch)    mask = torch.full_like(logits, float('-inf'))    for i in range(batch):        row = logits[i].clone()        row[i] = float('-inf')        top_idxs = torch.topk(row, keep_k).indices        mask[i, top_idxs] = logits[i, top_idxs]        mask[i, i] = logits[i, i]    return F.cross_entropy(mask, labels)  def recall_at_k(img_vec, txt_vec, k=5):    logits = img_vec @ txt_vec.T    batch = img_vec.size(0)    rank = torch.argsort(logits, dim=1, descending=True)    hit = 0    for i in range(batch):        if i in rank[i][:k].tolist():            hit += 1    return hit / batch  def main():    model = DualEncoder()    optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)    for step in range(50):        img_feat = torch.randn(32, 512)        txt_feat = torch.randn(32, 256)        img_vec = model.encode_image(img_feat)        txt_vec = model.encode_text(txt_feat)        if step % 2 == 0:            loss, _ = info_nce_loss(img_vec, txt_vec)        else:            loss = hard_negative_loss(img_vec, txt_vec)        optimizer.zero_grad()        loss.backward()        optimizer.step()        if step % 10 == 0:            r5 = recall_at_k(img_vec.detach(), txt_vec.detach(), 5)            print(f'step {step:02d} loss={loss.item():.3f} Recall@5={r5:.2f}')  if __name__ == '__main__':    main()
目的:用随机特征模拟图片和文本,训练一个最简单的“双塔编码器”,并用 InfoNCE 和难负样本挖掘两种损失交替训练,最后用 Recall@5 观察检索效果。
  1. self.img_proj = nn.Linear(img_dim, proj_dim)图像投影层,把原始图片特征压到共享空间中。
  2. return F.normalize(self.img_proj(img_feat), dim=1)归一化到单位向量,保证相似度只由方向决定。
  3. logits = img_vec @ txt_vec.T / temperature计算图文相似度矩阵,对角线代表正确配对。
  4. loss_i = F.cross_entropy(logits, labels)让每个文本在 batch 中认出自己对应的图片。
  5. row[i] = float('-inf')先把正确配对在临时行里隐藏,才能在剩余候选中找“难负样本”。
  6. mask[i, top_idxs] = logits[i, top_idxs]只保留 top-k 个难负样本作为分母,其余负样本不参与。
  7. loss.backward()反向传播更新双塔参数,让正样本拉近、负样本推远。
  8. rank = torch.argsort(logits, dim=1, descending=True)按相似度排序,模拟“检索返回 top-k”的过程。

常见误区

误区很多人以为跨模态检索的本质是把图片分类到几个预定义类别里,比如“动物”“风景”“人物”,然后做标签匹配。

正解分类是“闭集”问题,类别数固定;检索是“开集”问题,候选库可以任意大、随时动态增加。检索目标不是贴标签,而是计算查询与所有候选的相似度并排序返回 top-k。共享语义空间让模型可以回答“这个文本更像哪张图”,即使那张图从未见过。

为何常见:早期图像理解任务以分类为主,容易让人把“识别”和“检索”画等号,但二者在输入输出形态和训练目标上都有本质区别。

误区以为把图片特征和文本特征拼成一个长向量,就是“共享语义空间”。

正解拼接仍是在各自空间中堆叠信息,数字之间没有可比性。共享语义空间的核心是让两个不同编码器输出的向量在同一个坐标系中遵循统一的距离关系——通常用对比学习让配对图文靠近、非配对图文远离。真正决定空间质量的是对齐方式,而不是是否拼接。

为何常见:人们习惯用“把特征放在一起”来理解融合,忽略了跨模态检索更依赖“相对距离”而非“特征长度”。

误区训练对比学习时,只要把 batch 中所有不配对样本都当负样本,模型就能学得很好。

正解简单负样本(比如“猫”对“汽车”)很快被模型区分,梯度趋近于零,训练效率很低。难负样本挖掘会主动选择相似度高但不匹配的样本,让模型把注意力集中在细微差别上,从而提升检索精度。更有经验的算法工程师会构造“相似品类”的困难对来逼迫模型学习。

为何常见:随机负样本实现最简单,效果也能跑通,因此容易被误认为“已经够好”,只有换更难的数据时才发现判别力不足。

误区把温度 \(\tau\) 当作一个随意设置的数字,认为它只影响 loss 的数值大小,不影响训练效果。

正解温度直接控制 Softmax 分布的锐化程度,决定模型把注意力放在简单负样本还是难负样本上。\(\tau\) 过小会让梯度集中到少数最难样本,训练振动;\(\tau\) 过大则让所有负样本的权重趋同,丧失判别锐度。CLIP 选择约 0.07 的小温度是经过仔细调校的。

为何常见:从形式上 \(\tau\) 只是分母里的一个常数,容易让人低估它对梯度分布的巨大影响。

误区看到 CLIP 能做 zero-shot 分类和图文匹配,就认为检索问题已彻底终结。

正解CLIP 在大规模粗粒度语义上表现优秀,但在细粒度检索、复杂指代、属性级描述(如“左边白色右边红色的鞋”)上仍容易出错,中文场景也需要额外的双语数据适配。真实系统通常还要用难负样本挖掘做微调,并结合重排模型优化精度。

为何常见:CLIP 的演示效果惊艳,容易让人忽略它仍是大规模“弱对齐”模型,离生产级细粒度检索还有差距。

面试题

Q1. 跨模态检索最核心的目标是什么?

单选题 · easy

  • A.在共享语义空间中按相似度排序← 正确答案
  • B.把一张图片生成一段文字描述
  • C.把图片分类到固定的语义类别
  • D.把中文句子翻译成英文句子

答案:A。跨模态检索的核心是让图文在共享语义空间中可比,并对查询返回相似度排序结果。生成描述属于 captioning,分类属于闭集判别,翻译属于自然语言处理,都不直接回答“检索”的问题。

Q2. 共享语义空间主要解决了什么问题?

单选题 · easy

  • A.图片存储空间不足导致的成本问题
  • B.图文两种模态无法直接进行数值比较← 正确答案
  • C.模型参数量太少导致表达力变弱
  • D.训练数据集规模不够导致精度偏低

答案:B。像素和文本符号形态完全不同,存在“语义鸿沟”,难以直接比较。共享语义空间通过编码器把两者映射到同一向量空间,使距离计算成为可能。存储、参数量、数据规模都不是共享语义空间的核心命题。

Q3. 在对比学习中,“正样本对”指的是什么?

单选题 · mid

  • A.同一批次里随机抽取的两张图片
  • B.语义正确匹配的图像和文本组合← 正确答案
  • C.训练数据中难度最高的一对样本
  • D.已经被人为标注好的所有图片

答案:B。正样本对指语义上真实匹配的图文对,比如“一只橘猫”的文本和对应图片;对比学习要把它拉近。随机图片无关,难样本是负样本机制的一部分,人工标注只提供监督信号,不定义正样本对本身。

Q4. 下列哪些属于难负样本挖掘的常见思路?

多选题 · mid

  • A.挑选高相似度但不匹配的样本← 正确答案
  • B.用随机负样本替代所有困难样本
  • C.加入相似类别的图文对作为负例← 正确答案
  • D.把所有文本都当成配对的正确样本

答案:AC。难负样本挖掘的核心是“多选像但错”的样本,因此批内选高相似度错配、加入相似类别的干扰图文都是有效思路。随机负样本恰恰是难负样本想替代的对象,而把所有文本都当正样本会破坏监督信号。

Q5. 温度系数 τ 变小时,Softmax 分布会怎样变化?

单选题 · mid

  • A.分布变得更平滑、更接近均匀
  • B.分布变得更尖锐、集中在最大项← 正确答案
  • C.分布完全不再发生变化
  • D.所有类别的概率全部同时归零

答案:B。τ 越小,相似度被缩放后差距越大,指数运算会放大最高分,使概率分布尖锐化,模型决策更“激进”。τ 变大会让分布趋于平滑,但不会让概率归零或保持不变。

Q6. InfoNCE 损失中分母的作用是什么?

单选题 · hard

  • A.为反向传播计算梯度提供方向
  • B.归一化并让正样本和负样本竞争← 正确答案
  • C.把嵌入向量的模长强制设为固定常数
  • D.扩大训练批次提高吞吐量和速度

答案:B。分母把正样本的指数相似度归一化到所有候选样本之上,相当于迫使正样本在负样本中“竞争胜出”。梯度计算是优化机制的结果而非分母功能;模长归一化由编码器完成,批次大小与损失设计无直接关系。

Q7. CLIP 能用对比预训练支持 zero-shot 图文匹配的原因包括?

多选题 · hard

  • A.双塔结构把图文映射到同一向量空间← 正确答案
  • B.对比目标拉近配对图文、推开无关图文← 正确答案
  • C.利用分类头直接学习固定类别标签
  • D.大规模网络图文数据覆盖丰富语义← 正确答案

答案:ABD。CLIP 成功的关键是双塔共享空间、对比学习目标和 4 亿级数据覆盖。它刻意不依赖固定分类头,而是把任意文本都看作动态“标签”,所以 C 不正确。

Q8. 跨模态检索训练中,温度参数 τ 过大会导致什么后果?

单选题 · hard

  • A.平衡两个编码器的学习率
  • B.增加输入图像的分辨率
  • C.降低模型对难负样本的关注度← 正确答案
  • D.自动提高检索候选数量

答案:C。较大的 τ 会把相似度差距压缩,Softmax 概率分布更平滑,模型对所有负样本“差不多对待”,注意力被摊薄,难负样本带来的梯度优势随之减弱。学习率、分辨率与候选数量都不是 τ 能决定的。

Q9. ALIGN 模型相对 CLIP 的核心改进方向是什么?

单选题 · mid

  • A.用更大模型和更多噪声数据训练← 正确答案
  • B.用更小但更精细标注的数据训练
  • C.用 RNN 替换全部 Transformer 结构
  • D.删掉文本编码器只保留图片塔

答案:A。ALIGN 的核心思路是“规模换标注质量”,使用约 18 亿组弱对齐、带噪声的图文对训练,证明大规模噪声数据足以学到强泛化表示。它不是缩小数据规模,也没有弃用文本塔或更换基础架构。

Q10. 下列哪些属于跨模态检索的落地场景?

多选题 · easy

  • A.电商平台用图片搜索同款商品← 正确答案
  • B.视频素材库一句话搜高清片段← 正确答案
  • C.计算图片平均亮度并做统计表
  • D.用关键词搜索海量图片资源库← 正确答案

答案:ABD。以图搜同款、以文搜视频帧、关键词搜图片都是跨模态检索体现;计算平均亮度只涉及图像数值统计,不涉及文本模态,也不构成“跨模态”。