來源 | 程式設計師管小亮
本文創作的主要目的,是對時下最火最流行的深度學習算法的基礎知識做一個簡介,作者看過許多教程,感覺對小白不是特別友好,尤其是在踩過好多坑之後,於是便有了寫這篇文章的想法。
由於文章較長,建議收藏~
本文文中會有個人推薦的學習資源。
一、簡介
百度百科中對深度學習的定義是深度學習(DL, Deep Learning)是機器學習(ML, Machine Learning)領域中一個新的研究方向,它被引入機器學習使其更接近於最初的目標——人工智慧(AI, Artificial Intelligence)。這個定義太大了,反而讓人有點不懂,簡答來說,深度學習就是通過多層神經網絡上運用各種機器學習算法學習樣本數據的內在規律和表示層次,從而實現各種任務的算法集合。各種任務都是啥,有:數據挖掘,計算機視覺,語音識別,自然語言處理等。
可能有人會問那麼深度學習,機器學習還有人工智慧的關係是怎麼樣的呢?在這個博客中有詳細介紹:一篇文章看懂人工智慧、機器學習和深度學習,我們這裡直接拿出結論:
AI:讓機器展現出人類智力機器學習:抵達AI目標的一條路徑深度學習:實現機器學習的技術深度學習從大類上可以歸入神經網絡,不過在具體實現上有許多變化,並不像大家聽到的一樣,覺得這兩個概念其實是同一個東西:
從廣義上說深度學習的網絡結構也是多層神經網絡的一種。更簡單來說,多層神經網絡做的步驟是:特徵映射到值。特徵是人工挑選。深度學習做的步驟是 信號->特徵->值。特徵是由網絡自己選擇。深度學習的核心是 特徵學習,旨在通過分層網絡獲取分層次的特徵信息,從而解決以往需要人工設計特徵的重要難題。深度學習是一個框架,包含多個重要算法:
Convolutional Neural Networks(CNN)卷積神經網絡AutoEncoder自動編碼器Sparse Coding稀疏編碼Restricted Boltzmann Machine(RBM)限制波爾茲曼機Deep Belief Networks(DBN)深度信念網絡Recurrent neural Network(RNN)多層反饋循環神經網絡神經網絡對不同的任務(圖像,語音,文本),需要選用不同的網絡模型才能達到更好的效果。
此外,最近幾年 增強學習(Reinforcement Learning)與深度學習的結合也創造了許多了不起的成果,AlphaGo就是其中之一。
大家比較關注的熱點新聞,如下圖所示:
二、人類視覺原理
深度學習的許多研究成果,離不開對大腦認知原理的研究,尤其是視覺原理的研究。
1981 年的諾貝爾醫學獎,頒發給了 David Hubel(出生於加拿大的美國神經生物學家) 和TorstenWiesel,以及 Roger Sperry。前兩位的主要貢獻,是「發現了視覺系統的信息處理」——可視皮層是分級的。如下圖所示:
進而通過大量試驗研究,發現了人類的視覺原理,具體如下:從原始信號 攝入開始(瞳孔攝入像素 Pixels),接著做初步處理(大腦皮層某些細胞發現邊緣和方向),然後抽象(大腦判定,眼前的物體的形狀,是圓形的),然後進一步抽象(大腦進一步判定該物體是只氣球)。
下面是人腦進行人臉識別的一個示例。如下圖所示:
總的來說,人的視覺系統的信息處理是 分級的。從低級的V1區提取邊緣特徵,再到V2區的形狀或者目標的部分等,再到更高層,整個目標、目標的行為等。也就是說高層的特徵是低層特徵的組合,從低層到高層的特徵表示越來越抽象,越來越能表現語義或者意圖。而抽象層面越高,存在的可能猜測就越少,就越利於分類。
對於不同的物體,人類視覺也是通過這樣 逐層分級,來進行認知的。如下圖所示:
那麼可以很自然的想到:可以不可以模仿人類大腦的這個特點,構造多層的神經網絡,較低層的識別初級的圖像特徵,若干底層特徵組成更上一層特徵,最終通過多個層級的組合,最終在頂層做出分類呢?答案是肯定的,這也是許多深度學習算法(包括CNN)的靈感來源。
三、神經網絡
首先什麼是神經網絡呢?神經網絡也指的是 人工神經網絡(Artificial Neural Networks,簡稱ANNs),是一種模仿生物神經網絡行為特徵的算法數學模型,由神經元、節點與節點之間的連接(突觸)所構成,如下圖所示:
每個神經網絡單元抽象出來的數學模型如下,也叫 感知器,它接收多個輸入(
單個的感知器就構成了一個簡單的模型,但在現實世界中,實際的決策模型則要複雜得多,往往是由多個感知器組成的多層網絡,如下圖所示,這也是經典的神經網絡模型,由 輸入層、隱含層、輸出層構成。如下圖所示:
人工神經網絡可以映射任意複雜的非線性關係,具有很強的魯棒性、記憶能力、自學習等能力,在分類、預測、模式識別等方面有著廣泛的應用。
四、卷積神經網絡
4.1、CNN定義
主角登場,其他人退讓!!!如下圖所示:
重點來了,什麼是卷積神經網絡?
百度百科中的定義是 卷積神經網絡(Convolutional Neural Networks, CNN)是一類包含卷積計算且具有深度結構的前饋神經網絡(Feedforward Neural Networks),是深度學習(deep learning)的代表算法之一,擅長處理圖像特別是圖像識別等相關機器學習問題。
卷積網絡通過一系列方法,成功將數據量龐大的圖像識別問題不斷降維,最終使其能夠被訓練。
4.2、卷積(Convolution)
卷積神經網絡中的核心即為卷積運算,其相當於圖像處理中的濾波器運算。對於一個 大小的卷積核,
其對某一原圖像 進行卷積運算的過程為:卷積核 中的每一個權值 分別和覆蓋的原圖像 中所對應的像素 相乘,然後再求和。計算公式為:
所以一幅圖像的一個完整的卷積運算過程為:卷積核以一定的間隔滑動,並對所覆蓋的區域進行卷積運算得到值 z,直至遍歷完整幅圖像。如下圖所示: 舉一個標準的卷積運算例子,初始位置的計算過程是:1x1+1x0+1x1+0x0+1x1+1x0+0x1+0x0+1x1=4,詳細的就不推導了。
如上圖,卷積核大小是3x3的,也就是說其卷積核每次覆蓋原圖像的9個像素,行和列都滑動了3次,一共滑動3x3=9次,得到了一個 的二維數據。這個大小是怎麼計算的呢?
首先給出結論,對於一個大小為 的原圖像,經過大小為 的卷積運算後,其輸出圖像的尺寸為 。所以對於上圖的例子,5-3+1=3即為所求。
4.3、步長(stride)
滑動一定的間距,但這個間距該如何定義呢? 這個概念就是卷積的 「步長」(stride)。經過步長 的操作後,其輸出圖像的尺寸為:
其中 n 是圖像大小,f 是卷積核大小,s 是步長。
stride = 1 表示卷積核滑過每一個相距是 1 的像素,是最基本的單步滑動,作為標準卷積模式。Stride 是 2 表示卷積核的移動步長是 2,跳過相鄰像素,輸出圖像縮小為原來的 1/2。Stride 是 3 表示卷積核的移動步長是 3,跳過 2 個相鄰像素,圖像縮小為原來的 1/3,以此類推。。。
詳細的卷積層尺寸推算細節可以看一下這個文章——CNN中卷積層的計算細節
4.4、填充(padding)
在標準的卷積過程中,存在兩個問題:
每次卷積運算後,圖像就會縮小尺寸。在經歷多次運算後,圖像最終會失去其本來的形狀,變為 的 「柱狀」。對於圖像邊緣的像素,只被一個輸出使用,但圖像中間的像素,則被多個輸出使用。這意味著卷積過程丟掉了圖像邊緣位置的許多信息。對於這個問題,可以採用額外的 「假」 像素(通常值為 0, 因此經常使用的術語 」零填充「 )填充邊緣。這樣,在滑動時的卷積核可以允許原始邊緣像素位於其中心,同時延伸到邊緣之外的假像素。假設填充的像素大小為 ,則 就變成了 ,故其輸出圖像的尺寸為 。
至於是否選擇填充像素,通常有兩個選擇,分別叫做 Valid 卷積和 Same 卷積。
Valid 卷積意味著 不填充,即圖像會通過卷積並逐漸縮小,輸出的圖像尺寸即為上述公式:。Same卷積意味 填充,輸出圖像的尺寸與輸入圖像的尺寸相同。根據上述尺寸的計算公式,令 ,可得到 。當 s=1 時,。
4.5、池化(Pooling)
隨著模型網絡不斷加深,卷積核越來越多,要訓練的參數還是很多,而且直接拿卷積核提取的特徵直接訓練也容易出現過擬合的現象。CNN使用的另一個有效的工具被稱為「池化(Pooling)」出現並解決了上面這些問題,為了有效地減少計算量,池化就是將輸入圖像進行縮小,減少像素信息,只保留重要信息;為了有效地解決過擬合問題,池化可以減少數據,但特徵的統計屬性仍能夠描述圖像,而由於降低了數據維度,可以有效地避免過擬合。
給出池化的定義,對不同位置區域提取出有代表性的特徵(進行聚合統計,例如最大值、平均值等),這種聚合的操作就叫做 池化,池化的過程通常也被稱為特徵映射的過程(特徵降維)。聽起來很高深,其實簡單地說就是下採樣。
池化的過程如下圖所示:
池化主要有兩種,除了 最大值池化(Max Pooling)之外,還有平均值池化(Average pooling),CNN中隨機池化使用的較少。
最大池化是對局部的值取最大;平均池化是對局部的值取平均;隨機池化是根據概率對局部的值進行採樣,採樣結果便是池化結果。概念非常容易理解,其示意圖如下所示:
三種池化的意義:
最大池化可以獲取局部信息,可以更好保留紋理上的特徵。如果不用觀察物體在圖片中的具體位置,只關心其是否出現,則使用最大池化效果比較好。平均池化往往能保留整體數據的特徵,能凸出背景的信息。隨機池化中元素值大的被選中的概率也大,但不是像最大池化總是取最大值。隨機池化一方面最大化地保證了Max值的取值,一方面又確保了不會完全是max值起作用,造成過度失真。除此之外,其可以在一定程度上避免過擬合。
4.6、激活函數
回顧一下感知機,感知機在接收到各個輸入,然後進行求和,再經過激活函數後輸出。為什麼神經網絡需要非線性激活函數?
為了使神經網絡能夠擬合出各種複雜的函數,必須使用 非線性激活函數,用來加入非線性因素,把卷積層輸出結果做非線性映射。
在神經網絡的正向傳播過程中,如果我們去掉激活函數 ,則 ,這個有時被叫做 線性激活函數(更學術點的名字是恆等激勵函數,因為它們就是把輸入值恆等地輸出),具體公式如下:
第一層:
第二層:
將 帶入可得第二層:,令 ,,則第二層變為:。
依此類推,網絡的輸出僅僅只是輸入特徵的線性組合。實際上,無論網絡有多少層,整體完全可以僅使用1層表示。同理,引入其他線性函數 (如 )仍然起不到任何作用,因為線性函數的組合本身仍是線性函數。
常用的激活函數有sigmoid、tanh、relu等等,前兩者sigmoid / tanh比較常見於全連接層,後者ReLU常見於卷積層。
4.7、局部感知
為什麼要採用局部感知呢?因為可以降低參數量級。為什麼要降低參數量級呢?因為如果採用經典的神經網絡模型,如下圖所示:
則需要讀取整幅圖像作為神經網絡模型的輸入(即全連接的方式),當圖像的尺寸越大時,其連接的參數將變得很多,從而導致計算量非常大。比如對於一張1000x1000像素的圖片,如果我們有1M隱藏層單元,那麼一共有 個參數,這顯然是不能接受的。如下圖所示:
而人類對外界的認知一般是從局部到全局、從片面到全面,先對局部有感知的認識,再逐步對全體有認知,這是人類的認識模式。類似的,在機器識別圖像時也沒有必要把整張圖像按像素全部都連接到神經網絡中,局部範圍內的像素之間聯繫較為緊密,而距離較遠的像素則相關性較弱。因而,每個神經元其實沒有必要對全局圖像進行感知,只需要對局部進行感知,然後在更高層將局部的信息綜合起來就得到了全局的信息。這種模式就是卷積神經網絡中降低參數數目的重要神器:局部感受野,節省了內存。
4.8、參數(權值)共享
每張自然圖像(人物、山水、建築等)都有其固有特性,也就是說,圖像其中一部分的統計特性與其它部分是接近的。這也意味著這一部分學習的特徵也能用在另一部分上。因此,在局部連接中隱藏層的每一個神經元連接的局部圖像的權值參數(例如5×5),將這些權值參數共享給其它剩下的神經元使用,那麼此時不管隱藏層有多少個神經元,需要訓練的參數就是這個局部圖像的權限參數(例如5×5),也就是卷積核的大小,這樣大大減少了訓練參數。如下圖所示:
舉個例子,假設使用某一特徵過濾器(檢測器)提取 「手寫5」 的特徵,那麼圖片的右下角區域,以及旁邊的各個區域都可以使用這個過濾器。每個特徵檢測器以及輸出都可以在輸入圖片的不同區域中使用同樣的參數,以便提取特徵 「5」。而對於全連接網絡來說,如果模式出現在新的位置,它只能重新學習這個模式。這使得卷積神經網絡在處理圖像時可以高效利用數據(因為視覺世界從根本上具有 平移不變性),只需要更少的訓練樣本就可以學到具有泛化能力的數據表示。
4.9、感受野(Receptive field)
感受野用來表示網絡內部的不同神經元對原圖像的感受範圍的大小,換句話說,即為每一層輸出的特徵圖(feature map)上的像素點在原始圖像上映射的區域大小。
神經元之所以無法對原始圖像的所有信息進行感知,是因為在這些網絡結構中普遍使用卷積層和pooling層,在層與層之間均為局部連接。神經元感受野的值越大表示其能接觸到的原始圖像範圍就越大,也意味著它可能蘊含更為全局,語義層次更高的特徵;相反,值越小則表示其所包含的特徵越趨向局部和細節。因此感受野的值可以用來大致判斷每一層的抽象層次。
可以看到在Conv1中的每一個單元所能看到的原始圖像範圍是33,而由於Conv2的每個單元都是由 22範圍的Conv1構成,因此回溯到原始圖像,其實是能夠看到5*5的原始圖像範圍的。因此我們說Conv1的感受野是3,Conv2的感受野是5。輸入圖像的每個單元的感受野被定義為1,這應該很好理解,因為每個像素只能看到自己。
五、可視化
學習前的卷積核是隨機進行初始化的,使用截斷的正態分布或者其他的,所以在黑白的濃淡上沒有規律可循,但學習後的濾波器變成了有規律的圖像。可以發現,通過學習濾波器被更新成了有規律的濾波器,比如從白到黑漸變的濾波器、含有塊狀區域(稱為blob)的濾波器等。
不同卷積核經過學習,改變了自身對不同特徵的響應程度,如邊緣(顏色變化的分界線)和斑塊(局部的塊狀區域)等,其中第2個卷積核對垂直邊緣響應,第5個卷積核對水平邊緣響應,第9個對傾斜邊緣響應,第13個對中心斑塊響應。
上面的結果是針對第1層的卷積層得出的。第1層的卷積層中提取了邊緣或斑塊等「低級」信息,而在堆疊了多層的CNN中,隨著層次加深,提取的信息(準確說,是響應強烈的神經元))也越來越抽象。如圖6.2所示,第1層的神經元對邊緣或斑塊有響應,第3層對紋理有響應,第5層對物體部件有響應,最後的全連接層對物體的類別(狗或車)有響應。
也就是說,隨著層次加深,神經元從簡單的形狀向「高級」信息變化。換句話說,就像我們理解東西的「含義」一樣,響應的對象在逐漸變化。
應用
CNN 最早由Yann LeCun提出並應用在手寫字體識別上(MINST)。
當年美國大多數銀行就是用它來識別支票上面的手寫數字的。能夠達到這種商用的地步,它的準確性可想而知。畢竟目前學術界和工業界的結合是最受爭議的。LeCun提出的網絡稱為LeNet5(效果和paper等的連結在這),其網絡結構如下:
這是一個最典型的卷積網絡,由卷積層、池化層、全連接層組成,通過巧妙的設計,利用卷積、參數共享、池化等操作 提取特徵,避免了大量的計算成本,最後再使用全連接神經網絡進行分類識別,這個網絡也是最近大量神經網絡架構的起點,給這個領域帶來了許多靈感。
詳細的論文講解,可以查看這個博客——大話CNN經典模型:LeNet
可視化的結果:
七、深度學習的本質
在Hinton對深層網絡做Pre-Train開始就是一個 經驗領先於理論分析的偏經驗的一門學問,所以很多人戲稱為黑盒子。那麼深度學習的本質到底是什麼呢?我個人更偏向於這種說法——本質就是高維特徵變換器,理論上可以做到任意非線性變換。神經網絡在坐標系變換的同時,也順便充當了信息過濾器。
境界
深度學習目前處於風口,於是很多人想要渾水摸魚,都來分一杯羹,然而可能很多人連深度學習是什麼都不知道。所以很多人在自學的時候,又不知道從何學起。下了一堆資料,跑了一堆demo,報了一堆cousera,調調參,看看模型結果不錯,就以為入了門,抱歉,可能你連門都沒入。深度學習這塊,有幾個層次:
demo俠:下載了目前所有流行的框架,對不同框裡的例子都跑一跑,看看結果,覺得不錯就行了,進而覺得,嘛,深度學習也不過如此嘛,沒有多難啊。在面試的時候經常可以遇到不少,很多學生或者剛轉行的上來就是講一個demo,手寫數字識別,cifar10數據的圖像分類等等,然而你問他這個手寫數字識別的具體過程如何實現的?現在效果是不是目前做好的,可以再優化一下嗎?為什麼激活函數要選這個,可以選別的嗎?CNN的原理能簡單講講嗎?懵逼了。調參俠:此類人可能不局限於跑了幾個demo,對於模型裡的參數也做了一些調整,不管調的好不好,先試了再說,每個都試一下,學習率調大了準確率下降了,那就調小一點,那個參數不知道啥意思,隨便改一下值測一下準確率吧。這是大多數初級深度學習工程師的現狀。當然,並不是這樣不好,對於demo俠來說,已經進步了不少了,起碼有思考。然而如果你問,你調整的這個參數為什麼會對模型的準確率帶來這些影響,這個參數調大調小對結果又會有哪些影響,就又是一問三不知了。懂原理俠:抱歉起了個這麼蠢的名字。但是,進階到這一步,已經可以算是入門了,可以找一份能養活自己的工作了。CNN,RNN,LSTM信手拈來,原理講的溜的飛起,對於不同的參數對模型的影響也是說的有理有據,然而,如果你要問,你可以手動寫一個CNN嗎?不用調包,實現一個最基礎的網絡結構即可,又gg了。懂原理+能改模型細節俠:如果你到了這一步,恭喜你,入門了。對於任何一個做機器學習/深度學習的人來說,只懂原理是遠遠不夠的,因為公司不是招你來做研究員的,來了就要幹活,幹活就要落地。既然要落地,那就對於每一個你熟悉的,常見的模型能夠自己手動寫代碼運行出來,這樣對於公司的一些業務,可以對模型進行適當的調整和改動,來適應不同的業務場景。這也是大多數一二線公司的工程師們的現狀。然而,對於模型的整體架構能力,超大數據的分布式運行能力,方案設計可能還有所欠缺。超大數據操控俠:到這一階段,基本上開始考慮超大數據的分布式運行方案,對整體架構有一個宏觀的了解,對不同的框架也能指點一二。海量數據的分布式運行如何避免網絡通信的延遲,如何更高效更迅速的訓練都有一定經驗。這類人,一般就是上一個的領導了。模型/框架架構師:前面說了一堆都是對現有的框架/模型處理的經驗,這個階段的大俠,哦,不對,是大師可以獨立設計開發一套新框架/算法來應對現有的業務場景,或者解決一直未解決的歷史遺留問題。沒啥好說了,膜拜!有的童鞋會好奇博主是啥水平,實話實說了吧,我也就是個 半斤八兩的懂原理俠。。。希望畢業能稱為一個懂原理+能改模型細節俠,哈哈,暫時沒啥大目標。
學習資源
9.1、編程
首推Python這門程式語言。
Python安裝:Python安裝包,推薦下載Anaconda,Anaconda是一個用於科學計算的Python發行版,支持 Linux, Mac, Windows系統,提供了包管理與環境管理的功能,可以很方便地解決多版本Python並存、切換以及各種第三方包安裝問題。
IDE:推薦使用pycharm,社區版免費
安裝教程:
Anaconda+Jupyter notebook+Pycharm:https://blog.csdn.net/TeFuirnever/article/details/90646020Ubuntu18.04深度學習環境配置(CUDA9+CUDNN7.4+TensorFlow1.8):https://zhuanlan.zhihu.com/p/50302396python入門的資料推薦廖雪峰python學習筆記:https://blog.csdn.net/datawhale/article/category/7779959
看完這個資料後python基本達到入門水平。
9.2、理論
這絕對是深度學習入門的首選課程,沒有之一!即便你沒有紮實的概率論、線性代數等數學基礎,也能輕鬆上手這門深度學習入門課,並體會到無窮趣味。
課程地址:https://mooc.study.163.com/university/deeplearning_ai#/c
9.3、框架
當今深度學習框架有很多,主流的是Google的TensorFlow、Facebook的pytorch還有百度的paddlepaddle,其他的也可以學,這東西多多益善,初學者建議TensorFlow,容易理解一下。
TensorFlow中文社區深度學習之30分鐘快速入門PyTorch(附學習資源推薦)paddlepaddle中文社區
9.4、論文
推薦這個大博主的正例論文資源——https://blog.csdn.net/zouxy09/article/details/8782018
神經網絡遊樂場
網站地址:https://dwz.cn/ji9fh4ae
可以調整:
數據分布,訓練集和測試集的比例,有無噪聲,批大小;特徵,神經元個數和層數;學習率,激活函數,正則化與否以及大小,分類還是回歸。你可以嘗試去改變相應的參數,從而感受一下網絡輸出的變化,進而體會到卷積神經網絡的樂趣,加油!!!
GitHub標星2000+,如何用30天啃完TensorFlow2.0?清華周界詳解《基於圖神經網絡的事實驗證》 | 百萬人學AI百年 IBM 終於 All In 人工智慧和混合雲!微軟為一人收購一公司?破解索尼程序、寫黑客小說,看他彪悍的程序人生!機器學習項目模板:ML項目的6個基本步驟BM、微軟、蘋果、谷歌、三星……這些區塊鏈中的科技巨頭原來已經做了這麼多事!