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