0
本文作者: 三川 | 2017-05-26 12:11 | 專題:Google I/O 2017 開發(fā)者大會(huì) |
雷鋒網(wǎng)按:在上周的谷歌開發(fā)者大會(huì) I/O 2017 的講座中,Keras 之父 Francois Chollet 被請(qǐng)出來向全世界的機(jī)器學(xué)習(xí)開發(fā)者進(jìn)行一場(chǎng)對(duì) Keras 的綜合介紹以及實(shí)戰(zhàn)示例。說起來,這個(gè)子小小的男人不但是暢銷書 《Deep learning with Python》的作者,更在 Kaggle 的數(shù)據(jù)科學(xué)家中世界排名第 17 位(最高),堪稱是青年 AI 工程師中的翹楚。也因此,在開發(fā)出 Keras 之后被谷歌挖走為 TensorFlow 背書。
作為號(hào)稱是 TensorFlow 最好用、對(duì)新手最友好的 API,一起來看看它的神通在哪里。
Francois Chollet:對(duì)許多使用場(chǎng)景而言,canned estimator 是相當(dāng)不錯(cuò)的選擇。但如果你要做的事并沒有現(xiàn)成的 canned estimator,怎么辦?如果需要寫自己的定制模型呢?這時(shí),就到了 Keras API 派上用場(chǎng)的時(shí)候。
簡而言之,它就是一個(gè)用于創(chuàng)建 TensorFlow 模型的高級(jí) API,你可以與它一起使用 estimator class 以及 experiment class。
眾所周知,TensorFlow 的特點(diǎn)是非常低級(jí)的編程界面,你大多數(shù)時(shí)間花在矩陣、矢量乘法上。這使它成為一件非常強(qiáng)力的深度學(xué)習(xí)工具。但對(duì)于創(chuàng)建十分復(fù)雜先進(jìn)的模型,這種操作方式說不上“理想”。
在谷歌,我們相信,未來深度學(xué)習(xí)將存在于每一個(gè)普通 IT 開發(fā)者的工具箱中,不再局限于機(jī)器學(xué)習(xí)專家。原因很簡單:每個(gè)開發(fā)者都需要做出更智能的應(yīng)用。
為了讓這成為現(xiàn)實(shí),我們需要降低深度學(xué)習(xí)的使用門檻,搞出每一個(gè)人都能用的工具,而不應(yīng)該只有專家才能用深度學(xué)習(xí)解決問題。
我有一個(gè)問題想讓大家思考:
如果設(shè)計(jì)一個(gè)沒有任何束縛限制的深度學(xué)習(xí)界面,它應(yīng)該是什么樣的?
深度學(xué)習(xí)的核心理念很容易理解,它的實(shí)現(xiàn)也不應(yīng)該復(fù)雜。對(duì)于模型核心部件,與其從頭實(shí)現(xiàn)所有功能,應(yīng)該讓開發(fā)者利用現(xiàn)存部件,快速搭建數(shù)據(jù)處理流水線;就像樂高積木那樣。這正是我們?cè)O(shè)計(jì) Keras 的理念——成為“深度學(xué)習(xí)的樂高”。
下面,我來講講 Keras 都能做什么。
首先,我不建議把 Keras 看做是 codebase、框架或庫,它只是個(gè)高級(jí) API。它有不同的實(shí)現(xiàn),最主要的當(dāng)然是 TensorFlow,但還有基于其它平臺(tái)的——目前有 Theano、MXnet 和 Java;對(duì)更多框架的支持正在路上。
有一個(gè)特點(diǎn),是 Keras 區(qū)別于其他所有深度學(xué)習(xí)操作界面的地方,讓它鶴立雞群——那就是用戶體驗(yàn)。說白了,Keras 的精髓就是它對(duì)用戶體驗(yàn)的執(zhí)著,讓開發(fā)者用著更舒服、簡化工作流。尤其在于提供易于使用的組件、符合直覺的推理、更好的報(bào)錯(cuò)方面。因而,Keras 降低了操作難度,降低使用者的認(rèn)知負(fù)擔(dān)。
當(dāng)然,讓深度學(xué)習(xí)變得更簡單,同時(shí)意味著更多的人能上手。Keras 的終極目標(biāo),是讓盡可能更多人接觸、使用深度學(xué)習(xí)。
直到現(xiàn)在,Keras API 的 TensorFlow 實(shí)現(xiàn),是以外部開源資源庫的形式存在的。但現(xiàn)在,我們把 Keras API 直接整合入 TensorFlow 項(xiàng)目中,這樣能與你的已有工作流無縫結(jié)合。至此,Keras 成為了 TensorFlow 內(nèi)部的一個(gè)新模塊:tf.keras,它包含完整的 Keras API。
“對(duì)于 TensorFlow 用戶,這意味著你獲得了一整套易于使用的深度學(xué)習(xí)組件,并能與你的工作流無縫整合。
對(duì)于 Keras 用戶,這意味著一系列高級(jí) TensorFlow 訓(xùn)練功能,比如分布式訓(xùn)練、分布式超參數(shù)優(yōu)化?!?/p>
下面,我們一起來看看你的工作流會(huì)是什么樣子。我會(huì)向大家展示一個(gè)簡單但挺先進(jìn)的例子。該例子中,我用 Keras API 定義模型,用 TensorFlow estimator 和 experiments 在分布式環(huán)境訓(xùn)練模型。
這是一個(gè)視頻問答問題。我們有一組 10 秒短視頻組成的數(shù)據(jù)集,視頻內(nèi)容是人從事各種活動(dòng)。一個(gè)深度學(xué)習(xí)模型將會(huì)觀察這些視頻的每一幀畫面,進(jìn)行理解,然后你可以用簡短的自然語言問它視頻內(nèi)容。
本例子中,一個(gè)男人把紙板箱放進(jìn)車的行李箱里。任務(wù)是回答這個(gè)人在做什么。模型會(huì)處理該視頻和問題,試圖在可能的答案中挑選出正確的那一個(gè)。這次,它的回答是“裝貨”。這個(gè)答案很有意思:如果僅僅看一幀畫面,是得不出該結(jié)論的——這個(gè)人也有可能在卸貨。所以,我們不僅要求模型能理解視頻畫面的內(nèi)容,還要能理解每一幀畫面的先后順序。
放到三四年前,Keras 和 TensorFlow 誕生之前,這會(huì)是一個(gè)無比棘手的難題,全世界只有個(gè)位數(shù)的研究機(jī)構(gòu)能處理。即便是一只由世界級(jí)專家學(xué)者、工程師組成的團(tuán)隊(duì),也需要半年左右的時(shí)間來一點(diǎn)一點(diǎn)解決。而現(xiàn)在,所有具備基礎(chǔ) Python 編程技能的人都能借助工具處理該問題。我們這也是在使深度學(xué)習(xí)民主化。
下圖便是我們的神經(jīng)網(wǎng)絡(luò)方案。它的結(jié)構(gòu)可分為三個(gè)部分:
首先,一個(gè)分支會(huì)導(dǎo)入視頻輸入,把它轉(zhuǎn)化為對(duì)視頻內(nèi)容編碼的矢量。另一個(gè)分支導(dǎo)入問題,也把它轉(zhuǎn)化為矢量。現(xiàn)在,你可以把視頻矢量和問題矢量連結(jié)起來,在它們之上添加一個(gè)分類器。該分類器的任務(wù),是從一堆潛在回答中,選出正確的那一個(gè)。
第一步,是把視頻輸入矢量轉(zhuǎn)化為張量。一個(gè)視頻只是一組連續(xù)的畫面幀,每一幀都是一個(gè)圖像。對(duì)于圖像處理,你要做的全部的事,就是運(yùn)行一個(gè) CNN。
每個(gè) CNN,會(huì)從每幀畫面提取一個(gè)矢量表示。最后所得到的,是對(duì)每幀畫面進(jìn)行編碼的矢量序列。當(dāng)遇到一個(gè)序列,你會(huì)做什么?當(dāng)然是用序列處理模塊—— LSTM 把它跑一遍。LSTM 會(huì)把序列簡化為一個(gè)單一矢量,該矢量編碼了視頻的所有信息,包括每一幀畫面、以及它們的順序。
下一步,使用類似的過程來處理問句。它是一個(gè)由詞語組成的序列,需要用內(nèi)嵌模塊把每個(gè)詞語映射為一個(gè)詞矢量。你就獲得了一個(gè)詞向量序列,再用另一個(gè) LSTM 層來簡化。
當(dāng)視頻、問題的矢量表示都有了以后,就可以把它們連接起來,在上面添加一個(gè)用于選擇正確答案的分類器。
這就是深度學(xué)習(xí)的魔力:把復(fù)雜的輸入,比如視頻、圖像、語言、聲音變成矢量,變成幾何空間中的不同的點(diǎn)——把了信息變成了幾何空間中的點(diǎn),這就是深度學(xué)習(xí)的本質(zhì)。
而當(dāng)完成之后,你就可以用線性代數(shù)來處理幾何空間,捕捉到到有趣的映射模式。在上面的例子中,該模型就是在學(xué)習(xí)一個(gè)視頻、問題空間到答案空間的映射。而執(zhí)行的方式,是把不同的信息處理模塊組合起來。這是一個(gè)十分自然的操作:對(duì)象是圖像,就用圖像處理模塊 CNN;對(duì)象是序列,就用序列處理模塊 LSTM;如果需要從一組候選中選擇一個(gè),就用分類器。
因而,創(chuàng)建深度學(xué)習(xí)模型,在概念上和拼樂高積木是很相似的,前者的實(shí)現(xiàn)也應(yīng)該這么簡單。這張圖,就是對(duì)我們的模型在 Keras 上的直觀結(jié)構(gòu)。
我們用一個(gè)按時(shí)間分布的層,把 CNN 應(yīng)用于由輸入視頻和張量組成的時(shí)間軸上的每一幀畫面。然后把輸入導(dǎo)入 LSTM 層,前者被簡化為單一張量。InceptionV3 CNN 會(huì)內(nèi)置預(yù)訓(xùn)練的權(quán)重,這一點(diǎn)很重要,因?yàn)橐阅壳暗囊曨l輸入,靠我們自己是無法學(xué)習(xí)到有趣的視覺特征的。我們需要利用現(xiàn)有的、在大型數(shù)據(jù)集上學(xué)習(xí)到的視覺特征。這個(gè)例子里是 ImageNet。在深度學(xué)習(xí)里,這是一個(gè)常見的舉措,而 Keras 使它變得更方便。問題的編碼更加簡單。把詞語序列導(dǎo)入內(nèi)嵌層(embedding layer),生成矢量序列,再用 LSTM 層簡化為單一矢量。
下面是視頻編碼機(jī)器人的完整代碼,加起來只有幾行,非常簡潔。你從確認(rèn)視頻輸入開始,高亮部分就是你的視頻輸入:
這是一個(gè)由合理幀數(shù)組成的序列?!癗one”就是幀數(shù),它沒有被定義,你可以不同的 batch 進(jìn)行修改。每一幀畫面的分辨率是 150*150。下一步,僅用一行我們就定義了整個(gè) InceptionV3 模型。它裝滿了從 ImageNet 得到的預(yù)訓(xùn)練權(quán)重。所有這些已經(jīng)內(nèi)置于 Keras 中,你不需要做任何多余操作,僅此一行代碼足矣。代碼并不包含頂層,因?yàn)椴⒉幌嚓P(guān),但在頂部加入了 pooling,使得我們能從每一幀抓取一個(gè)矢量。
下一步,CNN 被設(shè)置為不可訓(xùn)練,意味它的參數(shù)表示并不會(huì)在訓(xùn)練中更新。這一步很重要,因?yàn)樵?CNN 已經(jīng)有了非常不錯(cuò)的表示,沒必要更改。再強(qiáng)調(diào)一遍,這是深度學(xué)習(xí)的常用操作,把封住不再改動(dòng)的預(yù)訓(xùn)練模型添加入流水線。在 Keras 中,這項(xiàng)操作變得十分簡便。有了不再變動(dòng)的 CNN 之后,我們用一個(gè)時(shí)間分配層(time distributed layer),把它在視頻輸入的時(shí)間軸上均衡分配。這樣做的結(jié)果,是得到所有幀的張量,再導(dǎo)入 LSTM 層得到單一矢量。
如上圖,問題處理就更加簡單。最終的問題輸入,被處理為整數(shù)序列。為什么是整數(shù)呢?每一個(gè)整數(shù),都會(huì)用某些詞匯映射到一個(gè)矢量。隨后把整數(shù)序列導(dǎo)入嵌入層,這會(huì)把每個(gè)整數(shù)映射到一個(gè)矢量上。這些訓(xùn)練過的嵌入是模型的一部分。再把矢量序列導(dǎo)入 LSTM,簡化為單一矢量。
這里有一個(gè)有意思的地方。通常使用 LSTM 的時(shí)候,有許多東西需要考慮、許多套路需要參考。但在這里,除了設(shè)置輸入單位的數(shù)量,我們并沒有做任何其他操作配置 LSTM 層——所有“最佳套路”,都已經(jīng)成為 Keras 的默認(rèn)設(shè)置。這是 Keras 的一大特點(diǎn),已知的最佳方案被用于默認(rèn)設(shè)置。對(duì)于開發(fā)者,這意味著模型直接就能用,不需要對(duì)所有參數(shù)都進(jìn)行調(diào)參。
在完成對(duì)視頻、問題的編碼之后,你只需要用 concate up 把它們轉(zhuǎn)化為單一矢量,然后在頂端加入兩個(gè)密集層,它們會(huì)從備選詞匯中選出一個(gè)作為答案。
下一步,使用輸入和輸出初始化 Keras 模型,本質(zhì)上它是一個(gè)神經(jīng)網(wǎng)絡(luò)各層的圖(a graph of layers)的容器。然后要確定訓(xùn)練設(shè)置,比如優(yōu)化器、Adam 優(yōu)化器和損失函數(shù)。到現(xiàn)在一切都很簡單,我們已經(jīng)定義了模型和訓(xùn)練設(shè)置。下面是在分布式環(huán)境訓(xùn)練模型,或許在 Cloud ML 上。
只用幾行代碼,你就可以用 TensorFlow Estimator 和 Experiment 類訓(xùn)練模型。所有需要你做的事,僅僅是寫 experiment 函數(shù),用內(nèi)置的 get_estimator 方法在其中定義模型,并用模型來初始化 Estimator。有了 estimator 之后,再用它創(chuàng)建 Experiment,在其中你確認(rèn)輸入數(shù)據(jù)。
僅僅用幾行非常直觀、具有高度可讀性的 Python 代碼就可以實(shí)現(xiàn),我們就定義了一個(gè)相當(dāng)先進(jìn)的模型、在分布式環(huán)境訓(xùn)練它,來解決視頻問答難題。而這在幾年前是完全難以想象的。
到這里,你應(yīng)該已經(jīng)看到,像 Keras 這樣的 API 是如何推動(dòng) AI 民主化。這借助兩個(gè)東西實(shí)現(xiàn):
其中一個(gè),當(dāng)然是 Keras API。為在 TensorFlow 中定義模型提供了易于使用、功能強(qiáng)大的工具。而且,每一層都有非常優(yōu)秀的默認(rèn)設(shè)置,讓模型可以直接運(yùn)行。
另外一個(gè),則是全新的高級(jí) TensorFlow 訓(xùn)練 API:Estimator 和 Experiment。
把它們結(jié)合到一起,使得開發(fā)者們能夠以相當(dāng)小的時(shí)間、經(jīng)歷代價(jià)處理任何深度學(xué)習(xí)難題。
雷鋒網(wǎng)注:感興趣的童鞋可翻墻到 Youtube 觀看完整視頻,雷鋒網(wǎng)編譯。
相關(guān)文章:
李飛飛:我把今天AI所處的發(fā)展階段稱為“AI in vivo” | Google I/O 2017
六大亮點(diǎn)解讀:計(jì)算機(jī)視覺技術(shù)無處不在 | Google I/O 2017
深度學(xué)習(xí)庫 Keras 2 重磅發(fā)布,與 TensorFlow 聯(lián)系更緊密
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。
本專題其他文章