中國(guó)移動(dòng)研究院常耀斌:主流人工智能技術(shù)棧的深度探討和實(shí)踐總結(jié)
導(dǎo)語(yǔ):這幾年人工智能技術(shù)之所以能夠獲得快速發(fā)展,主要是有三個(gè)元素的融合:神經(jīng)元網(wǎng)絡(luò)、芯片以及大數(shù)據(jù)。人工智能是讓機(jī)器像人一樣思考甚至超越人類,而機(jī)器學(xué)習(xí)是實(shí)現(xiàn)人工智能的一種方法,它最基本的做法是使用算法來(lái)解析數(shù)據(jù)、從中學(xué)習(xí),然后對(duì)真實(shí)世界中的事件做出決策和預(yù)測(cè)。深度學(xué)習(xí)又是機(jī)器學(xué)習(xí)的一種實(shí)現(xiàn)方式,它是模擬人神經(jīng)網(wǎng)絡(luò)的方式,用更多的層數(shù)和神經(jīng)元,給系統(tǒng)輸入海量的數(shù)據(jù)來(lái)訓(xùn)練網(wǎng)絡(luò)。下面我以人工智能在醫(yī)療領(lǐng)域的平臺(tái)架構(gòu)為例,進(jìn)行五層模型技術(shù)棧的講解,分別是基礎(chǔ)數(shù)據(jù)層,計(jì)算引擎層,分析引擎層,應(yīng)用引擎層和典型應(yīng)用層,重點(diǎn)講解計(jì)算和分析引擎。
01
首先,探討一下人工智能平臺(tái)的計(jì)算引擎,目前最主流的五個(gè)大數(shù)據(jù)分布式計(jì)算框架包括Hadoop,Spark,F(xiàn)link,Storm,Samaza。下面分別探討其優(yōu)勢(shì)和應(yīng)用場(chǎng)景。
1. Hadoop是***被商用的框架,在工業(yè)和產(chǎn)品界被廣泛認(rèn)可。如果數(shù)據(jù)可以批量處理,可以被分割成小的處理任務(wù),分發(fā)到計(jì)算集群,然后綜合計(jì)算結(jié)果,并且整個(gè)過(guò)程都是邏輯清晰,那么這個(gè)場(chǎng)景下很適合用Hadoop處理。
2. Spark是采用更先進(jìn)的架構(gòu),其靈活性、易用性、性能等方面都比Hadoop更有優(yōu)勢(shì),有取代Hadoop的趨勢(shì),但其穩(wěn)定性需要大幅提高。
3. Flink既是批處理又是實(shí)時(shí)處理框架,但流處理還是放在***位的,F(xiàn)link提供了一系列API,包括針對(duì)Java和Scala的流API,針對(duì)Java,Scala,Python的靜態(tài)數(shù)據(jù)API,以及在Java和Scala中嵌入SQL查詢的代碼。它也自帶機(jī)器學(xué)習(xí)和圖像處理包。
4. Storm是占領(lǐng)一定市場(chǎng)份額的分布式計(jì)算框架,其應(yīng)用被設(shè)計(jì)成有向無(wú)環(huán)圖。被設(shè)計(jì)成容易處理***流,并且可用于任何編程語(yǔ)言。每個(gè)節(jié)點(diǎn)每秒處理上百萬(wàn)個(gè)元組,高度可伸縮,提供任務(wù)處理保證。用Clojure寫的。可用于實(shí)時(shí)分析,分布式機(jī)器學(xué)習(xí),以及大量別的情形,特別是數(shù)據(jù)流大的。Storm可以運(yùn)行在YARN上,集成到Hadoop生態(tài)系統(tǒng)中。
5. Samza是由LinkedIn開(kāi)源的一個(gè)分布式流處理框架,它是基于Kafka消息隊(duì)列來(lái)實(shí)現(xiàn)類實(shí)時(shí)的流式數(shù)據(jù)處理的,非常像Twitter的流處理系統(tǒng)Storm。不同的是Samza基于Hadoop,而且使用了LinkedIn的Kafka分布式消息系統(tǒng),并使用資源管理器Apache Hadoop YARN實(shí)現(xiàn)容錯(cuò)處理、處理器隔離、安全性和資源管理。
02
Spark是專為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的快速通用的計(jì)算引擎,目前已經(jīng)發(fā)行了2.4版本。Spark是UC Berkeley AMP lab所開(kāi)源的類Hadoop MapReduce的通用并行框架,幾乎擁有Hadoop MapReduce所具有的優(yōu)點(diǎn),借助內(nèi)存分布數(shù)據(jù)集,除了能夠提供交互式查詢外,還可以優(yōu)化迭代工作負(fù)載。Spark今年發(fā)布的2.4,除了持續(xù)提升Spark的穩(wěn)定性、易用性和性能之外,還擴(kuò)展了Spark的生態(tài)圈,引入了Spark on K8s, 讓用戶多了一種部署Spark的方式,還引入了Pandas UDF,可以讓用戶在Spark上直接運(yùn)行Pandas函數(shù)。我們分析其內(nèi)核運(yùn)行架構(gòu)如下:
1. SparkContext引擎構(gòu)建分析:
通常而言,用戶開(kāi)發(fā)的Spark應(yīng)用程序的提交與執(zhí)行都離不開(kāi)SparkContex的支持。在正式提交應(yīng)用程序之前,首先需要初始化SparkContext。SparkContext隱藏了網(wǎng)絡(luò)通信、分布式部署、消息通信、存儲(chǔ)體系、計(jì)算引擎、度量系統(tǒng)、文件服務(wù)、Web UI等內(nèi)容,應(yīng)用程序開(kāi)發(fā)者只需要使用SparkContext提供的API完成功能開(kāi)發(fā)。
2. SparkEnv環(huán)境構(gòu)建分析:
Spark執(zhí)行環(huán)境SparkEnv是Spark中的Task運(yùn)行所必需的組件。SparkEnv內(nèi)部封裝了RPC環(huán)境(RpcEnv)、序列化管理器、廣播管理器(BroadcastManager)、map任務(wù)輸出跟蹤器(MapOutputTracker)、存儲(chǔ)體系、度量系統(tǒng)(MetricsSystem)、輸出提交協(xié)調(diào)器(OutputCommitCoordinator)等Task運(yùn)行所需的各種組件。
3. 可交換的存儲(chǔ)體系分析:
Spark優(yōu)先考慮使用各節(jié)點(diǎn)的內(nèi)存作為存儲(chǔ),當(dāng)內(nèi)存不足時(shí)才會(huì)考慮使用磁盤,這極大地減少了磁盤I/O,提升了任務(wù)執(zhí)行的效率,使得Spark適用于實(shí)時(shí)計(jì)算、迭代計(jì)算、流式計(jì)算等場(chǎng)景。在實(shí)際場(chǎng)景中,有些Task是存儲(chǔ)密集型的,有些則是計(jì)算密集型的,所以有時(shí)候會(huì)造成存儲(chǔ)空間很空閑,而計(jì)算空間的資源又很緊張。Spark的內(nèi)存存儲(chǔ)空間與執(zhí)行存儲(chǔ)空間之間的邊界可以是“軟”邊界,因此資源緊張的一方可以借用另一方的空間,這既可以有效利用資源,又可以提高Task的執(zhí)行效率。此外,Spark的內(nèi)存空間還提供了Tungsten的實(shí)現(xiàn),直接操作操作系統(tǒng)的內(nèi)存。由于Tungsten省去了在堆內(nèi)分配Java對(duì)象,因此能更加有效地利用系統(tǒng)的內(nèi)存資源,并且因?yàn)橹苯硬僮飨到y(tǒng)內(nèi)存,空間的分配和釋放也更迅速。
4. 雙級(jí)調(diào)度系統(tǒng)分析:
調(diào)度系統(tǒng)主要由DAGScheduler和TaskScheduler組成,它們都內(nèi)置在SparkContext中。DAGScheduler負(fù)責(zé)創(chuàng)建Job、將DAG中的RDD劃分到不同的Stage、給Stage創(chuàng)建對(duì)應(yīng)的Task、批量提交Task等功能。TaskScheduler負(fù)責(zé)按照FIFO或者FAIR等調(diào)度算法對(duì)批量Task進(jìn)行調(diào)度;為Task分配資源;將Task發(fā)送到集群管理器的當(dāng)前應(yīng)用的Executor上,由Executor負(fù)責(zé)執(zhí)行等工作。即使現(xiàn)在Spark增加了SparkSession和DataFrame等新的API,但這些新API的底層實(shí)際依然依賴于SparkContext。
5. 多維計(jì)算引擎分析:
計(jì)算引擎由內(nèi)存管理器(MemoryManager)、Tungsten、任務(wù)內(nèi)存管理器(TaskMemory-Manager)、Task、外部排序器(ExternalSorter)、Shuffle管理器(ShuffleManager)等組成。MemoryManager除了對(duì)存儲(chǔ)體系中的存儲(chǔ)內(nèi)存提供支持和管理外,還為計(jì)算引擎中的執(zhí)行內(nèi)存提供支持和管理。Tungsten除用于存儲(chǔ)外,也可以用于計(jì)算或執(zhí)行。TaskMemoryManager對(duì)分配給單個(gè)Task的內(nèi)存資源進(jìn)行更細(xì)粒度的管理和控制。ExternalSorter用于在map端或reduce端對(duì)ShuffleMapTask計(jì)算得到的中間結(jié)果進(jìn)行排序、聚合等操作。ShuffleManager用于將各個(gè)分區(qū)對(duì)應(yīng)的ShuffleMapTask產(chǎn)生的中間結(jié)果持久化到磁盤,并在reduce端按照分區(qū)遠(yuǎn)程拉取ShuffleMapTask產(chǎn)生的中間結(jié)果。
6. 強(qiáng)大的SparkMLlib機(jī)器學(xué)習(xí)庫(kù):
旨在簡(jiǎn)化機(jī)器學(xué)習(xí)的工程實(shí)踐工作,并方便擴(kuò)展到更大規(guī)模。MLlib由一些通用的學(xué)習(xí)算法和工具組成,包括分類、回歸、聚類、協(xié)同過(guò)濾、降維等,同時(shí)還包括底層的優(yōu)化原語(yǔ)和高層的管道API。
然后,分析一下人工智能平臺(tái)分析引擎的處理過(guò)程。分析引擎的主要技術(shù)是機(jī)器學(xué)習(xí)和深度學(xué)習(xí)。機(jī)器學(xué)習(xí)框架涵蓋用于分類,回歸,聚類,異常檢測(cè)和數(shù)據(jù)準(zhǔn)備的各種學(xué)習(xí)方法,也可以包括神經(jīng)網(wǎng)絡(luò)方法。深度學(xué)習(xí)框架涵蓋具有許多隱藏層的各種神經(jīng)網(wǎng)絡(luò)拓?fù)?,包括模式識(shí)別的多步驟過(guò)程。網(wǎng)絡(luò)中的層越多,可以提取用于聚類和分類的特征越復(fù)雜。常見(jiàn)的深度學(xué)習(xí)框架有Caffe,CNTK,DeepLearning4j,Keras,MXNet和TensorFlow。其中Deeplearning4j是應(yīng)用最廣泛的JVM開(kāi)源深度學(xué)習(xí)工具,面向Java、Scala和Clojure用戶群。它旨在將深度學(xué)習(xí)引入生產(chǎn)棧,與Hadoop與Spark等主流大數(shù)據(jù)框架緊密集成。DL4J能處理圖像、文本、時(shí)間序列和聲音等所有主要數(shù)據(jù)類型,提供的算法包括卷積網(wǎng)絡(luò)、LSTM等循環(huán)網(wǎng)絡(luò)、Word2Vec和Doc2Vec等NLP工具以及各類自動(dòng)編碼器。Deeplearning4j自帶內(nèi)置Spark集成,用于處理在集群上開(kāi)展的分布式神經(jīng)網(wǎng)絡(luò)訓(xùn)練,采用數(shù)據(jù)并行來(lái)將網(wǎng)絡(luò)訓(xùn)練向外擴(kuò)展至多臺(tái)計(jì)算機(jī),每個(gè)節(jié)點(diǎn)靠一個(gè)(或四個(gè))GPU運(yùn)行。
03
深度學(xué)習(xí)框架的計(jì)算需要大量的圖像數(shù)據(jù),數(shù)據(jù)從前端傳輸?shù)胶蠖诉M(jìn)行預(yù)處理,然后進(jìn)行標(biāo)注,獲得訓(xùn)練數(shù)據(jù)集。數(shù)據(jù)整理好之后,進(jìn)行模型訓(xùn)練,這是一個(gè)計(jì)算和通信非常密集的過(guò)程;模型訓(xùn)練完之后,我們進(jìn)行推理預(yù)測(cè),其主要是一個(gè)前向計(jì)算過(guò)程。其需要對(duì)批量樣本的高吞吐高并發(fā)響應(yīng)和單個(gè)樣本的低延時(shí)響應(yīng)。下面以圖像識(shí)別的過(guò)程為例說(shuō)明如下:
1. 數(shù)據(jù)的采集和獲?。?/strong>
是通過(guò)物聯(lián)網(wǎng)傳感器,將光或聲音等信息轉(zhuǎn)化為電信息。信息可以是二維的圖象如文字、圖象等,可以是一維的波形如聲波、心電圖、腦電圖,也可以是物理量與邏輯值。
2. 數(shù)據(jù)預(yù)處理:
包括A\D、二值化、圖象的平滑、變換、增強(qiáng)、恢復(fù)、濾波等, 主要指圖象處理。
3. 特征抽取和選擇:
在模式識(shí)別中,需要進(jìn)行特征的抽取和選擇,例如,一幅64x64的圖象可以得到4096個(gè)數(shù)據(jù),這種在測(cè)量空間的原始數(shù)據(jù)通過(guò)變換獲得在特征空間最能反映分類本質(zhì)的特征。這就是特征提取和選擇的過(guò)程。
4. 分類器設(shè)計(jì):
分類器設(shè)計(jì)的主要功能是通過(guò)訓(xùn)練確定判決規(guī)則,使按此類判決規(guī)則分類時(shí),錯(cuò)誤率***。
5. 分類決策:
在特征空間中對(duì)被識(shí)別對(duì)象進(jìn)行分類。
***,探討人工智能平臺(tái)分析引擎的深度學(xué)習(xí),它是如何針對(duì)多層神經(jīng)網(wǎng)絡(luò)上運(yùn)用各種機(jī)器學(xué)習(xí)算法解決圖像、文本等問(wèn)題?深度學(xué)習(xí)從大類上可以歸入神經(jīng)網(wǎng)絡(luò),不過(guò)在具體實(shí)現(xiàn)上有許多變化。深度學(xué)習(xí)的核心是特征學(xué)習(xí),旨在通過(guò)分層網(wǎng)絡(luò)獲取分層次的特征信息,從而解決以往需要人工設(shè)計(jì)特征的重要難題。深度學(xué)習(xí)是一個(gè)框架,包含多個(gè)重要算法: CNN卷積神經(jīng)網(wǎng)絡(luò)、AutoEncoder自動(dòng)編碼器、Sparse Coding稀疏編碼、RBM限制波爾茲曼機(jī)、DBN深信度網(wǎng)絡(luò)、RNN多層反饋循環(huán)神經(jīng)網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò),對(duì)于不同問(wèn)題(圖像,語(yǔ)音,文本),需要選用不同網(wǎng)絡(luò)模型才能達(dá)到更好效果。
04
重點(diǎn)講一下卷積神經(jīng)網(wǎng)絡(luò),它就是至少包含一層的神經(jīng)網(wǎng)絡(luò),該層的功能是:計(jì)算輸入f與可配置的卷積核g的卷積,生成輸出。卷積的目的就是把卷積核應(yīng)用到某個(gè)張量的所有點(diǎn)上,通過(guò)卷積核的滑動(dòng)生成新的濾波后的張量。卷積的價(jià)值在于對(duì)輸入降維能力,通過(guò)降維改變卷積核的跨度strides參數(shù)實(shí)現(xiàn)。設(shè)置跨度是調(diào)整輸入張量維數(shù)的方法,strides參數(shù)格式與輸入向量相同,面臨挑戰(zhàn):如果應(yīng)對(duì)輸入在邊界,可以采用對(duì)圖像邊界填充方式。數(shù)據(jù)格式NHWC(數(shù)目,高度,寬度,通道數(shù))。卷積核的作用常常是增強(qiáng)卷積核中心位置像素的灰度。卷積神經(jīng)網(wǎng)絡(luò)CNN主要用來(lái)識(shí)別位移、縮放及其他形式扭曲不變性的二維圖形。
由于CNN的特征檢測(cè)層通過(guò)訓(xùn)練數(shù)據(jù)進(jìn)行學(xué)習(xí),所以在使用CNN時(shí),避免了顯式的特征抽取,而隱式地從訓(xùn)練數(shù)據(jù)中進(jìn)行學(xué)習(xí);再者由于同一特征映射面上的神經(jīng)元權(quán)值相同,所以網(wǎng)絡(luò)可以并行學(xué)習(xí),這也是卷積網(wǎng)絡(luò)相對(duì)于神經(jīng)元彼此相連網(wǎng)絡(luò)的一大優(yōu)勢(shì)。卷積神經(jīng)網(wǎng)絡(luò)以其局部權(quán)值共享的特殊結(jié)構(gòu)在語(yǔ)音識(shí)別和圖像處理方面有著獨(dú)特的優(yōu)越性,其布局更接近于實(shí)際的生物神經(jīng)網(wǎng)絡(luò),權(quán)值共享降低了網(wǎng)絡(luò)的復(fù)雜性,特別是多維輸入向量的圖像可以直接輸入網(wǎng)絡(luò)這一特點(diǎn)避免了特征提取和分類過(guò)程中數(shù)據(jù)重建的復(fù)雜度。
激活函數(shù):為神經(jīng)網(wǎng)絡(luò)的輸入引入非線性,通過(guò)曲線能夠刻畫(huà)輸入中更為復(fù)雜的變化,設(shè)計(jì)模型常推薦tf.nn.relu,tf.sigmoid,tf.tanh,tf.nn.dropout,性能較為突出,評(píng)價(jià)一個(gè)激活函數(shù)是否有用的因素如下:?jiǎn)握{(diào),采用梯度下降法尋找局部極值點(diǎn);可微分,保證任何一個(gè)點(diǎn)可以求導(dǎo)數(shù),可以使梯度下降法用到激活函數(shù)的輸出上。模型的評(píng)價(jià)指標(biāo)是敏感度、特異度和精度。靈敏度(敏感度,召回率recall,查全率sensitive)=TP/P =TPR;特異度(特效度specificity)=TN/N;精度(查準(zhǔn)率,準(zhǔn)確率precision)=TP/TP+FP。
總之,人工智能的框架時(shí)代已經(jīng)成熟了,不是我們科學(xué)家和技術(shù)專家的主戰(zhàn)場(chǎng),我們是要重新定義一些計(jì)算模型和算法實(shí)現(xiàn),來(lái)創(chuàng)新網(wǎng)絡(luò)結(jié)構(gòu)和訓(xùn)練方法,這樣的深度學(xué)習(xí)算法會(huì)更加有效,能夠在普通的移動(dòng)設(shè)備端工作,甚至不需要多余的硬件支持或抑制內(nèi)存開(kāi)銷,會(huì)觸發(fā)人工智能技術(shù)進(jìn)入大規(guī)模商用階段,人工智能產(chǎn)品全面進(jìn)入消費(fèi)級(jí)市場(chǎng)。
【本文為51CTO專欄作者“移動(dòng)Labs”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】