萬事開頭難!入門TensorFlow,這9個問題TF Boys 必須要搞清楚
作為目前最普及的深度學習框架,TensorFlow 實不必多做介紹。
無論國內國外,有相當數量的程式師以 TensorFlow 入門深度學習開發,逐步走上職業機器學習工程師的道路。然而,TensorFlow 有一定的使用門檻。不管是程式設計範式,還是數學統計基礎,都為非機器學習與資料科學背景的夥伴們帶來一定的上手難度,更不要提處理不同任務時需面對的各類演算法模型。
鑒於此,雷鋒網將與跨國 IT 服務巨頭 ThoughtWorks,聯合舉辦線上培訓課程“
TensorFlow & 神經網路演算法高級應用班
”,將於 4 月 25 日星期二開課。
開課前夕,兩位授課老師——ThoughtWorks 高級諮詢師佟達、資料架構師白髮川接受了雷鋒網的採訪,
與大家分享新手入門 TensorFlow 容易遇到的一些問題,以及他們的入門經歷與使用體驗。
詳見下文。
嘉賓介紹
佟達,哈工大資訊與通信工程碩士,在校時獲得美國數學競賽建模一等獎。當年加入 TW 諮詢團隊時,創下最年輕成員的記錄。現任 ThoughtWorks 高級諮詢師,中國區資料團隊資深技術專家。
白髮川,ThoughtWorks 數據架構師,深度學習框架 deeplearning.scala 貢獻者。設計實現了金融、工業、互聯網等多個領域的大資料平臺建設和資料處理。
下面,我們來看兩位老師對入門 Tensorflow 的建議,以及他們的經驗之談。
新手入門深度學習,選擇 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 & 神經網路演算法高級應用班”要開課啦!
本月底,佟達、白髮川兩位老師主持的 TensorFlow 培訓將上線 mooc.ai,向學員系統性地傳道解惑。
你是否一直希望有個老司機能手把手帶領入門?這就是一次好機會。
免費福利:
下周,兩位老師將以 “TensorFlow 在各場景的應用以及注意事項”為主題,在雷鋒網 APP 進行公開課直播。在培訓開始之前,讓大家對於 TensorFlow 能做什麼以及實戰流程,做個初步瞭解。時長一小時,免費觀看答疑,敬請關注!
ThoughtWorks
授課方 ThoughtWorks 是全球領先的 IT 諮詢公司,聯合國婦女兒童組織、世界衛生組織合作夥伴。總部在芝加哥,42 個辦公室分佈在全球的 15 個國家。
2012年,ThoughtWorks 排在 Google,Facebook 之前,被評為全球最難面試的公司。
2016 年,ThoughtWorks 力壓群雄,獲得全球“最佳女性科技人員雇主”獎項。
培訓課介紹:
從初級到高級,理論+實戰,一站式深度瞭解 TensorFlow!
本課程面向深度學習開發者,講授如何利用 TensorFlow 解決圖像識別、文本分析等具體問題。課程跨度為 10 周,將從 TensorFlow 的原理與基礎實戰技巧開始,一步步教授學員如何在 TensorFlow 上搭建 CNN、自編碼、RNN、GAN 等模型,並最終掌握一整套基於 TensorFlow 做深度學習開發的專業技能。
兩名授課老師佟達、白髮川身為 ThoughtWorks 的資深技術專家,具有豐富的大資料平臺搭建、深度學習系統開發專案經驗。
開課時間:4 月 25 日(星期二)開課,每週二、四晚 20:00-21:00
開課時長:總學時 20 小時,分 10 周完成,每週2次,每次 1個小時
授課地址:
http://www.mooc.ai/course/82
線上授課,開放預約!