【數據增廣】無監督增廣——RandAugment

一年多沒有寫博客了,一轉眼回國就入職了。最近在從事關於計算機視覺方面的工作,一方面也是爲了記錄自己平日學習的點滴與思考養成良好的閱讀習慣,另一方面也是爲自己的知識技能庫做一些儲備。

言歸正傳,我們來看論文。

這是2019年11月由google brain團隊發佈的一篇關於無監督數據增廣的文章,名稱爲

RandAugmentation:Practical automated data augmentation with reduced search space
本博爲閱讀思考及個人翻譯,有問題的地方還請大家多多指正。

Repo:
https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/autoaugment.py

摘要

近期研究表明,數據增廣可以顯著提高深度學習的泛化性能,尤其是在圖像分類目標檢測方面均取得了不錯的成果。儘管這些策略主要目的是爲了提升精度,與此同時,在半監督機制下因爲對原有數據集進行了擴充,從而增加了數據集的魯棒性。

常見的圖像識別任務中,增廣的過程一般都是作爲預處理階段的任務之一。往往由於數據集過大而造成極大的計算損耗障礙。此外,由於所處的階段不同,這些方法無法像模型算法一樣隨意調整正則化強度(儘管數據增廣的效果直接取決於模型和數據集的大小)。

傳統自動數據增廣的策略通常是基於小數據集輕量模型上訓練後再應用於更大的模型。這就在策略上造成了一定的限制約束。本文則解決了這兩大限制。RandAugment可以將數據增廣所產生的增量樣本空間大大縮小,從而使其可與模型訓練過程捆綁在一起完成,避免將其作爲獨立的預處理任務來完成。此外,本文設置了增廣強度的正則化參數,可以根據不同的模型和數據集大小進行調整。RandAugment方法可以作爲外置工具作用於不同的圖像處理任務、數據集工作中。

在CIFAR-10/100、SVHN和ImageNet數據集上能持平甚至優於先前的自動數據增廣方法性能。在ImageNet數據集上,Baseline採用EfficientNet-B7結構的精度爲84%,而AutoAugment+Baseline的精度爲84.4%,本文的RandAugment+Baseline則達到了85.0%的準確率,分別提升了1和0.6個百分點。在目標檢測方面,Baseline採用ResNet結構,添加RandAugment的效果較Baseline和其他增廣方法提高了1.0~1.3個百分點。在COCO數據集上的表現也有0~0.3%mAP的效果提升。最後,由於本文超參數的可解釋性,RandAugment可以用來研究數據作用與模型、數據集大小之間的關係。在不同圖像處理任務上與其他增廣方法間的比較分析

數據增廣常在圖像分類、目標檢測等任務中廣泛用於生成額外數據以達到擴充數據集的目的。不過,傳統的增廣方法需要專業的圖像處理知識結合手動計算來完成,並且要有一定的先驗知識基礎。因此,這使得傳統增廣變得困難。

當下爲了減少手工+先驗的複雜過程,學者們正嘗試探索一系列自動增廣(AutoAugment)策略的方法。一個好的增廣手段不僅可以提升圖像分類的精度,增強訓練機器學習模型的半監督性,同時也可以使得模型更具魯棒性。儘管採用MixUp等策略進行數據增廣可以提升模型性能,但歸根結底仍然是兩階段的:先增廣,後訓練。同時也將造成較多的計算資源損耗。後續研究工作重點在於加速訓練效率和程序的有效性,使得增廣性能可以在反向傳播中得以共同迭代更新。而AutoAugment通過對原始公式假定對一個小的代理任務進行單獨的搜索,最後將其整合到更大的目標任務中。本文證明了這種兩階段式的策略並非最優的,因爲增廣的強度與模型和數據集大小之間具有很強的關聯性。RandAugment無需單獨搜索,其關鍵點在於大大減小了增廣數據空間的大小

解讀

Google Brain團隊出品,採用與基本數據增廣方式相同的一系列方法如:identity、rotate…具體的增廣手段如下表所示共K=14種。但本文並非目的是爲了讓CNN網絡學習如何對針對不同的數據集進行增廣,而是隨機選擇數據增廣的方式。即隨機選擇一種手段對原始數據進行變換,並調整它們的大小。

增廣手段

以往數據增強方法都包含30多個參數,爲減少參數空間的同時保持數據(圖像)的多樣性,研究人員用無參數過程替代了學習的策略和概率。這些策略和概率適用於每次變換(transformation),該過程始終選擇均勻概率爲1/K的變換。

即給定某個訓練圖像的N種變換形式,RandAugment就能表示KNK^N個潛在策略。最後,需要考慮到的一組參數是每個增強結果所造成的失真程度。

研究人員採用線性標度來表示每個轉換的強度。簡單來說,就是每次變換都在0到10的整數範圍內,其中,10表示給定變換的最大範圍

爲了進一步縮小參數空間,團隊觀察到每個轉換的學習幅度(learned magnitude)在訓練期間遵循類似的表。不同顏色代表不同的增廣方式,橫座標爲epoch迭代次數:
變換強度隨epoch變化
顯然,隨着epoch增加,早期的幅度並不大,說明生成的數據量並不多,且針對不同輸入數據的分佈,所採用的增廣手段也不同。

假設一個單一的全局失真M(global distortion M)可能就足以對所有轉換進行參數化。那麼生成的算法便包含兩個參數N(變換形式個數)和M,還可以用兩行Python代碼簡單表示:

# 用於生成全局失真數據
# 參數:
# 		N:將被選擇出的操作數
#		M:失真級數
transforms = ['Identity', 'AutoContrast','Equalize',
			  'rotate', 'Solarize', 'Color',
			  'Posterize', 'Contrast', 'Brightness',
			  'Sharpness', 'ShearX', 'ShearY',
			  'TranslateX', 'TranslateY']
def randaugment(N, M):
	# 從transforms方法中隨機選取N種操作,eg:N=2,則可能選擇出['Color', 'Contrast']
	sampled_ops = np.random.choice(transforms, N)
	return [(op, M) for op in sampled_ops]

顯然,N和M的值越大,代表對增廣強度的正則化程度越大。考慮到採用該方法後造成搜索空間略小,團隊人員發現採用樸素網格搜索(Naive Grid Search)在此是有效的

作者團隊還比較了不同網絡大小和數據集大小與增廣強度、最終精度之間的關係,具體請詳見論文。

發佈了19 篇原創文章 · 獲贊 3 · 訪問量 9497
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章