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