Python機器學習:數據科學,機器學習和人工智能的主要發展技術趨勢概述

 

 

1.介紹

Python因易於學習而廣爲人知,並且它仍然是數據科學,機器學習和科學計算中使用最廣泛的語言。根據最近的一項民意的調查,該調查對1,800多名研究人員分析,數據科學和機器學習偏好的參與者進行了調查,Python在2019 保持其依然使用最廣泛的編程語言。

 

然而,Python編譯器和解釋器使用最廣泛的實現CPython在單個線程中執行CPU綁定代碼,並且其多處理程序包還伴隨着其他重大的性能折衷。

 

PyPy 是Python語言的CPython實現的替代方法  。與CPython的解釋器不同,PyPy是即時(JIT)編譯器,能夠使Python代碼的某些部分運行得更快。根據PyPy自己的基準測試,在平均pypy2020上,它運行代碼的速度是CPython的 四倍。不幸的是,PyPy不支持Python的最新版本(與最新的3.8穩定版本相比,截至本文撰寫時支持3.6)。由於PyPy僅與選定的Python庫庫兼容1http://packages.pypy.org,它通常被認爲對數據科學,機器學習和深度學習沒有吸引力。

現在收集和生成的數據量非常龐大,而且數量還在以創紀錄的速度增長,這導致人們需要使用性能出色且易於使用的工具。充分利用Python的優勢(例如在確保計算效率的同時易於使用)的最常見方法是開發高效的Python庫,以實現用靜態類型的語言(如Fortran,C / C ++和CUDA)編寫的低級代碼。近年來,在用於科學計算和機器學習的高性能但用戶友好的庫的開發上花費了大量的精力。

 

本文的目的是通過向讀者簡要介紹當前在Python機器學習領域中最相關的主題和趨勢來豐富讀者。我們對該領域的調查,總結了一些重大挑戰,分類法和方法。在本文中,我們旨在在學術研究和行業主題之間找到平衡,同時重點介紹最相關的工具和軟件庫。但是,這既不是全面的說明,也不是方法,研究或可用庫的詳盡列表。假定不具備Python知識,但是對計算,統計和機器學習有所瞭解將是有益的。

 

本文旨在提供涵蓋該領域廣度的主要主題的概述。儘管可以單獨閱讀每個主題,但是鼓勵感興趣的讀者按順序進行閱讀,因爲它可以提供將技術挑戰的演變與其最終解決方案聯繫在一起的附加好處,以及隱含的趨勢的歷史和計劃背景。敘事。

 

1.1PYTHON中的科學計算和機器學習

 

機器學習和科學計算應用通常使用多維數組上的線性代數運算表示,多維數組是用於表示矢量,矩陣和高階張量的計算數據結構。由於這些操作通常可以在許多處理核心上並行化,因此諸如NumPy之類的庫 

 

Oliphant2007和SciPy  2020SciPy-NMeth利用C / C ++,Fortran和第三方BLAS實現在可能的情況下繞過線程和其他Python限制。NumPy是具有基本線性代數例程的多維數組庫,SciPy庫將NumPy數組裝飾有許多重要的原語,從數值優化器和信號處理到統計和稀疏線性代數。截至2019年,發現GitHub virtanen2020scipy上幾乎所有機器學習項目中都使用了SciPy。

圖1:用於機器學習,數據科學和科學計算的標準Python生態系統。

 

雖然NumPy和Pandas  mckinny(圖  1)都提供了對數據點集合的抽象,並且其操作對整個數據集都有效,但Pandas通過提供支持異類列類型以及行和列元數據的類數據框對象擴展了NumPy。近年來,Pandas庫已成爲事實上的格式,用於表示Python中的表格數據以進行提取,轉換和加載。

(ETL)上下文和數據分析。自2008年首次發佈12年後,又是25個版本之後,熊貓的第一個1.0版本於2020年發佈。語義版本控制標準 preston2013semantic(1.0版)表明,庫已達到成熟度的主要水平,並具有穩定的API。

儘管NumPy的第一個版本已於25年前發佈(以其先前的名稱爲Numeric),但與Pandas相似,它仍在積極地開發和維護。2017年,NumPy開發團隊從摩爾基金會獲得了645,000美元的贈款,以幫助進一步開發和維護numfocus2017numpy庫  。在撰寫本文時,Pandas,NumPy和SciPy仍然是許多數據科學和計算項目中最人性化和推薦的選擇。

1.2優化PYTHON在數值計算和數據處理方面的性能

除了其線程限制外,CPython解釋器還沒有充分利用現代處理器硬件,因爲它需要與fedotov2016speeding的大量計算平臺 兼容。針對CPU的特殊優化指令集(例如Intel的Streaming SIMD擴展(SSE)和IBM的AltiVec)在許多低級庫規範下使用,例如二進制線性代數子例程(BLAS)  blackford2002 updated和線性代數包(LAPACK)   angerson1990 lapack庫,用於有效的矩陣和向量運算。

OpenBLAS的開發上投入了大量心血,OpenBLAS是BLAS API的開源實現,它支持多種不同的處理器類型。儘管所有主要的科學庫都可以通過OpenBLAS集成openblas2020進行編譯,但是  不同CPU指令集的製造商通常還會提供自己的BLAS和LAPACK子例程的硬件優化實現。例如,英特爾的數學內核庫(Intel MKL)  intel2020mkl和IBM的Power ESSL  diefendorff2000altivec爲科學計算應用程序提供可插拔的效率。這種標準化的API設計提供了可移植性,這意味着通過針對不同的實現構建,相同的代碼可以在具有不同指令集的不同體系結構上運行。

 

當數字庫(例如NumPy和SciPy)通過硬件優化的子例程獲得顯着的性能提升時,性能提升會自動擴展到更高級別的機器學習庫(例如Scikit-lear),後者主要使用NumPy和SciPy  Pedregosa FABIANPEDREGOSA 2011;buitinck2013api。英特爾還提供了一個面向高性能科學計算的Python發行版,其中包括MKL加速  intel2020 python較早前提過。該Python發行版背後的吸引力在於它是免費使用的,可以直接使用,可以加速Python本身,而不是挑選大量的庫,並且可以代替標準CPython發行版而無需任何代碼需要更改。但是,主要缺點之一是僅限於Intel處理器。

 

一次操作一組值(而不是單個值)的機器學習算法的開發通常也稱爲向量化。前述的CPU指令集通過使處理器有可能在多個數據點上並行調度單個指令,而不必爲每個數據點調度不同的指令,從而實現矢量化。將單個指令應用於多個數據點的向量運算也稱爲單指令多數據(SIMD),自1960年代以來,它已存在於並行和高性能計算領域。SIMD範式在庫中進一步通用化,用於擴展數據處理工作負載,例如MapReduce  dean2008 mapreduce,Spark  Zaharia和Dask  Rocklin2015,其中將相同的數據處理任務應用於數據點的集合,以便可以並行處理它們。一旦組成,數據處理任務可以在線程或進程級別執行,從而使並行性能夠跨越多個物理機。

 

Pandas的數據框格式使用列來分隔數據集中的不同字段,並允許每一列具有不同的數據類型(在NumPy的ndarray容器中,所有項目都具有相同的類型)。與其連續地將每個記錄的字段(例如,在逗號分隔值(CSV)文件中)存儲在一起,它不連續地存儲列。通過按列連續佈置數據,可以通過允許處理器對行級處理的內存訪問進行分組或合併來啓用SIMD,從而有效利用緩存,同時減少了對主內存的訪問次數。

 

用於內存中數據的Apache Arrow跨語言開發平臺  apache2020 arrow對列格式進行了標準化,以便可以在不同的庫之間共享數據,而無需花費一定的成本來複制和重新格式化數據。另一個利用列格式的庫是Apache Parquet  apache2020 parquet。諸如Pandas和Apache Arrow之類的庫在設計時考慮到了內存使用,而Parquet則主要是爲數據序列化和存儲在磁盤上而設計的。Arrow和Parquet彼此兼容,現代高效的工作流程涉及Parquet,用於將磁盤上的數據文件加載到Arrow的列式數據結構中進行內存計算。

 

類似地,NumPy支持基於行和列的佈局,其n維數組(ndarray)格式也將下面的數據與對其進行操作的操作分開。這使NumPy中的大多數基本操作都可以使用SIMD處理。

 

Dask和Apache Spark  zaharia2016 apache爲可擴展到多個節點的數據幀和多維數組提供了抽象。與Pandas和NumPy相似,這些抽象也將數據表示與處理操作的執行分開。通過將數據集視爲可以在可用硬件上安排的數據轉換任務的有向無環圖(DAG),可以實現這種分離。Dask之所以吸引許多數據科學家,是因爲其API受到Pandas的極大啓發,因此很容易集成到現有的工作流程中。但是,喜歡對現有代碼進行最少更改的數據科學家也可以考慮使用Modin(https://github.com/modin-project/modin)它可以直接替換Pandas DataFrame對象,即modin.pandas.DataFrame。Modin的DataFrame具有與Pandas相同的API,但是它可以利用外部框架在後臺進行分佈式數據處理,例如Ray 2020或Dask。開發人員的基準顯示,與Pandas相比,在具有四個物理內核modin2020modin的筆記本電腦上,數據處理速度最高可提高四倍 。

 

本文的其餘部分安排如下。在討論使它既簡單又高效的優化方法之前,下一節將介紹Python作爲科學計算和機器學習的工具。第2節  介紹瞭如何將Python用於常規機器學習。第3節  介紹了通過AutoML自動化機器學習管道構建和實驗的最新進展。在第4節 ,我們將討論GPU加速的科學計算和機器學習的發展,以提高計算性能以及由此帶來的新挑戰。專注於專注於GPU加速的深度神經網絡(DNN)訓練的機器學習子領域,我們將在第5節中討論深度學習   。近年來,機器學習和深度學習技術在許多領域都達到了最先進的水平,但是與傳統方法相比,這些技術經常被引用的缺點是缺乏可解釋性和可解釋性。在第6節中  ,我們重點介紹一些使機器學習模型及其預測更可解釋的新穎方法和工具。最後,第7節  簡要概述了對抗性學習領域的最新發展,旨在使機器學習和深度學習變得更加健壯,其中健壯性是許多與安全相關的實際應用程序中的重要屬性。

2.經典機器學習

深度學習代表機器學習的一個子類別,該子類別專注於DNN的參數化。爲了提高清晰度,我們將基於非深度學習的機器學習稱爲經典機器學習(經典ML),而機器學習是一個概括性術語,包括深度學習和經典ML。

 

儘管在過去幾年中深度學習已迅速普及,但是經典ML(包括決策樹,隨機森林,支持向量機等)在不同的研究領域和行業中仍然非常流行。在大多數應用中,從業人員使用的數據集不適用於當代深度學習方法和體系結構。深度學習對於處理大型非結構化數據集(例如文本和圖像)特別有吸引力。相反,大多數經典機器學習技術是在頭腦中的結構化數據;也就是說,以表格形式的數據,其中訓練示例存儲爲行,而隨附的觀察值(特徵)存儲爲列。

在本節中,我們將回顧Scikit-learn的最新發展,Scikit-learn仍然是經典ML最受歡迎的開源庫之一。在簡短介紹了Scikit-learn核心庫之後,我們討論了開源社區開發的幾個擴展庫,重點是用於處理類不平衡,集成學習和可擴展的分佈式機器學習的庫。

2.1SCIKIT-LEARN,經典機器學習的行業標準

Scikit-learn  Pedregosa FABIANPEDREGOSA 2011(圖 1)已成爲行業標準Python庫,用於對中小型數據集進行特徵工程和經典ML建模, 
在此情況下,根據經驗,我們認爲訓練少於1000的數據集小型示例,

而數據集包含中等規模的1000到100,000個示例

 

因爲它具有乾淨,一致且直觀的API,因此在很多方面都是如此。此外,在開源社區的幫助下,Scikit學習團隊仍將重點放在代碼質量和綜合文檔上。開拓簡單的“ fit() / 預測()API模型,其設計成爲許多庫的靈感和藍圖,因爲它呈現出熟悉的面孔並在用戶探索不同的建模選項時減少了代碼更改。 

 

除了用於數據處理和建模的衆多類(稱爲估計器)外,Scikit-learn還包括一流的API,用於統一機器學習管道的構建和執行:管道API(圖 2)。

 

它使一組估計器可以包括數據處理,特徵工程和建模估計器,這些估計器可以組合起來以端到端的方式執行。此外,Scikit-learn提供了一個API,用於使用諸如交叉驗證之類的通用技術評估經過訓練的模型。

圖2: Scikit學習管道的圖示。一個代碼示例,展示瞭如何從Iris數據集中擬合線性支持向量機特徵,這些特徵已通過z-score歸一化進行了歸一化,然後使用管道對象通過主成分分析壓縮到了兩個新的特徵軸上。

b)說明了對訓練數據執行擬合方法和對測試數據執行預測方法時管道內部的各個步驟。

 

爲了在提供有用的功能和維護高質量代碼的能力之間找到適當的平衡,Scikit-learn開發團隊僅考慮將完善的算法納入庫中。然而,過去十年來機器學習和人工智能研究的爆炸式增長創造了許多算法,最好將其作爲擴展而不是集成到核心中。更新的和通常爲人所知的算法是作爲Scikit-learn兼容庫或所謂的“ Scikit-contrib”包提供的,後者由Scikit-learn社區在共享的GitHub組織Scikit-learn-contrib下(https://github.com/scikit-learn-contrib)當這些單獨的軟件包遵循Scikit-learn API時,它們可以從Scikit-learn生態系統中受益,使用戶能夠免費繼承Scikit-learn的某些高級功能,例如流水線和交叉驗證。

 

在以下各節中,我們重點介紹其中一些最著名的,與Scikit-learn兼容的庫。

2.2解決班級失衡

當使用真實數據集Lematre 2016時,傾斜的類標籤分佈是最重大的挑戰  之一。這樣的標籤分佈偏斜或類別失衡會導致強烈的預測偏差,因爲模型可以通過學習大多數時間來預測多數標籤來優化訓練目標。爲防止此問題,通常手動實施重採樣技術以平衡標籤。修改數據還需要驗證哪種重採樣策略對結果模型產生最積極的影響,同時確保不會由於重採樣而引入其他偏差。

不平衡學習Lematre2016 是Scikit-contrib庫,用於通過四種用於平衡偏斜數據集中的類的技術來解決上述問題。前兩種技術通過減少造成過分代表類的數據樣本的實例數(欠採樣)或生成代表不足類的新數據樣本(過採樣)來對數據進行重新採樣。由於過採樣往往會訓練過擬合數據的模型,因此第三種技術將過採樣與清除欠採樣技術結合在一起,從而消除了大多數分類中的極端離羣值。不平衡學習爲平衡類提供的最終技術是將袋裝與AdaBoost相結合 

 

Galar2011,其中模型集合是由多數類的不同欠採樣集合構成的,而少數類的整個數據集則用於訓練每個學習者。此技術允許將來自過多代表的類的更多數據用作單獨重採樣的替代方法。儘管研究人員在此方法中使用AdaBoost,但此方法的潛在增強可能涉及其他集成技術。在下一節中,我們將討論最近開發的集成方法的實現。

2.3集成學習:梯度提升機和模型組合

被稱爲集成技術的多種機器學習算法或模型的組合被廣泛用於提供穩定性,提高模型性能以及控制偏差-方差折衷 

raschka 2018 model。衆所周知,高度可並行化的引導聚合元算法(也稱爲裝袋) breiman1996 bagging的集成技術傳統上已用於諸如隨機森林 breiman2001 random之類的算法中 

對單個決策樹的預測取平均,同時成功減少過度擬合。與裝袋相反,增強型元算法本質上是迭代的,可以逐步擬合弱學習者,例如預修剪的決策樹,其中模型會根據先前迭代的較差預測(葉節點)相繼進行改進。梯度增強對早期的自適應增強算法(例如AdaBoost)進行了改進 

freund1995年的決定,通過添加梯度下降的元素來逐步建立新的模型,該模型優化了與以前的迭代 Friedman2001中的誤差有區別的成本函數 。

 

最近,在許多Kaggler的工具帶中,梯度提升機(GBM)已成爲  瑞士軍刀;陳2016。梯度提升的一個主要性能挑戰是它是一種迭代而不是並行算法,例如裝袋。梯度提升算法中另一個耗時的計算是在構造決策樹Ke時評估用於分割節點的不同特徵閾值  。Scikit-learn的原始梯度提升算法特別低效,因爲它會枚舉每個功能的所有可能分割點。這種方法被稱爲精確貪婪

 

該算法昂貴,浪費內存,無法很好地擴展到較大的數據集。由於Scikit-learn的實現存在明顯的性能缺陷,因此出現了XGBoost和LightGBM之類的庫,它們提供了更有效的替代方法。當前,這是用於梯度提升機的兩個最廣泛使用的庫,並且它們都與Scikit-learn很大程度上兼容。

 

XGBoost於2014年Chen2016引入開源社區,  併爲精確的貪婪拆分查找算法提供了有效的近似值,該算法僅在每個節點上使用一部分可用的訓練示例將特徵分類爲直方圖。LightGBM被介紹給開源社區在2017年,並在深度優先的方式建立的樹木,而不是使用廣度優先的方法,因爲它在許多其他GBM庫進行  柯。LightGBM還實施了升級的拆分策略,以使其與XGBoost競爭,XGBoost是當時使用最廣泛的GBM庫。LightGBM拆分策略的主要思想是僅保留具有較大漸變的實例,因爲它們對信息增益的貢獻最大,而對較低漸變的實例進行了欠採樣。這種更有效的採樣方法有可能顯着加快訓練過程。

 

XGBoost和LightGBM都支持分類功能。雖然LightGBM可以直接解析它們,但是XGBoost要求類別必須是一鍵編碼的,因爲其列必須是數字。這兩個庫均包含可有效利用稀疏特徵(例如已進行一次熱編碼的稀疏特徵)的算法,從而可以更有效地利用基礎特徵空間。Scikit-learn(v0.21.0)最近還添加了新的梯度提升算法受LightGBM啓發的HistGradientBoosing具有與LightGBM相似的性能,但唯一的缺點是它不能直接處理分類數據類型,並且需要類似於XGBoost的一鍵編碼。

已經證明將多個模型組合到集合中可以提高泛化精度,並且如上所述,通過結合重採樣方法/ citeraschka2019python可以改善類不平衡。模型組合是集成學習的一個子領域,它允許不同的模型爲共享的目標做出貢獻,而與構成它們的算法無關。例如,在模型組合算法中,邏輯迴歸模型可以與k最近鄰分類器和隨機森林組合。

堆疊算法是組合模型的一種較常用的方法,它在一組單個模型的預測上訓練聚合器模型,以便學習如何將單個預測組合爲一個最終預測  Wolpert1992。常見的堆疊變體還包括sill2009 feature元特性  或實現多層的lorbieski2018 impact堆疊  ,這也稱爲多層堆疊。自2016年以來,Mlxtend中已提供Scikit-learn兼容的堆棧分類器和迴歸器  raschka2018 mlxtend並且最近也在v0.22中添加到了Scikit-learn中。疊加的另一種選擇是動態選擇算法,該算法僅使用最勝任的分類器或整體來預測樣本的類別,而不是組合預測  Cruz2018。

Combo是一個相對較新的專門用於集成學習的庫,它在統一的Scikit-learn-compatible API下提供了幾種常用算法,因此它與Scikit-learn生態系統zhao2019cominging的許多估計器都兼容。 

 

Combo庫提供了能夠組合用於分類,聚類和異常檢測任務的模型的算法,並且在Kaggle預測建模社區中已得到廣泛採用。使用單個庫(例如Combo)的好處是可以爲方便的實驗和模型比較提供便利,該庫可以爲不同的集成方法提供統一的方法,同時仍與Scikit-learn兼容。

2.4可擴展的分佈式機器學習

儘管Scikit學習針對中小型數據集,但現代問題通常需要可以擴展到更大數據量的庫。使用Joblib https://github.com/joblib/joblib ,可以通過Python的多處理並行化Scikit-learn中的一些算法。不幸的是,這些算法的潛在規模受限於一臺機器上的內存和物理處理核心的數量。

 

Dask-ML通過Scikit-learn兼容的API提供了Scikit-learn的經典ML算法的子集的分佈式版本。這些包括監督學習算法,如線性模型,無監督學習算法,如k均值,和降維算法,如主成分分析和截斷奇異向量分解。Dask-ML使用多重處理,其附加好處是算法的計算可以分佈在計算集羣中的多個節點上。

 

許多經典的ML算法都與擬合一組參數有關,這些參數通常假定小於訓練數據集中的數據樣本數量。在分佈式環境中,這是一個重要的考慮因素,因爲模型訓練通常需要各個工人共享本地狀態時進行交流,以便收斂於一組全局學習參數。訓練後,模型推理通常可以以令人尷尬的並行方式執行。

 

超參數調整是機器學習中非常重要的用例,需要在許多不同的配置上對模型進行訓練和測試,以找到具有最佳預測性能的模型。如第2.3節所述,當組合多個模型時,並行訓練多個較小模型的能力變得尤爲重要,尤其是在分佈式環境中  。

 

Dask-ML還提供了支持任何Scikit-learn兼容API的超參數優化(HPO)庫。Dask-ML的HPO在Dask工人集羣上分配針對不同參數配置的模型訓練,以加快模型選擇過程。第3節“自動機器學習” 中討論了它使用的確切算法以及其他用於HPO的方法  。

 

PySpark將Apache Spark的MLLib的功能與Python的簡單性結合在一起。儘管API的某些部分與Scikit-learn函數的命名約定有點相似,但該API與Scikit-learn不兼容  Meng1980。儘管如此,由於這種相似性,Spark MLLib的API仍然非常直觀,使用戶能夠在分佈式環境中輕鬆訓練高級機器學習模型,例如推薦器和文本分類器。用Scala編寫的Spark引擎在每個工作者上使用C ++ BLAS實現來加速線性代數運算。

 

與Dask和Spark這樣的系統形成對比的是消息傳遞接口(MPI)。MPI提供了一個經過時間測試的標準API,可用於編寫分佈式算法,在該算法中,可以實時在工作線程(稱爲等級)之間傳遞內存位置,就好像它們是共享相同內存空間的所有本地進程一樣  barker2015message。LightGBM利用MPI進行分佈式訓練,而XGBoost可以在Dask和Spark環境中進行訓練。H2O機器學習庫能夠使用MPI在分佈式環境中執行機器學習算法。通過名爲Sparkling Water https://github.com/h2oai/sparkling-water的適配器,H2O算法也可以與Spark一起使用。

 

雖然深度學習在機器學習的當前研究中占主導地位,但它遠未使經典的ML算法變得無用。儘管確實存在用於表格數據的深度學習方法,但CNN和LSTM始終在從圖像分類到語言翻譯的任務中始終展示出一流的性能。但是,經典的ML模型往往更易於分析和反思,通常用於深度學習模型的分析中。在第6節中,經典ML與深度學習之間的共生關係將變得尤爲明顯。

 

3.自動機器學習(AUTOML)

 

諸如Pandas,NumPy,Scikit-learn,PyTorch和TensorFlow之類的庫以及具有Scikit-learn兼容API的各種庫集合,爲用戶提供了手動執行端到端機器學習管道的工具。自動機器學習(AutoML)工具旨在自動化這些機器學習管道的一個或多個階段(圖 3),使非專家更容易構建機器學習模型,同時消除重複的任務,並使經驗豐富的機器學習工程師能夠更快地構建更好的模型。

自2013年首次引入Auto-Weka thornton2013auto以來,幾個主要的AutoML庫已經變得非常流行  。目前,Auto-sklearn  feurer2019auto,  TPOT olson2019tpot,H2O-AutoML   h2o2020h2o,Microsoft的NNI

https://github.com/microsoft/nni,而AutoKeras  jin2019auto是從業者中最受歡迎的,本節將對此進行進一步討論。

 

雖然AutoKeras提供Scikit學習般的類似於自動sklearn API,它的重點是AutoML與訓練有素的DNNs Keras以及神經結構的搜索,這是第單獨討論 。Microsoft的神經網絡智能(NNI)AutoML庫除了提供經典ML之外,還提供神經體系結構搜索,支持Scikit-learn兼容模型和自動化特徵工程。

Auto-sklearn的API與Scikit-learn直接兼容,而H2O-AutoML,TPOT和auto-keras提供類似於Scikit-learn的API。這三種工具中的每一種在提供的機器學習模型的集合方面有所不同,這些模型可以通過AutoML搜索策略進行探索。儘管所有這些工具都提供了受監督的方法,並且某些工具(例如H20-AutoML)將堆疊或集成最佳性能的模型,但是開源社區目前缺乏自動進行無監督模型調整和選擇的庫。

 

隨着對AutoML的研究和創新方法的數量不斷增加,它遍及不同的學習目標,並且社區開發用於比較這些目標的標準化方法非常重要。這是在2019年完成的,開源基準的貢獻是在39個分類任務gijsbers2019open的數據集上比較AutoML算法  。

 

以下各節涵蓋了可以自動化的機器學習管道的三個主要組成部分:

(1)初始數據準備和特徵工程

(2)超參數優化和模型評估以及

(3)神經體系結構搜索。

 

3.1數據準備和特徵工程

機器學習管道通常從數據準備步驟開始,該步驟通常包括數據清理,將各個字段映射到數據類型以進行特徵工程準備以及估算缺失值 

 

費勒 ; He2019automl。一些庫(例如H2O-AutoML)試圖通過自動推斷不同的數據類型來自動化數據準備過程的數據類型映射階段。其他工具,例如Auto-Weka和Auto-sklearn,要求用戶手動指定數據類型。

圖3:(a)AutoML過程的不同階段,用於選擇和調整經典ML模型。(b)使用神經體系結構搜索生成和調整模型的AutoML階段。

 

一旦知道了數據類型,特徵工程過程就會開始。在特徵提取階段,通常會轉換這些字段以創建具有改進的信噪比的新特徵,或者對特徵進行縮放以幫助優化算法。常見的特徵提取方法包括特徵歸一化和縮放,將特徵編碼爲一種或另一種格式以及生成多項式特徵組合。特徵提取也可以用於降維,例如,使用類似主成分分析,隨機投影,線性判別分析和決策樹的算法對特徵進行去相關和減少。這些技術可能會增加功能的判別能力,同時減少來自維數的詛咒。

 

上面提到的許多工具都試圖使要素工程過程的至少一部分自動化。像TPOT這樣的庫直接在端到端機器學習管道中建模,因此除了通過預測性能選擇模型外,他們還可以評估功能工程技術的變化。但是,儘管在建模管道中包含要素工程非常引人注目,但這種設計選擇還大大增加了要搜索的超參數的空間,這在計算上可能會被禁止。

 

對於需要大量數據的模型(例如DNN),AutoML的範圍有時可能包括數據合成和擴充的  自動化He2019 automl。數據擴充和合成在計算機視覺中尤其常見,在計算機視覺中,通過翻轉,裁剪或對圖像數據集的各個部分進行過採樣而引入了干擾。最近,這還包括使用生成對抗網絡根據訓練數據分佈生成全新的圖像 antoniou2017 data。

3.2超參數優化和模型評估

超參數優化(HPO)算法構成了AutoML的核心。最幼稚的尋找最佳性能模型的方法將詳盡地選擇和評估所有可能的配置,以最終選擇最佳性能模型。HPO的目標是通過優化對超參數配置的搜索或對所得模型的評估來改進這種詳盡的方法。網格搜索是一種基於蠻力的搜索方法,可探索用戶指定參數範圍內的所有配置。通常,搜索空間用固定的端點均勻地劃分。儘管可以從粗到精的方式對網格進行量化和搜索,但是網格搜索已顯示出對不重要的超參數bergstra2012random進行了過多的試驗  。

 

與網格搜索有關,隨機搜索是一種蠻力方法。但是,與其完全窮盡用戶指定參數範圍內的所有配置,不如從總搜索空間的邊界區域中隨機選擇配置。在這些選定配置上評估模型的結果將用於迭代地改進將來的配置選擇並進一步限制搜索空間。理論和經驗分析表明,隨機搜索比網格搜索更有效  bergstra2012random ; 也就是說,在短短的計算時間內就可以找到具有相似或更好的預測性能的模型。

 

一些算法(例如,Dask-ML,Auto-sklearn和H2O-AutoML中使用的超帶算法)求助於隨機搜索,並專注於優化模型評估階段以獲得良好的結果。Hyperband使用一種稱爲早期停止的評估策略,其中針對多個配置的多輪交叉驗證並行啓動  Li2018a。在交叉驗證分析完成之前,將終止具有較差的初始交叉驗證準確性的模型,從而釋放資源以探索其他配置。從本質上講,超帶寬可以概括爲一種方法,該方法首先隨機運行超參數配置,然後爲更長的運行選擇候選配置。與純隨機搜索He2019automl相比,Hyberband是優化資源利用以更快地獲得更好結果的理想選擇  。與隨機搜索相反,貝葉斯優化(BO)等方法着重於使用概率模型選擇更好的配置。正如Hyperband的開發者所描述的那樣,貝葉斯優化技術始終優於隨機搜索策略。但是,他們只做少量 Li2018a。實驗結果表明,與貝葉斯優化方法( snoek2015scalable)相比,進行隨機搜索的時間長兩倍是更好的結果 。

 

幾個庫使用BO的形式主義,即基於順序模型的優化(SMBO),通過反覆試驗來建立概率模型。該Hyperopt庫帶來SMBO星火ML,使用被稱爲一種算法概率密度函數估計的樹 NIPS2011_4443。該貝葉斯優化的超頻(BOHB)falkner2018 bohb庫將BO和超頻帶,同時提供其自身的內置分佈式優化能力。Auto-sklearn使用一種稱爲順序模型算法配置(SMAC)  Feurer的SMBO方法。與提前停止類似,SMAC使用一種稱爲自適應賽車的技術僅在需要與其他競爭模型進行比較時評估模型https://github.com/automl/SMAC3

 

BO和Hyperband隨機搜索是廣義HPO中用於配置選擇的最廣泛使用的優化技術。作爲一種選擇,TPOT已被證明是一種非常有效的方法,它利用進化計算來隨機搜索合理參數的空間。由於其固有的並行性,TPOT算法也可以在Dask中執行 https://examples.dask.org/machine-learning/tpot.html 可以在分佈式計算羣集中的其他資源可用時縮短總運行時間。

 

3.3神經架構搜索

先前討論的HPO方法由通用HPO算法組成,這些算法與基礎機器學習模型完全無關。這些算法的基本假設是,如果要考慮一個超參數配置的子集,則可以客觀地驗證該模型。

 

最近的AutoML深度學習研究不是從一組經典的ML算法或著名的DNN架構中進行選擇,而是專注於從一組預定義的低層構建塊組成主題或整個DNN架構的方法。這種類型的模型生成稱爲神經架構搜索(NAS)  Zoph2017,它是real2019regularized的架構搜索 的子字段;Negrinho2019。

 

架構搜索算法開發的總體主題是定義搜索空間,該搜索空間是指可以組成的所有可能的網絡結構或超參數。搜索策略是搜索空間上的HPO,用於定義NAS算法如何生成模型結構。與經典ML模型的HPO一樣,神經體系結構搜索策略也需要一種模型評估策略,當給定要評估的數據集時,該模型可以產生模型的客觀得分。

 

根據事先提供的神經網絡結構多少,神經搜索空間可以分爲四類之一:

 

  1. 整個結構:通過選擇並將一系列原語(例如卷積,串聯或池化)鏈接在一起,從頭開始生成整個網絡。這稱爲宏搜索。

     

  2. 基於單元的:搜索固定數量的手工構建塊(稱爲單元)的組合。這稱爲微搜索。

     

  3. 層次結構:通過引入多個級別並鏈接固定數目的單元格來擴展基於單元格的方法,迭代地使用較低層中定義的基元來構造較高層。這結合了宏搜索和微搜索。

     

  4. 基於形態的結構:將知識從現有性能良好的網絡轉移到新的體系結構。

 

與上面所述的傳統HPO相似  ,NAS算法可以利用各種通用優化和模型評估策略從神經搜索空間中選擇性能最佳的體系結構。

 

Google已參與NAS的大部分開創性工作。2016年,來自Google Brain項目的研究人員發佈了一篇論文,描述瞭如何將強化學習用作整個結構搜索空間的優化器,能夠構建遞歸和卷積神經網絡(CNN) 

 

zoph2016neural。一年後,同一位作者發表了一篇論文,介紹了基於細胞的NASNet搜索空間,該研究使用卷積層作爲主題並進行了強化學習,以尋找可對其進行配置和堆疊的最佳方式  Zoph2017。

進化計算是在AmoebaNet-A的NASNet搜索空間中進行的,Google Brain的研究人員在其中提出了一種新穎的比賽選擇  Goldberg方法。分層搜索空間由Google的DeepMind團隊   Liuc提出。這種方法使用進化計算來導航搜索空間,而斯坦福大學的Melody Guan和GoogleBrain團隊的成員一起使用強化學習以一種稱爲ENAS Pham2018的方法來導航分層搜索空間。 

 

由於所有生成的網絡都用於同一任務,因此ENAS使用轉移學習來減少訓練所花費的時間,從而研究了不同生成模型之間權重共享的影響。

 

漸進式神經體系結構搜索(PNAS)研究了貝葉斯優化策略SMBO的使用,它通過在確定是否搜索更復雜的單元Liub之前探索更簡單的單元來使CNN體系結構的搜索效率   更高。同樣,NASBOT爲生成的體系結構定義了距離函數,該函數用於構建內核以將高斯過程用於BO  Liu。AutoKeras引入了基於形態學的搜索空間,從而可以修改而不是重新生成高性能模型。與NASBOT一樣,AutoKeras爲NAS體系結構定義了一個內核,以便對BO jin2019auto使用高斯過程  。

 

谷歌DeepMind團隊在2018年發表的另一篇論文中提出了DARTS,它允許使用基於梯度的優化方法(例如梯度下降)直接優化神經架構空間  Liua。在2019年提出了SNAS,它對DARTS進行了改進,使用採樣來實現梯度Xie的更平滑近似  。

 

4.GPU加速的數據科學和機器學習

 

有一個連接硬件,軟件及其市場狀態的反饋環。構建軟件體系結構以利用可用的硬件,而構建硬件以啓用新的軟件功能。當性能至關重要時,將對軟件進行優化,以最低的成本使用最有效的硬件選件。2003年,當硬盤存儲商品化時,谷歌GFS ghemawat2003 google和MapReduce  dean2004 mapreduce之類的軟件系統  利用快速順序的讀寫操作,利用服務器集羣(每個服務器都有多個硬盤)來實現規模化。2011年,磁盤性能成爲瓶頸,內存商品化,Apache Spark Zaharia等庫 優先考慮在內存中緩存數據,以儘可能減少磁盤的使用。

 

從1999年首次引入GPU時起,計算機科學家就開始利用其潛力來加速高度可並行化的計算。但是,直到2007年CUDA發行,通用GPU計算(GPGPU)纔開始普及。上述示例來自推動更快地支持更多數據,同時提供了擴展和擴展的能力,從而使硬件投資可以隨着用戶的個人需求而增長。以下各節介紹在Python環境中使用GPU計算。在簡要概述GPGPU之後,我們討論了GPU在端到端加速數據科學工作流中的使用。我們還將討論GPU如何在Python中加速數組處理以及各種可用工具如何協同工作。

 

4.1機器學習的通用GPU計算

 

即使使用高效的庫和優化,通過CPU綁定計算可以實現的並行性數量也受到物理內核數量和內存帶寬的限制。此外,很大程度上受CPU限制的應用程序也可能與操作系統爭用。

 

在GPU上使用機器學習的研究早於深度學習的興起。CUDA的創建者伊恩·巴克(Ian Buck)曾在2005年嘗試2層全連接神經網絡,然後在2006年以steinkraus2005的身份加入NVIDIA  。此後不久,在GPU之上實現了卷積神經網絡,與高度優化的CPU實現相比,觀察到了驚人的端到端加速。。此時,在存在專用的GPU加速的BLAS庫之前就已經獲得了性能優勢。第一個CUDA工具包的發佈賦予了GPU通用並行計算的生命力。最初,只能通過C,C ++和Fortran接口訪問CUDA,但是在2010年,PyCUDA庫開始使CUDA可以通過Python和klockner2010pycuda進行訪問  。

 

GPU改變了傳統機器學習和深度學習的格局。從1990年代末到2000年代末,支持向量機一直保持着大量的研究興趣  lloyd2010svm,並被認爲是最新技術。在2010年,GPU爲claudiu2010深度學習領域注入了新的活力,推動了大量研究和開發。

 

與SIMD相比,GPU支持單指令多線程(SIMT)編程範例,更高的吞吐量和更多的並行模型,並且高速內存跨越多個多處理器(塊),每個多處理器包含多個並行內核(線程)。內核還具有與同一多處理器中其他內核共享內存的能力。與CPU領域中一些經過硬件優化的BLAS和LAPACK實現所使用的基於CPU的SIMD指令集一樣,SIMT架構可以很好地並行化機器學習算法(例如BLAS子例程)所需的許多基本操作,從而加速GPU天生的合身。


 

4.2端到端數據科學:RAPIDS

 

GPU加速數據科學工作流的能力所佔空間比機器學習任務大得多。通常由高度可並行化的轉換組成,這些轉換可以充分利用SIMT處理的優勢,已證明數據科學流水線的整個輸入/輸出和ETL階段在性能上均取得了巨大的進步。通過針對不同的實現進行設置。

 

RAPIDS https://rapids.ai於2018年引入,是一項開源工作,旨在支持和發展用於數據科學,機器學習和科學計算的GPU加速Python工具生態系統。RAPIDS支持現有的庫,通過爲開源庫提供Python社區所缺少的關鍵組件來填補空白,並通過支持跨庫的互操作性來促進整個生態系統的凝聚力。

 

受到Scikit-learn統一的API外觀及其啓用的功能強大的API的多樣化集合的積極影響,RAPIDS建立在一組行業標準Python庫的核心之上,將基於CPU的實現交換爲GPU加速的變體。通過使用Apache Arrow的列格式,它使多個庫能夠利用此功能並完全在GPU上構成端到端的工作流。結果是,主機內存和GPU內存之間的傳輸和轉換被最小化,並且很多時候被完全消除了,如圖4所示  。

 

RAPIDS核心庫包括分別替換爲cuDF,cuML和cuGraph的Pandas,Scikit-learn和Network-X庫的直接替代品。其他組件填補了更集中的空白,同時在適用的情況下仍然可以替代行業標準的Python API。cuIO提供許多流行數據格式的存儲和檢索,例如CSV和Parquet。cuStrings使在GPU上表示,搜索和處理字符串成爲可能。cuSpatial提供了用於構建和查詢空間數據結構的算法,而cuSignal提供了對SciPy信令子模塊scipy.signal的近乎替代。

圖4: RAPIDS是開源工作,旨在支持和發展用於數據科學,機器學習和科學計算的GPU加速Python工具生態系統。RAPIDS支持現有的庫,通過爲開源庫提供Python社區所缺少的關鍵組件來填補空白,並通過支持跨庫的互操作性來促進整個生態系統的凝聚力。

 

4.3NDARRAY和向量化運算

 

雖然NumPy可以調用BLAS實現來優化SIMD操作,但其矢量化功能的能力有限,幾乎沒有提供性能優勢。Numba庫提供即時(JIT)編譯  lam2015numba,使矢量化函數能夠利用SSE和AltiVec等技術。將計算與數據分開描述的這種分離還使Numba能夠在GPU上編譯和執行這些功能。除了JIT之外,Numba還定義了DeviceNDArray,在NumPy的NDArray中提供GPU加速的許多常用功能的實現。

 

CuPy定義了GPU加速的NDArray,其作用域與Numba nishino 2017 cupy略有不同  。CuPy是爲GPU專門構建的,遵循NumPy的相同API,幷包括SciPy API的許多功能,例如scipy.stats和scipy.sparse,它們會儘可能使用相應的CUDA工具包庫。CuPy還包裝了NVRTC https://docs.nvidia.com/cuda/nvrtc/index.html,以提供能夠在運行時編譯和執行CUDA內核的Python API。CuPy的開發旨在爲深度學習庫Chainer tokui2015chainer提供多維數組支持 ,此後已被許多庫用作NumPy和SciPy的GPU加速直接替換。

 

TensorFlow和PyTorch庫定義Tensor對象,它們是多維數組。這些庫與Chainer一起提供類似於NumPy的API,但構建計算圖以允許將張量上的操作序列與其執行分開定義。這是由於它們在深度學習中的使用而引起的,在深度學習中,跟蹤操作之間的依賴性使他們能夠提供自動區分等功能,而在一般的數組庫(如Numba或CuPy)中則不需要。深度學習和自動分化的更詳細討論可以在第5節中找到  。

 

Google的加速線性代數(XLA)庫  google 2017 xla提供了自己的特定於域的格式,用於表示和JIT編譯計算圖;還爲優化器提供了了解操作之間的依賴關係的好處。TensorFlow和Google的JAX庫frostig2018compiling都使用XLA ,該庫  使用NumPy填充程序爲Python提供自動區分和XLA,該NumPy填充程序根據連續的轉換構建計算圖,類似於TensorFlow,但直接使用NumPy API。

 

4.4互操作性

 

像Pandas和Scikit-learn這樣的庫都建立在NumPy的NDArray之上,繼承了在高性能核心之上構建NumPy的統一性和性能優勢。NumPy和SciPy的GPU加速版本多種多樣,爲用戶提供了許多選擇。最廣泛使用的選項是CuDF,CuPy,Numba,PyTorch和TensorFlow庫。正如本文簡介中所討論的那樣,過去每次使用不同的庫時都需要複製數據集或顯着更改其格式,這已阻礙了互操作性。對於GPU庫而言尤其如此,因爲這些庫的複製和翻譯需要CPU與GPU之間的通信,這常常會抵消GPU中高速內存的優勢。

 

最近發現有兩個標準可以在這些庫之間交換指向設備內存的指針-__cuda_array_interface__ 

https://numba.pydata.org/numba-doc/latest/cuda/cuda_array_interface.html和DLPack

https://github.com/dmlc/dlpack。這些標準使設備內存可以輕鬆表示並在不同庫之間傳遞,而無需複製或轉換基礎數據。這些序列化格式的靈感來自於NumPy的適當名稱__array_interface__,該名稱自2005年以來一直存在。有關Numba,CuPy和PyTorch庫之間的互操作性的Python示例,請參見圖  5。

圖5:不同GPU加速的Python庫之間的零複製互操作性示例。

4.5GPU上的經典機器學習

 

矩陣乘法在計算機科學領域中,矩陣乘法擴展到矩陣-矩陣和矩陣-矢量乘法

 

從凸優化到特徵值分解,線性模型,貝葉斯統計到基於距離的算法,這是機器學習操作的重要部分。因此,機器學習算法需要高性能的BLAS實現。GPU加速的庫需要以與NumPy和SciPy在下面使用C / C ++和Fortran代碼的方式相同的方式使用有效的低級線性代數基元,主要區別在於調用的庫需要GPU加速。其中包括CUDA Toolkit中包含的選項,例如cuBLAS,cuSparse和cuSolver庫。

 

適用於Python的GPU加速的機器學習庫的空間分散了不同類別的專用算法。在GBM 類別中,XGBoost Chen2016和LightGBM  Zhang都提供了GPU加速的實現  。IBM的SnapML和H2O爲線性模型Dunner2018提供了高度優化的GPU加速實現  。ThunderSVM具有支持向量機的GPU加速實現,以及用於分類和迴歸任務的標準內核集。它還包含一類SVM,這是一種用於檢測離羣值的無監督方法。SnapML和ThunderSVM都具有與Scikit-learn兼容的Python API。

 

Facebook的FAISS庫加速了最近鄰居的搜索,提供了近似和精確的實現以及K-Means Johnson2019的高效版本  。CannyLabs提供了非線性降維算法T-SNE maaten2008visualizing的有效實現,該算法  已被證明對於可視化和學習任務都是有效的。T-SNE通常禁止在CPU上使用,即使對於百萬個數據樣本Chan2019的中型數據集也是  如此。

 

cuML被設計爲用於機器學習的通用庫,其主要目標是填補Python社區中缺少的空白。除了用於構建機器學習模型的算法之外,它還在Scikit-learn中提供了GPU加速的其他軟件包的版本,例如preprocessing,feature_extraction和model_selection蜜蜂。通過關注GPU加速工具生態系統中缺少的重要功能,cuML還提供了Scikit學習中未包含的一些算法,例如時間序列算法。儘管仍保持類似於Scikit-learn的界面,但仍使用某些更特定算法的其他行業標準API來捕獲可提高可用性的細微差異,例如Statsmodels  seabold 2010 。

 

4.6GPU上的分佈式數據科學和機器學習

GPU已成爲高性能和靈活的通用科學計算中的關鍵組件。儘管GPU提供了諸如高速內存帶寬,共享內存,極端並行性以及對其全局內存進行合併的讀寫等功能,但單個設備上可用的內存量小於主機(CPU)內存中可用的容量。此外,即使CUDA流允許並行執行不同的CUDA內核,在具有大量數據工作負載的環境中,高度可並行化的應用程序也可能會受到單個設備上可用內核數量的限制。

 

可以組合使用多個GPU來克服此限制,從而爲更大的數據集上的計算提供總體上更多的內存。例如,可以通過在單個計算機上安裝多個GPU來擴展單個計算機。使用這項技術,重要的是這些GPU能夠直接訪問彼此的內存,而不會因通過諸如PCI-express這樣的慢速傳輸而造成性能負擔。但是向上擴展可能還不夠,因爲可以在一臺計算機上安裝的設備數量有限。爲了保持較高的橫向擴展性能,GPU能夠跨物理機器邊界共享其內存也很重要,例如通過NIC(如以太網)和高性能互連(如Infiniband)。

 

Nvidia在2010年推出了GPUDirect Shared Access  shainer2011development,這是一組硬件優化和低級驅動程序,用於加速GPU和同一PCI Express橋上的第三方設備之間的通信。在2011年,引入了GPUDirect對等技術,從而可以通過高速DMA傳輸在多個GPU之間移動內存。CUDA進程間通信(CUDA IPC)使用此功能,因此同一物理節點中的GPU可以訪問彼此的內存,從而提供了擴展能力。在2013年,啓用GPUDirect RDMA的網卡繞過CPU並直接在GPU上訪問內存。這消除了多餘的副本,並在不同的物理機器上創建的GPU之間的直線  potluri2013efficient,正式爲橫向擴展提供支持。

 

儘管自1999年SETI @ home發明並於2002年成立之初就存在使用GPU進行分佈式計算的幼稚策略  ,但是通過讓多個工作人員運行本地CUDA內核,GPUDirect提供的優化使包含多個GPU的分佈式系統具有更加全面的編寫方式可擴展算法。

 

可以在CUDA支持下構建第2.4節中介紹的MPI庫

https://www.open-mpi.org/faq/?category=runcuda,從而可以在多個GPU設備之間傳遞CUDA指針。例如,LightGBM(第2.3節  )使用OpenCL支持AMD和NVIDIA設備,對具有MPI的GPU進行分佈式訓練。Snap ML還可以通過MPI Dunner2018執行分佈式GPU訓練  。通過將CUDA支持添加到OpenMPI康達包裝中,Mpi4py庫

https://github.com/mpi4py/mpi4py現在向Python公開了支持CUDA的MPI ,從而減輕了科學家在Python數據生態系統中構建分佈式算法的障礙。

 

但是,即使使用支持CUDA的MPI,也可以在主機上執行諸如減少和廣播之類的集體通信操作,這些操作允許一組等級共同參與數據操作。NVIDIA集體通信庫(NCCL)提供了類似於MPI的API,可完全在GPU上執行這些簡化操作。這使得NCCL在諸如PyTorch,Chainer,Horovod和TensorFlow之類的分佈式深度學習庫中非常受歡迎。它也用在許多具有分佈式算法的經典ML庫中,例如XGBoost,H2OGPU和cuML。

 

MPI和NCCL均假設等級可用於實時同步通信。用於通用可伸縮分佈式計算的異步(延遲)任務計劃系統(例如Dask和Apache Spark)與該設計形成了鮮明的對比,方法是構建有向非循環計算圖(DAG),該圖表示任意任務之間的依賴關係並執行它們懶惰或異步。在執行圖形之前,這些任務的返回類型以及由此產生的尺寸是未知的。PyTorch和TensorFlow也構建DAG,並且由於假定張量用於輸入和輸出,因此通常在執行圖形之前就知道尺寸。

 

端到端數據科學需要ETL作爲開發流程的主要階段。這個事實與PyTorch和TensorFlow等張量處理庫的範圍背道而馳。RAPIDS通過爲Dask和Spark等系統中的GPU提供更好的支持來填補這一空白,同時促進使用互操作性在這些系統之間移動,如第4.4節所述  。

 

每個GPU的單進程(OPG)範例是使用GPU進行多處理的一種流行佈局,因爲它允許在單節點多GPU和多節點多GPU環境中使用相同的代碼。RAPIDS提供了一個名爲Dask-CUDA的庫,該庫可以輕鬆初始化OPG工人羣集,自動檢測每臺物理計算機上的可用GPU,並且僅將一個GPU映射到每個工人。

 

RAPIDS提供了由cuDF支持的Dask DataFrame。通過在其分佈式數組而不是NumPy 下支持CuPy ,Dask可以立即使用GPU進行多維數組的分佈式處理。Dask支持使用Unified Communications-X(UCX)  shamis2015ucx傳輸抽象層,允許工作人員使用最快的機制傳遞CUDA支持的對象,例如cuDF DataFrame,CuPy NDArray和Numba DeviceNDArrays。Dask中的UCX支持由RAPIDS UCX-py項目提供,該項目使用乾淨簡潔的界面將UCX中的低級C代碼包裝起來,因此可以輕鬆地與其他基於Python的分佈式系統集成。在同一物理機(節點內)的不同GPU之間傳遞GPU內存時,UCX將使用CUDA IPC。如果已安裝GPUDirect RDMA,則將用於跨物理機(節點間)的通信,但是,由於它需要在操作系統中安裝兼容的網絡設備和內核模塊,因此內存將轉儲到主機上。

 

通過結合Dask對通用分佈式GPU計算的全面支持以及第2.4節中概述的分佈式機器學習的通用方法  ,RAPIDS cuML能夠端到端分佈和加速機器學習流程。圖  6示出了DASK系統在訓練階段的狀態下,通過對包含從訓練數據集的數據分區的DASK工人執行訓練任務。訓練後的DASK系統的狀態在圖中示出  6灣 在此階段,參數僅保留在單個工作程序的GPU上,直到在模型上調用預測爲止。圖  6c顯示了預測過程中的系統狀態,其中,訓練後的參數會廣播給所有擁有預測數據集分區的工作人員。通常,只有fit()任務或一組任務才需要與其他工作人員共享數據。同樣,預測階段通常不需要工人之間的任何通信,從而使每個工人都可以獨立運行其本地預測。該設計涵蓋了大多數經典的ML模型算法,只有少數例外。

圖6:使用Dask的通用分佈式GPU計算。(a)分佈式cuML訓練。該擬合()函數是在包含在訓練數據集數據的所有工人執行。(b)訓練後的分佈式cuML模型參數。將訓練後的參數帶給一個工人。(c)分佈式cuML模型用於預測。訓練後的參數會廣播到預測數據集中包含分區的所有工作人員。預測以一種令人尷尬的並行方式進行。

 

Apache Spark的MLLib支持GPU,儘管集成不如Dask全面,缺少對本機序列化或GPU內存傳輸的支持,因此每個功能都需要從主機到GPU再到主機的不必要副本。Ray Project

https://github.com/ray-project/ray是相似的–儘管TensorFlow間接支持GPU計算,但集成不再進行。2016年,Spark引入了與Ray類似的概念,他們將其命名爲TensorFrame。此功能已被棄用。RAPIDS當前正在Spark 3.0中增加對分佈式GPU計算的更全面的支持

https://medium.com/rapids-ai/nvidia-gpus-and-apache-spark-one-step-closer-2d99e37ac8fd,內置對GPU的感知調度以及對端到端列式佈局的支持,從而在整個處理階段將數據保留在GPU上。

 

XGBoost(第2.3節  )支持在GPU上進行分佈式訓練,並且可以與Dask和Spark一起使用。除了MPI,Snap ML庫還爲Spark提供了一個後端。如2.4節  所述,使用Sparkling庫使H2O能夠在Spark上運行,並且GPU支持自動繼承。Dask可以使用通用庫cuML中的分佈式算法,其中也包括數據準備和特徵工程。

 

5.深度學習

使用經典ML,預測性能在很大程度上取決於數據處理和用於構建將用於訓練模型的數據集的特徵工程。第2節中提到的經典ML方法  在處理高維數據集時通常會出現問題-該算法對於從原始數據(例如文本和圖像lecun2015 deep)中提取知識而言不是  最理想的。另外,將訓練數據集轉換爲合適的表格(結構化)格式通常需要人工特徵工程。例如,爲了構建表格數據集,我們可以將文檔表示爲單詞頻率的向量  raschka2014 naive,或者我們可以通過製表葉子尺寸的表格來表示(虹膜)花,而不是使用照片中的像素作爲輸入  fisher1936use。

 

對於大多數基於表格數據集的建模任務,經典ML仍然是推薦的選擇。但是,除了上面第3節中提到的AutoML工具外  ,它還取決於仔細的功能工程,這需要大量的領域專業知識。數據預處理和特徵工程可以被視爲一門藝術,其目的是從收集的原始數據中提取有用且重要的信息,從而保留與進行預測有關的大多數信息。粗心或無效的特徵工程可能會導致刪除重要信息,並嚴重阻礙預測模型的性能。

 

雖然某些深度學習算法能夠接受表格數據作爲輸入,但是大多數發現最佳預測性能的最新方法都是通用的,並且能夠以某種自動化的方式從原始數據中提取重要信息。這種自動特徵提取是其優化任務和建模體系結構的固有組成部分。因此,深度學習通常被描述爲一種表示或特徵學習方法。但是,深度學習的一個主要缺點是它不適用於較小的表格數據集,而參數化DNN可能需要較大的數據集,而有效訓練需要5萬至1500萬個訓練示例。

 

以下各節回顧了基於GPU和Python的深度學習庫的早期開發,這些庫着重於通過靜態圖的計算性能,向動態圖的融合以提高用戶友好性,以及當前爲提高計算效率和可伸縮性而做出的努力,以應對不斷增長的數據集和架構大小。


5.1靜態數據流圖

Caffe深度學習框架於2014年首次發佈,旨在提高計算效率,同時提供易於使用的API來實現常見的CNN架構。

Caffe在計算機視覺社區中非常受歡迎。除了專注於CNN之外,它還支持循環神經網絡和長短期記憶單元。儘管Caffe的核心部分是用C ++實現的,但它通過使用配置文件作爲實現深度學習架構的接口來實現用戶友好。這種方法的一個缺點是很難開發和實現自定義計算。

 

Theano最初於2007年發佈,是另一個學術深度學習框架,在2010年代獲得了發展 team 2016 theano。與Caffe相比,Theano允許用戶直接在Python運行時中定義DNN。但是,爲了提高效率,Theano將深度學習算法和架構的定義與執行分開了。Theano和Caffe都將計算表示爲靜態計算圖或數據流圖,在執行之前先對其進行編譯和優化。在Theano中,此編譯可能需要花費幾秒鐘到幾分鐘的時間,並且在調試深度學習算法或體系結構時可能會成爲主要的摩擦點。此外,將圖形表示與執行分離開來,很難與代碼進行實時交互。

在2016  abadi2016tensorflow中,谷歌發佈了TensorFlow,它採用了與Theano類似的方法,即使用了靜態圖形模型。雖然圖形定義與執行之間的這種分離仍然不允許實時交互,但TensorFlow減少了編譯時間,使用戶可以更快地迭代不同的想法。TensorFlow還專注於分佈式計算,當時很少有DNN庫提供。這種支持使深度學習模型可以一次定義並部署在不同的計算環境中,例如服務器和移動設備,這一功能使其對行業特別有吸引力。TensorFlow還被學術界廣泛採用,變得如此受歡迎,以至於Theano的開發在2017年停止了發展。

 

在2016年至2019年之間的幾年中,發佈了其他幾個帶有靜態圖範式的開源深度學習庫,包括微軟的CNTK  seide2016cntk,索尼的Nnabla :

https://github.com/sony/nnabla,

Neon :https://github.com/NervanaSystems/neon、

Facebook的Caffe2  markham2017 caffe2和百度的PaddlePaddle  ma2019 paddle。與其他深度學習庫不同,Nervana Neon(後來被英特爾收購,現已停產)沒有使用cuDNN來實現神經網絡組件。相反,它具有通過英特爾MKL(第1.2節)優化的CPU後端  。MXNet chen2015mxnet受Amazon,Baidu和Microsoft的支持,它是Apache Software Foundation的一部分,並且仍然是唯一一家主要由主要的營利性技術公司開發的,主動開發的,主要的開源深度學習庫。

 

雖然靜態計算圖對於在生產環境中應用代碼優化,模型導出和可移植性很有吸引力,但是缺乏實時交互性仍然使它們在研究環境中難以使用。下一節重點介紹了一些主要的深度學習框架,這些框架正在擁抱一種稱爲動態計算圖的替代方法,該方法允許用戶直接實時地與計算交互。

 

5.2具有急切執行的動態圖庫

 

Torch在將近二十年前的2002年首次發佈,是一個非常有影響力的開源機器學習和深度學習庫。在像其他深度學習框架一樣使用C / C ++和CUDA的同時,Torch基於腳本語言Lua,並利用即時編譯器LuaJIT

 

collobert 2011 torch7。與Python相似,Lua是一種易於學習和使用的解釋型語言。使用自定義C / C ++代碼進行擴展也很容易,以提高科學計算環境中的效率。使Lua特別吸引人的是它可以被嵌入到不同的計算環境中,例如移動設備和Web服務器-使用Python不太容易實現的功能。

Torch 7(於2011年發佈)由於對計算圖collobert 2011 torch7的動態處理,因此在很大一部分深度學習研究社區中特別有吸引力  。與上一節(第5.1節)中提到的深度學習框架相反  ,Torch 7允許用戶直接與計算交互,而不是定義在執行之前需要顯式編譯的靜態圖(圖  7)。隨着Python在整個2010年代逐漸發展成爲用於科學計算,機器學習和深度學習的通用語言,儘管其用戶友好的靜態圖方法不那麼受歡迎,但許多研究人員似乎仍然更喜歡Theano而不是Torch等基於Python的環境。

圖7:(a)TensorFlow 1.15中的靜態計算圖與(b)由PyTorch 1.4中的動態圖啓用的命令式編程範例之間的比較。

Torch 7最終在2017 paszke2017automatic中被PyTorch取代  ,它最初是圍繞Torch 7的較低級C / C ++代碼的用戶友好的Python包裝器。受動態和基於Python的深度學習框架(例如  Chainer tokui2015chainer和DyNet  neubig2017dynet)的先驅啓發,PyTorch採用命令式編程風格,而不是使用圖元編程.

在圖元編程中,圖的部分或全部結構是在編譯時提供,並且在運行時僅生成或添加最少的代碼。。這對研究人員特別有吸引力,因爲它爲Python用戶提供了熟悉的界面,簡化了實驗和調試,並且與其他基於Python的工具直接兼容。DyNet,Chainer和PyTorch之類的庫與常規的GPU加速的數組庫(如CuPy)的區別在於,它們包括用於計算標量值函數梯度的反向模式自動微分(autodiff)

標量值函數接收一個或更多輸入值,但返回單個值關於多元輸入。自2017年以來,PyTorch已被廣泛採用,現在被認爲是最受歡迎的深度學習研究庫。在2019年,PyTorch是在所有主要的深度學習會議中最常用的深度學習庫  he2019stateofml。

 

動態計算圖允許用戶實時與計算交互,這在實現或開發新的深度學習算法和體系結構時是一個優勢。儘管此特定功能可增強功能,但像這樣的急切執行卻需要很高的計算成本。此外,執行需要使用Python運行時,這使得在移動設備和其他未配備最新Python版本的環境中部署DNN變得很困難。儘管獨立基準測試表明,與靜態圖形庫(如TensorFlow coleman2017dawnbench)相比,PyTorch在GPU上進行DNN訓練的速度已經更快  ,但Facebook在過去幾年中做出了許多顯着的性能提升

 

由於Python代碼僅用於通過對較低級CUDA和cuDNN庫的回調將操作排隊在GPU上以異步執行,因此所有主要深度學習框架的計算性能差異都將大致相似。。例如,原始的Torch 7核心張量庫在很大程度上是從頭開始重寫的,而PyTorch最終與Caffe2的代碼庫合併在一起。

 

至此,Caffe2變得專注於計算性能和移動部署。這種合併允許PyTorch自動繼承這些功能。在2019年,PyTorch除了其他功能外還添加了JIT(即時)編譯功能,進一步增強了其計算性能  paszke2019 pytorch。

 

此後,一些最初使用靜態數據流圖的現有深度學習庫(例如TensorFlow,MXNet和PaddlePaddle)增加了對動態圖的支持。用戶的要求和PyTorch越來越受歡迎的原因促成了這一變化。動態計算圖非常有效,現在它已成爲TensorFlow 2.0中的默認行爲。

 

5.3 JIT與計算效率

儘管由於其易用性而受到研究的青睞,但上述所有動態圖庫都通過爲特定的神經網絡組件和深度學習算法提供固定的構建塊來達到所需的計算效率水平。雖然可以從較低級別的構建模塊開發自定義功能(例如,使用庫的數組子模塊公開的線性代數運算來實現自定義神經網絡層),但是這種方法的缺點是它很容易引入計算瓶頸。但是,在一行代碼中,通過啓用JIT編譯(通過Torch腳本),可以在PyTorch中避免這些瓶頸。

 

可定製性和計算效率的另一種體現是Google最近發佈的開源庫JAX  frostig2018compiling。如第4.5節中所述  ,JAX向以自動微分(正向和反向模式自動diff),XLA(加速線性代數;線性代數的特定領域編譯器)爲中心的常規Python和NumPy代碼中添加了可組合元素作爲GPU和TPU計算

TPU是Google定製開發的用於機器學習和深度學習的芯片。。JAX能夠區分樸素的Python和NumPy函數,包括循環,閉包,分支和遞歸函數。除了反向模式微分外,autodiff模塊還支持正向模式微分這樣可以高效地計算高階導數,例如Hessian;其他主要的深度學習庫尚不支持此功能,但它是一項受到高度要求的功能,目前正在PyTorch中實現

(https://github.com/pytorch/pytorch/issues/10223)。

前向模式autodiff可以自動區分具有多個輸出的功能,這在當前利用反向傳播的深度學習研究中並不常用 rumelhart 1986學習。

JAX是一個相對較新的庫,尚未得到廣泛採用。但是,JAX的設計選擇是完全採用NumPy的API,而不是開發像PyTorch這樣的類似NumPy的API,這可能會降低熟悉NumPy生態系統的用戶的進入門檻。JAX面向具有自動diff支持的數組計算,與PyTorch不同,因爲它不依賴於Flax專注於提供全套深度學習功能,因此https://github.com/google-research/flax/tree/預發這樣做。

 

例如卷積層,批處理規範

ioffe2015batch,attention  vaswani2017attention等,它實現了常用的優化算法,包括具有動量 qian1999動量的  SGD,Lars  efron2004least和ADAM  kingma2014adam。重要的是,本節的結尾必須指出所有主要的深度學習框架現在都基於Python。另一個值得注意的趨勢是,學術界使用的所有深度學習庫現在都由大型科技公司提供支持。學術界和行業的不同需求可能導致開發此類設計模式所需的複雜性和工程工作。根據對主要發佈場所,社交媒體和搜索結果的詳盡分析,許多研究人員正在放棄TensorFlow,轉而使用PyTorch  he2019stateofml。Horace He進一步建議,儘管PyTorch目前在深度學習研究中佔據主導地位-在主要的計算機視覺和自然語言處理會議上超過TensorFlow 2:1和3:1 -TensorFlow仍然是業界最受歡迎的框架 

 

he2019stateofml。TensorFlow和PyTorch似乎相互啓發,並在各自的長處和短處交匯。PyTorch添加了用於生產和移動部署的靜態圖功能(最近由TorchScript啓用),而TensorFlow添加了動態圖,以便於研究。預計在未來幾年中,這兩個庫仍將是最受歡迎的選擇。


5.4深度學習API

 

位於5.1  和  5.2節中討論的深度學習庫的頂部  是幾個不同的包裝器庫,這些庫使從業者更易於使用深度學習。這些API的主要設計目標之一是在代碼詳細程度和可定製性之間提供更好的折衷。現有的深度學習框架可能非常強大且可自定義,但也會使新手感到困惑。Lasagne是Theano

https://github.com/Lasagne/Lasagne的“輕量級”包裝器,是一種抽象的方法,用於提取看似複雜的代碼。在Lasagne首次發佈後的2015年,Keras庫

https://github.com/keras-team/keras引入了另一種方法,使Theano更易於爲廣大用戶所使用,其API設計使人聯想到Scikit-learn的面向對象方法。在首次發佈後的幾年中,Keras API確立了自己作爲最受歡迎的Theano包裝器的地位。在2016年初,即TensorFlow發佈後不久,Keras還開始支持它作爲另一個可選的後端。在第二年的2017年,微軟的CNTK  seide2016cntk被添加爲第三個後端選擇。在這段時間裏,TensorFlow開發人員正在嘗試抽象庫,希望簡化模型的構建和訓練,並使非專家更容易訪問它們。經過多次嘗試和廢棄的設計後,TensorFlow 2.0在2019年加強了與Keras的集成,最終公開了一個子模塊(tensorflow.keras),並製作了面向用戶的官方API  tensorflow2019tf2。因此,不再積極開發Keras的獨立版本。

 

由於PyTorch首先非常注重用戶友好性,這是由於Chainer採用動態方法tokui2015chainer的簡潔方法所  激發的,因此研究社區沒有強烈的動機來擁抱擴展API。儘管如此,這些年來出現了幾個基於PyTorch的項目,這些項目有助於在不同用例下實現神經網絡,從而使代碼更緊湊,同時簡化了模型訓練。此類庫的著名示例是Skorch

https://github.com/skorch-dev/skorch,它在PyTorch,Ignite之上提供了Scikit-learn兼容的API 

https://github.com/pytorch/ignite

https://github.com/pytorchbearer/torchbearer  harris2018torchbearer,Catalyst33

https://github.com/catalyst-team/catalyst和PyTorch Lightning

https://github.com/PyTorchLightning/pytorch-lightning。

 

2020年,軟件公司Explosion發佈了其開源深度學習庫Thinc的主要版本。版本8.0 35

https://github.com/explosion/thinc/releases/tag/v8.0.0a0承諾使用支持PyTorch,MXNet和TensorFlow代碼的輕量級API進行深度學習的全新功能。該版本還通過Mypy 36

https://github.com/python/mypy包含了靜態類型檢查。

,使深度學習代碼更易於調試。與獨立版本的Keras相似,Thinc支持多個深度學習庫。與Keras相比,Thinc強調定義模型的功能性而非面向對象的方法。Thinc進一步提供了對底層反向傳播組件的訪問,並且能夠同時組合不同的框架,而不是提供像Keras這樣的可插拔外觀,一次只能利用單個深度學習庫的功能。

 

Fastai庫將用戶友好的API與模型訓練的最新改進和最佳實踐相結合。初始版本基於Keras,儘管2018年它在1.0版本中進行了重大改進,現在在PyTorch之上提供了直觀的API。Fastai還提供允許用戶輕鬆可視化DNN模型以進行發佈和調試的功能。此外,它通過提供有用的訓練功能(如自動學習率調度程序)提高了DNN的預測性能,這些訓練功能配備了最佳實踐,可縮短訓練時間並加速融合。Fastai的路線圖包括深度學習算法,這些算法可以在不進行大量調整和實驗的情況下即開即用地工作,從而通過減少對昂貴的計算資源的需求,使深度學習更加容易實現。

DAWNbench coleman2017dawnbench是一個基準套件,它不僅考慮了預測性能,還考慮了深度學習模型的速度和訓練成本。


5.5加速大規模深度學習的新算法

利用Transformer架構的最新研究進展,例如BERT  devlin2018bert和GPT-2 radford2019語言

,已經表明,對於某些架構,預測性DNN模型的性能可以與模型大小高度相關。在短短三年(從2014年到2017年)的過程中,ImageNet視覺識別挑戰的模型規模russakovsky2015 imagenet贏家來自大約。400萬  szegedy2015達到1.46億  hu2018的擠壓參數,大約是 增加了36倍。同時,GPU內存僅增長了約一個倍。3x並提出了單GPU深度學習研究  google2020 gpipe的瓶頸。

大規模模型訓練的一種方法是數據並行性,其中在不同批次的數據集上並行使用多個設備。儘管這可以加快模型收斂速度,但該方法仍然無法訓練大型模型,因爲只有數據集在設備之間劃分,並且模型參數仍需要適合每個設備的內存  hegde2016parallel。模型的並行性,而另一方面,塗在不同的設備模型,使模型與大量的參數以適合單個GPU的存儲器  ben2019 demystifying。

 

Google在2019年3月發佈了GPipe  huang2019gpipe開源社區,使訓練大型神經網絡模型的效率更高。GPipe超越了數據和模型並行性,實現了基於同步隨機梯度下降的流水線並行技術 huang2019gpipe。在GPipe中,模型分佈在不同的硬件加速器上,並且訓練數據集的微型批次進一步細分爲微型批次,並且梯度在這些微型批次上始終保持累積(同步數據並行性)。在一項令人印象深刻的案例研究中,研究人員能夠在23萬多個雲TPU上訓練具有超過十億個參數的AmoebaNet-B  real2019正規化模型。在AmoebaNet-D  real2019規範化基準上,研究人員觀察到使用GPipe將模式劃分爲8個分區,而使用樸素的模型並行方法將模型 huang2019gpipe拆分,則計算性能提高了3倍 。

改善DNN預測性能的傳統方法是增加最新架構的層數。例如,將Res2016的heNet架構  從ResNet-18擴展到ResNet-200(通過添加更多的層),導致ImageNet  deng2009 imagenet的 top-1精度提高了4倍 https://github.com/tensorflow/privacy。

 

改進預測性能的更原則的方法是使用所謂的複合係數以Tan和Le在EfficientNet神經體系結構搜索方法tan2019ficientnet中提出的結構化方式縮放CNN 。複合縮放方法不是使用任意縮放CNN的輸入分辨率,深度和寬度,而是首先使用網格搜索來確定這些不同架構參數之間的關係。從此初始搜索中,可以基於用戶指定的計算預算或模型大小tan2019efficiency來導出複合縮放係數以調整基線體系結構  。據說EfficientNets模型產生的性能要優於當前的最新方法,通過縮小參數大小並增加整個tan2019efficiencynet的計算,可以將效率提高10倍  。Google工程團隊進一步推動了實施,開發了一個EfficientNet變體,可以更好地利用其所謂的Edge TPU硬件加速器  google2020efficiencyedge –邊緣計算是分佈式系統的一種範式,其重點是使計算和數據存儲與實際操作所在的位置緊密相鄰。

 

量化通常用於加速訓練並降低模型的內存佔用量,該方法描述了將連續信號或數據轉換爲具有固定大小或精度的離散數的過程。

量化的典型示例是將數據表示爲將64位浮點數轉換爲8位整數格式。這個概念已經存在了數十年,但最近對深度學習的興趣不斷增加。雖然通常與精度的損失相關,花樣繁多已經發展到這種損耗降至最低  choi2018pact ; jacob2018量化 ; rastegari2016xnor ; zhang2018lq ; zhou2017增量 ;周2016dorefa。大多數深度學習庫的最新版本(例如TensorFlow v2.0和PyTorch 1.4)都支持Int8(8位)量化,與Float32(32位)模型相比,它們可以將內存帶寬需求降低4倍。。

 

除了通過改進的軟件實現來提高深度學習的可擴展性和速度之外,算法改進最近還集中在優化算法的近似方法等方面。其中包括新概念,例如SignSGD  bernstein2018signsgd,它是SGD的改進版本,用於分佈式培訓,工人僅可以傳達坡度的符號。研究人員發現,SignSGD每次迭代的通信量要比分佈式SGD的完全精確度低32倍,而其收斂速度卻可以與SGD競爭。

 

6.機器學習模型的可解釋性,可解釋性和公平性

簡單來說,可解釋性是指對模型在幕後的工作方式的理解,而可解釋性是指觀察輸入或參數變化對預測輸出的影響的能力。儘管相互關聯,但每個人都假定對模型有不同的知識-可解釋性使我們能夠理解模型的機制,而可解釋性使我們能夠交流如何從一組學習的參數中生成模型的輸出。可解釋性意味着可解釋性,但反面不一定總是正確的。除了理解決策過程之外,可解釋性還需要識別偏見。透明度要求規則用於生成預測的模型是完整且易於理解的   nguyen2019mononet。

 

6.1功能重要性

線性模型背後的主要吸引力在於輸入,學習重量參數和輸出之間線性關係的簡單性。這些模型通常隱含可解釋的,因爲它們可以自然加權每個特徵的影響,並干擾該輸入或學習參數對輸出規定的(線性)效應   ribeiro2016should。但是,多個特徵之間的不同相關性可能使得難以分析每個特徵對結果預測的獨立歸屬。特徵重要性的形式有很多種,但是一般的概念是使參數和特徵更容易解釋。根據此定義,所產生的功能重要性的確切特徵可能會根據目標而有所不同。

 

在可解釋性領域,本地模型和全局模型之間存在區別。儘管局部模型僅提供對特定數據點的解釋(通常更容易理解),但全局模型通過概述決策過程nguyen2019mononet來提供透明度   。

 

LIME  ribeiro2016應該是解釋非線性模型(已經過事後)後解釋非線性模型的最簡單算法之一。該算法根據特定數據實例周圍的擾動預測訓練線性模型(稱爲替代模型),以瞭解該實例周圍的非線性決策函數的形狀。通過學習單個點附近的局部決策函數,我們可以更好地解釋原始模型中的參數如何將輸入與輸出相關聯。

 

與LIME相比,SHAP  lundberg2017unified是一種事後算法,可通過提供所有數據點的平均值來全局解釋  NIPS2017-7062。SHAP不是單一算法,而是多種算法。結合SHAP變體的方法是使用Shapley值shapley1953值  ,通過計算模型在不同預測中每個特徵的平均貢獻來確定特徵重要性或歸因。SHAP Python庫

https://github.com/slundberg/shap提供了不同的變體,它建立在其他功能歸因方法(例如LIME,Integrated Gradients sundararajan2017 axiomatic和DeepLift   ShrikumarGK17)的基礎上 用於模型不可知論。

 

特定於多類別分類問題,模型不可知線性競爭者(MALC)  Rafique算法訓練一個單獨的線性分類器,以學習每個類別的決策邊界,並且僅當線性競爭者的預測爲足夠自信。這項技術類似於“一對多”分類-這些線性模型將在推理過程中使用,從而將可解釋性集成到了機器學習管道中,從而爲那些可以使用競爭對手進行分類的預測提供了透明度和特徵歸因。

 

Captum 

https://captum.ai是一個Python庫,用於解釋PyTorch中的模型,其中包含大量受支持的算法,包括但不限於LIME,SHAP,DeepLift和Integrated Gradients。

 

6.2約束非線性模型

在線性模型中對目標函數施加約束是提高學習參數之間的可分辨性(從而提高可解釋性)的常用方法。例如,套索和脊等算法使用正則化來使所得的權重向量保持接近零,從而使彼此之間的特徵重要性更加直接可辨。

 

儘管正則化可以增加線性模型中的可分辨性,但是非線性模型可以在輸入變量之間引入相關性,這可能使得很難預測輸入和輸出之間的因果關係。MonoNet  nguyen2019mononet在非線性分類器中對特徵和輸出之間的單調性施加約束,目的是在特徵與其輸出之間建立更獨立的可分辨關係。MonoNet是此約束的神經網絡實現,使用作者稱爲單調網絡。

 

上下文分解解釋罰分(CDEP)rieger2019解釋   爲優化目標添加了一個術語,該術語對神經網絡的參數施加了約束,因此除預測正確的值外,他們還學會了如何產生良好的解釋。而不是僅僅捕捉個人特徵歸因,這種方法還採用分數稱爲上下文分解分數 murdoch2018beyond學習功能是如何結合在一起,使每一個預測。CDEP的魅力在於可以將約束項添加到任何可微分的目標中。

 

將神經網絡分類器約束爲可逆的可以實現可解釋性和可解釋性。可逆神經網絡由堆疊的可逆塊組成,並在每一層保留足夠的信息以從輸出重構輸入。通過將線性層附加到神經網絡的輸出層,可逆性約束可用於近似局部決策邊界並構造特徵重要性  zhuang2019decision。

 

6.3邏輯與推理

特徵重要性分數通常是根據決策樹中的信息增益和基尼雜質準則構建的,因此,對預測影響最大的拆分將更靠近樹的根。因此,決策樹被稱爲白盒模型,因爲它們已經包含了解釋所需的信息。Silas  新娘2019silas ; 新娘2018在此概念的基礎上,通過將沿從根到葉子的預測的路徑上的學習拆分謂詞組合爲邏輯連接,並將一類的所有路徑組合爲邏輯分叉,從樹的集合中提取邏輯公式。可以使用邏輯推理技術來分析這些邏輯公式,以提供有關決策過程的信息,從而可以對模型進行微調,以消除不一致之處並執行某些用戶提供的要求。這種方法屬於被稱爲知識級學習Dietterich1986learning的類別,  因爲經過訓練的模型的內部結構已經模仿了邏輯表達。

 

雖然深度學習方法主導着圖像分類的最新技術,但僅通過視覺反饋來解釋模型,方法是突出顯示導致分類的圖像區域,這給人類帶來了繁瑣的解釋任務。結合視覺解釋和口頭解釋,例如,通過在圖像中納入導致預測的不同對象之間的關係,已被證明對人類層面的解釋非常有效。LIME算法能夠生成可突出顯示圖像中像素塊(稱爲超像素)的特徵重要性。可以從歸納邏輯編程中提取超像素之間的空間關係 像Aleph這樣的系統,目的是構建一組簡單的邏輯表達式來口頭解釋預測 rabold2018 ; rabold2019豐富。

 

6.4使用交互式可視化進行解釋

可視化模型的學習參數的特徵以及對模型與一組數據的交互的解釋通常很有用。以視覺形式進行分析時,特徵重要性和歸因分數可以提供更有用的見解,從而暴露出原本很難辨認的模式。在Python機器學習社區,Matplotlib  Hunter2007,Seaborn

https://github.com/seaborn/seaborn,

散景https://github.com/bokeh/bokeh,和 Altair2018被廣泛用於可視化數據中繪圖和圖表。

 

儘管來自圖像分類器的視覺解釋可能會提示爲什麼進行單個預測,以便人們可以更好地理解決策邊界,但交互式可視化可以實現對模型學習參數的實時探索。對於黑盒模型(例如神經網絡),這對於鑽研和了解所學內容尤其重要。

 

交互式可視化工具,例如Graphistry 

 https://graphistry.com和RAPIDS的cuDataShader庫,可以在GPU上進行通用數據瀏覽。鑽取一組數據對於可視化黑匣子模型的不同部分特別有用。例如,神經網絡中每一層的激活向量可以針對不同的輸入進行可視化佈局,從而使用戶能夠探索它們之間的關係,從而洞悉神經網絡正在學習什麼。

 

作爲通用數據可視化的替代方法,特定於模型的工具靈活性較差,但提供了更具針對性的見解。首腦 

 

hohman2019s通過交互式和針對性的可視化揭示了CNN分類器中有影響力的特徵的關聯。它基於功能可視化 的常規技術 

https://distill.pub/2017/feature-visualization/和激活地圖集 

https://ai.googleblog.com/2019/03/exploring-neural-networks。html

,以不同的粒度提供視圖,以彙總和總結有關每個類別標籤的最具影響力的神經元的信息。細粒度的可視化總結了網絡各層中最有影響力的神經元的連接,而粗粒度的可視化則通過彙總神經元信息並使用UMAP突出顯示了各個類別中這些有影響力的神經元的相似性。 

 

McInnes2018是非線性降維技術中的最新技術,可嵌入適合可視化的空間。

變形金剛模型(BERT)的雙向編碼器表示法是語言表示學習模型devlin2018bert的最新技術,該模型  旨在學習可用於其他任務的單詞的上下文表示法。它來自使用稱爲vaswani2017attention的策略的基於LSTM網絡(稱爲Transformers)的模型模型。通過將輸入序列中的不同標記置於序列中的其他標記上來改善學習效果。像其他黑盒深度學習模型一樣,模型在給定的測試集上可能具有高性能,但在部分學習的參數空間中仍然存在明顯的偏差。從這種方法學到的語言特性還不是很容易理解。exBERT  hoover2019exbert提供了有針對性的交互式可視化功能,以與前面提到的Summit相似的方式總結了學習到的參數。exBERT通過對不同輸入序列的不同層中的注意力機制進行交互探索,並提供對所學習嵌入的最近鄰搜索,來幫助做出解釋。

 

6.5隱私

機器學習使我們能夠在許多領域推動最先進的技術,例如自然語言處理  vaswani2017的關注度;howard2018universal ; radford2019語言 ; 對adiwardana2020和計算機視覺的  理解 ; huang2017密集 ; joo2018total ; huang2019神經,某些應用程序涉及需要負責任處理的敏感數據。除了存儲整個訓練集的基於最近鄰居的方法之外,DNN尤其容易記憶有關特定訓練示例的信息(而不是提取或學習一般模式)。此類信息的隱式存在問題,因爲它可能侵犯用戶的隱私並可能被用於惡意目的。爲了在技術基於潛在敏感培訓數據的基礎上提供強大的隱私保證,Google最近發佈了TensorFlow Privacy

https://github.com/tensorflow/privacy  mcmahan2018general,這是用於TensorFlow的工具箱,該工具箱實現了基於差異隱私的技術。差異隱私框架提供了強有力的數學保證,以確保模型不會記住或瞭解有關任何特定用戶的詳細信息  mcmahan2018general。

 

6.6公平

儘管機器學習推動了驚人技術的發展,但最近受到越來越多關注的一個主要問題是訓練數據集可以加強或反映不公平的(人爲)偏見。例如,最近的一項研究表明,人臉識別方法會根據種族和性別屬性進行區分 。

buolamwini2018gender。Google最近發佈了一套名爲“公平指標”的工具

https://github.com/tensorflow/fairness-indicators

幫助實現公平性指標和分類模型的可視化。例如,“公平指標”實施了相當普遍的指標來檢測公平偏差,例如誤報率和誤報率(包括置信區間),並將其應用於數據集的不同部分(例如,具有敏感特徵的組,例如性別,國籍和收入) 

google2020 fairness-b。

 

隨着機器學習在行業中的發現越來越廣泛,可解釋性和可解釋性這一主題變得越來越重要。具體來說,隨着深度學習在不斷增長的不同任務列表上繼續超越人類水平的表現,因此對它們的需求也可以得到解釋。該分析中還非常普遍的是經典ML與深度學習之間的共生關係,因爲前者仍然對特徵重要性的計算,替代建模以及支持DNN的可視化提出了很高的要求。

7.對抗學習

儘管對抗性學習是一個通用概念,但通常會在計算機視覺和深度學習的背景下最直觀地解釋和展示對抗性學習。例如,在給定輸入圖像的情況下,對抗性攻擊可以描述爲增加了一些小的擾動,這些擾動通常對人類來說是微不足道的或無法察覺的,它們會使愚弄機器學習模型做出某些(通常是不正確的)預測。在欺騙DNN模型的情況下,“對抗性示例”一詞由Szegedy 等人提出。2013年  szegedy 2013引人入勝。在安全性的上下文中,對抗性學習與可解釋性緊密相關,需要對訓練後的模型的學習參數進行分析,以便更好地理解特徵映射和決策邊界對模型安全性的影響。

 

對抗性攻擊可能對許多與安全性相關的應用程序以及物理世界產生嚴重影響。例如,2018年,Eykholt等人。結果表明,在交通標誌上貼上小貼紙(此處爲停車標誌)會在實驗室環境中引起100%的誤分類率,而在從移動車輛eykholt2018捕獲的視頻幀健壯的現場測試中會導致85%的誤分類率  。

 

對抗攻擊可以在訓練(中毒攻擊)過程中或訓練後的預測(測試)階段(逃避攻擊)發生。規避攻擊可以進一步分爲白盒和黑盒攻擊。白盒攻擊假定對方法和DNN體系結構有全面的瞭解。在黑盒攻擊中,攻擊者除了瞭解機器學習系統的工作方式外,不知道它所輸入的數據類型。

 

基於Python的對抗性學習庫包括Cleverhans  papernot2016cleverhans,FoolBox  rauber2017foolbox,ART  nicolae2018adversarial,DEEPSEC  ling2019deepsec和AdvBox  goodman2020advbox。除了Cleverhans和FoolBox之外,所有庫都支持對抗攻擊和對抗防禦機制。根據Cleverhans的代碼文檔,開發人員的目標是將來增加常見防禦機制的實現。儘管Cleverhans's與TensorFlow和PyTorch兼容,而DEEPSEC僅支持MXNet,但FoolBox和ART支持上述所有三個主要的深度學習框架。此外,最新發布的庫AdvBox還增加了對百度PaddlePaddle深度學習庫的支持。

 

儘管對這些框架中實現的各種對抗性攻擊和防禦方法的詳盡列表的詳細討論超出了本文的討論範圍,但表  1總結了受支持的方法以及對研究論文的引用,以供進一步研究。

表1.在對抗學習中實現的規避攻擊和防禦機制的選擇工具包。

8.結論

本文回顧了機器學習,數據科學和科學計算方面的一些最著名的進展。它提供了主要主題的簡要背景,同時調查了各種挑戰以及每種挑戰的解決方案現狀。在本文的範圍之外,還有其他一些更專業的應用和研究領域。例如,基於注意力的Transformer架構以及專用工具

https://github.com/huggingface/transformers

最近已經開始在深度學習vaswani 2017 attention的自然語言處理子領域中占主導地位  ;radford2019語言。

 

圖形數據的深度學習已成爲人們關注的一個增長領域,圖卷積神經網絡目前正積極地用於計算生物學中,用於對raschka2020 machine分子結構進行建模  。該領域的熱門庫包括基於TensorFlow的Graph Nets  battaglia2018關係庫和PyTorch Geometric  fey2019fast。時間序列分析在Python中被衆所周知地忽略了,它以可擴展的StumPy庫law2019stumpy的形式重新引起了人們的興趣  。另一個被忽略的領域,即頻繁的模式挖掘,在MLxtend raschka2018 mlxtend中與Pandas兼容的Python實現受到了一些關注  。UMAP  McInnes2018,新的Scikit-learn兼容特徵提取庫已被廣泛用於可視化二維流形上的高維數據集。爲了提高大型數據集的計算效率,RAPIDS

https://github.com/rapidsai/cuml中包含了基於GPU的UMAP版本。

 

近年來,人們對Python 中的概率編程,貝葉斯推理和統計建模也越來越感興趣。該領域的著名軟件包括PyStan

STAN Carpenter2016的https://github.com/stan-dev/pystan, 基於Theano的PyMC3  Salvatier2016庫,基於TensorFlow的Edward  tran2016edward庫和Pomegranate  schreiber2017 pomegranate,它具有用戶友好的Scikit-learn-像API。作爲用於在深度學習和AI研究中實現概率模型的下層庫,Pyro  Bingham2019提供了一個基於PyTorch的概率編程API。NumPyro  phan2019composable爲Pyro提供了一個NumPy後端,它使用JAX進行JIT編譯並優化了CPU和GPU上NumPy操作的執行。

強化學習(RL)是一個研究領域,可以訓練代理解決複雜而具有挑戰性的問題。由於RL算法基於反覆試驗的方法以最大化長期獎勵,因此RL是機器學習中特別耗費資源的領域。此外,由於RL旨在解決的任務特別具有挑戰性,因此RL難以擴展-學習一系列的步驟來玩棋盤或視頻遊戲,或訓練機器人在複雜的環境中導航,這比識別固有的任務要複雜得多。圖像中的對象。深度Q網絡是Q學習算法和深度學習的結合,一直處於RL最新進展的最前沿,其中包括擊敗世界冠軍玩棋盤遊戲Go  silver2017 mastering並與排名最高的《星際爭霸II》玩家  vinyals2019 grand master競爭。由於現代RL主要基於深度學習,因此大多數實現都利用第5節中討論的流行的深度學習庫之一  ,例如PyTorch或TensorFlow。

 

我們希望在未來幾年內,RL能夠實現更多驚人的突破。此外,我們希望用於訓練代理人玩棋盤或視頻遊戲的算法可以用於重要的研究領域,例如蛋白質摺疊,這是DeepMind quach2018deepmind當前探索的一種可能性 。作爲一種易於學習和使用的語言,Python在許多研究和應用領域中已發展成爲通用語言,我們在本文中着重介紹了該語言。隨着CPU和GPU計算的進步以及不斷增長的用戶社區和庫生態系統的推動,我們期望Python在未來多年內仍將是科學計算機的主要語言。

更多論文地址源碼地址:關注“圖像算法”微信公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章