技術解讀EfficientNet系列模型——圖片分類的領域的扛把子

EfficientNet系列模型作為圖片分類領域精度最高的模型(沒有之一)。它到底用了哪些技術?有哪些值得我們借鑒的地方?本文將詳細闡述一下這個事情。具體內容如下:

EfficientNet模型是Google公司通過機器搜索得來的模型。該模型是一個快速高精度模型。它使用了深度(depth)、寬度(width)、輸入圖片解析度(resolution)共同調節技術。

谷歌使用這種技術開發了一系列版本。目前已經從EfficientNet-B0到EfficientNet-B8再加上EfficientNet-L2和Noisy Student共11個系列的版本。其中性能最好的是Noisy Student版本。以下是圖片分類模型在ImageNet數據集上的精度對比結果。

從結果可以看出,Noisy Student模型是目前精度最高的模型,在Imagenet數據集上達到了 87.4%的top1準確性和98.2%的top5準確性。

回顧一下EfficientNet系列模型的發展過程,裡面的主要技術如下。

1. EfficientNet系列模型的主要結構

EfficientNet系列模型的主要結構要從該模型的構建方法說起。該模型的構建方法主要包括以下2個步驟:

(1)使用強化學習演算法實現的MnasNet模型生成基線模型EfficientNet-B0。

(2)採用複合縮放的方法,在預先設定的內存和計算量大小的限制條件下,對EfficientNet-B0模型的深度、寬度(特徵圖的通道數)、圖片大小這三個維度都同時進行縮放,這三個維度的縮放比例由網格搜索得到。最終輸出了EfficientNet模型。

提示:

MnasNet模型是Google 團隊提出的一種資源約束的終端 CNN 模型的自動神經結構搜索方法。該方法使用強化學習的思路進行實現。

EfficientNet模型的調參示意圖,如圖3-10所示。

圖3-10 EfficientNet模型

在圖3-10中的各個子圖含義是:

(1)子圖是基準模型。

(2)子圖在基準模型的基礎上進行寬度縮放,即增加圖片的通道數量。

(3)子圖在基準模型的基礎上進行深度縮放,即增加網路的層數。

(4)子圖在基準模型的基礎上對圖片的大小進行縮放。

(5)子圖在基準模型的基礎上對圖片的深度、寬度、大小都同時進行縮放。

原始模型

EfficientNet模型論文的網址是:

https://arxiv.org/abs/1905.11946

2. MBConv卷積塊

EfficientNet模型的內部是通過多個MBConv卷積塊實現的,每個MBConv卷積塊的具體結構如下:

其中將ReLU激活函數緩存了Swish激活函數。MBConv卷積塊也使用了類似殘差鏈接的結構,不同的是在短連接部分使用了SE層。另外使用了drop_connect方法來代替傳統的drop方法。

注意:

在SE層中沒有使用BN操作,而且其中的sigmoid激活函數也沒有被Swish替換。

在其它層中,BN是放在激活函數與卷積層之間的。(這麼做的原理見本書7.6.3小節)

DropConnect與Dropout不同的地方是在訓練神經網路模型過程中,它不是對隱層節點的輸出進行隨機的丟棄,而是對隱層節點的輸入進行隨機的丟棄。如下圖所示:

在深度神經網路中DropConnect與Dropout的作用都是防止模型產生過擬合的情況。相比之下DropConnect的效果會更好一些。

3. 模型的規模和訓練方式

EfficientNet系列模型主要從2個方面進行衍化。

(1)模型結構的規模:

EfficientNet系列模型中從EfficientNet-B0到EfficientNet-L2版本,模型的精度越來越高,規模越來越大,同樣,對內存的需求也會隨之變大。

模型的規模主要是由寬度、深度、解析度這三個維度的縮放參數決定的。這三個維度並不是相互獨立的,對於輸入的圖片解析度更高的情況,需要有更深的網路來獲得更大的感受視野。同樣的,對於更高解析度的圖片,需要有更多的通道來獲取更精確的特徵。在EfficientNet的論文中,也用公式介紹了三者之間的計算原則(詳見論文arXiv:1906.11946, 2019)。

下表中顯示了每個版本的縮放參數。

從上表中可以看到,隨著模型縮放參數的逐漸變大,其dropout的丟棄率參數也在增大。這是因為模型中的參數越多,模型的擬合效果越強,也越容易產生過擬合。

為了避免過擬合問題,單靠增加dropout的丟棄率是不夠的。還需要藉助於訓練方式的改進來提升模型的泛化能力。

(2)模型的訓練方式:

EfficientNet系列模型在EfficientNet-B7版本之前主要是通過調整縮放參數,增大網路規模來提升精度。在EfficientNet-B7版本之後主要是通過改進訓練方式和增大網路規模2種方法並行來提升模型精度。主要的訓練方法如下:

  • 隨機數據增強:又叫Randaugment,是一種更高效的數據增強方法。該方法EfficientNet-B7版本中使用。
  • 用對抗樣本訓練模型:應用在EfficientNet-B8和EfficientNet-L2版本,該版本又叫做AdvProp。
  • 使用自訓練框架:應用在Noisy Student版本。

其中隨機數據增強是在原有的訓練框架中,可以直接替換原有的自動數據增強方法AutoAugment。而AdvProp和Noisy Student則是使用了新的訓練框架所完成的訓練方法,這部分內容將在後面詳細介紹。

4. 隨機數據增強方法(RandAugment)

隨機數據增強RandAugment方法是一種新的數據增強方法,比自動數據增強AutoAugment方法簡單又好用。在原有的訓練框架中,可以直接替換原有的AutoAugment方法。

AutoAugment方法包含了30多個參數,可以對圖片數據進行各種變換(可以參考論文arXiv:1805.09501, 2018)。

隨機數據增強RandAugment方法是在AutoAugment方法的基礎之上,將30多個參數進行策略級的優化管理。使這30多個參數被簡化成為2個參數:圖像的N個變換和每個轉換的強度M。其中每次變換的強度參數M,取值在0到10的整數範圍內,表示使原有圖片增強失真(augmentation distortion)的大小。

RandAugment方法以結果為導向,使數據增強過程更加「面向用戶」。在減少AutoAugment的運算消耗的同時,又使增強的效果變得可控。詳細內容可以參考論文(arXiv:1909.13719, 2019)

5. 用對抗樣本訓練模型(AdvProp)

AdvProp模型是一種使用對抗性樣本來減少過度擬合的訓練方法。在實現時,使用了獨立的輔助批處理規範來處理對抗性樣本。即使用額外的一個輔助BN單獨作用於對抗性樣本。

對抗樣本是指通過在圖像上添加不可察覺的擾動而產生的對抗性樣本可能導致卷積神經網路(ConvNets)做出錯誤的預測。

為了進一步提升模型精度,放大EfficientNet-B7版本的模型規模,並用AdvProp的方法進行訓練,於是便推出了EfficientNet-B8版本,該版本也叫AdvProp模型。

AdvProp模型在不需要添加額外的訓練數據情況下,通過對抗性樣本的方式進行訓練,在ImageNet上獲得了85.5%的top-1精度。這一結果超過了《Exploring the limits of weakly supervised pretraining. In ECCV, 2018》中使用3.5B Instagram圖像(比ImageNet多約3000倍)和多約9.4倍參數訓練的最佳模型。

(1)AdvProp模型中的對抗樣本演算法

在AdvProp模型中,使用了3種對抗樣本的生成演算法,分別為PGD、I-FGSM和GD。具體如下:

  • PGD:投影梯度下降(Project Gradient Descent)攻擊是一種迭代攻擊,即帶有多次迭代的FGSM——K-FGSM (K表示迭代的次數)。FGSM是僅僅做一次迭代,走一大步,而PGD是做多次迭代,每次走一小步,每次迭代都會將擾動投影(Project)到規定範圍內。在AdvProp模型中,將PGD的擾動級別分為0到4,生成擾動的迭代次數n按照擾動級別+1進行計算。攻擊的步長固定為1。參考論文(arXiv:1706.06083, 2017)
  • I-FGSM:在PGD的基礎上,將隨機初始化的步驟去掉,直接基於原始樣本做擾動。同時將擾動級別設為4,迭代次數為5,攻擊步長為1。這種方式生成的對抗樣本針對性更強,泛化攻擊的能力較弱。
  • GD:在PGD基礎之上,將投影的環節去掉,不再對擾動大小進行限制,直接將擾動級別設為4,迭代次數為5,攻擊步長為1。這種方式生成的對抗樣本更為寬鬆,但有可能失真更大(對原有樣本的分布空間改變更大)。

這3種演算法分別作用在EfficientNet的B3、B5、B7版本上,其效果如圖所示:

可以看到。總體來說,3種演算法的的效果相差不大。在模型規模較小時FGSM效果更好,在模型規模較大時GD效果更好。

有關對抗樣本的更多內容和配套代碼可以參考《深度學習之TensorFlow:工程化項目實戰》一書第11章,模型的攻防。

(2)AdvProp模型中的關鍵技術

使用對抗樣本進行訓練的方法並不是絕對有效的,因為普通樣本和對抗性樣本之間的分布不匹配,在訓練過程中,有可能會改變模型所適應的樣本空間。一旦模型適應了對抗樣本的分布,則在真實樣本中,便無法取得很好的效果。這種情況會導致模型的精度下降。如圖所示

圖中顯示了直接使用對抗樣本和使用AdvProp的方法在ResNet模型上訓練的效果,可以看到,直接使用對抗樣本對模型的精度都造成了下降的影響。而AdvProp的方法可以使模型的精度有所提升。

AdvProp模型在使用對抗樣本進行訓練時,與真實的樣本做了區分,使用了兩個獨立的BN本別對其進行處理。可以在歸一化層上正確分解這兩個分布,以便進行準確的統計估計。它使模型能夠通過對抗性樣本成功地改進而又不會降低性能。傳統的BN與輔助BN的結構比較,見下圖:

具體步驟如下:

(1)在訓練時,取出一批次原數據。

(2)用該批次原數據攻擊網路,生成對應的對抗樣本

(3)將該批次原數據和抗樣本一起輸入網路,其中批次原數據輸入主BN進行處理,對抗樣本輸入輔助BN進行處理。而網路中的其它層同時處理二者的聯合數據。

(4)在計算損失時,對批次原數據和對抗樣本的損失分別單獨計算。在將它們加和。作為總的損失值進行迭代優化.

(5)在測試時,將所有的輔助BN介面丟棄。保留主BN介面。驗證模型性能。

有關AdvProp的更多內容請參考論文(arXiv:1911.09665, 2019)。

有趣的是,該篇論文的方法與代碼醫生工作室6月份推出的「鑒黃師」產品非常相似。詳見精鍊鑒黃師背後的故事(點擊圖片瀏覽)。

在鑒黃師產品中。我們也是使用了自己改良後的FGSM方法進行對抗樣本的製作。其中改良的部分主要是將PGD演算法的隨機初始化部分換成了數據增強演算法。

與AdvProp不同的是,我們沒有在原始模型上進行結構的調整(增加輔助BN)而是通過對抗神經網路在生成對抗樣本階段將數據分布硬拉到原始數據的分布中(其實就是在loss部分加了KL散度的計算)。

該做法與AdvProp的做法所解決的問題是一樣的,即對抗樣本與真實樣本的空間分布不同。相比之下,我們的方法可移植性更高,更容易被做成通用框架,因為它不會去修改原始模型的結構。

這種方式稍加變換還可以被融合進數據增強的訓練框架,從工程學角度來看更有意義。

6.用自訓練框架訓練的模型(Noisy Studen)

Noisy Student模型可以代表目前圖片分類界的最高精度。該模型在訓練模型的過程中使用了自訓練框架,自訓練框架可以為以下步驟:

(1)用常規方法在帶有標註的數據集上(ImageNet)訓練一個模型,將其當作教師模型;

(2)利用該教師模型對一些未標註過的圖像進行分類(在論文中,作者直接使用了JFT 數據集的圖像,忽略其標籤部分)。並將分類分數大於指定閾值(0.3)的樣本收集起來,作為偽標註數據集;

(3)在標註和偽標註混合數據集上重新訓練一個學生模型;

(4)將訓練好的學生模型當做教師模型,重複(2)到(3)步。進行多次迭代,最終得到的學生模型便是目標模型。

提示:

在Noisy Student模型的訓練細節上也用了一些技巧,具體如下:

  • 第(2)步可以直接用模型輸出的分數結果當作數據集的標籤(軟標籤),這種效果會比直接使用one-hot編碼的標註(硬標籤)效果更好。
  • 在訓練學生模型時,為其增加了更多的雜訊源,使用了諸如數據增強、dropout、隨機深度等方法,使得學生模型在從偽標籤訓練的過程中更加艱難。這種方法使得訓練出來的學生模型更加穩定,能夠生成質量更高的偽標註數據集。
  • 在製作偽標籤數據集時,需要按照每個分類相同的數量提取偽標籤數據(論文中的做法是:每個類別,挑選具有最高信任度的 13 萬張圖片,對於不足 13萬張的類別,隨機再複製一些),這樣做可以可以保證樣本樣本均衡。
  • 引入了一個修復訓練測試解析度差異的技術來訓練學生模型,首先在小解析度圖片下正常訓練 350 個周期,然後基於未進行數據增強的大解析度圖片下微調訓練1.5 個周期,微調階段淺層被固定。可以參考論文(arXiv:1906.06423, 2019)

Noisy Student模型的精度不依賴於訓練過程的批次大小,可以根據實際內存進行調節。

Noisy Student模型的自訓練框架具有一定的通用性。在實際應用時,對於大模型,在無標註數據集上的批次是有標準數據集的 3 倍,在小模型上則可以使用相同批次。該方法對EfficientNet系列模型的各個版本都能帶來 0.8% 左右的性能提升。

除此之外,該模型也被證明是魯棒性最好的模型。其在Image-A數據集下的比較結果如下:

Image-A數據集號稱為最難數據集。也是目前在ImageNet上訓練的眾多分類模型的試金石。它包含了來自真實世界的7500 張圖片,這些圖片的類別與ImageNet數據集的標籤一致。它們為經過任何的修改卻具有對抗樣本等同的效果。

圖中紅色的是標籤是 ResNet-50 模型給出的,黑色的標籤是實際真實標籤,而且以很高的信任度識別錯誤,要注意雖然這些樣本是對抗樣本,但都是來自真實世界未加對抗調整的自然圖片。

許多在ImageNet 下訓練好的知名模型,經過Image-A數據集的測試,其準確率都大幅下降。以 DenseNet-121 為例,其測試準確率僅為 2%,準確率下降了約 90%。所以,該數據集能夠很好的測試出分類模型的泛化能力。詳見論文(arXiv:1907.07174, 2019),對應的鏈接:

https://github.com/hendrycks/natural-adv-examples

Noisy Student模型在Image-A數據集上,Top1的識別率達到了74.2%,遠遠領先了第二名的49.6%。這主要歸功於其自學習框架的訓練方式。

有關Noisy Student模型的更多詳細內容請參考論文:

https://arxiv.org/abs/1911.04252

7 未來的展望

自訓練方法是一種半監督的模型訓練方法。它開闊了一個新的訓練高精度模型思路。沿著這個思路還有很多監督方式訓練模型的方法可以進行融合。比如使用對抗樣本、隨機增強等。而對於挑選偽標籤樣本過程,還可以更加精確一些,例如在候選樣本中做特徵聚類,剔除特徵相同的偽標籤樣本,使學生模型的訓練更高效、所學習的特徵更全面。

為了提高模型的精度,擴充數據集已經是一個主流的思想。如何更為有效的擴充數據集則是訓練方法未來優化的空間。

其實代碼醫生工作室的鑒黃師產品在訓練過程中,也使用了擴充數據集的方式優化模型精度。只不多我們的擴充框架是半自動的。這與具體的分類業務有關,因為涉黃圖片分類任務不同於普通的分類,在擴充樣本過程中,本身就可以自帶標籤。而收集學生模型的訓練樣本工作,則可以從教師模型的出錯樣本中進行選取。這種使用業務與技術結合的方式,才會使專項模型在自己的領域達到最優。

講這個案例也是為了給讀者一個啟發。在優化模型過程中,不要死盯著技術這一個方向,要最大化的利用任務的周邊信息,將可以利用的優勢條件融入技術,從多個角度來提升模型。

8 當前的代碼資源

有關efficientnet系列的代碼早已經開源。在Github上也可以搜索到許多有關efficientnet的工程。大多都是關於EfficientNet-B0到EfficientNet-B7的。其中包括了TensorFlow版本和PyTorch版本。

另外在TensorFlow的官方版本中,最新的代碼里也已經合入了EfficientNet-B0到EfficientNet-B7的模型代碼,在tf.keras框架下,可以像使用ResNet模型一樣,一行代碼就可以完成預訓練模型的下載和載入的過程。

具體路徑在」tensorflow/python/keras/applications/efficientnet.py」 下面。不過該部分代碼是在TensorFlow的2.0版本和1.15版本正式發布之後添加的。需要使用該版本以上的TensorFlow框架才可以使用。

注意:

由於TensorFlow的2.0版本對深度卷積(見4.9.7小節)的處理性能稍慢,所以在該框架下的EfficientNet模型運行效率會有一定影響。但該問題有望在後續版本中被修復。

對於單純的端到端分類任務,EfficientNet的系列模型是最優選擇。但作為更細粒度的語義分割任務,在骨幹網的特徵環節,如果顯存有限,則EfficientNet系列模型並不是最優選擇。主要原因是該系列模型對GPU的顯存佔有率過高。

對於EfficientNet系列的高精度模型(B7以上),只有在TensorFlow的tpu項目下可以找到。可以從如下鏈接進行獲取:

https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet

在該鏈接中包含了EfficientNet系列從B0到L2的全部代碼。不過預訓練模型目前只提供到EfficientNet的B8版本。同時配套的訓練源碼只提供到B7版本的隨機數據增強,對於B8版本對應的AdvProp方法,以及Noisy Student對應的自訓練框架源碼尚未公開。

以上內容節選自《機器視覺之TensorFlow2:入門、原理與應用實戰》。預計2020年3月上市。