Model Search:炼丹师最强危机,谷歌开源最强AutoML工具!
Model Search
簡介
神經網絡(NN)的成功通常取決于它對各種任務的泛化能力。然而,設計一個泛化性較好的神經網絡是非常具有挑戰性的,因為研究界對神經網絡如何泛化的理解目前還是有限的,例如:
- 對于給定的問題,合適的神經網絡是什么樣子的?
- 網絡應該多深比較合適?
- 該使用哪種類型的圖層?
- 是否LSTM已經夠用了還是Transformer會更好?亦或是兩者兼而有之?
- ensembling或蒸餾可以提高性能嗎?
在考慮機器學習(ML)領域時,這些棘手的問題變得更具挑戰性,因為在這些領域中,可能存在比其他領域更好的直覺和更深的理解。
近年來,AutoML算法的出現幫助了非常多的研究人員在不需要手動實驗的情況下自動找到合適的神經網絡。
例如神經結構搜索(NAS)這樣的技術,使用強化學習(RL)、演化算法和組合搜索等算法,從給定的搜索空間構建神經網絡。通過適當的設置,這些技術已經證明它們能夠帶來比手工設計的更好的結果。但通常情況下,這些算法的計算量很大,需要數千個模型進行訓練才能收斂。此外,他們探索的搜索空間是特定領域的,并納入了大量前人的知識,不能很好地進行跨領域的轉移。例如,在圖像分類中,傳統的NAS搜索兩個好的構建塊(卷積塊和下采樣塊),它按照傳統的約定排列來創建完整的網絡。
為了克服這些缺點并將AutoML解決方案的使用范圍擴展到更廣泛的研究社區,我們很高興宣布Model Search的開源版本,這個平臺可以幫助研究人員高效、自動地開發最佳的ML模型。Model Search并不專注于某個特定的領域,它是領域無關的、靈活的,并且能夠找到最適合給定數據集和問題的適當體系結構,同時最小化編碼時間、工作量和計算資源。它建立在Tensorflow之上,可以在單機上運行,也可以在分布式環境下運行。
1. 概覽
Model Search系統由多個訓練器、一個搜索算法、一個遷移學習算法和一個數據庫組成。該系統以自適應但異步的方式對各種ML模型(不同的框架和訓練技術)進行訓練和實驗評估。當每個trainer獨立進行實驗時,所有trainers都分享從他們的實驗中獲得的知識。在每個循環開始時,搜索算法查找所有已完成的試驗,并使用beam search來決定下一步的試驗內容。然后,它調用迄今為止發現的最佳體系結構之一的變異,并將生成的模型分配給trainer。
該系統從一組預定義的blocks構建神經網絡模型,每個block表示一個已知的微結構,如LSTM、ResNet或Transformer層。通過使用預先存在的體系結構組件塊,模型搜索能夠跨域利用NAS研究中現有的最佳知識。這種方法也更有效,因為它探索的是結構,而不是其更基本和更詳細的組件,因此減少了搜索空間的規模。
模型搜索框架是建立在Tensorflow之上的,所以block可以實現任何以張量作為輸入的函數。例如,假設有人想引入一個新的搜索空間,該空間由一系列的微體系結構組成。該框架將采用新定義的塊,并將其納入搜索過程,以便算法可以從提供的組件構建最佳的神經網絡。所提供的塊甚至可以完全定義的神經網絡,已經知道這些神經網絡可以解決感興趣的問題。在這種情況下,可以將Model Search配置為一個功能強大的ensembling機器。
在Model Search中實現的搜索算法具有自適應性、貪婪性和增量性,使其收斂速度快于RL算法。不過,它們模仿了RL算法的“explore & exploit”特性,將搜索結果分離出來(explore step),并通過整合發現的好的候選來提高準確性(exploit step)。核心的搜索算法在對體系結構或訓練技術應用隨機變化(例如,使體系結構更深入)之后自適應地修改前k個執行實驗中的一個(其中k可由用戶指定)。
為了進一步提高效率和準確性,可以在不同的內部實驗之間進行遷移學習。Model Search有兩種方式-通過知識提煉(knowledge distillation)或權重共享(weight sharing)。知識提煉可以通過添加一個損失項來提高候選項的準確度,該損失項與高性能模型的預測值相匹配,此外還有基本事實。另一方面,權重共享通過從先前訓練的模型中復制合適的權重并隨機初始化剩余的模型,從先前訓練的候選模型中引導網絡中的一些參數(應用變異后)。這使得訓練更快,從而有機會發現更多(更好)的體系結構。
2. 實驗結果
Model Search以最少的迭代改進了生產模型。在最近的一篇論文中,我們通過發現一個用于關鍵詞識別和語言識別的模型,展示了Model Search在語音領域的能力。在不到200次的迭代中,所得到的模型比由專家設計的內部最先進的生產模型精度稍有提高,使用的可訓練參數少了約130K(184K VS 315K)。
我們還應用Model Search來尋找一種適合于在被深度探索的CIFAR-10圖像數據集上進行圖像分類的體系結構。
使用一組已知的卷積blocks,包括卷積、resnet塊(即兩個卷積和一個skip連接)、NAS-A單元、全連接層等,我們觀察到,在209次試驗中(即僅探索209個模型),我們能夠快速達到91.83的基準精度。相比之下,在5807次NasNet算法(RL)試驗和1160次PNAS(RL+Progressive)試驗中,先前表現最好的人達到了相同的threshold精度。
3. 小結
我們希望Model Search代碼能為研究人員提供一個靈活的、領域無關的ML模型發現框架。通過建立在給定領域的先前知識的基礎上,我們相信,當提供由標準構建塊組成的搜索空間時,該框架足夠強大,能夠構建具有良好研究問題的最新性能的模型。
二、知識點補充&簡單案例
關于序列搜索策略的決定取決于一個spectrum。如果我們只關心準確性,那么很明顯枚舉所有的情況(exhaustive search)是最佳的選擇。但是如果我們更加關注計算成本的話,那么貪心搜索(greedy search)將會是一個不錯的選擇。而Beam Search就是二者中間,希望能在準確性和計算成本之間取得一個折中。
Beam search有一個超參數,叫做beam size k。在時間步驟1,我們選擇最高條件概率的個token。它們中的每一個將分別是k個候選輸出序列的第一個token。在隨后的每個時間步上,基于上一時間步的候選輸出序列,我們繼續從k|y|中選擇具有最高條件概率的候選輸出序列。
下圖是一個beam search size為2的案例。
- A;
- C;
- A,B;
- C,E;
- A,B,D;
- C,E,D;
最后,我們基于這六個序列(例如,包括“”和“”之后的丟棄部分)獲得最終候選輸出序列集。然后我們選擇以下得分最高的序列作為輸出序列:
2. 案例
直接運行作者開源的工具包會有較多的bug需要自己去調。
2.1 下載工具包
!git clone https://github.com/google/model_search.git %cd ./model_search/ !ls2.2 安裝依賴文件
!pip install -r requirements.txt !ls model_search # 如果沒有protoc,先安裝protoc # !brew install protoc !protoc --python_out=./ model_search/proto/phoenix_spec.proto !protoc --python_out=./ model_search/proto/hparam.proto !protoc --python_out=./ model_search/proto/distillation_spec.proto !protoc --python_out=./ model_search/proto/ensembling_spec.proto !protoc --python_out=./ model_search/proto/transfer_learning_spec.proto2.3 數據讀取
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt %matplotlib inlinefrom sklearn.preprocessing import MinMaxScaler!lsLICENSE WORKSPACE [34mmodel_search[m[m README.md default.csv requirements.txt## 該文件下載自:https://archive.ics.uci.edu/ml/machine-learning-databases/00350/default%20of%20credit%20card%20clients.xls data=pd.read_excel('../default of credit card clients.xls',skiprows=1) data=data.rename({'default payment next month':'default'}, axis=1) data.head()categorical=['SEX','EDUCATION','MARRIAGE'] numeric=['PAY_0','PAY_2','PAY_3','PAY_4','PAY_5','PAY_6']data_final=pd.get_dummies(data=data[categorical], columns=['SEX','EDUCATION','MARRIAGE']) data_final.head()data_default=pd.concat([data['default'], data_final, data[numeric]], axis=1) data_default.to_csv('default.csv',sep = ',', index = False, header = None) data_default.head()2.4 模型訓練
import pandas as pd import seaborn as sns import matplotlib.pyplot as pltfrom sklearn.preprocessing import MinMaxScalerimport model_search from model_search import constants from model_search import single_trainer from model_search.data import csv_data %matplotlib inline trainer = single_trainer.SingleTrainer(data=csv_data.Provider(label_index=0, logits_dimension=2, record_defaults=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], filename="default.csv"),spec='./model_search/configs/dnn_config.pbtxt')!mkdir tmp !mkdir ./tmp/run_exampleimport sys from absl import app# Addresses `UnrecognizedFlagError: Unknown command line flag 'f'` sys.argv = sys.argv[:1]# `app.run` calls `sys.exit` try:app.run(lambda argv: None) except:pass建議用GPU訓練,CPU可能會很慢。
trainer.try_models(number_models=5,train_steps=5,eval_steps=1,root_dir="./tmp/run_example",batch_size=512,experiment_name="example",experiment_owner="model_search_user")參考文獻
- Introducing Model Search: An Open Source Platform for Finding Optimal ML Models:https://ai.googleblog.com/2021/02/introducing-model-search-open-source.html
- Beam Search:https://d2l.ai/chapter_recurrent-modern/beam-search.html
- https://github.com/srivatsan88/YouTubeLI/blob/master/Model_Architecture_Search.ipynb
- https://www.youtube.com/watch?v=-7TZ-IKMJi8
總結
以上是生活随笔為你收集整理的Model Search:炼丹师最强危机,谷歌开源最强AutoML工具!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐系统与GNN的火花
- 下一篇: 搜索推荐炼丹笔记:CVR预估中的延迟反馈