作為目前最普及的深度學(xué)習(xí)框架,TensorFlow 實(shí)不必多做介紹。
無(wú)論國(guó)內(nèi)國(guó)外,有相當(dāng)數(shù)量的程序員以 TensorFlow 入門(mén)深度學(xué)習(xí)開(kāi)發(fā),逐步走上職業(yè)機(jī)器學(xué)習(xí)工程師的道路。然而,TensorFlow 有一定的使用門(mén)檻。不管是編程范式,還是數(shù)學(xué)統(tǒng)計(jì)基礎(chǔ),都為非機(jī)器學(xué)習(xí)與數(shù)據(jù)科學(xué)背景的伙伴們帶來(lái)一定的上手難度,更不要提處理不同任務(wù)時(shí)需面對(duì)的各類(lèi)算法模型。
鑒于此,雷鋒網(wǎng)采訪了 ThoughtWorks 高級(jí)咨詢師佟達(dá)、數(shù)據(jù)架構(gòu)師白發(fā)川,兩位嘉賓將與大家分享新手入門(mén) TensorFlow 容易遇到的一些問(wèn)題,以及他們的入門(mén)經(jīng)歷與使用體驗(yàn)。詳見(jiàn)下文。
嘉賓介紹
佟達(dá),哈工大信息與通信工程碩士,在校時(shí)獲得美國(guó)數(shù)學(xué)競(jìng)賽建模一等獎(jiǎng)。當(dāng)年加入 TW 咨詢團(tuán)隊(duì)時(shí),創(chuàng)下最年輕成員的記錄。現(xiàn)任 ThoughtWorks 高級(jí)咨詢師,中國(guó)區(qū)數(shù)據(jù)團(tuán)隊(duì)資深技術(shù)專(zhuān)家。
白發(fā)川,ThoughtWorks 數(shù)據(jù)架構(gòu)師,深度學(xué)習(xí)框架 deeplearning.scala 貢獻(xiàn)者。設(shè)計(jì)實(shí)現(xiàn)了金融、工業(yè)、互聯(lián)網(wǎng)等多個(gè)領(lǐng)域的大數(shù)據(jù)平臺(tái)建設(shè)和數(shù)據(jù)處理。
下面,我們來(lái)看兩位老師對(duì)入門(mén) Tensorflow 的建議,以及他們的經(jīng)驗(yàn)之談。
- 新手入門(mén)深度學(xué)習(xí),選擇 TensorFlow 有哪些益處?
佟達(dá):首先,對(duì)于新手來(lái)說(shuō),TensorFlow 的環(huán)境配置包裝得真心非常好。相較之下,安裝 Caffe 要痛苦的多,如果還要再 CUDA 環(huán)境下配合 OpenCV 使用,對(duì)于新手來(lái)說(shuō),基本上不折騰個(gè)幾天是很難搞定的。
其次,基于 TensorFlow 的教學(xué)資源非常多,中英文的都有,這對(duì)于新手也是非常有幫助的。Google 做社區(qū)非常有一套,在中國(guó)有專(zhuān)門(mén)的一群人,會(huì)在第一時(shí)間把 Google 的開(kāi)發(fā)者相關(guān)的進(jìn)展翻譯成中文。
另外,由于有 Google 背書(shū),TensorFlow 從長(zhǎng)期演進(jìn)來(lái)看,基本上可以保證這個(gè)技術(shù)不會(huì)曇花一現(xiàn)。對(duì)于一個(gè)深度學(xué)習(xí)新手來(lái)說(shuō),學(xué)習(xí)任何一個(gè)工具,都有成本,如果剛學(xué)會(huì),這個(gè)工具就沒(méi)人用了,這個(gè)沉沒(méi)成本還是很高的。
白發(fā)川:TensorFlow 分為圖和 session 兩個(gè)部分,因?yàn)闃?gòu)建和執(zhí)行在不同的階段,所以很好的支持了模型的分布式,所以學(xué)習(xí) TF 可以比較好的理解模型的分布式計(jì)算,另外 TF 支持直接從分布式文件系統(tǒng),例如 HDFS 系統(tǒng)讀取數(shù)據(jù),所以可以說(shuō) TF 是接通機(jī)器學(xué)習(xí)和大數(shù)據(jù)的一個(gè)橋梁。
- 新人上手 TensorFlow 經(jīng)常會(huì)遇到哪些問(wèn)題或困難?
佟達(dá):第一個(gè)困難應(yīng)該是來(lái)自編程范式的變化,因?yàn)?TensorFlow 是聲明式開(kāi)發(fā)方式,通過(guò) Session 真正執(zhí)行程序,這和常見(jiàn)的開(kāi)發(fā)語(yǔ)言編程范式不太一樣。如果是曾經(jīng)有過(guò)函數(shù)式編程的 Lazy Evaluation 經(jīng)驗(yàn),接受起來(lái)會(huì)好一點(diǎn)。
當(dāng)掌握了基本的 TensorFlow 操作之后,就要使用 TensorFlow 做些真正有意義的事情。這時(shí)候的一大困難在于,TensorFlow 的報(bào)錯(cuò)信息不那么直觀,如果執(zhí)行出錯(cuò),新手很難從一大堆調(diào)用棧中找到有用的信息。
白發(fā)川:首選遇到的應(yīng)該是數(shù)學(xué)的知識(shí),TF 本身是一個(gè)深度學(xué)習(xí)的框架,和我們常規(guī)的程序框架例如 Spring,Hibernate 之類(lèi)的框架定位不太一樣,會(huì)偏向數(shù)學(xué)部分一點(diǎn),例如矩陣計(jì)算,求導(dǎo)等,雖然 TF 已經(jīng)封裝了對(duì)應(yīng)的計(jì)算的 API,但是我們還是需要知道這些概念性的知識(shí),這樣才知道應(yīng)該用什么 API。
其次 TF 通過(guò)圖的構(gòu)建和計(jì)算部分分離實(shí)現(xiàn)模型的分布式,這一塊的理解對(duì)初學(xué)者來(lái)說(shuō)有時(shí)候也不太容易。
- 學(xué)習(xí)遇到困難之后,有哪些途徑可以尋求幫助?
佟達(dá):如果身邊有人可以提供指導(dǎo),直接尋求幫助一定是最有效的。如果身邊沒(méi)有這樣的人可以提供幫助,那么 StackOverflow 是在線尋求幫助的首選。Google 的 TensorFlow 開(kāi)發(fā)團(tuán)隊(duì)會(huì)有人專(zhuān)門(mén)在 StackOverflow 上回答問(wèn)題,當(dāng)然除了 Google 的人,還有很多熱心的開(kāi)發(fā)者提供幫助,比如說(shuō)我(笑)。
白發(fā)川:目前 TF 的中文資料相對(duì)匱乏,所以優(yōu)先的參考途徑肯定是 TF 的官方 doc 文檔,目前極客學(xué)院對(duì) TF 官方文檔做了漢化翻譯,不過(guò)相對(duì)會(huì)比官方的延后一點(diǎn)。
- 有沒(méi)有推薦的學(xué)習(xí)資源?
佟達(dá):資源太多了,比如 Udacity 的 Deep Learning 課程,Coursera 上的 Machine Learning 課程,還有 Stanford 提供的課程錄像,比如 CS231n 和 CS224n。另外,被稱(chēng)為深度學(xué)習(xí)圣經(jīng)的《Deep Learning》也在網(wǎng)上(http://deeplearningbook.org)免費(fèi)提供。
白發(fā)川:Stanford 目前有很多針對(duì)機(jī)器學(xué)習(xí)的課程,例如 CS231N,還有針對(duì) TF 的 CS20SI,這些都是很好的課程。
- 是否推薦新手從 Keras 入手?除 Keras,還有哪些適配 TensorFlow 的第三方工具推薦新手使用?
佟達(dá):TensorFlow 的 API 比較底層,有時(shí)候要做一件很簡(jiǎn)單的事情,要寫(xiě)很多輔助代碼。而 Keras 的接口設(shè)計(jì)非常簡(jiǎn)潔,做同樣的事情,Keras 的代碼大概是 TensorFlow 的三分之一到五分之一。不過(guò)我認(rèn)為新手對(duì)兩者都應(yīng)該學(xué)習(xí)一下,這樣對(duì)于理解原理更有幫助。事實(shí)上,我甚至推薦連 TensorFlow 都不用,先用純 Python 自己做一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)。
除了 Keras 之外,tf slim,tflearn 等都是早期嘗試簡(jiǎn)化 TensorFlow 的工具,不過(guò)自從 1.0 開(kāi)始,TensorFlow 官方支持 Keras,估計(jì)以后 Keras 會(huì)成為主流。
另外,TensorBoard 是新手必須學(xué)會(huì)使用的,這個(gè)工具有非常好的可視化輔助工具,幫助工程師調(diào)試模型以及訓(xùn)練過(guò)程。tfdbg 是 1.0 之后發(fā)布的調(diào)試工具,可以在每一個(gè) step 中實(shí)時(shí)查看數(shù)據(jù)變化。不過(guò)這個(gè)工具目前能做的還不多,而且還有性能問(wèn)題,開(kāi)調(diào)試模式和非調(diào)試模式內(nèi)存相差好幾倍,所以還有很大的提升空間。
白發(fā)川:Keras 相比 TF 來(lái)說(shuō)封裝的更好,可以說(shuō) API 更加工程化,所以如果說(shuō)對(duì)于機(jī)器學(xué)習(xí)完全沒(méi)有概念,Keras 是一個(gè)不錯(cuò)的選擇。目前有很多圍繞 TF 進(jìn)行封裝的框架或者工具,例如 Keras 本身就是對(duì) TF 的包裝,其次 TF Learn 等也可嘗試。
- 能不能講講你們當(dāng)初上手 TensorFlow 的經(jīng)歷?學(xué)習(xí)過(guò)程中都遇到了哪些困難,又是如何解決的?
佟達(dá):我在使用 TensorFlow 之前,使用過(guò)其他一些機(jī)器學(xué)習(xí) / 深度學(xué)習(xí)框架,比如主要用于語(yǔ)音識(shí)別的 Kaldi,圖像識(shí)別的 Caffe,還有 Spark MLlib,DeepLearning4j 等。所以上手 TensorFlow 并沒(méi)有帶來(lái)特別大的困難。
當(dāng)用 TensorFlow 做的事情越來(lái)越復(fù)雜之后,我開(kāi)始嘗試擴(kuò)展 TensorFlow,比如寫(xiě)一些自定義的 Op。在 TensorFlow 中添加自定義 Op 需要用 C++ 實(shí)現(xiàn),編譯好之后,在 Python 里面講動(dòng)態(tài)庫(kù)鏈接進(jìn)來(lái)才能使用。這一過(guò)程還是有些復(fù)雜,尤其是 C++ 的代碼有問(wèn)題需要調(diào)試,需要使用 lldb(llvm 的 debug 工具,類(lèi)似 gdb),這對(duì)開(kāi)發(fā)這的要求比較高。另外 TensorFlow 的編譯使用的是 Bazel,這是谷歌開(kāi)源的一個(gè)多語(yǔ)言項(xiàng)目管理工具,要想把自定義的 Op 編譯出來(lái),還需要花點(diǎn)時(shí)間研究 Bazel。
實(shí)際上,Google 很成功的把 TensorFlow 封裝的很好,開(kāi)箱即用,然而,框架本身的復(fù)雜度還是很高,一旦你想要深入進(jìn)去,還是需要下很大功夫。
白發(fā)川:TF 不是我接觸的第一個(gè)深度學(xué)習(xí)框架。我是從大數(shù)據(jù)做起,到后來(lái)的開(kāi)始用 Spark MLlib 做開(kāi)發(fā),也使用過(guò) h2o 和 deeplearning4j 這些框架,最后才接觸 TF 的。所以對(duì)于我來(lái)說(shuō),更多的是學(xué)習(xí) TF 的 API 設(shè)計(jì)相關(guān)的改變,以及對(duì)比其他框架 TF 做了哪些差異化的地方。對(duì)于 API 這一塊,直接參考 TF 的 Doc 就是最好的方法。
不過(guò)我可以介紹一下入門(mén)到機(jī)器學(xué)習(xí)的經(jīng)歷,我最開(kāi)始的工作也是和大多數(shù)人一樣,從事 web 開(kāi)發(fā),或者 mobile 的開(kāi)發(fā),所以我的情況應(yīng)該和大多數(shù)人相同,后來(lái)我開(kāi)始接觸到機(jī)器學(xué)習(xí)的時(shí)候發(fā)現(xiàn)和之前的思維差別挺大的,首先在我們從事一般的像 mobile 之類(lèi)的開(kāi)發(fā)的時(shí)候,我們并不會(huì)關(guān)心什么是矩陣的逆,什么是函數(shù)的導(dǎo)數(shù),更加不會(huì)關(guān)心什么是鏈?zhǔn)角髮?dǎo),而在機(jī)器學(xué)習(xí)里面,這些都是基礎(chǔ),所以我又重新?lián)旎亓舜髮W(xué)的線性代數(shù)和微積分再次過(guò)了一遍。
TF 是個(gè)深度學(xué)習(xí)框架,所以使用 TF 的時(shí)候不可避免的要理解什么是隱層,什么是激活函數(shù),激活函數(shù)有哪些,以及如何定義損失函數(shù)等等這一些概念,對(duì)于這一塊我當(dāng)時(shí)除了調(diào)研一些書(shū)籍外也通過(guò)看 stanford 的一些課程來(lái)學(xué)習(xí),當(dāng)然過(guò)程中也和很多同行進(jìn)行交流和總結(jié),特別是對(duì)于調(diào)參這一塊,除了學(xué)習(xí)之外更多的需要自己進(jìn)行實(shí)踐。
- TensorFlow 升級(jí)到 1.0 版本之后,感覺(jué)到了哪些提升?
佟達(dá):對(duì)我來(lái)說(shuō),TensorFlow 1.0 最重要的變化在于高階 API,比如 Estimator,以及和 Keras 的集成,這些改變可以大幅度的減少我們構(gòu)建模型的代碼量。
另外,1.0 的 API 也經(jīng)過(guò)了一些調(diào)整,這導(dǎo)致一些舊代碼和新版本不兼容,不過(guò)從長(zhǎng)期維護(hù)來(lái)看,1.0 的 API 有更好的一致性,對(duì)于開(kāi)發(fā)者來(lái)說(shuō),還是利大于弊。
白發(fā)川:首先相比之前的版本,1.0 的速度肯定是變快了,這個(gè)官方也明確的提到了,并且也給出了一定的參考指標(biāo),TF 1.0 加入了 XLA,這也是為未來(lái)性能優(yōu)化做的基礎(chǔ)。
除了性能方面的體驗(yàn)外,在開(kāi)發(fā)中,TF 的 API 進(jìn)行的很大的修改,相比之前來(lái)說(shuō)更加的人性化,感覺(jué)起來(lái)有點(diǎn)像 numpy 的感覺(jué),所以如果不是 1.0 的代碼,可能會(huì)不兼容,不過(guò) TF 提供了轉(zhuǎn)換的腳本,可以方便直接把代碼轉(zhuǎn)換到 1.0。
TF1.0 提供了調(diào)試工具 TFBDG,無(wú)論是大數(shù)據(jù)還是機(jī)器學(xué)習(xí)相關(guān)的開(kāi)發(fā),調(diào)試始終不是那么順暢,而 1.0 提供的調(diào)試工具,可以說(shuō)正在逐漸的彌補(bǔ)這一塊,雖然目前還是有很多問(wèn)題,不過(guò)已經(jīng)有了很大的進(jìn)步。
- 你們認(rèn)為,目前 TensorFlow 有哪些局限性?其中又有哪些是開(kāi)發(fā)者可以利用第三方工具克服的?
佟達(dá):TensorFlow 的設(shè)計(jì)范式帶來(lái)的一個(gè)天生限制就是在 TensorFlow 中,想要?jiǎng)討B(tài)修改計(jì)算圖比較困難。實(shí)際上動(dòng)態(tài)修改計(jì)算圖的需求并不少見(jiàn),比如訓(xùn)練機(jī)器翻譯或者聊天機(jī)器人的模型,句子長(zhǎng)度不一樣,計(jì)算圖其實(shí)是不一樣的。以前,要解決這個(gè)問(wèn)題,就是設(shè)定一個(gè)比較長(zhǎng)的輸入長(zhǎng)度,對(duì)于比較短的句子,填充一些占位字符。今年早些時(shí)候,TensorFlow 發(fā)布了一個(gè)工具,TensorFlow Fold,可以相對(duì)方便的動(dòng)態(tài)修改計(jì)算圖。不過(guò)總的來(lái)說(shuō),TensorFlow 在計(jì)算圖的設(shè)計(jì)靈活性上還是有些欠缺。
白發(fā)川:目前來(lái)說(shuō),TF 要想發(fā)揮最大的效果,還是需要借助于 GPU,當(dāng)然這并不算 TF 的局限,應(yīng)該說(shuō)所有數(shù)值計(jì)算的框架都有這個(gè)特點(diǎn),對(duì)于這個(gè)目前大家的做法都是搭建自己的 GPU 集群,GOOGLE 甚至開(kāi)發(fā)了自己的 GPU:TPU。
雖然大家都比較認(rèn)可 TF 是工程化做的很好的深度學(xué)習(xí)框架,實(shí)際上它還是有一些門(mén)檻的,簡(jiǎn)單到 API 的設(shè)計(jì),復(fù)雜到模型的訓(xùn)練和調(diào)參,其實(shí)還是是有一定門(mén)檻的,相比來(lái)說(shuō) Keras 的 API 設(shè)計(jì)更加直觀化。
TF 雖然提供了 java 和 go 的 api,不過(guò)目前還不太成熟和穩(wěn)定,所以對(duì)于開(kāi)發(fā)語(yǔ)言,我還是推薦 python,或者說(shuō)我建議大家想往這個(gè)方向?qū)W習(xí)的時(shí)候,盡量掌握 python 這門(mén)語(yǔ)言,在我們實(shí)際開(kāi)發(fā)中,會(huì)有很多用處的。
- TensorFlow 在 ThoughtWorks 的業(yè)務(wù)中扮演了什么角色?對(duì)于公司進(jìn)行產(chǎn)品開(kāi)發(fā),有沒(méi)有更合適的選擇?
佟達(dá):TensorFlow 是 ThoughtWorks 目前在深度學(xué)習(xí)項(xiàng)目上的首選平臺(tái),因?yàn)樗墓こ袒龅拇_實(shí)要比其他框架成熟,同時(shí)又和 Hadoop、Kubernetes 這些我們已經(jīng)在很多項(xiàng)目中使用的工具兼容。
至于 “更合適”,現(xiàn)在還不太好下判斷,F(xiàn)acebook 的 PyTorch 口碑很不錯(cuò),MxNet 被 Amazon 和很多 IT 公司支持,而 Intel 的 BigDL 另辟蹊徑,在 CPU 上優(yōu)化深度學(xué)習(xí),而且和 Spark 無(wú)縫集成,看起來(lái)對(duì)于已經(jīng)使用云計(jì)算和大數(shù)據(jù)工具的公司來(lái)說(shuō)吸引力也非常大。所以在深度學(xué)習(xí)框架這個(gè)領(lǐng)域,目前處于百花齊放的狀態(tài),最后誰(shuí)會(huì)勝出,還不好說(shuō)。
白發(fā)川:ThoughtWorks 有自己的機(jī)器學(xué)習(xí)團(tuán)隊(duì),主要方向?yàn)榇髷?shù)據(jù)和人工智能,當(dāng)然這兩個(gè)方向的劃分并不完全獨(dú)立的,實(shí)際上在實(shí)際開(kāi)發(fā)中我們是將兩者結(jié)合,實(shí)現(xiàn)基于大數(shù)據(jù)下的人工智能,對(duì)于深度學(xué)習(xí)的框架,我們 spike 過(guò)目前存在的大多數(shù)框架,最終選擇了 TF,所以我們的工作都是將 TF 工程化和市場(chǎng)化。
在選擇對(duì)比了不同的框架之后,我們也比較明確現(xiàn)有框架的一些優(yōu)缺點(diǎn)和局限,所以我們也研發(fā)了 TW 自己的深度學(xué)習(xí)框架:deeplearning.scala,框架本身是基于 scala 開(kāi)發(fā),具體的信息大家可以在 github 上看到,目前是開(kāi)源的。
“TensorFlow & 神經(jīng)網(wǎng)絡(luò)算法高級(jí)應(yīng)用班” 要開(kāi)課啦!
雷鋒網(wǎng)與跨國(guó) IT 服務(wù)巨頭 ThoughtWorks,聯(lián)合舉辦線上培訓(xùn)課程 “TensorFlow & 神經(jīng)網(wǎng)絡(luò)算法高級(jí)應(yīng)用班” 將上線 mooc.ai,特邀佟達(dá)、白發(fā)川兩位老師向?qū)W員系統(tǒng)性地傳道解惑。
你是否一直希望有個(gè)老司機(jī)能手把手帶領(lǐng)入門(mén)?這就是一次好機(jī)會(huì)。
免費(fèi)福利:下周,兩位老師將以 “TensorFlow 在各場(chǎng)景的應(yīng)用以及注意事項(xiàng)” 為主題,在雷鋒網(wǎng) APP 進(jìn)行公開(kāi)課直播。在培訓(xùn)開(kāi)始之前,讓大家對(duì)于 TensorFlow 能做什么以及實(shí)戰(zhàn)流程,做個(gè)初步了解。時(shí)長(zhǎng)一小時(shí),免費(fèi)觀看答疑,敬請(qǐng)關(guān)注!
ThoughtWorks
授課方 ThoughtWorks 是全球領(lǐng)先的 IT 咨詢公司,聯(lián)合國(guó)婦女兒童組織、世界衛(wèi)生組織合作伙伴。總部在芝加哥,42 個(gè)辦公室分布在全球的 15 個(gè)國(guó)家。
2012 年,ThoughtWorks 排在 Google,F(xiàn)acebook 之前,被評(píng)為全球最難面試的公司。
2016 年,ThoughtWorks 力壓群雄,獲得全球 “最佳女性科技人員雇主” 獎(jiǎng)項(xiàng)。
培訓(xùn)課介紹:
從初級(jí)到高級(jí),理論 + 實(shí)戰(zhàn),一站式深度了解 TensorFlow!
本課程面向深度學(xué)習(xí)開(kāi)發(fā)者,講授如何利用 TensorFlow 解決圖像識(shí)別、文本分析等具體問(wèn)題。課程跨度為 10 周,將從 TensorFlow 的原理與基礎(chǔ)實(shí)戰(zhàn)技巧開(kāi)始,一步步教授學(xué)員如何在 TensorFlow 上搭建 CNN、自編碼、RNN、GAN 等模型,并最終掌握一整套基于 TensorFlow 做深度學(xué)習(xí)開(kāi)發(fā)的專(zhuān)業(yè)技能。
兩名授課老師佟達(dá)、白發(fā)川身為 ThoughtWorks 的資深技術(shù)專(zhuān)家,具有豐富的大數(shù)據(jù)平臺(tái)搭建、深度學(xué)習(xí)系統(tǒng)開(kāi)發(fā)項(xiàng)目經(jīng)驗(yàn)。
開(kāi)課時(shí)間:4 月 25 日(星期二)開(kāi)課,每周二、四晚 20:00-21:00
開(kāi)課時(shí)長(zhǎng):總學(xué)時(shí) 20 小時(shí),分 10 周完成,每周 2 次,每次 1 個(gè)小時(shí)
授課地址:Tensorflow & 神經(jīng)網(wǎng)絡(luò)算法高級(jí)應(yīng)用班
線上授課,開(kāi)放預(yù)約!
via 三川 (AI 研習(xí)社)