卷積神經網路優化Part1 : Bag of Tricks for Improving your Neural Networks Training

Cinnamon AI Taiwan
18 min readJun 18, 2021

--

隨著深度學習不斷的演進,越來越多的架構騰空出世並在學術界的資料集上達到 State Of The Art,然而大多文獻中沒提到的是,部分精度、性能上的提升並不全然來自架構的更新,而是訓練上的技巧,本文會介紹幾種實用的操作,並附上PyTorch實作代碼。

Outline

  • Stochastic Depth
  • Warm-up
  • Label Smoothing
  • No Bias Weight Decay
  • Teacher-Student Knowledge Distillation
  • Mixup
  • Group Normalization (Part2)
  • Weight Standardization (Part2)

完整代碼

Stochastic Depth

Stochastic Depth 源自於文獻 Deep Networks with Stochastic Depth,如果用一句話總結:

Randomly drop a subset of layers and bypass them with the identity function

作法相當粗暴,這邊要注意的是我們 Drop 的不是單一層 layer,而是subset of layers (ex. Residual Block)。

[Source]

Stochastic Depth 存在的目的?

當我們看到 “Dropout” ,直覺就是為了避免 Overfitting,的確,降低 Overfitting的可能性是Stochastic Depth的特徵之一,然而作者最一開始的動機是為了要在訓練時間 & 模型複雜度之間找到一個平衡。通常模型在一定的深度內,隨著深度的增加,可學習參數上升,模型的表現會越來越好,但同時我們也需要花費大量運算資源與時間來訓練模型,作者想到的解決方法就是:一開始將模型搭深,而在訓練時隨機丟掉部分架構來提升訓練速度。

SD 實作

正如上述,SD 會隨機丟棄特定架構,取而代之的是 linear projectionidentity transformation,其差別在於linear projection是設計給輸入輸出尺度不同的結構,而 identity transformation則是直接做 mapping。各層拋棄的機率則是使用隨機變量和線性衰減的概率原則來改變(隨機變量的概率分布滿足伯努利分布),原文中是採用1–0.5的區間,1代表永遠不拋棄,主要是由於淺層所學習的特徵通常比較粗略也比較必須。另外SD操作在推理階段(inference)是不作用的。

[Source]

心得

Stochastic Depth的導入能有效地提升訓練效率,我們在OCR任務中訓練 ResNet模型時,開啟SD所需要的訓練時間約為未開啟時的60–70%。精度方面並無明顯提升,初期相同迭代次數下loss下降略速度較慢,然而到達一定次數後變無顯著差異。

Warm Up

正式出場於 Deep Residual Learning for Image Recognition(ResNet)的文獻,Warm up由字面上直譯就是『熱身』,而要熱身的主角就是我們的 Learning Rate。

Learning Rate Decay

在了解Warm up 前,先讓我們理解Learning Rate(lr) Decay的概念, lr decay為相當常見的訓練技巧,開始於較大的lr,隨著迭代次數的增加逐漸遞減,不少研究證實這樣的操作能提升模型收斂的穩定性與最終的泛化能力,直觀上其實也不難理解,在訓練初期,由於模型尚未學到有用的訊息,我們以較大的lr來加速收斂,同時降低陷入local minimum的可能性,然而隨著迭代次數的增加,模型日趨穩定,過大的lr反而可能造成較大幅度的震盪,此時適時地降低lr能讓模型在訓練後期有較穩定的表現。 實作部分我們可以透過呼叫torch.optim.lr_scheduler API來實現,下方以CosineAnnealingLR作為範例。(*CosineAnnealingLR 也可以作為cyclical learning rate使用)

Learning rate warmup

然而部分研究認為在初期使用過大的lr可能會帶來以下缺點:

  • Early over-fitting on mini-batch : 尤其當 mini-batch 分佈不均勻時,相同分佈的資料集中於初期的迭代,此時模型可能會快速收斂至local minimum。
  • 難以收斂:過大的lr可能導致大幅度的振盪(梯度),使模型無法朝著正確的方向收斂。相信不少讀者遇過模型無法收斂的情形,解決方法就包含適當的降低初始的lr值。
Warm-up learning rate[source]

綜合以上,我們希望有 decay的特性,但不希望初期有過大的lr,於是就有了Warm up + lr decay的策略。正如上圖,初期使用較小的lr,隨著迭代次數上升逐漸提升,到一定step後再回到decay的模式,其中上升下降的節奏有多種控制方式,常見如 Linear, Exponential, Cosin。

如何決定轉折點

現在我們知道Warm up + lr decay的策略,那如何決定多少 step後轉為 decay呢?首先讓我們借鏡ResNet原文:

We use 0.01 to warm up the training until the training error is below 80% (about 400 iterations), and then go back to 0.1 and continue training

由上文我們能清楚地得知ResNet作者們是透過training error下降的情況來調整lr數值,除此之外,較簡單的方式還包含比例拆分訓練迭代次數,如訓練期前20%是warm up,後80% decay。實際數值還是要一目標任務而定。下方連結提供Exponential warm up的實現代碼:

Label Smoothing

Classification

在一般的分類任務中,CrossEntropy為最常見的損失函數。下圖為經典的圖像分類器架構,CNN + Fully Connected Layer + Softmax + CrossEntropy (二元分類也可以使用Sigmoid + Binary CrossEntropy)。

Classic classification Solution[source]

One-Hot Encoding的標注通常被稱為 Hard targets,每個樣本只需全神貫注目標類別,並盡可能將其餘類別的預測機率歸零,然而這樣的操作可能會造成:

  • 模型過度自信:不是目標類別仍然輸出很高的信心程度。
  • 過度校正:有時單樣本可能涵蓋兩個類別以上的目標,如狗狗的圖片背景有貓,強迫此類樣本逼近單一類別會使模型泛化性降低。

label smoothing

label smoothing 算是一種 Regularization(正則化)的技巧,其轉換公式如下:

ε為一常數,假設我們有一個 Hard target [0, 0, 0, 0, 1],ε帶入0.1,經過下方公式輸出[0.025, 0.025, 0.025, 0.025, 0.9],也就是我們的 Soft target

Label smoothing formula[source]

此時我們要優化的目標Zi=y (predicted score for class i)不再是無窮大

下方為PyTorch實現代碼

心得

Label smoothing設計原理雖然相當符合目標需求,然而實際應用上並不能保證模型表現能有顯著提升,有時甚至會有下降的狀況。 Smoothing的操作其實是一把雙面刃,避面過度自信的同時也有可能降低正確目標的信心程度,Geoffrey Hinton 團隊所發表的 When Does Label Smoothing Help? (推薦閱讀),文中提及

We show that label smoothing encourages the representations of training examples from the same class to group in tight clusters. This results in loss of information in the logits about resemblances between instances of different classes, which is necessary for distillation, but does not hurt generalization or calibration of the model’s predictions.*Teacher-Student Knowledge Distillation的概念會在下方提到

其強調Label Smoothing 能聚集同類樣本並提高模型泛化能力,但由於副樣本權重均相同,模型失去了學習類別間相似性的能力。因此當我們在使用 Label Smoothing 時應同時注意其優缺點。

No Bias Weight Decay

PyTorch optimizer 中 weight_decay參數實為 L2 penalty (regularization),藉由給予懲罰項來降低Overfitting 的可能性,實作部分只需將懲罰項加入損失函數中:

Loss with L2 penalty [source]

此時權重Wi的梯度更新如下方方程式:

gradient update [source]

通常我們會直接將L2 penalty附加到所有可學習參數上,然而根據Highly Scalable Deep Learning Training System with Mixed-Precision: Training ImageNet in Four Minutes 文獻中所述

In neural network training, it is a typical practice to penalize only the weights of the affine transformation at each layer and leaves the biases unregularized. What we have observed in our training for AlexNet is that if we also leave two parameter sets β and γ in batch normalization unregularized, our model could achieve better convergence and usually with less time to train for the same number of epochs.

作者們發現,當移除 Bias 以及 BN 層可學習參數β and γ上的regularization,模型能夠有較好的收斂曲線與最終精度,下表提供了清楚的比較

Compare L2 Regularization effect [source]

實作代碼如下,我們手動拆分需要 weight_decay 與不需 weight_decay的 parameters,再將其帶入 optimizer之中,而透過調用optimizer.param_groups可以查看不同param_group的參數設定。

Mixup

Mixup 由facebook 研究團隊提出,首見於 mixup: BEYOND EMPIRICAL RISK MINIMIZATION,為一種 data augmentation 的技巧,Mixup原理如下方公式,隨機將兩張圖片的特徵與標籤混合,其中lambda為介於0~1的權重,由給定母數的Beta distribution中隨機提取:

Mixup[source]

Data Augmentaiotn 主要目的為降低 Overfitting 的可能性並且提升模型泛化能力,原文中也詳細比較Mixup 與 ERM的表現,有興趣的讀者可以直接參考原文。

Mixup視覺化[source]

心得

使用Mixup訓練分類模型時,我們建議:

  • 訓練初期關閉Mixup,待training error下降到一定值後開啟Mixup : 訓練初期使用Mixup,模型收斂較不穩定。
  • 持續訓練模型直到不再收斂。
  • 關閉Mixup,用原始資料finetune得到最終結果 : 通常會再些微提升。

下方為實作代碼

Teacher-Student Knowledge Distillation

Knowledge Distillation 自從被提出後(Distilling the Knowledge in a Neural Network,又是Hinton大神團隊),廣泛被應用於多項深度學習的任務,而 Continual Learning, Meta Learning 領域中也不時能看到Distillation的做法。

Knowledge Distillation

經典 Knowledge Distillation 的架構中包含一位老師與一位學生,老師通常為參數較多的預訓練模型(相對學生 ex. ResNet50 <-> ResNet18),訓練學生時,除了原本標籤的訓練,另加上一條 『Distillation』 branch,其計算loss步驟如下:

  • 將mini_batch 輸入 teacher network,得到 softmax output
  • 將相同mini_batch 輸入 student network,得到 softmax output
  • 標籤訓練:student network的 softmax output與標籤計算loss (CrossEntropy)
  • Distillation:計算 teacher / student network softmax output的分佈差異(Kullback-Leibler divergence)
  • 將標籤訓練與Distillation branch輸出依權重相加獲得最終Loss再做Backpropagation。
Knowledge Distillation[source]
  • 除此之外,我們也能引入超參T (temperature)來適當的平滑輸出分佈(將 softmax output / T),其數值通常設為 1 或是 大於1,隨著T上升,輸出機率分佈有平滑化趨勢。如果T設置過大,我們將失去部分有用訊息,設置過小則會放大特定類別的預測,而當teacher network預測錯誤時,反而有害 student network的訓練。

綜合上方所述,Knowledge Distillation其實就是要透過一個比較強大的模型當作teacher network,在 student network學習時當作一盞明燈適時的引導收斂方向,使學生能有操過原本預期的表現,如下表所示,在 Frame classification任務中,單純標籤訓練達到58.9% accuracy, 而有 Distillation輔助的模型能達到 60.8% accuracy,提升了將近2%的精度並且逼近 ensemble的做法。

[source]

Why Kullback-Leibler divergence

相信部分讀者會有疑問,為什麼Distillation要使用KL divergence 而不是Cross Entropy?而一般的分類任務為何使用Cross Entropy而不是KL divergence?

單論使用情境而言:

  • 當我們要衡量輸出機率分佈與OneHot Encoding 標籤時,我們使CrossEntropy
  • 當我們要衡量兩個機率分佈差異時,我們使用KL divergence

從定義上來看

CrossEntropy

[source]

KL-divergence

[source]

兩者關係

[source]

從上方推倒中我們觀察到KL-divergence與CrossEntropy相差一個信息熵H(p),在給定標籤的訓練中,H(p)為一常數項-Σ(p(x) * log p(x)),並不影響梯度收斂方向(可能會影響大小)。

在一般Hard target標籤的分類任務中(ex. [0, 0, 1]),H(p)數值恆為0,KL-divergence與CrossEntropy算出的值其實是相同的,我們可以透過下方代碼驗證,然而CrossEntropy可以不用去計算常數項所以會更有效率。

而在Knowledge Distillation branch,我們要計算的是兩個機率分佈的差異,H(p)數值會隨著mini_batch而有所改變,此時KL-divergence會是較適合的選擇。

下方為Teacher-Student Knowledge Distillation的實作代碼:

總結

本篇介紹了近期常見的訓練技巧,我們專注於模型設計之餘,不妨也嘗試從訓練的角度切入來提升模型最終的表現,值得注意的是每種作法有適合的使用情境,亦有較不適合應用場景,因此必須斟酌使用。礙於篇幅的長度,我們將Group Normalization、Weight Standardization移至Part2,有興趣的讀者們歡迎接續閱讀。

完整實作代碼:https://github.com/jeff52415/Tips-for-improving-your-neural-network-pytorch

Cifar10訓練範例:https://github.com/jeff52415/Tips-for-improving-your-neural-network-pytorch/blob/main/train.py

2021 Summer Student Bootcamp AI 產品實作營

2021 Bootcamp 熱烈開跑中,歡迎想了解外商 AI 新創公司是如何打造能解決使用者需求的 AI 產品的學生踴躍報名:Bootcamp報名

參考文獻

  • Bag of Tricks for Image Classification with Convolutional Neural Networks
  • Distilling the Knowledge in a Neural Network
  • Highly Scalable Deep Learning Training System with Mixed-Precision- Training ImageNet in Four Minutes
  • When Does Label Smoothing Help
  • Accurate, Large Minibatch SGD- Training ImageNet in 1 Hour
  • Deep Residual Learning for Image Recognition
  • Deep Networks with Stochastic Depth
  • mixup: Beyond Empirical Risk Minimization

Appendix — Differentiation

--

--