隨著人工智能的發展,現代科技公司的終極目標是構建無需人類介入、能夠自我思考的 AI 軟件。
亞馬遜首席技術官 Werner Vogels 在周二的一篇博客文章中表示,亞馬遜網絡服務公司(AWS)剛剛選擇 MXNet 作為其最主要的深度學習框架。
《財富》今年 9 月的一篇深度長文回溯了深度學習推動的人工智能在整個計算生態系統引發的革命,如文章所述,深度學習是 AI 的一個子集,包含神經網絡的使用。神經網絡在算法(而非人類程序員)的幫助下通過處理大量數據來學習并解決問題。
Vogels 表示,AWS 將為 MXNet 及支持其生態系統的其他公司提供軟件代碼、文檔和開發資金。雖然他同時表明,該公司也支持其他深度學習框架,包括 Caffe、CNTK、TensorFlow 和 Torch,但顯然在 MXNet 加入后,其他這些框架會被放到次要位置。
TensorFlow 和 CNTK 框架分別是谷歌和微軟開發的,Caffe 則來自加州大學伯克利分校的伯克利人工智能研究實驗室。
MXNet 的消息恰在亞馬遜云服務的年度 AWS RE:Invent 大會前一周發布,亞馬遜的高管將在大會上討論人工智能帶來的機會,以及他們將亞馬遜的個人助理 Alexa 的工具開放給 AWS 開發者的計劃。
為了實現 AI 的終極目標,亞馬遜及其競爭對手也在追求盡可能大的數據集。
所以,如果你想知道亞馬遜、微軟、蘋果以及谷歌公司分別從 Alexa、Cortana、Siri 和 Google Home 中得到了什么,記住這一點:所有使用這些智能設備和應用的人都在向這些公司提供非常有價值的數據,應用于這些面向未來的項目。
MXNet 設計和實現簡介
神經網絡本質上是一種語言,我們通過它來表達對應用問題的理解。例如我們用卷積層來表達空間相關性,RNN來表達時間連續性。根據問題的復雜性和信息如何從輸入到輸出一步步提取,我們將不同大小的層按一定原則連接起來。近年來隨著數據的激增和計算能力的大幅提升,神經網絡也變得越來越深和大。例如最近幾次imagnet競賽的冠軍都使用有數十至百層的網絡。對于這一類神經網絡我們通常稱之為深度學習。從應用的角度而言,對深度學習最重要的是如何方便地表述神經網絡,以及如何快速訓練得到模型。
對于一個優秀的深度學習系統,或者更廣來說優秀的科學計算系統,最重要的是編程接口的設計。他們都采用將一個領域特定語言(domain specific language)嵌入到一個主語言中。例如numpy將矩陣運算嵌入到python中。這類嵌入一般分為兩種,其中一種嵌入的較淺,其中每個語句都按原來的意思執行,且通常采用命令式編程(imperative programming),其中numpy和Torch就是屬于這種。而另一種則用一種深的嵌入方式,提供一整套針對具體應用的迷你語言。這一種通常使用聲明式語言(declarative programming),既用戶只需要聲明要做什么,而具體執行則由系統完成。這類系統包括Caffe,theano和剛公布的TensorFlow。
這兩種方式各有利弊,總結如下:
命令式編程:
如何執行 a=b+1: 需要b已經被賦值。立即執行加法,將結果保存在a中。
優點: 語義上容易理解,靈活,可以精確控制行為。通??梢詿o縫地和主語言交互,方便地利用主語言的各類算法,工具包,debug和性能調試器。
缺點: 實現統一的輔助函數和提供整體優化都很困難。
聲明式編程:
如何執行 a=b+1: 返回對應的計算圖(computation graph),我們可以之后對b進行賦值,然后再執行加法運算
優點:在真正開始計算的時候已經拿到了整個計算圖,所以我們可以做一系列優化來提升性能。實現輔助函數也容易,例如對任何計算圖都提供forward和backward函數,對計算圖進行可視化,將圖保存到硬盤和從硬盤讀取。
缺點:很多主語言的特性都用不上。某些在主語言中實現簡單,但在這里卻經常麻煩,例如if-else語句 。debug也不容易,例如監視一個復雜的計算圖中的某個節點的中間結果并不簡單。
幾種主要深度學習框架的比較
目前現有的系統大部分都采用上兩種編程模式的一種。與它們不同的是,MXNet 嘗試將兩種模式無縫的結合起來。在命令式編程上 MXNet 提供張量運算,而聲明式編程中 MXNet 支持符號表達式。用戶可以自由的混合它們來快速實現自己的想法。例如我們可以用聲明式編程來描述神經網絡,并利用系統提供的自動求導來訓練模型。另一方便,模型的迭代訓練和更新模型法則中可能涉及大量的控制邏輯,因此我們可以用命令式編程來實現。同時我們用它來進行方便地調式和與主語言交互數據。
五個主要 Python 深度學習庫的比較
Theano 是一個專用于高效計算的低級庫。如果你需要細粒度的定制和靈活性,可以直接使用這個庫。
TensorFlow是另一個低級庫,比 Theano 還要不成熟。但它是 Google 支持的庫,并提供了開箱即用的分布式計算。
Lasagne是 Theano 中的一個輕量級庫。如果你想要 Theano 的靈活性,但不想總是從頭開始編寫神經網絡的層,可以選擇 Lasagne。
Keras 是基于 Theano 或 TensorFlow 高層神經網絡庫。它具有極簡化、模塊化的優點,而且在實驗中非??焖?。這是深度學習的最受歡迎的庫,也是初學者的最佳入門庫。
MXNet是另一個類似 Keras 的高級庫。它提供了多種語言的綁定,并且支持分布式計算。
導師(Mentor):Theano
我們授予 Theano “導師”稱號,因為它讓引導我們認識并喜歡上其他的深度學習庫。
例如,Lasagne 和 Keras 都是基于 Theano 的。就其核心來說,Theano 是為使用多維數組進行數學計算的庫,它的速度非常快,并且使用 GPU 進行優化(比 CPU 快 140倍)。換句話說,它是神經網絡的“構建塊”。
根據我們的經驗,很少有人會直接寫 Theano 代碼。通常需要使用更高級的包裝器(wrapper),除非你需要的是低級的定制。
例如,下面是一個用 Theano 寫的邏輯激活函數
后起之秀:TensorFlow
TensorFlow 是“后起之秀”,而且它很受歡迎。
TensorFlow 是 Google 自己的 AI 團隊開發的,而且最近開源了。TensorFlow 允許使用數據流圖進行高效的數值計算。它從 Theano 的經驗中學習了很多,因此被稱作是全新的 Theano 2.0 版本。Google 的強力支持也使得它格外有前景。
即便如此,Theano 在很多方面仍然比 TensorFlow 快,而且支持更多樣的操作。
但是,TensorFlow 最大的優勢是它支持開箱即用的分布式計算,這使得在多 GPU 上訓練深度神經網絡更簡單。
輕量:Lasagne
Lasagne 是 Theano 的一個輕量級包裝器。Lasagne 允許使用 Theano 的優化計算來構建并訓練神經網絡。而輕量級是指,在 Lasagne 中,你仍然需要獲取相當的低級,并且聲明網絡的每個層。在 Theano 之外,它只提供模塊化的構建塊。
結果是你的代碼會變得十分冗長,但你可以用 NN 結構而非多維數組進行編程。
Lasagne 可以視為 Theano 的靈活性 和 Keras 的簡單性之間的折衷選擇。
半機械人(Cyborg):Keras
在所有 Python 深度學習庫中,Keras 是最受歡迎的。原因有三:
首先,Keras 是一個允許在后端使用 Theano 或 TensorFlow 的包裝器。這意味著開發者可以根據自己的應用程序輕松在兩個庫之間切換,。
第二,它有很漂亮的指導原則:模塊性、極簡主義、易擴展性,以及與 Python 協作。這使得 Keras 的實際使用非常簡單愉快。
最后,Keras 擁有常見的網絡結構的開箱即用的實現。它能快速、輕易地運行卷積神經網絡。
下面是一個超快的序列模型的例子:
看起來很容易,是吧?如果想快速實現,Keras 是十分理想的庫。但它最大的缺點是不支持并行訓練的多 GPU 環境。
多語通(Polyglot):MXNet
MXNet 同 Keras 一樣是高級庫,但它的優勢在另外的方面。
一方面,使用 MXNet 構建網絡比用 Keras 需要花更多功夫。由于教程少,學習的難度更大。
但是,MXNet 支持超過 7 種不同的語言的優勢彌補了這一點,這些語言包括 C++、Python、R、Javascrip,甚至 Matlab。
MXNet 是真正的多語通,對使用不同的語言共享模型的團隊工作來說,它是不二之選。
MXNet 的另一個明顯的優勢是支持分布式計算。這意味著如果你需要在多個 CPU 或 GPU 上訓練模型以提高速度,MXNet 是很好的選擇。