深度學(xué)習(xí)的三個(gè)主要步驟!
本文來自 李宏毅機(jī)器學(xué)習(xí)筆記 (LeeML-Notes) 組隊(duì)學(xué)習(xí), 詳細(xì)介紹了使用深度學(xué)習(xí)技術(shù)的三大主要步驟。
教程地址:https://github.com/datawhalechina/leeml-notes
深度學(xué)習(xí)的三個(gè)步驟:
Step1:神經(jīng)網(wǎng)絡(luò)(Neural network)
Step2:模型評(píng)估(Goodness of function)
Step3:選擇最優(yōu)函數(shù)(Pick best function)
Step1:神經(jīng)網(wǎng)絡(luò)
神經(jīng)網(wǎng)絡(luò)是由很多單元連接而成,這些單元稱為神經(jīng)元。
神經(jīng)網(wǎng)絡(luò)類似于人類的神經(jīng)細(xì)胞,電信號(hào)在神經(jīng)元上傳遞,類似于數(shù)值在神經(jīng)網(wǎng)絡(luò)中傳遞的過程。
在這個(gè)神經(jīng)網(wǎng)絡(luò)里面,一個(gè)神經(jīng)元就相當(dāng)于一個(gè)邏輯回歸函數(shù),所以上圖中有很多邏輯回歸函數(shù),其中每個(gè)邏輯回歸都有自己的權(quán)重和自己的偏差,這些權(quán)重和偏差就是參數(shù)。
圖中紅框表示的就是神經(jīng)元,多個(gè)神經(jīng)元以不同的方式進(jìn)行連接,就會(huì)構(gòu)成不同結(jié)構(gòu)神經(jīng)網(wǎng)絡(luò)。神經(jīng)元的連接方式是由人工設(shè)計(jì)的。
-
神經(jīng)元:神經(jīng)元的結(jié)構(gòu),如圖所示
-
每個(gè) 輸入 乘以其對(duì)應(yīng)的 權(quán)重 ,將結(jié)果 求和 ,得到 ;
-
將和代入 激活函數(shù) ,得到結(jié)果 。
全連接前饋神經(jīng)網(wǎng)絡(luò)
全連接:每一個(gè)神經(jīng)元的輸出都連接到下一層神經(jīng)元的每一個(gè)神經(jīng)元,每一個(gè)神經(jīng)元的輸入都來自上一層的每一個(gè)神經(jīng)元。
前饋:前饋(feedforward)也可以稱為前向,從信號(hào)流向來理解就是輸入信號(hào)進(jìn)入網(wǎng)絡(luò)后,信號(hào)流動(dòng)是單向的,即信號(hào)從前一層流向后一層,一直到輸出層,其中任意兩層之間的連接并沒有反饋(feedback),亦即信號(hào)沒有從后一層又返回到前一層。
-
全連接前饋神經(jīng)網(wǎng)絡(luò)示例:
如圖所示,這是一個(gè)4層的全連接神經(jīng)網(wǎng)絡(luò),每一層有兩個(gè)神經(jīng)元,每個(gè)神經(jīng)元的激活函數(shù)都是sigmoid。
-
網(wǎng)絡(luò)輸入為(1, -1),激活函數(shù)為sigmoid:
-
網(wǎng)絡(luò)輸入為(0, 0),激活函數(shù)為sigmoid:
神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu):
Input Layer:網(wǎng)絡(luò)的輸入層,Layer的size和真實(shí)輸入大小匹配。
Hidden Layers:處于輸入層和輸出層之間的網(wǎng)絡(luò)層。
Output Layer:網(wǎng)絡(luò)的最后一層,神經(jīng)元計(jì)算產(chǎn)生的結(jié)果直接輸出,作為模型的輸出。
一些疑問
-
為什么叫「 全連接 」?
因?yàn)榫W(wǎng)絡(luò)中相鄰的兩層神經(jīng)元,前一層的每一個(gè)神經(jīng)元和后一層的每一個(gè)神經(jīng)元都有連接,所以叫做全連接;
-
為什么叫「前饋」?
因?yàn)橹翟诰W(wǎng)絡(luò)中傳遞的方向是由前往后傳(輸入層傳向輸出層),所以叫做Feedforward。
-
Deep Learning,“Deep”體現(xiàn)在哪里?
神經(jīng)網(wǎng)絡(luò)的連接方式由人工設(shè)計(jì),所以可以堆疊很多層神經(jīng)元構(gòu)成很“深”網(wǎng)絡(luò),如上圖所示2015年提出的ResNet就達(dá)到了152層的深度。
深度神經(jīng)需要特殊的訓(xùn)練技巧
隨著層數(shù)變多,網(wǎng)絡(luò)參數(shù)增多,隨之運(yùn)算量增大,通常都是超過億萬級(jí)的計(jì)算。對(duì)于這樣復(fù)雜的結(jié)構(gòu),我們一定不會(huì)一個(gè)一個(gè)的計(jì)算,對(duì)于億萬級(jí)的計(jì)算,使用loop循環(huán)效率很低。
網(wǎng)絡(luò)的運(yùn)算過程如圖所示:
上圖中,網(wǎng)絡(luò)的運(yùn)算過程可看作是矩陣的運(yùn)算。
網(wǎng)絡(luò)的計(jì)算方法就像是嵌套,所以整個(gè)神經(jīng)網(wǎng)絡(luò)運(yùn)算就相當(dāng)于一連串的矩陣運(yùn)算。
從結(jié)構(gòu)上看每一層的計(jì)算都是一樣的,也就是用計(jì)算機(jī)進(jìn)行并行矩陣運(yùn)算。這樣寫成矩陣運(yùn)算的好處是,你可以使用GPU加速,GPU核心多,可以并行做大量的矩陣運(yùn)算。
神經(jīng)網(wǎng)絡(luò)的本質(zhì):通過隱藏層進(jìn)行特征轉(zhuǎn)換
隱藏層可以看作是對(duì)網(wǎng)絡(luò)輸入層輸入特征進(jìn)行特征處理,在最后一層隱藏層進(jìn)行輸出,這時(shí)的輸出可以看作一組全新的特征,將其輸出給輸出層,輸出層對(duì)這組全新的特征進(jìn)行分類。
舉例:手寫數(shù)字識(shí)別
舉一個(gè)手寫數(shù)字體識(shí)別的例子:
輸入:一個(gè)16*16=256維的向量,每個(gè)pixel對(duì)應(yīng)一個(gè)dimension,有顏色用(ink)用1表示,沒有顏色(no ink)用0表示,將圖片展平為一個(gè)256維的向量作為網(wǎng)絡(luò)輸入。
輸出:10個(gè)維度,每個(gè)維度代表一個(gè)數(shù)字的置信度(可理解為是該數(shù)字的概率有多大)
從輸出結(jié)果來看,每一個(gè)維度對(duì)應(yīng)輸出一個(gè)數(shù)字,代表模型輸出為當(dāng)前分類數(shù)字的概率。說明這張圖片是2的可能性就是最大的。
在這個(gè)問題中,唯一確定的就是,輸入是256維的向量,輸出是10維的向量,我們所需要找的函數(shù)就是輸入和輸出之間的神經(jīng)網(wǎng)絡(luò)這個(gè)函數(shù)。
從上圖看神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)決定了函數(shù)集(function set),通常來講函數(shù)集中的函數(shù)越多越復(fù)雜,網(wǎng)絡(luò)的表達(dá)空間就越大,越能handle復(fù)雜的模式,所以說網(wǎng)絡(luò)結(jié)構(gòu)(network structured)很關(guān)鍵。
接下來有幾個(gè)問題:
-
多少層?每層有多少神經(jīng)元?這個(gè)問我們需要用嘗試加上直覺的方法來進(jìn)行調(diào)試。對(duì)于有些機(jī)器學(xué)習(xí)相關(guān)的問題,我們一般用特征工程來提取特征,但是對(duì)于深度學(xué)習(xí),我們只需要設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)模型來進(jìn)行就可以了。對(duì)于語音識(shí)別和影像識(shí)別,深度學(xué)習(xí)是個(gè)好的方法,因?yàn)樘卣鞴こ烫崛√卣鞑⒉蝗菀住?/p>
-
結(jié)構(gòu)可以自動(dòng)確定嗎?有很多設(shè)計(jì)方法可以讓機(jī)器自動(dòng)找到神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)的,比如進(jìn)化人工神經(jīng)網(wǎng)絡(luò)(Evolutionary Artificial Neural Networks)但是這些方法并不是很普及 。
-
我們可以設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)嗎?可以的,比如 CNN卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network )
Step2:模型評(píng)估
損失示例
對(duì)于模型的評(píng)估,我們一般采用損失函數(shù)來反應(yīng)模型的優(yōu)劣,所以對(duì)于神經(jīng)網(wǎng)絡(luò)來說,我們可以采用交叉熵(cross entropy)函數(shù)來對(duì) 和 ̂ 的損失進(jìn)行計(jì)算,接下來我們就通過調(diào)整參數(shù),讓交叉熵越小越好。
總體損失
對(duì)于損失,我們不單單要計(jì)算一筆數(shù)據(jù)的,而是要計(jì)算整體所有訓(xùn)練數(shù)據(jù)的損失,然后把所有的訓(xùn)練數(shù)據(jù)的損失都加起來,得到一個(gè)總體損失 。接下來就是在functon set里面找到一組函數(shù)能最小化這個(gè)總體損失 ,或者是找一組神經(jīng)網(wǎng)絡(luò)的參數(shù) ,來最小化總體損失 。
Step3:選擇最優(yōu)函數(shù)
如何找到最優(yōu)的函數(shù)和最好的一組參數(shù)?
——使用梯度下降。
具體流程: 是一組包含權(quán)重和偏差的參數(shù)集合,隨機(jī)找一個(gè)初始值,接下來計(jì)算一下每個(gè)參數(shù)對(duì)應(yīng)的偏微分,得到的一個(gè)偏微分的集合∇ 就是梯度,有了這些偏微分,我們就可以更新梯度得到新的參數(shù),這樣不斷反復(fù)進(jìn)行,就能得到一組參數(shù)使得損失函數(shù)的值最小。
反向傳播
在神經(jīng)網(wǎng)絡(luò)訓(xùn)練中,我們需要將計(jì)算得到的損失向前傳遞,以計(jì)算各個(gè)神經(jīng)元連接的權(quán)重對(duì)損失的影響大小,這里用到的方法就是反向傳播。我們可以用很多框架來進(jìn)行計(jì)算損失,比如說TensorFlow,Pytorch,theano等。
思考題
為什么要用深度學(xué)習(xí),深層架構(gòu)帶來哪些好處?那是不是隱藏層越多越好?
隱藏層越多越好?
從圖中展示的結(jié)果看,毫無疑問,理論上網(wǎng)絡(luò)的層次越深效果越好,但現(xiàn)實(shí)中是這樣嗎?
普遍性定理
參數(shù)更多的模型擬合數(shù)據(jù)效果更好是很正常的。
有一個(gè)通用的理論:對(duì)于任何一個(gè)連續(xù)的函數(shù),都可以用足夠多的神經(jīng)元來表示。那為什么我們還需要深度(Deep)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)呢,是不是直接用一層包含很多神經(jīng)元的網(wǎng)絡(luò)(Fat)來表示就可以了?