今天又閱讀了最近的一篇NeurIPS 2020的文章,提出了一個減少圖片空間冗余程度實現動態推理的方法。之前也看過一些減少空間冗余度的,但是本文所用的方法是對於一張圖片來說,裁剪成相同大小的一個個patch以序列的方式輸入到網絡中,同時網絡分為多個階段,分別處理不同的輸入,其核心點有兩個一個是對於圖片patch的定位,其次是實現動態推理。為了划分patch,單獨訓練了一個patch proposal network,為一個RNN結構,其輸入不僅包括patch本身還有每一個階段圖像經過處理后的feature map,通過強化學習的方式進行訓練,在每一次划分的結果輸入普通的圖像CNN網絡中進行預測后與上一個patch的預測結果做對比后返回一個reward,來保證這個patch建議網絡每次都可以盡可能的輸出更具區分度的patch區域。分類器也是一個RNN結構,兩個RNN都是用了GRU,在每一次輸出預測結果后,還將本次的預測結果傳給下一個階段的分類器,也就是RNN的主要原理。在推理層面上也繼續沿用了一貫的budgeted batch classification的測試方法實現動態推理,其代碼具體實現部分在上篇博客里已經有詳細介紹。
paper: https://arxiv.org/abs/2010.05300
code: https://github.com/blackfeather-wang/GFNet-Pytorch
Abstract
通常高分辨率圖像對於CNN來說會有較高的准確性,但它同樣也帶來了較高的計算成本與空間冗余。從事實中可以得知對於一張圖片來說並不是所有的部分都對最后的分類結果相關。我們通過處理一系列相對較小的輸入提出了一種全新的結構,這些較小的輸入是由策略性地通過強化學習的方式從原始圖片當中得出,一旦模型對於預測具有足夠的自信,就可以終止該自適應推理,這個框架可以和現有的輕量級CNN很好的融合,在iPhone XS Max上的MobileNet-v3平均時延降低了20%.
Introduction
CNN已經在224x224,320x320的圖片上取得了非常好的結果,現在甚至有工作將分辨率調整至更大去獲取更高的一個准確率,但是計算開銷是巨大的,並且根據圖像的尺寸大小呈二次方的上漲。本文的目的就是要降低高分辨率圖像中的空間冗余問題。事實上,我們發現CNN只需要通過一些具有類別特性的圖像塊就可以進行正確的分類,例如小狗的頭或者是鳥的翅膀,如果只用在這些部分做處理就可以在得到正確推理的同時減少計算開銷。面對這樣的問題,存在兩個挑戰:
- 如何定義具有類別區分度的區域
- 如何給每個圖片動態的分配資源,畢竟對於不同的圖片其區分度區域的數量和大小都是不一樣
這個框架分為兩個階段,分別是glance和focus,總體被稱為Glance and Focus Network(GFNet)
- glance:具體來說,區域的選擇是一個順序決策的過程,每一個階段我們的模型會處理一個相對較小的輸入生成一個關於類別的預測置信度和下一各區域的建議。由於減小了圖像的尺寸,因此可以高效地完成每個步驟。 例如,推斷96×96圖像補丁的計算成本僅為處理原始224×224輸入的計算成本的18%(尺寸的平方倍)。 整個順序過程始於以降采樣的比例(例如96×96)處理整個圖像,被稱為“掃視”步驟,在該步驟中,模型會使用全局信息對輸入圖像進行快速預測。 在實踐中,我們發現,具有類別區分度特征的大部分圖像已經可以在掃視步驟中以高置信度正確分類。
- focus:在glance步驟未能對其預測結果產生足夠高的置信度時,將輸出最具類別區分度的區域建議,該階段通過迭代的定位和處理圖像中的部分區域,並且以自適應的方式盡可能早的終止。
如下圖所示,在測試時其計算資源會被不均勻的分配給不同的圖像,從而提高效率,對於鷹的圖片在glance階段就已經產生較高置信度表示已得出結果,下面的兩張圖分別經歷了兩次和三次才最終找到一個置信度較高的結果。
值得注意的是,GFNet被設計為通用框架,分類與提議網絡是兩個獨立的模塊,所以可以和大多數輕量級網絡兼容,並且專注於在自適應推理領域提高計算效率。並且,只要我們能確定所需要處理的區域的大小就可以顯著的減少內存,可以充分靈活地利用計算資源,我們也在多種CNN上進行了實驗。
Method
介紹方法的詳細信息。 如前所述,CNN能夠對某些“類別區分”圖像區域(例如狗的臉或鳥的翅膀)產生准確的圖像分類結果。 受此觀察的啟發,我們提出了GFNet框架,旨在通過對最小圖像區域進行計算以獲得可靠的預測來提高CNN的計算效率。 具體而言,GFNet根據圖像的不同區域對最終分類的潛在貢獻,將計算自適應地和漸進地分配給圖像的不同區域,並且一旦網絡有足夠的信心,該過程就會終止。
Overview
對於輸入的\(H\times W\)圖片,我們將處理一系列的\(H'\times W'\) 較小的輸入序列\(\left\{ \tilde{x}_1,\tilde{x}_2,... \right\}\),其中除了\(\tilde{x}_1\)以外都是從原始圖片中的一定區域中裁剪的,裁剪的每一塊的位置是利用先前所有的輸入放入網絡中動態決定的。
理想情況下,輸入對於分類的貢獻度應按照降序排列,所以計算資源應該有限分配給他們,但對於任意一張圖片很難知道第一個patch設置在哪里,所以第一個patch就是原始圖像resize之后的結果。不僅避免了由於隨機定位初始區域而導致在次重要區域上浪費計算的風險,而且還給確定patch區域提供了有利的全局信息
- Inference 在第\(t\)個動態決策的過程中,CNN backbone接受輸入\(\tilde{x}_t\),產生一個\(softmax\)置信度\(p_t\),其中的最大值會和一個預訓練好的閾值作比較,如果大於則輸出結果作為最終預測結果,如果小於則決定下一個被裁減的patch,作為第\(t+1\)階段的輸出。值得注意的是預測\(p_t\)與確定下一個位置是通過兩個循環網絡獲得的,因此它們利用了先前所有的輸入信息,計算閾值的方法和之前介紹的類似。
- Training 在訓練階段,我們取消提前退出,以所有softmax結果中的最大值作為輸出預測,對於patch的定位,我們選擇相鄰兩個階段之間ground truth標簽上softmax預測結果增量最大的patch,也就是意味着一直希望能夠找到網絡當前尚未發現的最具有類別區分度的區域。這一步驟利用策略梯度算法解決不可微(policy gradient algorithm)
GFNet Architecture
網絡結構共包括四個模塊:全局編碼器\(f_G\),局部編碼器\(f_L\),分類器\(f_c\),和一個patch建議網絡\(\pi\)。
-
Global encoder \(f_G\) and local encoder \(f_L\)
兩種都是用來提取圖像特征,共同的網絡結構但是參數不一樣,global用來縮小原始圖片。后面的用於patch,我們使用兩個網絡而不是一個,因為我們發現低分辨率輸入\(\tilde{x}_1\)與高分辨率patch之間存在差異,這會導致單個編碼器的性能下降
-
Classifier \(f_C\)
\(f_C\)是一個循環網絡,將所有先前的輸入信息進行匯總,並在每個步驟產生一個預測,我們假設\(\tilde{x}_t\)輸入編碼器,包含對應的feature map \(e_t\),用一個全局平均池化得到特征向量,然后通過\(p_t=f_C(\overline{e}_t,h_{t-1}^c)\)計算出預測值\(p_t\),\(h_{t-1}^c\)是\(f_C\)的隱含狀態,在第\(t-1\)階段更新。注意,不必為分類器維持着特征圖因為分類通常不依賴空間信息,循環分類器和之前提到的兩個編碼器由下面的loss訓練得到。
\[L_{cls}=\frac{1}{|D_{trian}|}\sum\nolimits_{(x,y)\in{D_{train}}}\left[\frac{1}{T}\sum\nolimits_{t=1}^{T}L_{CE}({p_t},y) \right] \]\(D_{train}\)是訓練集,\(y\)是\(x\)對應的label,\(T\)是輸入序列的最大長度,\(L_{CE}()\)是standard cross-entropy loss function
-
Patch proposal network
這一部分在我看來就是本文的創新點所在,用一個循環網絡決定每張圖片patch的位置,鑒於該網絡的輸出是不可微的裁剪操作,我們將其視為一個agent並且用策略梯度法(policy gradient method)對其進行訓練。在第t個階段,接收\(\tilde{x}_t\)的特征圖\(e_t\),從\(\pi\)建立的一個分布\(l_{t+1}\sim\pi(l_{t+1}|e_t,h_{t-1}^\pi)\)中隨機選取一個區域\(l_{t+1}\),\(h_{t-1}^\pi\)為隱含狀態,\(l_{t+1}\)為下一個patch\(\tilde{x}_{t+1}\)的中心點坐標,在訓練中我們使用一個高斯分布,均值由\(\pi\)輸出,標准差被定義為超參數。在測試時,我們只需采用平均值\(l_{t+1}\)即可進行確定性推理過程。隱藏狀態匯總了過去所有特征圖\(\left\{e_1,...e_t\right\}\)的信息。我們並不對特征圖進行任何池化操作,因為特征圖中的空間信息對於定位patch十分重要。所以我們通過1x1卷積來減小feature的channel數。這種設計拋棄了對分類有用對定位沒什么用的信息,結構請看下圖
在訓練過程中,在獲得\(l_{t+1}\)之后,我們將從原圖片以\(l_{t+1}\)為中心裁剪成為\(H'\times W'\)的patch作為下一個的輸入,放進網絡中生成預測結果\(p_{t+1}\)。patch proposal網絡將對生成\(l_{t+1}\)的行為得到一個reward \(r_{t+1}\),被定義為在真實值標簽上預測結果softmax的增量,即\(r_{t+1}=p_{(t+1)y}-p_{ty},\ y\in\left\{1,...,C\right\}\),C為類別數,該網絡的目標就是要最大化這個折扣獎勵的和:
其中\(\gamma\in(0,1)\)是一個提前定義好的折扣參數,通過上述直觀的等式,我們盡可能讓\(\pi\)以盡可能少的patch產生高置信度的預測結果。 從本質上講,我們訓練\(\pi\)來預測每個步驟中用於圖像分類的最有利區域的位置。 請注意,由於我們計算了預測概率的“增量”,因此該過程也考慮了先前的輸入。
Training Strategy
-
Satge I
首先我們並沒有將\(\pi\)網絡集成到GFNet中,取代而之的是在每一步中隨即裁剪patch並在整個輸入圖像上均勻分布,訓練\(f_G,f_L,f_c\)讓分類的loss \(L_{cls}\)最小,這一階段訓練網絡以適應任意輸入序列
-
Stage II
第二階段固定從第一階段來的兩個編碼器和分類器,並調用隨機初始化的patch proposal網絡\(\pi\)來確定每個patch 的位置,我們用策略梯度算法來訓練網絡\(\pi\)讓總的reward值最大
-
Stage III
最后我們對於兩個編碼器和分類器加上固定的網絡\(\pi\)通過學習的patch選擇策略進行微調
Implement details
-
\(f_G,f_L\)的初始化
局部編碼器\(f_L\)使用ImageNet預訓練好的模型進行初始化,由於全局編碼器fG以較低的分辨率處理調整大小后的圖像,因此我們首先將所有調整后的訓練樣本的大小調整為\(H'\times W'\)有趣的是,僅使用低分辨率圖像對預訓練模型進行微調有助於提高網絡效率。
-
Recurrent Network
我們在\(f_C,\pi\)中使用了
gated recurrent unit(GRU)
對於MobileNets-V3和EfficientNets,我們使用級聯的全連接層來提高實施效率。 -
Regularizing CNN
在前面的loss方程中添加了一正則化項,旨在保持兩個CNN學習線性可分離的能力
\[L'_{cls}=\frac{1}{|D_{trian}|}\sum\nolimits_{(x,y)\in{D_{train}}}\left[\frac{1}{T}\sum\nolimits_{t=1}^{T}\left[L_{CE}({p_t},y)+\lambda L_{CE}(Softmax(FC_t(\overline e_t)),y)\right] \right] \]\(\lambda>0\)是一個預先定義好的參數,在每一階段又定義了一個全連接層\(FC_t\),用特征向量\(\overline e_t\)計算計算softmax交叉熵loss,當最小化\(L_{cls}\)時,由於所有的梯度都流向\(f_C\),因此不直接監督兩個編碼器,而\(L'_{cls}\)強制實施了線性化的深層特征空間
-
Confidence threshold
每一個step都會分配一個概率,並且具有一個相應的計算成本,利用類似於之前budgeted的方法根據分配的概率去找threshold
-
Policy gradient algorithm
用
proximal policy optimization(PPO)
算法訓練\(\pi\)
Experiments
-
result
-
可視化
-
Ablation Study
Conclusion
在本文中,我們引入了Glance and Focus Network(GFNet),以減少圖像分類任務中的空間冗余。GFNet以順序方式處理給定的高分辨率圖像。在每個步驟中,GFNet都會處理較小的輸入,該輸入可以是原始圖像的降采樣版本,也可以是裁剪的patch。 GFNet會逐步執行分類,並為下一步定位判別區域。 一旦獲得足夠的分類置信度,該過程就終止,從而導致自適應方式。 我們的方法與各種現代CNN兼容,並且易於在移動設備上實現。 在ImageNet上進行的大量實驗表明,即使在理論上和經驗上,即使在大多數SOTA輕量CNN的基礎上,GFNet都能顯着提高計算效率。
Appendix
-
Recurrent Networks-GRU
對於RegNets,MobileNets-V3和EfficientNets,我們在patch提議網絡\(\pi\)中使用具有256個隱藏單元的門控循環單元(GRU)。 對於ResNets和DenseNets,我們采用1024個隱藏單元,並刪除\(\pi\)中的卷積層。 這不會影響效率,因為與兩個編碼器相比,π的計算成本可忽略不計。 關於循環分類器\(f_C\),對於ResNets,DenseNets和RegNets,我們使用具有1024個隱藏單元的GRU。 對於MobileNets-V3和EfficientNets,我們發現盡管具有大量隱藏單元的GRU分類器可實現出色的分類精度,但在效率方面卻過於昂貴。 因此,我們用級聯的完全連接的分類層代替了GRU。 具體來說,在第t步,我們將所有先前輸入fē1的特征向量連接起來\(\left\{\overline{e}_1,...\overline{e}_t\right\}\),並使用大小為\(tF\times C\)的線性分類器進行分類,其中F是特征維數,C是類數。 同樣,在第(t + 1)步使用另一個\((t+1)F\times C\)線性分類器。 總共,我們有T個線性分類器,大小為F×C,2F×C,...,TF×C。
-
Policy Gradient Algorithm
太難了沒看懂
-
Training Details
-
初始化。 如本文所述,我們使用ImageNet預訓練模型初始化局部編碼器\(f_L\),而首先通過微調預訓練模型並將所有訓練樣本的大小調整為H'×W'來初始化全局編碼器\(f_G\)。 具體來說,對於ResNets和DenseNets,我們使用pytorch提供的預訓練模型,對於RegNets,我們使用其論文提供的預訓練模型,對於MobileNets-V3和EfficientNets,我們使用 首先按照他們的論文中提到的所有細節從頭開始訓練網絡,以匹配報告的性能,然后將獲得的網絡用作預訓練的模型。 對於H'×W'微調,我們使用與訓練過程相同的訓練超參數。值得注意的是,當將MobileNets-V3和EfficientNets用作backbone時,我們在初始化后固定全局編碼器\(f_G\)的參數,並且不再對其進行訓練,這對於Glance Step的最終性能是有益的。
-
第一階段。我們使用SGD優化器訓練所有網絡,並采用余弦學習速率退火技術,且Nesterov動量為0.9。 mini-batch的大小設置為256,而RegNets的L2正則化系數設置為5e-5,其他網絡的L2正則化系數設置為1e-4。 分類器\(f_C\)的初始學習率設置為0.1。 對於這兩種編碼器,ResNets,DenseNets,RegNets,MobileNets-V3和EfficientNets的初始學習率分別設置為0.01、0.01、0.02、0.005和0.005。 對於ResNets,DenseNets和RegNets,將正則化系數λ設置為1,將MobileNets-V3和EfficientNets設置為5。 我們訓練ResNets,DenseNets和RegNets達到60個時代,MobileNets-V3達到90個epoch,EfficientNets達到30個epoch。
-
第二階段。 我們使用具有附錄中提供的超參數的Adam優化器訓練patch提議網絡π。 在所有實驗中,我們從中采樣定位作用\(l_t\)的高斯分布的標准偏差設置為0.1。
-
第三階段。 我們使用與階段I相同的超參數,但對分類器\(f_C\)使用的初始學習率為0.01。 此外,由於我們沒有目睹性能的提高,因此我們不對EfficientNets執行此階段。
-
輸入尺寸和階段長度T和對應的編碼器如表所示
-
-
Effects of Low-resolution Fine-tuning
如本文所述,我們的方法通過首先對所有訓練樣本的大小調整為H’×W‘的預訓練模型進行微調來初始化全局編碼器\(f_G\)。一個有趣的觀察是,低分辨率微調提高了計算效率。下圖中報告了與基准和GFNets相比較的微調模型的性能。重要的是,這些微調模型所實現的改進實際上已包含在我們的GFNet中,因為Glance步驟的性能主要取決於低分辨率微調。 另一方面,我們的方法能夠通過Focus Stage進一步提高測試准確性,並在線調整平均計算成本。
-
Comparisons with MSDNet in Budgeted Batch Classification
從訓練集中選取5w張圖片作為一個額外的驗證集去估計閾值的置信度,用剩余的樣本訓練網絡,用Fig4(a)中的作比較,如下圖
To learn
- GRU
- loss正則化
- PPO算法
如有問題歡迎指正與討論