
唐宇迪的《跟着迪哥學:Python資料分析與機器學習實戰》,2019年9月出版,本系列為讀書筆記。主要是為了系統整理,加深記憶。 第17章-神經網絡,本章内容主要包括神經網絡各子產品工作細節、整體網絡模型架構、過拟合解決方法。
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實戰
該書資源下載下傳,請至異步社群:https://www.epubit.com
邀月注:本文版權由邀月和部落格園共同所有,轉載請注明出處。
助人等于自助! [email protected]