官术网_书友最值得收藏!

前言

理查德·費恩曼(Richard Feynman)教授去世后,人們在他的黑板上發現了What I cannot create, I do not understand這句話。其實,費恩曼教授的本意是:除非你能由基本原理推導出某個結論,否則就沒有真正理解它。記結論或背公式是沒有用的,只有從一張白紙開始一步步地將結論構建出來,你才是真正理解了一個理論或一個事物。

在機器學習領域,特別是在神經網絡和深度學習范疇內,模型和網絡數量眾多,各種超參數也是名目繁多。特別是當人們應用深度神經網絡時,又會針對具體問題的特點提出許多特殊的網絡結構。但是我們必須看到,這些眼花繚亂的模型和網絡并非彼此孤立,它們之間存在著密切的聯系和連續的發展演化路徑。

如果將一個領域的知識比作一棵大樹,那么我們對它的認識過程不應該是從外向里、從頂向下的,不應該只滿足于認識并記住它那繁多的樹葉。初學者往往會陷入茴字四種寫法的誤區,并且以知道各種模型、各個網絡為榮,從而陷入概念和術語的迷宮卻看不到它們之間存在的更深刻的聯系。總而言之,要想認識一棵樹,從樹冠開始一片一片認識每個樹葉無疑是效率低下的。更重要的是,通過這種方式根本無法達到真正理解。我們應該從樹根出發,沿著樹干向上,并嘗試重新構建整棵樹。在此期間,可以在某個樹枝的根部就停下來,因為那時會發現,剩下的細枝末節(字面意思)已經不再重要了,只要在需要的時候再查看那個分支就行了。總之,要想真正地理解(understand)一個領域,就必須能從基本原理出發重新建造(create)它們,最終你會具備統一的、非碎片化的眼光。

程序員愛說一句話:不要重復造輪子。在工作和生產中的確不應該重復造輪子,但在學習和理解的過程中卻需要重復。費恩曼教授的黑板上還有一句話:Know how to solve every problem that has been solved(應該知道每一個已被解決的問題的解決方法)。許多教師都會強調習題的重要性,這是對的。在座的諸位“做題家”對此自然也體會深刻。但費恩曼教授更高一籌,他所傳達的思想是做題不是目的,目的是教人學會自己動手構造。光看明白是不夠的,只有會造輪子才能改進輪子;只有會解有答案的問題,才能去解決還沒有答案的問題。其實,這仍然是理解與建造的關系。

1984年,《現代操作系統》(俗稱馬戲團書)的作者塔嫩鮑姆教授(Andrew S. Tanenbaum)開發了一個教學用的操作系統Minix。受其啟發(多大程度未知),Linus Torvalds創造了Linux系統。這里我們決定效仿前輩,帶領讀者用Python語言從零開始實現一個基于計算圖的機器學習/深度學習框架,我們稱其MatrixSlow。取這個謙卑的名字是為了表明它只是一個用于教學的框架。若在座諸君中有哪位能受其啟發并創造一個專業的深度學習框架,我們將深感欣慰。

計算圖是一個強大的工具,用它可以搭建并訓練從簡單的線性回歸、邏輯回歸到復雜的深度神經網絡等一大類機器學習模型。計算圖通過自動求導和梯度下降法,以統一的方式給這一類機器學習模型提供了訓練算法。因此,實現了計算圖也就等于實現了大部分機器學習算法。看過本書的第二部分,讀者將會對這一點有所感受。

在一步步帶領讀者實現計算圖框架的同時,我們還介紹了機器學習、模型、訓練等相關概念和原理(我們假設所有讀者都沒有前導知識,完全從空白講起)。此外,本書以相當大的篇幅介紹了線性模型、邏輯回歸、多層全連接神經網絡、非全連接深度神經網絡、循環神經網絡和卷積神經網絡等模型的原理和結構,并且尤其注重它們之間的聯系。讀者會看到,動機和思路是如何被反復應用并逐漸發展的。我們還以一些實際問題為例展示了這些模型的應用。最后,我們討論了一些工程方面的問題,例如模型的保存與服務、分布式訓練以及要想實現專業級深度學習框架還需應對的若干問題。

雖然本書的主旨為理解與建造,但是通過建造達成理解才是關鍵。時常會有朋友問:“是否有必要親手實現模型?”必要與否很難界定,這取決于想要實現模型的人的目的和工作層次(這里的層次并無高低褒貶之意)。所以,我們不談目的與必要性,只談親手實現模型的好處。以我的淺見以及親身經歷來看,親手實現模型極其有助于夯實理解。

在動手實現模型的過程中,你不得不把對理論的理解厘清到最細微處,這里容不得半點含糊。更重要的是,當自己實現的模型運轉起來,應用于實際問題以測試其正確性時,現實會逼迫你反復測試,這個過程可以極大地幫助你加深對于模型行為的理解。作為程序員,測試本來是一件在概念上簡單明確的事情。在設計程序的時候,預測有如此這般的輸出,它就應該有如此這般的輸出。對于一個斷言(assert)來說,它過就是過,不過就是不過。但是在機器學習領域,這個范式就會有一定程度上的失效。

我們知道,模型(起碼本書討論的這類模型)的訓練是一個近似迭代優化的過程,其中到處存在隨機性:參數的隨機初始化,樣本的隨機洗牌(shuffle)以及一些例如Drop Out之類引入隨機性的正則化方法等,都會帶來不確定性。訓練的結果,比如模型參數、損失和評價指標等,都只具有統計意義。更重要的是,模型在樣本集上的損失取決于問題本身,我們不可能知道這個高維函數的真實“地形”。基于梯度的優化算法也不能保證可以找到全局最優點。全局最優點可能根本就不存在或者存在但不唯一。所以,模型訓練根本沒有嚴格的正確與否一說。

但是,模型的實現總有對錯。錯的實現在各個測試問題上都不會有好的表現。簡單來說,好的表現就是隨著訓練的進行,損失值降低而指標上升。但是,受制于問題本身、模型結構以及超參數,對的實現有時也未見得會有好表現,或者好表現的現象需要很久才能顯現。這迫使實現者必須反復在各類問題上驗證自己的實現,嘗試各種模型結構和超參數的組合,這是一個永無終點的過程。實現者對自己的實現的信心會隨著無數次嘗試而逐漸堅定。更為寶貴的是,所有的這些操作和觀察都能幫助實現者建立起對模型行為的認知和直覺。

我們知道,結構和超參數控制著模型的自由度,自由度又決定了模型的偏差-方差權衡,進而影響了模型的過擬合/欠擬合。在物理學中,一套完整的約束可將動力系統的自由度降低一個整數值。由此,之后就可以用數量更少的廣義坐標表示該系統。類比到模型訓練,正則化方法施加的約束并不是完整的,模型的自由度也不是整數。狹義的正則化之外的超參數,乃至模型結構,都在以復雜的方式影響著模型的自由度。我們常說調參,就是以一種經驗的、半猜半試的方式控制模型自由度,以改進模型的表現。當然,我們還有網格搜索和隨機搜索,以及一些非參數優化算法,如遺傳、貝葉斯等,但是它們都需要較大的計算量,使得我們在大部分時候難以承受。

了解每一個超參數的原理和含義,以及它們對自由度的大致影響,是建模工程師的必備能力。各種超參數在具體問題、具體模型上究竟會以什么形式產生什么影響,只有經過觀察和經驗的積累才能形成認識。實現并驗證模型的過程,就是一個密集經歷這種觀察和經驗積累的過程。在復雜的科學和技術領域,親身經歷與體驗是必不可少的,這是一個經歷生命的過程。魔鬼梅菲斯特曾對拜訪浮士德博士的青年學生說:“理論是灰色的,而生命之樹長青。”

既然說到了理論,這又是一個機器學習領域與程序員熟悉的其他領域不同的地方。實現和應用機器學習必須要理解其原理,而閱讀其他領域的源代碼時,只要把代碼讀透也就徹底理解了。你也許會這樣想,在完全知道內存、總線和CPU中發生的每一件事后,我難道還不能理解這個程序在干什么嗎?對于機器學習來說,這還真不夠。比如,你在某處看到了一個計算,但是這里為什么要計算?計算的目的是什么?為什么有效?這些可不是代碼能告訴你的。“讀代碼”原本是程序員了解一個東西的終極大招,但是在機器學習這里又失效了。

有種常見的說法是把公式推導一遍。理解機器學習的數學原理可不能只是簡單地“推導公式”,而應該要理解公式究竟說了什么。當然,在初學時能夠把公式推導的每一步都弄明白就已經不易了。但是如果把注意力都集中到推導,又容易使人難以看清這些公式究竟表達了什么。這就好比雖然踩著腳印亦步亦趨,最后確實也走到了目的地,但始終沒有抬頭看清這是什么路,目的地是哪里,為什么走這條路,而這些才是最重要的。人們總是希望(妄想)生活中不要有數學。實際上,所謂數學和非數學,無非都是在說事說理而已。要想把事情說得精確深刻,就必須把相關的量以及量之間的關系說清楚,而數學就是簡潔地表達這些關系的一種手段。

由于本書面向的是初學者,因此在數學上沒有搞得太深入、太復雜。我們會盡力闡述,以幫助讀者掌握機器學習的數學所說的“事”是什么,也就是“推導公式”時容易看不清的那些東西。本書不避諱使用公式,因為這是必不可少的,但量確實不大。我們把一些較為高級的主題放在了選讀框中。讀者可以根據實際需要選擇是否略過這些高級主題,而不至于干擾閱讀。記住,數學永遠都是必要的。鑒于此,讀者可以參考本書的姊妹篇《深入理解神經網絡:從邏輯回歸到CNN》1,那里有更完整的數學。

1本書已由人民郵電出版社于2019年9月出版,后面簡稱《深入理解神經網絡》。——編者注

內容概覽

本書分為三個部分。第一部分是原理篇,包含第1章至第3章。其中,第1章介紹機器學習的基本概念,引入了一個簡單的線性模型ADALINE,這一章介紹的概念貫穿本書。第2章介紹計算圖,其核心內容是計算圖的原理、梯度下降法以及計算圖上的自動求導。第3章介紹梯度下降法的各種變體。在前三章中,我們帶領讀者實現MatrixSlow框架的核心基礎設施,并在此過程中滲透講解基礎原理和概念。

第二部分是模型篇。有了基礎設施,我們就可以搭建各種模型了。本部分包括第4章至第8章。其中,第4章介紹邏輯回歸,第5章介紹多層全連接神經網絡,第6章介紹幾種非全連接神經網絡,第7章介紹循環神經網絡,第8章介紹卷積神經網絡。這些模型/網絡的選擇和順序不是任意的。我們的想法是由簡到繁、由淺至深地介紹其動機和思路的發展演變,使讀者看到這些典型的、常用的模型/網絡之間的聯系。雖然原則上讀者可以按照興趣選讀這些章節,但是我們還是建議大家能按順序閱讀,特別是第4章和第5章。模型雖然簡單,但它們是后續一切復雜延伸的基礎和出發點。

第三部分是工程篇。在這一部分中,我們將討論一些與深度學習框架相關的工程問題。本部分包括第9章至第12章。其中,第9章對訓練邏輯做進一步封裝,并討論模型評估;第10章介紹模型的保存、加載、預測和服務部署;第11章介紹分布式訓練,在大數據和深度學習時代,樣本量和網絡規模都是巨大的,這些使得分布式訓練必不可少;第12章簡單討論要實現一個專業級的深度學習框架還需面對和處理的一些問題。

讀者對象

本書的目標讀者是對機器學習,特別是神經網絡與深度學習的原理和實現感興趣的工程師、學生以及其他各行業人士。我們不預設讀者有任何與機器學習相關的前導知識,完全從零講起(但愿能達到效果)。需要讀者具有基礎的編程知識,否則難以閱讀書中的代碼。

MatrixSlow框架以Python語言實現,而Python語法簡單,因此相信讀者即便沒有Python經驗,只要具備基礎的編程能力也能讀懂。我們使用Python的線性代數庫Numpy存儲矩陣并進行矩陣運算。書中的代碼有豐富的注釋,讀者不需要事先掌握Numpy也能讀懂。代碼中還有對其他一些庫的少量、零星的使用,它們都不會給理解代碼造成障礙。

如前面所說,本書不“數樹葉”,也不深究茴字的多種寫法,并非一本神經網絡與深度學習的模型大全。MatrixSlow框架旨在教學,用實現來幫助讀者理解原理。它雖然可以運用于一些小問題,但還遠不是一個專業的深度學習框架。在對數學原理的講解方面,本書試圖抓住本質和精髓,但是考慮本書的層次,還有許多深刻的內容沒有涉及。

代碼資源

本書代碼可至圖靈社區(iTuring.cn)本書主頁“隨書下載”中免費注冊下載。另外,本書作者在知乎開設了專欄“計算主義”,以后會繼續在專欄中討論和分享相關主題。鑒于作者水平有限,錯誤難免,歡迎讀者來信指正,其郵箱是zhangjuefei83@163.com

本書第1章、第2章、第4章、第5章、第6章、第7章和第8章由張覺非撰寫。第3章、第9章、第10章、第11章和第12章由陳震撰寫。

致謝

張覺非:感謝360智能工程部的各位同事。感謝青年畫家邵姺女士,她的封面畫作和設計使得本書大為增色。感謝本書的策劃人陳興璐和王軍花,感謝本書的編輯王彥。感謝中科院古脊椎動物與古人類研究所的邢路達學弟,我要對他說:Non,je ne nie pas la science(不,我不否認科學)。感謝我的父母、兄長和親人。最后,感謝我的伴侶周怡萍女士:“萬象皆俄頃,無非是映影。事凡不充分,至此始發生。事凡無可名,至此始果行。永恒之女性,引我們飛升。”

陳震:我于2017年加入360智能工程部。我們幾乎從零開始開發公司的機器學習基礎設施(機器學習數據、訓練和推理平臺)。平臺的本質是抽象和歸納,因此我們有機會接觸到全公司各種不同的機器學習應用場景,同時也面對著繁雜的產品和技術挑戰。這項工作艱辛而漫長,但時刻伴隨著“建造”新事物的成就感和深入“理解”理論與技術的滿足感。首先要感謝的是我們團隊的每一位小伙伴,無數次的討論、分享、爭吵和犯錯正是寫作本書之源泉。還需要感謝360技術中臺、360搜索和人工智能研究院等團隊,感謝他們給予我們充分的信任和支持,鼓勵我們在這條并不輕松的道路上堅持,再堅持。最后,感謝我的父母和家人給予我的愛,尤其是我的妻子和女兒,她們讓我領會到生命之偉大,生命之神奇,生命之美妙。


主站蜘蛛池模板: 城口县| 江孜县| 阿拉尔市| 凤山市| 凯里市| 彰化县| 福鼎市| 巴中市| 贞丰县| 白水县| 夏邑县| 游戏| 兰考县| 三亚市| 汉川市| 博爱县| 建阳市| 固原市| 清水县| 尼木县| 西昌市| 玉门市| 广河县| 台中市| 扎囊县| 长沙县| 离岛区| 崇左市| 九江县| 河曲县| 海林市| 韩城市| 广安市| 通海县| 普兰县| 黄石市| 中阳县| 十堰市| 彩票| 汨罗市| 海伦市|