為什麼要關注數據增強?

近年來深度學習模型的發展主要歸功於這些年收集到的龐大而多樣的數據。數據增強是一種策略,使從業者無需收集新數據就能顯著提升已有數據的多樣性,從而更好地服務訓練模型。諸如裁剪、填充和水平翻轉等數據增強技術通常用於訓練大型神經網絡。然而,神經網絡訓練中使用的大多數方法只用到了基本的增強技巧。雖然神經網絡體系結構的研究愈加深入,但業界開發更強大的數據增強技術,探索能夠捕獲數據不變屬性的數據增強策略的步伐卻非常緩慢。

一張數字”3“的原始圖像與應用基礎數據增強算法之後的結果。

最近,谷歌通過 AutoAugment(https://arxiv.org/abs/1805.09501)這種新的自動數據增強技術提升了 CIFAR-10 等數據集的精確度。之前的數據增強只使用水平翻轉或填充和裁剪等一組固定的轉換,而 AutoAugment 的成果表明這種老式算法有很大的改進潛力。AutoAugment 引入了 16 種幾何和基於顏色的轉換,並制定了一種新的增強策略,可以對每批數據應用最多兩個有一定幅度級別的轉換。訓練模型會直接用數據強化學習這些性能更高的增強策略。

有什麼成果?

AutoAugment 是一種成本高昂的算法,它需要訓練 15,000 個模型才能收斂,才能為基於強化學習的策略生成足夠的樣本。樣本之間不共享計算過程,學習 ImageNet 數據集的增強策略需要 15,000 個 NVIDIA Tesla P100 GPU 小時,學習 CIFAR-10 需要 5,000 GPU 小時。舉例來說,如果使用谷歌雲的 P100 GPU 按需服務,學習 CIFAR 策略將花費大約 7,500 美元,而 ImageNet 策略需要 37,500 美元!因此在培訓新數據集時,更常見的用例是使用公開發布的,展示出比較好效果的策略。

對圖像應用基於群體的增強的效果,按照訓練度百分比分類

基於群體的數據增強

伯克利團隊提出的數據增強策略名為基於群體的增強(PBA),其在各種神經網絡模型上實現的測試準確度與谷歌方案接近,但需要的計算量少了三個數量級。團隊在 CIFAR-10 數據集上訓練幾個小型模型副本來學習增強策略,使用 NVIDIA Titan XP GPU 時只需要 5 個小時就能學成一個策略。之後遷移到大型模型體系和 CIFAR-100 數據集上從頭開始訓練時,該策略表現出了強大的性能。

與訓練大型 CIFAR-10 網絡需要花費的幾天收斂時間相比,預先運行 PBA 的成本很低,卻能顯著改善結果。例如,在 CIFAR-10 上訓練 PyramidNet 模型時,使用 NVIDIA V100 GPU 需要 7 天以上,而學習 PBA 策略只會增加 2%的預計算訓練時間開銷。對於 SVHN 來說這種開銷甚至更低,少於 1%。

在 WideResNet、Shake-Shake 和 PyramidNet + ShakeDrop 模型中,PBA、AutoAugment 和僅使用水平翻轉,填充和裁剪的基礎策略之間的 CIFAR-10 測試錯誤對比。PBA 明顯優於基礎策略,與 AutoAugment 相當。

PBA 利用基於群體的訓練算法(https://deepmind.com/blog/population-based-training-neural-networks/)來生成增強策略 調度,該調度可以基於當前的訓練 epoch 做調整。這與固定增強策略正好相反,後者對不同的 epoch 都使用相同的轉換。

這樣一來,單機工作站用戶就可以很容易試驗不同的搜索算法和增強操作。一個有意思的用例是引入新的增強操作,這些操作可能針對特定的數據集或圖像模態,並能夠快速生成定製的,高性能的增強調度。伯克利通過變量控制研究方法發現,學習的超參數和調度順序都顯著影響結果質量。

增強調度是怎樣學習的?

伯克利團隊使用 16 個小型 WideResNet 模型作為群體進行基於群體的訓練。群體中的每個 worker 都將學習自己的候選超參數調度。之後團隊用性能最佳的調度遷移到大型模型上開始從頭訓練,從中得出測試誤差指標。

基於群體的訓練框架。通過訓練一群神經網絡來找出超參數調度。它結合了隨機搜索(發現)和複製高性能的 worker 模型權重(利用)兩種手段。

群體模型在目標數據集上訓練時,一開始所有的增強超參數都設置為 0(未應用增強)。“利用和發現”過程會頻繁將高績效 worker 的模型權重複制到低績效 worker 來“利用”前者,然後擾亂 worker 的超參數來“探索”。這個過程能夠在 worker 之間共享大量計算過程,並針對不同的訓練區域使用不同的增強超參數。因此,PBA 用不着訓練幾千個模型才收斂,用很少的計算量就能獲得很高的性能。

示例和代碼

利用 Tune 內置的 PBT 實現就可以直接使用 PBA 了。  

import ray
def explore(config):
"""Custom PBA function to perturb augmentation hyperparameters."""
...

ray.init()
pbt = ray.tune.schedulers.PopulationBasedTraining(
time_attr="training_iteration",
eward_attr="val_acc",
perturbation_interval=3,
custom_explore_fn=explore)
train_spec = {...} # Things like file paths, model func, compute.
ray.tune.run_experiments({"PBA": train_spec}, scheduler=pbt)

這裡用自定義探索函數調用 Tune 的 PBT 實現。這將創建 16 個 WideResNet 模型的副本並同時訓練它們。每個副本使用的策略調度都會保存到磁盤,並可在訓練結束後遷移到新模型訓練中。

可以參考這裡的說明(https://github.com/arcelien/pba)運行 PBA。在 Titan XP 上,只需要一個小時即可學到 SVHN 數據集上的高性能增強策略調度。在自定義數據集上也可以輕鬆使用 PBA:只需定義一個新的 dataloader 即可。

查看英文原文——原文地址