Part V · 第 18 章 无监督与自监督学习 · 18.3

对比学习:SimCLR 与 CLIP

不给标签,怎样让网络学会“这是同一个零件”?对比学习的答案是:把同一场景的两个变体拉近,把其他样本推远。这个“在一堆候选里认出自己的搭档”的分类问题叫 InfoNCE,它的温度决定了网络盯着哪些难负样本;数据增广决定了网络要忽略什么;负样本防止所有表示塌缩成一个点。本节在浏览器里现场训练 SimCLR 和一个小 CLIP,再看机器人如何用时间对比学习从视频里学到状态和奖励。

约 45 分钟 前置:18.2 自编码器 · 4.11 信息论 · 16.1 softmax 与交叉熵 · 1.7 点积与余弦相似度 6 个交互

    1为什么机器人需要它

    一台装配机器人的腕部相机每秒拍 30 张图,一天就是几百万张。几乎没有一张带标签:没人告诉它“这是 L 形支架”“这时夹爪离目标还有 3 cm”。可下游的一切(抓取、模仿学习、强化学习的奖励)都需要一个好的表示:把图像变成一个向量,向量只记住任务关心的东西(零件是什么、夹爪在哪),而对光照、背景、相机视角这些干扰因素不敏感。

    18.2 节的自编码器靠重建每个像素来学表示,于是它必须把光照、阴影、背景纹理也一并记下:像素里的大部分信息恰恰是干扰。对比学习换了一个问题:不重建,而是比较。给网络一张图的两个变体(换了光照、加了噪声),再混进一堆别的图,让它认出哪两个来自同一个场景。为了认得准,网络必须抓住在变体之间不变、而在不同场景之间不同的东西。哪些东西算“不变”,由你选择的变换决定:这是对比学习最核心、也最容易被忽视的一点。

    把“同一场景的另一个视角”换成“描述这张图的一句话”,就得到 CLIP:图像和文字被映射进同一个空间,机器人可以直接拿“蓝色的 L 形支架”去和相机画面比相似度,连训练时没见过的类别也能认(零样本分类)。把“另一个视角”换成“同一段视频里相邻的时刻”或“另一台相机同一时刻的画面”,就得到 TCN、R3M、VIP 这类机器人视觉表示,甚至可以直接用表示空间里离目标的距离当奖励。

    2直觉:在一群候选里认出自己的搭档

    编码器 \(f_\theta\) 把每张图变成一个向量,再归一化到单位球面上:\(\mathbf z=f_\theta(x)/\|f_\theta(x)\|\)。两张图的相似度就是 1.7 节的余弦相似度 \(s=\mathbf z^\top\mathbf z'\in[-1,1]\)。现在拿一个锚点 \(\mathbf z\),它的正样本 \(\hl{pos}{\mathbf z^+}\)(同一场景的另一个变体),以及若干负样本 \(\hl{neg}{\mathbf z^-_j}\)(别的场景)。把每个候选的相似度除以温度 \(\hl{tau}{\tau}\) 当作 logit,做一次 softmax:这就是一个“\(N+1\) 选 1”的分类器,正确答案是正样本。它的交叉熵(16.1 节)就是 InfoNCE 损失:

    $$ L=-\log\frac{\exp\!\big(\mathbf z^\top\hl{pos}{\mathbf z^+}/\hl{tau}{\tau}\big)}{\exp\!\big(\mathbf z^\top\mathbf z^+/\tau\big)+\sum_{j=1}^{N}\exp\!\big(\mathbf z^\top\hl{neg}{\mathbf z^-_j}/\tau\big)}=-\log p_+ $$

    (本节用 \(\mathbf z\) 表示嵌入向量,logit 写成 \(\ell=s/\tau\),与 16.1 节把 logit 记作 \(z\) 的写法不同。)损失要变小,只有两条路:让锚点更像正样本(拉近),或者让它更不像负样本(推远)。下面直接拖动单位圆上的点,看分类器给正样本多少概率,以及锚点受到的拉力与推力。

    FIG 1InfoNCE 就是一个“N+1 选 1”的分类器
    左:二维嵌入落在单位圆上。琥珀色是锚点,绿色是正样本,紫色是 5 个负样本,全部可以拖动(会被吸回圆上)。从锚点出发的箭头是负梯度 \(-\partial L/\partial\mathbf z\) 的分解:绿箭头指向正样本(拉力,长度正比于 \(1-p_+\)),每个负样本对应一支紫箭头,方向背离它(推力,长度正比于 \(p_j\)),琥珀箭头是它们的合力沿圆周切向的分量(画成 1.6 倍长):锚点真正会移动的方向。真实的梯度还要再乘 \(1/\tau\),为了让箭头放得下,图里省去了这个公共因子。右:分类器给每个候选的概率 \(p\);虚线是“瞎猜”的 \(1/6\)。读数里的“最难负样本份额”是推力中最大一份所占的比例。
    试一试
    • 拖动正样本靠近锚点、把负样本拖远,让分类器给正样本 90% 以上的概率(损失低于 0.11)。
    • 把一个负样本拖到离锚点 30° 以内,再把 τ 降到 0.1 或更低:这一个难负样本拿走 80% 以上的推力。然后把 τ 升到 1 或更高:它的份额跌到 50% 以下。
    核心洞见

    InfoNCE 的梯度自带“注意力”:每个负样本受到的推力正比于它的 softmax 概率 \(p_j\),也就是它此刻有多像锚点。温度 \(\tau\) 调节这份注意力有多尖锐:\(\tau\) 小时几乎所有推力都落在最难的那个负样本上(接近只看最近对手的三元组/铰链损失),\(\tau\) 大时所有负样本被一视同仁地推开。预设“全部塌缩”展示另一件事:所有点重合时 \(p\) 处处等于 \(1/6\),损失是 \(\log 6\approx1.79\),远不是最小值:负样本让“所有图都输出同一个向量”这条捷径变得不划算。

    3动手:在浏览器里训练 SimCLR

    SimCLR(Chen 等,2020)把上面的分类器变成一个完整的训练配方。每一步取 \(N\) 张图,每张图随机增广两次,得到 \(2N\) 个视图;同一张图的两个视图互为正样本,批次里其余 \(2N-2\) 个视图全部当负样本,不需要任何标签。我们的“数据集”是一台俯视托盘的相机拍的 8×8 灰度图:托盘上放着四种零件之一,方块、横销、竖销和 L 形支架,位置有 ±1 像素的抖动,每张图的环境光、零件亮度和光照梯度(光从哪边来)都不同。网络从来看不到零件类别;类别只在评估时用来给点上色和打分。

    先看增广。真实 SimCLR 最重要的两种增广是随机裁剪和颜色失真;我们的编码器是一个小 MLP,学不会平移不变性(那是 17.1 节卷积网络的强项),所以这里用三种适合它的增广:光照抖动(随机改变增益、平移环境光,并叠加一个方向随机的光照梯度)、传感器噪声、随机遮挡(抹掉一个 2×2 的块)。

    FIG 2一个批次:每张图的两个增广视图,以及像素空间里的配对难度
    上排:8 张原图(零件类别用边框颜色标出,仅供你看)。中间两排:每张原图的视图 A 和视图 B,青色越浓 = 越亮。右边的 16×16 方阵是所有视图两两之间的像素余弦相似度(琥珀色越浓 = 越像),对角线(自己和自己)留空;绿框是每一行真正的正样本,红点标出每一行像素最相似的视图。读数给出“像素最近邻恰好是正样本”的比例:本批次,以及固定种子下 400 个批次的平均。
    • 先关掉全部增广:两个视图一模一样,像素最近邻 100% 找到搭档,这个预训练任务毫无难度。再只打开“光照抖动”:400 批平均降到 60% 以下:光凭像素已经认不出搭档了。

    这正是要点:增广让预训练任务在像素空间里变难,网络只能去找光照改变不了的东西,也就是零件的形状。下面真正开始训练。编码器是 64 → 32 → 32 → 3 的 tanh MLP,输出归一化后落在三维单位球面上(可以拖动旋转);损失是对 \(2N\) 个视图求平均的 InfoNCE(SimCLR 称之为 NT-Xent)。每 20 步,在 200 张固定的测试图(不增广)上评估一次:用嵌入做 5-近邻分类,看能否猜对零件类别,以及能否猜对光照方向(四个象限之一)。前者高、后者接近瞎猜的 25%,说明表示学到了零件而忽略了光照。

    FIG 3SimCLR 现场训练:增广决定表示记住什么
    左:200 张测试图的嵌入在单位球面上(正面的点实心,背面的点小而淡;拖动旋转)。按“零件”着色时,红、绿、蓝、紫分别是方块、横销、竖销、L 形支架;按“光照方向”着色时,同样四种颜色表示光来自的四个象限。右上:训练损失(琥珀色,左轴)和瞎猜水平 \(\log(2N-1)\)(虚线),以及测试集上的 5-近邻准确率:零件(绿色)和光照方向(紫色),右轴 0 到 1。读数里的 \(R\) 是所有测试嵌入平均向量的长度:均匀铺满球面时接近 0,全部塌缩成一点时等于 1。
    • 保持默认(InfoNCE、光照抖动 + 噪声)按“训练”:几百步内零件的近邻准确率超过 90%,而光照方向的准确率掉到 40% 以下。(对照:原始像素上的近邻准确率只有 77%。)
    • 关掉“光照抖动”,重置并训练至少 300 步:网络走了捷径,光照方向的准确率升到 70% 以上,零件的准确率却低于 50%。切到“按光照方向着色”看看球面上的点是按什么分组的。
    • 把损失换成“只拉近(无负样本)”并训练(从重置开始只需几十步,从训练好的网络出发要几百步):损失降到接近 0,而 \(R\) 升到 0.98 以上:所有图被映射到了同一个点,这就是塌缩。
    值得注意

    (1) 随机初始化的网络就已经“认得”光照:训练前光照方向的近邻准确率是 66%,零件只有 37.5%。像素里最显眼的变化是光照,不是零件。 (2) 训练好之后,损失仍远高于 0(默认设置下约 2.3 到 2.7,瞎猜是 \(\log 63\approx4.14\)):同一类零件的两张不同图彼此是负样本,网络既要把它们聚成一团,又被要求区分它们,这是对比学习固有的张力(见误区 1)。 (3) 关掉光照抖动后,损失反而更低(约 2.0 到 2.2),预训练任务完成得更好,表示却对零件几乎没用:损失低不等于表示好。

    4另外两个视角:互信息的上限,以及 CLIP

    InfoNCE 在估计互信息,而且被 log N 封顶

    为什么“认出搭档”能学到有用的东西?4.11 节把互信息 \(I(X;Y)\) 定义为“知道 \(Y\) 之后,关于 \(X\) 的不确定性减少了多少”。van den Oord 等(2018)证明:用 \(N\) 个候选(1 个正样本、\(N-1\) 个负样本)训练出的 InfoNCE 损失给出互信息的一个下界 \(I(X;Y)\ge\hl{logn}{\log N}-L\)。最小化损失就是在最大化两个视图之间互信息的下界。可这个下界有个硬伤:\(L\ge0\),所以估计值永远不超过 \(\log N\)。下图用两组相关的四维高斯变量 \(X,Y\)(真实互信息可以精确算出)和最好的打分函数(真实的密度比)来检验:即使打分函数完美,估计也撞上 \(\log N\) 的天花板。

    FIG 4InfoNCE 估计的互信息:批次大小设定天花板
    横轴:真实互信息 \(I(X;Y)=-\tfrac d2\log(1-\rho^2)\)(nats,\(d=4\),\(\rho\) 是每一维的相关系数)。纵轴:InfoNCE 估计 \(\log N-L\) 的期望。没有颜色的细对角线是“估计 = 真值”。四条曲线是 \(N=4,16,64,256\) 时的估计(打开页面后在后台逐点采样画出),各自的水平虚线是 \(\log N\)。琥珀色点是你选的设置:每帧采样若干个新批次,点是至今所有批次的平均,竖线是 ±2 个标准误差。
    • 选 \(N=16\),把真实互信息拉到 4 nats 以上,至少采样 50 个批次:估计停在 \(\log 16\approx2.77\) 以下,比真值少了三成以上。
    • 真实互信息在 2.5 到 4 nats 之间时,把 \(N\) 换成 256(至少采样 50 批):估计回到真值的 10% 以内。
    为什么这很重要

    这解释了对比学习为什么偏爱大批次:SimCLR 用到上千(最大 8192)的批次,CLIP 用 32768,MoCo(He 等,2020)则用一个动量更新的编码器加一个 65536 长的负样本队列,把负样本数和批次大小解耦。但别把“最大化互信息”当成全部真相:Tschannen 等(2020)指出,表示好不好更多取决于编码器结构和打分函数的归纳偏置,而不只是互信息下界有多紧。FIG 3 的“捷径”就是一例:关掉光照抖动后,两个视图之间的互信息完全可以靠光照拿满。

    CLIP:拿一句话当“另一个视图”

    CLIP(Radford 等,2021)把正样本对从“同一张图的两个增广”换成“一张图和描述它的文字”。它有两个编码器:图像编码器 \(f\) 和文本编码器 \(g\),都输出单位向量。一个批次里有 \(N\) 对图文,算出 \(N\times N\) 的相似度矩阵,对角线是正确配对。损失是两个方向的 InfoNCE 之和:每张图在 \(N\) 句话里找自己的描述(矩阵的行),每句话在 \(N\) 张图里找自己的图(矩阵的列)。温度也是一个可学习的参数。训练完,零样本分类不需要再训练任何分类器:把每个类别写成一句话(“一个蓝色的 L 形支架”),用文本编码器编码,选和图像余弦相似度最高的那句。

    下面是一个缩小版:彩色 8×8 图像,红、绿、蓝三种颜色 × 四种零件 = 12 种组合;“文本”是两个词(颜色词 + 零件词)的词袋,文本编码器是 7 → 16 → 8 的 MLP,图像编码器是 192 → 32 → 8 的 MLP。关键的考验:“蓝色 L 形支架”和“红色竖销”这两种组合在训练中一次都不出现,模型只见过蓝色的别的零件、别的颜色的 L 形支架。和真实相机一样,三种颜色在 RGB 通道上有重叠(红色是 (1, 0.4, 0.4),依此类推)。

    FIG 5迷你 CLIP:图文对比训练与零样本识别
    左上:当前批次(16 对)的相似度矩阵,行是图像(左侧是缩略图),列是文本(上方用一个颜色色块加一个零件图标表示两个词),琥珀色越浓 = 余弦相似度越高,绿框是正确配对。注意同一批次里可能出现两对相同的组合:它们的“负样本”其实是正确答案(误区 1)。左下:用你在下面选的提示词去检索 36 张测试图(12 种组合各 3 张),按相似度排出前 8 名,绿色边框表示检索对了。右:零样本准确率随训练步数的变化:训练中见过的 10 种组合(绿色)、从未见过的 2 种组合(琥珀色)、只用零件词当提示的 4 选 1(蓝色)。
    • 按“训练”:见过的组合很快接近 100%,而从未见过的“蓝色 L 形支架”和“红色竖销”要慢得多;训练到它们的零样本准确率超过 75%(12 选 1,瞎猜只有 8%)。
    • 训练之后,把提示词设成一个从未见过的组合(“蓝色 + L 形支架”或“红色 + 竖销”):检索出的前 3 张图全部正确。
    零样本分类就是一个用文字写出权重的线性分类器

    把 \(K\) 个类别的提示词编码成 \(\mathbf t_1,\dots,\mathbf t_K\),零样本分类器就是 \(p(k\mid x)\propto\exp(\mathbf t_k^\top f(x)/\tau)\):一个权重矩阵的行恰好是文本嵌入的 softmax 线性分类器。所以“换一组类别”只是“换一组句子”。提示怎么写很重要:CLIP 论文发现用“a photo of a {label}.”这样的模板、再对几十个模板的文本嵌入取平均(提示集成),比只写类别名准确得多。FIG 5 里只给零件词(“L 形支架”,不带颜色)当提示,就是一个模型在训练中从未见过的句子。

    5再看数学

    InfoNCE 与它的梯度

    记候选集合为 \(\{\mathbf z_0=\mathbf z^+,\mathbf z_1,\dots,\mathbf z_N\}\),logit \(\ell_j=\mathbf z^\top\mathbf z_j/\tau\),softmax 概率 \(p_j=e^{\ell_j}/\sum_k e^{\ell_k}\)。损失 \(L=-\ell_0+\log\sum_k e^{\ell_k}\)。对锚点求导(16.1 节 softmax 交叉熵的“\(p-y\)”规则再用一次):

    $$ \frac{\partial L}{\partial\mathbf z}=\frac1\tau\Big(\sum_{j=0}^{N}p_j\mathbf z_j-\mathbf z^+\Big)=-\hl{grad}{\frac{1-p_+}{\tau}\,\mathbf z^+}+\sum_{j=1}^{N}\hl{grad}{\frac{p_j}{\tau}\,\mathbf z^-_j},\qquad \frac{\partial L}{\partial\mathbf u}=\frac{(I-\mathbf z\mathbf z^\top)}{\|\mathbf u\|}\,\frac{\partial L}{\partial\mathbf z}\quad(\mathbf z=\mathbf u/\|\mathbf u\|) $$

    第一项是对正样本的拉力,求和里的每一项是对一个负样本的推力(悬停公式,FIG 1 的箭头会加粗)。第二个式子是通过归一化 \(\mathbf z=\mathbf u/\|\mathbf u\|\) 反传:只有与球面相切的分量留下来,这就是 FIG 1 里琥珀色合力沿切向的原因(代码在页面里用 16.3 节的反向传播接着往网络里传)。正样本的 \(\partial L/\partial\mathbf z^+\) 和每个负样本的 \(\partial L/\partial\mathbf z_j^-\) 同理,所以负样本也被推离锚点。

    温度的两个极限。\(\tau\to0\):softmax 变成 max,\(L\approx\max\big(0,\max_j s_j^- -s^+\big)/\tau\),只惩罚比正样本更像锚点的那个最难负样本,就是带零间隔的三元组损失。\(\tau\to\infty\):一阶展开 \(\log\sum_k e^{\ell_k}\approx\log(N+1)+\bar\ell\),于是 \(L\approx\log(N+1)-(s^+-\bar s)/\tau\),\(\bar s\) 是全部 \(N+1\) 个相似度的平均:所有负样本被同等地推开,难样本不再特殊。实践中 \(\tau\) 通常在 0.05 到 0.5 之间,CLIP 则把它当参数从 0.07 开始学。

    对齐与均匀:负样本为什么能防塌缩

    Wang 与 Isola(2020)证明,当负样本数 \(N\to\infty\) 时,InfoNCE 分成两项:

    $$ \lim_{N\to\infty}\big(L-\log N\big)=\hl{align}{-\frac1\tau\,\mathbb E_{(x,x^+)}\big[\mathbf z^\top\mathbf z^+\big]}+\hl{unif}{\mathbb E_{x}\Big[\log\mathbb E_{x^-}\,e^{\mathbf z^\top\mathbf z^-/\tau}\Big]} $$

    对齐项希望正样本对重合;均匀项是一个“排斥势”,在球面上的均匀分布处最小(把鼠标停在这两个词上,FIG 3 会画出几对正样本视图的连线,或所有测试嵌入的平均向量)。只留对齐项,最优解就是常数函数:每张图都输出同一个 \(\mathbf z\),对齐损失为 0,这正是 FIG 3 “只拉近”时看到的塌缩,\(R\to1\)。均匀项在塌缩处最大(所有 \(\mathbf z^\top\mathbf z^-=1\)),所以负样本把塌缩从“最优”变成了“最差”。对有限批次,塌缩处的损失恰好等于瞎猜:SimCLR 的 \(2N\) 个视图里每个锚点有 \(2N-1\) 个候选,\(L=\log(2N-1)\)。

    不用负样本也能防塌缩,但要换别的机制:BYOL 和 SimSiam 用预测头加停止梯度(BYOL 还用动量目标编码器),DINO 用对教师输出的中心化与锐化,VICReg 直接惩罚各维方差过小。这些“非对比”方法留给 18.4 节。

    互信息下界

    取 \(N\) 对样本 \((x_i,y_i)\sim p(x,y)\),对任意打分函数 \(c(x,y)\),下式成立(van den Oord 等 2018 提出,Poole 等 2019 给出严格证明):

    $$ I(X;Y)\;\ge\;\mathbb E\Bigg[\frac1N\sum_{i=1}^N\log\frac{e^{c(x_i,y_i)}}{\frac1N\sum_{j=1}^N e^{c(x_i,y_j)}}\Bigg]=\hl{logn}{\log N}-L_{\mathrm{NCE}},\qquad c^\star(x,y)=\log\frac{p(y\mid x)}{p(y)}+b(x) $$

    直觉:给定 \(x\),在 \(N\) 个候选 \(y\) 里猜哪个是它的搭档,贝叶斯最优的猜法就是按密度比 \(p(y\mid x)/p(y)\) 打分,这正是 \(c^\star\);只依赖 \(x\) 的项 \(b(x)\) 在 softmax 里抵消。FIG 4 用的就是这个 \(c^\star\):对相关高斯,\(\log p(y\mid x)-\log p(y)\) 是 \(\frac{\rho}{1-\rho^2}\mathbf x^\top\mathbf y\) 加上只依赖 \(\mathbf y\) 和只依赖 \(\mathbf x\) 的二次项。由于 \(L_{\mathrm{NCE}}\ge0\),右边不可能超过 \(\log N\):要“看见” \(k\) nats 的互信息,至少需要 \(N\approx e^k\) 个候选。

    SimCLR 与 CLIP 的完整损失

    $$ L_{\mathrm{SimCLR}}=\frac1{2N}\sum_{a=1}^{2N}-\log\frac{\exp(\mathbf z_a^\top\mathbf z_{a^+}/\tau)}{\sum_{k\ne a}\exp(\mathbf z_a^\top\mathbf z_k/\tau)},\qquad \mathbf z=\frac{g(\mathbf h)}{\|g(\mathbf h)\|},\quad\mathbf h=f_\theta(x) $$ $$ L_{\mathrm{CLIP}}=\frac12\Bigg[\hl{i2t}{\frac1N\sum_{i}-\log\frac{e^{\mathbf u_i^\top\mathbf t_i/\tau}}{\sum_{j}e^{\mathbf u_i^\top\mathbf t_j/\tau}}}+\hl{t2i}{\frac1N\sum_{i}-\log\frac{e^{\mathbf u_i^\top\mathbf t_i/\tau}}{\sum_{j}e^{\mathbf u_j^\top\mathbf t_i/\tau}}}\Bigg] $$

    SimCLR 的编码器 \(f_\theta\)(论文里是 ResNet)后面接一个小的 MLP 投影头 \(g\),损失作用在 \(\mathbf z\) 上,下游任务却用投影之前的 \(\mathbf h\):投影头会主动丢掉与增广有关的信息(比如颜色),而 \(\mathbf h\) 还保留着,所以 \(\mathbf h\) 上的线性分类效果更好。评价表示的标准做法是线性探测:冻结编码器,只在 \(\mathbf h\) 上训练一个线性分类器(21.1 节会把它和全量微调比较)。我们的小 MLP 没有单独的投影头,直接在 \(\mathbf z\) 上做近邻评估。CLIP 的式子里 \(\mathbf u_i\) 是第 \(i\) 张图的图像嵌入,\(\mathbf t_i\) 是第 \(i\) 句话的文本嵌入;第一项是“图找文”(相似度矩阵的每一行做一次 softmax),第二项是“文找图”(每一列)。\(1/\tau\) 用对数参数化来学,并截断在 100 以内;FIG 5 也这样做,从 \(1/\tau=5\) 开始,2000 步时升到约 13,之后在 14 左右。

    一句话总结

    对比学习 = 用 softmax 交叉熵做“认搭档”的分类;正样本对的构造方式(增广、图文、时间、多视角)定义了表示要不变的东西,负样本提供均匀性、防止塌缩,温度决定梯度集中在哪些负样本上,批次大小决定能“看见”多少互信息。

    6机器人中的它:从视频里学状态和奖励

    机器人的数据天然是视频,时间本身就提供了正样本。TCN(时间对比网络,Sermanet 等,2018)用多台相机同时拍同一个动作:同一时刻、不同相机的两帧是正样本,同一相机、不同时刻的帧是负样本。前者逼表示忽略视角和外观,后者逼它记住随时间变化的东西,也就是机器人和物体的状态。只用单台相机、把“相邻时刻”当正样本也行,但有个陷阱:同一段视频里每一帧都共享光照和背景,网络可以靠“这是哪段视频”配对,而不必在不同的视频之间对齐状态。

    下图是一个夹爪在 10×10 的俯视相机里从随机起点移到目标(右上方)的 20 段测试演示,每段视频有自己的光照梯度、增益和一个固定的干扰方块。训练时每步取 10 段新演示、每段 3 个时刻:选“多视角”时,正样本是同一时刻、另一台相机(光照与干扰物都不同)的画面;选“单视角时间”时,正样本是同一相机的下一帧。评估方法是跨演示检索:对每一帧,在其他演示里找表示最近的帧,看两帧的夹爪位置差多少像素。这正是“用别人的演示来判断我现在进行到哪一步”时需要的能力。

    FIG 6时间对比学习:表示里的距离成为进度与奖励
    左上:所选演示的 12 帧(青色越浓 = 越亮),带框的是所选帧。左下:所选帧在其他演示里的最近邻,按像素(紫色)和按学到的表示(绿色);右边的小地图是真实的夹爪位置:琥珀色是查询帧,紫色和绿色是两个最近邻,红叉是目标,虚线是这段演示的轨迹。右上:沿所选演示的“奖励” \(r_t=-\|\mathbf z_t-\mathbf z_g\|\)(\(\mathbf z_g\) 是目标图的表示,目标图来自另一台相机,各自归一化到 0 到 1),用表示(绿色)和用像素(紫色);随时间单调上升才是好的进度信号。
    • 用“多视角”训练:跨演示检索的平均夹爪误差降到 0.9 像素以下,比像素最近邻(约 1.05 像素)更准。
    • 切到“单视角时间”,重置并训练至少 1000 步:检索误差仍然比像素最近邻还差。网络学会了认“哪段视频”,而不是认“夹爪在哪”。

    同一个思想在机器人学习里反复出现。R3M(Nair 等,2022)在人类第一视角视频数据集 Ego4D 上,用时间对比、视频与语言对齐和 L1 稀疏正则训练一个 ResNet,然后冻结它,供下游的行为克隆(22.1 节)在少量演示上学操作策略。VIP(Ma 等,2023)同样只用 Ego4D、不需要动作标签,把训练目标写成一个隐式的、以目标为条件的价值函数,得到的表示里“到目标图像的距离”可以直接当作奖励,正是 FIG 6 右上角那条曲线的思路。CLIP 则把语言带进了机器人:CLIPort(Shridhar 等,2021)用 CLIP 的特征把语言指令和相机画面对应起来,基于 CLIP 式训练的开放词汇检测器(如 OWL-ViT)让机器人按名字找物体。今天的视觉-语言-动作模型也沿用对比预训练的图像编码器:OpenVLA 把 SigLIP 和 DINOv2 的特征拼在一起,π0 建在 PaliGemma 上,其视觉编码器也是 SigLIP。SigLIP(Zhai 等,2023)把 CLIP 的 softmax 换成对每个图文对独立的 sigmoid 二分类,不再需要整批归一化。

    真实系统里

    规模:CLIP 在约 4 亿个从网上收集的图文对上训练,批次 32768;SimCLR 在 ImageNet 上用上千的批次,一个加宽 4 倍的 ResNet-50 上的线性探测达到了有监督 ResNet-50 的水平。 预训练表示用于控制:常见做法是冻结 R3M、VIP、CLIP 或 DINOv2 等编码器,只在其特征上训练策略或价值函数,或者在少量机器人数据上微调(21.1 节)。 增广要配合任务:如果任务是“拿起红色的杯子”,颜色抖动会把颜色这一关键信息变成不变量;如果任务和左右有关(插销从哪边插入),水平翻转就不能用。 奖励:把“到目标嵌入的距离”当奖励很方便,但它只在表示真的对状态敏感、对干扰不敏感时才可靠:FIG 6 的单视角时间训练就是一个反例。

    7常见误区

    误区 1:以为负样本一定“不同”

    批次里的负样本只是“别的图”,很可能和锚点是同一类(FIG 3 里四类零件,批次里另外 31 张图中平均约有 7.75 张与锚点同类),甚至是同一个组合(FIG 5 的同一批次里常有重复的图文)。这些假负样本会被错误地推开,类越少、批次越大越严重。有标签时可以用监督对比学习(SupCon,Khosla 等 2020)把同类都当正样本;没有标签时,常见的缓解办法是去掉明显重复的样本、或者降低与锚点过于相似的负样本的权重。

    误区 2:增广会自动“正确”

    增广定义了不变性,它是你写进模型的先验,不是中性的预处理。少了必要的增广,网络会走捷径(FIG 3 关掉光照抖动后,表示按光照分组);多了不该有的增广,任务需要的信息会被抹掉(颜色抖动之于“红杯子”,翻转之于左右)。在 ImageNet 上调好的增广组合,换到机器人腕部相机、深度图或触觉图像上未必合适。

    误区 3:用对比损失的数值评价表示

    损失值依赖批次大小(瞎猜水平是 \(\log(2N-1)\)),也依赖增广的强度;FIG 3 里关掉光照抖动后损失更低,“只拉近”时损失接近 0,可这两种表示都没用。评价表示要看下游:冻结编码器后的线性探测、近邻分类、少量样本的微调,或者在机器人上的任务成功率。

    误区 4:温度和批次随手一设

    \(\tau\) 太小,梯度几乎只来自最难的负样本,而最难的负样本往往是假负样本,训练会变得嘈杂、不稳定;\(\tau\) 太大,难负样本不再被重视,表示的区分度下降。批次太小,负样本少,互信息估计被 \(\log N\) 封顶(FIG 4)。如果显存放不下大批次,可以用 MoCo 式的负样本队列;CLIP 则干脆把 \(\tau\) 当参数来学。

    误区 5:以为零样本就是“什么都认得”

    零样本只是不需要为新类别训练分类器,模型仍然只能组合它在训练中见过的概念。FIG 5 能认出“蓝色 L 形支架”,是因为它见过“蓝色”和“L 形支架”,而且颜色在 RGB 通道上有共享的结构;一个从未出现过的形状它就认不出来。真实的 CLIP 对计数、空间关系(“杯子在盘子左边”)和细粒度类别也明显较弱,提示措辞的小变化还会改变结果。在机器人上,用它做开放词汇的物体检索之前,应在自己的场景里先测一测。

    8小练习

    1. SimCLR 一个批次有 \(N=32\) 张图(64 个视图)。如果编码器塌缩成常数,每个锚点的 InfoNCE 损失是多少?
    塌缩时所有相似度都等于 1,softmax 在 \(2N-1=63\) 个候选(自己除外)上均匀分布,\(p_+=1/63\),\(L=\log 63\approx4.14\),正好是瞎猜的水平(FIG 3 的虚线)。选项 A 是“只拉近”损失在塌缩处的值:有了负样本,塌缩是最差的情形之一。
    2. 把 InfoNCE 的温度 \(\tau\) 调得很小,梯度会怎样?
    每个负样本的推力正比于 \(p_j\propto e^{s_j/\tau}\)。\(\tau\to0\) 时 softmax 趋于 one-hot,最大的 \(s_j\) 拿走几乎全部权重(FIG 1 的“最难负样本份额”),损失退化成只看最难负样本的铰链。选项 A 是 \(\tau\to\infty\) 的情形;logit 是 \(s/\tau\),\(\tau\) 小时变大而不是变成 0。
    3. 用 CLIP 做 \(K\) 类零样本分类时,“分类器的权重”是什么?
    \(p(k\mid x)\propto\exp(\mathbf t_k^\top f(x)/\tau)\),权重矩阵的每一行就是一个提示词的文本嵌入 \(\mathbf t_k\),不需要任何带标签的图像。选项 A 是线性探测,选项 B 是“原型”分类器,两者都需要标签。
    4. 用 \(N=256\) 个候选的 InfoNCE 去估计两个视图之间的互信息,真实值是 10 nats。估计值最多是多少?
    估计值是 \(\log N-L\),而交叉熵 \(L\ge0\),所以无论打分函数多好,都不超过 \(\log N=\ln256\approx5.55\) nats(FIG 4 用最优打分函数验证过)。选项 D 混淆了单位:8 是以 2 为底的比特数,换成 nats 仍是 5.55。
    5. TCN 用“同一时刻、不同相机”的两帧当正样本,“同一相机、不同时刻”的帧当负样本。这样设计主要是为了什么?
    正样本对共享状态而外观不同,所以外观必须被忽略;负样本共享外观(同一台相机)而状态不同,所以靠外观无法区分它们,只能靠状态。FIG 6 里单视角时间训练没有这层约束,网络靠光照和干扰物认出“哪段视频”,跨演示检索反而比像素还差。选项 B 正好相反。

    9延伸阅读

    • R. Hadsell, S. Chopra & Y. LeCun, Dimensionality Reduction by Learning an Invariant Mapping, CVPR 2006 — 早期的成对对比损失:拉近相似对、推开不相似对
    • A. van den Oord, Y. Li & O. Vinyals, Representation Learning with Contrastive Predictive Coding, arXiv:1807.03748, 2018 — 提出 InfoNCE 与它的互信息下界
    • B. Poole, S. Ozair, A. van den Oord, A. Alemi & G. Tucker, On Variational Bounds of Mutual Information, ICML 2019 — 互信息变分下界的统一视角,包括 InfoNCE 的 \(\log N\) 上限
    • T. Chen, S. Kornblith, M. Norouzi & G. Hinton, A Simple Framework for Contrastive Learning of Visual Representations, ICML 2020 — SimCLR:增广组合、投影头、NT-Xent 与大批次
    • K. He, H. Fan, Y. Wu, S. Xie & R. Girshick, Momentum Contrast for Unsupervised Visual Representation Learning, CVPR 2020 — MoCo:动量编码器加负样本队列
    • T. Wang & P. Isola, Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere, ICML 2020 — 对齐与均匀两项分解
    • M. Tschannen, J. Djolonga, P. K. Rubenstein, S. Gelly & M. Lucic, On Mutual Information Maximization for Representation Learning, ICLR 2020 — 为什么“最大化互信息”不足以解释对比学习的成功
    • A. Radford et al., Learning Transferable Visual Models From Natural Language Supervision, ICML 2021 — CLIP:图文对比训练与零样本迁移
    • X. Zhai, B. Mustafa, A. Kolesnikov & L. Beyer, Sigmoid Loss for Language Image Pre-Training, ICCV 2023 — SigLIP:用逐对 sigmoid 代替批内 softmax
    • P. Sermanet, C. Lynch, Y. Chebotar, J. Hsu, E. Jang, S. Schaal & S. Levine, Time-Contrastive Networks: Self-Supervised Learning from Video, ICRA 2018 — 多视角时间对比与机器人模仿
    • S. Nair, A. Rajeswaran, V. Kumar, C. Finn & A. Gupta, R3M: A Universal Visual Representation for Robot Manipulation, CoRL 2022 — 从人类视频预训练、供操作策略使用的冻结表示
    • Y. J. Ma, S. Sodhani, D. Jayaraman, O. Bastani, V. Kumar & A. Zhang, VIP: Towards Universal Visual Reward and Representation via Value-Implicit Pre-Training, ICLR 2023 — 表示空间里到目标的距离作为奖励
    • M. Shridhar, L. Manuelli & D. Fox, CLIPort: What and Where Pathways for Robotic Manipulation, CoRL 2021 — 用 CLIP 理解语言指令的操作策略