前言
✤ 緣起
2017 年2 月,TensorFlow 的首屆開發者高峰會(2017 TensorFlow DevSummit)在美國的加州舉行。在會上,Google 公司宣佈正式發佈TensorFlow1.0 版本。本書就是以最新為基礎的1.1.0 版本來介紹TensorFlow 的技術解析和實戰。
人工智慧大潮來了。2016 年,AlphaGo 擊敗圍棋大師李世石後,人工智慧的應用仿佛一夜之間遍地開花。在科技潮流的大環境中,現在矽谷的用人單位越來越偏好雇用既懂理論(思考者)又懂程式設計(執行者)的工程師。思考者的日常工作是閱讀文獻以求產生想法,而執行者則是撰寫程式來實現應用。但是要成為一名真正的工程師,學習機器學習是將思考者和執行者相結合的最快途徑。
眾所皆知,人工智慧是進階計算智慧最寬泛的概念,機器學習是研究人工智慧的工具,深度學習是機器學習的子集,是目前研究領域卓有成效的學習方法。深度學習的架構有很多,而TensorFlow 將神經網路、演算法這些平時停留在理論層面的知識,組織成一個平台架構,集合了神經網路的各個演算法函數組成一個工具箱,讓廣大工程師可以專心建造自己的目標領域的「輪子」,而且TensorFlow 是以Python 語言為基礎的,極易上手,這些優勢迅速吸引了全世界的工程師。
我曾經也是一名前後端開發工程師,更專注於後端工程方向,而潛心研究深度學習和TensorFlow 後,我被TensorFlow 深深地迷住了。我發現它對各行各業將有很深遠的影響,並且會大幅地解放工作力。
與傳統工程師的主要工作—實現產品需求或設計高可用性架構不同,深度學習讓人歸納和抽象人類是怎樣了解和看待問題的,並把這種方式教給機器。舉例來說,在AlphaGo 的研究中,人們需要先抽象出人類思考圍棋的方式,然後將這種方式抽象成演算法,並且配合人類大腦建置中神經網路的傳輸來實現這些演算法。這時,工程師不會再寫實現業務需求的邏輯程式,而是深度學習中將神經網路的「黑盒」和模型效果非常好卻缺乏「可解釋性」的特性相結合,在次次實驗中儘量找出規律。記得美國前總統甘迺迪在宣佈登月計畫時曾說:「我們選擇去月球,不是因為它簡單,而是因為它困難。」今天,我相信,所有致力於人工智慧方向的工程師之所以自豪地去研究,也不是因為它簡單,而是因為它困難。我們研究它,是因為立足於現在這個點往前看,我們看不到已經建好的高樓大廈,看到的是一片等待我們去發掘的空曠的大地,而這個發掘過程需要的是十足的遠見、決心、勇氣和信心。
我在學習的過程中,由於深度學習的資料英文的居多,在了解上走了不少彎路。我把學到的知識和原理用心整理並用文字表述出來,寫成這本書,希望能幫助沒有接觸過深度學習的廣大程式設計師迅速上手,而不再被英文閱讀了解擋在門外。說實話,TensorFlow 的文件以及API 介面是比較抽象的,再加上有一些從工程方向轉入深度學習的人以前沒有過深度學習的經驗,所以如果帶著工程類別程式研發的思維去學習,甚至是實現業務邏輯需求的思維去學習,效果會很差。我希望這本書能為讀者呈現一個通俗容易、具體生動的TensorFlow,讓讀者迅速走入深度學習的世界。
在本書的寫作過程中,為了能充分擠出時間,深夜當我困倦時,我常常讓自己以最不舒服的方式入睡,希望能儘量少睡,以此增加仔細鑽研的時間。有時我還會開啟電視,將音量設定為靜音,感受房間中電視背景光閃爍的動感,以此提醒自己時間的流動。剛開始我會坐在工作環境前寫作,累了又會抱著筆記型電腦坐在床上繼續寫作,有時會寫著寫著不知不覺地睡著,淩晨三四點鐘又醒來,感受黑夜裡的那片安寧,心情頓時平靜,再次投入到鑽研中。每每有靈感,都非常激動;每每再次深入一個概念,增刪易稿,把原理逼近真相地講透,都讓我非常有成就感。
✤ 針對的讀者
我素來不愛深入數學公式的推導原理,對符號也很茫然,只是在必須要用時才對這些公式進行詳細的推導,但是我卻對這些原理在應用層面如何使用出奇地有興趣。本書的目標就是帶讀者進入造「應用輪子」的大門。我會以最少的數學公式講清楚如何用TensorFlow 實現CNN、RNN,如何在實戰中使用TensorFlow 進行圖片分類、人臉識別和自然語言處理等,以及如何將想訓練的資料、想實現的應用親手做出來。
同時,Python 語言是一種相當進階的語言,有「可執行的虛擬程式碼」的美譽,可以用極少的程式行去完成一個複雜的功能,同時Python 還有極為豐富的協力廠商函數庫,讓全世界很多工程師的開發工作變得異常簡單。TensorFlow 是用Python 語言實現的架構,對很多學生來說非常容易上手,當然,如果是有開發經驗的工程師,就更容易學會。如果說設計神經網路模型像是蓋一棟大樓,那麼TensorFlow 強大的API 用起來會讓人感覺就像搭積木一樣容易。因此,懂點Python,即使不怎麼懂數學和演算法原理也沒關係,儘管跟著我一起學便是。
在翻譯學上有一個概念叫作「平行語料庫」,這個概念來自製作於西元前196 年的古埃及羅塞塔石碑,石碑上用希臘文字、古埃及文字和當時的通俗體文字刻了同樣的內容。在本書進行某個概念的說明時,雖然是用Python 程式作示範,但TensorFlow 前端開發同時也支援多種上層語,本書說明過程中也會兼顧到用C++、Java、Go 語言做開發的讀者。
我希望,本書成為不同領域的讀者進入人工智慧領域的「墊腳石」,也希望所有的讀者在人生路上能利用TensorFlow 這個工具大放異彩。
我有很重的強迫症,因此,在撰寫本書的過程中,閱讀了國內外很多與TensorFlow 相關的資料,對本書的目錄結構和架構經過很多次反覆琢磨和調整;在寫完之後,我又從頭到尾地讀過好幾遍,並且和了解TensorFlow不同方面的人反覆交流,根據建議又反覆修改。這一切就是希望它能通俗容易,把讀者快速領入深度學習的大門。
這扇門的背後是異彩紛呈的,身懷這門技藝的人是應該非常自豪的,但這扇門的背後也是非常辛苦的,有時資料需要自己去想辦法解決,還需要每天看論文,知曉最新科研成果,給自己以啟發,反覆地做實驗,研究演算法和模型,尋求提升和解決方法,經常會遇到在很長一段時間沒有想的情況。但是,只要做的東西是開創的,令人稱讚的,就會開心地享受這個過程。
我專為本書讀者建立了一個QQ 交流群(320420130),希望在群裡與大家深入討論和交流學習過程中遇到的問題,也希望與大家分享最新的研究成果。
✤ 致謝
非常感謝Google 大腦的工程師Jeff Dean,在得知我目前正在寫這本書的時候,他特地發了郵件鼓勵我:「聽說你寫了一本關於TensorFlow 的書,真是太好了。希望你很享受學習TensorFlow 的這段經歷,並享受運用TensorFlow 完成各種工作的這種體驗。我非常高興你為中文社區寫這本書。」這讓我更堅定了傳播TensorFlow 深度學習的決心。
感謝百度矽谷AI 實驗室資深科學家王益老師關於AI on Kubernetes 的建議。
感謝在百度工作時的同事陳後江,在寫作過程中,我們有時在週末的深夜還進行討論,印象最深的一次是在大冬天晚上,我們剛好都在外面,相互通了20 多分鐘電話,手凍得像冰棒似的。還要感謝童牧晨玄,他也是深度學習領域的同好,對關鍵的概念了解得非常透徹,能十分精準地講出原理。
非常感謝《Redis 實戰》一書的譯者黃健宏,他對技術寫作有很豐富的經驗。和他聊書總是能聊到淩晨以後,討論到暢快處,甚至聊到天亮,他對問題的思考就像是「演雜技」一樣,精準又恰到好處;同時,他又是一個非常讓人感到溫暖和踏實的朋友。
非常感謝iOS 資深開發者唐巧,他在國內社區樂於分享的精神造福了很多的技術從業者,也正是他的推薦讓我和本書的編輯楊海玲老師結下這段美好的情誼。非常感謝人民郵電出版社的楊海玲編輯,她最開始想到這個寫作方向,我們一起一點一點地討論書的內容,確認書的寫作架構。在寫作過程中,她的細緻、專業、獨到的見解也為本書增色不少。她對內容嚴謹和認真的態度令人動容。
非常感謝中科院計算所劉昕博士對本書第6 章神經網路的發展提出的建議;感謝曾經的百度同事畢驍鵬對第8 章、第9 章、第13 章、第14 章、第20 章、第21 章提出的極為細緻的建議,尤其是他擅長GPU 和FPGA的部分,對本書的硬體加速提供了很多建議;感謝中科院智慧資訊處理重點實驗室常務副主任山世光對第10 章人臉識別部分提出的建議;感謝劉元震對本書第11 章提出的建議;感謝我的好朋友容器專家苗立堯對第17 章提出的建議;感謝百度地圖導航專家梁騰騰對第19 章移動端開發給予的極為細緻的建議;感謝阿里巴巴資料科學與技術研究院進階專家孫亮博士對整本書的結構和基礎知識提出的建議。
感謝我的好朋友吳麗明,曾經那麼幫助過我;感謝我的好朋友饒志臻先生,一直誘惑我買蘋果裝置,有個硬體發燒友真的很幸福;感謝我的閨蜜謝禹曦,好久沒有和你聚餐了,甚是思念。
最後,還得感謝一位流行歌手—「火星弟弟」華晨宇,他在舞台上那一次次創意和感染力的演出深深地吸引了我,他在台下那認真刻苦作曲改歌的樣子也激勵著我,每次想到他的事蹟,都給我相當大的鼓勵。
非常感謝本書的每一位讀者,本書的完成過程非常辛苦但也填滿甜蜜。我在「知乎」(ID:李嘉璇)和網站(tf.greatgeekgrace.com)上也會回答關於「人工智慧」的各種問題,希望透過內容的更新與讀者不斷交流。另外,由於水準有限,在內容上表述上難免也有遺漏和疏忽,也懇請讀者多多指正。
李嘉璇 2017 年於北京石景山
個人部落格:blog.greatgeekgrace.com
TensorFlow 交流社區:tf. greatgeekgrace.com
電子電子郵件:qiyueli_2013@163.com