谷歌開源AdaNet:基於TensorFlow的AutoML框架
選自arXiv,作者:Mikel Artetxe,機器之心編譯,參與:路雪、李亞洲。
谷歌開源了基於 TensorFlow 的輕量級框架 AdaNet,該框架可以使用少量專家干預來自動學習高質量模型。據介紹,AdaNet 在谷歌近期的強化學習和基於進化的 AutoML 的基礎上構建,快速靈活同時能夠提供學習保證(learning guarantee)。重要的是,AdaNet 提供通用框架,不僅能用於學習神經網路架構,還能學習集成架構以獲取更好的模型。
- 相關論文: AdaNet: Adaptive Structural Learning of Artificial Neural Networks
- 論文地址:http://proceedings.mlr.press/v70/cortes17a/cortes17a.pdf
- Github 項目地址:https://github.com/tensorflow/adanet
- 教程 notebook:https://github.com/tensorflow/adanet/tree/v0.1.0/adanet/examples/tutorials
結合不同機器學習模型預測的集成學習在神經網路中得到廣泛使用以獲得最優性能,它從其悠久歷史和理論保證中受益良多,從而在 Netflix Prize 和多項 Kaggle 競賽等挑戰賽中取得勝利。但是,因其訓練時間長、機器學習模型的選擇要求領域專業知識,它們在實踐中並不那麼常用。而隨著算力、深度學習專用硬體(如 TPU)的發展,機器學習模型將越來越大,集成技術也將越發重要。現在,想像一個工具,它能夠自動搜索神經架構,學習將最好的神經架構集成起來構建高質量模型。
剛剛,谷歌發布博客,開源了基於 TensorFlow 的輕量級框架 AdaNet,該框架可以使用少量專家干預來自動學習高質量模型。AdaNet 在谷歌近期的強化學習和基於進化的 AutoML 的基礎上構建,快速靈活同時能夠提供學習保證(learning guarantee)。重要的是,AdaNet 提供通用框架,不僅能用於學習神經網路架構,還能學習集成架構以獲取更好的模型。
AdaNet 易於使用,能夠創建高質量模型,節省 ML 從業者在選擇最優神經網路架構上所花費的時間,實現學習神經架構作為集成子網路的自適應演算法。AdaNet 能夠添加不同深度、寬度的子網路,從而創建不同的集成,並在性能改進和參數數量之間進行權衡。
打開今日頭條,查看更多精彩圖片
AdaNet 適應性地增長集成中神經網路的數量。在每次迭代中,AdaNet 衡量每個候選神經網路的集成損失,然後選擇最好的神經架構進入下一次迭代。
快速易用
AdaNet 實現了 TensorFlow Estimator 介面,通過壓縮訓練、評估、預測和導出極大地簡化了機器學習編程。它整合如 TensorFlow Hub modules、TensorFlow Model Analysis、Google Cloud』s Hyperparameter Tuner 這樣的開源工具。它支持分散式訓練,極大減少了訓練時間,使用可用 CPU 和加速器(例如 GPU)實現線性擴展。
AdaNet 在 CIFAR-100 上每個訓練步(x 軸)對應的準確率(y 軸)。藍線是訓練集上的準確率,紅線是測試集上的性能。每一百萬個訓練步開始一個新的子網路,最終提高整個集成網路的性能。灰色和綠色線是添加新的子網路之前的集成準確率。
TensorBoard 是 TensorFlow 最好的功能之一,能夠可視化訓練過程中的模型指標。AdaNet 將 TensorBoard 無縫集成,以監控子網路的訓練、集成組合和性能。AdaNet 完成訓練後將導出一個 SavedModel,可使用 TensorFlow Serving 進行部署。
學習保證
構建神經網路集成存在多個挑戰:最佳子網路架構是什麼?重複使用同樣的架構好還是鼓勵差異化好?雖然具備更多參數的複雜子網路在訓練集上表現更好,但也因其極大的複雜性它們難以泛化到未見過的數據上。這些挑戰源自對模型性能的評估。我們可以在訓練集分留出的數據集上評估模型表現,但是這麼做會降低訓練神經網路的樣本數量。
不同的是,AdaNet 的方法是優化一個目標函數,在神經網路集成在訓練集上的表現與泛化能力之間進行權衡。直觀上,即僅在候選子網路改進網路集成訓練損失的程度超過其對泛化能力的影響時,選擇該候選子網路。這保證了:
- 集成網路的泛化誤差受訓練誤差和複雜度的約束。
- 通過優化這一目標函數,能夠直接最小化這一約束。
優化這一目標函數的實際收益是它能減少選擇哪個候選子網路加入集成時對留出數據集的需求。另一個益處是允許使用更多訓練數據來訓練子網路。
AdaNet 目標函數教程:https://github.com/tensorflow/adanet/blob/v0.1.0/adanet/examples/tutorials/adanet_objective.ipynb
可擴展
谷歌認為,創建有用的 AutoML 框架的關鍵是:研究和產品使用方面不僅能夠提供合理的默認設置,還要讓用戶嘗試自己的子網路/模型定義。這樣,機器學習研究者、從業者、喜愛者都能夠使用 tf.layers 這樣的 API 定義自己的 AdaNet adanet.subnetwork.Builder。
已在自己系統中融合 TensorFlow 模型的用戶可以輕鬆將 TensorFlow 代碼轉換到 AdaNet 子網路中,並使用 adanet.Estimator 來提升模型表現同時獲取學習保證。AdaNet 將探索他們定義的候選子網路搜索空間,並學習集成這些子網路。例如,採用 NASNet-A CIFAR 架構的開源實現,把它遷移到一個子網路,經過 8 次 AdaNet 迭代後提高其在 CIFAR-10 上的當前最優結果。此外,獲得的模型在更少參數的情況下獲得了以下結果:
在 CIFAR-10 數據集上,NASNet-A 模型的表現 vs 結合多個小型 NASNet-A 子網路的 AdaNet 的表現。
通過固定或自定義 tf.contrib.estimator.Heads,用戶可以使用自己定義的損失函數作為 AdaNet 目標函數的一部分來訓練回歸、分類和多任務學習問題。
用戶也可以通過拓展 adanet.subnetwork.Generator 類別,完全定義要探索的候選子網路搜索空間。這使得用戶能夠基於硬體擴大或縮小搜索空間範圍。子網路的搜索空間可以簡單到複製具備不同隨機種子的同一子網路配置,從而訓練數十種具備不同超參數組合的子網路,並讓 AdaNet 選擇其中一個進入最終的集成模型。
※TensorFlow 2.0將把Eager Execution變為默認執行模式
※馬斯克同意卸任特斯拉董事長,付千萬美元罰款:與證監會達成協議
TAG:機器之心 |