深度學(xué)習(xí)本質(zhì)上是深層的人工神經(jīng)網(wǎng)絡(luò),它不是一項(xiàng)孤立的技術(shù),而是數(shù)學(xué)、統(tǒng)計(jì)機(jī)器學(xué)習(xí)、計(jì)算機(jī)科學(xué)和人工神經(jīng)網(wǎng)絡(luò)等多個(gè)領(lǐng)域的綜合。深度學(xué)習(xí)的理解,離不開本科數(shù)學(xué)中最為基礎(chǔ)的數(shù)學(xué)分析(高等數(shù)學(xué))、線性代數(shù)、概率論和凸優(yōu)化;深度學(xué)習(xí)技術(shù)的掌握,更離不開以編程為核心的動(dòng)手實(shí)踐。沒(méi)有扎實(shí)的數(shù)學(xué)和計(jì)算機(jī)基礎(chǔ)做支撐,深度學(xué)習(xí)的技術(shù)突破只能是空中樓閣。
所以,想在深度學(xué)習(xí)技術(shù)上有所成就的初學(xué)者,就有必要了解這些基礎(chǔ)知識(shí)之于深度學(xué)習(xí)的意義。除此之外,我們的專業(yè)路徑還會(huì)從結(jié)構(gòu)與優(yōu)化的理論維度來(lái)介紹深度學(xué)習(xí)的上手,并基于深度學(xué)習(xí)框架的實(shí)踐淺析一下進(jìn)階路徑。
最后,本文還將分享深度學(xué)習(xí)的實(shí)踐經(jīng)驗(yàn)和獲取深度學(xué)習(xí)前沿信息的經(jīng)驗(yàn)。
數(shù)學(xué)基礎(chǔ)
如果你能夠順暢地讀懂深度學(xué)習(xí)論文中的數(shù)學(xué)公式,可以獨(dú)立地推導(dǎo)新方法,則表明你已經(jīng)具備了必要的數(shù)學(xué)基礎(chǔ)。
掌握數(shù)學(xué)分析、線性代數(shù)、概率論和凸優(yōu)化四門數(shù)學(xué)課程包含的數(shù)學(xué)知識(shí),熟知機(jī)器學(xué)習(xí)的基本理論和方法,是入門深度學(xué)習(xí)技術(shù)的前提。因?yàn)闊o(wú)論是理解深度網(wǎng)絡(luò)中各個(gè)層的運(yùn)算和梯度推導(dǎo),還是進(jìn)行問(wèn)題的形式化或是推導(dǎo)損失函數(shù),都離不開扎實(shí)的數(shù)學(xué)與機(jī)器學(xué)習(xí)基礎(chǔ)。
數(shù)學(xué)分析
在工科專業(yè)所開設(shè)的高等數(shù)學(xué)課程中,主要學(xué)習(xí)的內(nèi)容為微積分。對(duì)于一般的深度學(xué)習(xí)研究和應(yīng)用來(lái)說(shuō),需要重點(diǎn)溫習(xí)函數(shù)與極限、導(dǎo)數(shù)(特別是復(fù)合函數(shù)求導(dǎo))、微分、積分、冪級(jí)數(shù)展開、微分方程等基礎(chǔ)知識(shí)。在深度學(xué)習(xí)的優(yōu)化過(guò)程中,求解函數(shù)的一階導(dǎo)數(shù)是最為基礎(chǔ)的工作。當(dāng)提到微分中值定理、Taylor公式和拉格朗日乘子的時(shí)候,你不應(yīng)該只是感到與它們似曾相識(shí)。這里推薦同濟(jì)大學(xué)第五版的《高等數(shù)學(xué)》教材。
線性代數(shù)
深度學(xué)習(xí)中的運(yùn)算常常被表示成向量和矩陣運(yùn)算。線性代數(shù)正是這樣一門以向量和矩陣作為研究對(duì)象的數(shù)學(xué)分支。需要重點(diǎn)溫習(xí)的包括向量、線性空間、線性方程組、矩陣、矩陣運(yùn)算及其性質(zhì)、向量微積分。當(dāng)提到Jacobian矩陣和Hessian矩陣的時(shí)候,你需要知道確切的數(shù)學(xué)形式;當(dāng)給出一個(gè)矩陣形式的損失函數(shù)時(shí),你可以很輕松的求解梯度。這里推薦同濟(jì)大學(xué)第六版的《線性代數(shù)》教材。
概率論
概率論是研究隨機(jī)現(xiàn)象數(shù)量規(guī)律的數(shù)學(xué)分支,隨機(jī)變量在深度學(xué)習(xí)中有很多應(yīng)用,無(wú)論是隨機(jī)梯度下降、參數(shù)初始化方法(如Xavier),還是Dropout正則化算法,都離不開概率論的理論支撐。除了掌握隨機(jī)現(xiàn)象的基本概念(如隨機(jī)試驗(yàn)、樣本空間、概率、條件概率等)、隨機(jī)變量及其分布之外,還需要對(duì)大數(shù)定律及中心極限定理、參數(shù)估計(jì)、假設(shè)檢驗(yàn)等內(nèi)容有所了解,進(jìn)一步還可以深入學(xué)習(xí)一點(diǎn)隨機(jī)過(guò)程、馬爾可夫隨機(jī)鏈的內(nèi)容。這里推薦浙江大學(xué)版的《概率論與數(shù)理統(tǒng)計(jì)》。
凸優(yōu)化
結(jié)合以上三門基礎(chǔ)的數(shù)學(xué)課程,凸優(yōu)化可以說(shuō)是一門應(yīng)用課程。但對(duì)于深度學(xué)習(xí)而言,由于常用的深度學(xué)習(xí)優(yōu)化方法往往只利用了一階的梯度信息進(jìn)行隨機(jī)梯度下降,因而從業(yè)者事實(shí)上并不需要多少“高深”的凸優(yōu)化知識(shí)。理解凸集、凸函數(shù)、凸優(yōu)化的基本概念,掌握對(duì)偶問(wèn)題的一般概念,掌握常見的無(wú)約束優(yōu)化方法如梯度下降方法、隨機(jī)梯度下降方法、Newton方法,了解一點(diǎn)等式約束優(yōu)化和不等式約束優(yōu)化方法,即可滿足理解深度學(xué)習(xí)中優(yōu)化方法的理論要求。這里推薦一本教材,Stephen Boyd的《Convex Optimization》。
機(jī)器學(xué)習(xí)
歸根結(jié)底,深度學(xué)習(xí)只是機(jī)器學(xué)習(xí)方法的一種,而統(tǒng)計(jì)機(jī)器學(xué)習(xí)則是機(jī)器學(xué)習(xí)領(lǐng)域事實(shí)上的方法論。以監(jiān)督學(xué)習(xí)為例,需要你掌握線性模型的回歸與分類、支持向量機(jī)與核方法、隨機(jī)森林方法等具有代表性的機(jī)器學(xué)習(xí)技術(shù),并了解模型選擇與模型推理、模型正則化技術(shù)、模型集成、Bootstrap方法、概率圖模型等。深入一步的話,還需要了解半監(jiān)督學(xué)習(xí)、無(wú)監(jiān)督學(xué)習(xí)和強(qiáng)化學(xué)習(xí)等專門技術(shù)。這里推薦一本經(jīng)典教材《The elements of Statistical Learning》。
計(jì)算機(jī)基礎(chǔ)
深度學(xué)習(xí)要在實(shí)戰(zhàn)中論英雄,因此具備GPU服務(wù)器的硬件選型知識(shí),熟練操作Linux系統(tǒng)和進(jìn)行Shell編程,熟悉C++和Python語(yǔ)言,是成長(zhǎng)為深度學(xué)習(xí)實(shí)戰(zhàn)高手的必備條件。當(dāng)前有一種提法叫“全棧深度學(xué)習(xí)工程師”,這也反映出了深度學(xué)習(xí)對(duì)于從業(yè)者實(shí)戰(zhàn)能力的要求程度:既需要具備較強(qiáng)的數(shù)學(xué)與機(jī)器學(xué)習(xí)理論基礎(chǔ),又需要精通計(jì)算機(jī)編程與必要的體系結(jié)構(gòu)知識(shí)。
編程語(yǔ)言
在深度學(xué)習(xí)中,使用最多的兩門編程語(yǔ)言分別是C++和Python。迄今為止,C++語(yǔ)言依舊是實(shí)現(xiàn)高性能系統(tǒng)的首選,目前使用最廣泛的幾個(gè)深度學(xué)習(xí)框架,包括Tensorflow、Caffe、MXNet,其底層均無(wú)一例外地使用C++編寫。而上層的腳本語(yǔ)言一般為Python,用于數(shù)據(jù)預(yù)處理、定義網(wǎng)絡(luò)模型、執(zhí)行訓(xùn)練過(guò)程、數(shù)據(jù)可視化等。當(dāng)前,也有Lua、R、Scala、Julia等語(yǔ)言的擴(kuò)展包出現(xiàn)于MXNet社區(qū),呈現(xiàn)百花齊放的趨勢(shì)。這里推薦兩本教材,一本是《C++ Primer第五版》,另外一本是《Python核心編程第二版》。
Linux操作系統(tǒng)
深度學(xué)習(xí)系統(tǒng)通常運(yùn)行在開源的Linux系統(tǒng)上,目前深度學(xué)習(xí)社區(qū)較為常用的Linux發(fā)行版主要是Ubuntu。對(duì)于Linux操作系統(tǒng),主要需要掌握的是Linux文件系統(tǒng)、基本命令行操作和Shell編程,同時(shí)還需熟練掌握一種文本編輯器,比如VIM。基本操作務(wù)必要做到熟練,當(dāng)需要批量替換一個(gè)文件中的某個(gè)字符串,或者在兩臺(tái)機(jī)器之間用SCP命令拷貝文件時(shí),你不需要急急忙忙去打開搜索引擎。這里推薦一本工具書《鳥哥的Linux私房菜》。
CUDA編程
深度學(xué)習(xí)離不開GPU并行計(jì)算,而CUDA是一個(gè)很重要的工具。CUDA開發(fā)套件是NVidia提供的一套GPU編程套件,實(shí)踐當(dāng)中應(yīng)用的比較多的是CUDA-BLAS庫(kù)。這里推薦NVidia的官方在線文檔。
其他計(jì)算機(jī)基礎(chǔ)知識(shí)
掌握深度學(xué)習(xí)技術(shù)不能只滿足于使用Python調(diào)用幾個(gè)主流深度學(xué)習(xí)框架,從源碼著手去理解深度學(xué)習(xí)算法的底層實(shí)現(xiàn)是進(jìn)階的必由之路。這個(gè)時(shí)候,掌握數(shù)據(jù)結(jié)構(gòu)與算法(尤其是圖算法)知識(shí)、分布式計(jì)算(理解常用的分布式計(jì)算模型),和必要的GPU和服務(wù)器的硬件知識(shí)(比如當(dāng)我說(shuō)起CPU的PCI-E通道數(shù)和GPU之間的數(shù)據(jù)交換瓶頸時(shí),你能心領(lǐng)神會(huì)),你一定能如虎添翼。
深度學(xué)習(xí)入門
接下來(lái)分別從理論和實(shí)踐兩個(gè)角度來(lái)介紹一下深度學(xué)習(xí)的入門。
深度學(xué)習(xí)理論入門
我們可以用一張圖(圖1)來(lái)回顧深度學(xué)習(xí)中的關(guān)鍵理論和方法。從MCP神經(jīng)元模型開始,首先需要掌握卷積層、Pooling層等基礎(chǔ)結(jié)構(gòu)單元,Sigmoid等激活函數(shù),Softmax等損失函數(shù),以及感知機(jī)、MLP等經(jīng)典網(wǎng)絡(luò)結(jié)構(gòu)。接下來(lái),掌握網(wǎng)絡(luò)訓(xùn)練方法,包括BP、Mini-batch SGD和LR Policy。最后還需要了解深度網(wǎng)絡(luò)訓(xùn)練中的兩個(gè)至關(guān)重要的理論問(wèn)題:梯度消失和梯度溢出。
以卷積神經(jīng)網(wǎng)絡(luò)為例,我們用圖2來(lái)展示入門需要掌握的知識(shí)。起點(diǎn)是Hubel和Wiesel的對(duì)貓的視覺(jué)皮層的研究,再到日本學(xué)者福島邦彥神經(jīng)認(rèn)知機(jī)模型(已經(jīng)出現(xiàn)了卷積結(jié)構(gòu)),但是第一個(gè)CNN模型誕生于1989年,1998年誕生了后來(lái)被大家熟知的LeNet。隨著ReLU和Dropout的提出,以及GPU和大數(shù)據(jù)所帶來(lái)的歷史機(jī)遇,CNN在2012年迎來(lái)了歷史性的突破——誕生了AlexNet網(wǎng)絡(luò)結(jié)構(gòu)。2012年之后,CNN的演化路徑可以總結(jié)為四條:
更深的網(wǎng)絡(luò);
增強(qiáng)卷積模的功能以及上訴兩種思路的融合ResNet和各種變種;
從分類到檢測(cè),最新的進(jìn)展為ICCV 2017的Best Paper Mask R-CNN;
增加新的功能模塊。
深度學(xué)習(xí)實(shí)踐入門
掌握一個(gè)開源深度學(xué)習(xí)框架的使用,并進(jìn)一步地研讀代碼,是實(shí)際掌握深度學(xué)習(xí)技術(shù)的必經(jīng)之路。當(dāng)前使用最為廣泛的深度學(xué)習(xí)框架包括Tensorflow、Caffe、MXNet和PyTorch等。框架的學(xué)習(xí)沒(méi)有捷徑,按照官網(wǎng)的文檔step by step配置及操作,參與GitHub社區(qū)的討論,遇到不能解答的問(wèn)題及時(shí)Google是快速實(shí)踐入門的好方法。
初步掌握框架之后,進(jìn)一步的提升需要依靠于具體的研究問(wèn)題,一個(gè)短平快的策略是先刷所在領(lǐng)域權(quán)威的Benchmark。例如人臉識(shí)別領(lǐng)域的LFW和MegaFace,圖像識(shí)別領(lǐng)域與物體檢測(cè)領(lǐng)域的ImageNet、Microsoft COCO,圖像分割領(lǐng)域的Pascal VOC等。通過(guò)復(fù)現(xiàn)或改進(jìn)別人的方法,親手操練數(shù)據(jù)的準(zhǔn)備、模型的訓(xùn)練以及調(diào)參,能在所在領(lǐng)域的Benchmark上達(dá)到當(dāng)前最好的結(jié)果,實(shí)踐入門的環(huán)節(jié)就算初步完成了。
后續(xù)的進(jìn)階,就需要在實(shí)戰(zhàn)中不斷地去探索和提升了。例如:熟練的處理大規(guī)模的訓(xùn)練數(shù)據(jù),精通精度和速度的平衡,掌握調(diào)參技巧、快速?gòu)?fù)現(xiàn)或改進(jìn)他人的工作,能夠?qū)崿F(xiàn)新的方法等等。
深度學(xué)習(xí)實(shí)戰(zhàn)經(jīng)驗(yàn)
在這里,分享四個(gè)方面的深度學(xué)習(xí)實(shí)戰(zhàn)經(jīng)驗(yàn)。
1. 充足的數(shù)據(jù)
大量且有標(biāo)注的數(shù)據(jù),依舊在本質(zhì)上主宰著深度學(xué)習(xí)模型的精度,每一個(gè)深度學(xué)習(xí)從業(yè)者都需要認(rèn)識(shí)到數(shù)據(jù)極端重要。獲取數(shù)據(jù)的方式主要有三種:開放數(shù)據(jù)(以學(xué)術(shù)界開放為主,如ImageNet和LFW)、第三方數(shù)據(jù)公司的付費(fèi)數(shù)據(jù)和結(jié)合自身業(yè)務(wù)產(chǎn)生的數(shù)據(jù)。
2. 熟練的編程實(shí)現(xiàn)能力
深度學(xué)習(xí)算法的實(shí)現(xiàn)離不開熟練的編程能力,熟練使用Python進(jìn)行編程是基礎(chǔ)。如果進(jìn)一步的修改底層實(shí)現(xiàn)或增加新的算法,則可能需要修改底層代碼,此時(shí)熟練的C++編程能力就變得不可或缺。一個(gè)明顯的現(xiàn)象是,曾經(jīng)只需要掌握Matlab就可以笑傲江湖的計(jì)算機(jī)視覺(jué)研究者,如今也紛紛需要開始補(bǔ)課學(xué)習(xí)Python和C++了。
3. 充裕的GPU資源
深度學(xué)習(xí)的模型訓(xùn)練依賴于充裕的GPU資源,通過(guò)多機(jī)多卡的模型并行,就可以有效的提高模型收斂速度,從而更快的完成算法驗(yàn)證和調(diào)參。一個(gè)專業(yè)從事深度學(xué)習(xí)的公司或?qū)嶒?yàn)室,擁有數(shù)十塊到數(shù)百塊的GPU資源已經(jīng)是普遍現(xiàn)象。
4. 創(chuàng)新的方法
以深度學(xué)習(xí)領(lǐng)域權(quán)威的ImageNet競(jìng)賽為例,從2012年深度學(xué)習(xí)技術(shù)在競(jìng)賽中奪魁到最后一屆2017競(jìng)賽,方法創(chuàng)新始終是深度學(xué)習(xí)進(jìn)步的核心動(dòng)力。如果只是滿足于多增加一點(diǎn)數(shù)據(jù),把網(wǎng)絡(luò)加深或調(diào)幾個(gè)SGD的參數(shù),那么是難以做出真正一流的成果的。
根據(jù)筆者的切身經(jīng)歷,方法創(chuàng)新確實(shí)能帶來(lái)難以置信的結(jié)果。一次參加阿里巴巴組織的天池圖像檢索比賽,筆者提出的一點(diǎn)創(chuàng)新——使用標(biāo)簽有噪聲數(shù)據(jù)的新型損失函數(shù),結(jié)果竟極大地提高了深度模型的精度,還拿到了當(dāng)年的冠軍。
深度學(xué)習(xí)前沿
前沿信息的來(lái)源:
實(shí)戰(zhàn)中的技術(shù)進(jìn)階,必需要了解深度學(xué)習(xí)的最新進(jìn)展。換句話說(shuō),就是刷論文:除了定期刷Arxiv,刷代表性工作的Google Scholar的引用,關(guān)注ICCV、CVPR和ECCV等頂級(jí)會(huì)議之外,知乎的深度學(xué)習(xí)專欄和Reddit上時(shí)不時(shí)會(huì)有最新論文的討論(或者精彩的吐槽)。
一些高質(zhì)量的公眾號(hào),例如Valse前沿技術(shù)選介、深度學(xué)習(xí)大講堂、Paper Weekly等,也時(shí)常有深度學(xué)習(xí)前沿技術(shù)的推送,也都可以成為信息獲取的來(lái)源。同時(shí),關(guān)注學(xué)術(shù)界大佬LeCun和Bengio等人的Facebook/Quora主頁(yè),關(guān)注微博大號(hào)“愛(ài)可可愛(ài)生活”等人,也常有驚喜的發(fā)現(xiàn)。
建議關(guān)注的重點(diǎn):
新的網(wǎng)絡(luò)結(jié)構(gòu)。在以SGD為代表的深度學(xué)習(xí)優(yōu)化方法沒(méi)有根本性突破的情況下,修改網(wǎng)絡(luò)結(jié)構(gòu)是可以較快提升網(wǎng)絡(luò)模型精度的方法。2015年以來(lái),以ResNet的各種改進(jìn)為代表的各類新型網(wǎng)絡(luò)結(jié)構(gòu)如雨后春筍般涌現(xiàn),其中代表性的有DenseNet、SENet、ShuffuleNet等。
新的優(yōu)化方法。縱觀從1943年MCP模型到2017年間的人工神經(jīng)網(wǎng)絡(luò)發(fā)展史,優(yōu)化方法始終是進(jìn)步的靈魂。以誤差反向傳導(dǎo)(BP)和隨機(jī)梯度下降(SGD)為代表的優(yōu)化技術(shù)的突破,或是Sigmoid/ReLU之后全新一代激活函數(shù)的提出,都非常值得期待。筆者認(rèn)為,近期的工作如《Learning gradient descent by gradient descent》以及SWISH激活函數(shù),都很值得關(guān)注。但能否取得根本性的突破,也即完全替代當(dāng)前的優(yōu)化方法或ReLU激活函數(shù),尚不可預(yù)測(cè)。
新的學(xué)習(xí)技術(shù)。深度強(qiáng)化學(xué)習(xí)和生成對(duì)抗網(wǎng)絡(luò)(GAN)。最近幾周刷屏的Alpha Zero再一次展示了深度強(qiáng)化學(xué)習(xí)的強(qiáng)大威力,完全不依賴于人類經(jīng)驗(yàn),在圍棋項(xiàng)目上通過(guò)深度強(qiáng)化學(xué)習(xí)“左右互搏”所練就的棋力,已經(jīng)遠(yuǎn)超過(guò)上一代秒殺一眾人類高手的AlghaGo Master。同樣的,生成對(duì)抗網(wǎng)絡(luò)及其各類變種也在不停地預(yù)告一個(gè)學(xué)習(xí)算法自我生成數(shù)據(jù)的時(shí)代的序幕。筆者所在的公司也正嘗試將深度強(qiáng)化學(xué)習(xí)和GAN相結(jié)合,以此用于跨模態(tài)的訓(xùn)練數(shù)據(jù)的增廣。
新的數(shù)據(jù)集。數(shù)據(jù)集是深度學(xué)習(xí)算法的練兵場(chǎng),因此數(shù)據(jù)集的演化是深度學(xué)習(xí)技術(shù)進(jìn)步的縮影。以人臉識(shí)別為例,后LFW時(shí)代,MegaFace和Microsoft Celeb-1M數(shù)據(jù)集已接棒大規(guī)模人臉識(shí)別和數(shù)據(jù)標(biāo)簽噪聲條件下的人臉識(shí)別。后ImageNet時(shí)代,Visual Genome正試圖建立一個(gè)包含了對(duì)象、屬性、關(guān)系描述、問(wèn)答對(duì)在內(nèi)的視覺(jué)基因組。
評(píng)論
查看更多