1.二分分類

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

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

????????一般的,我們會(huì)把紅綠藍(lán)三個(gè)通道的值逐個(gè)都列出來(lái)如圖2.3一樣,作為神經(jīng)網(wǎng)絡(luò)輸入特征向量x。如果圖片是64*64,那么向量x的總維度為64*64*3=12288,用=12288或n=12288表示輸入的特征向量的維度。
3.符號(hào)統(tǒng)一
????????(x,y)表示一個(gè)單獨(dú)樣本,其中x是維的特征向量,表示為x∈
,標(biāo)簽y的值為0或1,表示為y∈{0,1}。
????????有m個(gè)訓(xùn)練樣本,表示為m train example:{(,
),(
,
),...,(
,
)}。

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

????????圖2.5就是一個(gè)logistic回歸模型。有一張圖,需要識(shí)別是不是貓圖,輸入特征向量x,得到預(yù)測(cè)值 =p(y=1|x),其中x∈
,參數(shù)w∈
,參數(shù)b∈R,輸出為
=
+b。由于希望0<
<1,所以 =σ(
+b),其中σ是sigmoid(z)函數(shù),σ(z)=1/(1+
)。如果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,我們約定第i個(gè)訓(xùn)練樣本為,第i個(gè)標(biāo)簽為
,第i個(gè)預(yù)測(cè)值為
。定義成本函數(shù)前,我們先定義一個(gè)損失函數(shù),它指的是單個(gè)訓(xùn)練樣例預(yù)測(cè)與期望輸出的差異。

????????如圖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=0時(shí) p(y|x)=1-
則 p(y|x)=
則log(p(y|x)) = ylog( )+(1-y)log(1-
)
由于log函數(shù)式單調(diào)遞增,則log(p(y|x))肯定能找到最大值
而我們需要做的是最小化損失函數(shù),則-log(p(y|x)

????????根據(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。

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

????????如圖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,為了方便理解,我們暫時(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,假設(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,接著我們進(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.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回歸反向過(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)鍵的技巧。

????????使用類似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,對(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,把m個(gè)樣本集合到一個(gè)ndarray表示為X,X∈,則Z=np.dot(
,X)+b,A=σ(Z)。b會(huì)自動(dòng)轉(zhuǎn)成符合運(yùn)算的形狀,每個(gè)元素都等于b,這是python廣播機(jī)制。
14.向量化logistic回歸的梯度輸出

????????如圖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 * 。

????????如圖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。

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