機(jī)器學(xué)習(xí)從業(yè)人員的艱難選擇
作為機(jī)器學(xué)習(xí)從業(yè)人員,如果今天突然被公司或?qū)W校開除,你能養(yǎng)活自己嗎?鄰居老大媽買土雞蛋不買神經(jīng)網(wǎng)絡(luò)模型,東門老大爺認(rèn)識郭德綱不認(rèn)識樸素貝葉斯,面容姣好的“翠花”只認(rèn)房產(chǎn)證不認(rèn) Zookeeper。即使你身懷絕技,有著遠(yuǎn)大的抱負(fù),機(jī)器學(xué)習(xí)應(yīng)用難以變現(xiàn)也是事實。為了能維持生計,眾多機(jī)器學(xué)習(xí)從業(yè)人員只能進(jìn)入大公司、大組織。但限于流程和已有的體制,在這樣的工作環(huán)境下,他們很難完全發(fā)揮自己的潛能。
太多的好朋友,在脫離體制和大公司的時候豪情萬丈,吃散伙飯時和戰(zhàn)友們慷慨激昂,唱著真心英雄,夢想著自己也有回到北京東二環(huán)開始指點江山的一天。可是第二天帶著宿醉起床面對著電腦屏幕時,卻不知道該怎么開始。沒錯,我們都有自己的想法,我們自己就是程序員,比那些在創(chuàng)業(yè)街上賣 PPT 的人“厲害”多了。可是在工業(yè)界,不管是初入職場的新人,還是久經(jīng)沙場的老將,都需要在業(yè)余時間不停地刷題,練習(xí)“LeetCode”中的習(xí)題,以應(yīng)對不時之需。這樣的生存方式嚴(yán)重阻礙了知識經(jīng)濟(jì)的發(fā)展,更不要提為祖國健康工作五十年了。與大組織、巨無霸企業(yè)不同的是,自主創(chuàng)業(yè)往往需要開發(fā)人員全棧的技術(shù)能力。大公司里面的技術(shù)能手在獨立創(chuàng)業(yè)的時候也不免會遇到下面這些很基本的問題:
服務(wù)器從哪里來?
以前單位、導(dǎo)師手里有一套自主開發(fā)的大數(shù)據(jù)平臺,現(xiàn)在自己單干了沒法用,怎么辦?
以前用的機(jī)器學(xué)習(xí)軟件包是某個“牛人”自己開發(fā)的“獨門武功”,只在公司內(nèi)部用,現(xiàn)在該用什么?
模型訓(xùn)練出來了,又怎么部署?
總算東拼西湊寫好了一個流程,接下來如何實現(xiàn)數(shù)據(jù)可視化?
總算有客戶開始用了,怎么樣才能對結(jié)果實時監(jiān)控?
這個時候你才會想起馬云的那句話:“離開公司了你什么都不是”。還是回大公司吧,至少比較安穩(wěn)……
總結(jié)起來,機(jī)器學(xué)習(xí)從業(yè)人員的難處有三點。
技能無法直接轉(zhuǎn)化為經(jīng)濟(jì)效益:必須依靠大組織、公司,才能實現(xiàn)經(jīng)濟(jì)效益的轉(zhuǎn)化。這必然要求從業(yè)人員服從諸多的條款和價值觀,這對他們工作效率和積極性來說都是沉重的負(fù)擔(dān)。
迭代速度受牽制:雖然開源社區(qū)擁有眾多非常優(yōu)秀的工具,但大公司、大組織往往都有眾多歷史遺留架構(gòu),這使得開發(fā)部署過程變得異常漫長。與此同時,從業(yè)人員也會覺得所學(xué)的知識將來無法為自己所用,因此感到空虛。
出成果壓力大:高投入就需要有高回報。機(jī)器學(xué)習(xí)從業(yè)人員薪資非常高,因此公司對從業(yè)人員進(jìn)行新架構(gòu)、新項目開發(fā)的耐心往往也非常有限。就算是從公司利益出發(fā),進(jìn)行架構(gòu)、代碼的革新,從業(yè)人員往往也會擔(dān)上不少風(fēng)險。如果不能在短時間內(nèi)實現(xiàn)架構(gòu),或者新訓(xùn)練的模型不能達(dá)到預(yù)期目標(biāo),從業(yè)人員的工作穩(wěn)定性將會得不到保證。
老板、管理人員的困境
機(jī)器學(xué)習(xí)從業(yè)人員有自己的困難,公司的老總、經(jīng)理也有傷腦筋的事情。2015 年 KDNuggets 調(diào)查數(shù)據(jù)顯示,工業(yè)界超過半數(shù)的數(shù)據(jù)科學(xué)家在一個職位上的工作時間一般都少于兩年。另外美國舊金山灣區(qū)的機(jī)器學(xué)習(xí)科學(xué)家在一個職位上平均只會停留8個月。這么高的跳槽頻率讓眾多雇主也提心吊膽。根據(jù)筆者的經(jīng)驗,機(jī)器學(xué)習(xí)從業(yè)人員,從入職到真正開始產(chǎn)生正現(xiàn)金流,至少需要 9 個月左右的時間。太短的工作年限對于很多雇主來說遠(yuǎn)遠(yuǎn)不足以收回成本。
有的公司財力雄厚,高薪聘請了擁有谷歌工作經(jīng)驗的斯坦福大學(xué)博士,但這名博士入職三個月,文章發(fā)表了四篇,會開了五場,可是機(jī)器學(xué)習(xí)模型拿到實際工作環(huán)境中的效果卻不理想,無法上線。結(jié)果令人沮喪。
資金實力不太充裕的初創(chuàng)公司就更難了。本身財力有限,招人靠情懷來對沖。好不容易找到了志同道合的人,開口就問人家要 GPU 集群,而現(xiàn)成的機(jī)器學(xué)習(xí)框架中TensorFlow 太慢,PaddlePaddle 太差,往往有一些以技術(shù)為主打的初創(chuàng)公司,專心于核心軟件開發(fā),而速度太慢,結(jié)果還沒開始上線產(chǎn)生效益,當(dāng)時所在的初創(chuàng)公司就已經(jīng)燒斷了現(xiàn)金流。
另一方面,老板從來不敢對機(jī)器學(xué)習(xí)從業(yè)人員過分施壓。因為若施壓太大,再加上現(xiàn)在市場對機(jī)器學(xué)習(xí)專家的需求旺盛,機(jī)器學(xué)習(xí)員工都是一言不合就跳槽。施壓太小,機(jī)器學(xué)習(xí)員工就會開始面向簡歷的開發(fā)模式,一會兒去歐洲開會,一會兒開源個深度學(xué)習(xí)框架,就是不上線真正能賺錢的產(chǎn)品,這又怎能不讓人著急?
總結(jié)起來,管理人員的難處有以下三點。
雙重身份的矛盾:機(jī)器學(xué)習(xí)開發(fā)人員到底算科學(xué)家還是算程序員?這是一個管理者需要面對的根本性問題。若把機(jī)器學(xué)習(xí)開發(fā)人員看成科學(xué)家,就要做好所有投資都打水漂的心理準(zhǔn)備,投資回報率可能非常低;若把機(jī)器學(xué)習(xí)開發(fā)人員看成程序員,就要給其足夠的自由度和福利,并且做好開發(fā)人員冗余,對員工突然離職的情況做好準(zhǔn)備。
利益沖突的矛盾:現(xiàn)在機(jī)器學(xué)習(xí)人員的流動性很高,公司需要出效益,而工作人員需要出好看的簡歷。在很多情況下,這兩個需求是背道而馳的。本書后文會對各種機(jī)器學(xué)習(xí)架構(gòu)進(jìn)行綜述,其中不乏員工為了充實簡歷而開發(fā)的“政績工程”。通過對本書的學(xué)習(xí),相信管理人員的眼睛也會擦亮不少。
和商業(yè)部門整合的矛盾:機(jī)器學(xué)習(xí)科學(xué)家往往醉心于開發(fā)最復(fù)雜最尖端的模型,以取得機(jī)器學(xué)習(xí)理論上的最佳效果。可是很多機(jī)器學(xué)習(xí)模型的可解釋度并不好,無法讓業(yè)務(wù)部門對模型進(jìn)行可視化解讀。雖然機(jī)器學(xué)習(xí)工具眾多,但是能將機(jī)器學(xué)習(xí)模型和可視化系統(tǒng)整合起來的程序卻非常少。本書所描述的架構(gòu)和可視化部分會對這個問題進(jìn)行解答。
總的來說,企業(yè)求生求利的動力意味著開發(fā)人員必須短平快地出結(jié)果;機(jī)器學(xué)習(xí)模型效果的不確定性意味著管理人員必須擁抱不確定性;機(jī)器學(xué)習(xí)從業(yè)人員的高流動性意味著公司和組織必須采取靈活的開發(fā)流程和架構(gòu)。
不寫尋常書,不走尋常路
什么樣的技術(shù)成長道路,才能讓我們施展自己的才華,同時快樂地養(yǎng)活自己?什么樣的職業(yè)發(fā)展模式,才能讓我們真正掌握自己的命運,去改變世界,而不是為北京、上海、深圳高昂的房價發(fā)愁?什么樣的架構(gòu)設(shè)計,才能讓我們的生活回到朝九晚五的正常模式,能夠每天六點回家和家人吃晚餐,和心愛的人看星星看月亮?
起初機(jī)械工業(yè)出版社華章公司的楊繡國編輯聯(lián)系到作者之一彭河森的時候,他是很猶豫的。市場上現(xiàn)在已經(jīng)有了很多優(yōu)秀的機(jī)器學(xué)習(xí)著作,怎么還需要我們再寫一本呢?為了驗證我們的觀點,我們?nèi)ザ拱甑染W(wǎng)站進(jìn)行了簡單的市場調(diào)查,以“機(jī)器學(xué)習(xí)”為關(guān)鍵詞搜索了已有書評。
搜索的結(jié)果既是意料之中又讓我們大為吃驚。意料之中的是現(xiàn)在市面上已經(jīng)存在很多優(yōu)秀的機(jī)器學(xué)習(xí)相關(guān)圖書,對機(jī)器學(xué)習(xí)模型的支撐涵蓋了從基本邏輯回歸到最前沿的深度學(xué)習(xí)的所有內(nèi)容。大為吃驚的則有如下兩個方面。
讀者胃口很挑:沒錯,說你呢。我們發(fā)現(xiàn)眾多機(jī)器學(xué)習(xí)圖書都被打上了“太廣、深度不夠”的標(biāo)簽。這讓我們感覺到壓力巨大,害怕我們的這本書也會打上類似的標(biāo)簽。
理論太多、應(yīng)用太少:我們發(fā)現(xiàn)市面上的書籍大多都是以理論為主,再搭配相應(yīng)的編程工具。對部署、系統(tǒng)架構(gòu)設(shè)計、后期可視化等重要工作根本沒有提及。而我們預(yù)計讀者大多是在校學(xué)生,或者是初入職場的機(jī)器學(xué)習(xí)從業(yè)人員,他們這個時候最需要的大概不是天花亂墜的理論,而是能切切實實地實現(xiàn)機(jī)器學(xué)習(xí)模型功能的指導(dǎo)。
有了這樣的認(rèn)識之后,我們決定從應(yīng)用和架構(gòu)的角度著手,來寫作本書,并設(shè)立了如下的目標(biāo)。
1. 以機(jī)器學(xué)習(xí)全棧應(yīng)用能力為目標(biāo)
“如果明天你就要被微軟開除,那么今天你希望學(xué)到些什么?”我們在撰寫這本書的時候一直以這樣的精神來激勵自己。微軟每年7 月到 9 月都會有裁員措施,但這也在不停地提醒筆者要抓緊時間好好寫書,貼近應(yīng)用,這樣才能在不幸被裁員的時候養(yǎng)活自己。這樣的精神一直貫穿了全書:本書所有的章節(jié)都配備了實際使用的案例分析,我們的案例分析不只是針對當(dāng)前章節(jié)所學(xué)知識的練習(xí),也涉及實際應(yīng)用中可能會遇到的“大坑”,以及相應(yīng)的解決辦法。
我們力圖通過 Docker 等部署工具的介紹,幫助讀者快速掌握機(jī)器學(xué)習(xí)模型的產(chǎn)業(yè)化進(jìn)程。不管你是就職于大公司,還是自己創(chuàng)業(yè),我們都希望本書的內(nèi)容能夠讓你快速上線滿意的機(jī)器學(xué)習(xí)系統(tǒng),離你的夢想更近一點。
世界在改變,機(jī)器學(xué)習(xí)也在不停地改變。對于機(jī)器學(xué)習(xí)中的很多重要成員,如建模工具、分布式隊列等,本書都會對其來龍去脈和發(fā)展趨勢進(jìn)行綜述。希望通過這樣的討論,能夠讓讀者建立起對機(jī)器學(xué)習(xí)發(fā)展局勢的判斷,在未來的成長中也能獨占鰲頭。
2. 抓住機(jī)器學(xué)習(xí)主干,遠(yuǎn)離學(xué)院派
現(xiàn)今 Scikit-learn 等軟件已經(jīng)包含了大量的機(jī)器學(xué)習(xí)模塊,其使用方法已經(jīng)標(biāo)準(zhǔn)化,所以我們不準(zhǔn)備在機(jī)器學(xué)習(xí)模型上耗費太多筆墨。例如,在 Scikit-learn 的線性模型模塊 LinearRegression 中,訓(xùn)練模型會調(diào)用fit() 函數(shù),進(jìn)行預(yù)測會調(diào)用predict() 函數(shù)。與此同時,Scikit-learn 中的隨機(jī)森林模塊 RandomForest同樣是調(diào)用以上兩個函數(shù)進(jìn)行模型的訓(xùn)練和預(yù)測的。接口的統(tǒng)一化幫助了開發(fā)人員進(jìn)行模塊化開發(fā)。如果出現(xiàn)了新的機(jī)器學(xué)習(xí)模型,則只需要替換一下模型訓(xùn)練模塊即可。
另外鑒于現(xiàn)如今網(wǎng)上豐富的機(jī)器學(xué)習(xí)理論資源,我們認(rèn)為現(xiàn)今的讀者完全有能力對特定的機(jī)器學(xué)習(xí)模型進(jìn)行自學(xué)。本書會以線性模型為例對 Scikit-learn 的使用進(jìn)行講解,有需要對其他機(jī)器學(xué)習(xí)模塊進(jìn)行學(xué)習(xí)的讀者,也可以很容易地將線性模型模塊替換成為其他的模塊。
3. 能讀的代碼,能運行的例子
“好多技術(shù)類書籍我看著看著就暈了,代碼根本沒法讀”,我們向眾多好友征詢意見的時候收到了這樣的反饋。為了增加本書案例的可讀性,我們力求避免代碼的大段堆砌。所有案例的代碼模塊都力求在 20 行以下。
“好多書的例子都沒辦法編譯”,我們寫這本書的時候也聽到了不少朋友的“吐槽”。我們認(rèn)為能正常運行起來的例子是良好學(xué)習(xí)體驗的關(guān)鍵。為此,本書的所有例子都通過多次可用性測試,并且使用Docker運行,大大降低了重復(fù)利用的門檻。同時我們將源代碼寄存在 Github 上面,隨時進(jìn)行更新排錯,我們也歡迎讀者在上面添加 Pull Request,完善新內(nèi)容,與我們進(jìn)行交流。
4. 實時股票交易、金融輿情分析實例數(shù)據(jù)
有很多 IT 界的朋友經(jīng)常在工作累了的時候說:“實在不行我就轉(zhuǎn)行去做金融了,”但是行動起來去做金融的人卻甚少。既然在機(jī)器學(xué)習(xí)從業(yè)人員的眼中金融行業(yè)就像烏托邦那般美妙,那么為什么不進(jìn)去看一看自己是否合適呢?
另外,也有一些具有金融背景的友人,他們急切地想要利用機(jī)器學(xué)習(xí)方法來實現(xiàn)自動化交易。每年都有無數(shù)高考狀元、名校學(xué)子加入外資對沖基金,如果我們能夠架設(shè)好一個實時交易投資的平臺,沒準(zhǔn)人才就不會流失到華爾街去了,而能為國所用呢。
對此我們采用了美股交易秒級數(shù)據(jù)作為本書案例的數(shù)據(jù)。我們收集了 2015 年 8月所有標(biāo)準(zhǔn)普爾 500 指數(shù)成分股每秒的報價和成交量。這里的數(shù)據(jù)主要是以時間序列形式出現(xiàn),我們將會嘗試搭建實時機(jī)器學(xué)習(xí)平臺,對這些數(shù)據(jù)進(jìn)行存儲、加工分析和可視化,并且對未來若干秒的走勢進(jìn)行預(yù)測。如果一切順利,我們可以從中得到 Alpha(量化交易中的可以長期盈利的策略),實現(xiàn)盈利。
在后面的章節(jié)中,我們會從數(shù)據(jù)分析出發(fā),由淺到深地利用以上數(shù)據(jù)進(jìn)行建模,且在本書結(jié)尾時實現(xiàn)對金融數(shù)據(jù)預(yù)測判斷的功能。
本書的學(xué)習(xí)方法
重架構(gòu)、重設(shè)計、重實戰(zhàn)是本書撰寫的指導(dǎo)思想。我們認(rèn)為優(yōu)秀的系統(tǒng)設(shè)計在于完備的思考和準(zhǔn)備,因此本書對計算機(jī)編程和機(jī)器學(xué)習(xí)理論只有入門級的要求。
1.基礎(chǔ)知識要求
本書的兩位筆者之中,彭河森是統(tǒng)計學(xué)出身,汪涵是應(yīng)用數(shù)學(xué)出身。但最后都殊途同歸地走上了機(jī)器學(xué)習(xí)應(yīng)用的道路。對于計算機(jī)編程基礎(chǔ),本書的門檻為國內(nèi)全日制大學(xué)本科非計算機(jī)專業(yè)理科第二年的水平。我們假設(shè)讀者具有基本的 Python 編程能力,能在腳本執(zhí)行和交互情況下運行 Python 程序。本書著重講解架構(gòu)設(shè)計,對面向?qū)ο缶幊獭⒃O(shè)計模式等課題沒有任何要求。
對于機(jī)器學(xué)習(xí)理論基礎(chǔ),本書的門檻為國內(nèi)全日制大學(xué)本科非計算機(jī)、統(tǒng)計、數(shù)學(xué)專業(yè)理科第二年的水平。本書假設(shè)讀者具有基本的線性代數(shù)知識,對統(tǒng)計推斷和機(jī)器學(xué)習(xí)模型有基本的了解。
2.學(xué)習(xí)環(huán)境配置
本書假設(shè)讀者采用了 Ubuntu 16.04 或Mac操作系統(tǒng)。新版 Windows10在本書寫作之時剛剛開始支持 Linux Shell,并且具有了 Ubuntu 內(nèi)核的支持,由于時間關(guān)系我們沒有來得及驗證,請讀者謹(jǐn)慎試驗。另外由于我們將在本書中大量使用 Docker,所以相關(guān)軟件將會以 Docker 鏡像的形式存在。我們將在相應(yīng)章節(jié)(第6章)中介紹 Docker 及其環(huán)境工具的安裝和配置。本書對其他系統(tǒng)軟件的安裝并沒有要求。
每個章節(jié)的實例內(nèi)容都可以在Github 官方網(wǎng)站上下載,地址為:https://github.com/real-time-machine-learning/。我們將每一個章節(jié)的內(nèi)容都分成一個獨立的 Git 存檔,每個章節(jié)之間的程序不會相互關(guān)聯(lián),以方便讀者選擇性地閱讀和實踐。
3. 寫作分工
本書大部分內(nèi)容由彭河森、汪涵兩人共同探討、實踐、總結(jié)并得出理論方向。汪涵完成了實戰(zhàn)數(shù)據(jù)庫綜述章節(jié)(第8章);其他所有章節(jié)均由彭河森完成。
這里我們向本書寫作過程中參與討論和建議的唐磊、陸昊威、高斌、湯宇清、孫寶臣、Luhui Hu、徐易等專家及友人表示感謝。特別感謝嚴(yán)老在本書編寫過程中兩次收留作者在家。