不少人工智能學者都在抱怨目前的 AI 頂級會議接收論文數量大幅膨脹,論文質量也顯著降低,其中有一部分經不起復現的推敲。最近,在 Reddit 上一個「較真」的網友就對 CVPR2018 的一篇大會接收論文進行復現,發現了其中的問題。此貼在 Reddit 上引起了衆人的熱烈討論,其中包括對學術會議同行評審機制的審視。
git
po 主在 Reddit 中稱,「《Perturbative Neural Networks》一文提出用 1x1 卷積代替 3x3 卷積,輸入中應用了一些噪聲。做者稱這種作法表現良好,但個人復現結果並不理想,所以我決定對其進行測試。做者提供了他們用的代碼,可是通過仔細檢查,我發現他們的測試準確率計算有誤,致使得出的全部結果無效。」github
原論文連接:https://arxiv.org/abs/1806.01817docker
po主測試地址:https://github.com/michaelklachko/pnn.pytorchapp
CVPR 論文復現發現問題機器學習
下面,先讓咱們細緻過一遍 po 主在復現這篇論文時發現的問題,他主要發現測試準確率計算無效,所以加噪聲或採用 1×1 的卷積也沒有更好的效果。ide
原始實如今第一層上使用常規卷積,其他各層使用 fanout=1,這意味着每一個輸入通道都被一個噪聲掩碼擾亂。函數
然而,原始實現最大的問題在於測試準確率計算有誤。做者沒有使用經常使用的計算方法算出測試集中正確樣本與所有樣本的比值,而是在以每批爲基礎計算準確率,並應用平滑權重(測試準確率=0.7 * prev_batch_accuracy + 0.3 * current_batch_accuracy)。性能
如下是論文中所用方法與正確準確率計算的比較:學習
運行這個模型(在 CIFAR10 上訓練 noiseresnet18),原始代碼得出的最佳測試準確率爲 90.53%,而實際最佳測試準確率爲 85.91%。測試
在糾正了這個問題以後,我進行了大量的測試,想看看擾亂的輸入和噪音覆蓋會不會帶來什麼好處,但最終我得出的結論是:並無。
下面的例子展現了幾個 ResNet-18 變體的不一樣:下降過濾器數量以保證相同參數數量的基線模型;除了第一層,其它層都只使用 1×1 卷積(無噪音)的模型;以及除第一層外全部層使用擾動後接 1×1 卷積。這三個模型大約都有 550 萬個參數:
在整個訓練過程當中,常規 resnet 基線模型和 PNN 之間的準確率差值保持在 5% 左右,而且添加噪聲掩碼比沒有任何噪聲的等效「受損」resnet 提高不到 1 %。
做者對源代碼,尤爲是 PerturbLayer class 進行了一些修正,包括 --nmasks、--mix_maps 和--train_masks 等等。最後,做者使用了基線模型 resnet18 和原實現中的 noiseresnet18。此外,perturb_resnet18 在使用合適的參數下有足夠的能力替代基線模型與 noiseresnet18。
CIFAR-10:
基線測試準確度:91.8%;採用帶有 3×3 卷積的常規 ResNet-18,卷積核的數量下降到與 PNN 參數量至關的水平。
原始實現的測試準確度:85.7%;至關於下載原始 GitHub 實現項目的代碼並運行。
與原始實現相同,可是將 first_filter_size 修正爲 3 會將準確度提高到 86.2%。
與上面實現相同,可是不帶任何噪聲會實現 85.5% 的測試準確度;resnet18 在第一層使用 3×3 的卷積,在後面會保留 1×1 的卷積。
在 PNN 的全部層級使用均勻噪聲,測試準確度爲 72.6%。
在 PNN 除第一層外的全部層使用噪聲掩碼,測試準確度爲 82.7%;其中第一層使用常規的 3×3 卷積。
與上面實現相同,可是使用—no-unique_masks 參數,這表示相同一組掩碼會做用於每個輸入通道,測試準確率爲 82.4%
訓練噪聲掩碼,測試準確率爲 85.9%,噪聲掩碼每個批量更新一次,與常規模型參數同時更新。
問題與實驗結論
原論文中的第 3.3 節和 3.4 節闡述瞭如何經過找到 PNN 參數來複現常規 CNN 的輸出。問題在於,它只適用於單個輸入 x。所以,對於任何給定的輸入 x,PNN 可能找到計算正確輸出 y 所需的權重,但這並不表明它能夠爲數據集中的全部輸入樣本找到權重。
直覺告訴我,PNN 彷佛缺少常規 CNN 最主要的特徵提取特性:它不能經過卷積核直接匹配任何空間模式。
彷佛用噪聲干擾層輸入沒有任何顯著的好處,不帶噪聲掩碼的簡單 1x1 卷積性能沒有顯著提高。無論咱們如何應用噪聲掩碼,使用 1x1 卷積形成的準確率損失都很嚴重(即便不修改第一層,在 CIFAR-10 上的準確率也要降低約 5% )。因爲準確度計算方法有誤,做者發表的結果無效。
做者回應與 Reddit 討論
其實,在收到反饋後,該論文做者也對 po 主提出的問題做出了積極迴應:
我是原文一做。大約三週前,咱們才知道這件事,並展開了調查。我感激 Michael 復現 PNN 論文並把這個問題帶給咱們。咱們計劃透徹分析下這篇文章,在十分肯定以後給出進一步的迴應。可視化器中光滑函數的默認配置是疏忽點,咱們進行了修改。現在,咱們正在從新運行全部實驗,並將把最新結果更新到 arXiv 論文與 Github 上。此外,若是分析表示咱們的結果遠不如 CVPR 論文中報告的,咱們會撤回此論文。話雖如此,基於個人初步評估,在他的實現中選擇合適的過濾器、噪聲等級和優化方法,我目前可以在 CIFAR-10 上達到 90%-91% 的準確率,用的也是他選擇的參數。但沒有仔細過一遍以前,我也不想談論太多。
Felix Juefei Xu 的迴應獲得了你們的支持與承認,但一樣也引出了另外一個問題:同行評審流程中對實驗結果的復現。也許,這纔是背後的關鍵。
用戶 RoboticGreg 表示:
總的來講,論文評審過程不包含復現實驗結果。根據個人經驗,評審者不得不在很大程度上依靠做者的誠信。評審者常常自問,做者是否使人信服地、準確地陳述了問題,並根據實驗的結構和他們提出的結果得出了正確的結論。
代碼錯誤、精細的實驗過程當中存在的問題一般在論文發表以後纔會被發現,就像本文中提到的這一案例。
用戶 tkinter76 也認爲:
我認爲(CVPR2018 的)論文評審者根本沒有運行代碼,緣由以下:
實現有時不會隨論文一塊兒提交
把一切都弄穩當太耗時間
一般人們缺少在合理的時間內從新運行全部步驟所需的資源
所以同行評審一般更關心論文中描述的方法。潛在的解決辦法是要求做者提交現成的實現(如經過 docker)。然而,在哪裏運行仍然是一個問題。也許 AWS 資源等能夠從提交費用中提取,供評審人員從新運行模型。而後,問題是確保評審人員不會「濫用」資源進行他們本身的實驗等。在任何狀況下,「經過計算的方法」進行 DL 論文評審都很棘手。
其實,學術社區已經注意到這一問題。去年 ICML 學術會議上,「機器學習復現 Workshop」就對這一問題進行過討論,並於 2018 年舉辦了 ICLR 2018 復現挑戰賽,目的就是保證接收論文公佈的結果是可靠的、可復現的。
在機器學習愈發火熱的今天,如何在論文提交與參會人數激增的狀況下保證接收論文與大會的質量,是學術會議面臨的巨大挑戰,也急需社區能給出可行的解決方案。
參考連接:https://www.reddit.com/r/MachineLearning/comments/9jhhet/discussion_i_tried_to_reproduce_results_from_a/
https://github.com/michaelklachko/pnn.pytorch