天天看點

機器學習狗太苦逼了!自動化調參哪家強?

動機:機器學習狗太苦逼了

在給定的資料集上實作最先進的結果是十分困難的。這往往需要小心翼翼地選擇正确的資料預處理方式,精心挑選算法、模型及架構,并裝配最合适的一套參數。這種端到端的過程通常被稱為機器學習流水線 / 工作流。這套流程中的每一步怎麼走并沒有一個經驗上的固定方向。而且,因為新的模型不斷被開發出來,就連選擇合适的模型都成為了一個巨大挑戰。超參數的調試通常需要對所有可能值進行周遊或抽樣,也就是把所有參數都試一遍。然而,這也并不能保證找出來的東西就是有用的。在這種情況下,自動化選擇參數和調試機器學習工作流的過程早就成為了機器學習社群的目标之一。這類任務通常被稱為元學習——學習如何學習。

這似乎也是人類曆史開始時我們祖先的目标。這是一個有趣的故事……

機器學習狗太苦逼了!自動化調參哪家強?
空空道人與石頭記(譯者瞎編的,其實是哈利·波特與死亡聖器)  

很久很久以前,一位煉丹的道長擅長在某種架構下用某種語言訓練模型,但這個架構其實早就廢棄了,他用的程式設計語言也早就沒人用了。有一天,一位長者讓他在一個神秘的資料集上訓練一個模型。
然而,道長在這個資料集上用成千上萬的方法訓練了無數次,也沒得到想要的性能。他去自己的圖書館查閱相關資料,找到了一本書,裡面講了一種特殊的符咒。這個符咒可以送他去一方勝境,在那裡所有秘密都被揭開,所有可能的模型都被嘗試過,所有優化方法都被實作了。他念動符咒,疾喚一聲“開”,隻見一股青煙自平地兀自升起,道長便被送往那勝境(對不起譯者胡扯太多了:p)。在那裡,他了解到了如何得到一個更好的模型——于是他照做了。在回去之前,他難以抑制自己的沖動,要将這種神力全數帶回。是以,他将此方勝境中的所見所聞刻于石上,題為自動化,攜回那苦逼調參之邦。若有訪道求仙者尋得這寶物,便可神力倍增,從此訓練任何模型都可稱心順遂。

這故事很恐怖吧?我不知道這故事是否是真的,但在現代社會中,機器學習領域的巨頭們很樂于将這種事變成真的(當然可能會進行一些微小的改變)。本文中,我會分享一些現在可用的設定,并幫助你建立起一種直覺,讓你知道巨頭們都在做什麼(因為雖然它們的名字裡都有“自動”這個詞,卻沒有什麼相同的地方)。

Azure 自動機器學習(預覽版)

  • 是否開源: 否
  • 是否基于雲: 是(僅測試,訓練可在任何機器上進行)
  • 支援任務: 分類,回歸
  • 所用技術: 機率矩陣分解 + 貝葉斯優化
  • 訓練架構: sklearn

該方法背後的思想是,如果兩個資料集在幾個機器學習工作流上都得到了相似的結果,那麼它們很有可能在剩下的其他工作流上也得到這樣的結果。這種說法可能對你來說很熟悉,尤其是如果你以前處理過推薦系統中的協同過濾問題,也就是如果兩個使用者在過去喜歡過同一件東西,那麼他們在未來可能會喜歡相似的東西。

圖:P 個工作流、D 個資料集的輸入矩陣可視化。圖中的數字代表資料集 d 在工作流 p 上獲得的值的平均值。

解決這一問題需要考慮兩個子問題:其一,學習出不同資料集和不同機器學習工作流之間的一種隐藏表示,以捕捉二者之間的關系,來預測某個工作流在某個資料集上能夠擷取的精度;其二,學習出一個函數,可以讓你準确知道下一個要嘗試的工作流。第一個任務可以通過建立一個矩陣來解決,該矩陣記錄了不同資料集上不同工作流擷取的平衡精度。該方法的相關論文(連結:https://arxiv.org/pdf/1705.05355.pdf)表示他們在大約 600 個資料集上試驗了 42,000 種不同的機器學習工作流。現在我們在預覽版 Azure 上看到的方法可能和這個不完全一樣,但思想是一樣的。作者表明,學習到的隐藏表示不僅成功地捕獲到了模型資訊,還學習到了超參數資訊和資料集特點(注意這種學習過程是無監督的)。

到目前為止描述的模型可以被用于将每一個機器學習工作流的期望性能預測為已驗證過的工作流的一個函數,但并沒有告訴我們下一個要驗證的工作流是什麼。由于他們使用了矩陣分解的一種機率表示,該方法會給出預測工作流表現的後驗機率分布,是以可以使用獲得函數(即貝葉斯優化方法)來引導機器學習工作流空間的探索路徑。基本上,該方法選擇的下一個工作流能夠最大化精度的期望增值。

然而,推薦系統往往會在一個問題上栽跟頭——冷啟動。基本思想是如果一個新的資料集進入了該系統,比如你的自定義資料集,那麼模型會完全不知道這個新資料集和誰相似。為解決這一冷啟動問題,需要從資料集中計算出一些元特征,用以捕獲資料集的一些特點,如觀察數量、類型數量、值的範圍等。然後,通過使用這些度量标準,他們可以在已知資料集集合中找到一個相近資料集。他們将該方法在不同工作流上測試了五次,直到他們得到了獲得函數,進而确定下一步要測試的資料集為止。注意,這個方法并不需要直接通路資料集,而隻需要用到在資料集上離線計算出的元特征(這使得該方法資源消耗更少)。

谷歌 AutoML

  • 是否基于雲: 是(訓練和測試均基于雲)
  • 支援任務: 用于分類的 CNN,RNN,LSTM
  • 所用技術: 基于政策梯度更新的強化學習
  • 訓練架構: TensorFlow

談到神經網絡,目前最先進模型的成功離不開從特征設計到架構設計的政策轉移。也就是說,最有效的政策是設計能從資料中無監督地學習到最優表示的架構,而非直接操作那些特征(直接操作特征更複雜,而且需要了解關于資料的諸多知識)。然而,設計架構也需要很多知識,而且耗時較長。谷歌的 AutoML 的想法是建立一個元模型,該模型可以從各資料集相關的子模型中學習到一種設計和生成架構的方法(好厲害)。

他們使用了用 RNN 實作的神經網絡結構檢索模型,該模型能夠生成被編碼為變量長度的表征序列(這樣說比較複雜,其實就是被編碼為一種“弦”)的架構。

機器學習狗太苦逼了!自動化調參哪家強?

圖:使用上述方法生成的 CNN 的編碼方式。每種顔色的框對應一個由 RNN 生成的上述方法的架構中的參數(或表征)。

一旦一個架構被生成出來,上述方法的模型就已被建立并訓練,最終記錄模型獲得的精度。生成架構用的 RNN 是通過強化學習訓練得來的,并用了特定規則更新其中參數,以使得該模型随着時間的推移能夠生成越來越好的架構。

用于編碼的表征序列可以被看作是一系列生成架構需要完成的動作。該模型最終會在資料集上獲得一個精度 R。我們可以将 R 作為強化學習的一個獎勵信号,用以訓練 RNN。然而,這樣的獎勵是不可導的,這也就是為什麼他們選用了 Williams 在 1992 年提出的政策梯度的方法來疊代更新參數——當然具體做法會有一些改動。由于訓練過程可能會耗時非常長,他們使用了 Dean 等人在 2012 年提出的分布式訓練和異步參數更新的方法,來加速學習過程。

該方法可以生成哪些模型?基于 Nair 和 Hinton 發表于 2010 年的一篇論文(連結:https://arxiv.org/pdf/1611.01578.pdf),他們使用了修正線性單元作為卷積架構的非線性項,并根據 Ioffe 和 Szegedy 2015 年的論文加入了批标準化,以及 Szegedy 等人(2015)和 He 等人(2016)論文中的各層之間的跳躍連接配接。對于每個卷積層,該架構可以從 [1, 3, 5, 7] 中選擇一個卷積核高度和一個卷積核寬度,并從 [24, 36, 48] 中選擇一個卷積核數量。至于步長,會從 [1, 2, 3] 中選出一個。對于 RNN 和 LSTM,該架構支援從 [identity, tanh, sigmoid, relu] 中選擇一個激活函數。一個 RNN 元胞中包含的輸入對的數量(即“基數”)預設設定為 8。

AutoKeras

  • 是否開源: 是
  • 是否基于雲: 否
  • 所用技術: 基于網絡态射的高效神經網絡結構檢索(論文連結:https://arxiv.org/abs/1806.10282)
  • 訓練架構: Keras

AutoKeras 的建構原理和谷歌的 AutoML 一樣:它使用了一個 RNN 控制器,該 RNN 是通過周遊候選架構(即子模型的樣本)訓練得來的。然後,該模型被訓練以評估其在目标任務上的性能。接着,該控制器用評估得來的性能名額作為指導信号,用于尋找更好的架構。然而,我們之前沒有提到這個過程是多麼消耗計算資源。神經網絡結構檢索十分計算密集和耗時。例如,Zoph 等人(2018)使用了 450 塊 GPU,計算了約 40,000GPU 時。另一方面,使用更少的資源會造成更差的結果。為解決這一問題,AutoKeras 使用了高效神經網絡結構檢索(Efficient Neural Architecture Search,ENAS)。

ENAS 應用了一個和遷移學習相似的概念,即特定模型特定任務下學習出的參數可以應用于其他模型上的其他任務。是以,ENAS 強迫所有生成出的子模型共享權重,有意避免從頭訓練每個子模型。該論文的作者們表示,共享子模型參數不僅是可能的,而且能獲得非常好的性能。

Auto-sklearn

  • 所用技術: 貝葉斯優化 + 自動內建建構

Auto-sklearn 的原理基于在 Auto-Weka(參見:https://www.automl.org/automl/autoweka/) 中用到的 CASH(Combined Algorithm Selection and Hyperparameter Optimization,組合算法選擇和超參數優化)問題的定義。這與 Azure 自動化機器學習背後的原理相同:都是考慮同時選擇學習算法及其超參數設定。二者之間主要的不同在于 Auto-sklearn 在主過程中多加了兩個步驟:在最開始增加了一個元學習步驟,并在最後增加了一個自動化內建建構步驟(詳見:https://papers.nips.cc/paper/5872-efficient-and-robust-automated-machine-learning)。

機器學習狗太苦逼了!自動化調參哪家強?

圖:auto-sklearn AutoML 方法

該方法将資料集表示為共 38 個元特征,包括簡單元特征、資訊論元特征和統計元特征這幾類,如資料點、特征、類别的數量,資料偏度,以及目标的熵等等。通過使用這種資訊,他們選擇了 k 個設定來初始化貝葉斯優化。注意,這種元學習方法和 Azure 自動機器學習一樣,資料集越多越能發揮效力。

貝葉斯優化過程完成後,他們為所有測試過的模型建構了一個內建。這一步的思想是儲存每個模型的訓練過程中獲得的所有資訊。這一步會儲存所有模型、建構一個內建模型,而不是直接扔掉差的模型、保留好的。這種自動內建建構避免了将自身變成一個單一的超參數,是以魯棒性更強(而且更不容易過拟合)。這種內建是用內建選擇的方法建構的(這是一個貪心過程,開始時內建為空,然後向其中疊代加入使內建測試性能最大化的模型)。

總結和評論