AutoML数据增广
DeepAugment是一個專注于數據擴充的自動化工具。 它利用貝葉斯優(yōu)化來發(fā)現針對您的圖像數據集定制的數據增強策略。 DeepAugment的主要優(yōu)點和特點是:
- 降低CNN模型的錯誤率(WRN-28-10顯示CIFAR10的錯誤率降低了60%)
- 通過自動化流程可以節(jié)省時間
- 比谷歌之前的解決方案——AutoAugment——快50倍
完成的包在PyPI上。你可以通過運行以下命令來在終端上安裝它:
$ pip install deepaugment你也可以訪問項目的自述文件或運行谷歌Colab筆記本教程。要想了解更多關于我是如何構建這個的,請繼續(xù)閱讀!
引言
數據是人工智能應用中最關鍵的部分。沒有足夠的標記數據常常導致過度擬合,這意味著模型將無法歸納為未發(fā)現的示例。這可以通過數據擴充來緩解,數據擴充可以有效地增加網絡所看到的數據的數量和多樣性。它是通過對原始數據集(如旋轉、裁剪、遮擋等)應用轉換,人為地生成新數據來實現的。然而,確定哪種增強對手頭的數據集最有效并不是一項簡單的任務。為了解決這個問題,谷歌去年發(fā)布了AutoAugment,它通過使用強化學習發(fā)現了給定數據集的優(yōu)化增強。
由于強化學習模塊的存在,使用谷歌的AutoAugment需要強大的計算資源。由于獲得所需的計算能力代價高昂,因此我開發(fā)了一種新的方法——DeepAugment,它使用貝葉斯優(yōu)化而不是強化學習。
如何獲得更好的數據
努力改進數據質量通常比努力改進模型獲得更高的投資回報。改進數據有三種主要方法:收集更多的數據、合成新數據或擴展現有數據。收集額外的數據并不總是可行的,而且可能很昂貴。GANs所做的數據合成是很有前途的,但也很復雜,可能與實際的例子有所不同。
另一方面,數據擴充簡單且影響很大。它適用于大多數數據集,并通過簡單的圖像轉換完成。然而,問題是確定哪種增強技術最適合當前的數據集。發(fā)現正確的方法需要耗時的實驗。即使經過多次實驗,機器學習(ML)工程師仍然可能找不到最佳選擇。
對于每個圖像數據集,有效的增強策略是不同的,一些增強技術甚至可能對模型有害。例如,如果使用MNIST digits數據集,應用旋轉會使模型變得更糟,因為在“6”上180度旋轉會使它看起來像“9”,而仍然被標記為“6”。另一方面,對衛(wèi)星圖像應用旋轉可以顯著改善結果,因為無論旋轉多少次,從空中拍攝的汽車圖像仍然是一輛汽車。
DeepAugment:閃電般迅速的autoML
DeepAugment旨在作為一種快速靈活的autoML數據擴充解決方案。更具體地說,它被設計為AutoAugment的更快和更靈活的替代品。(2018年Cubuk等人的博客)AutoAugment是2018年最令人興奮的發(fā)布之一,也是第一種使用強化學習來解決這一特定問題的方法。在本文發(fā)表時,AutoAugment的開源版本沒有提供控制器模塊,這阻礙了用戶為自己的數據集使用它。此外,學習增強策略需要15,000次迭代,這需要巨大的計算資源。即使源代碼完全可用,大多數人也無法從中受益。
deepaugmented通過以下設計目標來解決這些問題:
1.在保證結果質量的前提下,最小化數據擴充優(yōu)化的計算復雜度。
2.模塊化和人性化。
為了實現第一個目標,與AutoAugment相比,DeepAugment的設計具有以下差異:
- 使用貝葉斯優(yōu)化代替強化學習(需要更少的迭代)(~100x加速)
- 最小化子模型大小(降低每次訓練的計算復雜度)(~20x加速)
- 減少隨機擴充搜索空間設計(減少所需的迭代次數)
為了實現第二個目標,即使DeepAugment模塊化和人性化,用戶界面的設計方式為用戶提供了廣泛的可能性配置和模型選擇(例如,選擇子模型或輸入自設計的子模型,請參閱配置選項)。
設計擴充策略
DeepAugment旨在為給定的圖像數據集找到最佳的擴充策略。增強策略被定義為五個子策略的總和,這兩個子策略由兩種類型的增強技術和兩個實值[0,1]組成,決定了每種增強技術的應用能力。我使用imgaug包實現了增強技術,imgaug包以其大量的增強技術(見下文)而聞名。
當多樣化和隨機應用時,增強是最有效的。例如,與其旋轉每個圖像,不如旋轉圖像的某些部分,剪切另一部分,然后對另一部分應用顏色反轉。基于這一觀察,Deepaugment對圖像隨機應用五個子策略之一(包括兩個增強)。優(yōu)化過程中,每個圖像被五個子策略之一增強的概率(16%)相等,而完全不被增強的概率為20%。
雖然這個策略設計受到了autoaugmented的啟發(fā),但有一個主要的區(qū)別:我沒有使用任何參數來應用子策略的概率,以便使策略的隨機性更低,并允許在更少的迭代中進行優(yōu)化。
這個策略設計為貝葉斯優(yōu)化器創(chuàng)建了一個20維的搜索空間,其中10個維度是分類(增強技術的類型),其他10個維度是實值(大小)。由于涉及到分類值,我將貝葉斯優(yōu)化器配置為使用隨機森林估計器。
DeepAugment如何找到最佳策略
DeepAugment的三個主要組件是控制器(貝葉斯優(yōu)化器),增強器和子模型,整個工作流程如下:控制器采樣新的增強策略,增強器按新策略轉換圖像,子模型是通過增強圖像從頭開始訓練。
根據子模型的訓練歷史計算獎勵。獎勵返回給控制器,控制器使用此獎勵和相關的增強策略更新代理模型(請參閱下面的“貝葉斯優(yōu)化如何工作”一節(jié))。然后控制器再次采樣新策略,并重復相同的步驟。此過程循環(huán),直到達到用戶確定的最大迭代次數。
控制器(貝葉斯優(yōu)化器)是使用scikit- optimization庫的ask-and-tell方法實現的。它被配置為使用一個隨機森林估計器作為其基本估計器,并期望改進作為其獲取函數。
DeepAugment的基本工作流程
貝葉斯優(yōu)化是如何工作的
貝葉斯優(yōu)化的目的是找到一組最大化目標函數值的參數。 貝葉斯優(yōu)化的工作循環(huán)可以概括為:
1.建立目標函數的代理模型
2.查找代理上執(zhí)行得最好的參數
3.使用這些參數執(zhí)行目標函數
4.使用這些參數和目標函數的得分更新代理模型
5.重復步驟2-4,直到達到最大迭代次數
有關貝葉斯優(yōu)化的更多信息,請閱讀高級的這篇解釋的博客,或者看一下這篇綜述文章。
貝葉斯優(yōu)化的二維描述,其中x和y軸表示增強類型,點(i,j)處的顏色表示用增強i和j所增強的數據進行訓練時CNN模型的精度。
貝葉斯優(yōu)化的權衡
目前用于超參數優(yōu)化的標準方法有隨機搜索、網格搜索、貝葉斯優(yōu)化、進化算法和強化學習,按方法復雜度排序。在超參數優(yōu)化的精度、成本和計算時間方面,貝葉斯優(yōu)化優(yōu)于網格搜索和隨機搜索(參見這里的經驗比較)。這是因為貝葉斯優(yōu)化從先前參數的運行中學習,與網格搜索和隨機搜索相反。
當貝葉斯優(yōu)化與強化學習和進化算法進行比較時,它提供了具有競爭力的準確性,同時需要更少的迭代。例如,為了學習好的策略,谷歌的AutoAugment迭代15,000次(這意味著訓練子CNN模型15,000次)。另一方面,貝葉斯優(yōu)化在100-300次迭代中學習良好的策略。貝葉斯優(yōu)化的經驗法則是使迭代次數等于優(yōu)化參數的次數乘以10。
超參數優(yōu)化方法的直觀比較。通過比較類別,加號(+)的數量表示該方法有多好。
挑戰(zhàn)及對策
挑戰(zhàn)1:優(yōu)化增強需要大量的計算資源,因為子模型應該從頭開始反復訓練。大大減慢了我的工具的開發(fā)過程。 盡管使用貝葉斯優(yōu)化使其更快,但優(yōu)化過程仍然不夠快,無法使開發(fā)變得可行。
對策:我開發(fā)了兩種解決方案。首先,我優(yōu)化了子CNN模型(見下圖),這是該過程的計算瓶頸。其次,我以更確定的方式設計了增強策略,使貝葉斯優(yōu)化器需要更少的迭代。
設計子CNN模型。它在AWS p3.2x大型實例(帶有112 TensorFLOPS的Tesla V100 GPU)上以32x32圖像在約30秒(120個周期)的時間內完成培訓。
挑戰(zhàn)2:我在DeepAugment的開發(fā)過程中遇到了一個有趣的問題。在通過一遍又一遍地訓練子模型來優(yōu)化增強期間,它們開始過度擬合驗證集。當我更改驗證集時,我發(fā)現的最佳策略表現不佳。這是一個有趣的例子,因為它不同于一般意義上的過度擬合,即模型權重過度擬合數據中的噪聲。
對策:我沒有使用相同的驗證集,而是將剩余的數據和訓練數據保留為“種子驗證集”,并在每次子CNN模型訓練時對1000個圖像的驗證集進行采樣(參見下面的數據管道)。這解決了增強過度擬合問題。
如何集成到ML pipeline中
DeepAugment發(fā)布在PyPI上。你可以通過運行以下命令來在終端安裝它:
$ pip install deepaugment并且使用方便:
from deepaugment.deepaugment import DeepAugment deepaug = DeepAugment(my_images, my_labels) best_policies = deepaug.optimize()通過配置DeepAugment,可以獲得更高級的用法:
from keras.datasets import cifar10 # my configuration my_config = {"model": "basiccnn","method": "bayesian_optimization","train_set_size": 2000,"opt_samples": 3,"opt_last_n_epochs": 3,"opt_initial_points": 10,"child_epochs": 50,"child_first_train_epochs": 0,"child_batch_size": 64 } (x_train, y_train), (x_test, y_test) = cifar10.load_data() # X_train.shape -> (N, M, M, 3) # y_train.shape -> (N) deepaug = DeepAugment(x_train, y_train, config=my_config) best_policies = deepaug.optimize(300)有關更詳細的安裝/使用信息,請訪問項目的自述文件或運行Google Colab筆記本教程。
結論
據我們所知,DeepAugment是第一種利用貝葉斯優(yōu)化來尋找最佳數據增強的方法。 數據增強的優(yōu)化是最近的一個研究領域,AutoAugment是解決這一問題的首批方法之一。
Deepaugment對開源社區(qū)的主要貢獻在于它使進程具有可擴展性,允許用戶在不需要大量計算資源的情況下優(yōu)化擴充策略*。它是非常模塊化的,比以前的解決方案AutoAugment快50倍以上。
WideResNet-28-10 CNN模型與CIFAR10圖像在被Deepaugment發(fā)現的策略增強和不增強時的驗證精度比較驗證精度提高8.5%,相當于減少了60%的誤差。
結果表明,使用CIFAR-10小圖像數據集的WideResNet-28-10模型與不使用增強的模型和數據集相比,Deepaugment可以減少60%的誤差。
Deepaugment目前只優(yōu)化圖像分類任務的增強。它可以擴展到優(yōu)化對象檢測或分割任務,如果你愿意,我歡迎你的貢獻。但是,我認為最好的增強策略非常依賴于數據集的類型,而不是任務(例如分類或對象檢測)。這意味著無論任務是什么,AutoAugment都應該找到類似的策略,但如果這些策略最終變得非常不同,那將是非常有趣的!
雖然DeepAugment目前適用于圖像數據集,但將其擴展到文本、音頻或視頻數據集將非常有趣。同樣的概念也適用于其他類型的數據集。
*使用AWS P3.X2Large實例,DeepAugment在CIFAR-10數據集上花費4.2小時(500次迭代),成本約為13美元。
感謝
我在Insight人工智能研究員計劃期間的三個星期內完成了這個項目。我感謝程序總監(jiān)Matt Rubashkin和Amber Roberts的非常有用的指導,感謝我的技術顧問Melissa Runfeldt幫助我解決問題。我感謝Amber Roberts,Emmanuel Ameisen,Holly Szafarek和Andrew Forrester在這篇博客文章中提出的建議和編輯工作。
想要提升你在數據科學和人工智能領域的職業(yè)生涯?申請SV和NYC的截止日期是4月1日!在Insight了解更多關于人工智能程序的信息!
原文鏈接
本文為云棲社區(qū)原創(chuàng)內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的AutoML数据增广的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PostgreSQL 优化器代码概览
- 下一篇: 揭秘 | 双11逆天记录背后的数据库技术