36

用正确方法对度量学习算法进行基准测试

 4 years ago
source link: https://www.leiphone.com/news/201912/7h7bL9vTEsagyQyx.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

典型的度量学习论文会提出一个新的损失函数或训练过程,然后在一些数据集上显示结果,如 CUB200、Stanford Cars 和 Stanford Online 产品。每隔几个月,我们都会看到准确度有所提高。

这真的是太好了,但有几点要注意。

UVJjyuq.png!web

这里有一张随机图

有些论文对比对象不一致

为了说明一种新的算法优于现有的方法,保持尽可能多的参数不变是很重要的。这样,我们可以确定是新算法提高了性能,而不是一个无关的参数提高了性能。但是在基准度量学习论文中并非如此:

1.网络架构并没有保持不变。有些论文用 GoogleNet,而最近的许多论文都在使用 BN-Inception,有时被称为 batch 标准化的开端「Inception with Batch Normalization」。2017 年 一篇被广泛引用的论文 使用 ResNet50,然后声称获得了巨大的性能提升。这是值得怀疑的,因为与之对比的方法使用的是 GoogleNet,这是一个不太强大的架构。因此,大部分性能提升可能来自网络架构的选择,而不是他们提出的方法。

2.图像增强并没有保持不变。大多数论文声称应用以下变换:将图像大小调整为 256 x 256,随机裁剪为 227 x 227,并以 50% 的几率进行水平翻转。但最近一些论文的官方开源实现表明,他们实际上使用的是 GoogleNet 论文中描述的更复杂的裁剪方法(见「训练方法」)。

3.性能提升技巧在论文中没有提及。在最近一篇 2019 年论文的官方开源代码中,主干模型的 BatchNorm 参数在训练期间被冻结。作者解释说,这有助于减少过度拟合,让 CUB200 数据集的性能提高 2 个点。但他们的论文中并没有提到这一点。

Fvu6ra7.png!web

在 ImageNet 上预先训练的模型的准确性。使用 PCA 将输出嵌入大小减少到 512。对于每个图像,较小的边被缩放到 256,然后中心裁剪到 227x227。

大多数论文使用的是简单的训练/测试拆分

他们对一部分数据进行训练,找到在测试集上表现最好的模型,并报告这个数字。换句话说,它们不使用验证集。因此,超参数被调整,整个算法都是由测试集的直接反馈创建的。这打破了 Machine Learning 101 的最基本规则。此外,同一个模型训练/测试分离的方法已使用多年。随着时间的推移,这两个因素可能会导致测试集的过度拟合。

所以让我们正确地对这些算法进行基准测试

这就是强大的基准测试被用到的地方。

iiEfya7.png!web

为什么要用这个工具?

透明性。你运行的每个实验都附带了详细的配置文件,这些文件精确地显示了使用了哪些模型、损失、转换等等。所以现在我们可以公平地比较各种方法的优缺点。

更好的性能衡量指标。使用比回忆更具信息性的指标。

用正确的方法测量精度。在多个基于类的训练/val/测试分段上测量精度。或者你可以使用旧的 50/50 训练/测试拆分进行比较。

保存详细的记录。在 Tensorboard 上查看有关训练过程的深入信息。

配置文件的灵活性。通过配置文件控制实验的大部分标准。通过合并现有的配置文件来扩展现有配置文件。下面是如何指定模型的示例:

models:  
        trunk:  
              bninception:  
                     pretrained: imagenet  
       embedder:  
              MLP:
                     layer_sizes:  
                            - 512 

下面是如何合并 3 个配置文件的方法:

python run.py \  
--experiment_name test \  
--config_general default daml train_with_classifier 

加大命令行的灵活性。使用标准 Python 字典表示法指定复杂配置选项:

python run.py \  
--experiment_name test \  
--optimizers {metric_loss_optimizer: {SGD: {lr: 0.01}}} 

更多详情,请查看相关 github 项目: https://github.com/KevinMusgrave/powerful_benchmarker#override-config-options-at-the-command-line

算法的灵活性。混合匹配损失、函数、采样器和训练方法。要使用硬批处理的多相似性损失?没问题:

loss_funcs:  
        metric_loss:  
              MultiSimilarityLoss:  
                     alpha: 0.1  
                     beta: 40  
                     base: 0.5  
 
mining_funcs:  
       post_gradient_miner:  
              BatchHardMiner: {}  

访问 torchvision 和 pretrainedmodels 包中的所有模型。在配置模型文件中,只需指定出现在 torchvision 或 pretrainedmodels 中的函数名。

获取 torch.nn 和 pytorch_metric_learning 中的所有损失。在 config_loss_and_miners 文件中,只需指定出现在 torch.nn 或 pytorch_metric_learning 中的类名。

它真的有用吗?

下表是在 CVPR 2019 和 ICCV2019 上发表的一系列度量学习论文的结果。每种颜色代表不同的模型和嵌入大小配置。由于没有标准的实验方法,很难比较各种算法的性能。这阻碍了研究进展,因为我们不知道哪种方法最有效。因此,重要的是要有一个基准工具,使我们能够做公平的比较。

IBbU3uf.png!web

绿色:BN-Inception,512;蓝色:Blue: Resnet50, 128;黄色:Resnet50, 512;红色:GoogleNet, 512。前 8 行的数字来自各自的论文。

要查看这些实验和其他实验的配置文件,请参阅此电子表格,我将随时间添加到其中: https://docs.google.com/spreadsheets/d/1kiJ5rKmneQvnYKpVO9vBFdMDNx-yLcXV2wbDXlb-SB8/edit?usp=sharing

表格的底部是使用基准测试工具获得的结果。 triplet loss 和 contrastive loss 都接近最新水平。然而,这两种方法常常被排除在结果表之外,或者被认为是性能最差的方法之一。强大的基准测试程序使检查这些基准算法变得容易。

写在最后

你对这个工具的看法和度量学习的现状怎么看?如果你有任何问题或想添加某些功能,请访问 GitHub repos 以了解强大的 powerful_benchmarkerpytorch_metric_learning

via: https://medium.com/@tkm45/benchmarking-metric-learning-algorithms-the-right-way-90c073a83968

雷锋网 (公众号:雷锋网) 雷锋网雷锋网

雷锋网版权文章,未经授权禁止转载。详情见 转载须知

b6Zvmyn.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK