指南
验证训练好的模型
训练好的模型可能在它已经见过的测试集上得分很高,在输入稍有变化时翻转答案,也可能碰上一个幸运的种子。Oloproof 在模型发布前逐一检查这些问题:测试集与训练数据的对照、在声明的噪声下的每个预测,以及跨多个种子的训练配方。用 oloproof init --example model-validation 复制示例:一个由 NumPy 离线在合成数据上训练的贷款模型。
测试集与训练数据的对照
oloproof leakage check --training data/training.jsonl --record每个用例都会在字符串转为小写、空白合并之后,与每一行训练数据做精确匹配比较(--round 对数字取整,--field 指定要比较的键)。训练文件在你的机器上读取,从不存储或发送;记录只保留用例 ID 和计数。在 release.yaml 中声明 leakage: required,门禁就会被阻止(exit 3),直到记录下对该测试集的一次干净检查。在训练数据中发现的用例使证据无效;这不是模型的 FAIL。近似重复不做检查。
噪声下的预测
metamorphic:
transforms:
- name: noise
field: features
perturb: {kind: numeric_noise, scale: {income: 1.0, debt_ratio: 0.02}, seed: 7}
evaluators:
- {type: metamorphic_relation, relation: same_label, transform: noise, field: label, passes_when: flipped}每个用例会得到一个副本,在指定的数字上加入按种子生成的噪声,flips_under_noise 是标签发生变化的用例所占比例。categorical_swap 按声明的映射替换值,blur、brightness、occlusion 和 jpeg 则改变图像。回归模型使用带容差的 same_score_within。人无法判断一行数据上的噪声是否保留了它的含义,因此数值扰动属于声明的变换:它的比率会被报告,基于它的规则结果为 INSUFFICIENT_EVIDENCE 并附 transform_declared。图像变换与文本变换一样,在人的标签表明它保留了每张图像的含义之后才可用于门禁。示例中的 image/ 项目展示了两种情况:一种是经标注检查的模糊,其翻转率超过上限而不通过;另一种是灰色补丁,标注显示它有时会遮住划痕,因此其规则不作判定。
跨种子的配方
你发布的检查点和任何系统一样,由它自己的运行来判定。第二个问题是你的训练方式是否足够好:下个月重新训练,你会得到另一次抽样。用 k 个种子训练 k 个检查点,在同一测试集上分别运行,并为这些运行命名:
seeds:
recipe: loan-model
checkpoints: {seed_1: latest~4, seed_2: latest~3, seed_3: latest~2, seed_4: latest~1, seed_5: latest}
rule: {id: recipe_accurate, criterion: correct, min: 0.8}oloproof seeds seeds.yaml --policy recipe.yaml 读取跨种子的期望通过率,其区间同时计入测试集中的用例和你尝试过的种子。在示例中,五个种子的得分为 85.7% 到 90.3%,配方的结果为 88.2%,区间 83.2% 到 91.9%:相对于 80% 为 PASS。该区间是近似的,因此策略需要 allow_approximate_methods: true,否则答案是 MANUAL_REVIEW。策略必须至少包含一条规则;该命令只读取其置信水平、这项许可和评判者阈值,其他一概不读。它还会列出判定随种子而变的用例,--html FILE 会写出一个离线页面,列出每个检查点下的每个用例。
每个检查点都计入。训练失败的种子会被保留,它没有回答的每个用例在下界按失败计、在上界按通过计,因此会使区间变宽。少于三个种子的结果为 INSUFFICIENT_EVIDENCE;要作出任何判定大约需要五个。门禁不会信任的评判者同样不能判定配方。每个检查点必须运行同一测试集,各自对应一个系统版本,声明了分组的测试集会被拒绝。
这无法告诉你的
- 没有人声明的扰动。只会尝试声明的变换,按声明的幅度进行,低翻转率无法说明更大的变化或攻击者的搜索。
- 认证的鲁棒性。不会为任何输入证明任何界限;翻转率只是测试集用例上的比率。
- 模型是如何训练的。Oloproof 无法看到种子是否在评估任何检查点之前选定,失败的运行是否被丢弃,或者检查点之间是否仅有种子不同。
- 比大约 k 个种子中出现一次更罕见的失败。如果配方十次中有一次训练失败,而五个种子都没有失败,区间无从得知。
- 训练文件没有显示的泄漏:近似重复、调整过尺寸的图像,或用于调参却未放入文件的行。
- 种子运行中的泄漏。oloproof seeds 不读取 leakage: required;你发布的检查点在它自己的运行上接受门禁,而那次运行会读取。
任何评估都无法告诉你的内容见单独的页面。