《Python數據分析與機器學習實戰-唐宇迪》讀書筆記第17章--神經網絡 《Python數據分析與機器學習實戰-唐宇迪》讀書筆記第18章--TensorFlow實戰

python數據分析個人學習讀書筆記-目錄索引

第17章神經網絡

   本章介紹當下機器學習中非常火爆的算法——神經網絡,深度學習的崛起更是讓神經網絡名聲大振,在計算機視覺、自然語言處理和語音識別領域都有傑出的表現。這麼厲害的算法肯定要來研究一番,可能大家覺得其原理會非常複雜,其實學習到本章,大家應該已經掌握了機器學習中絕大部分核心內容,再來理解神經網絡,會發現在它其實沒那麼難。本章內容主要包括神經網絡各模塊工作細節、整體網絡模型架構、過擬合解決方法。

17.1神經網絡必備基礎

   如果直接看整個神經網絡,可能會覺得有些複雜,先挑一些重點知識點進行講解,然後再把整個網絡結構串在一起就容易理解了。

17.1.1神經網絡概述

   神經網絡其實是一個很古老的算法,那麼,爲什麼現在才流行起來呢?一方面,神經網絡算法需要大量的訓練數據,現在正是大數據時代,可謂是應景而生。另一方面,不同於其他算法只需求解出幾個參數就能完成建模任務,神經網絡內部需要千萬級別的參數來支撐,所以它面臨的最大的問題就是計算的效率,想求解出這麼多參數不是一件容易的事。隨着計算能力的大幅度提升,這才使得神經網絡重回舞臺中央。

  數據計算的過程通常都涉及與矩陣相關的計算,由於神經網絡要處理的計算量非常大,僅靠CPU迭代起來會很慢,一般會使用GPU來加快計算速度,GPU的處理速度比CPU至少快100倍。沒有GPU的讀者也不要擔心,在學習階段用CPU還是足夠的,只要將數據集規模設置得小一些就能用(見圖17-1)。

 邀月工作室

  圖17-1 GPU計算

  神經網絡很像一個黑盒子,只要把數據交給它,並且告訴它最終要想達到的目標,整個網絡就會開始學習過程,由於涉及參數過多,所以很難解釋神經網絡在內部究竟做了什麼(見圖17-2)。

  深度學習相當於對神經網絡算法做了各種升級改進,使其應用在圖像、文本、語音上的效果更突出。在機器學習任務中,特徵工程是一個核心模塊,在算法執行前,通常需要替它選出最好的且最有價值的特徵,這一步通常也是最難的,但是這個過程似乎是人工去一步步解決問題,機器只是完成求解計算,這與人工智能看起來還有些距離。但在神經網絡算法中,終於可以看到些人工智能的影子,只需把完整的數據交給網絡,它會自己學習哪些特徵是有用的,該怎麼利用和組合特徵,最終它會給我們交上一份答卷,所以神經網絡纔是現階段與人工智能最接軌的算法(見圖17-3)。

 邀月工作室

  ▲圖17-2 神經網絡就像一個黑盒子

 邀月工作室

  ▲圖17-3 神經網絡解決圖像分類問題

  原書作者迪哥中觀點,基本上所有機器學習問題都能用神經網絡來解決,但其中也會存在一些影響因素,那就是過擬合問題比較嚴重,所以還是那句話——能用邏輯迴歸解決的問題根本沒有必要拿到神經網絡中。神經網絡的效果雖好,但是效率卻不那麼盡如人意,訓練網絡需要等待的時間也十分漫長,畢竟要求解幾千萬個參數,短時間內肯定完不成,所以還是需要看具體任務的要求來選擇不同的算法。

  與其把神經網絡當作一個分類或者回歸算法,不如將它當成一種特徵提取器,其內部對數據做了各種各樣的變換,雖然很難解釋變換原理,但是目的都是一致的,就是讓機器能夠更好地讀懂輸入的數據。

  下面步入神經網絡的細節,看看它每一步都做了什麼。

17.1.2計算機眼中的圖像

   神經網絡在計算機視覺領域有着非常不錯的表現,現階段圖像識別的相關任務都用神經網絡來做,下面將圖像當作輸入數據,通過一個基本的圖像分類任務來看看神經網絡一步步是怎麼做的。

  圖17-4爲一張小貓圖像,大家可以清晰地看到小貓的樣子,但是計算機可不是這麼看的,圖像在計算機中是以一個三維數組或者矩陣(例如300×100×3)的形式存儲在計算機中,其中300×100代表一張圖片的長和寬,3代表圖像的顏色通道,例如經典的RGB,此時圖像就是一個彩色圖。如果顏色通道數爲1,也就是300×100×1,此時圖像就是一個黑白圖。數組中的每一個元素代表一個像素值,在0(黑)~255(白)之間變化,像素值越大,該點的亮度也越大;像素值越小,該點越暗。

 邀月工作室

  圖17-4 計算機眼中的圖像

  圖像分類任務就是拿到一堆圖像數據後,各有各的標籤,要讓計算機分辨出每張圖像內容屬於哪一個類別。看起來好像很容易,這不就是貓嘛,特徵非常明顯,但是實際數據集中可能會存在各種各樣的問題,如照射角度、光照強度、形狀改變、部分遮蔽、背景混入等因素(見圖17-5),都會影響分類的效果。

 

邀月工作室

  ▲圖17-5 圖像識別任務的挑戰

 邀月工作室

  ▲圖17-5 圖像識別任務的挑戰(續)

  如何解決這些問題呢?如果用傳統算法,需要分析各種特徵,實在是個苦活。選擇神經網絡算法就省事多了,這些問題都交給網絡去學習即可,只要有數據和標籤,選擇合適的模型就能解決這些問題。

  遮蔽現象是圖像識別中常見的問題,例如在密集人羣中進行人臉檢測,最簡單有效的方法就是把存在該現象的數據以及合適的標籤交給神經網絡進行學習,數據是最好的解決方案。

17.1.3得分函數

   下面準備完成圖像分類的任務,如何才能確定一個輸入屬於哪個類別呢?需要神經網絡最終輸出一個結果(例如一個分值),以評估它屬於各個類別的可能性,如圖17-6所示。

 邀月工作室

  圖17-6 網絡的輸入和輸出

  爲了更容易理解,先省略網絡中複雜的過程,直接來看輸入和輸出,輸入就是圖像數據,輸出就是分類的結果。那麼如何才能得到最終的分值呢?既然圖像是由很多個像素點組成的,最終它屬於哪一個類別肯定也要和這些像素點聯繫在一起,可以把圖像中的像素點當作數據特徵。輸入特徵確定後,接下來需要明確的就是權重參數,它會結合圖像中的每一個像素點進行計算,簡單來說就是從圖像每一個細節入手,看看每一個像素點對最終分類結果的貢獻有多大。

  假設輸入數據是32×32×3,一共就有3072個像素點,每一個都會對最終結果產生影響,但其各自的影響應當是不同的,例如貓的耳朵、眼睛部位會對最終結果是貓產生積極的影響,而一些背景因素可能會對最終結果產生負面的影響。這就需要分別對每個像素點加以計算,此時就需要3072個權重參數(和像素點個數一一對應)來控制其影響大小,如圖17-7所示。

 邀月工作室

  圖17-7 得分函數

  如果只想得到當前的輸入屬於某一個特定類別的得分,只需要一組權重參數(1×3072)就足夠了。那麼,如果想做的是十分類問題呢?此時就需要十組權重參數,例如還有狗、船、飛機等類別,每組參數用於控制當前類別下每個像素點對結果作用的大小。

  不要忽略偏置參數b,它相當於微調得到的結果,讓輸出能夠更精確。所以最終結果主要由權重參數w來控制,偏置參數b只是進行微調。如果是十分類任務,各自類別都需要進行微調,也就是需要10個偏置參數。

  接下來通過一個實際的例子看一下得分函數的計算流程(見圖17-8)。

 邀月工作室

  圖17-8 得分函數計算流程

  輸入還是這張貓的圖像,簡單起見就做一個三分類任務,最終得到當前輸入屬於每一個類別的得分值。觀察可以發現,權重參數和像素點之間的關係是一一對應的,有些權重參數比較大,有些比較小,並且有正有負,這就是表示模型認爲該像素點在當前類別的重要程度,如果權重參數爲正且比較大,就意味着這個像素點很關鍵,對結果是當前類別起到促進作用。

  那麼怎麼確定權重和偏置參數的數值呢?實際上需要神經網絡通過迭代計算逐步更新,這與梯度下降中的參數更新道理是一樣的,首先隨機初始化一個值,然後不斷進行修正即可。

  從最終分類的得分結果上看,原始輸入是一隻小貓,但是模型卻認爲它屬於貓這個類別的得分只有−96.8,而屬於其他類別的得分反而較高。這顯然是有問題的,本質原因就是當前這組權重參數效果並不好,需要重新找到更好的參數組合。

17.1.4損失函數

   在上小節預測貓、狗、船的例子中,預測結果和真實情況的差異比較大,需要用一個具體的指標來評估當前模型效果的好壞,並且要用一個具體數值分辨好壞的程度,這就需要用損失函數來計算。

  在有監督學習問題中,可以用損失函數來度量預測結果的好壞,評估預測值和真實結果之間的吻合度,即模型輸出的預測值與真實值Y之間不一致的程度。一般而言,損失值越小,預測結果越準確;損失值越大,預測結果越不準確。通常情況下,訓練數據(xi,yi)是固定的,可以通過調整模型參數W和b來改進模型效果。

損失函數的定義方法有很多種,根據不同的任務類型(分類或迴歸)和數據集情況,可以定義不同的損失函數,先來看一個簡單的:

 邀月工作室

  其中,Li爲當前輸入數據屬於正確類別的得分值與其他所有錯誤類別得分值的差異總和。

  當邀月工作室時,表示沒有損失;當邀月工作室時,表示開始計算損失,其中Δ表示容忍程度,或者說是至少正確的比錯誤的強多少纔不計損失。

下面實際計算一下(見圖17-9)。數據有3個類別:小貓、汽車和青蛙,分別選擇3張圖片作爲輸入,假設已經得到其各自得分值。

  • 小貓對應的各類得分值:f(x1,W)=[3.2,5.1,-1.7]
  • 汽車對應的各類得分值:f(x2,W)=[1.3,4.9,2.0]
  • 青蛙對應的各類得分值:f(x3,W)=[2.2,2.5,-3.1]

 邀月工作室

  圖17-9 損失值計算

  當Δ=1時,表示正確類別需比錯誤類別得分高出至少1個數值纔算合格,否則就會有損失值。

邀月工作室

邀月工作室

邀月工作室

  從結果可以看出,第一張輸入的小貓損失值爲2.9,意味着做得還不夠好,因爲沒有把小貓和汽車這兩個類別區分開。第二張輸入的汽車損失值爲0,意味着此時模型做得還不錯,成功預測到正確答案。最後一張青蛙對應的損失值爲10.9,這值非常大,意味着此時模型做得很差。

  這裏選擇3張輸入圖像進行計算,得到的損失值各不相同,最終模型損失值的計算並不是由一張圖像決定的,而是大量測試圖像結果的平均值(例如一個batch數據):

 邀月工作室

  式(17.1)可以當作對迴歸任務也就是預測具體分數時的損失函數(損失函數的定義方法有很多,可以根據任務不同自己選擇)。但對於分類任務來說,更希望得到一個概率值,可以借用softmax方法來完成分類任務。例如,當前的輸入屬於貓的概率爲80%,狗的概率爲20%,那麼它的最終結果就是貓。

  分類任務損失值計算流程如圖17-10所示,先按流程走一遍,然後再看數學公式就好理解了。首先,假設一張小貓圖像經過神經網絡處理後得到其屬於3個類別的得分值分別爲(3.2,5.1,-1.7),只看得分值,感覺差異並不大,爲了使得結果差異能夠更明顯,進行了映射(見圖17-11)。

 邀月工作室

  圖17-10 分類任務損失值計算流程

  經過映射後,數值差異更明顯,如果得分值是負數,基本就是不可能的類別,映射後也就更接近於0。現在只是數值進行變換,如何才能轉換成概率值呢?只需簡單的歸一化操作即可。

  假設已經得到當前輸入屬於每一個類別的概率值,輸入明明是一隻小貓,但是結果顯示貓的概率值只有13%,看起來模型做得並不好,需要計算其損失值,這裏還是藉助對數函數,如圖17-12所示。

 邀月工作室

  ▲圖17-11 數值映射

 邀月工作室

  ▲圖17-12 對數函數

  需要注意一點:對數函數的輸入是當前輸入圖像屬於正確類別的概率值,也就是上述例子中的0.13,表示只關心它在正確類別上的分類效果,理想情況是它屬於貓的概率爲100%。

  通過對數函數可以發現,當輸入的概率結果越接近於1時,函數值越接近0,表示完全做對了(100%屬於正確類別),不會產生損失。如果沒有完全做對,效果越差(輸入越接近於0)時,對應的損失值也會越大(雖然是負的,取其相反數就會變成正的)。

  解釋過後,再把每一步的操作穿插在一起,就是分類任務中損失函數的定義:

 邀月工作室

  損失函數中,還加入了正則化懲罰項,這一步也是必須的,因爲神經網絡實在太容易過擬合,後續就會看到,它的表現能力還是很驚人的。

  假設輸入圖像屬於貓、汽車、青蛙3個類別的得分值爲[3.2,5.1,−1.7],計算過程如下。

    1.求出各得分值的指數次冪,結果爲邀月工作室

    2.歸一化處理,即計算出每類的(上圖中log後面小括號內的部分),結果爲[0.13,0.87,0.00],因爲0.87較大,所以可以將該圖片分類爲汽車,顯然,該結果是有誤差的,所以要計算損失函數。

    3.在求解損失函數時,只需要其屬於正確類別的概率,本例中圖片正確的分別爲小貓,所以損失函數爲L1=-log0.13=0.89

17.1.5反向傳播

   終於要揭開神經網絡迭代計算的本質了,現在已經完成了從輸入數據到計算損失的過程,通常把這部分叫作前向傳播(見圖17-13)。但是網絡模型最終的結果完全是由其中的權重與偏置參數來決定的,所以神經網絡中最核心的任務就是找到最合適的參數。

 邀月工作室

  圖17-13 前向傳播過程

  前面已經講解過梯度下降方法,很多機器學習算法都是用這種優化的思想來迭代求解,神經網絡也是如此。當確定損失函數之後,就轉化成了下山問題。但是神經網絡是層次結構,不能一次梯度下降就得到所有參數更新的方向,需要逐層完成更新參數工作(見圖17-14)。

 邀月工作室

  圖17-14 神經網絡組成

  由於網絡層次的特性,在計算梯度的時候,需要遵循鏈式法則,也就是逐層計算梯度,並且梯度是可以傳遞的,如圖17-15所示。

 邀月工作室

邀月工作室

  圖17-15 函數組成

  既然要對參數進行更新,可以看一看不同的參數對模型的損失做了什麼貢獻。如果一個參數使得模型的損失增大,那就要削減它;如果一個參數能使得模型的損失減小,那就增大其作用。上述例子中,就是把x,y,z分別看成影響最終結果的3個因子,現在要求它們對結果的影響有多大:

 邀月工作室

  可以觀察到,z和結果是直接聯繫在一起的,但是x和y和最終的結果並沒有直接關係,可以額外引入一項q,令q=x+y,這樣q就直接和結果聯繫在一起,而x和y又分別與q直接聯繫在一起:

 邀月工作室

  通過計算可以看出,當計算x和y對結果的貢獻時,不能直接進行計算,而是間接計算q對結果的貢獻,再分別計算x和y對q的貢獻。在神經網絡中,並不是所有參數的梯度都能一步計算出來,要按照其位置順序,一步步進行傳遞計算,這就是反向傳播(見圖17-16)。

 邀月工作室

  圖17-16 反向傳播過程

  從整體上來看,優化方法依舊是梯度下降法,只不過是逐層進行的。反向傳播的計算求導相對比較複雜,建議大家先了解其工作原理,具體計算交給計算機和框架完成。

 

17.2神經網絡整體架構

   上一節講解了神經網絡中每一個基礎模塊的原理及其工作流程,接下來要把它們組合成一個完整的神經網絡,從整體上看神經網絡到底做了什麼。

  原書作者迪哥:有些書籍中介紹神經網絡時,會從生物學、類人腦科學開始講起,但是神經網路中真的有軸突、樹突這些結構嗎?筆者認爲,還是直接看其數學上的組成最直截了當,描述越多,其實越加大理解它的難度。

17.2.1整體框架

   神經網絡整體架構如圖17-17所示,只要理解這張圖,神經網絡就能理解得差不多。可以看出,神經網絡是一個層次結構,包括輸入層、隱藏層和輸出層。

 邀月工作室

  圖17-17 神經網絡整體架構

  • (1)輸入層。圖17-17的輸入層中畫了3個圓,通常叫作3個神經元,即輸入數據由3個特徵或3個像素點組成。
  • (2)隱藏層1。輸入數據與隱藏層1連接在一起。神經網絡的目標就是尋找讓計算機能更好理解的特徵,這裏面畫了4個圓(4個神經元),可以當作通過對特徵進行某種變換將原始3個特徵轉換成4個特徵(這裏的3和4都是假設,實際情況下,數據特徵和隱層特徵都是比較大的)。

  原始數據是3個特徵,這是由數據本身決定的,但是,隱藏層的4個特徵表示什麼意思呢?這個很難解釋,神經網絡會按照某種線性組合關係將所有特徵重新進行組合,之前看到的權重參數矩陣中有正有負,有大有小,就意味着對特徵進行何種組合方式。神經網絡是黑盒子的原因也在於此,很難解釋其中過程,只需關注其結果即可。

  • (3)隱藏層2。在隱藏層1中已經對特徵進行了組合變換,此時隱藏層2的輸入就是隱藏層1變換後的結果,相當於之前已經進行了某種特徵變換,但是還不夠強大,可以繼續對特徵做變換處理,神經網絡的強大之處就在於此。如果只有一層神經網絡,與之前介紹的邏輯迴歸差不多,但是一旦有多層層次結構,整體網絡的效果就會更強大。
  • (4)輸出層。最終還是要得到結果的,就看要做的任務是分類還是迴歸,選擇合適的輸出結果和損失函數即可,這與傳統機器學習算法一致。

  神經網絡中層和層之間都是全連接的操作,也就是隱層中每一個神經元(其中一個特徵)都與前面所有神經元連接在一起,這也是神經網絡的基本特性。全連接計算如圖17-18所示,所謂的全連接,其實就是通過矩陣將數據或者特徵進行變換。例如,輸入層的數據是[1,3],表示一個本數據,3個特徵(也可以是一個batch數據)。通過權重參數矩陣w1:[3,4]進行矩陣乘法操作,結果就是[1,4],相當於對原始輸出特徵進行轉換,變成4個特徵。接下來還需要通過w2、w3分別對中間特徵進行轉換計算,最終得到一個結果值,可以當作迴歸任務。如果是分類任務,例如十分類,輸出層可以設計成10個神經元,也就是當前輸入屬於每一個類別的概率值,w3也相應地變成[4,10]。

 邀月工作室

  圖17-18 全連接計算

  如果直接對輸入數據依次計算,其經過式(17.5)和式(17.6)參考變換得到結果看起來是一種線性變換,但是神經網絡能處理的問題肯定不止線性問題,所以,在實際構造中,還需引入非線性函數,例如Sigmoid函數,但是現階段一般不用它,先來看一個更簡單的函數:

 邀月工作室

  Max(0,x)函數看起來更直截了當,它是非常簡單的非線性函數,暫且用它來當作對神經網絡進行非線性變換的方法,需要把它放到每一次特徵變換之後,也就是在基本的神經網絡中,每一個矩陣相乘後都需要加上一個非線性變換函數。

  再繼續堆疊一層,計算方法相同:

 邀月工作室

17.2.2神經元的作用

   概述神經網絡的整體架構之後,最值得關注的就是特徵轉換中的神經元,可以將它理解成轉換特徵後的維度。例如,隱藏層有4個神經元,就相當於變換得到4個特徵,神經元的數量可以自己設計,那麼它會對結果產生多大影響呢?下面看一組對比實驗。選擇相同的數據集,在網絡模型中,只改變隱藏層神經元個數,得到的結果如圖17-19所示。數據集稍微有點難度,是一個環形。當隱藏層神經元個數只有1個時,好像是隻切了一刀,並沒有達到想要的結果,說明隱藏層只利用一個特徵,還是太少了。當隱藏層神經元個數爲2時,這回像是切了兩刀,但還是差那麼一點,沒有完全分對,看起來還是特徵多一點好。如果繼續增加,隱藏層神經元個數爲3時,終於達到目標,數據集能完全分開。

 邀月工作室

  圖17-19 神經元個數對結果影響

  當隱藏層神經元數量增大的時候,神經網絡可以利用的數據信息就更多,分類效果自然會提高,那麼,是不是神經元的數量越多越好呢?先來算一筆賬吧,假設一張圖像的大小爲[800,600,3],這是常規的圖像尺寸,其中一共有800×600×3=1440000個像素點,相當於輸入數據(也就是輸入層)一共有1440000個神經元,因此要畫1440000個圓,給打個折,暫且算有100萬個輸入像素點。當隱藏層神經元個數爲1時,輸入層和隱藏層之間連接的矩陣就是[100W,1]。當隱藏層神經元個數爲2時,權重參數矩陣爲[100W,2]。增加一個隱藏層神經元時,參數不只增加一個,而是增加一組,相當於增加了100W個權重參數。

  因此在設計神經網絡時,不能只考慮最終模型的表現效果,還要考慮計算的可行性與模型的過擬合風險。

  神經網絡爲什麼現階段才登上舞臺呢?這很大程度上是由於以前的計算機性能根本無法滿足這麼龐大的計算量,而且參數越多,過擬合也越嚴重。

  圖17-19所示的數據集可能有點簡單,大家一看就知道支持向量機也能解決這類問題,下面換一個複雜的試試,如圖17-20所示。

邀月工作室

  圖17-20 神經網絡效果

  這回找到一個有個性的數據集,此時3個神經元已經不能滿足需求,當神經元個數增大至5時,才能完成這個任務。可以發現神經網絡的效果還是比較強大的,只要神經元個數足夠多,就能解決這些複雜問題。此時有一個大膽的想法,如果隨機構建一個數據集,再讓神經網絡去學習其中的規律,它還能解決問題嗎?

  圖17-21是使用相同的神經網絡在隨機創建的幾份數據集上的效果。由於問題比較難,神經元數量增加到15個,結果真能把隨機數據集完全切分開,現在給大家的感覺是不是神經網絡已經足夠強大了。機器學習的出發點是要尋找數據集中的規律,利用規律來解決實際問題,現在即便一份數據集是隨機構成的,神經網絡也能把每一個數據點完全分開。

 邀月工作室

  圖17-21 神經網絡在隨機數據集上的效果

  神經網絡雖然強大,但這只是在訓練集上得到的效果,此時來看決策邊界已經完全過擬合。如圖17-22所示,被選中的數據點看起來可能是異常或者離羣點。由於它的存在,使得整個模型不得不多劃分出一個決策邊界,實際應用時,如果再有數據點落在該點周圍,就會被錯誤地預測成紅色類別。

 邀月工作室

  圖17-22 過擬合現象

  這樣的網絡模型在實際測試中效果肯定不好,所以神經網絡中最大的問題就是過擬合現象,需要額外進行處理。

17.2.3正則化

   神經網絡效果雖然強大,但是過擬合風險實在是高,由於其參數過多,所以必須進行正則化處理,否則即便在訓練集上效果再高,也很難應用到實際中。

  最常見的正則化懲罰是L2範數,即邀月工作室,它對權重參數中所有元素求平方和,顯然,只與權重有關係,而和輸入數據本身無關,只懲罰權重。

  在計算正則化懲罰時,還需引入懲罰力度,也就是λ,表示希望對權重參數懲罰的大小,還記得信用卡檢測案例嗎?它就是其中一個參數,選擇不同的懲罰力度在神經網絡中的效果差異還是比較大的。

  正則化懲罰力度如圖17-23所示,當懲罰力度較小時,模型能把所有數據點完全分開,但是,數據集中會存在一些有問題的數據點,可能由於標註錯誤或者其他異常原因所導致,這些數據點使得模型的決策邊界變得很奇怪,就像圖17-23(a)所示那樣,看起來都做對了,但是實際測試集中的效果卻很差。

  當懲罰力度較大時,模型的邊界就會變得比較平穩,雖然有些數據點並沒有完全劃分正確,但是這樣的模型實際應用效果還是不錯的,過擬合風險較低。

  通過上述對比可以發現,不同的懲罰力度得到的結果完全不同,那麼如何進行選擇呢?還是一個調參的問題,但是,通常情況下,寧可選擇圖17-23(c)中的模型,也不選擇圖17-23(a)中的模型,因爲其泛化能力更強,效果稍微差一點還可以忍受,但是完全過擬合就沒用了。

 邀月工作室

  圖17-23 正則化懲罰力度

17.2.4激活函數

   在神經網絡的整體架構中,將數據輸入後,一層層對特徵進行變換,最後通過損失函數評估當前的效果,這就是前向傳播。接下來選擇合適的優化方法,再反向傳播,從後往前走,逐層更新權重參數。

  如果層和層之間都是線性變換,那麼,只需要用一組權重參數代表其餘所有的乘積就可以了。這樣做顯然不行,一方面神經網絡要解決的不僅是線性問題,還有非線性問題;另一方面,需要對變換的特徵加以篩選,讓有價值的權重特徵發揮更大的作用,這就需要激活函數。

  常見的激活函數包括Sigmoid函數、tanh函數和ReLu函數等,最早期的神經網絡就是將Sigmoid函數當作其激活函數。數學表達式爲:

 邀月工作室

  其圖形如圖17-24所示。

 邀月工作室

  圖17-24 Sigmoid函數

  早期的神經網絡爲什麼沒有流行起來呢?一方面是之前所說的計算性能所限,另一方面就是Sigmoid函數自身的問題,在反向傳播的過程中,要逐層進行求導,對於Sigmoid函數來說,當數值較小時(例如−5到+5之間),導數看起來沒有問題。但是一旦數值較大,其導數就接近於0,例如取+10或−10時,切線已經接近水平了。這就容易導致更大的問題,由於反向傳播是逐層進行的,如果某一層的梯度爲0,它後面所有網絡層都不會進行更新,這也是Sigmoid函數最大的問題。

  Tanh函數表達式爲:

 邀月工作室

  其圖形如圖17-25所示。

 邀月工作室

  圖17-25 tanh函數

  Tanh函數的優點是它能關於原點對稱,但是,它同樣沒有解決梯度消失的問題,因此被淘汰。

  ReLu函數表達式爲:

 邀月工作室

  其圖形如圖17-26所示。

  Relu函數的作用十分簡單,對於輸入x,當其小於0時,輸出都是0,在大於0的情況下,輸出等於輸入本身。同樣是非線性函數,卻解決了梯度消失的問題,而且計算也十分簡便,加快了網絡的迭代速度。

  現階段激活函數的選擇基本都是Relu函數或是它的變形體,後續實驗中還會再看到Relu函數。

 邀月工作室

  圖17-26 Relu函數

 

17.3網絡調優細節

   在設計神經網絡過程中,每一個環節都會對最終結果產生影響,這就需要考慮所有可能的情況,那麼是不是訓練網絡時,需要進行很多次實驗才能選中一個合適的模型呢?其實也沒有那麼複雜,基本處理的方法還是通用的。

17.3.1數據預處理

   目前,神經網絡是不是已經強大到對任何數據都能產生不錯的效果呢?要想做得更好,數據預處理操作依然是非常核心的一步,如果數據更規範,網絡學起來也會更容易。

對數值數據進行預處理最常用的就是標準化操作,如圖17-27所示,首先各個特徵減去其均值,相當於以原點對稱,接下來再除以各自的標準差,讓各個維度取值都統一在較小範圍中。

 邀月工作室

  圖17-27 標準化操作

  對圖像數據也是需要預處理操作,保證輸入的大小規模都是統一的,例如都是32×32×3,如果各自大小不同,還需resize到統一規模,這點是必需的,因爲在基本的神經網絡中,所有參數計算都是矩陣相乘,如果輸入不統一,就沒法進行特徵變換。不僅如此,通常圖像數據的像素點取值範圍是在0~255之間,看起來浮動比較大,可以使用歸一化方法來把所有像素點值壓縮到0~1之間。

  文本數據更要進行預處理操作,最起碼要把文本或者詞語轉換成向量。爲了滿足神經網絡的輸入,還需限制每一篇文本的長度都是統一的,可以採用多退少補原則來處理文本長度,後續在實驗中還會詳細解釋其處理方法。

  簡單介紹幾種數據預處理方法後發現,基本的出發點還是使數據儘可能規範一些,這樣學習神經網絡更容易,過擬合風險也會大大降低。

  在神經網絡中,每一個參數都是需要通過反向傳播來不斷進行迭代更新的,但是,開始的時候也需要有一個初始值,一般都是隨機設置,最常見的就是隨機高斯初始化,並且取值範圍都應較小,在初始階段,不希望某一個參數對結果起到太大的影響。一般都會選擇一個較小的數值,例如在高斯初始化中,選擇均值爲0且標準差較小的方法。

17.3.2Drop-Out

   過擬合一直是神經網絡面臨的問題,Drop-Out給人的感覺就像是七傷拳,它能解決一部分過擬合問題,但是也會使得網絡效果有所下降,下面看一下它的結構設計。

  過擬合問題源於在訓練過程中,每層神經元個數較多,所以特徵組合提取方式變得十分複雜,相當於用更多參數來擬合數據。如果在每一次訓練迭代過程中隨機殺死一部分神經元,如圖17-28所示,就可以有效地降低過擬合風險。爲了使得整體網絡架構在實際應用時保持不變,強調每次迭代都進行隨機選擇,也就是對一個神經元來說,可能這次迭代沒有帶它玩,下次迭代就把它帶上了。所以在測試階段照樣可以使用其完整架構,只是在訓練階段爲了防止過擬合而加入的策略。

 邀月工作室

  圖17-28 Drop-Out

  Drop-Out方法巧妙地將神經元的個數加以控制,已經成爲現階段神經網絡中必不可少的一部分,通常每次迭代中會隨機保留40%~60%的神經元進行訓練。

17.3.3數據增強

   神經網絡是深度學習中的傑出代表,深度學習之所以能崛起還是依靠大量的數據,如圖17-29所示。當數據量較少時,深度學習很難進行,最好用更快速便捷的傳統機器學習算法。

 邀月工作室

  圖17-29 深度學習對數據量的要求

  由於神經網絡要在原始的輸入數據中找到最合適的特徵提取方法,所以數據量一定要夠,通常都是以萬爲單位,越多越好。但是,如果在一項任務中,沒有那麼多數據該怎麼辦呢?此時也可以自己創作。

  對於一張圖像數據來說,經過平移、翻轉、旋轉等操作,就可以得到另外一張圖像,這就是最常用的圖像生成策略,可以讓數據呈現爆炸式的增長,直接翻十倍都不成問題。Opencv工具包可以對圖像執行各種操作,以完成數據增強任務,如圖17-30所示。

 邀月工作室

  圖17-30 數據增強

  現在給大家推薦一個工具—keras中的數據增強函數,簡直太方便了。如果用opencv做變換,基本所有操作都需要自己完成,稍微有些麻煩,使用下面這個函數之後,等着收圖就可以了,其原理也是一樣的,按照參數進行設置,同時對圖像執行平移、旋轉等操作,詳細內容可以查閱其API文檔。

 

  在進行圖像增強的同時,不要忘記標籤也要隨之變化,如果是分類任務,還比較容易,但在迴歸任務中,還需得到標籤變換後的新座標。

  在訓練網絡時,可能會遇到一些挑戰,例如數據中各種潛在的問題(如圖像中的遮蔽現象),最好的解決方案還是從數據入手,畢竟對數據做處理,比對網絡進行調整更容易理解,所以,當大家進行實際任務遇到挑戰時,可以嘗試先從數據下手,效果更直接明瞭。

17.3.4網絡結構設計

   神經網絡模型可以做得比較複雜,需要大家進行詳細的設計,例如神經元個數、網絡層數等。這樣做起來豈不是要做大量的實驗?由於實際中訓練一個任務要花費2~3天,所以效率會大大降低。最簡單快速的方法就是使用經典網絡模型,也就是大家公認的、效果比較不錯的網絡模型,在處理實際問題的時候,都是直接用經典模型進行實驗研究,很少自己從頭去嘗試新的結構,如果要改進,也是在其基礎上進行改進升級。所以,並不建議大家在處理實際任務的時候,腦洞大開來設計網絡結構,還是老老實實用經典的,這也是最省事的。在解決問題的時候,最好先查閱相關論文,看看大牛們是怎麼做的,如果問題類似,最好藉助於別人的解決方案。

 

本章小結:

  本章向大家介紹了神經網絡模型,先按照其工作流程分析每一步的原理和作用,最後將完整的網絡模型結合在一起。對比不同實驗效果,很容易觀察到神經網絡強大的原因在於它使用了大量參數來擬合數據。雖然效果較傳統算法有很大提升,但是在計算效率和過擬合風險上都有需要額外考慮的問題。

  對於圖像數據來說,最大的問題可能就是其像素點特徵比較豐富,如果使用全連接的方式進行計算,矩陣的規模實在過於龐大,如何改進呢?後續要講到的卷積神經網絡就是專門處理圖像數據的。

  在網絡訓練迭代過程中,每次傳入的樣本數據都是相互獨立的,但是有些時候需要考慮時間序列,也就是前後關係的影響,看起來基本的神經網絡模型已經滿足不了此項需求,後續還要對網絡進行改進,使其能處理時間序列數據,也就是遞歸神經網絡。可以看出,神經網絡只是一個基礎模型,隨着技術的發展,可以對其做各種各樣的變換,以滿足不同數據和任務的需求。

  對於神經網絡的理解,從其本質來講,就是對數據特徵進行各種變換組合,以達到目標函數的要求,所以,大家也可以把神經網絡當作特徵提取和處理的黑盒子,最終的分類和迴歸任務只是利用其特徵來輸出結果。

 

第17章完。推薦《Python數據分析與機器學習實戰-唐宇迪》讀書筆記第18章--TensorFlow實戰

python數據分析個人學習讀書筆記-目錄索引

 

該書資源下載,請至異步社區:https://www.epubit.com

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章