選自 Quora
機(jī)器之心編譯
參與:吳攀、段澤明、黃清緯、無我、杜夏德
Fran?ois Chollet 是深度學(xué)習(xí)框架 Keras 的作者,現(xiàn)就職于谷歌,從事深度學(xué)習(xí)技術(shù)的研究。近日,他在 Quora 進(jìn)行了一場專題問答,回答了很多關(guān)于 Keras 的開發(fā)過程和現(xiàn)狀,以及深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的問題。機(jī)器之心將這些問題大致分為五類。點(diǎn)擊「閱讀原文」下載文中涉及的論文及 PPT。
一、關(guān)于 Keras 的問題:
你如何比較 Keras 與其他深度學(xué)習(xí)框架,比如,TensorFlow ,Theano 或者Torch?
Fran?ois Chollet:首先,讓我們看看 Theano 和 TensorFlow。這兩者非常相似,因?yàn)?TensorFlow 重復(fù)使用了許多在 Theano 中提出來的關(guān)鍵思想。這兩者本質(zhì)上都是用來定義抽象的、通用的計(jì)算圖形(computation graph)的語言(Language)。它們算不上是真正的「深度學(xué)習(xí)框架」,它們的用途遠(yuǎn)不僅僅限于深度學(xué)習(xí)!另一方面,Keras 是一種真正的深度學(xué)習(xí)框架:一種精心設(shè)計(jì)的可以用來構(gòu)建深度學(xué)習(xí)模型的 API,只需要將高層次的構(gòu)造模塊拼接到一起就可以了。而且因?yàn)?Keras 運(yùn)行在 TensorFlow 或 Theano 之上,所以相比于使用其它更低層次的框架,使用 Keras 沒有性能上的成本。
在 TensorFlow 或 Theano 中做深度學(xué)習(xí)時(shí),你可以將 Keras 看作是更好的 UX。如果你熟悉 Numpy 和 Scikit-Learn,那么更公平地將 Theano 和 TensorFlow 比作是 Numpy,而 Keras 則更接近 Scikit-Learn。但是這樣的比較并不是完美的,因?yàn)?Keras 比 Scikit-Learn 更靈活:它允許你定義你自己的機(jī)器學(xué)習(xí)模型,而不只是使用預(yù)定義的模型。
現(xiàn)在,如果你想比較 Keras 和 Torch/nn:它們具有很多相同的功能和理念,都是用于構(gòu)建深度學(xué)習(xí)模型的高層次的模塊化的庫。Torch 在很多方面都是一個(gè)很棒的框架。但讓我們來看看它們之間的不同點(diǎn):
Keras 基于 Python,所以能與大量的 Python 數(shù)據(jù)科學(xué)生態(tài)系統(tǒng)進(jìn)行很好的整合。而 Torch 基于 Lua——所謂的「Lua 數(shù)據(jù)科學(xué)生態(tài)系統(tǒng)」并不存在。
Keras 有一個(gè)遠(yuǎn)比 Torch 更大的社區(qū)。這不僅限于創(chuàng)業(yè)公司和大公司、研究生和愛好者,在學(xué)術(shù)界也是一樣:Keras 最近已經(jīng)在 arXiv 的每月提及次數(shù)上超過了 Torch。Keras 正在快速成長,而 Torch 的用戶群過去 6 個(gè)月來一直在萎縮(許多研究者和組織遷移到了 TensorFlow/Keras)。
因此,Keras 有更好的文檔資料、更多代碼示例和更多學(xué)習(xí)資源讓你起步。
Keras 可以運(yùn)行在 TensorFlow 之上,因此可以受益于谷歌在使 TensorFlow 成為現(xiàn)在最快最可擴(kuò)展的深度學(xué)習(xí)引擎中所投入的工程努力。
如果我已經(jīng)打算使用 TensorFlow 了,我為什么還要關(guān)心 Keras?
Fran?ois Chollet:Keras 提供了一個(gè)更簡單,更快的方式來在 TensorFlow 中構(gòu)建并訓(xùn)練模型,因?yàn)槟P腿匀皇怯稍镜?TensorFlow 引擎運(yùn)行的,所以不會(huì)影響性能。所以如果你關(guān)心你自己的時(shí)間和生產(chǎn)效率的話,你就應(yīng)該關(guān)注 Keras。
我上周偶然發(fā)現(xiàn)了這兩段分別用 Keras 和 TensorFlow 實(shí)現(xiàn)的 XOR(異或運(yùn)算)代碼(https://gist.github.com/cburgdorf/e2fb46e5ad61ed7b9a29029c5cc30134),可以作為想要了解神經(jīng)網(wǎng)絡(luò)的人的「Hello World」。總結(jié)就是:Keras 版的代碼更易于閱讀、理解和編寫。使用 Keras 工作的話,代碼開銷(code overhead)和認(rèn)知開銷(cognitive overhead)會(huì)更少。
當(dāng)然,你開發(fā)的模型越復(fù)雜,你使用 Keras 所提高的生產(chǎn)效率就會(huì)越明顯。Keras 真的在那些十分依賴權(quán)值共享(weight sharing)的模型、多個(gè)模型的組合、多任務(wù)模型等任務(wù)上有光彩奪目的表現(xiàn)。一個(gè)很好的例子是這篇在 Keras 中用 30 行代碼再實(shí)現(xiàn)「Deep compositional captioning」論文的
GitHub(https://gist.github.com/fchollet/0ecc151189b997fd4400bc2fecf2489f)。同時(shí)一個(gè)純 TensorFlow 的實(shí)現(xiàn)會(huì)需要多個(gè)文件、上百行的代碼,根本就是一個(gè)相當(dāng)大的挑戰(zhàn)。
在創(chuàng)造 Keras時(shí),那些工程和設(shè)計(jì)決定是比較重要的?
Fran?ois Chollet:最重要的決定是將 Keras 設(shè)計(jì)成一個(gè)自包含(self-contained)的深度學(xué)習(xí)框架。也就是說,你可以使用 Keras 端到端地解決問題,而不需要與底層后端引擎 Theano 或 TensorFlow 有任何交互。Keras 最初構(gòu)建于 Theano 之上,但因?yàn)橥耆挥每紤] Theano,所以在 TensorFlow 最初發(fā)布后很快就能輕松地將 TensorFlow 加為一種后端。未來,我們還將擴(kuò)展 Keras 以支持下一代計(jì)算圖形引擎(omputation graph engine)。Lasagne 等其它庫選擇作為可與 Theano 協(xié)作的實(shí)用工具箱,而沒有覆蓋 Theano,這就需要用戶對 Theano 的額外知識(shí),并將他們的成功和 Theano 的普及度捆綁在一起。這些庫就是全部,但現(xiàn)在已經(jīng)死掉了。
這一決定所帶來的結(jié)果是 Keras 有了自己的用于處理計(jì)算的圖形的圖形數(shù)據(jù)結(jié)構(gòu)(graph datastructure),而不需要依賴 TensorFlow 或 Theano 自帶的圖形數(shù)據(jù)結(jié)構(gòu)。因此,Keras 可以在 Theano 中執(zhí)行離線的形狀推理( shape inference)(這是 Theano 目前還不具備的一個(gè)功能),以及輕松的模型共享或模型復(fù)制。比如說,當(dāng)你在一個(gè)新的輸入 (`y = model(x)`) 上調(diào)用一個(gè) Keras 模型時(shí),Keras 會(huì)重復(fù)應(yīng)用包含在你的模型底層圖形中的所有指令,可以做到這一點(diǎn)的原因是 Keras 實(shí)際上能夠獨(dú)立于 TensorFlow/Theano 而對圖形進(jìn)行管理。事實(shí)上,Keras 甚至可以做到:1)定義一個(gè)帶有 Theano 后端的 Keras 模型,2)切換到 TensorFlow 后端,3)在一個(gè) TensorFlow 輸入上重復(fù)應(yīng)用你的(構(gòu)建于 Theano 之上的)Keras 模型,這給原本是 Theano 模型的東西創(chuàng)造了一個(gè) TensorFlow 版本(注意:實(shí)際上我們不允許在會(huì)話過程中切換后端,因?yàn)檫@會(huì)非常不安全——用戶可能會(huì)混淆 TensorFlow 和 Theano 張量(tensor)——但如果你熟悉 Keras 的內(nèi)部機(jī)制的話,也許能通過手動(dòng)的方式做到。)
另一個(gè)重要的決定是使用面向?qū)ο蟮脑O(shè)計(jì)(object-oriented design)。深度學(xué)習(xí)模型可以被理解成是函數(shù)鏈(chains of functions),因此一種函數(shù)方法看起來可能就很有趣。然而這些函數(shù)都是高度參數(shù)化的,大部分都是通過它們的權(quán)重張量完成的,而以一種函數(shù)的方式操作這些參數(shù)是很不實(shí)際的。所以在 Keras 中,每一個(gè)事物都是一個(gè)對象:層、模型、優(yōu)化器等等呢個(gè)。一個(gè)模型的所有參數(shù)都可以作為對象性質(zhì)而被獲取,比如說 model.layers[3].output 是該模型的第 3 層的輸出張量,model.layers[3].weights 是該層的符號(hào)權(quán)重張量(symbolic weight tensor)列表,等等。
函數(shù)方法則會(huì)將層看作是可以創(chuàng)造權(quán)重的函數(shù),當(dāng)其被調(diào)用時(shí),會(huì)將這些權(quán)重存儲(chǔ)在全局名稱索引集合(global name-indexed collections )中(比如 TensorFlow-Slim 就使用了這樣的方法)。這意味著許多操作(模型加載、獲取已有的權(quán)重張量)都必須通過名稱匹配(name-matching)實(shí)現(xiàn),所以你需要小心地給你創(chuàng)造的每一個(gè)張量命名,而不能依靠自動(dòng)生成的名稱。而且理所當(dāng)然會(huì)有名稱沖突的問題,這通常會(huì)導(dǎo)致我們無法在一個(gè)單一的會(huì)話中對多個(gè)獨(dú)立的模型進(jìn)行操作。對我來說,這看起來很像是反模式(anti-pattern)。面向?qū)ο蟮姆椒ǜ诱麧崳梢愿玫財(cái)U(kuò)展。
為什么 Keras 最近在 Kaggle 競賽上會(huì)如此成功?
Fran?ois Chollet:在機(jī)器學(xué)習(xí)競賽中,這些獲勝者很少是從一開始就想出了最好的想法,然后簡單地部署它,提交結(jié)果,最后很快忘了這回事。開發(fā)一個(gè)好的模型需要對最初的想法進(jìn)行多次迭代,直到時(shí)間到了;你總是能進(jìn)一步改進(jìn)你的模型。最終的模型與你最初嘗試解決這個(gè)問題時(shí)所設(shè)想的方案幾乎沒有任何共同點(diǎn),因?yàn)橐粋€(gè)事先想好的方案基本上從來不會(huì)在現(xiàn)實(shí)試驗(yàn)中存活下來。所以贏不是說你最初的理論構(gòu)想有多棒,而在于你的設(shè)想有多少能通過現(xiàn)實(shí)的考驗(yàn)。你不會(huì)輸給比你更聰明的人,你會(huì)輸給那些比你重復(fù)更多實(shí)驗(yàn)的人,他們一點(diǎn)點(diǎn)精化他們的模型。如果你把 Kaggle 上的團(tuán)隊(duì)按照實(shí)驗(yàn)的次數(shù)排名,我保證你會(huì)發(fā)現(xiàn)試驗(yàn)次數(shù)排名與最后的競爭排行榜有很強(qiáng)的關(guān)聯(lián)。
Keras 被設(shè)計(jì)作為一種可快速構(gòu)建許多不同模型的原型的方法,其關(guān)注的重點(diǎn)是盡可能減少從想法到實(shí)驗(yàn)結(jié)果驗(yàn)證之間所需的時(shí)間。Keras API 和工作流程基本上可以減少設(shè)置新實(shí)驗(yàn)的開銷(overhead)(代碼開銷和認(rèn)知開銷)。所以使用 Keras 讓你可以更快地迭代,嘗試更多事物。最終,這能讓你贏得比賽(或發(fā)表論文)。能夠以最小的延遲將想法變成結(jié)果對實(shí)現(xiàn)好的研究來說是很關(guān)鍵的——這是 Keras 背后的核心信念之一。
從 Keras 開始學(xué)習(xí)深度學(xué)習(xí)的最好方法是什么?
Fran?ois Chollet:我正在編寫關(guān)于深度學(xué)習(xí)的介紹性書籍,前幾章想描述使用 Keras 合理地第一次接觸深度學(xué)習(xí)的情況。然而,還得一段時(shí)間我才能發(fā)布這些章節(jié)。
如果你不是很熟悉深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的話,你可能需要檢查下你是否學(xué)過下列教程,只要你有一些 Python 的背景,這些很基礎(chǔ)的課都很容易跟著學(xué):
一個(gè)來自 CERN 的從零開始學(xué)神經(jīng)網(wǎng)絡(luò)和 Keras 的視頻教程(http://cds.cern.ch/record/2157570?ln=en)
來自 FastForwardLabs 的 Keras 「Hello world」(https://github.com/fastforwardlabs/keras-hello-world/blob/master/kerashelloworld.ipynb)
「通過 Keras,一步步用 Python 開發(fā)你的第一個(gè)神經(jīng)網(wǎng)絡(luò)」(http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/)
如果你已經(jīng)了解了一些機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的知識(shí),那么最快上手的方式是:
1. 閱讀 Keras README(https://github.com/fchollet/keras/blob/master/README.md)
2. 閱讀序列模型(https://keras.io/getting-started/sequential-model-guide/)
3. 閱讀功能 API(https://keras.io/getting-started/functional-api-guide/)
4. 閱讀一些關(guān)鍵的 Keras 代碼:
MLP(https://github.com/fchollet/keras/blob/master/examples/mnist_mlp.py)
Convnet(https://github.com/fchollet/keras/blob/master/examples/cifar10_cnn.py)
LSTM(https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py)
閱讀 Keras 博客里的教程:
使用少量數(shù)據(jù)構(gòu)建圖象分類器(https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html)
使用預(yù)訓(xùn)練詞嵌入(https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html)
使用 Keras 構(gòu)建自動(dòng)編碼器(https://blog.keras.io/building-autoencoders-in-keras.html) (https://blog.keras.io/building-autoencoders-in-keras.html%EF%BC%89)
然后通過參加 Kaggle 比賽來將你學(xué)到的技能應(yīng)用到現(xiàn)實(shí)世界的問題?;蛘?,這里有一個(gè) Keras 教程和項(xiàng)目的知識(shí)庫(https://github.com/fchollet/keras-resources),你能在這里找到很多教程和代碼實(shí)例。
你推薦使用 Theano 還是 TensorFlow 作為 Keras 的后端嗎?
Fran?ois Chollet:這取決于你正在做什么。對于涉及循環(huán)網(wǎng)絡(luò)的模型,我會(huì)推薦使用 Theano 以獲得更好的性能。如果你需要在分布式部署中運(yùn)行你的模型,那么我推薦 TensorFlow。其它情況下,使用能讓你的模型運(yùn)行得最快那個(gè)。
通常來說,TensorFlow 在性能方面上進(jìn)步得非常快(雖然循環(huán)神經(jīng)網(wǎng)絡(luò)的性能仍有待提高)并且它最終會(huì)取代 Theano 作為 Keras 的默認(rèn)后臺(tái)。然而,我們目前還沒到達(dá)那種程度。
Keras 中分布式學(xué)習(xí)(多 GPU 和跨主機(jī))的現(xiàn)狀是什么?未來有什么計(jì)劃?
Fran?ois Chollet:現(xiàn)在模型級(jí)并行(在一個(gè)單一網(wǎng)絡(luò)中將不同的指令發(fā)送至不同的設(shè)備)和數(shù)據(jù)級(jí)并行(將一個(gè)模型復(fù)制到并行處理不同數(shù)據(jù)批的設(shè)備中,然后將結(jié)果合并)是有可能的,但它們都是基于 TensorFlow 的。在未來,我們可能會(huì)引入一種統(tǒng)一的、用戶友好的、基于單一代碼庫的 API 來處理 Theano 和 TensorFlow 中的并行形式。
目前來說,使用 TensorFlow 后臺(tái)時(shí),模型并行基本上微不足道(Keras 與 TensorFlow 的設(shè)備范圍兼容),并且數(shù)據(jù)平行也非常簡單……只要你知道如何在 TensorFlow 操作,不過在只在 TensorFlow 上操作是有點(diǎn)挑戰(zhàn)的。這里有一個(gè)如何做的教程(https://gist.github.com/fchollet/2c9b029f505d94e6b8cd7f8a5e244a4e),要與這個(gè)教程結(jié)合起來(https://www.tensorflow.org/versions/r0.10/how_tos/distributed/index.html)。
你為什么決定部署 Keras ?
Fran?ois Chollet:大約是 2015 年 2 月的時(shí)候,我正在解決幾個(gè)深度學(xué)習(xí)問題,主要涉及自然語言處理(問答是一個(gè)大問題),當(dāng)時(shí)我正在尋找一個(gè)能夠很好地實(shí)現(xiàn) LSTM 和其他 RNN、并能在 RNN 和卷積網(wǎng)絡(luò)之間實(shí)現(xiàn)良好互動(dòng)的深度學(xué)習(xí)框架。令我沮喪的是,一個(gè)都沒有找到。最有前途的選擇是 PyLearn2,我覺得它笨拙而不實(shí)用,并且缺乏對 RNN 的支持。以前我用 Torch 的體驗(yàn)不錯(cuò),但是由 Lua (其中我不得不為每個(gè)數(shù)據(jù)格式實(shí)現(xiàn)我自己的數(shù)據(jù)分析器,等等)導(dǎo)致的效率損失太高了。最重要的是,那時(shí)的 Torch 還有很多毛病。
所以我想到了建立自己的框架:選用 Python 和一個(gè)有著良好 RNN 支持的、類似于 Torch 的 API,并專注于運(yùn)用許多不同架構(gòu)來加速實(shí)驗(yàn)。同時(shí),開發(fā)于 Theano 之上是快速落實(shí)這樣一個(gè)框架的最好(唯一?)選擇。我開始投入工作大約一個(gè)月后,發(fā)布了 Keras 0.0.1。
沒有 Theano 的話不可能實(shí)現(xiàn) Keras。 開發(fā)好工具是一個(gè)從根本上漸進(jìn)的過程:你是在由之前其他人提供的開源代碼的層次上進(jìn)行開發(fā)。這是一個(gè)整潔、協(xié)同、開放的過程。
開源社區(qū)如何能幫助更多地開發(fā)Keras?
Fran?ois Chollet:Keras 對于新的貢獻(xiàn)總是很開放。當(dāng)前我希望開源社區(qū)關(guān)注一些項(xiàng)目,即:
我們怎樣在 Keras 中支持樹形 RNN 和遞歸網(wǎng)絡(luò)?
在Theano 和 TensorFlow中為多 GPU 并行和數(shù)據(jù)并行模型開發(fā)一個(gè)統(tǒng)一的 API 。
開發(fā)一個(gè)層的「 tensorflow 」子模,使其成為包裹 TensorFlow 的一些特別操作的稀薄封裝( thin-wrappers )。比如純正的 TensorFlow RNNs 。
在 Keras 中有支持 Neon 的計(jì)劃嗎?
Fran?ois Chollet:這是一個(gè)鮮為人知的事實(shí),但是在TensorFlow 發(fā)布以前我計(jì)劃支持Neon,它在那時(shí)是一個(gè)非常有前途的架構(gòu)。它沒有發(fā)生主要是因?yàn)镹ervana 隊(duì)似乎并不特別感興趣,也因?yàn)槟菚r(shí)Neon仍然沒有找到自動(dòng)分化的關(guān)鍵特征。六個(gè)月后,TensorFlow 發(fā)布了,我們轉(zhuǎn)而關(guān)注并支持了它。
我依然很樂意在未來為 Keras 加入一個(gè) Neon 后臺(tái)。如果我們可以使得用戶運(yùn)行他們已在使用的同樣的 Keras 代碼,但由于定制的 Neon 內(nèi)核而效率更高,那么對于 Keras 和 Nervana / Intel 的用戶都是最好的,否則大量的初創(chuàng)公司和企業(yè)將不得不去采納 Neon。然而,為了實(shí)現(xiàn)它我們需要 Nervana 與我們密切協(xié)作,總而言之,這對我看起來不太可能。
只知道 Python 和一點(diǎn) numpy ,從頭開始學(xué),大概需要多久才能熟悉 Keras 和 Theano?
Fran?ois Chollet:Python / Numpy 是你開始使用 Keras 前所需準(zhǔn)備的全部。我曾經(jīng)與完全不知道神經(jīng)網(wǎng)絡(luò)的人談?wù)撛谝惶炖镉?xùn)練 Keras 深度網(wǎng)絡(luò)。所以我認(rèn)為你只需要一天就能上手,然后可能需要幾周時(shí)間來適應(yīng)各個(gè)特征。最好的上手方式是閱讀 Keras 的代碼實(shí)例,并嘗試按照自己的意愿修改它們。
整合預(yù)訓(xùn)練的模型對于 Keras 或者民主化人工智能來說是一個(gè)重要的發(fā)展方向嗎?
Fran?ois Chollet:當(dāng)然。深度學(xué)習(xí)民主化中的第一步是使能用于建立高水平的架構(gòu)的基礎(chǔ)平臺(tái)(即 Theano 和 TensorFlow )變得可用。第二步是建立針對深度學(xué)習(xí)的用戶友好型的開發(fā)工具,例如 Keras 。第三步則是將工作重點(diǎn)從代碼本身轉(zhuǎn)移到應(yīng)用上。我們不但會(huì)將用于構(gòu)建解決方案的工具商業(yè)化,而且會(huì)使解決方案本身商業(yè)化,使之再次應(yīng)用到其它問題上。預(yù)訓(xùn)練模型顯然是那個(gè)方向的第一步。
這是被 Caffe 運(yùn)用 Caffe model zoo 開發(fā)出來的。現(xiàn)在 Keras 也轉(zhuǎn)到這個(gè)方向上來,特別是在這個(gè)庫中四個(gè)最流行的計(jì)算機(jī)視覺模型上,包括 ImageNet 中的權(quán)重預(yù)訓(xùn)練(weights pre-trained)。你現(xiàn)在可以開始僅僅通過幾行 Keras 的代碼在新的圖像上進(jìn)行預(yù)測。很多人能做到這一點(diǎn)——包括權(quán)重文件下載在內(nèi)的一切事情,都被考慮在內(nèi)了。
Keras 能用于淺/標(biāo)準(zhǔn)的機(jī)器學(xué)習(xí)嗎?
Fran?ois Chollet:Keras 大體來說對于參數(shù)函數(shù)( parametric functions )的監(jiān)督式訓(xùn)練是合適的,參數(shù)函數(shù)由神經(jīng)層組成。所以,你能輕易地用它實(shí)現(xiàn)淺的機(jī)器學(xué)習(xí)算法,比如 logistic 回歸、線性回歸或 FastText 。Keras 中不同回歸算法的例子: keras_logistic_regression.py(https://gist.github.com/fchollet/b7507f373a3446097f26840330c1c378)
Keras 中的 FastText :fchollet/keras (https://github.com/fchollet/keras/blob/master/examples/imdb_fasttext.py)
然而,Keras 不適合基于決策樹或矩陣分解( matrix factorization )的算法,也不適合核方法( kernel methods )。
二、關(guān)于深度學(xué)習(xí)和機(jī)器學(xué)習(xí):
深度學(xué)習(xí)研究存在過度炒作嗎?
Fran?ois Chollet:在許多方面是這樣。當(dāng)然,深度學(xué)習(xí)最近所取得的成就是令人驚訝的:我們對感知問題(圖像分類、語音識(shí)別)上的監(jiān)督學(xué)習(xí)從捉襟見肘變得真正擅長。深度學(xué)習(xí)在機(jī)器學(xué)習(xí)的多個(gè)子領(lǐng)域內(nèi)都具有變革的意義。但這里有一點(diǎn)是:大部分人并不直接參與深度學(xué)習(xí)研究,卻喜歡從最近所取得的成就中做很多推測。例如,當(dāng)我們開始在 ImageNet 分類任務(wù)中實(shí)現(xiàn)低于 4% 的 top-5 誤差時(shí),人們開始聲稱我們已經(jīng)「解決」了計(jì)算機(jī)視覺問題。我們可以肯定我們目前還沒有解決它;生成有關(guān)圖片或視頻內(nèi)容的準(zhǔn)確而精確的描述,或者為基礎(chǔ)的視覺查詢(比如「給我一個(gè)左數(shù)第二位女士的手提包的特寫鏡頭」)給出一個(gè)有意義的答案,仍然是一個(gè)巨大挑戰(zhàn),這些對人類來說都是理所當(dāng)然的事情。我們所取得的成功,盡管顯著但仍然是非常有限的,激起了人工智能幾乎得到解決的說法,這么說的依據(jù)是機(jī)器現(xiàn)在可以「理解」圖像或語言。而現(xiàn)實(shí)是我們離這個(gè)目標(biāo)還非常非常的遙遠(yuǎn)。
在試圖于深度學(xué)習(xí)上撈好處的初創(chuàng)公司的推銷中,我看見許多非常不切實(shí)際的期望。其中一些人只是天真地想得過于樂觀,但有些人基本上就是生活在一個(gè)虛構(gòu)的宇宙中——我已經(jīng)至少見過 3 個(gè)不同的初創(chuàng)公司聲稱他們將在未來幾年內(nèi)解決「通用人工智能(general artificial intelligence)」問題。祝他們好運(yùn)。大多數(shù)的這些公司沒有資金方面的問題,但他們相當(dāng)多的人會(huì)發(fā)現(xiàn)要想合適的退出會(huì)很難。特別是在風(fēng)險(xiǎn)投資和企業(yè)的決策者之中,很多失望會(huì)隨之而來,而且除非這是通過更大一波深度學(xué)習(xí)應(yīng)用方面成功的價(jià)值生產(chǎn)所取得的平衡,那么我們可能會(huì)在未來見證一個(gè)新的人工智能的冬天。
總之:深度學(xué)習(xí)已經(jīng)使我們真正的擅長將感知輸入(圖像、聲音、視頻)大數(shù)據(jù)集以及簡單的人類標(biāo)注目標(biāo)(例如一張圖片中的物體列表)轉(zhuǎn)化成可以自動(dòng)將輸入映射到目標(biāo)的模型。這是很不錯(cuò)的,而且還有大量有變革意義的實(shí)際應(yīng)用。但它仍然只是一件我們真的能夠做得很好的事情。我們不要把這個(gè)相當(dāng)有限的監(jiān)督學(xué)習(xí)方面的成功誤解成已經(jīng)「解決」了機(jī)器感知或者通用的機(jī)器智能。有關(guān)智能方面,我們所不了解的事依然遠(yuǎn)遠(yuǎn)多過我們確實(shí)了解的,并且盡管我們比十年前離通用人工智能更近了一步,那也只是一小步。
深度學(xué)習(xí)主要是在大數(shù)據(jù)上實(shí)現(xiàn)的。對于在樣本有限但高維度的數(shù)據(jù)(比如 fMRI )上實(shí)現(xiàn)深度學(xué)習(xí),你怎么看呢?
Fran?ois Chollet:深度學(xué)習(xí)從根本上來說是關(guān)于從原始數(shù)據(jù)中自動(dòng)化學(xué)習(xí)其特征的,這些原始數(shù)據(jù)被假定是相當(dāng)蕪雜且高度非結(jié)構(gòu)化的。淺層次的機(jī)器學(xué)習(xí)就像給機(jī)器投喂有雜質(zhì)的金塊,然后得到純凈的金塊,但是深度學(xué)習(xí)更像給機(jī)器投喂原始土塊( raw dirt ),然后得到純凈的金塊。你需要大量原始土塊才能淘出金子來;你需要給深度網(wǎng)絡(luò)大量數(shù)據(jù)才能從充滿噪聲的數(shù)據(jù)中自動(dòng)找出信號(hào)。對于高維度數(shù)據(jù)這尤其確實(shí)如此:數(shù)據(jù)的內(nèi)在維度越高,你需要越多的樣本來取樣數(shù)據(jù)流形( data manifold ),這對于從數(shù)據(jù)中提取優(yōu)質(zhì)特征往往是必要的。
還有一些實(shí)例,機(jī)器可能從「少量」樣本數(shù)據(jù)中學(xué)習(xí),但是這高度依賴于問題的本質(zhì)和你對「少量」的定義。例如,很容易用幾千甚至幾百個(gè)樣本來訓(xùn)練圖像分類器,通過精確調(diào)整一個(gè)之前用大規(guī)模類似圖像的數(shù)據(jù)集進(jìn)行訓(xùn)練過的網(wǎng)絡(luò)就能很好地做到這一點(diǎn)。在 fMRI 數(shù)據(jù)的例子中,嘗試深度學(xué)習(xí)技術(shù)對我來說并不是什么奇聞怪事。但我當(dāng)然不是 fMRI 上的專家。
為什么民主化機(jī)器學(xué)習(xí)很重要?
Fran?ois Chollet:有兩個(gè)原因:第一,因?yàn)闄C(jī)器學(xué)習(xí)和人工智能對于創(chuàng)造價(jià)值有巨大潛力,而且我們不應(yīng)該浪費(fèi)其中任何潛力。具有能促進(jìn)機(jī)器學(xué)習(xí)領(lǐng)域發(fā)展或使用人工智能創(chuàng)造偉大事物的驅(qū)動(dòng)力量和智慧的人,可能來自任何地方,而且我們有責(zé)任確保這些人能獲得所需的知識(shí)和工具來實(shí)現(xiàn)自身全部潛力。此外,我們應(yīng)該盡最大努力激勵(lì)世界上有能力的人,因此他們就會(huì)想奉獻(xiàn)才能來實(shí)現(xiàn)人工智能的創(chuàng)造價(jià)值。如果我們相信人工智能有很高的投資回報(bào),那么民主化人工智能就是理性策略。人工智能正要?jiǎng)?chuàng)造數(shù)量驚人的機(jī)會(huì),這些機(jī)會(huì)不應(yīng)該只給常春藤聯(lián)盟院?;蛘叱錾诿绹?人,而是應(yīng)該對所有人開放。
我認(rèn)為另一個(gè)原因也許更加微妙:為了社會(huì)和經(jīng)濟(jì)穩(wěn)定,我們應(yīng)該讓人工智能易于使用。在不遠(yuǎn)的將來,機(jī)器學(xué)習(xí)和人工智能使許多工作自動(dòng)化,人工智能創(chuàng)造的許多價(jià)值將為開發(fā)者逐漸帶來利益(但是總體來說,自由市場的動(dòng)態(tài)變化將確保每個(gè)人最終都能在某種程度上獲利)。一種達(dá)到平衡的方式讓人工智能創(chuàng)造的價(jià)值盡可能廣泛地普及,因而讓經(jīng)濟(jì)控制變得更加分散,防止有潛在危險(xiǎn)的集權(quán)。如果每個(gè)人能使用人工智能解決面臨的問題,那么人工智能就是一個(gè)幫助個(gè)人的工具。如果需要與一家特定公司(它很可能有你的數(shù)據(jù))簽合同才能使用人工智能,那么人工智能就成為一個(gè) 集中和整合權(quán)力的工具。我更喜歡前一種情況。
你曾考慮過在 Haskell 中建立深度學(xué)習(xí)模型嗎?
Fran?ois Chollet:用 Haskell 實(shí)現(xiàn)一個(gè) C++/CUDA 計(jì)算圖像引擎(例如TensorFlow 或是 Theano )的界面是可能的。但是在 Haskell 中從底層開始實(shí)現(xiàn)一個(gè)深度學(xué)習(xí)框架幾乎是不可能的,由此也可能產(chǎn)生巨大的缺陷。Haskell 甚至沒有一個(gè)好的可以上手的張量操作庫( tensor manipulation library )。
總的來說,甚至是為 Theano / TensorFlow 做一個(gè)界面,我認(rèn)為Haskell中的功能主義使得它不是很適合界定深度學(xué)習(xí)網(wǎng)絡(luò)。一個(gè)面向?qū)ο蟮幕蚴嵌喾妒降木幊陶Z言是最好的,例如 Keras 從根本上來說就是面向?qū)ο蟮摹?/p>
三、關(guān)于神經(jīng)網(wǎng)絡(luò):
這兩種情況中哪種在未來更有可能實(shí)現(xiàn):很好地理解如何系統(tǒng)地設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)或者能自我建立的神經(jīng)網(wǎng)絡(luò)?
Fran?ois Chollet:這是一種虛假的二分法;我認(rèn)為將人工智能應(yīng)用到神經(jīng)網(wǎng)絡(luò)開發(fā)中會(huì)產(chǎn)出實(shí)證的研究結(jié)果,這些結(jié)果會(huì)讓我們更加扎實(shí)地理解如何系統(tǒng)地設(shè)計(jì)人工智能。舉個(gè)例子,假設(shè)我們還不知道 ConvNets 在計(jì)算機(jī)視覺應(yīng)用上的效果:一個(gè)搜索許多可能的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)的進(jìn)化算法,在監(jiān)督學(xué)習(xí)任務(wù)的準(zhǔn)確指導(dǎo)下,可能會(huì)重新發(fā)明卷積和最大池化( max-pooling )。相同的還有起始?jí)K( inception blocks)或剩余連接( residual connections)。當(dāng)然,找出神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)的拓?fù)浼记芍皇钦麄€(gè)工作的一小部分;如果我們想做得認(rèn)真點(diǎn),就需要應(yīng)用人工智能搜索算法來找到全新的訓(xùn)練網(wǎng)絡(luò)的方法。
所以,簡單來說,兩種情況都會(huì)實(shí)現(xiàn),因?yàn)樗阉黩?qū)動(dòng)的設(shè)計(jì)和理論驅(qū)動(dòng)的設(shè)計(jì)都是能帶來進(jìn)步的有效且實(shí)際的方法。尤其是自我建立的神經(jīng)網(wǎng)絡(luò)很可能引導(dǎo)我們在理論上更好地理解它們是如何工作的,并對它們做出改進(jìn)。如果你仔細(xì)想一下,就會(huì)發(fā)現(xiàn)迄今為止深度學(xué)習(xí)上的大部分進(jìn)步都是隨便扔一把意大利面看看哪根能立在墻上這樣簡單粗暴做出來的。深度學(xué)習(xí)是一個(gè)幾乎完全實(shí)證性的研究領(lǐng)域。研究人員,其實(shí)是一些研究生,他們正在通過他們的一種大規(guī)模分布式搜索算法來實(shí)現(xiàn)深度學(xué)習(xí),尋找新的神經(jīng)設(shè)計(jì)模式。驅(qū)動(dòng)一個(gè)搜索算法的不僅是任何特定人工智能技術(shù),還有生物智能。這個(gè)過程的一部分現(xiàn)在是將來也肯定是自動(dòng)化的。
批量正則化的使用會(huì)降低深度神經(jīng)網(wǎng)絡(luò)的性能嗎?
Fran?ois Chollet:在我的經(jīng)歷中沒有遇到過。批量正則化的主要作用是通過減少在連續(xù)層間的內(nèi)部協(xié)變量轉(zhuǎn)移來幫助梯度( gradients )穿過更深的網(wǎng)絡(luò),所以批量正則化使得你可以訓(xùn)練更深的網(wǎng)絡(luò),這不能預(yù)先聚集,然后它用重要因子逐漸加快深度網(wǎng)絡(luò)的訓(xùn)練。沒有證據(jù)表明它增加或減少了網(wǎng)絡(luò)的性能。
四、關(guān)于算法和程序:
人工智能自己開發(fā)算法并寫軟件程序來解決復(fù)雜問題會(huì)有效代替程序員的工作嗎?
Fran?ois Chollet:要取代程序員還有一段很長的路要走,因?yàn)槌绦騿T不只是操縱代碼。他們在來自客戶或產(chǎn)品經(jīng)理的非正規(guī)的、專業(yè)不足的、經(jīng)常是錯(cuò)誤的技術(shù)說明( specification )和理應(yīng)解決潛在問題(這些問題甚至可能沒有被客戶/經(jīng)理很好地理解)的實(shí)際工作軟件之間搭建了橋梁。要做到這一點(diǎn)需要的不只是理解所寫的代碼,還要理解代碼運(yùn)行的整個(gè)環(huán)境。
當(dāng)然,我們距離創(chuàng)造能以接近人類水平操作代碼的人工智能還很遙遠(yuǎn)。但是我相信在不遠(yuǎn)也不近的未來這個(gè)問題很可能能得到解決。
然后將會(huì)發(fā)生的是我們將為軟件開發(fā)者創(chuàng)造出基于人工智能的編程助理。開發(fā)者將與具備先進(jìn)編程能力的人工智能或多或少地交流確切的技術(shù)規(guī)格,而且人類和人工智能將互動(dòng)交流,從而精心設(shè)計(jì)符合人類愿景的軟件。隨著這種助理的進(jìn)步,它們最終將被精通科技的產(chǎn)品經(jīng)理使用,到那時(shí),將不會(huì)有任何程序員了。通過使用人工智能解決問題而不是用自己的大腦大量生產(chǎn)代碼,人類將走向價(jià)值生產(chǎn)鏈的更高端。
Wysp 是什么?
Fran?ois Chollet:Wysp 是我?guī)啄昵盀榱藠蕵纷龅囊豢罹W(wǎng)頁應(yīng)用。它由兩個(gè)部分組成,一個(gè)是為藝術(shù)家準(zhǔn)備的社交網(wǎng)絡(luò),在那里人們可以分享他們的藝術(shù)品并收集他人的藝術(shù)品;另一個(gè)是學(xué)習(xí)平臺(tái),在這里人們可以提升他們的繪畫水平,他通過銷售繪畫課程盈利。
最近,Wysp 有 10 萬注冊用戶和大約 2 萬月活躍用戶。2 萬這個(gè)數(shù)字在過去幾年一直保持穩(wěn)定。由于我沒有時(shí)間來做 Wysp ,自最后一次升級(jí)起,它已經(jīng)完全自動(dòng)運(yùn)行了 2 年多了。這是一個(gè)火熱卻被遺忘的網(wǎng)頁應(yīng)用。
谷歌還在繼續(xù)做 DeepMath 的研發(fā)工作嗎?
Fran?ois Chollet:是的,他們忙于自動(dòng)化定理證明(還有其他與之相關(guān)的,更加宏偉的項(xiàng)目)。在未來你們可以期待更多的論文。
五、其他問題:
你最喜歡的機(jī)器學(xué)習(xí)算法是什么?
Fran?ois Chollet:矩陣因式分解(Matrix factorization):一個(gè)簡單漂亮的降維方法——降維是認(rèn)知的關(guān)鍵。推薦系統(tǒng)會(huì)是矩陣因式分解的一個(gè)大應(yīng)用。另一個(gè)我這幾年(從 2010 年使用視頻數(shù)據(jù)開始)一直使用的應(yīng)用是分解特征間的一個(gè)兩兩交互信息矩陣(或者是更常見的點(diǎn)互信息),該應(yīng)用可用于提取特征、計(jì)算詞嵌入、計(jì)算標(biāo)簽嵌入(我最近一篇論文「大規(guī)模圖像分類的信息理論標(biāo)簽嵌入」中的主題)等等。
當(dāng)被用在卷積環(huán)境中,這個(gè)算法可作為圖像和視頻的一個(gè)非常好的無監(jiān)督特征提取器。但是它還有一個(gè)問題:它從根本上是一個(gè)淺算法。只要有任何一種可用的監(jiān)督標(biāo)簽,深度神經(jīng)網(wǎng)絡(luò)就能很快超過它。
你的長期目標(biāo)是什么?
Fran?ois Chollet:這是老生常談了,但是我的最終目標(biāo)是解決智能問題。還不清楚的是這是否可能在 21 世紀(jì)早期成為現(xiàn)實(shí)。但是我將盡我最大的努力。
我有一個(gè)計(jì)劃。我認(rèn)為要實(shí)現(xiàn)機(jī)器智能的最短路徑是:首先,我們開發(fā)出一些方法讓專用人工智能操縱形式概念、編寫程序、運(yùn)行實(shí)驗(yàn)以及同時(shí)發(fā)展關(guān)于它們正在操縱的概念的數(shù)學(xué)直覺(甚至創(chuàng)造力)。然后我們使用我們的發(fā)現(xiàn)開發(fā)出能夠在人工智能研究以及其他領(lǐng)域上協(xié)助我們的人工智能科學(xué)家。一個(gè)專用的超越人類的人工智能將用于科學(xué)研究。這將極大地加快人工智能的發(fā)展。起初,我們用它來解決:例如,開發(fā)出代理來解決日益復(fù)雜和開放式的游戲。這種人工智能研究者通過與人類合作和不斷自我完善,將最終繼續(xù)前進(jìn), 解決智能——生物智能和機(jī)器智能—— 的一般問題。
所以我的長期目標(biāo)是:讓人工智能自力更生。這個(gè)過程的一個(gè)副作用是,能幫助解決許多突出的科學(xué)難題的研究助理會(huì)得到發(fā)展。將來,大多數(shù)科學(xué)研究將被人工智能獨(dú)立完成,或者被人類在過于依賴這種人工智能助理的基礎(chǔ)上完成。有了對人工智能的廣泛定義,人們可能爭論道,這種情況已經(jīng)發(fā)生了:現(xiàn)今的所有科學(xué)研究都依賴與計(jì)算機(jī)和軟件。這種趨勢將會(huì)只增不減,不久將延伸到智能助理,它們能抽象出日益高級(jí)的思維過程,包括直覺和創(chuàng)造力。
你曾今招過本科生做實(shí)習(xí)生嗎?你們在學(xué)術(shù)背景上有什么要求?
Fran?ois Chollet:當(dāng)然。谷歌(尤其是機(jī)器智能組織機(jī)構(gòu))沒有特別的學(xué)歷要求。你可能是一位輟學(xué)的高中生,只要你本身足夠有價(jià)值,你還是能進(jìn)入的。如果你想在沒有學(xué)術(shù)證書的情況下從事專門的機(jī)器學(xué)習(xí)研究,那你可能需要展示一些相關(guān)的個(gè)人項(xiàng)目:研究論文、開源代碼、新算法……好消息是,自己動(dòng)手開始人工智能研究幾乎沒什么成本。你所需要的所有知識(shí)和工具都可以免費(fèi)獲得。除了你的 GPU 和電費(fèi):你仍然需要為此付費(fèi),但一般來說還是負(fù)擔(dān)得起的。
對于那些在 MOOC(Udacity, Coursera, edx, MIT Opencourseware)或者書上自學(xué)機(jī)器學(xué)習(xí)/深度學(xué)習(xí)的人,你有什么建議?
Fran?ois Chollet:我認(rèn)為學(xué)習(xí)機(jī)器學(xué)習(xí)的最好方法是:
首先,清楚地理解關(guān)鍵算法是怎樣起作用的,試著自己在 Numpy 中重新實(shí)現(xiàn)一個(gè)有趣的例子(Numpy 卷積網(wǎng)絡(luò)、Numpy 多層感知器, Numpy LSTM)。
熟悉實(shí)際應(yīng)用,看看 Keras repo 提供的 Keras 實(shí)例。嘗試著修改它們,使得它們適應(yīng)新的數(shù)據(jù),并調(diào)整模型的結(jié)構(gòu)直到你得到了在你的問題上所能得到的最好結(jié)果。
通過 Kaggle 競賽獲得一種做研究和在現(xiàn)實(shí)生活中應(yīng)用數(shù)據(jù)科學(xué)的感覺。和其他人組隊(duì),也許能贏得比賽!
最后,你可以開始閱讀理論書籍(例如 Goodfellow, Bengio 和 Courville 的深度學(xué)習(xí)書籍)和論文來深化對于你正在進(jìn)行的工作的更加抽象和數(shù)學(xué)的理解。
你的書大概什么時(shí)候能完成?
Fran?ois Chollet:我希望可以在 2017 年一季度完成,它應(yīng)該會(huì)在 2017 年底上架。
本文由機(jī)器之心原創(chuàng),轉(zhuǎn)載請聯(lián)系本公眾號(hào)獲得授權(quán)。
------------------------------------------------
加入機(jī)器之心(全職記者/實(shí)習(xí)生):hr@almosthuman.cn
投稿或?qū)で髨?bào)道:editor@almosthuman.cn
廣告&商務(wù)合作:bd@almosthuman.cn
點(diǎn)擊閱讀原文,下載論文及 PPT↓↓↓
聯(lián)系客服