老张在公园相亲角当了三十年红娘。他的绝活是“看照片配简介”——左手一叠相亲者的近照,右手一叠自我介绍。别人看着头疼,他却能一眼看出:“这位气质沉稳、简介写'爱爬山'的先生,和照片里背着登山包的女士,准是一对。”可这两年相亲角越来越热闹,从几十人变成几万人,老张看不过来了。他想:要是能把所有人按“气质”摆进一张巨大的坐标纸,照片和简介气质相符的人自然挨在一起,该多省事。 这个朴素的想法,正是 3D 与文本跨模态对比学习要做的事:让模型像老张一样,学会把“3D 形状”(照片)和“自然语言描述”(简介)对齐到同一个嵌入空间。本文从这个设计理念讲起,依次拆解 3D 编码器、文本编码器、对比损失,最后落到 3D 检索与文本驱动 3D 生成,用“红娘学配对”这条故事线,帮你轻松看懂这一前沿方向。

岗位关联

跨模态对齐是通往多模态大模型的必修课。理解 3D-文本对比学习,你就同时抓住了 CLIP 式设计的精髓、检索系统的构建方法和 AIGC 的前置条件,这是多模态检索、3D 资产生成等岗位的核心能力。

目录
  1. 可视化演示
  2. 设计理念:借鉴CLIP
  3. 三维编码器:PointNet式置换不变
  4. 文本编码器:Transformer与语义抽取
  5. 对比损失:InfoNCE与温度系数
  6. 三维检索:文本查形状
  7. 文本生成3D:条件生成与扩散
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示3D点云与文本描述通过对比学习对齐到共享嵌入空间,借鉴CLIP思路实现3D编码器与文本编码器的跨模态匹配,应用于3D检索与文本驱动3D生成。

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

3D-文本跨模态对比学习 双编码器:3D编码器提取点云特征,文本编码器提取语义嵌入 对比损失:正样本对拉近,负样本对推远,学习跨模态对齐 CLIP思路:借鉴CLIP的对比学习范式,扩展到3D-文本模态 L = -log(exp(sim(z3d,zt+)/τ) / Σexp(sim(z3d,zt-)/τ)) 对比学习实现3D与文本的跨模态语义对齐

设计理念:借鉴CLIP

老张后来真的做出了那张“心动坐标纸”。他请来两个助理:一个只负责看照片,一个只负责读简介,各自把对象“画”到坐标纸上。靠谱的助理画出的点有个规律——将来能成一对的人,照片点和简介点总落在相近区域。这个“双助理加同一张坐标纸”的架构,就是跨模态对比学习的灵魂。

CLIP 是这套架构在图文领域的代表作:图像编码器与文本编码器把图片和句子投进同一个嵌入空间,再用对比损失让配对样本靠拢。3D-文本对比学习是同一配方的“3D 版”:把图像侧换成点云或网格,让模型理解“一把带扶手的椅子”这类文字描述对应什么样的 3D 结构。这里的核心假设是:同一概念的不同模态表达,在嵌入空间中应当彼此靠近。

形式化地说,点云 \(\mathbf{x}\) 经过 3D 编码器 \(f_{\theta}\) 得到向量 \(\mathbf{z}_{3D}\),句子 \(\mathbf{t}\) 经过文本编码器 \(g_{\phi}\) 得到 \(\mathbf{z}_{T}\),两者身处同一个向量空间:

老张的坐标纸越画越准,是因为两个助理被反复纠正:配对成功的点要画近,不配对的要画远。模型训练做的正是这个“纠正”过程。那照片助理是怎么学会看“贴纸堆”的?这就是下一节的内容。

z3D=fθ(x),zT=gϕ(t)\displaystyle \mathbf{z}_{3D}=f_{\theta}(\mathbf{x}),\qquad \mathbf{z}_{T}=g_{\phi}(\mathbf{t})
两个编码器把不同模态的输入压缩成同维向量,之后用相似度衡量它们“是不是一对”。
  1. 3D编码器把无序点云整体压成一个固定维度的向量,相当于照片助理对气质做的“第一印象记录”。
    z3D=fθ(x)\mathbf{z}_{3D}=f_{\theta}(\mathbf{x})
  2. 文本编码器把句子编码成语义向量,相当于简介助理提炼出的关键词。
    zT=gϕ(t)\mathbf{z}_{T}=g_{\phi}(\mathbf{t})
  3. 共同空间两个向量维度相同,才能接着用余弦相似度计算“心动指数”。
    z3D,zT∈Rd\mathbf{z}_{3D},\mathbf{z}_{T}\in\mathbb{R}^{d}

三维编码器:PointNet式置换不变

老张给照片助理递过去一叠“特殊照片”——上面不是整齐的方格照片,而是一堆散落的贴纸点,没有顺序、没有边框。助理发愁了:普通照片可以“从左往右看”,贴纸堆该从哪张看起?如果换个顺序结论就变,这活就没法干。

点云正是这样一堆三维空间中的点:无序、稀疏、点数不固定。普通 CNN 要求规则网格(像像素照片),直接“投喂”点云会失灵。因此 3D 编码器必须有置换不变性:无论怎么打乱点的顺序,输出都一样。PointNet 用共享 MLP 加最大池化实现这一点,DGCNN 则引入图卷积来捕捉局部几何结构。

PointNet 的思路很直白:每个点独立经过同一个 MLP 升维,再对所有点逐维取最大值,得到全局特征。这就像助理把每张贴纸都看一遍,只记下“最突出的气质”:

照片助理找到了窍门:不管贴纸多乱,他只记录“哪张贴纸最像什么气质”,于是先看哪张都不影响结论。这就是置换不变的朴素含义。照片这边搞定了,简介那边的助理又有新麻烦——文本是有顺序的。

F=MAX({hθ(pi)}i=1n)\displaystyle \mathbf{F}=\mathrm{MAX}\left(\left\{ h_{\theta}(\mathbf{p}_i) \right\}_{i=1}^{n}\right)
最大池化天然忽略点的顺序,这是点云编码器“换个顺序不改判断”的根本原因。
  1. 逐点编码n 个点各自经过共享的 MLP \(h_{\theta}\) 升维成高维描述,相当于给每张贴纸单独打分。
    hθ(pi)h_{\theta}(\mathbf{p}_i)
  2. 最大池化在所有点的每个特征维度上取最大值,把整片点云聚合成一个全局向量。
    MAX({hθ(pi)}i=1n)\mathrm{MAX}\left(\left\{ h_{\theta}(\mathbf{p}_i) \right\}_{i=1}^{n}\right)
  3. 输出形状特征聚合结果再经投影头映射到对齐空间,与文本向量同维度。
    z3D=Proj(F)\mathbf{z}_{3D}=\mathrm{Proj}(\mathbf{F})

文本编码器:Transformer与语义抽取

简介助理拿到一份简介:“柴犬坐在椅子上”。他刚想按老办法“抓关键词”,突然发现这句话把语序换一下——“椅子坐在柴犬上”——就是另一个世界。简介不能像贴纸一样随便打乱,必须顺着读,还要结合上下文理解。

文本编码器通常用 Transformer:词元按顺序进入自注意力层,每个词的表示根据上下文不断更新。在 3D-文本对比学习中,文本侧常用预训练语言模型初始化,因为通用语义已经学得很好,任务里只需微调,让它“贴着”3D 侧的分布走。这就像红娘直接用一位有经验的“语文老师”做简介助理,不必从识字教起。

设句子词元化后为 \(\mathbf{t}_1,\dots,\mathbf{t}_L\),Transformer 输出每个词元的隐状态 \(\mathbf{h}_j\),文本向量取所有隐状态的均值:

简介助理从此学会“联系上下文读简介”:看到“带扶手的椅子”,他脑中浮现的是一把完整椅子,而不是“扶手”和“椅子”两个孤立的词。两个助理都就位了,接下来是红娘的奖惩规则——对比损失。

zT=1L∑j=1Lhj\displaystyle \mathbf{z}_{T}=\frac{1}{L}\sum_{j=1}^{L}\mathbf{h}_{j}
均值池化把整句语义压成单个向量;等价做法是取 [CLS] 标记位置的输出。
  1. 词元化先把句子切成词元序列,每个词元查表得到初始向量。
    t=(t1,…,tL)\mathbf{t}=(\mathbf{t}_{1},\dots,\mathbf{t}_{L})
  2. 自注意力编码Transformer 逐层融合上下文,让“扶手”出现在“椅子”旁边时带上正确的语义。
    h1,…,hL=Transformer(t)\mathbf{h}_{1},\dots,\mathbf{h}_{L}=\mathrm{Transformer}(\mathbf{t})
  3. 均值池化对所有词元隐状态取平均,得到整句的语义向量。
    zT=1L∑j=1Lhj\mathbf{z}_{T}=\frac{1}{L}\sum_{j=1}^{L}\mathbf{h}_{j}

对比损失:InfoNCE与温度系数

老张训练两个助理的方式,是一场“看图认人”考试:每次递过去一张简介和一堆长得差不多的照片,必须挑出真正对应的那张。挑对加分,挑错扣分。而那些“看起来很像其实不是”的照片扣分最狠——这样才能逼出真本事。

对比学习的标准损失是 InfoNCE。一个 batch 有 B 对(文本 \(i\),3D 形状 \(i\)),把 B×B 相似度矩阵对角线上视为正样本对,其余 B-1 对视为负样本,做 softmax 分类。这个损失让正样本对的相似度尽量高、负样本对的相似度尽量低:

考试一轮轮进行,助理的眼力越来越准。注意实际训练还要做对称损失——把“形状→文本”方向也考一遍,因为真实业务里两个方向的检索都会用到。红娘出师后的第一份工作,是档案室的检索员。

L=−1B∑i=1Blog⁡exp⁡(sii/τ)∑j=1Bexp⁡(sij/τ)\displaystyle \mathcal{L}=-\frac{1}{B}\sum_{i=1}^{B}\log\frac{\exp\left(s_{ii}/\tau\right)}{\sum_{j=1}^{B}\exp\left(s_{ij}/\tau\right)}
温度系数 \(\tau\) 控制“苛刻程度”:\(\tau\) 越小,模型越把注意力集中在最像的负样本上。
  1. 相似度\(s_{ij}\) 是文本 \(i\) 与形状 \(j\) 的余弦相似度,对角线 \(s_{ii}\) 是正样本对。
    sij=cos⁡(zT,i,z3D,j)s_{ij}=\cos(\mathbf{z}_{T,i},\mathbf{z}_{3D,j})
  2. 温度缩放除以 \(\tau\) 再取指数,让相似度之间的差异被放大或缩小。
    exp⁡(sij/τ)\exp\left(s_{ij}/\tau\right)
  3. softmax归一化对第 \(i\) 行所有形状做归一化,得到“文本 \(i\) 匹配形状 \(j\)”的概率。
    exp⁡(sii/τ)∑j=1Bexp⁡(sij/τ)\frac{\exp\left(s_{ii}/\tau\right)}{\sum_{j=1}^{B}\exp\left(s_{ij}/\tau\right)}
  4. 负对数取平均最大化正样本概率,等价于最小化上式取负对数后的平均。
    −1B∑i=1Blog⁡pi-\frac{1}{B}\sum_{i=1}^{B}\log p_{i}

三维检索:文本查形状

老张把几万人的照片整理成册。现在有人递来一张简介:“戴帽子的柴犬,三岁”,要求从照片册里找出对应的人。老张的新工作,就是“按简介找照片”。

文本驱动的 3D 检索不需要再训练:所有形状离线过一遍 3D 编码器建成向量库,查询时把文本编码成向量,与库中每个形状算余弦相似度,按分数排序取 Top-K。由于嵌入空间是对齐的,检索天然跨模态。更妙的是,对训练时从未见过的类别,只要文本语义能描述出来,也能正确召回——这就是零样本检索。

相似度打分就是对齐向量的余弦相似度:

常用的评测指标有 R@K(前 K 个结果中命中正确形状的比例)、MedR(正确结果的中位排名)和 mAP(平均精度均值),它们直接衡量红娘的“眼力”。

老张的检索生意越做越大,因为坐标系是“活”的:新类别只要描述得出来,就能在照片册里找到位置。可客户还不满足——他们问:“能不能我只说一句话,您直接把照片画出来?”这就引出了下一节:文本生成 3D。

score(t,s)=zT⋅z3D∥zT∥  ∥z3D∥\displaystyle \mathrm{score}(t,s)=\frac{\mathbf{z}_{T}\cdot \mathbf{z}_{3D}}{\|\mathbf{z}_{T}\|\;\|\mathbf{z}_{3D}\|}
余弦相似度只看方向、不看长度,非常适合比较两个归一化后的语义向量。
  1. 向量内积分子是文本向量与形状向量的点积,方向一致时取值大。
    zT⋅z3D\mathbf{z}_{T}\cdot \mathbf{z}_{3D}
  2. 模长归一化除以两个模长,把相似度压到 [-1,1],不受向量长度干扰。
    ∥zT∥  ∥z3D∥\|\mathbf{z}_{T}\|\;\|\mathbf{z}_{3D}\|
  3. 排序取Top-K对库中所有形状算分后降序排列,返回前 K 个作为检索结果。
    topKs∈S  score(t,s)\mathrm{topK}_{s\in\mathcal{S}}\;\mathrm{score}(t,s)

文本生成3D:条件生成与扩散

老红娘的终极考验来了:客户不找现成照片,而是说“我想要一个温柔、爱爬山、戴圆框眼镜的人”,要求直接画出一张画像。从“按简介找照片”到“按简介画肖像”,老张的坐标系依然是核心——画像必须落在简介对应的那片区域。

文本驱动 3D 生成正是以对比学习学到的对齐空间为桥梁:生成模型(常见的是扩散模型)在形状表示空间里从噪声出发逐步去噪,每一步都以文本条件向量 \(\mathbf{z}_{T}\) 为引导,最终产出与语义匹配的 3D 点云或网格。训练时使用条件去噪损失,让模型学会“这句描述对应什么形状”:

实际落地中,游戏与影视制作可以用“一句话草图”快速出白模;检索增强的思路(先用检索召回相似形状再约束生成)能显著提高生成结果与真实类别的吻合度。

老张终于把“看照片”“读简介”“按简介找人”“听简介画人”四门手艺串成了一条产业链。而这一切都源于那张“心动坐标纸”——对比学习,就是坐标纸本身。

Lgen=Et,ϵ[∥ϵ−ϵθ(z3D(t),t,zT)∥2]\displaystyle \mathcal{L}_{\mathrm{gen}}=\mathbb{E}_{t,\epsilon}\left[\left\| \epsilon-\epsilon_{\theta}\left(\mathbf{z}_{3D}^{(t)},t,\mathbf{z}_{T}\right)\right\|^{2}\right]
生成模型学习的不是“背形状”,而是“在文本引导下恢复被噪声破坏的形状”。
  1. 前向加噪训练时给真实形状特征逐步加高斯噪声,得到时刻 \(t\) 的含噪版本。
    z3D(t)\mathbf{z}_{3D}^{(t)}
  2. 条件去噪网络网络输入含噪形状、时间步 \(t\) 和文本向量,预测所加噪声。
    ϵθ(z3D(t),t,zT)\epsilon_{\theta}\left(\mathbf{z}_{3D}^{(t)},t,\mathbf{z}_{T}\right)
  3. 均方误差让预测噪声逼近真实噪声,模型被迫理解文本与三维结构的关系。
    ∥ϵ−ϵθ(⋅)∥2\left\| \epsilon-\epsilon_{\theta}(\cdot)\right\|^{2}

AI 应用场景

场景一:3D 资产库的文本检索

阶段:推理/检索阶段

解决的问题:3D 资产库动辄数万件,传统靠人工打标签再关键词搜索,标签不全、描述不精确就找不到。用对比检索可直接理解“破旧的中世纪木门”这类自然语言,召回语义相近的模型,还能零样本覆盖新类别。

具体案例:某游戏公司把文本-3D 检索接入资产管理系统,美术同学输入“带扶手的办公椅”,系统秒级返回候选模型,替代了逐个文件夹翻找的流程,单个资产的查找时间从小时级降到秒级。

场景二:文本驱动的 3D 资产生成

阶段:生成/内容创作阶段

解决的问题:传统 3D 建模耗时数小时到数天,新手门槛极高。文本生成 3D 把创作压缩成一句话,由对比模型负责语义对齐,扩散模型负责生成草模,艺术家再精修。

具体案例:影视前期概念设计将分镜脚本里的旁白直接转成粗略 3D 白模,导演在开拍前就能预览镜头空间关系,显著减少团队间的沟通成本。

场景三:跨模态预训练基础模型

阶段:训练/预训练阶段

解决的问题:3D 理解任务(分类、部件分割)标注成本极高。对比预训练利用海量“3D 模型-标题”弱配对数据学习通用表示,下游任务只需少量标注即可微调。

具体案例:具身智能领域用“物体点云-语言指令”做对比预训练后,机器人只需少量标注就能学会“把红色杯子放到托盘”这类指令跟随,泛化能力明显优于从零训练。

Python 演示

python90 行
import torchimport torch.nn as nnimport torch.nn.functional as F  class PointNetLike(nn.Module):    """简化3D编码器: 逐点共享MLP + 最大池化, 实现置换不变"""    def __init__(self, in_dim, hidden_dim, out_dim):        super().__init__()        self.mlp = nn.Sequential(            nn.Linear(in_dim, hidden_dim),            nn.ReLU(),            nn.Linear(hidden_dim, hidden_dim),            nn.ReLU(),        )        self.head = nn.Linear(hidden_dim, out_dim)     def forward(self, points):        # points: (B, N, 3)  逐点升维        h = self.mlp(points)            # (B, N, hidden)        pooled = h.max(dim=1).values    # (B, hidden) 最大池化        return F.normalize(self.head(pooled), dim=-1)  class TextEncoder(nn.Module):    """简化文本编码器: 把词袋向量映射到共享空间"""    def __init__(self, vocab_dim, hidden_dim, out_dim):        super().__init__()        self.net = nn.Sequential(            nn.Linear(vocab_dim, hidden_dim),            nn.ReLU(),            nn.Linear(hidden_dim, out_dim),        )     def forward(self, bow):        return F.normalize(self.net(bow), dim=-1)  def contrastive_loss(z_text, z_shape, temperature=0.07):    """对称InfoNCE: 文本->形状 与 形状->文本 两个方向交叉熵取平均"""    logits = z_text @ z_shape.T / temperature    labels = torch.arange(z_text.size(0), device=z_text.device)    loss_t2s = F.cross_entropy(logits, labels)    loss_s2t = F.cross_entropy(logits.T, labels)    return (loss_t2s + loss_s2t) / 2  def make_batch(num_cat, batch_size, num_points, vocab_dim, seed=0):    """构造玩具数据: 每类一个模板形状和一个模板文本, 类内加噪成样本"""    torch.manual_seed(seed)    cat = torch.randint(0, num_cat, (batch_size,))    base_shape = torch.randn(num_cat, 3)    base_text = torch.randn(num_cat, vocab_dim)    shapes = base_shape[cat].unsqueeze(1).expand(batch_size, num_points, 3)    shapes = shapes + torch.randn_like(shapes) * 0.05    texts = base_text[cat] + torch.randn(batch_size, vocab_dim) * 0.05    return shapes, texts, cat  def main():    torch.manual_seed(0)    shape_enc = PointNetLike(3, 32, 16)    text_enc = TextEncoder(32, 32, 16)    params = list(shape_enc.parameters()) + list(text_enc.parameters())    opt = torch.optim.Adam(params, lr=1e-3)     for epoch in range(50):        shapes, texts, _ = make_batch(8, 16, 32, 32)        z_shape = shape_enc(shapes)        z_text = text_enc(texts)        loss = contrastive_loss(z_text, z_shape)        opt.zero_grad()        loss.backward()        opt.step()        if epoch % 10 == 0:            print(f"epoch {epoch:02d} loss {loss.item():.4f}")     # 检索评测: 每个文本查询取相似度最高的形状, 看是否同类    shapes, texts, cat = make_batch(8, 16, 32, 32, seed=1)    with torch.no_grad():        z_shape = shape_enc(shapes)        z_text = text_enc(texts)        sim = z_text @ z_shape.T        top1 = sim.argmax(dim=1)    acc = (top1 == cat).float().mean().item()    print(f"文本->形状 top-1 检索准确率: {acc:.2f}")  if __name__ == "__main__":    main()
目的:用 PyTorch 实现一个迷你版 3D-文本对比学习——PointNet 式 3D 编码器加文本编码器加对称 InfoNCE 损失,训练后演示文本到 3D 的 top-1 检索。
  1. pooled = h.max(dim=1).values最大池化聚合全部点,天然置换不变,是点云编码器的灵魂。
  2. return F.normalize(self.head(pooled), dim=-1)归一化到单位超球面,让相似度只由方向决定。
  3. logits = z_text @ z_shape.T / temperature构造 B×B 跨模态相似度打分矩阵。
  4. labels = torch.arange(z_text.size(0), device=z_text.device)对角线即正样本对,batch 内其余样本自动成为负样本。
  5. loss_s2t = F.cross_entropy(logits.T, labels)对称损失的形状→文本方向,与文本→形状方向取平均。
  6. sim = z_text @ z_shape.T; top1 = sim.argmax(dim=1)检索阶段:每个文本查询取最相似的形状。

常见误区

误区给模型做“3D+文本”对齐,第一步肯定要请人给每个 3D 模型手动写详细描述,标注成本高到没法落地。

正解对比学习恰恰是为“弱配对”设计的。训练可以用现成的类别标签构造正样本对(同一标签的文本和形状视为一对),也可以先渲染 3D 模型的多视图图片,再用 CLIP 提取文本特征当“软标签”。就像红娘培训时不需要每张贴纸都写评语,只要知道“这堆照片属于谁”就能练出眼力。

为何常见:习惯了监督学习“人工标注等于训练信号”的思维定式,没意识到对比学习的正样本对可以由结构信息自动生成。

误区温度系数不就是让损失大一点小一点吗?设 0.5 还是 0.07 影响不大,反正是“炼丹玄学”。

正解\(\tau\) 决定了对困难负样本的惩罚力度,直接关系训练稳定性与特征质量。\(\tau\) 过大,所有样本的 softmax 概率都接近均匀,梯度微弱,学不出区分度;\(\tau\) 过小,注意力全部集中到最难的负样本,训练震荡甚至崩溃。这就像红娘打分标准太宽松则人人都是对象,太苛刻则看谁都不顺眼,需要合适的“挑剔度”。

为何常见:超参看似只是标量,实际控制的是损失景观的锐利度,这是对比学习与普通分类交叉熵的重要区别。

误区InfoNCE 里已经有文本指向形状的分类项,另一个方向是重复计算,纯属浪费算力。

正解只算单向会让嵌入空间退化——文本和形状可以“单方面匹配”,却无法保证形状到文本方向也准确,而真实检索两个方向都会用到。对称损失把两个方向的交叉熵取平均,同时约束矩阵的行和列,空间更稳定。就像红娘既要会“按简介找照片”,也要会“按照片找简介”,两个方向都练才算合格。

为何常见:从公式看 InfoNCE 只写了一行,容易忽略矩阵是对称构造的,误以为一个方向的正确性会自动迁移到反向。

误区3D 点云和图像差不多,都是网格状数据,把点云 reshape 一下丢给 ResNet 就行了。

正解点云没有规则网格:点数可变、空间稀疏、点序可以任意打乱。CNN 的卷积核依赖“相邻像素有固定语义”的假设,直接套在原始点云上,顺序一换特征就变。正确做法是用 PointNet 式置换不变网络,或先体素化、渲染成多视图再交给 CNN(但会引入量化损失)。就像照片助理必须接受“贴纸没有顺序”这个规矩,才能上岗。

为何常见:进入 3D 方向的人多是图像背景,习惯把点云类比为稀疏图像,忽略了“无序性”这一本质差异。

面试题

Q1. 3D-文本对比学习的核心目标是什么?

单选题 · easy

  • A.在共享嵌入空间中让文本与3D对齐← 正确答案
  • B.把3D点云转换成清晰渲染图片
  • C.让文本模型直接生成点云坐标
  • D.让3D模型自动生成一句描述

答案:A。对比学习的核心是把文本与 3D 都映射进共享嵌入空间,通过拉近正样本对、推远负样本对实现对齐;B、C、D 分别描述的是渲染、生成、描述任务。用红娘的话说,目标是让“简介”和“照片”在坐标纸上聚到一起。

Q2. 点云数据的一个关键特性是什么?

单选题 · easy

  • A.点云无序且无固定排列,须置换不变← 正确答案
  • B.顺序固定且与图像像素完全一致
  • C.必须用体素网格才能存储表示
  • D.仅包含颜色而不包含坐标信息

答案:A。点云是空间中无序点集,打乱点序语义不变,因此编码器必须置换不变;B 把点云当成像素网格是错误类比,C、D 都不符合点云定义。就像照片助理不能依赖“先看哪张贴纸”的固定顺序。

Q3. InfoNCE 对比损失中的分子项是什么?

单选题 · easy

  • A.正样本对相似度经温度缩放取指数← 正确答案
  • B.负样本对的相似度取算术平均
  • C.全部样本对相似度之和除以数量
  • D.文本与3D特征各自的方差之和

答案:A。InfoNCE 的分子是正样本对的相似度经温度缩放后取指数,分母是包括正负样本的整行之和。B、C、D 都混淆了 softmax 归一化的结构。用相亲理解:分子是“这对就是天作之合”的心动分,分母是所有候选人的心动分总和。

Q4. 对称对比损失(双向损失)最主要的好处是什么?

单选题 · mid

  • A.同时优化两个检索方向的匹配← 正确答案
  • B.减少训练数据总量以降低显存
  • C.让两个编码器共享全部网络参数
  • D.免去构造负样本直接利用噪声

答案:A。对称损失对相似度矩阵的行和列都做交叉熵,保证文本→形状与形状→文本两个方向都对齐,检索在双向都可靠。B、C、D 都不是对称损失的必然结果。红娘必须两个方向都会,只练“按简介找照片”是不够的。

Q5. 温度系数 \(\tau\) 在对比损失中的作用是什么?

单选题 · mid

  • A.控制对困难负样本的惩罚强度← 正确答案
  • B.控制学习速率让收敛更加迅速
  • C.用来调节三维点云的采样密度
  • D.用于决定文本分词器的词表长

答案:A。温度系数缩放 logits,控制 softmax 的锐利程度:\(\tau\) 越小分布越尖锐,对困难负样本的惩罚越重;\(\tau\) 越大分布越平缓,梯度越弱。B、C、D 都与学习率、点云、词表无关。它就像红娘的“挑剔程度”旋钮。

Q6. 零样本3D检索能够工作的根本原因是什么?

单选题 · hard

  • A.嵌入空间泛化,语义线索可映射新类别← 正确答案
  • B.训练时已见过全部测试类别并记住
  • C.测试时用更高分辨率点云作插值
  • D.检索前用生成模型补全缺失视点

答案:A。零样本能力来自嵌入空间的语义泛化:训练让文本与形状按语义聚类,新类别只要文本能描述,就能落在正确区域;B 是记忆而非泛化,C、D 都是测试时的后处理技巧。老张从没见过的新类型,也能凭简介配出来。

Q7. 三维检索中的评测指标 R@K 的含义是什么?

单选题 · hard

  • A.检索结果前K个中命中正确形状的比例← 正确答案
  • B.模型推理一张点云所需的毫秒数
  • C.训练损失降低到阈值所需轮数
  • D.文本到形状相似度矩阵的秩大小

答案:A。R@K 衡量检索质量:返回的前 K 个结果中正确形状所占比例;B、C、D 分别涉及推理速度、训练轮数和矩阵性质,与召回率无关。它等价于“红娘给出的前 K 张照片里,真正选对的比例”。

Q8. 构造 3D-文本对比学习的正样本对,哪些思路是可行的?

多选题 · mid

  • A.3D模型与其对应自然语言描述配对← 正确答案
  • B.用渲染图像经CLIP蒸馏出文本特征← 正确答案
  • C.用同一类别标签作为弱监督构正对← 正确答案
  • D.随机抽取任意文本与形状强行配对

答案:ABC。正样本对可以来自人工描述配对、渲染图像经 CLIP 蒸馏出的文本特征做软标签、或同一类别标签做弱监督;随机强行配对会破坏语义对齐,使模型学不到任何规律。正样本对的质量决定了红娘练出的眼力上限。

Q9. 为什么不能直接用普通 CNN 处理原始点云?

多选题 · hard

  • A.点云无序,CNN卷积核假设规则网格← 正确答案
  • B.点云点数可变,固定卷积核难以适配← 正确答案
  • C.点云没有颜色信息导致卷积失效
  • D.点云在空间中稀疏且密度不均匀← 正确答案

答案:ABD。点云无序、点数可变、空间稀疏且密度不均匀,这些都违背 CNN 卷积核的规则网格假设;“没有颜色”不是根本原因,颜色只是可选附加属性。所以 3D 编码器必须做置换不变设计,这正是 PointNet 等模型出现的动机。

Q10. 对比学习中温度 \(\tau\) 设置过小(如 0.001),最可能出现什么现象?

单选题 · extreme

  • A.梯度被最难的负样本主导,训练震荡← 正确答案
  • B.所有样本一视同仁,模型学不到区分
  • C.两个编码器的参数直接退化为零
  • D.相似度矩阵退化为对称且等于常数

答案:A。\(\tau\) 过小时 softmax 趋于 one-hot,梯度几乎全部来自最难的负样本,训练剧烈震荡甚至不收敛;B 是 \(\tau\) 过大时的表现,C、D 都不会由温度系数引起。就像红娘过于苛刻时,会盯着最难分辨的两个人反复纠结,反而练不出稳定的眼力。