當前位置:
首頁 > 知識 > AutoML又一利器來了,谷歌宣布開源AdaNet

AutoML又一利器來了,谷歌宣布開源AdaNet

今天,谷歌宣布開源AdaNet,這是一個輕量級的基於TensorFlow的框架,可以在最少的專家干預下自動學習高質量的模型。

這個項目基於Cortes等人2017年提出的AdaNet演算法,用於學習作為子網路集合的神經網路的結構。

谷歌AI負責人Jeff Dean表示,這是谷歌AutoML整體工作的一部分,並且,谷歌同時提供了AdaNet的開源版本和教程notebook。

該團隊在介紹博客中表示:「AdaNet以我們最近的強化學習和基於進化的AutoML研究為基礎,在提供學習保證的同時實現了快速、靈活。重要的是,AdaNet提供了一個通用框架,不僅可以學習神經網路架構,還可以學習集成,以獲得更好的模型。

AdaNet提供以下特徵:

Estimator API,可輕鬆訓練、評估和服務AdaNet模型。

學習在TensorFlow中集成用戶定義的子網。

用於在單個 train() 調用中搜索子網架構和參數的介面。

關於CPU和GPU的分散式訓練(我們正在開發TPU支持)。

一流的TensorBoard integration。

提供理論學習。

基於集成學習的自動搜索工具

集成學習(Ensemble learning)是將不同機器學習(ML)模型預測結合起來的技術,廣泛用於神經網路,以實現最先進的性能。得益於豐富的經驗和理論保證,集成學習在許多Kaggle競賽中取得了成功,例如Netflix Prize。

由於訓練時間長,集成學習在實踐中使用不多,而且選擇哪個ML模型需要根據其領域專業知識來。

但隨著計算能力和專用深度學習硬體(如TPU)變得更容易獲得,機器學習模型的一個趨勢是變得更大,集成(ensemble)也就變得更加重要。

現在,AdaNet就是這樣一個工具,可以自動搜索神經網路架構,並學會將最好的架構組合成一個高質量的模型。

AdaNet易於使用,並能創建高質量的模型,為ML實踐者節省了用於選擇最佳神經網路架構的時間,實現了一種將學習神經架構作為子網路集合的自適應演算法。

AdaNet能夠添加不同深度和寬度的子網路,以創建多樣化的集合,並通過參數數量來改進性能。

AdaNet自適應地產生了神經網路的集成。在每次迭代中,它測量每個候選對象的集成損失,並選擇最佳的一個,然後進入下一次迭代。

快速且易於使用

AdaNet實現了TensorFlow Estimator介面,通過封裝訓練、評估、預測和服務導出,大大簡化了機器學習編程。它集成了開源工具,如TensorFlow Hub模塊,TensorFlow Model Analysis和Google Cloud的Hyperparameter Tuner。分散式訓練支持可顯著縮短訓練時間,並可與可用的CPU和加速器(例如GPU)進行線性擴展。

AdaNet在CIFAR-100上每個訓練步驟(X軸)的精度(y軸)。藍線是訓練集上的性能,紅線是測試集上的性能。每一百萬步開始訓練一個新的子網路,並最終提高整體的性能。在添加新子網之前,灰線和綠線是集合的準確度。

由於TensorBoard是用於在訓練期間可視化模型性鞥的最佳TensorFlow功能之一,AdaNet可與其無縫集成,以監控子網路訓練,集合組合和性能。當AdaNet完成訓練後,它會導出一個可以使用TensorFlow Serving部署的SavedModel。

學習保證

構建神經網路集合面臨這麼幾個挑戰:要考慮的最佳子網架構是什麼?再此使用相同的架構或鼓勵多樣性是不是最佳選擇?雖然具有更多參數的複雜子網將在訓練集上表現更好,但由於其存在更強的複雜性,它們可能不會適用於未知數據。這些挑戰來自評估模型性能的過程。我們可以評估一個訓練集子集的性能,但這樣做會減少可用於訓練神經網路的示例數量。

相反,AdaNet的方法(在ICML 2017的「 AdaNet:人工神經網路的自適應結構學習 」一文中提出)是為了優化一個對象,以平衡集合在訓練集上的表現與其適用於未知數據的能力之間的權衡。集合這樣選擇子網路:只有當候選子網路改進了總體的訓練損失,而不是影響了整體的泛化能力時,才包含這個候選子網路。這保證了:

1.集合的泛化誤差受到訓練誤差和複雜性的限制。

2.通過優化對象,我們可以直接將限制最小化。

優化對象的一個實際好處是:它不需要保留集來選擇要添加到集合中的候選子網。這還將帶來另一個好處:我們可以使用更多的訓練數據來訓練子網。

可擴展性

我們認為,為滿足研究和生產製作AutoML框架的關鍵在於不僅要提供合理的默認值,還要允許用戶嘗試自己子網及模型的定義。因此,機器學習研究人員、從業人員和愛好者均可報名定義自己的AdaNet adanet.subnetwork.Builder,通過使用高級別的TensorFlow API,如tf.layers。

已經在其系統中集成TensorFlow模型的用戶可以輕鬆地將他們的TensorFlow代碼轉換為AdaNet子網,並使用adanet.Estimator提高模型性能,同時獲得學習保證。AdaNet將探測他們定義的候選子網的搜索空間,並學習整合子網。例如,我們採用了NASNet-A CIFAR架構的開源實現方式,將其轉換為子網,並在八次AdaNet迭代後對CIFAR-10最先進的結果進行改進。此外,我們的模型使用更少的參數實現了這一結果:

Zoph等人2018年提出的NASNet-A模型的性能,以及AdaNet學習在CIFAR-10上將小型NASNet-A子網結合起來的性能比較。

用戶還可以通過擴展adanet.subnetwork.Generator類來完全定義候選子網路的搜索空間。這允許他們根據可用硬體增大或減小搜索空間。子網路的搜索空間可以很簡單,只需使用不同的隨機種子複製相同的子網路配置,就能訓練具有不同超參數組合的數十個子網路,並讓AdaNet選擇要包含在最終集合中的子網路。

谷歌的研究團隊提供了GitHub repo和tutorial notebook,並且包含了一些使用dense layers和卷積的示例幫助大家入門。

AdaNet的數據集、工作原理和應用範圍

今天,該項目的成員也在Reddit和ycombinator上回答讀者提問,我們精選了一些回答:

1、請問你使用該演算法嘗試了哪些數據集?它是否只適用於圖像分類,比如Google的AutoML產品?

我們在圖像識別之外的幾個大型數據集上使用了AdaNet,包括結構化數據(參見原始論文)和一些NLP數據集。在大多數情況下,AdaNet的性能優於獨立訓練的任何單個子網路(這些子網路可能使用非常複雜的架構,如NASNet-A)。

當然,如何定義一個優化搜索空間,並使用合理的搜索啟發方式/演算法對於獲得最佳的最終模型非常重要,而且一般最佳的模型是使用強大的先驗,就像最先進的模型,並讓AdaNet學習將這些模型的不同變化結合起來。

但是,如果你希望AdaNet能夠通用於任意數據集,可以嘗試定義合理的搜索空間,比如搜索日益複雜的完全連接的神經網路,並允許AdaNet學習將其組合到最佳模型中。

最終,這就是我們設計的AdaNet具備高度靈活性的原因:我們希望任何人嘗試建立對自己的數據集有意義的子網路搜索空間,以便獲得最佳性能的最終模型。

2、官方資源庫中的示例是個更好的例子,說明了AdaNet的工作原理:

https://github.com/tensorflow/adanet/blob/master/adanet/examples/tutorials/adanet_objective.ipynb

儘管名字叫「AutoML」,但實際上似乎仍需要做很多工作才能實現模型的優化。 (第二個示例在這方面的表現相對更好一些:

https://github.com/tensorflow/adanet/blob/master/adanet/examples/tutorials/customizing_adanet.ipynb)

確實,雖然AdaNet項目目前還不包含最先進的架構搜索策略/搜索空間,但它確實為研究人員提供了一個抽象對象(adanet.subnetwork.Generator)來實現神經架構搜索演算法,同時提供了適合用戶的生產友好型的TF Estimator界面,讓演算法開發更容易集成到生產過程中,而且,已經使用TF Estimator生態系統的用戶也可以更快地從這些開發成果中受益。

我想指出的是,儘管AdaNet的某些方面並不那麼先進,但我們已經看到AdaNet在各種各樣的任務上取得了良好的效果。大家都來試試看吧!

當然,我們不會停下腳步!我們很高興自己也在這個領域工作,我們今後將繼續更新這個項目。

3、我還沒有細讀,但抱歉問一句;:AdaNet可以處理具有可變長度skip connections的塊嗎?(比如DenseNet),甚至能夠提供AmoebaNet風格的模型嗎?指導超參數/架構選擇過程的元策略(網格搜索/貝葉斯等)有哪些呢?謝謝!

這是個好問題!在最簡單的情況下,AdaNet允許用戶將獨立子網從線性模型集成到用戶定義的DenseNet / AmoebaNet式網路上。但更有趣的是在迭代之間共享信息(這些信息可以是張量輸出,或是哪些超參數表現最好),以便AdaNet進行神經架構搜索。用戶可以定義自己的adanet子網生成器,指定如何跨迭代過程調整訓練方式。

開箱即用的元策略其實和用戶簡單定義的啟發式演算法差不多。但是,AdaNet框架足夠靈活,可以支持更智能的策略,並抽象出分散式訓練(Estimator),評估(TensorBoard)和服務(tf.SavedModel)的複雜度。

4、機器學習和深度學習取得了如此大的進步。可以估計一下我需要多少CPU 和成本才能獲得一些結果嗎?我的數據訓練量大約是20M的樣本(每個樣本1K數據點)。

這取決於你搜索的子網數量以及每個子網的訓練成本。你可以使用單個DNN定義搜索空間,並為其提供一次迭代,這與固定DNN Estimator的操作相同。

比如說,假設搜索空間包含5個DNN,每個DNN完成一次迭代訓練需要的成本為X,訓練10次迭代,你的訓練成本就是X x 5 x 10 = 50X。

但是,考慮到你使用AdaNet,可以考慮整合50個DNN進行探索、訓練和選擇等流程,此外,由於AdaNet是作為TensorFlow Estimator實現的,如果這就是你想要的,可以很容易地增加機器數量,以加快訓練速度。

參考鏈接:

https://ai.googleblog.com/2018/10/introducing-adanet-fast-and-flexible.html

https://www.reddit.com/r/MachineLearning/comments/9spw5g/p_google_ai_opensources_a_tensorflow_framework/

教程:

https://github.com/tensorflow/adanet/tree/v0.1.0/adanet/examples/tutorials

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI講堂 的精彩文章:

美國量子戰略將出爐!白宮量子計算峰會谷歌、IBM等參會

TAG:AI講堂 |