第三周:浅层神经网络
1. 神經(jīng)網(wǎng)絡(luò)綜述
首先,我們從整體結(jié)構(gòu)上來大致看一下神經(jīng)網(wǎng)絡(luò)模型。
前面的課程中,我們已經(jīng)使用計算圖的方式介紹了邏輯回歸梯度下降算法的正向傳播和反向傳播兩個過程。如下圖所示。神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)與邏輯回歸類似,只是神經(jīng)網(wǎng)絡(luò)的層數(shù)比邏輯回歸多一層,多出來的中間那層稱為隱藏層/中間層。這樣從計算上來說,神經(jīng)網(wǎng)絡(luò)的正向傳播和反向傳播過程只是比邏輯回歸多了一次重復(fù)的計算。正向傳播過程分成兩層,第一層是輸入層到隱藏層,用上標(biāo)[1]來表示:
第二層是隱藏層到輸出層,用上標(biāo)[2]來表示:
在寫法上值得注意的是,方括號上標(biāo)[i]表示當(dāng)前所處的層數(shù);圓括號上標(biāo)(i)表示第i個樣本。
同樣,反向傳播過程也分成兩層。第一層是輸出層到隱藏層,第二層是隱藏層到輸入層。
2. 神經(jīng)網(wǎng)絡(luò)表示
單隱藏層神經(jīng)網(wǎng)絡(luò)就是典型的淺層(shallow)神經(jīng)網(wǎng)絡(luò)如下圖所示。
?結(jié)構(gòu)上,從左到右,可以分成三層:輸入層(Input layer),隱藏層(Hidden layer)和輸出層(Output layer)。輸入層和輸出層,顧名思義,對應(yīng)著訓(xùn)練樣本的輸入和輸出,很好理解。隱藏層是抽象的非線性的中間層。
在寫法上,我們通常把輸入矩陣X記為,把隱藏層輸出記為,上標(biāo)從0開始。用下標(biāo)表示第幾個神經(jīng)元,注意下標(biāo)從1開始。例如表示隱藏層第1個神經(jīng)元,表示隱藏層第2個神經(jīng)元。這樣,隱藏層有4個神經(jīng)元就可以將其輸出寫成矩陣的形式:
?最后,相應(yīng)的輸出層記為,即y^。這種單隱藏層神經(jīng)網(wǎng)絡(luò)也被稱為兩層神經(jīng)網(wǎng)絡(luò)(2 layer NN)。之所以叫兩層神經(jīng)網(wǎng)絡(luò)是因為,通常我們只會計算隱藏層輸出和輸出層的輸出,輸入層是不用計算的。這也是我們把輸入層層數(shù)上標(biāo)記為0的原因()。
3. 計算神經(jīng)網(wǎng)絡(luò)的輸出
接下來我們開始詳細(xì)推導(dǎo)神經(jīng)網(wǎng)絡(luò)的計算過程。兩層神經(jīng)網(wǎng)絡(luò)可以看成是邏輯回歸再重復(fù)計算一次。如下圖所示,邏輯回歸的正向計算可以分解成計算z和a的兩部分:
對于兩層神經(jīng)網(wǎng)絡(luò),從輸入層到隱藏層對應(yīng)一次邏輯回歸運算;從隱藏層到輸出層對應(yīng)一次邏輯回歸運算。每層計算時,要注意對應(yīng)的上標(biāo)和下標(biāo),一般我們記上標(biāo)方括號表示layer,下標(biāo)表示第幾個神經(jīng)元。例如表示第l層的第i個神經(jīng)元。注意,i從1開始,l從0開始。
下面,我們將從輸入層到輸出層的計算公式列出來:
?然后,從隱藏層到輸出層的計算公式為:
?其中a[1]為:
上述每個節(jié)點的計算都對應(yīng)著一次邏輯運算的過程,分別由計算z和a兩部分組成。
?為了提高程序運算速度,我們引入向量化和矩陣運算的思想,將上述表達(dá)式轉(zhuǎn)換成矩陣運算的形式:
?之前也介紹過,這里順便提一下,W[1]的維度是(4,3),b[1]的維度是(4,1),W[2]的維度是(1,4),b[2]的維度是(1,1)。這點需要特別注意。
4. 多個變量進(jìn)行矢量化
上一部分我們只是介紹了單個樣本的神經(jīng)網(wǎng)絡(luò)正向傳播矩陣運算過程。而對于m個訓(xùn)練樣本,我們也可以使用矩陣相乘的形式來提高計算效率。而且它的形式與上一部分單個樣本的矩陣運算十分相似,比較簡單。
不使用for循環(huán),利用矩陣運算的思想,輸入矩陣X的維度為(nx,m)。這樣,我們可以把上面的for循環(huán)寫成矩陣運算的形式:
其中,的維度是(4,m),4是隱藏層神經(jīng)元的個數(shù);的維度與相同;和的維度均為(1,m)。
對上面這四個矩陣來說,均可以這樣來理解:行表示神經(jīng)元個數(shù),列表示樣本數(shù)目m。
5. 矢量化實現(xiàn)的解釋
這部分Andrew用圖示的方式解釋了m個樣本的神經(jīng)網(wǎng)絡(luò)矩陣運算過程。其實內(nèi)容比較簡單,只要記住上述四個矩陣的行表示神經(jīng)元個數(shù),列表示樣本數(shù)目m就行了。
值得注意的是輸入矩陣X也可以寫成。
6. 激活函數(shù)
神經(jīng)網(wǎng)絡(luò)隱藏層和輸出層都需要激活函數(shù)(activation function),在之前的課程中我們都默認(rèn)使用Sigmoid函數(shù)σ(x)σ(x)作為激活函數(shù)。其實,還有其它激活函數(shù)可供使用,不同的激活函數(shù)有各自的優(yōu)點。下面我們就來介紹幾個不同的激活函數(shù)g(x)。
sigmoid函數(shù)
tanh函數(shù)
?
ReLU函數(shù)
Leaky ReLU函數(shù)
?
如上圖所示,不同激活函數(shù)形狀不同,a的取值范圍也有差異。
如何選擇合適的激活函數(shù)呢?首先我們來比較sigmoid函數(shù)和tanh函數(shù)。對于隱藏層的激活函數(shù),一般來說,tanh函數(shù)要比sigmoid函數(shù)表現(xiàn)更好一些。因為tanh函數(shù)的取值范圍在[-1,+1]之間,隱藏層的輸出被限定在[-1,+1]之間,可以看成是在0值附近分布,均值為0。這樣從隱藏層到輸出層,數(shù)據(jù)起到了歸一化(均值為0)的效果。因此,隱藏層的激活函數(shù),tanh比sigmoid更好一些。
而對于輸出層的激活函數(shù),因為二分類問題的輸出取值為{0,+1},所以一般會選擇sigmoid作為激活函數(shù)。
觀察sigmoid函數(shù)和tanh函數(shù),我們發(fā)現(xiàn)有這樣一個問題,就是當(dāng)|z|很大的時候,激活函數(shù)的斜率(梯度)很小。因此,在這個區(qū)域內(nèi),梯度下降算法會運行得比較慢。在實際應(yīng)用中,應(yīng)盡量避免使z落在這個區(qū)域,使|z|盡可能限定在零值附近,從而提高梯度下降算法運算速度。
為了彌補sigmoid函數(shù)和tanh函數(shù)的這個缺陷,就出現(xiàn)了ReLU激活函數(shù)。ReLU激活函數(shù)在z大于零時梯度始終為1;在z小于零時梯度始終為0;z等于零時的梯度可以當(dāng)成1也可以當(dāng)成0,實際應(yīng)用中并不影響。
對于隱藏層,選擇ReLU作為激活函數(shù)能夠保證z大于零時,梯度始終為1,從而提高神經(jīng)網(wǎng)絡(luò)梯度下降算法運算速度。但當(dāng)z小于零時,存在梯度為0的缺點,實際應(yīng)用中,這個缺點影響不是很大。為了彌補這個缺點,出現(xiàn)了Leaky ReLU激活函數(shù),能夠保證z小于零是梯度不為0。
最后總結(jié)一下,
如果是分類問題,輸出層的激活函數(shù)一般會選擇sigmoid函數(shù)。但是隱藏層的激活函數(shù)通常不會選擇sigmoid函數(shù),tanh函數(shù)的表現(xiàn)會比sigmoid函數(shù)好一些。實際應(yīng)用中,通常會會選擇使用ReLU或者Leaky ReLU函數(shù),保證梯度下降速度不會太小。其實,具體選擇哪個函數(shù)作為激活函數(shù)沒有一個固定的準(zhǔn)確的答案,應(yīng)該要根據(jù)具體實際問題進(jìn)行驗證(validation)。
7. 為什么需要非線性激活函數(shù)
我們知道上一部分講的四種激活函數(shù)都是非線性(non-linear)的。那是否可以使用線性激活函數(shù)呢?答案是不行!下面我們就來進(jìn)行簡要的解釋和說明。
假設(shè)所有的激活函數(shù)都是線性的,為了簡化計算,我們直接令激活函數(shù)g(z)=zg,即a=z。那么,淺層神經(jīng)網(wǎng)絡(luò)的各層輸出為:
我們對上式中a[2]進(jìn)行化簡計算:
?經(jīng)過推導(dǎo)我們發(fā)現(xiàn)a[2]仍是輸入變量x的線性組合。這表明,使用神經(jīng)網(wǎng)絡(luò)與直接使用線性模型的效果并沒有什么兩樣。即便是包含多層隱藏層的神經(jīng)網(wǎng)絡(luò),如果使用線性函數(shù)作為激活函數(shù),最終的輸出仍然是輸入x的線性模型。這樣的話神經(jīng)網(wǎng)絡(luò)就沒有任何作用了。因此,隱藏層的激活函數(shù)必須要是非線性的。
另外,如果所有的隱藏層全部使用線性激活函數(shù),只有輸出層使用非線性激活函數(shù),那么整個神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)就類似于一個簡單的邏輯回歸模型,而失去了神經(jīng)網(wǎng)絡(luò)模型本身的優(yōu)勢和價值。
值得一提的是,如果是預(yù)測問題而不是分類問題,輸出y是連續(xù)的情況下,輸出層的激活函數(shù)可以使用線性函數(shù)。如果輸出y恒為正值,則也可以使用ReLU激活函數(shù),具體情況,具體分析。
8. 激活函數(shù)的導(dǎo)數(shù)-梯度
在梯度下降反向計算過程中少不了計算激活函數(shù)的導(dǎo)數(shù)即梯度。
我們先來看一下sigmoid函數(shù)的導(dǎo)數(shù):
對于tanh函數(shù)的導(dǎo)數(shù):
對于ReLU函數(shù)的導(dǎo)數(shù):
對于Leaky ReLU函數(shù):
9. 神經(jīng)網(wǎng)絡(luò)的梯度下降法
接下來看一下在神經(jīng)網(wǎng)絡(luò)中如何進(jìn)行梯度計算。
該神經(jīng)網(wǎng)絡(luò)正向傳播過程為:
其中,g(?)g(?)表示激活函數(shù)。
反向傳播是計算導(dǎo)數(shù)(梯度)的過程,這里先列出來Cost function對各個參數(shù)的梯度:
反向傳播的具體推導(dǎo)過程我們下一部分再進(jìn)行詳細(xì)說明。
10. 神經(jīng)網(wǎng)絡(luò)反向傳播過程(optional)
我們?nèi)匀皇褂糜嬎銏D的方式來推導(dǎo)神經(jīng)網(wǎng)絡(luò)反向傳播過程。記得之前介紹邏輯回歸時,我們就引入了計算圖來推導(dǎo)正向傳播和反向傳播,其過程如下圖所示:
?由于多了一個隱藏層,神經(jīng)網(wǎng)絡(luò)的計算圖要比邏輯回歸的復(fù)雜一些,如下圖所示。對于單個訓(xùn)練樣本,正向過程很容易,反向過程可以根據(jù)梯度計算方法逐一推導(dǎo)。
?總結(jié)一下,淺層神經(jīng)網(wǎng)絡(luò)(包含一個隱藏層),m個訓(xùn)練樣本的正向傳播過程和反向傳播過程分別包含了6個表達(dá)式,其向量化矩陣形式如下圖所示:
11. Random Initialization
神經(jīng)網(wǎng)絡(luò)模型中的參數(shù)權(quán)重W是不能全部初始化為零的,接下來我們分析一下原因。
舉個簡單的例子,一個淺層神經(jīng)網(wǎng)絡(luò)包含兩個輸入,隱藏層包含兩個神經(jīng)元。如果權(quán)重W[1]和W[2]都初始化為零,即:
?我們把這種權(quán)重W全部初始化為零帶來的問題稱為symmetry breaking problem。解決方法也很簡單,就是將W進(jìn)行隨機(jī)初始化(b可初始化為零)。python里可以使用如下語句進(jìn)行W和b的初始化:
W_1 = np.random.randn((2,2))*0.01 b_1 = np.zero((2,1)) W_2 = np.random.randn((1,2))*0.01 b_2 = 0這里我們將和乘以0.01的目的是盡量使得權(quán)重W初始化比較小的值。之所以讓W(xué)比較小,是因為如果使用sigmoid函數(shù)或者tanh函數(shù)作為激活函數(shù)的話,W比較小,得到的|z|也比較小(靠近零點),而零點區(qū)域的梯度比較大,這樣能大大提高梯度下降算法的更新速度,盡快找到全局最優(yōu)解。如果W較大,得到的|z|也比較大,附近曲線平緩,梯度較小,訓(xùn)練過程會慢很多。
當(dāng)然,如果激活函數(shù)是ReLU或者Leaky ReLU函數(shù),則不需要考慮這個問題。但是,如果輸出層是sigmoid函數(shù),則對應(yīng)的權(quán)重W最好初始化到比較小的值。
12. 總結(jié)
本節(jié)課主要介紹了淺層神經(jīng)網(wǎng)絡(luò)。
首先,我們簡單概述了神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu):包括輸入層,隱藏層和輸出層。然后,我們以計算圖的方式推導(dǎo)了神經(jīng)網(wǎng)絡(luò)的正向輸出,并以向量化的形式歸納出來。
接著,介紹了不同的激活函數(shù)并做了比較,實際應(yīng)用中根據(jù)不同需要選擇合適的激活函數(shù)。激活函數(shù)必須是非線性的,不然神經(jīng)網(wǎng)絡(luò)模型起不了任何作用。
然后,我們重點介紹了神經(jīng)網(wǎng)絡(luò)的反向傳播過程以及各個參數(shù)的導(dǎo)數(shù)推導(dǎo),并以矩陣形式表示出來。
最后,介紹了權(quán)重隨機(jī)初始化的重要性,必須對權(quán)重W進(jìn)行隨機(jī)初始化操作。
總結(jié)
以上是生活随笔為你收集整理的第三周:浅层神经网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lgg6 android 9,LG G6
- 下一篇: sqoop从mysql导入hdfs_3.