1. 程式人生 > >問題集錄--新手入門深度學習,選擇TensorFlow 好嗎?

問題集錄--新手入門深度學習,選擇TensorFlow 好嗎?

pan 思維 基本上 內存 自己的 gpu ati 其中 新手入門

新手入門深度學習,選擇 TensorFlow 有哪些益處?

佟達:首先,對於新手來說,TensorFlow的環境配置包裝得真心非常好。相較之下,安裝Caffe要痛苦的多,如果還要再CUDA環境下配合OpenCV使用,對於新手來說,基本上不折騰個幾天是很難搞定的。

其次,基於TensorFlow的教學資源非常多,中英文的都有,這對於新手也是非常有幫助的。Google做社區非常有一套,在中國有專門的一群人,會在第一時間把Google的開發者相關的進展翻譯成中文。

另外,由於有Google背書,TensorFlow從長期演進來看,基本上可以保證這個技術不會曇花一現。對於一個深度學習新手來說,學習任何一個工具,都有成本,如果剛學會,這個工具就沒人用了,這個沈沒成本還是很高的。

白發川:TensorFlow分為圖和session兩個部分,因為構建和執行在不同的階段,所以很好的支持了模型的分布式,所以學習TF可以比較好的理解模型的分布式計算,另外TF支持直接從分布式文件系統,例如HDFS系統讀取數據,所以可以說TF是接通機器學習和大數據的一個橋梁。

新人上手 TensorFlow 經常會遇到哪些問題或困難?

佟達:第一個困難應該是來自編程範式的變化,因為TensorFlow是聲明式開發方式,通過Session真正執行程序,這和常見的開發語言編程範式不太一樣。如果是曾經有過函數式編程的Lazy Evaluation經驗,接受起來會好一點。

當掌握了基本的TensorFlow操作之後,就要使用TensorFlow做些真正有意義的事情。這時候的一大困難在於,TensorFlow的報錯信息不那麽直觀,如果執行出錯,新手很難從一大堆調用棧中找到有用的信息。

白發川:首選遇到的應該是數學的知識,TF本身是一個深度學習的框架,和我們常規的程序框架例如Spring,Hibernate之類的框架定位不太一樣,會偏向數學部分一點,例如矩陣計算,求導等,雖然TF已經封裝了對應的計算的API,但是我們還是需要知道這些概念性的知識,這樣才知道應該用什麽API。

其次TF通過圖的構建和計算部分分離實現模型的分布式,這一塊的理解對初學者來說有時候也不太容易。

學習遇到困難之後,有哪些途徑可以尋求幫助?

佟達:如果身邊有人可以提供指導,直接尋求幫助一定是最有效的。如果身邊沒有這樣的人可以提供幫助,那麽StackOverflow是在線尋求幫助的首選。Google的TensorFlow開發團隊會有人專門在StackOverflow上回答問題,當然除了Google的人,還有很多熱心的開發者提供幫助,比如說我(笑)。

白發川:目前TF的中文資料相對匱乏,所以優先的參考途徑肯定是TF的官方doc文檔,目前極客學院對TF官方文檔做了漢化翻譯,不過相對會比官方的延後一點。

有沒有推薦的學習資源?

佟達:資源太多了,比如Udacity的Deep Learning課程,Coursera上的Machine Learning課程,還有Stanford提供的課程錄像,比如CS231n和CS224n。另外,被稱為深度學習聖經的《Deep Learning》也在網上(deeplearningbook.org)免費提供。

白發川:Stanford目前有很多針對機器學習的課程,例如CS231N,還有針對TF的CS20SI,這些都是很好的課程。

是否推薦新手從 Keras 入手?除 Keras,還有哪些適配 TensorFlow 的第三方工具推薦新手使用?

佟達: TensorFlow的API比較底層,有時候要做一件很簡單的事情,要寫很多輔助代碼。而Keras的接口設計非常簡潔,做同樣的事情,Keras的代碼大概是TensorFlow的三分之一到五分之一。不過我認為新手對兩者都應該學習一下,這樣對於理解原理更有幫助。事實上,我甚至推薦連TensorFlow都不用,先用純Python自己做一個簡單的神經網絡。

除了Keras之外,tf slim,tflearn等都是早期嘗試簡化TensorFlow的工具,不過自從1.0開始,TensorFlow官方支持Keras,估計以後Keras會成為主流。

另外,TensorBoard是新手必須學會使用的,這個工具有非常好的可視化輔助工具,幫助工程師調試模型以及訓練過程。tfdbg是1.0之後發布的調試工具,可以在每一個step中實時查看數據變化。不過這個工具目前能做的還不多,而且還有性能問題,開調試模式和非調試模式內存相差好幾倍,所以還有很大的提升空間。

白發川:Keras相比TF來說封裝的更好,可以說API更加工程化,所以如果說對於機器學習完全沒有概念,Keras是一個不錯的選擇。目前有很多圍繞TF進行封裝的框架或者工具,例如Keras本身就是對TF的包裝,其次TF Learn等也可嘗試。

能不能講講你們當初上手 TensorFlow 的經歷?學習過程中都遇到了哪些困難,又是如何解決的?

佟達:我在使用TensorFlow之前,使用過其他一些機器學習/深度學習框架,比如主要用於語音識別的Kaldi,圖像識別的Caffe,還有Spark MLlib,DeepLearning4j等。所以上手TensorFlow並沒有帶來特別大的困難。

當用TensorFlow做的事情越來越復雜之後,我開始嘗試擴展TensorFlow,比如寫一些自定義的Op。在TensorFlow中添加自定義Op需要用C++實現,編譯好之後,在Python裏面講動態庫鏈接進來才能使用。這一過程還是有些復雜,尤其是C++的代碼有問題需要調試,需要使用lldb(llvm的debug工具,類似gdb),這對開發這的要求比較高。另外TensorFlow的編譯使用的是Bazel,這是谷歌開源的一個多語言項目管理工具,要想把自定義的Op編譯出來,還需要花點時間研究Bazel。

實際上,Google很成功的把TensorFlow封裝的很好,開箱即用,然而,框架本身的復雜度還是很高,一旦你想要深入進去,還是需要下很大功夫。

白發川:TF不是我接觸的第一個深度學習框架。我是從大數據做起,到後來的開始用Spark MLlib做開發,也使用過h2o和deeplearning4j這些框架,最後才接觸TF的。所以對於我來說,更多的是學習TF的API設計相關的改變,以及對比其他框架TF做了哪些差異化的地方。對於API這一塊,直接參考TF的Doc就是最好的方法。

不過我可以介紹一下入門到機器學習的經歷,我最開始的工作也是和大多數人一樣,從事web開發,或者mobile的開發,所以我的情況應該和大多數人相同,後來我開始接觸到機器學習的時候發現和之前的思維差別挺大的,首先在我們從事一般的像mobile之類的開發的時候,我們並不會關心什麽是矩陣的逆,什麽是函數的導數,更加不會關心什麽是鏈式求導,而在機器學習裏面,這些都是基礎,所以我又重新撿回了大學的線性代數和微積分再次過了一遍。

TF是個深度學習框架,所以使用TF的時候不可避免的要理解什麽是隱層,什麽是激活函數,激活函數有哪些,以及如何定義損失函數等等這一些概念,對於這一塊我當時除了調研一些書籍外也通過看stanford的一些課程來學習,當然過程中也和很多同行進行交流和總結,特別是對於調參這一塊,除了學習之外更多的需要自己進行實踐。

TensorFlow 升級到 1.0 版本之後,感覺到了哪些提升?

佟達:對我來說,TensorFlow 1.0最重要的變化在於高階API,比如Estimator,以及和Keras的集成,這些改變可以大幅度的減少我們構建模型的代碼量。

另外,1.0的API也經過了一些調整,這導致一些舊代碼和新版本不兼容,不過從長期維護來看,1.0的API有更好的一致性,對於開發者來說,還是利大於弊。

白發川:首先相比之前的版本,1.0的速度肯定是變快了,這個官方也明確的提到了,並且也給出了一定的參考指標,TF 1.0加入了XLA,這也是為未來性能優化做的基礎。

除了性能方面的體驗外,在開發中,TF的API進行的很大的修改,相比之前來說更加的人性化,感覺起來有點像numpy的感覺,所以如果不是1.0的代碼,可能會不兼容,不過TF提供了轉換的腳本,可以方便直接把代碼轉換到1.0。

TF1.0提供了調試工具TFBDG,無論是大數據還是機器學習相關的開發,調試始終不是那麽順暢,而1.0提供的調試工具,可以說正在逐漸的彌補這一塊,雖然目前還是有很多問題,不過已經有了很大的進步。

你們認為,目前 TensorFlow 有哪些局限性?其中又有哪些是開發者可以利用第三方工具克服的?

佟達:TensorFlow的設計範式帶來的一個天生限制就是在TensorFlow中,想要動態修改計算圖比較困難。實際上動態修改計算圖的需求並不少見,比如訓練機器翻譯或者聊天機器人的模型,句子長度不一樣,計算圖其實是不一樣的。以前,要解決這個問題,就是設定一個比較長的輸入長度,對於比較短的句子,填充一些占位字符。今年早些時候,TensorFlow發布了一個工具,TensorFlow Fold,可以相對方便的動態修改計算圖。不過總的來說,TensorFlow在計算圖的設計靈活性上還是有些欠缺。

白發川:目前來說,TF要想發揮最大的效果,還是需要借助於GPU,當然這並不算TF的局限,應該說所有數值計算的框架都有這個特點,對於這個目前大家的做法都是搭建自己的GPU集群,GOOGLE甚至開發了自己的GPU:TPU。

雖然大家都比較認可TF是工程化做的很好的深度學習框架,實際上它還是有一些門檻的,簡單到API的設計,復雜到模型的訓練和調參,其實還是是有一定門檻的,相比來說Keras的API設計更加直觀化。

TF雖然提供了java和go的api,不過目前還不太成熟和穩定,所以對於開發語言,我還是推薦python,或者說我建議大家想往這個方向學習的時候,盡量掌握python這門語言,在我們實際開發中,會有很多用處的。

TensorFlow 在 ThoughtWorks 的業務中扮演了什麽角色?對於公司進行產品開發,有沒有更合適的選擇?

佟達:TensorFlow是 ThoughtWorks 目前在深度學習項目上的首選平臺,因為它的工程化做的確實要比其他框架成熟,同時又和Hadoop、Kubernetes這些我們已經在很多項目中使用的工具兼容。

至於“更合適”,現在還不太好下判斷,Facebook的PyTorch口碑很不錯,MxNet被Amazon和很多IT公司支持,而Intel的BigDL另辟蹊徑,在CPU上優化深度學習,而且和Spark無縫集成,看起來對於已經使用雲計算和大數據工具的公司來說吸引力也非常大。所以在深度學習框架這個領域,目前處於百花齊放的狀態,最後誰會勝出,還不好說。

白發川:ThoughtWorks 有自己的機器學習團隊,主要方向為大數據和人工智能,當然這兩個方向的劃分並不完全獨立的,實際上在實際開發中我們是將兩者結合,實現基於大數據下的人工智能,對於深度學習的框架,我們spike過目前存在的大多數框架,最終選擇了TF,所以我們的工作都是將TF工程化和市場化。

在選擇對比了不同的框架之後,我們也比較明確現有框架的一些優缺點和局限,所以我們也研發了TW自己的深度學習框架:deeplearning.scala,框架本身是基於scala開發,具體的信息大家可以在github上看到,目前是開源的。

問題集錄--新手入門深度學習,選擇TensorFlow 好嗎?