0
典型的度量學習論文會提出一個新的損失函數(shù)或訓練過程,然后在一些數(shù)據集上顯示結果,如 CUB200、Stanford Cars 和 Stanford Online 產品。每隔幾個月,我們都會看到準確度有所提高。
這真的是太好了,但有幾點要注意。

這里有一張隨機圖
有些論文對比對象不一致
為了說明一種新的算法優(yōu)于現(xiàn)有的方法,保持盡可能多的參數(shù)不變是很重要的。這樣,我們可以確定是新算法提高了性能,而不是一個無關的參數(shù)提高了性能。但是在基準度量學習論文中并非如此:
1.網絡架構并沒有保持不變。有些論文用 GoogleNet,而最近的許多論文都在使用 BN-Inception,有時被稱為 batch 標準化的開端「Inception with Batch Normalization」。2017 年一篇被廣泛引用的論文使用 ResNet50,然后聲稱獲得了巨大的性能提升。這是值得懷疑的,因為與之對比的方法使用的是 GoogleNet,這是一個不太強大的架構。因此,大部分性能提升可能來自網絡架構的選擇,而不是他們提出的方法。
2.圖像增強并沒有保持不變。大多數(shù)論文聲稱應用以下變換:將圖像大小調整為 256 x 256,隨機裁剪為 227 x 227,并以 50% 的幾率進行水平翻轉。但最近一些論文的官方開源實現(xiàn)表明,他們實際上使用的是 GoogleNet 論文中描述的更復雜的裁剪方法(見「訓練方法」)。
3.性能提升技巧在論文中沒有提及。在最近一篇 2019 年論文的官方開源代碼中,主干模型的 BatchNorm 參數(shù)在訓練期間被凍結。作者解釋說,這有助于減少過度擬合,讓 CUB200 數(shù)據集的性能提高 2 個點。但他們的論文中并沒有提到這一點。

在 ImageNet 上預先訓練的模型的準確性。使用 PCA 將輸出嵌入大小減少到 512。對于每個圖像,較小的邊被縮放到 256,然后中心裁剪到 227x227。
大多數(shù)論文使用的是簡單的訓練/測試拆分
他們對一部分數(shù)據進行訓練,找到在測試集上表現(xiàn)最好的模型,并報告這個數(shù)字。換句話說,它們不使用驗證集。因此,超參數(shù)被調整,整個算法都是由測試集的直接反饋創(chuàng)建的。這打破了 Machine Learning 101 的最基本規(guī)則。此外,同一個模型訓練/測試分離的方法已使用多年。隨著時間的推移,這兩個因素可能會導致測試集的過度擬合。
所以讓我們正確地對這些算法進行基準測試
這就是強大的基準測試被用到的地方。

為什么要用這個工具?
透明性。你運行的每個實驗都附帶了詳細的配置文件,這些文件精確地顯示了使用了哪些模型、損失、轉換等等。所以現(xiàn)在我們可以公平地比較各種方法的優(yōu)缺點。
更好的性能衡量指標。使用比回憶更具信息性的指標。
用正確的方法測量精度。在多個基于類的訓練/val/測試分段上測量精度?;蛘吣憧梢允褂门f的 50/50 訓練/測試拆分進行比較。
保存詳細的記錄。在 Tensorboard 上查看有關訓練過程的深入信息。
配置文件的靈活性。通過配置文件控制實驗的大部分標準。通過合并現(xiàn)有的配置文件來擴展現(xiàn)有配置文件。下面是如何指定模型的示例:
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
算法的靈活性。混合匹配損失、函數(shù)、采樣器和訓練方法。要使用硬批處理的多相似性損失?沒問題:
loss_funcs:
metric_loss:
MultiSimilarityLoss:
alpha: 0.1
beta: 40
base: 0.5
mining_funcs:
post_gradient_miner:
BatchHardMiner: {}
訪問 torchvision 和 pretrainedmodels 包中的所有模型。在配置模型文件中,只需指定出現(xiàn)在 torchvision 或 pretrainedmodels 中的函數(shù)名。
獲取 torch.nn 和 pytorch_metric_learning 中的所有損失。在 config_loss_and_miners 文件中,只需指定出現(xiàn)在 torch.nn 或 pytorch_metric_learning 中的類名。
它真的有用嗎?
下表是在 CVPR 2019 和 ICCV2019 上發(fā)表的一系列度量學習論文的結果。每種顏色代表不同的模型和嵌入大小配置。由于沒有標準的實驗方法,很難比較各種算法的性能。這阻礙了研究進展,因為我們不知道哪種方法最有效。因此,重要的是要有一個基準工具,使我們能夠做公平的比較。

綠色:BN-Inception,512;藍色:Blue: Resnet50, 128;黃色:Resnet50, 512;紅色:GoogleNet, 512。前 8 行的數(shù)字來自各自的論文。
要查看這些實驗和其他實驗的配置文件,請參閱此電子表格,我將隨時間添加到其中:https://docs.google.com/spreadsheets/d/1kiJ5rKmneQvnYKpVO9vBFdMDNx-yLcXV2wbDXlb-SB8/edit?usp=sharing
表格的底部是使用基準測試工具獲得的結果。 triplet loss 和 contrastive loss 都接近最新水平。然而,這兩種方法常常被排除在結果表之外,或者被認為是性能最差的方法之一。強大的基準測試程序使檢查這些基準算法變得容易。
寫在最后
你對這個工具的看法和度量學習的現(xiàn)狀怎么看?如果你有任何問題或想添加某些功能,請訪問 GitHub repos 以了解強大的 powerful_benchmarker 和 pytorch_metric_learning 。
via:https://medium.com/@tkm45/benchmarking-metric-learning-algorithms-the-right-way-90c073a83968
雷鋒網雷鋒網雷鋒網
雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知。