第二章 神經(jīng)網(wǎng)絡(luò)基礎(chǔ)

1.二分分類

圖2.1 小貓

????????如圖2.1就是一個(gè)二分分類問(wèn)題的例子,識(shí)別此圖并輸出標(biāo)簽,如果是貓輸出1,否則輸出0,我們用y表示輸出標(biāo)簽。

2.圖片表示

圖2.2 圖片在計(jì)算機(jī)中保存方式? ? ??

????????計(jì)算機(jī)保存一張圖片,要保存三個(gè)獨(dú)立矩陣,分別對(duì)應(yīng)圖片中的紅綠色三通道。

圖2.3 單張圖片表示成一個(gè)矩陣? ? ??

????????一般的,我們會(huì)把紅綠藍(lán)三個(gè)通道的值逐個(gè)都列出來(lái)如圖2.3一樣,作為神經(jīng)網(wǎng)絡(luò)輸入特征向量x。如果圖片是64*64,那么向量x的總維度為64*64*3=12288,用n_{x} =12288或n=12288表示輸入的特征向量的維度。

3.符號(hào)統(tǒng)一

????????(x,y)表示一個(gè)單獨(dú)樣本,其中x是n_{x} 維的特征向量,表示為x∈R^{nx },標(biāo)簽y的值為0或1,表示為y∈{0,1}。

????????有m個(gè)訓(xùn)練樣本,表示為m train example:{(x^{(1)},y^{(1)} ),(x^{(2)} ,y^{(2)}),...,(x^{(m)},y^{(m)} )}。

圖2.4 更緊湊方式表示訓(xùn)練集? ? ??

????????如圖2.4,大寫X表示特征向量訓(xùn)練集,樣本約定為列向量堆疊,X∈R^{(nx * m)},Python命令X.shape=(n_{x} , m)。大寫Y表示標(biāo)簽集,Y∈R^{1*m},Y.shape=(1, m)。

4.logistic回歸

圖2.5 logistic回歸模型整個(gè)過(guò)程

????????圖2.5就是一個(gè)logistic回歸模型。有一張圖,需要識(shí)別是不是貓圖,輸入特征向量x,得到預(yù)測(cè)值y^, =p(y=1|x),其中x∈R^{nx},參數(shù)w∈R^{nx} ,參數(shù)b∈R,輸出為 y^,=w^T +b。由于希望0<y^,<1,所以 =σ(w^T+b),其中σ是sigmoid(z)函數(shù),σ(z)=1/(1+e^{-z} )。如果z非常大,則σ接近1,反之,接近0。

????????所以,我們要做的是學(xué)習(xí)參數(shù)w和b,讓 變成比較好的估計(jì),相對(duì)于y比較好的估計(jì)。圖2.5中紅色是另外一種符號(hào)約定方式,我們統(tǒng)一用綠色方式。

5.logistic回歸成本函數(shù)?

????????為了訓(xùn)練logistic回歸模型的參數(shù)w和b,需要定義一個(gè)成本函數(shù),它衡量的是在全體訓(xùn)練樣本上的表現(xiàn)。

圖2.6 logistic回歸模型概要

????????如圖2.6,我們約定第i個(gè)訓(xùn)練樣本為x^{(i)},第i個(gè)標(biāo)簽為y^{(i)} ,第i個(gè)預(yù)測(cè)值為y^,。定義成本函數(shù)前,我們先定義一個(gè)損失函數(shù),它指的是單個(gè)訓(xùn)練樣例預(yù)測(cè)與期望輸出的差異。

圖2.7損失函數(shù)

????????如圖2.7,我們列舉了兩個(gè)二分類適用的損失函數(shù),當(dāng)然你也可以使用其他更合適的損失函數(shù),第一個(gè)損失函數(shù)也能表示單個(gè)訓(xùn)練集預(yù)測(cè)與期望輸出的差異,但該函數(shù)是非凸的,有多個(gè)局部最優(yōu)解,很難找到全局最優(yōu)解。第二函數(shù)是凸的,可以找到全集最優(yōu)解。

證:

設(shè)y=1時(shí) p(y|x)=y^,

則y=0時(shí) p(y|x)=1-y^,

則 p(y|x)= y^{,y} (1-y^, )^{(1-y)}

則log(p(y|x)) = ylog(y^, )+(1-y)log(1- y^,)

由于log函數(shù)式單調(diào)遞增,則log(p(y|x))肯定能找到最大值

而我們需要做的是最小化損失函數(shù),則-log(p(y|x)

圖2.8 成本函數(shù)

????????根據(jù)損失函數(shù),我們列出成本函數(shù),如圖2.8。這個(gè)成本函數(shù)是基于參數(shù)的總成本,在訓(xùn)練logistic回歸模型式時(shí),我們要找到合適的參數(shù)w和b,讓成本函數(shù)J盡可能小。

6.梯度下降法

????????梯度下降法是用來(lái)訓(xùn)練或者說(shuō)學(xué)習(xí)訓(xùn)練集上參數(shù)w和b。

圖2.9 logistic回歸算法及其成本函數(shù)? ? ??

????????成本函數(shù)J是參數(shù)w和b的函數(shù),被定義為平均值,即1/m的損失函數(shù)之和。損失函數(shù)可以衡量算法的效果,成本函數(shù)可以衡量參數(shù)w和b在訓(xùn)練集上的效果。

圖2.10 梯度下降法

????????如圖2.10,這里假設(shè)訓(xùn)練集只有一個(gè)特征值,則只有參數(shù)只有一個(gè)w和一個(gè)b,實(shí)際上會(huì)有很多特征值,即有很多個(gè)不同的w和一個(gè)b。

????????成本函數(shù)是凸函數(shù),通過(guò)不斷學(xué)習(xí),找到合適參數(shù)w和b,使成本函數(shù)J最小。一開(kāi)始我們需要先初始化參數(shù)w和b,對(duì)于logistic回歸而言,基本任何初始化方式都有效,通常初始化為0,但對(duì)于logistic回歸我們更多的是隨機(jī)初始化。因?yàn)楹瘮?shù)式凸的,無(wú)論在哪初始化,都應(yīng)該到達(dá)同一點(diǎn),或者大致相同點(diǎn)。

????????梯度下降法所做的是,從初始化點(diǎn)開(kāi)始,朝最陡的下坡方向走一步,這是梯度下降的一次迭代。在下降一步后,或許收斂到全局最優(yōu)解,在那里停下,或許繼續(xù)下降,直到收斂到最有解或接近全局最優(yōu)解。

圖2.11 梯度下降法細(xì)節(jié)

????????如圖2.11,為了方便理解,我們暫時(shí)忽略參數(shù)b,為了使成本函數(shù)最小化,則需要重復(fù)執(zhí)行w=w-α*dJ(w)/dw,其中α是學(xué)習(xí)率即下降步長(zhǎng),dJ(w)/dw是導(dǎo)數(shù)。

????????把參數(shù)b加上,則

????????w=w-α*?J(w,b)/?w,

????????b=b-α*?J(w,b)/?b

????????多個(gè)參數(shù)用? ,代表偏導(dǎo)數(shù),

????????單參數(shù)用d ,表示導(dǎo)數(shù)。

????????我們約定w的導(dǎo)數(shù)(或偏導(dǎo))用dw 表示,即 w=w-α*dw,b的導(dǎo)數(shù)(或偏導(dǎo))用 db表示,即b=b-α*db 。

7.導(dǎo)數(shù)

????????自行翻閱微積分,特別要熟悉鏈?zhǔn)椒▌t。

8.計(jì)算圖

????????一個(gè)神經(jīng)網(wǎng)絡(luò)的計(jì)算都是按照前向和反向傳播過(guò)程實(shí)現(xiàn)的。首先計(jì)算出神經(jīng)網(wǎng)絡(luò)的輸出,緊接著進(jìn)行一個(gè)反向傳輸操作,后者指的是計(jì)算導(dǎo)數(shù)。

圖2.12 完整神經(jīng)網(wǎng)絡(luò)計(jì)算過(guò)程? ? ??

????????如圖2.12,假設(shè)成本函數(shù)為 ,先進(jìn)行前向計(jì)算,目的是計(jì)算出成本函數(shù)和為反向傳播提供值,

????????若a=5,b=3,c=2,

? ? ? ? 則令u=bc,v=a+u,J=3v,

????????則第一步u=bc=6,

????????則第二步v=a+u=11,

????????最后一步J=3v=33。

圖2.13 反向傳播

????????如圖2.13,接著我們進(jìn)行反向傳播,目的是計(jì)算出參數(shù)a,b,c的導(dǎo)數(shù),

????????第一步dJ/dv=3,dv/du=1,dv/da=1,du/db=c=2,du/dc=b=3

????????第二步dJ/du=dJ/dv * dv/du=3 * 1=3,

????????最后一步

????????dJ/da=dJ/dv * dv/da=3 * 1=3,

????????dJ/db=dJ/du * du/db=3 * 2=6,

????????dJ/dc=dJ/du * du/dc=3 * 3=9。

9.logistic回歸的梯度下降

圖2.14 logistic回歸前向過(guò)程? ? ??

????????如圖2.14,描述了logistic回歸的前向過(guò)程。

圖2.15 logistic回歸反向過(guò)程

????????如圖2.15,是logistic回歸的反向傳播過(guò)程,目的是計(jì)算參數(shù)w1,w2,b的導(dǎo)數(shù),

????????第一步da=dL(a,y)/da=-y/a + (1-y)/(1-a),da/dz=a(1-a),

????????第二步dz=dL(a,y)/dz=dL(a,y)/da * da/dz=a-y,dz/dw1=x1,

????????第三步

? ? ????dw1=dL(a,y)/dw1=dL(a,y)/da * da/dz * dz/dw1=(a-y)x1,

????????dw2=dL(a,y)/dw1=dL(a,y)/da * da/dz * dz/dw2=(a-y)x2,

????????db=dL(a,y)/db=dL(a,y)/da * da/dz * dz/db=a-y。

????????接著計(jì)算 w1=w1-αdw1, w2=w2-αdw2, b=b-αb,然后進(jìn)行下次迭代。

10.m個(gè)樣本的梯度下降

圖2.16 m個(gè)樣本logistic回歸梯度下降? ? ??

????????如圖2.16,m個(gè)樣本logistic回歸反向過(guò)程求導(dǎo)只需要每個(gè)樣本相加然后除以m即可。For循環(huán)是很緩慢的過(guò)程,解決這個(gè)問(wèn)題就會(huì)用到向量化技術(shù)。

11.向量化

????????向量化通常是消除你代碼中顯式for循環(huán)的方法。在深度學(xué)習(xí)中,你會(huì)發(fā)現(xiàn)數(shù)據(jù)集越大深度學(xué)習(xí)算法表現(xiàn)得才越優(yōu)越,所以你的代碼運(yùn)行得非??旆浅V匾?,不然在訓(xùn)練時(shí)你會(huì)花大把時(shí)間去等待。

????????在深度學(xué)習(xí)領(lǐng)域,向量化是一個(gè)很關(guān)鍵的技巧。

圖2.17非向量化和向量化對(duì)比? ??

????????使用類似np.dot()的內(nèi)置函數(shù)或者其他能讓你去掉顯示for循環(huán)的函數(shù),就能夠?qū)崿F(xiàn)向量化,這樣能夠使程序充分使用并行化(單指令多數(shù)據(jù)流)去更快地計(jì)算。相對(duì)CPU,GPU能夠更快地進(jìn)行并行化處理。從而成立一條經(jīng)驗(yàn)法則,只要有可能,在神經(jīng)網(wǎng)絡(luò)編程中,一定要避免顯式的for循環(huán)。

12.更多向量化例子

圖2.18 向量化例子

????????如圖2.18,對(duì)向量v的每個(gè)元素進(jìn)行指數(shù)運(yùn)算,用for循環(huán)如左側(cè)所示一個(gè)個(gè)運(yùn)算,為了更快運(yùn)算我們?nèi)コ齠or循環(huán)改成右側(cè)的np.exp(v),右側(cè)的向量化運(yùn)算會(huì)快很多。向量化的內(nèi)置函數(shù)還有np.log()計(jì)算log,np.abs()計(jì)算絕對(duì)值,np.maximum()找最大值,v**2計(jì)算每個(gè)元素的平方等。

13.向量化logistic回歸

圖2.19 向量化logistic回歸前向過(guò)程? ??

????????如圖2.19,把m個(gè)樣本集合到一個(gè)ndarray表示為X,X∈R^{nx*m},則Z=np.dot(w^T,X)+b,A=σ(Z)。b會(huì)自動(dòng)轉(zhuǎn)成符合運(yùn)算的形狀,每個(gè)元素都等于b,這是python廣播機(jī)制。

14.向量化logistic回歸的梯度輸出

圖2.20 向量化logistic回歸反向過(guò)程? ? ??

????????如圖2.20,把m個(gè)a集合到一個(gè)ndarray表示為A,m個(gè)y集合到一個(gè)ndarray表示為Y,則dZ=A-Y,db=1/m * np.sum(dZ),dw=1/m * X * dZ^T。

圖2.21 向量化后的logistic回歸完整過(guò)程? ??

????????如圖2.21,從左到右是logistic回歸去除for循環(huán)改成向量化,但是迭代過(guò)程仍然需要用for循環(huán)控制迭代次數(shù)。

15.關(guān)于python/numpy向量說(shuō)明

????????Python/numpy提供了很大靈活性,同時(shí)這也有不好的地方。比如一行代碼可以實(shí)現(xiàn)你想要的功能,太靈活了可能會(huì)引入很細(xì)微的錯(cuò)誤。比如,你用一個(gè)橫向量加一個(gè)列向量,你可能預(yù)計(jì)會(huì)報(bào)錯(cuò)說(shuō)維度不匹配,但由于廣播機(jī)制存在,你會(huì)得到一個(gè)求和之后的矩陣。

所以我們要加入一些技巧和提示,從而消除代碼中的bug。

圖2.22 Python/numpy編程注意細(xì)節(jié)? ??

????????我們不要使用秩為1即shape為(n,)的數(shù)組,因?yàn)檫@既不是橫向量也不是列向量,a.T和a是一樣的。而是要把shape設(shè)成(n,1)列向量或者(1,n)橫向量,并且判斷shape不符合時(shí)作出提示。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容