機器之心報導,機器之心編輯部。
今年 9 月,機器之心報導了「CVPR 2018 論文復現爭議」事件,引起了極大的關注,當時作者表示自己也在仔細檢查論文。今天,經過兩個多月的苦戰,一作(華人,當時文章未特意指出擔心帶偏節奏)給出了一份小編覺得很有態度的結果,並在結語中分享了自己兩個月來的感受,希望能對讀者有所啟發。「讓我們繼續探索、研究、分享吧!」
今年 9 月,reddit 網友 Michael Klachko 對 CVPR 2018 的一篇接收論文《Perturbative Neural Networks》提出質疑,他在對論文的復現過程中發現了一些問題:「《Perturbative Neural Networks》一文提出用 1x1 卷積代替 3x3 卷積,輸入中應用了一些噪聲。作者稱這種做法表現良好,但我的復現結果並不理想,因此我決定對其進行測試。作者提供了他們用的程式碼,但是經過仔細檢查,我發現他們的測試準確率計算有誤,導致得出的所有結果無效。」
在收到反饋後,論文作者做出了積極回應,稱他們「計劃透徹分析下這篇文章,在十分確定之後給出進一步的回應。視覺化器中光滑函式的預設配置是疏忽點,我們進行了修改。」
今天,《Perturbative Neural Networks》論文作者給出了修改後的結果,他調查了 Michael Klachko 的實現過程,並在 GitHub 上給出了分析結果:(1)Michael 聲稱的效能下降(約 5%)主要原因在於其在 PNN 實現過程與論文作者給出的程式碼存在多處不一致,以及選擇的超引數並非最優。(2)PNN 方法在實踐中是有效的。
原論文連結:arxiv.org/abs/1806.01…
Michael Klachko 的測試程式碼:github.com/michaelklac…
原始 PNN GitHub repo:github.com/juefeix/pnn…
更新版 PNN GitHub repo:github.com/juefeix/pnn…
以下是論文作者在 GitHub 中給出的具體更新內容:
該 repo 包含新的 PNN 程式碼,以及對最近 reddit 討論中所提出問題的回應。這份程式碼基於Michael Klachko 的測試程式碼,對 model.py 和 main.py 做了輕微修改。所有修改都做了標註。
針對此次 Reddit 事件的回應
第一部分:Michael Klachko 實現中的不一致
根據我們的分析,Michael 帖子中提到的效能下降(約 5%)主要是由於 Michael Klachko 的 PNN 實現的多處不一致以及超引數的次優選擇。
由於 PNN 實現以及超引數的選擇都不是最優的,MK 的實現在 CIFAR-10 上得到的最佳效能約為 85-86%,比論文中的結果下降了 5%。
將 MK 的實現與我們的實現進行比較之後,我們發現二者存在以下不同之處:
優化方法不同:MK 用的是 SGD,我們的實現用的是 Adam。
加性噪聲(additive noise)的級別不同:MK 用的是 0.5,我們用的是 0.1。
學習率不同:MK 用的是 1e-3,我們用的是 1e-4。
學習率排程不同。
Conv-BN-ReLU 模組順序不同。
使用的 dropout 不同,MK 用的是 0.5,我們沒有使用。
上述不一致之處見下圖。左邊為 MK 的實現,右邊為我們的實現。
基於有限次數的嘗試,我們發現前兩個不一致(優化方法和噪聲級別)對 PNN 效能的負面影響最大。優化方法的選擇確實非常重要,在小規模實驗中,每種優化方法(SGD、Adam、RMSProp 等)會導致差異巨大的優化路徑。加性噪聲級別的選擇也非常重要,我們將在第三部分進行討論。
讓我們來看一下設定了正確的超引數之後 PNN 表現如何。保持噪聲掩碼不變(--nfilters 128),我們可以得到 90.35% 的準確率,而不是 MK 得到的~85-86% 的準確率。
e 1e-4 --first_filter_size 3 --level 0.1 --optim-method Adam --nepochs 450
複製程式碼
第二部分:關於 CVPR 論文的結果
截至目前,對這篇 CPVR 論文《Perturbative Neural Networks》實驗的重新評估大多已完成。有少數實驗受到光滑函式中錯誤預設配置的影響。這些受影響的實驗效能都略有下降,不過可以通過增加網路引數(如噪聲掩碼的數量)來彌補。我們將更新 arXiv 版本中的結果。
原始的 CPVR 論文不包括以下內容。
第三部分:在所有層中應用均勻加性噪聲
接下來要討論的內容沒有涵蓋在原始 CVPR 論文中,將在 PNN 後續研究中進一步探討。其中一個主題是在所有層應用擾動噪聲,包括第一層。
在 CVPR 版的 PNN 論文中,第一層使用了 3x3 或 7x7 的空間卷積作為特徵提取,所有後續層使用擾動噪聲模組,這一點也可以從原始 PNN GitHub repo 中看到。由於 MK 嘗試並實現的是在 PNN 的所有層應用擾動噪聲,因此提供我們的見解可能會有幫助。
根據 MK 的測試(截圖如下所示),在所有層(包括第一層)應用均勻噪聲的 PNN 在 CIFAR-10 上達到了 72.6% 的準確率。在此我們提供了一個簡單的解決方案(沒有對 MK 的實現做很大的改動),使準確率達到約 85-86%。我們想說明的一點是,這仍然是關於 PNN 的很多正在進行的研究主題之一,我們將在後續工作中報告研究結果。
我們從 class PerturbLayer(nn.Module) 建立了一個名為 class PerturbLayerFirst(nn.Module) 的重複類(duplicate class),以區別對待第一層中的噪聲模組。大多數改動都發生在 class PerturbLayerFirst(nn.Module) 和 class PerturbResNet(nn.Module) 內。
關於該修改的主要想法是:
我們需要更多的噪聲掩碼。使用三個高度相關(RGB 通道)的基本影像來建立 128 或 256 噪聲擾動的響應圖是不夠的。解決方案參見:
噪聲等級的選擇是次優的,需要為第一層放大。在 MK 的實現中,第一層輸入和後續層經歷了不同的歸一化,且動態範圍也非常不同。解決方案如下:
因此,改動之後,帶有所有層噪聲擾動模組的 PNN 達到了 85.92% 的準確率,而不是 MK 報告中的 72.6%。通過用最優方式控制不同層的噪聲等級,我們能夠獲得更高的準確率。更多細節將在進一步分析後提供。
python main.py --net-type 'perturb_resnet18' --dataset-test 'CIFAR10' --dataset-train 'CIFAR10' --nfilters 256 --batch-size 20 --learning-rate 1e-4 --first_filter_size 0 --filter_size 0 --nmasks 1 --level 0.1 --optim-method Adam --nepochs 450複製程式碼
為什麼噪聲等級如此重要?
正如我在 PNN 論文中所討論的,我們獲得了噪聲等級和卷積濾波器大小之間的關係,即當計算區域性卷積運算時要考慮多少鄰域(neighbor)?在 PNN 中,可以把加性噪聲視為對映函式的引數,該對映函式將輸入圖上的一個畫素對映到輸出響應圖的對應畫素上。正如傳統卷積,在每個區域性 patch 中,卷積運算通過中心畫素的所有鄰域與濾波器權重的點積將中心畫素對映到響應圖中的對應畫素上。
以上兩種對映函式都可以看做特徵提取方法,或者選取度量的方式。如果噪聲等級太低,我們就沒有選取到有效的輸入度量。而如果噪聲等級太高,噪聲就會掩蓋訊號,輸入中有意義的資訊就會受到損失。因此,選擇合適的噪聲對於 PNN 的效能有很大影響。
在 PNN 的早期研究中,我們仍然按照經驗決定噪聲等級。
第四部分:為什麼 PNN 奏效?
在論文《Local Binary Convolutional Neural Networks》(LBCNN)中,我們嘗試回答這個問題:我們真的需要可學習的空間卷積嗎?結果表明,我們不需要。使用二值或高斯濾波器加上可學習的通道池化的不可學習隨機卷積同樣表現很好。據此,下一個自然要問的問題就是:我們真的需要空間卷積嗎?也許另一種特徵提取技術(和加性噪聲一樣簡單)加上可學習的通道池化也能表現很好?這正是《Perturbative Neural Networks》論文嘗試探索的問題。
實際上,該 repo 中執行的第一個指令碼已經使用了 PNN 中第一層的不可學習隨機卷積。請檢視 model.py 的第 513 行。讀者可以對那一行進行註釋,然後它會返回第一層的通常的可學習卷積。它們實現的準確率是相同的。
可學習通道池化和不可學習卷積濾波器之間的混合讓我們重新思考深度 CNN 模型中卷積濾波器的作用。通過多種視覺分類任務,我觀察到 LBCNN 和 CNN 可以實現相當的效能。LBCNN 的靈活性或許意味著,我們可以在沒有可學習卷積濾波器的條件下完成同樣的任務,具備不變濾波器的隨機卷積加上可學習通道池化在學習有效的影像表徵上已經完全足夠。
基於這些觀察結果,很自然地,進一步的研究方向之一是完全取代隨機卷積運算。在每個區域性 patch 中,由於線性操作涉及中心畫素的所有鄰域和一組隨機濾波器權重的點積來產生標量輸出,該輸出以某種方式攜帶區域性資訊(即在響應圖中將中心畫素對映到相應的輸出畫素)。或許最簡單的替代性線性操作就是加性隨機噪聲了。這也是 PNN 後續工作的動機,其中我引入了一種非常簡單但有效的模組——擾動層(perturbation layer),作為卷積層的替代。擾動層摒棄了傳統卷積的工作方式,而是計算非線性啟用加性噪聲擾動輸入的加權線性組合作為響應。
我們對 LBCNN 的實驗表明,在深度神經網路中通過隨機卷積結合可學習的通道池化進行隨機特徵提取也可以學習有效的影像特徵,並且我們認為 PNN 中的加性隨機噪聲是這類隨機特徵提取中最簡單的一種方法。
第五部分:結語
這篇文件即將收尾,我不禁開始回憶過去這兩個月的經歷。我得承認,當 Michael Klachko 決定在 Reddit 上公開他所發現的問題時,我有些震驚,尤其是在那之前我已經同意檢視他發現的問題。一週內,那篇 reddit 帖子迅速引起了中國多個主流技術/AI 媒體的關注,並在中國社交媒體上迅速分享,閱讀量超過 100 萬。一些文章和評論非常嚴苛刺耳,不過也有一些比較理智公正。堅強如我,彼時彼刻也承受了很大壓力。
不過我意識到,作為科研人員,接受大眾的審查不是一種選擇,而是責任。因此,我真的非常感謝 Michael,他不僅願意花費時間和精力驗證已經發布的方法,更重要的是,當發現事情不對勁時他能夠及時說出來。我堅信通過這些努力,我們的社群可以取得真正的進步。
另外,我還想對剛進入這一領域的年輕科研人員或者想進入該領域的大學生(以及高中生)說幾句話。這樣的事的確會發生,但不應該因此而放棄開原始碼或進行開放性研究。開放是 AI 領域迅速發展的核心因素。最近我回了趟中國,有機會和一位高中生聊了聊,他/她熱切地跟我探討批歸一化和組歸一化的實現細節。我非常震驚。對於所有年輕 AI 研究人員和從業者,我真心地鼓勵大家擺脫慣性思維,不要受限於教條,去探索還有待探索的問題,去少有人去的地方,以及最重要的,進行開放性研究,分享自己的程式碼和研究成果。這樣,你就是在幫助社群前進,即使一次只推動一點點。
那麼,讓我們繼續探索、研究、分享吧!