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