本文內(nèi)容來(lái)自微軟美國(guó)總部機(jī)器學(xué)習(xí)科學(xué)家彭河森博士的分享,并由彭河森博士親自整理成文。
正如程序語(yǔ)言一樣,深度學(xué)習(xí)開(kāi)源框架同樣各有優(yōu)劣和適用的場(chǎng)景,那么 AI 從業(yè)者該如何有針對(duì)性地選擇這些平臺(tái)來(lái)玩轉(zhuǎn)深度學(xué)習(xí)?
本期特邀了先后在谷歌、亞馬遜、微軟供職的機(jī)器學(xué)習(xí)科學(xué)家彭河森博士為大家講述《MXNet火了,AI從業(yè)者該如何選擇深度學(xué)習(xí)開(kāi)源框架》。彭河森博士親眼見(jiàn)證并深入?yún)⑴c了這三家巨頭布局深度學(xué)習(xí)的過(guò)程。
嘉賓介紹
彭河森,埃默里大學(xué)統(tǒng)計(jì)學(xué)博士?,F(xiàn)擔(dān)任微軟美國(guó)總部的機(jī)器學(xué)習(xí)科學(xué)家、微軟必應(yīng)廣告部應(yīng)用資深研究員,當(dāng)前主要研究方向是自然語(yǔ)言處理和機(jī)器學(xué)習(xí)在廣告和推薦系統(tǒng)中的應(yīng)用。此外,彭河森博士曾是亞馬遜最年輕的機(jī)器學(xué)習(xí)研究員,之前還供職于谷歌計(jì)量經(jīng)濟(jì)學(xué)部和中科院。
深度學(xué)習(xí)是一個(gè)非常熱門(mén)的領(lǐng)域,現(xiàn)在市面上也有很多非常優(yōu)秀的平臺(tái),相信大家在入行之初都在想,這么多平臺(tái)應(yīng)該怎么選擇?
我先提兩點(diǎn),可能是一般測(cè)評(píng)沒(méi)有考慮到的東西:
一個(gè)是圖像計(jì)算和符號(hào)求導(dǎo),這是深度學(xué)習(xí)一個(gè)非常有意思且非常重要的副產(chǎn)物。
另一個(gè)是深度學(xué)習(xí)框架的可觸碰深度,這點(diǎn)直接關(guān)系到深度學(xué)習(xí)系統(tǒng)的發(fā)展未來(lái)和用戶(hù)的自由度。
這兩點(diǎn)對(duì)于初學(xué)者和從業(yè)人員都非常重要,我在后面詳細(xì)講述。
首先要恭喜 MXNet 近日獲得了亞馬遜的背書(shū),MXNet 平臺(tái)本身非常優(yōu)秀,具有很多優(yōu)良的性質(zhì):例如多節(jié)點(diǎn)模型訓(xùn)練,目前是我知道最全面的多語(yǔ)言支持。此外,也有評(píng)測(cè)說(shuō) MXNet 性能方面可以高出同行平臺(tái)很多,我們將會(huì)在后面的討論中提到。現(xiàn)在進(jìn)入正題,我們?cè)撊绾芜x擇深度學(xué)習(xí)開(kāi)源平臺(tái),參考標(biāo)準(zhǔn)應(yīng)該是什么樣的?
一、深度學(xué)習(xí)開(kāi)源平臺(tái)的 5 大參考標(biāo)準(zhǔn)
今天主要探討的平臺(tái)(或者軟件)包括:Caffe, Torch, MXNet, CNTK, Theano, TensorFlow, Keras。
如何選擇一個(gè)深度學(xué)習(xí)平臺(tái)?我總結(jié)出了下面的這些考量標(biāo)準(zhǔn)。因人而異,因項(xiàng)目而異。可能你是做圖像處理,也可能是自然語(yǔ)言處理,或是數(shù)量金融,根據(jù)你不同的需求,對(duì)平臺(tái)做出的選擇可能會(huì)不同。
標(biāo)準(zhǔn)1:與現(xiàn)有編程平臺(tái)、技能整合的難易程度
無(wú)論是學(xué)術(shù)研究還是工程開(kāi)發(fā),在上馬深度學(xué)習(xí)課題之前一般都已積累不少開(kāi)發(fā)經(jīng)驗(yàn)和資源??赡苣阕钕矚g的編程語(yǔ)言已經(jīng)確立,或者你的數(shù)據(jù)已經(jīng)以一定的形式儲(chǔ)存完畢,或者對(duì)模型的要求(如延遲等)也不一樣。標(biāo)準(zhǔn)1 考量的是深度學(xué)習(xí)平臺(tái)與現(xiàn)有資源整合的難易程度。這里我們將回答下面的問(wèn)題:
是否需要專(zhuān)門(mén)為此學(xué)習(xí)一種新語(yǔ)言?
是否能與當(dāng)前已有的編程語(yǔ)言結(jié)合?
標(biāo)準(zhǔn) 2: 和相關(guān)機(jī)器學(xué)習(xí)、數(shù)據(jù)處理生態(tài)整合的緊密程度
我們做深度學(xué)習(xí)研究最后總離不開(kāi)各種數(shù)據(jù)處理、可視化、統(tǒng)計(jì)推斷等軟件包。這里我們要回答問(wèn)題:
建模之前,是否具有方便的數(shù)據(jù)預(yù)處理工具?當(dāng)然大多平臺(tái)都自身帶了圖像、文本等預(yù)處理工具。
建模之后,是否具有方便的工具進(jìn)行結(jié)果分析,例如可視化、統(tǒng)計(jì)推斷、數(shù)據(jù)分析?
標(biāo)準(zhǔn) 3:通過(guò)此平臺(tái)做深度學(xué)習(xí)之外,還能做什么?
上面我們提到的不少平臺(tái)是專(zhuān)門(mén)為深度學(xué)習(xí)研究和應(yīng)用進(jìn)行開(kāi)發(fā)的,不少平臺(tái)對(duì)分布式計(jì)算、GPU 等構(gòu)架都有強(qiáng)大的優(yōu)化,能否用這些平臺(tái)/軟件做其他事情?
比如有些深度學(xué)習(xí)軟件是可以用來(lái)求解二次型優(yōu)化;有些深度學(xué)習(xí)平臺(tái)很容易被擴(kuò)展,被運(yùn)用在強(qiáng)化學(xué)習(xí)的應(yīng)用中。哪些平臺(tái)具備這樣的特點(diǎn)?
這個(gè)問(wèn)題可以涉及到現(xiàn)今深度學(xué)習(xí)平臺(tái)的一個(gè)方面,就是圖像計(jì)算和自動(dòng)化求導(dǎo)。
標(biāo)準(zhǔn) 4:對(duì)數(shù)據(jù)量、硬件的要求和支持
當(dāng)然,深度學(xué)習(xí)在不同應(yīng)用場(chǎng)景的數(shù)據(jù)量是不一樣的,這也就導(dǎo)致我們可能需要考慮分布式計(jì)算、多 GPU 計(jì)算的問(wèn)題。例如,對(duì)計(jì)算機(jī)圖像處理研究的人員往往需要將圖像文件和計(jì)算任務(wù)分部到多臺(tái)計(jì)算機(jī)節(jié)點(diǎn)上進(jìn)行執(zhí)行。
當(dāng)下每個(gè)深度學(xué)習(xí)平臺(tái)都在快速發(fā)展,每個(gè)平臺(tái)對(duì)分布式計(jì)算等場(chǎng)景的支持也在不斷演進(jìn)。今天提到的部分內(nèi)容可能在幾個(gè)月后就不再適用。
標(biāo)準(zhǔn) 5:深度學(xué)習(xí)平臺(tái)的成熟程度
成熟程度的考量是一個(gè)比較主觀的考量因素,我個(gè)人考量的因素包括:社區(qū)的活躍程度;是否容易和開(kāi)發(fā)人員進(jìn)行交流;當(dāng)前應(yīng)用的勢(shì)頭。
講了 5 個(gè)參考標(biāo)準(zhǔn)后,接下來(lái)我們用上面的這些標(biāo)準(zhǔn)對(duì)各個(gè)深度學(xué)習(xí)平臺(tái)進(jìn)行評(píng)價(jià):
二、深度學(xué)習(xí)平臺(tái)評(píng)價(jià)
評(píng)判1:與現(xiàn)有編程平臺(tái)、技能整合的難易程度
標(biāo)準(zhǔn)1 考量的是深度學(xué)習(xí)平臺(tái)與現(xiàn)有資源整合的難易程度。這里我們將回答下面的問(wèn)題:是否需要專(zhuān)門(mén)為此學(xué)習(xí)一種新語(yǔ)言?是否能與當(dāng)前已有的編程語(yǔ)言結(jié)合?
這一個(gè)問(wèn)題的干貨在下面這個(gè)表格。這里我們按照每個(gè)深度學(xué)習(xí)平臺(tái)的底層語(yǔ)言和用戶(hù)語(yǔ)言進(jìn)行總結(jié),可以得到下表。
其中 Keras 通過(guò) Theano, TensorFlow 作為底層進(jìn)行建模。
我們可以看到這樣的趨勢(shì):
深度學(xué)習(xí)底層語(yǔ)言多是 C++ / C 這樣可以達(dá)到高運(yùn)行效率的語(yǔ)言。
操作語(yǔ)言往往會(huì)切近實(shí)際,我們大致可以斷定 Python 是未來(lái)深度學(xué)習(xí)的操作平臺(tái)語(yǔ)言,微軟在 CNTK 2.0 加入了對(duì) Python 的支持。
當(dāng)然,還有不少平臺(tái)可以通過(guò)腳本的方式配置網(wǎng)絡(luò)并且訓(xùn)練模型。
從格局上來(lái)說(shuō),Python 作為深度學(xué)習(xí)建模的基本語(yǔ)言是可以確定的。如果你最喜歡編程語(yǔ)言是 Python,恭喜您,大多數(shù)平臺(tái)都可以和你的技術(shù)無(wú)縫銜接。如果是 Java 也不用擔(dān)心,不少平臺(tái)也具有 Java 支持,Deeplearning4J 還是一個(gè)原生的 Java 深度學(xué)習(xí)平臺(tái)。
標(biāo)準(zhǔn) 2: 和相關(guān)機(jī)器學(xué)習(xí)、數(shù)據(jù)處理生態(tài)整合的緊密程度
這里我們要提一下現(xiàn)在主要的數(shù)據(jù)處理工具,比較全面的數(shù)據(jù)分析工具包括 R 及其相關(guān)生態(tài),Python 及其相關(guān)生態(tài),小眾一點(diǎn)的還包括 Julia 及其相關(guān)生態(tài)。
完成深度學(xué)習(xí)建模等任務(wù)之后,和生態(tài)的整合也尤為重要。
我們可以發(fā)現(xiàn),上面和 Python, R, 整合較為緊密,這里 Keras 生態(tài)(TensorFlow, Theano), CNTK, MXNet, Caffe 等占有大量?jī)?yōu)勢(shì)。
同時(shí) Caffe 具有大量圖像處理包,對(duì)數(shù)據(jù)觀察也具有非常大的優(yōu)勢(shì)。
標(biāo)準(zhǔn) 3:通過(guò)此平臺(tái)做深度學(xué)習(xí)之外,還能做什么?
下圖是本次公開(kāi)課的核心:
其實(shí)深度學(xué)習(xí)平臺(tái)在創(chuàng)造和設(shè)計(jì)時(shí)的側(cè)重點(diǎn)有所不同,我們按照功能可以將深度學(xué)習(xí)平臺(tái)分為上面六個(gè)方面:
CPU+GPU控制,通信:這一個(gè)最低的層次是深度學(xué)習(xí)計(jì)算的基本層面。
內(nèi)存、變量管理層:這一層包含對(duì)于具體單個(gè)中間變量的定義,如定義向量、矩陣,進(jìn)行內(nèi)存空間分配。
基本運(yùn)算層:這一層主要包含加減乘除、正弦、余弦函數(shù),最大最小值等基本算數(shù)運(yùn)算操作。
基本簡(jiǎn)單函數(shù):
○ 包含各種激發(fā)函數(shù)(activation function),例如 sigmoid, ReLU 等。
○ 同時(shí)也包含求導(dǎo)模塊
神經(jīng)網(wǎng)絡(luò)基本模塊,包括 Dense Layer, Convolution Layer (卷積層), LSTM 等常用模塊。
最后一層是對(duì)所有神經(jīng)網(wǎng)絡(luò)模塊的整合以及優(yōu)化求解。
眾多機(jī)器學(xué)習(xí)平臺(tái)在功能側(cè)重上是不一樣的,我將他們分成了四大類(lèi):
1. 第一類(lèi)是以 Caffe, Torch, MXNet, CNTK 為主的深度學(xué)習(xí)功能性平臺(tái)。這類(lèi)平臺(tái)提供了非常完備的基本模塊,可以讓開(kāi)發(fā)人員快速創(chuàng)建深度神經(jīng)網(wǎng)絡(luò)模型并且開(kāi)始訓(xùn)練,可以解決現(xiàn)今深度學(xué)習(xí)中的大多數(shù)問(wèn)題。但是這些模塊很少將底層運(yùn)算功能直接暴露給用戶(hù)。
2. 第二類(lèi)是以 Keras 為主的深度學(xué)習(xí)抽象化平臺(tái)。Keras 本身并不具有底層運(yùn)算協(xié)調(diào)的能力,Keras 依托于 TensorFlow 或者 Theano 進(jìn)行底層運(yùn)算,而 Keras 自身提供神經(jīng)網(wǎng)絡(luò)模塊抽象化和訓(xùn)練中的流程優(yōu)化。可以讓用戶(hù)享受快速建模的同時(shí),具有很方便的二次開(kāi)發(fā)能力,加入自身喜歡的模塊。
3. 第三類(lèi)是 TensorFlow。TensorFlow 吸取了已有平臺(tái)的長(zhǎng)處,既能讓用戶(hù)觸碰底層數(shù)據(jù),又具有現(xiàn)成的神經(jīng)網(wǎng)絡(luò)模塊,可以讓用戶(hù)非??焖俚膶?shí)現(xiàn)建模。TensorFlow 是非常優(yōu)秀的跨界平臺(tái)。
4. 第四類(lèi)是 Theano, Theano 是深度學(xué)習(xí)界最早的平臺(tái)軟件,專(zhuān)注底層基本的運(yùn)算。
所以對(duì)平臺(tái)選擇可以對(duì)照上圖按照自己的需求選用:
如果任務(wù)目標(biāo)非常確定,只需要短平快出結(jié)果,那么第 1 類(lèi)平臺(tái)會(huì)適合你。
如果您需要進(jìn)行一些底層開(kāi)發(fā),又不想失去現(xiàn)有模塊的方便,那么第 2、3 類(lèi)平臺(tái)會(huì)適合你。
如果你有統(tǒng)計(jì)、計(jì)算數(shù)學(xué)等背景,想利用已有工具進(jìn)行一些計(jì)算性開(kāi)發(fā),那么第 3, 4 類(lèi)會(huì)適合你。
這里我介紹下深度學(xué)習(xí)的一些副產(chǎn)品,其中一個(gè)比較重要的功能就是符號(hào)求導(dǎo)。
圖計(jì)算和符號(hào)求導(dǎo):深度學(xué)習(xí)對(duì)開(kāi)源社區(qū)的巨大貢獻(xiàn)
大家可能會(huì)有疑問(wèn):我能訓(xùn)練出來(lái)深度學(xué)習(xí)模型就蠻好的了,為什么需要接觸底層呢?
這里我先介紹下深度學(xué)習(xí)的一些副產(chǎn)品,其中一個(gè)比較重要的功能就是符號(hào)求導(dǎo)。符號(hào)求導(dǎo)英文是 Symbolic Differentiation,現(xiàn)在有很多有關(guān)的文獻(xiàn)和教程可以使用。
符號(hào)求導(dǎo)是什么意思?
以前我們做機(jī)器學(xué)習(xí)等研究,如果要求導(dǎo)往往需要手動(dòng)把目標(biāo)函數(shù)的導(dǎo)數(shù)求出來(lái)。最近一些深度學(xué)習(xí)工具,如 Theano, 推出了自動(dòng)化符號(hào)求導(dǎo)功能,這大大減少了開(kāi)發(fā)人員的工作量。
當(dāng)然,商業(yè)軟件如 MatLab, Mathematica 在多年前就已具有符號(hào)計(jì)算的功能,但鑒于其商業(yè)軟件的限制,符號(hào)計(jì)算并沒(méi)有在機(jī)器學(xué)習(xí)應(yīng)用中被大量采用。
深度學(xué)習(xí)由于其網(wǎng)絡(luò)的復(fù)雜性,必須采用符號(hào)求導(dǎo)的方法才能解決目標(biāo)函數(shù)過(guò)于復(fù)雜的問(wèn)題。另外一些非深度學(xué)習(xí)問(wèn)題,例如:二次型優(yōu)化等問(wèn)題,也都可以用這些深度學(xué)習(xí)工具來(lái)求解了。
更為優(yōu)秀的是,Theano 符號(hào)求導(dǎo)結(jié)果可以直接通過(guò) C程序編譯,成為底層語(yǔ)言,高效運(yùn)行。
這里我們給一個(gè) Theano 的例子:
》》》 import numpy
》》》 import theano
》》》 import theano.tensor as T
》》》 from theano import pp
》》》 x = T.dscalar(‘x’)
》》》 y = x ** 2
》》》 gy = T.grad(y, x)
》》》 f = theano.function([x], gy)
》》》 f(4)
8
上面我們通過(guò)符號(hào)求導(dǎo)的方法,很容易的求出 y 關(guān)于 x 的導(dǎo)數(shù)在 4 這個(gè)點(diǎn)的數(shù)值。
標(biāo)準(zhǔn) 4:對(duì)數(shù)據(jù)量、硬件的要求和支持
對(duì)于多 GPU 支持和多服務(wù)器支持,我們上面提到的所有平臺(tái)都聲稱(chēng)自己能夠完成任務(wù)。同時(shí)也有大量文獻(xiàn)說(shuō)某個(gè)平臺(tái)的效果更為優(yōu)秀。我們這里把具體平臺(tái)的選擇留給在座各位,提供下面這些信息:
首先想想你想要干什么?,F(xiàn)在深度學(xué)習(xí)應(yīng)用中,需要運(yùn)用到多服務(wù)器訓(xùn)練模型的場(chǎng)景往往只有圖像處理一個(gè),如果是自然語(yǔ)言處理,其工作往往可以在一臺(tái)配置優(yōu)秀的服務(wù)器上面完成。如果數(shù)據(jù)量大,往往可以通過(guò) hadoop 等工具進(jìn)行數(shù)據(jù)預(yù)處理,將其縮小到單機(jī)可以處理的范圍內(nèi)。
本人是比較傳統(tǒng)的人,從小就開(kāi)始自己折騰各種科學(xué)計(jì)算軟件的編譯?,F(xiàn)在主流的文獻(xiàn)看到的結(jié)果是,單機(jī)使用 GPU 能比 CPU 效率提高數(shù)十倍左右。
但是其實(shí)有些問(wèn)題,在 Linux 環(huán)境下,編譯 Numpy 的時(shí)候?qū)⒕€性函數(shù)包換為 Intel MLK 往往也可以得到類(lèi)似的提高。
當(dāng)然現(xiàn)在很多評(píng)測(cè),往往在不同硬件環(huán)境、網(wǎng)絡(luò)配置情況下,都會(huì)得到不一樣的結(jié)果。
就算在亞馬遜云平臺(tái)上面進(jìn)行測(cè)試,也可能因?yàn)榫W(wǎng)絡(luò)環(huán)境、配置等原因,造成完全不同的結(jié)果。所以對(duì)于各種測(cè)評(píng),基于我的經(jīng)驗(yàn),給的建議是:take it with a grain of salt,自己要留個(gè)心眼。前面我們提到的主要工具平臺(tái),現(xiàn)在都對(duì)多 GPU、多節(jié)點(diǎn)模型訓(xùn)練有不同程度的支持,而且現(xiàn)在也都在快速的發(fā)展中,我們建議聽(tīng)眾自己按照需求進(jìn)行鑒別。
標(biāo)準(zhǔn) 5:深度學(xué)習(xí)平臺(tái)的成熟程度
對(duì)于成熟程度的評(píng)判往往會(huì)比較主觀,結(jié)論大多具有爭(zhēng)議。我在這里也只列出數(shù)據(jù),具體如何選擇,大家自己判斷。
這里我們通過(guò) Github 上面幾個(gè)比較受歡迎的數(shù)量來(lái)判斷平臺(tái)的活躍程度。這些數(shù)據(jù)獲取于今天下午(2016-11-25)。我們用黑體標(biāo)出了每個(gè)因子排名前三的平臺(tái):
第一個(gè)因子是貢獻(xiàn)者數(shù)量,貢獻(xiàn)者這里定義非常寬泛,在 Github issues 里面提過(guò)問(wèn)題的都被算作是 Contributor,但是還是能作為一個(gè)平臺(tái)受歡迎程度的度量。我們可以看到 Keras, Theano, TensorFlow 三個(gè)以 Python 為原生平臺(tái)的深度學(xué)習(xí)平臺(tái)是貢獻(xiàn)者最多的平臺(tái)。
第二個(gè)因子是 Pull Request 的數(shù)量,Pull Request 衡量的是一個(gè)平臺(tái)的開(kāi)發(fā)活躍程度。我們可以看到 Caffe 的 Pull Request 最高,這可能得益于它在圖像領(lǐng)域得天獨(dú)厚的優(yōu)勢(shì),另外 Keras 和 Theano 也再次登榜。
另外,這些平臺(tái)在應(yīng)用場(chǎng)景上有側(cè)重:
自然語(yǔ)言處理,當(dāng)然要首推 CNTK,微軟MSR(A) 多年對(duì)自然語(yǔ)言處理的貢獻(xiàn)非常巨大,CNTK 的不少開(kāi)發(fā)者也是分布式計(jì)算牛人,其中所運(yùn)用的方法非常獨(dú)到。
當(dāng)然,對(duì)于非常廣義的應(yīng)用、學(xué)習(xí),Keras/TensorFlow/Theano 生態(tài)可能是您最好的選擇。
對(duì)于計(jì)算機(jī)圖像處理,Caffe 可能是你的不二選擇。
關(guān)于深度學(xué)習(xí)平臺(tái)的未來(lái):
微軟在對(duì) CNTK 很有決心,Python API 加的好,大家可以多多關(guān)注。
有觀點(diǎn)認(rèn)為深度學(xué)習(xí)模型是戰(zhàn)略資產(chǎn),應(yīng)該用國(guó)產(chǎn)軟件,防止壟斷。我認(rèn)為這樣的問(wèn)題不用擔(dān)心,首先 TensorFlow 等軟件是開(kāi)源的,可以通過(guò)代碼審查的方法進(jìn)行質(zhì)量把關(guān)。另外訓(xùn)練的模型可以保存成為 HDF5 格式,跨平臺(tái)分享,所以成為谷歌壟斷的概率非常小。
很有可能在未來(lái)的某一天,大家訓(xùn)練出來(lái)一些非常厲害的卷積層(convolution layer),基本上能非常優(yōu)秀地解決所有計(jì)算機(jī)圖像相關(guān)問(wèn)題,這個(gè)時(shí)候我們只需要調(diào)用這些卷積層即可,不需要大規(guī)模卷積層訓(xùn)練。另外這些卷積層可能會(huì)硬件化,成為我們手機(jī)芯片的一個(gè)小模塊,這樣我們的照片拍好的時(shí)候,就已經(jīng)完成了卷積操作。
評(píng)論
查看更多