典型的度量學習論文會提出一個新的損失函數或訓練過程,然後在一些數據集上顯示結果,如 CUB200、Stanford Cars 和 Stanford Online 產品。每隔幾個月,我們都會看到準確度有所提高。
這真的是太好了,但有幾點要注意。
這裡有一張隨機圖
有些論文對比對象不一致
為了說明一種新的算法優於現有的方法,保持儘可能多的參數不變是很重要的。這樣,我們可以確定是新算法提高了性能,而不是一個無關的參數提高了性能。但是在基準度量學習論文中並非如此:
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 個點。但他們的論文中並沒有提到這一點。
在 ImageNet 上預先訓練的模型的準確性。使用 PCA 將輸出嵌入大小減少到 512。對於每個圖像,較小的邊被縮放到 256,然後中心裁剪到 227x227。
大多數論文使用的是簡單的訓練/測試拆分
他們對一部分數據進行訓練,找到在測試集上表現最好的模型,並報告這個數字。換句話說,它們不使用驗證集。因此,超參數被調整,整個算法都是由測試集的直接反饋創建的。這打破了 Machine Learning 101 的最基本規則。此外,同一個模型訓練/測試分離的方法已使用多年。隨著時間的推移,這兩個因素可能會導致測試集的過度擬合。
所以讓我們正確地對這些算法進行基準測試
這就是強大的基準測試被用到的地方。
為什麼要用這個工具?
透明性。你運行的每個實驗都附帶了詳細的配置文件,這些文件精確地顯示了使用了哪些模型、損失、轉換等等。所以現在我們可以公平地比較各種方法的優缺點。
更好的性能衡量指標。使用比回憶更具信息性的指標。
用正確的方法測量精度。在多個基於類的訓練/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 上發表的一系列度量學習論文的結果。每種顏色代表不同的模型和嵌入大小配置。由於沒有標準的實驗方法,很難比較各種算法的性能。這阻礙了研究進展,因為我們不知道哪種方法最有效。因此,重要的是要有一個基準工具,使我們能夠做公平的比較。
綠色: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_benchmarker 和 pytorch_metric_learning 。
via:https://medium.com/@tkm45/benchmarking-metric-learning-algorithms-the-right-way-90c073a83968
雷鋒網雷鋒網雷鋒網(公眾號:雷鋒網)
雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。