閱讀947 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《麵向機器智能的TensorFlow實踐》引言

本節書摘來自華章出版社《麵向機器智能的TensorFlow實踐》一書中的第1章,第節,作者山姆·亞伯拉罕(Sam Abrahams)丹尼亞爾·哈夫納(Danijar Hafner)[美] 埃裏克·厄威特(Erik Erwitt) 阿裏爾·斯卡爾皮內裏(Ariel Scarpinelli),更多章節內容可以訪問雲棲社區“華章計算機”公眾號查看。


引  言2

1.1 無處不在的數據

我們正實實在在地處於“信息時代”。如今,各種數據從無窮無盡的渠道不斷湧入:智能手機、手表、汽車、停車計時表、家用電器。幾乎任何一種能夠說出名字的技術與生俱來都具備與位於雲端的某個數據庫進行通信的能力。在看似無限的存儲能力的支持下,開發者們為數據倉庫選擇了一種“更多即是更好”的方法,存儲著從他們的產品和客戶那裏收集到的以拍字節(PB)為單位計的海量數據。

與此同時,計算機的性能也在持續提升。雖然CPU的發展速度已經放緩,但並行處理架構取得了爆炸式的發展。一向主要服務於計算機遊戲的圖形處理單元(GPU)如今已被大量運用於通用計算領域,並拉開了機器學習迅勐發展的序幕。

機器學習(有時簡記為ML)試圖利用通用的數學模型回答涉及數據的特定問題。機器學習成功應用於垃圾郵件檢測、產品推薦(向客戶)、預測商品的價格等領域已有多年。近年來,一種特殊類型的機器學習範式在幾乎所有領域都取得了無數巨大的成功,它就是深度學習。

1.2 深度學習

“深度學習”已成為用於描述使用多層神經網絡的過程的標準術語,多層神經網絡是一類極為靈活的可利用種類繁多的數學方法以及不同數學方法組合的模型。這類模型極為強大,但直到最近幾年,人們才有能力卓有成效地利用神經網絡,其背後原因主要有兩點,一是獲取足夠數量的數據成為現實;二是得益於通用GPU的快速發展,多層神經網絡擁有了超越其他機器學習方法所必需的計算能力。

深度學習的強大之處在於當決定如何最有效地利用數據時,它能夠賦予模型更大的靈活性。人們無需盲目猜測應當選擇何種輸入。一個調校好的深度學習模型可以接收所有的參數,並自動確定輸入值的有用高階組合。這種能力使得更為複雜的決策過程成為可能,並使計算機比以往任何時候都更加智能。借助深度學習,我們可以製造出具有自動駕駛能力的汽車和能夠理解人類語音的電話。由於深度學習的出現,機器翻譯、人臉識別、預測分析、機器作曲以及無數的人工智能任務都成為可能,或相比以往有了顯著改進。

雖然深度學習背後的數學概念幾十年前便提出,但致力於創建和訓練這些深度模型的編程庫是近年來才出現的。遺憾的是,這些庫中的大多數都會在靈活性和生產價值之間進行取舍。靈活的庫對於研究新的模型架構極有價值,但常常或者運行效率太低,或者無法運用於產品中。另一方麵,雖然出現了可托管在分布式硬件上的快速、高效的庫,但它們往往專注於特定類型的神經網絡,並不適宜研究新的和更好的模型。這就使決策製定者陷於兩難境地:是應當用缺乏靈活性的庫來從事研究,以避免重新實現代碼,還是應當在研究階段和產品開發階段分別使用兩個完全不同的庫?如果選擇前一種方案,可能便無法測試不同類型的神經網絡模型;如果選擇後一種方案,則需要維護可能調用了完全不同的兩套API的代碼。由此甚至會引發另一個問題—我們是否擁有這樣的資源?

解決這個兩難問題正是TensorFlow的設計初衷。

1.3 TensorFlow:一個現代的機器學習庫

TensorFlow由穀歌於2015年11月向公眾正式開源,它是汲取了其前身—DistBelief在創建和使用中多年積累的經驗與教訓的產物。TensorFlow的設計目標是保證靈活性、高效性、良好的可擴展性以及可移植性。任何形式和尺寸的計算機,從智能手機到大型計算集群,都可運行TensorFlow。TensorFlow中包含了可即刻將訓練好的模型產品化的輕量級軟件,有效地消除了重新實現模型的需求。TensorFlow擁抱創新,鼓勵開源的社區參與,但也擁有一家大公司的支持、引導,並保持一定的穩定性。由於其強大的功能,TensorFlow不僅適合個人使用,對於各種規模的公司(無論是初創公司,還是穀歌這樣的大公司)也都非常適合。

如果你和你的同事擁有數據、一個有待求解的問題以及一台可工作的計算機,那麼很幸運,TensorFlow正是你們一直尋找的“武林秘籍”。

1.4 TensorFlow:技術概要

本小節將給出一些關於TensorFlow庫的高層信息,如它是什麼、它的發展史、用例以及與競爭對手的比較。決策製定者、利益相關者以及任何希望了解TensorFlow背景的人都會從本小節受益。

穀歌的深度學習研究簡史

穀歌最初開發的大規模深度學習工具是穀歌大腦(Google Brain)團隊研發的DistBelief。自創建以來,它便被數十個團隊應用於包括深度神經網絡在內的不計其數的項目中。然而,像許多開創性的工程項目一樣,DistBelief也存在一些限製了其易用性和靈活性的設計錯誤。DistBelief完成之後的某個時間,穀歌發起了新的項目,開始研發新一代深度學習工具,其設計準備借鑒最初的DistBelief在使用中總結的教訓和局限性。這個項目後來發展為TensorFlow,並於2015年11月正式向公眾開源,接著迅速成為一個頗受歡迎的機器學習庫,如今已被成功運用於自然語言處理、人工智能、計算機視覺和預測分析等領域。

1.5 何為TensorFlow

下麵以一種高層觀點來介紹TensorFlow,以幫助讀者理解它試圖求解的問題。

1.5.1 解讀來自官網的單句描述

在TensorFlow的官網上,針對訪問者的第一句致辭便是下列(相當含煳的)聲明:

TensorFlow is an Open Source Software Library for Machine Intelligence

這句話的下方,即“About TensorFlow”下的一段還有這樣一句描述:

TensorFlowTM is an open source software library for numerical computation using data flow graphs.

比起前麵的聲明,第二個定義更為具體,但對那些數學或技術背景不強的人而言,這可能並非最全麵的解釋。下麵我們對其進行解構。

1. Open Source(開源)

TensorFlow最初是作為穀歌的內部機器學習工具而創建的,但在2015年11月,它的一個實現被開源,所采用的開源協議是Apache 2.0。作為開源軟件,任何人都可自由下載、修改和使用其代碼。開源工程師可對代碼添加功能和進行改進,並提議在未來版本中打算實施的修改。由於TensorFlow深受廣大開發者歡迎,因此這個庫每天都會得到來自穀歌和第三方開發者的改進。

注意,嚴格來說,我們隻能稱之為“一個實現”,而不能說“TensorFlow” 被開源。從技術角度講,TensorFlow是《TensorFlow白皮書》所描述的一個用於數值計算的內部接口,其內部實現仍然由穀歌維護。然而,開源實現與穀歌的內部實現之間的差異是由與其他內部軟件的連接造成的,並非穀歌有意“將好東西藏著掖著”。穀歌始終都在不斷將內部改進推送到公共代碼庫。總之,TensorFlow的開源版本包含了與穀歌的內部版本完全相同的功能。

在本書後續內容中,當提到“TensorFlow”時,筆者實際上指的是其開源實現。

2. Library for Numerical Computation(數值計算庫)

官網的定義中並未將TensorFlow稱為一個“機器學習庫”,而是使用了更寬泛的短語“數值計算”。雖然TensorFlow中的確包含一個模仿了具有單行建模功能的機器學習庫Scikit-Learn的名為“learn”(也稱“Scikit Flow”)的包,但需要注意的是,TensorFlow的主要目標並非是提供現成的機器學習解決方案。相反,TensorFlow提供了一個可使用戶用數學方法從零開始定義模型的函數和類的廣泛套件。這使得具有一定技術背景的用戶可迅速而直觀地創建自定義的、具有較高靈活性的模型。此外,雖然TensorFlow為麵向機器學習的功能提供了廣泛支持,但它也非常適合做複雜的數學計算。然而,由於本書重點討論機器學習(尤其是深度學習),因此下麵主要講述如何利用TensorFlow創建“機器學習模型”。

3. Data Flow Graphs(數據流圖)

TensorFlow的計算模型是有向圖(directed graph),其中每個節點(通常以圓圈或方框表示)代表了一些函數或計算,而邊(通常以箭頭或線段表示)代表了數值、矩陣或張量。

數據流圖極為有用的原因如下。首先,許多常見的機器學習模型,如神經網絡,本身就是以有向圖的形式表示的,采用數據流圖無疑將使機器學習實踐者的實現更為自然。其次,通過將計算分解為一些小的、容易微分的環節,TensorFlow能夠自動計算任意節點關於其他對第一個節點的輸出產生影響的任意節點的導數(在TensorFlow中稱為“Operation”)。計算任何節點(尤其是輸出節點)的導數或梯度的能力對於搭建機器學習模型至關重要。最後,通過計算的分解,將計算分布在多個CPU、GPU以及其他計算設備上更加容易,即隻需將完整的、較大的數據流圖分解為一些較小的計算圖,並讓每台計算設備負責一個獨立的計算子圖(此外,還需一定的邏輯對不同設備間的共享信息進行調度)。

 

補充:何為張量?

簡而言之,張量是一個n維矩陣。因此,2階張量等價於標準矩陣。從可視化的角度,若將m×m的矩陣視為方形數組(m個數字高,m個數字寬),則可將m×m×m的張量視為立方數組(m個數字高,m個數字寬,m個數字深)。一般而言,如果讀者更熟悉矩陣數學,完全可以按矩陣的方式來看待張量。

1.5.2 單句描述未體現的內容

雖然短語“open source software library for numerical computation using data flow graphs”的信息密度非常大,但並未涵蓋那些真正使TensorFlow作為機器學習庫脫穎而出的重要方麵。下麵列出一些成就TensorFlow的重要組成。

1.分布式功能

上文在介紹數據流圖時間接提到,TensorFlow的設計目標之一是在多台計算機以及單機多CPU、單機多GPU環境中具有良好的可伸縮性。雖然,最初的開源實現在發布時並不具備分布式功能,但自0.8.0版本起,分布式運行時已成為TensorFlow內置庫的一部分。雖然這個最初版本的分布式API有些臃腫,但它極其強大。大多數其他機器學習庫尚不具備這樣的功能,尤其值得注意的是,TensorFlow與特定集群管理器(如Kubernetes)的本地兼容性正在得到改善。

2.軟件套件

雖然“TensorFlow”主要是指用於構建和訓練機器學習模型的API,但TensorFlow實際上是一組需配合使用的軟件:

TensorFlow是用於定義機器學習模型、用數據訓練模型,並將模型導出供後續使用的API。雖然實際的計算是用C++編寫的,但主要的API均可通過Python訪問。這使得數據科學家和工程師可利用Python中對用戶更為友好的環境,而將實際計算交給高效的、經過編譯的C++代碼。TensorFlow雖然也提供了一套可執行TensorFlow模型的C++ API,但在本書編寫之時它還具有較大的局限性,因此對大多數用戶都是不推薦的。

TensorBoard是一個包含在任意標準TensorFlow安裝中的圖可視化軟件。當用戶在TensorFlow中引入某些TensorBoard的特定運算時,TensorBoard可讀取由TensorFlow計算圖導出的文件,並對分析模型的行為提供有價值的參考。它對概括統計量、分析訓練過程以及調試TensorFlow代碼都極有幫助。學會盡早並盡可能多地使用TensorBoard會為使用TensorFlow工作增添趣味性,並帶來更高的生產效率。

TensorFlow Serving是一個可為部署預訓練的TensorFlow模型帶來便利的軟件。利用內置的TensorFlow函數,用戶可將自己的模型導出到可由TensorFlow Serving在本地讀取的文件中。之後,它會啟動一個簡單的高性能服務器。該服務器可接收輸入數據,並將之送入預訓練的模型,然後將模型的輸出結果返回。此外,TensorFlow Serving還可以在舊模型和新模型之間無縫切換,而不會給最終用戶帶來任何停機時間。雖然Serving可能是TensorFlow生態係統中認可度最低的組成,它卻可能是使TensorFlow有別於其他競爭者的重要因素。將Serving納入生產環境可避免用戶重新實現自己的模型—他們隻需使用TensorFlow導出的文件。TensorFlow Serving完全是用C++編寫的,其API也隻能通過C++訪問。

筆者相信,隻有深入了解上述所有軟件之間的聯係,並熟練掌握它們的聯合使用方法,方可真正使TensorFlow物盡其用。因此,本書會涵蓋上述三個軟件的用法。

1.6 何時使用TensorFlow

下麵介紹一些TensorFlow的用例。一般而言,對於大多數機器學習任務,TensorFlow都是一個很好的選擇。下麵簡單列出了TensorFlow尤其適合的一些場合。

研究、開發和迭代新的機器學習架構。由於TensorFlow極為靈活,因此在構建新穎的、測試較少的模型時非常有用。而使用某些庫時,用戶隻能獲取對實現原型有幫助的具有較強剛性的預建模型,而無法對其進行修改。

將模型從訓練直接切換到部署。如前所述,TensorFlow Serving使用戶可實現訓練到部署的快速切換。因此,在創建依賴於機器學習模型的產品時,使用TensorFlow便可實現快速迭代。如果你的團隊需要保持較快的開發進度,或者你隻是沒有用C++、Java等語言重新實現某個模型的資源,TensorFlow可賦予你的團隊快速實現產品的能力。

實現已有的複雜架構。一旦用戶掌握了如何閱讀可視化的計算圖,並使用TensorFlow來進行構建,他們便有能力用TensorFlow實現最新的研究文獻中所描述的模型。在構建未來的模型,或甚至在對用戶的當前模型進行嚴謹的改進時,這種能力可提供非常有價值的見解。

大規模分布式模型。在麵對多種設備時,TensorFlow表現出卓越的向上可擴展性。它已經開始在穀歌內部的各個項目中逐步取代DistBelief。隨著最近分布式運行時的發布,我們將看到越來越多的將TensorFlow運行於多台硬件服務器和雲端虛擬機的用例。

為移動/嵌入式係統創建和訓練模型。雖然TensorFlow主要關注向上的擴展(scaling up),對於向下的擴展(scaling down),它同樣有優異的表現。TensorFlow的靈活性之一體現在它可輕鬆擴展到計算性能不高的係統中。例如,它可在安卓設備以及像樹莓派(Raspberry Pi)這樣的微型計算機中運行。TensorFlow代碼庫中包含了一個在安卓係統中運行預訓練模型的例程。

1.7 TensorFlow的優勢

1.易用性

相對而言,TensorFlow工作流易於理解。它的API保持著高度的一致性,這意味著在嚐試不同模型時,無需從頭學習一套新的東西。

TensorFlow API很穩定,維護者始終在努力確保每次改動都向下兼容。

TensorFlow與NumPy無縫集成,可使大多數了解Python的數據科學家如魚得水。

不同於其他庫,TensorFlow不占編譯時間。這就使用戶可快速驗證自己的想法,而省去了專門的等待時間。

目前已有多種高層接口構建在TensorFlow之上,如Keras和SkFlow。這就使得即便用戶不希望動手實現整個模型,也可以利用TensorFlow的優勢。

2.靈活性

TensorFlow能夠運行在不同類型和尺寸的機器之上。這使得TensorFlow無論是在超級計算機上,還是在嵌入式係統,或任何其他介於兩者之間的計算機上都有用武之地。

TensorFlow的分布式架構使得在大規模數據集上的模型訓練可在合理的時間內完成。

TensorFlow可利用CPU、GPU,或同時使用這兩者。

3.高效性

當TensorFlow的第一個版本發布時,它在很多流行的機器學習基準測試中都非常低效。從那時起,TensorFlow的開發團隊便投入大量的時間和精力對TensorFlow代碼的大部分實現進行改進。如今,TensorFlow中大部分庫的性能已有了顯著提升,已成為眾多開源機器學習框架中居於榜首位置的有力競爭者。

TensorFlow的效率仍在持續地得到改進,因為有越來越多的開發者正在共同努力帶來更好的實現。

4.幕後支持

TensorFlow為穀歌所支持。穀歌已為其投入巨大的資源,因為它希望TensorFlow成為機器學習研究者和開發者的通用語言。此外,穀歌也在利用TensorFlow完成其日常工作,並且通過投資來為TensorFlow提供持續不斷的支持。

圍繞TensorFlow已經形成了一個不可思議的社區,從社區中的知名成員或GitHub上的知名開發者那裏得到回應相對比較容易。

穀歌已經發布了若幹用TensorFlow預訓練的機器學習模型。它們可供免費使用,使得無需大量數據的流水線便可迅速實現原型係統。

5.額外特性

當需要對模型進行調試和可視化時,TensorBoard便體現出極為重要的價值,而在其他機器學習庫中,並無類似的功能。

TensorFlow Serving可能是會使得更多的初創公司將服務和資源投入到機器學習領域的軟件,因為重新實現代碼來部署某個模型所需付出的代價絕對不可小覷。

1.8 使用TensorFlow所麵臨的挑戰

1.分布式支持尚不成熟

雖然分布式運行時已正式發布,但在TensorFlow中使用這種特性卻並非想象中那樣容易。在本書寫作之時,為使用該特性,需手工定義每台設備的角色,這種工作既乏味又容易出錯。由於它是一種全新的特性,因此可供學習的例程較少,想必未來的版本應當會有所改進。如前文所述,對Kubernetes的支持已進入開發流水線,但到目前為止,它仍然尚未完成。

2.實現定製代碼的技巧性較強

雖然關於如何用TensorFlow創建用戶自己的運算有一份官方指南可供參考,但要將定製的代碼實現到TensorFlow中仍然頗費周折。然而,如果希望對主代碼庫做出貢獻,穀歌開發團隊會快速回答你的問題,並查看你所提交的代碼,以便為吸納你的工作成果進行準備。

3.某些特性仍然缺失

如果你是一名經驗豐富的機器學習專家,並對其他框架具備深入的了解,你可能會發現一些自己喜歡的雖小但十分有用的特性尚未在TensorFlow中實現。通常,你想要的這種特性在TensorFlow中會有一些替代方案,但這可能無法阻止你的抱怨“為什麼它還未得到本地支持?”

1.9 高歌勐進

無需多言,筆者對TensorFlow的未來充滿期待,而且筆者對幫助你開始使用這樣一款強大工具感到激動萬分。下一章將介紹如何安裝TensorFlow,並對TensorFlow的核心庫、基本使用模式以及環境進行全麵講解。

最後更新:2017-05-19 15:32:29

  上一篇:go  《Spark 官方文檔》Spark SQL, DataFrames 以及 Datasets 編程指南(一)
  下一篇:go  《Maven官方文檔》什麼是原型(Archrtype)?