0.2 怎么判断模型配得对不对
0.1 给出了相似度矩阵
本节把
0.2.1 从一行相似度到一组匹配权重
以胸片 C 那一行为例。它与其他四份报告的相似度是四个数:
模型已经知道报告 C 最像,但
解释一下什么是 softmax :其实就是归一化,把一组原始分数变成一组总和为1的权重,上式分子为第 i 项的分数,分母为所有项的分数之和
通过取指数把任意实数变成正数,归一化后各项之和为
0.2.2 负对数似然
正确的那一项权重越高,说明模型把匹配质量集中到了对的地方。为了得到一个随错误程度增大的数:取它的负对数:
若模型给配对报告
下式为 ConVIRT 的图像到文本方向的损失,也就是上式的完整展开形式:
把每一项对上手头的对象,这个式子里没有陌生的东西:分子是第
0.2.3 两个方向与权重
图像去找文本是一个方向,文本去找图像是另一个方向,后者是
两个方向按权重
ConVIRT 取
这个式子在论文里被读作一个
这里其实存在两层合并:第一层是把两个方向的任务合并,第二层是把一个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 作为参照
0.2.5 温度
ConVIRT 在论文表 4 中报告,
深度学习实际上是一个造假率颇高的领域,因为其中有大量参数是凭借经验和炼丹算出来的,所以也希望这里能让大家去去魅
代码验证
从
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 两行的损失为零(显示为
再看温度的影响:
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]矩阵不变时,
练习题
- 一个批次有
对图文,完全均匀分配时损失是多少? - 若某一行模型给配对报告的概率是
,这一行的损失是多少? - 损失为
而 ,能否据此说模型已经学好了?
拷打 AI
- ConVIRT 的损失由哪几部分组成?把式子写出来。 及格标准:两个方向的 InfoNCE 按权重合并,
。 与 各取多少?是怎么定下来的? 及格标准: , ,由 RSNA 分类任务上的线性评估验证分数比较确定。 - softmax 的输出能否当作真实概率? 及格标准:不能。它是模型内部的归一化匹配分布,没有经过校准。
- 论文说
会损害性能,给出理论解释了吗? 及格标准:没有。论文只报告了实验比较结果。
参考答案
。 。 - 不能。这个损失只说明模型在本批次内做出了比均匀分配更集中的判断,是否学到了可迁移的表示要看验证集与下游任务。
暂时不需要掌握
- 交叉熵与最大似然的关系,见 4.1 基础熵与互信息
- 指数族分布与 softmax 的联系,见 4.3 最大熵、指数族与信息几何
- 经验风险最小化的完整框架,见 3.1 优化问题的语言与分类
常见错误
错误 1 · 把 softmax 输出当真实概率
原因:数值和为
错误 2 · 漏掉温度
原因:把
错误 3 · 把损失低于 log N 当成学好的证据
原因:只看训练批次内的损失,忽略验证与下游表现。 解决:损失低于