Skip to content

0.2 怎么判断模型配得对不对 ​

0.1 给出了相似度矩阵 S,它回答了哪份报告与哪张胸片更像。训练还需要另一个东西:一个能判断模型当前做得有多差的数,而且要能变小。矩阵本身做不到这件事,它是一个方阵。

本节把 S 压缩成一个数,并说明 ConVIRT 的损失函数是怎样从 S 长出来的。

0.2.1 从一行相似度到一组匹配权重 ​

以胸片 C 那一行为例。它与其他四份报告的相似度是四个数:

S3=[−0.06−0.060.8790.724]

模型已经知道报告 C 最像,但 0.879 与 0.724 的差距在数值上很普通。softmax 把这一行变成一组和为 1 的权重:

softmax(zi)=exp⁡(zi)∑k=1Nexp⁡(zk)

解释一下什么是 softmax :其实就是归一化,把一组原始分数变成一组总和为1的权重,上式分子为第 i 项的分数,分母为所有项的分数之和

通过取指数把任意实数变成正数,归一化后各项之和为 1。这一组权重的含义是模型在当前这 N 份候选报告之间产生的归一化匹配分布。这里需要注意 softmax 的输出是模型内部的相对分配,没有经过校准,不能直接当作真实概率解释。

0.2.2 负对数似然 ​

正确的那一项权重越高,说明模型把匹配质量集中到了对的地方。为了得到一个随错误程度增大的数:取它的负对数:

−log⁡pcorrect

若模型给配对报告 0.9 的权重,−log⁡0.9=0.105;若只给 0.1,−log⁡0.1=2.303。也就是做得越差罚得越重。

下式为 ConVIRT 的图像到文本方向的损失,也就是上式的完整展开形式:

ℓi(v→u)=−log⁡exp(⟨vi,ui⟩/τ)∑k=1Nexp(⟨vi,uk⟩/τ)

把每一项对上手头的对象,这个式子里没有陌生的东西:分子是第 i 对图文的余弦相似度除以温度,分母是第 i 张胸片与全部 N 份报告的相似度之和,整个分式就是 softmax 在配对位置上的取值,外面套一层负对数。τ 是温度,下下一小节讨论。

0.2.3 两个方向与权重 ​

图像去找文本是一个方向,文本去找图像是另一个方向,后者是

ℓi(u→v)=−log⁡exp(⟨ui,vi⟩/τ)∑k=1Nexp(⟨ui,vk⟩/τ)

两个方向按权重 λ 合并,再对一个批次取平均:

L=1N∑i=1N[λℓi(v→u)+(1−λ)ℓi(u→v)]

ConVIRT 取 λ=0.75,d=512,τ=0.1。

这个式子在论文里被读作一个 N 分类问题:给定一张胸片,在 N 份报告里选出正确的那一份,损失是选错时付出的代价。

这里其实存在两层合并:第一层是把两个方向的任务合并,第二层是把一个batch 内的样本合并

我们假设一个 batch 内有 N 对图文,图像找文本时,相当于是在问:给定 image1 , N 份文本里哪一份是与之对应的?,文本找图像时同理,这两个任务看起来虽然互为镜像,但是数学上并不是同一个 loss , 这是由于 softmax 的归一化方向不一致 ;假设只优化某一个方向,相当于仅约束了某一个任务,另一个任务则可能失效

所以双向 loss 可以理解为:不仅要求每一张图片找到自己的文本,还要求每一份文本找到自己的图片,这样共享 embadding space 会更加对称和稳定

而对于为什么要乘以 $ \lambda$ ,这是因为作者未必认为两个任务方向同等重要;写成 $ \lambda , \ell_i^{(v \to u)} + (1-\lambda) , \ell_i^{(u \to v)}$ 就是在说:我愿意让两个任务都参与训练并共享交叉熵,但是我认为某一个任务比另一个更重要,这可能是作者的调参小巧思,深度学习中的大量类似事件就是这个领域总是有点玄学的原因

0.2.4 log N 作为参照 ​

N 个候选项完全均匀分配时,每一项权重都是 1/N,损失恰好等于 log⁡N。N=4 时是 log⁡4=1.3863。它是一个参照线:损失明显低于它,说明模型给出了比均匀分配更集中的判断。注意这只在分布接近均匀时成立;分布不均匀但判断错误时,损失会高于 log⁡N。

0.2.5 温度 ​

τ 控制 softmax 分布的尖锐程度。τ 越小,相似度的差异被放大得越多,分布越尖锐:模型判断正确时损失趋近 0,判断错误时损失急剧增大,梯度也随之变大。τ 越大,分布越接近均匀,损失趋近 log⁡N。

ConVIRT 在论文表 4 中报告,τ=0.01 与 τ=1 都会使检索性能变差,最终取 τ=0.1。论文没有给出温度影响的理论分析,这一结论来自实验比较。

深度学习实际上是一个造假率颇高的领域,因为其中有大量参数是凭借经验和炼丹算出来的,所以也希望这里能让大家去去魅

代码验证 ​

从 S 算出匹配分布与损失:

python
import numpy as np

np.set_printoptions(precision=3, suppress=True)

S = np.array([
    [0.879, -0.060, -0.060, -0.060],
    [-0.060, 0.879, -0.060, -0.060],
    [-0.060, -0.060, 0.879, 0.724],
    [-0.060, -0.060, 0.724, 0.879],
])
tau = 0.1
logits = S / tau
print("第 3 行(胸片 C)的相似度 =", S[2])
print("除以 tau 之后的 logits =", logits[2])
Z = logits - logits.max(axis=1, keepdims=True)
P = np.exp(Z) / np.exp(Z).sum(axis=1, keepdims=True)
print("第 3 行的匹配分布 =", P[2])
print("各行的配对概率 =", np.diag(P))
print("逐行损失 =", -np.log(np.diag(P)))
print("平均损失 =", round(float(-np.log(np.diag(P)).mean()), 4))
print("对照 log(N) =", round(float(np.log(4)), 4))

输出:

第 3 行(胸片 C)的相似度 = [-0.06  -0.06   0.879  0.724]
除以 tau 之后的 logits = [-0.6  -0.6   8.79  7.24]
第 3 行的匹配分布 = [0.    0.    0.825 0.175]
各行的配对概率 = [1.    1.    0.825 0.825]
逐行损失 = [0.    0.    0.193 0.193]
平均损失 = 0.0964
对照 log(N) = 1.3863

胸片 A 与 B 两行的损失为零(显示为 0.000),模型对它们已经不再犹豫。损失全部来自 C 与 D 两行,各 0.193。原因在第 3 行的分布里:报告 C 拿到 0.825,剩下的 0.175 给了报告 D。平均损失 0.0964,明显低于 log⁡4=1.3863。

再看温度的影响:

python
for t in [0.01, 0.1, 1.0]:
    Zt = S / t - (S / t).max(axis=1, keepdims=True)
    Pt = np.exp(Zt) / np.exp(Zt).sum(axis=1, keepdims=True)
    print(f"tau = {t:5}  平均损失 = {float(-np.log(np.diag(Pt)).mean()):.4f}   第 3 行分布 = {Pt[2]}")

输出:

tau =  0.01  平均损失 = 0.0000   第 3 行分布 = [0. 0. 1. 0.]
tau =   0.1  平均损失 = 0.0964   第 3 行分布 = [0.    0.    0.825 0.175]
tau =   1.0  平均损失 = 0.8732   第 3 行分布 = [0.148 0.148 0.379 0.325]

矩阵不变时,τ 越小损失越低,因为分布被压成一个几乎确定的判断。这里的矩阵对角线本来就是最大值,所以压得越狠损失越小。训练时矩阵会随参数变化,τ 过小会让模型对噪声过度敏感,判断错误的那一步产生的梯度也更大。论文报告 τ=0.01 与 τ=1 都会损害检索性能,最终取 0.1,这是实验比较的结果。

练习题 ​

  1. 一个批次有 N=32 对图文,完全均匀分配时损失是多少?
  2. 若某一行模型给配对报告的概率是 0.05,这一行的损失是多少?
  3. 损失为 0.0964 而 log⁡4=1.3863,能否据此说模型已经学好了?

拷打 AI ​

  1. ConVIRT 的损失由哪几部分组成?把式子写出来。 及格标准:两个方向的 InfoNCE 按权重合并,L=1N∑i[λℓi(v→u)+(1−λ)ℓi(u→v)]。
  2. λ 与 τ 各取多少?是怎么定下来的? 及格标准:λ=0.75,τ=0.1,由 RSNA 分类任务上的线性评估验证分数比较确定。
  3. softmax 的输出能否当作真实概率? 及格标准:不能。它是模型内部的归一化匹配分布,没有经过校准。
  4. 论文说 τ=0.01 会损害性能,给出理论解释了吗? 及格标准:没有。论文只报告了实验比较结果。

参考答案 ​

  1. log⁡32≈3.466。
  2. −log⁡0.05≈2.996。
  3. 不能。这个损失只说明模型在本批次内做出了比均匀分配更集中的判断,是否学到了可迁移的表示要看验证集与下游任务。

暂时不需要掌握 ​

常见错误 ​

错误 1 · 把 softmax 输出当真实概率

原因:数值和为 1,看起来像概率分布。 解决:它是归一化的相对匹配权重,未校准。要当概率用,需要额外的校准步骤。

错误 2 · 漏掉温度

原因:把 exp⁡(⟨v,u⟩) 直接代入 softmax。 解决:检查分子分母是否都带 1/τ,ConVIRT 用 τ=0.1。

错误 3 · 把损失低于 log N 当成学好的证据

原因:只看训练批次内的损失,忽略验证与下游表现。 解决:损失低于 log⁡N 只说明本批次内的相对排序变好,是否学到可迁移的表示要另外验证。