幾幅手稿講解CNN

學習深度神經網絡方面的算法已經有一段時間了,對目前比較經典的模型也有了一些瞭解。這種曾經一度低迷的方法如今已經吸引了不少領域的目光,在幾年前僅僅存在於研究者想象中的應用,近幾年也相繼被深度學習方法實現了。不管是對數據的分析或是生成,不管數據形式是圖像、視頻、音頻、文本仍是其它複雜維度,也不管是下棋、玩遊戲仍是無人駕駛汽車導航,彷佛總有人會發掘出這種強大工具的新用途。人類剛剛將仿生學運用到「如何創造智能」這個問題上,就發現了光明的前景。php

        我把在組裏介紹深度學習(Deep Learning)基礎知識時畫的幾幅手稿分享出來,但願能幫助新人更快的瞭解這種方法。我在講解的過程當中參考了李宏毅老師的PPT(網絡上他的PPT也有不止一個版本,YouTube也有視頻教程),推薦讀者結合起來閱讀。算法


        任何一個算法均可以看做一個函數。輸入x通過函數f產生輸出y,咱們指望得到的輸出是\hat{y},因此咱們的目的是找到一個函數f,使得y\hat{y}儘量的接近。性能優化

        同時,函數y由一組參數W肯定,因此輸出y能夠看做是輸入x和參數W的因變量。當參數W固定時,每當輸入不一樣的x,其對應的輸出y通常也會不一樣。這時,y\hat{y}之間的差別稱做偏差(loss)。描述xW\hat{y}與偏差loss之間關係的函數叫做偏差函數(loss function)。對於實際問題,通常偏差函數總會存在一個最小值。尋找最優函數f的過程,實際上就是尋找一組參數W,使得不管輸入x如何(固然是位於定義域內的x),其偏差老是最小的。網絡

        對於分類問題,函數f就是分類器,W就是須要經過訓練得到的分類器參數。機器學習


        在神經網絡算法中,最基本的組成單位如圖中左上所示,前一層神經元a_1a_2a_3(有時還有一個按層獨立的疊加項b,稱爲偏置節點bias),通過權邊w_1w_2w_3鏈接到下一層的節點z。權重w與節點a之間能夠是簡單的相乘再求和(線性網絡),也能夠是卷積後再求和(卷積神經網絡,Convolutional Neural Networks,CNN),或者是其餘的計算形式。即使是簡單的線性運算,一個基本的單元能夠用來表示一個線性分類器(左下),也能夠用於線性擬合(右下),並且通過多層的累積計算以後還能夠處理更復雜的問題。ide


        卷積神經網絡當中的「卷積」(convolution)與圖像處理中的濾波器(filter)十分類似,只不過在濾波器中求和時輸入元素與窗口元素是同向的,而在卷積計算中輸入元素與窗口元素是反向的(注意公式中w的下標)。因此,一些依賴第三方庫(好比OpenCV)的實現會直接把二維的卷積核作水平和豎直兩個方向的翻轉(或者旋轉180度)以後直接調用一個濾波器函數(filter2D)就完成了卷積的計算。函數

        在特徵提取方面,卷積運算的做用與濾波器相同。如圖中下方所示,假設在數軸上的輸入數據是通過{2,-1,1}的一條曲線,與一個{1,-2,1}的核進行濾波(或者通過水平翻轉後進行卷積),會獲得一個比較大的輸出(5),通過激活函數(actiation function)會產生一個十分接近於1的激活輸出。這時,咱們能夠說輸入a符合特徵w的模式(pattern)。工具


        計算機科學中的神經網絡算法只是從仿生學上部分借鑑了人類大腦的結構。上面的截圖來自CrashCourse的科普視頻。在大腦的神經元(Neuron)中,輸入信號通過樹突(dendrite)傳入,而後再從軸突(Axon)傳遞出去。在神經元內部,信息以電信號方式傳遞,在神經元之間則以化學信號傳遞。在傳遞的過程當中,信號的強度和速度是必定的,但頻率是可變的。因此信號的強弱(好比痛感、情緒等)是以信號頻率的高低來區分的。另外神經元之間的鏈接是多對多的,即一個神經元能夠有多個輸入和輸出。性能

        與之相比,神經網絡算法通常沒有信號頻率的概念,即每一個節點只向外產生一次激活(RNN遞歸計算的節點能夠看做展開成一條節點鏈,可是鏈上每一個節點依然只通過一次計算)。並且,目前的算法大可能是嚴格按層級進行計算,並不像生物體神經元那樣在三維空間中呈現紛繁複雜的結構。學習


        在神經網絡中,層與層之間的鏈接分爲全連通(fully-connected)與局部連通(local connected)兩種。一些比較古老的文獻認爲局部連通的計算形式能夠用卷積的形式來表示,因此錯誤地把這種通過簡化計算的局部連通網絡稱爲卷積網絡。局部連通與全連通相比,參數數量要少得多,因此在過去計算機性能不佳時是一個比較有效的性能優化有段。但與此同時,局部連通也不可避免地引入了只有相鄰節點(a_1a_2a_3)的輸出才與下層節點(z_1)有關的約束,對大多實際問題是不合理的。直到Dropout的出現,結合了兩者的優勢,同時還提升了網絡的泛化能力,成爲目前十分流行的技術。


        對於一個機器學習算法來講(也能夠推廣到其餘領域的算法),最關鍵的三點是模型、數據和偏差函數。模型即肯定輸入、參數與輸出之間的關係;數據即我設計的模型是針對什麼樣的數據,指望獲得什麼樣的輸出;偏差函數是評價一個算法好壞的關鍵,須要用明確的表達式合理地衡量實際輸出與理想輸出之間的差別。前文說過,尋找一個最優函數f的過程,即尋找一個使偏差e最小的參數W的過程。若是咱們規定的偏差e是可微的,那麼最優參數W^*必然落在偏差函數的駐點處(eW的偏導等於0)。可是稍微複雜一點的問題都沒法一會兒肯定最優參數W^*,咱們只能從一個猜想的W_0出發來尋找最優值。這就很天然地引入了梯度降低法(Gradient Descent)。

        對於一個可微函數(偏差函數),其上任意一點處的偏導大小表明該點處切線斜率大小,方向(正負號)表明這條切線是向上仍是向下的。由於咱們須要在變量W的方向上尋找最低點,因此要向梯度方向的反方向(即降低方向)進行搜索。須要注意在一些問題中,偏差越大並不表明錯誤得越離譜,而是爲了對模型的糾正過程當中施加一個更大的做用力。

        網絡上有不少關於梯度降低法的介紹,這裏再也不贅述。推薦閱讀An overview of gradient descent optimization algorithms來了解一些經常使用的梯度方法。


        這張圖來自李宏毅老師的PPT,是爲了說明可能會形成訓練收斂緩慢的緣由。在函數平緩的區域,因爲偏導自己數值很小,會致使參數的更新量也很小,這時就須要比較大的步長。在鞍點時,某一軸上是極小點,但在其餘軸上並非極小點,但因爲偏差函數形式的緣由(好比涉及到對偏差取偶數次冪),會表現爲在鞍點周圍偏差都大於鞍點,因此使得訓練過程誤「收斂」於鞍點。因爲大量的局部極小點和鞍點的存在,深度神經網絡訓練的調參也是一個十分精細的工做。關於在鞍點方面的分析,請參考Identifying and attacking the saddle point problem in high-dimensional non-convex optimization


        深度神經網絡通常用反向傳播訓練方法(Back Propagation)來迭代地更新參數。上圖是以線性網絡爲例解釋BP的計算過程,公式應該能夠自明,我就不用文字贅述了。對於卷積網絡,其實計算過程是相同的,只不過把偏導項之間的乘法替換爲卷積(卷積核在水平和豎直翻轉以後的卷積)。推薦閱讀Backpropagation in Convolutional Neural Network瞭解CNN中BP算法的細節。


        當訓練結果很差時,可能會有兩種結果,欠擬合與過擬合。欠擬合是指模型不足以對訓練集產生比較高的分類精度,從偏差-迭代曲線上表現爲不管是訓練期間仍是測試期間,偏差都比較高。這說明模型對特徵的提取不夠,不足以用來描述樣本間的差別。這時通常須要優化方法來解決這個問題,好比改變激活函數、偏差函數,或者換一種梯度降低方法(以及調整梯度方法的參數)。過擬合是指模型對訓練集有比較高的分類精度,但對測試集表現不佳,從偏差-迭代曲線上表現爲在訓練期間偏差可以收斂到一個較小值,但測試期間偏差卻比較大。這說明模型過度地依賴訓練樣本的特徵,對沒有碰見過新樣本不知所措,缺少泛化能力。這時須要正則化方法來提升模型對通常性樣本的適應性,好比Dropout和Batch Normalization。

        偏差不收斂的一個更常見的緣由——尤爲是在一個新模型剛剛創建時——是梯度消失或梯度爆炸。在網絡中缺乏比較可靠的正則化技術時,在網絡不斷迭代訓練的過程當中(甚至第二次迭代開始)會發現新樣本產生的偏差梯度在反向傳播的過程當中愈來愈小(或愈來愈大),有時呈現每一兩層就減少(或增大)一個數量級。梯度趨向消失時,不管訓練多久,會發現最淺層(前一兩層)的參數與初始值並無太大變化,這就使得淺層的存在失去了意義,並且這也會使訓練過程變得很是緩慢。梯度爆炸時,僅僅幾回迭代以後就會發現某一層全部節點的輸出都變成了1(或者十分接近於1),這時網絡也就失去了分類的能力。


        既然已經知道網絡的輸入和參數會影響最終輸出的偏差,那麼也就能夠假設咱們能夠在一個三維座標上畫出三者的關係。如圖中所示,當參數(parameter)固定時,每輸入不一樣的樣本(sample),就會產生不一樣的偏差(loss),由於真實樣本x與理想樣本x^*相比老是存在偏差的。而對於同一個樣本,變化的參數通常也會產生變化的偏差。因此訓練網絡的過程其實是在sample和parameter兩個軸上不斷變化時找到loss的最低點。

        在訓練模型時,通常會將訓練集等分爲若干小集合(mini-batch),一次將一個mini-batch輸入網絡,計算完全部mini-batch後——若是以爲網絡精度還達不到要求——將全部樣本隨機排序,再分割爲若干mini-batch進行訓練。這個過程能夠看做在sample軸上隨機跳躍,在parameter軸上逐步前進地搜索,可以儘量地保證搜索到的最低點是全部樣本的最低點。


        特徵提取是一個分類器的核心,深度學習的優點就在於它能自動從原始數據提煉出特徵,並以層級的邏輯組合這些特徵來描述原始樣本。我在最後一幅圖中用一個簡單的例子來講明CNN的層級結構是如何解決圖像分類問題的。

        假設咱們須要用機器視覺方法對圖A(兩個三角形構成松樹的形狀)和圖B(兩個三角形構成鑽石的形狀)進行區分。在神經網絡方法出現以前,一種比較可行的方法是經過圖像處理中的直線檢測方法找到圖像中全部直線,而後經過直線參數之間的關係來肯定以下判斷規則:若是下面的三角形尖角朝上,即爲松樹;若是尖角朝下,即爲鑽石。通過細緻的調參,這個算法應該已經能夠完美解決區分圖A與圖B的問題了。若是如今又來了一副圖C(也許是兩個三角形水平排列構成小山的形狀,也可能根本不包含三角形),須要用以前的算法來同時區分這三幅圖片,怎麼辦?

        好在咱們能夠用CNN來解決這個問題。首先須要注意,我在這一小節所指「卷積」其實是濾波操做,由於卷積涉及翻轉,不利用直觀理解。假設咱們訓練好的網絡有兩層隱層,第一層包含兩個節點(圖中第二列藍色圖形,分別爲一條左斜線與一條右斜線),第二層包含四個節點(圖中第四列藍色圖形,分別爲一條水平線,一條豎直線,一條左斜線與一條右斜線)。圖A通過第一隱層,獲得圖中第三列黑色的圖形。黑色的圓點表明原始圖像中對某個卷積核激活值高的區域,白色表明激活值低的區域。圖A松樹左側的兩條斜邊通過「左斜線」卷積覈計算獲得位於圖像左側的兩個黑色圓點,其餘區域都不符合「左斜線」這個特徵,因此輸出值所有忽略爲0。同時,只有松樹右側的兩條斜邊會對「右斜線」卷積核產生高激活(獲得兩個位於右側的黑色圓點),其餘區域產生的激活都爲0。同理,圖B鑽石圖像通過「左斜線」與「右斜線」卷積核產生兩幅不一樣的圖像(一副在左上和右下有黑點,一副在右上和左下有黑點)。這時,第一層的計算就完成了。

        與通常的CNN模型同樣,咱們把第一層的結果(圖中第三列)輸入第二隱層以前要縮小一下圖像的尺度。通過縮小以後(你能夠眯起眼睛離屏幕稍遠些觀察),第三列的四個圖形分別變成了一條在左側的豎線,一條在右側的豎線,一條右斜線和一條左斜線。如今,咱們拿第二層的四個卷積核(第四列藍色圖形)來對這四個結果進行卷積再求和。爲了簡化,若是在圖像中存在一個區域使其與某卷積核的激活輸出值較高,就將該卷積核的對應輸出記爲1;若是不存在這樣的一個區域即記爲0。這樣,圖中第三列第一個圖像對四個卷積核分別產生(0,1,0,0),第二個圖像產生(0,1,0,0),因此圖A的最終結果是這兩個向量的和,爲(0,2,0,0)。而圖B的結果爲(0,0,0,1)+(0,0,1,0)=(0,0,1,1)。雖然圖A與圖B有類似之處,但通過兩次卷積獲得的向量是徹底不一樣的,經過這兩個向量,咱們就能惟一地肯定圖A與圖B。

        若是有新的樣本加入,咱們只須要改變一下圖例中的卷積核數目和形狀(或者甚至不對網絡作任何修改)也可以輕鬆地實現分類。固然,CNN方法在實際運用時是不須要人爲地設計卷積核的,而是依靠對樣本的訓練逐漸構造的。


        其實,做爲一個還沒有成熟的工具,深度學習的優勢與缺點一樣明顯。其優勢毋庸置疑,是推進其在各領域蔓延的高分類精度,確切地說是它可以自主概括特徵,免去了過去慢慢手工篩選特徵來提升精度的過程。深度學習方法的缺點也十分致命,即訓練結果徹底的不可預測性。在訓練完成、進行測試以前,即使是有經驗的工程師也難以給出其精度的界,更沒法預知訓練後的參數會變成什麼樣。雖然這種說法對於一個機器學習方法來講有些苛刻,畢竟在數值計算領域有不少迭代算法也會由於微小的參數變化而難以收斂。可是做爲一個參數量級驚人的算法,人類對其參數含義的解讀也是困難的。其在多個領域的普遍運用產生的一個結果是,參數的不可預測性會帶來其行爲的不可預測性。雖然技術的推廣者常常會如何保證甚至如何吹噓他們訓練出來的模型在不少條件下都有很高的精度(或者說,執行設計者所指望的行爲),但更有可能的是,吹牛的人並不知道模型究竟爲何會在特定條件下產生特定的結果。做爲一個「黑盒」算法,其對外的表徵是高分經過全部測試,但對於測試內容沒有考慮到的狀況纔是值得擔憂的。一個廉價而高效的工具在市場上的阻力是比較小的,那麼比市場上現有算法更復雜更強大的算法勢必會被不斷推出。若是咱們可以假定「智能」只是一個不斷收集和處理數據的過程,那麼咱們也能夠說《終結者》所描述的世界也並純粹的想象了。

原文來自:http://johnhany.net/2017/08/deep-learning-intro-hand-scripts-for-cnn/

相關文章
相關標籤/搜索