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

dicksonjyl560101發表於2018-11-26

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

 

https://blog.csdn.net/weixin_42137700/article/details/84521901

 

 

作者|Facundo Santiago譯者|李志編輯|Debra

 

導讀: 對於每一個機器學習研究者和開發者來說,調參總是一個讓人頭疼的問題。如何在大量的引數空間內找到一個問題的最優引數呢?如今,許多業內巨頭們已經發布了自動調參框架,或許可以在一定程度上緩解調參難題。讓我們一起來看看吧!

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

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

 

很久很久以前,一位煉丹的道長擅長在某種框架下用某種語言訓練模型,但這個框架其實早就廢棄了,他用的程式語言也早就沒人用了。有一天,一位長者讓他在一個神秘的資料集上訓練一個模型。

然而,道長在這個資料集上用成千上萬的方法訓練了無數次,也沒得到想要的效能。他去自己的圖書館查閱相關資料,找到了一本書,裡面講了一種特殊的符咒。這個符咒可以送他去一方勝境,在那裡所有秘密都被揭開,所有可能的模型都被嘗試過,所有最佳化方法都被實現了。他念動符咒,疾喚一聲“開”,只見一股青煙自平地兀自升起,道長便被送往那勝境(對不起譯者胡扯太多了:p)。在那裡,他了解到了如何得到一個更好的模型——於是他照做了。在回去之前,他難以抑制自己的衝動,要將這種神力全數帶回。因此,他將此方勝境中的所見所聞刻於石上,題為 自動化 ,攜回那苦逼調參之邦。若有訪道求仙者尋得這寶物,便可神力倍增,從此訓練任何模型都可稱心順遂。

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

 

 

 

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

 

  • 是否開源:

  • 是否基於雲: 是(僅測試,訓練可在任何機器上進行)

  • 支援任務: 分類,迴歸

  • 所用技術: 機率矩陣分解 + 貝葉斯最佳化

  • 訓練框架 : sklearn

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

     

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

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

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

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

     

     

     

    谷歌 AutoML

     

  • 是否開源 : 否

  • 是否基於雲 : 是(訓練和測試均基於雲)

  • 支援任務 : 用於分類的 CNN,RNN,LSTM

  • 所用技術 : 基於策略梯度更新的強化學習

  • 訓練框架 : TensorFlow

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

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

     

     

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

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

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

    該方法可以生成哪些模型? 基於 Nair 和 Hinton 發表於 2010 年的一篇論文(連結:),他們使用了修正線性單元作為卷積架構的非線性項,並根據 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

     

  • 是否開源:

  • 是否基於雲 : 否

  • 支援任務 : 用於分類的 CNN,RNN,LSTM

  • 所用技術 : 基於網路態射的高效神經網路結構檢索(論文連結:)

  • 訓練框架 : Keras

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

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

     

     

     

    Auto-sklearn

     

  • 是否開源 : 是

  • 是否基於雲 : 否

  • 支援任務 : 分類,迴歸

  • 所用技術 : 貝葉斯最佳化 + 自動整合構建

  • 訓練框架 : sklearn

    Auto-sklearn 的原理基於在 Auto-Weka(參見:) 中用到的 CASH(Combined Algorithm Selection and Hyperparameter Optimization,組合演算法選擇和超引數最佳化)問題的定義。這與 Azure 自動化機器學習背後的原理相同:都是考慮同時選擇學習演算法及其超引數設定。 二者之間主要的不同在於 Auto-sklearn 在主過程中多加了兩個步驟:在最開始增加了一個元學習步驟,並在最後增加了一個自動化整合構建步驟(詳見:)。

     

     

    圖:auto-sklearn AutoML 方法

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

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

     

     

    總結和評論

    上面提到的每一種方法都有自己的優缺點,並有不同的作用空間。

    Azure 自動化機器學習和 auto-sklearn 是基於同一個原理構建的,可以用於迴歸和分類任務,對計算資源要求更低,因此更容易實現。它們不需要訪問整個資料集(只要需要構建的模型在其他地方已經生成了),因此在資料隱私方面比較優秀。但是,這兩種方法非常依賴於它們已經見過的資料集型別。它們無法測試新的東西,除非該機器學習工作流已經提前出現過。因此,我個人並不傾向於將這種型別的方法稱為元學習。

    另一方面,谷歌 AutoML 和 AutoKeras 使用的方法相同,均是試圖去學習一種方法來從頭構建模型。這種概念更為模糊,因此該方法僅侷限於幾種作用空間(如 CNN,RNN 和 LSTM)。然而,強化學習的方法使得他們可以尋找新的方法去構建模型(谷歌稱他們的方法找到了一種比現有模型效能好 1.05 倍的模型)。這種方法聽起來更像元學習。但是,強化學習方法會消耗大量計算資源,這也就是為什麼他們的雲服務需要收每小時 20 美元的租金。

    AutoKeras 效能最佳化可以用精度的稍微變差來換取價格的降低,在這種情況下不失為一種優選(而且它是開源的,對於注重隱私的人來說是又一個優勢)。

     

     

    本文首發於 Medium Data Science,英文原文連結:

     

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2221555/,如需轉載,請註明出處,否則將追究法律責任。

相關文章