Review: Rethinking Pre-training and Self-training — Series 2 of 3

Guan
工人智慧
Published in
16 min readFeb 27, 2021

--

Pre-training 一直是 Computer Vision 愛用的技術,一般認為它能夠非常快的配適在不同資料集(以及任務)上,早年甚至認為它在任何條件下都能夠快速的達到與 train-from-scratch 相等的準確度,甚至認為在相同的 iteration 之下,前者會勝過後者。

直到 2018 年底何恺明的 Rethinking ImageNet Pre-training 告訴我們,Pre-training 事實上不會對模型的準確度有任何幫助,唯一優點僅是比較快收斂而已,但這個優點仍足夠我們大量的使用 Pre-training。

And here we are.

Rethinking Pre-training and Self-training 在考量資料集大小、不同任務、不同 Data Augmentation 強度後認為,在各項準確度上,Pre-training 不但無法勝過 train-from-scratch ,甚至會傷害模型準確度,而 Self-training 在單次的訓練終究能勝過 train-from-scratch。

這篇會重新闡述 Pre-training 的價值所在,以及 Self-training 的驚人成果。

Introduction

Pre-training 是一項很普遍的技巧,為的是希望在一個資料集上訓練過的模型,能夠在各方面幫助另一個資料集的訓練。直到何恺明的著作表明,ImageNet Pre-training 很可能無法幫助 Object Detection 和 Segmentation。

而在同樣的場景下,在 Self-training 上使用 ImageNet 幫助 COCO ,則是先需要 Teacher model trained on COCO ,並輸入 ImageNet 作 pseudo label,與 human label 共同訓練 Student。

因為後者取得的巨大成功,我們將來比較此二者的差異。

結果表明:
1. 依照情境, Pre-training 的準確度不但無法超越 Random Init train-from-scratch ,還可能會傷害表現

2. 當擁有的資料集越大,Pre-training 造成的傷害越大

3. 當使用的 Data Augmentation 越強力,Pre-training 造成的傷害越大

4. Self-training 在任何的情境下,(無迭代) 皆比 Pre-training 甚至 Random Init 更為準確

5. 使用 ImageNet 應用到 COCO 或 PASCAL,第四點亦成立

然而,Pre-training 並非就此被打入冷宮,在少資料量如 PASCAL 仍有媲美 Random Init 的準確度,以及比起 Self-training 需要長久時間且 computing-intensive,Pre-training 可以有 1.3 - 8 倍的加速。

Methodology

Data Augmentation

在本篇的實驗中,使用四種強度的 Augmentation
1. Augment-S1: Flips and Crops Only
2. Augment-S2: AutoAugment, Flips and Crops
3. Augment-S3: Large Scale Jittering, AutoAugment, Flips and Crops
4. Augment-S4: Large Scale Jittering, RandAugment, Flips and Crops

而在何恺明一篇中,僅使用 Flips and Coprs Only。

Pre-training

針對 Pre-training model 除了一般使用的 EfficientNet-B7 + AutoAugment 達成 84.5% on ImageNet 外,亦使用了 EfficientNet-B7 +NoisyStudent 達成 86.9% 的模型,這邊稱作 ImageNet++。

需要特別注意的事情是,論文中所有的 Student 皆是 Init by Teacher,而凡是有使用 Pre-trained 的 Self-training ,皆是指 Teacher 使用 Pre-trained model 並在 COCO 或 PASCAL 上訓練

而在何恺明一篇中,僅使用 ResNet-50 及 ResNet-101。

Self-training

Self-training 的設置則是先使用 COCO train-from-scratch 取得 Teacher Model,再使用 Random Init, ImageNet 或 ImageNet++ 作為 Student Model 分別訓練。

另外被提到的是,在這樣的設置下,在 NoisyStudent 的 Loss Function 很難收斂,故引入了 Loss Normalization 的技巧。

原先在 Noisy Student 中,Loss Function 為

Loss Function in NoisyStudent

但在現行設置下,發現在 α 變動的狀況下,某些值會使訓練不穩定。故改為

Adapted Loss Function

此外,我們有不同的 Tasks,且有不同的 Augmentation Strength 和 Data Size,所以這個 α 值得研究。故我們有下圖:

α vs different settings
Optimal α on different settings

上表揭示,當訓練步數增加,α 也應該要增加,越強力的 Augmentation ,α 則減少。

Experiments

Pre-training hurts performance when stronger data augmentation is used

下圖可以看出,
1. 當 Augmentation 越強力,Pre-training 越不如 Random Init
2. 當 Data Size 上升,Rand Init 與 Pre-training 的差距就越小
3. 越好的 Pre-trained Model,在小資料時有可能勝過 Random Init

Effects of Augmentation and Data Size on Pre-training

The effected of augmentation and labeled dataset size on self-training

說明一下下圖 Rand Init w/ ImageNet Self-training 的設置:
1. Teacher randomly initialize
2. Train on full COCO dataset
3. 完成訓練後(即第一行的 Rand Init),使用這個模型同時作為 Teacher 和 Student
4. Self-training on ImageNet

Effects of Augmentation and Data Size on Self-training

上表中,我們觀察到:
1. 使用 Pre-training 確實隨 Augmentation 強度增加而傷害模型
2. 在任何強度上,Self-training 皆打敗 Pre-training

Self-training works across dataset sizes and is additive to pre-training

再一次強調,這裡的 Self-training 開頭使用的模型是作為 Teacher 的 Pre-trained model 而非 Student,Student 皆是使用訓練完成的 Teacher 作為 Initialization。

Additive effect of Pre-training and Self-training

上表中可以觀察到,
1. 使用 Pre-training 確實隨使用的 Data Size 增加而表現較差
2. 較強的 Pre-trained model 確實會表現較好
3. 使用 Pre-training 後再使用 Self-training 也能夠加強準確度
4. 由於 Pre-training 會傷害模型,Rand Init w/ ImageNet Self-training 仍然表現最好
5. 任何相同的狀況下,使用 Self-training 必然能夠有較好表現

Self-supervised pre-training also hurts when self-training helps in high data/strong augmentation regimes

除了 Pre-training 外,作者對於 Self-Supervised 方法也很感興趣,因為它們與 Self-training 方法部份相似,能從非人類標籤資料擷取資訊,且如 SimCLR 已大致能達到與 Supervised Learning 相同的水準。

Self-supervised vs Self-training

如上表,很顯然的,即便使用 SimCLR 方法,Pre-training 造成的傷害依然無法挽回。

這邊並沒有比較 low data regime 時的狀況,因為 Self-Supervised 顯然是需要使用大量資料訓練的方法。

Exploring the limits of self-training and pre-training

這一小節嘗試使用目前非常強力的兩個架構 SpineNet on COCO and NAS-FPN with EfficientNet-L2 on PASCAL,將 Self-training 推向極限。

在 COCO 的實驗中,由於前述實驗結果認為,使用 full COCO dataset 時,Pre-training 會傷害模型效果,故在此不使用。

從 EfficientNet-D7 轉為使用大型三倍以上的 SpineNet-190 ,Self-training 依然有驚人效果,顯示 Self-training 有適用在不同任務、不同尺度模型上的潛力。

COCO SOTA with Self-training

而在 PASCAL VOL 2012 的資料集中,由於它是相對較小的資料集,故以下實驗使用 Pre-training 。

雖然 Backbone 仍是使用 EfficientNet 系列,但其 task head 則是使用複雜的(有點畸形的) NAS-FPN,仍有很好的效果,顯示 Self-training 對於不同任務的適應性。

PASCAL SOTA with Self-training

Discussion

Rethinking pre-training and universal feature representations

Pre-training 的糟糕表現直覺上似乎很合理(只是很少有系統的被討論)。我們希望透過在大型資料集如 ImageNet 上的成功訓練,讓它能夠幫助其他目標資料集的訓練,當目標資料集很小時,Pre-training 仍然可以從原本的資料集找到能夠幫助目標資料集的特徵,但是當目標資料集逐漸成長(或是加入更強力的 Augmentation),可能兩個資料集的有效特徵就會不同,甚至衝突了。

Such adaptation is often needed when switching tasks because, for example, good features for ImageNet may discard positional information which is needed for COCO.

The benefit of joint-training

所以為什麼 Self-training 表現如此之好?還不確定,但我們可以觀察到的是,除了使用 Supervised 的方法外,還加入了 pseudo label,在 Joint-training 下,這樣的 mismatch 可能導致效果。

換句話說,Self-training 是不同演算法的 Joint-training。

A strength of the self-training paradigm is that it jointly trains the supervised and self-training objectives, thereby addressing the mismatch between them.

那我們可以在其他什麼地方得到 mismatch 並 Joint-training 呢?

這邊展示了不同任務的 Joint-training,同時使用 COCO 和 ImageNet,也就是在訓練 Teacher 時,Randomly Initialize 並使用 COCO 和 ImageNet 訓練。

Supervised and Self-training and Joint-training

這裡並沒有詳細的 Joint-training 的細節,但我猜測應該是同時使用兩個 task head 並計算 total loss。

不過這裡有一點非常奇怪,在 COCO Sup. Training 中,33.3 > 30.7?Pre-training 應該要略遜於 Rand Init 吧?

沒錯,比對前面的準確度表格,這是僅使用 20% COCO training set 的準確度,所以結論才會是 同時使用 Pre-training + Self-training + Joint-training 效果最佳,請注意這是在僅使用小資料的狀況下,使用 100% COCO 時,Joint-training 的效果,並沒有被確認。

The importance of task alignment

什麼可能導致 Pre-training 的效果不如理想?

在 PASCAL 上,使用了 training + val 的 Pre-trained,即便多了人類標注的 val ,反而比僅使用 training set 的 Pre-trained 更糟,這是因為 val 的資料非常的雜亂,使其使用 val 的特徵後,反而更無法幫助日後的訓練。

另外,在 Objects365:A large-scale, high-quality dataset for object detection 中,使用了 Pre-train on OpenImages,並 fine-tune on COCO,即便兩者都有 annotated bounding box ,比起 train-from-scratch on COCO 效果更糟。

這裡暗示了,Self-training 因為是自行標記,而非使用來自不同處的人類標籤,達到了 task alignment 的效果,這對於 task adaption 是非常重要的。

Limitations

但 Self-training 是有代價的:

The speedup thanks to pre-training ranges from 1.3x to 8x depending on the pre-trained model quality, strength of data augmentation, and dataset size.

就是訓練時間相較 Pre-training 非常的久。所以如果時間緊迫,或是受限於 computing power,Pre-training 依然是最佳解。

The scalability, generality and flexibility of self-training

Self-training 除了能夠達到 SOTA 以外,也具有另外非常多的優勢:

  1. Scalability
    除了在非常肥大模型上也能夠達到更好的效果外,在非常巨量的資料集底下,也能夠有效的使用其資訊。
  2. Flexibility
    在任何量級的資料集、任何任務、任何架構都能夠使用。Scalability 保證了持續向上進步的空間,Flexibility 則討論了其廣度。
  3. Generality
    在 Noisy Student 中,我們知道了 Self-training 非常重要的一點是其表現的提昇,來自於能夠適應非常高強度的噪聲。故其比起 Pre-training 能夠適應更多的模式,甚至我們能夠合理地想像它在 Adversarial Training 也會有很好的效果。

Conclusion and Notes

本文雖然是大吹特吹 Self-training ,但很重要的是很清楚的指出 Pre-training 的極限,在怎麼樣的場景下應該使用何者。

但我認為有一件事情未被解決:

文中使用了 20% COCO 作為 low data regime,此時 Pre-training 表現最好,準確度隨後遞減。

而在現實應用中,我們如何知道自己手中的資料集屬於 low data regime 呢?

最簡單的方法是透過實驗,計算 Pre-trained model 使用的資料量和 fine-tune 使用的資料量,不過顯然很粗糙,畢竟我們有不同的任務,不同資料集的特性也不同。

我認為,應該找出量化資訊量的方法,譬如 Pre-trained model 對於 target tasks 有效的資訊量,以及 target data 需要達到什麼數量才能增加 Pre-trained model 的資訊量等等,這樣結論會更精準。

-

另外,在這總結一下 Pre-training 與 Self-training 各自應用場景的不同:

使用 Pre-training 的時機

  1. 僅有小部份 labeled data 或 labeled data 難以取得時
  2. 有訓練時間的壓力時
  3. 在應用場景穩定,不需要對抗噪聲時

有任一場景,就是使用 Pre-training 的好時機。

使用 Self-training 的時機

  1. 追求最好的準確度、更好的泛化能力
  2. 能夠有很長的訓練時間,或大量的計算能力時
  3. 有非常多的 unlabeled data 時

我認為要以上三項都要大致滿足,才應該使用 Self-training。

--

--