m 個(gè)樣本的梯度下降(Gradient Descent on m Examples)在之前的筆記中,已經(jīng)講述了如何計(jì)算導(dǎo)數(shù),以及應(yīng)用梯度下降在邏輯回歸的一個(gè)訓(xùn)練樣本上?,F(xiàn)在我們想要把它應(yīng)用在m個(gè)訓(xùn)練樣本上。 首先,,讓我們時(shí)刻記住有關(guān)于損失函數(shù)就J(w,b) 的定義,。 當(dāng)你的算法輸出關(guān)于樣本y 的 a(i), a(i)是訓(xùn)練樣本的預(yù)測(cè)值,,即: 所以我們?cè)谇懊嬲故镜氖菍?duì)于任意單個(gè)訓(xùn)練樣本,,如何計(jì)算微分。因此dw_1,,dw_2和db 添上上標(biāo)i表示你求得的相應(yīng)的值,。 如果你面對(duì)的是我們?cè)谥把菔镜哪欠N情況,但只使用了一個(gè)訓(xùn)練樣本(x^(i),y^(i)) ,。 現(xiàn)在你知道帶有求和的全局代價(jià)函數(shù),實(shí)際上是1到m項(xiàng)各個(gè)損失的平均,。 所以它表明全局代價(jià)函數(shù)對(duì)w1的微分,,w1的微分也同樣是各項(xiàng)損失對(duì)w1微分的平均。 但之前我們已經(jīng)演示了如何計(jì)算這項(xiàng),,即之前幻燈中演示的如何對(duì)單個(gè)訓(xùn)練樣本進(jìn)行計(jì)算,。 所以你真正需要做的是計(jì)算這些微分,如我們?cè)谥暗挠?xùn)練樣本上做的。并且求平均,,這會(huì)給你全局梯度值,,你能夠把它直接應(yīng)用到梯度下降算法中。 所以這里有很多細(xì)節(jié),,但讓我們把這些裝進(jìn)一個(gè)具體的算法,。同時(shí)你需要一起應(yīng)用的就是邏輯回歸和梯度下降。 我們初始化 J=0,dw_1=0,dw_2=0,db=0 代碼流程: J=0;dw1=0;dw2=0;db=0; 筆記上只應(yīng)用了一步梯度下降,。因此你需要重復(fù)以上內(nèi)容很多次,,以應(yīng)用多次梯度下降??雌饋?lái)這些細(xì)節(jié)似乎很復(fù)雜,,但目前不要擔(dān)心太多。 但這種計(jì)算中有兩個(gè)缺點(diǎn),,也就是說(shuō)應(yīng)用此方法在邏輯回歸上你需要編寫兩個(gè)for循環(huán),。第一個(gè)for循環(huán)是一個(gè)小循環(huán)遍歷m個(gè)訓(xùn)練樣本,第二個(gè)for循環(huán)是一個(gè)遍歷所有特征的for循環(huán),。 這個(gè)例子中我們只有2個(gè)特征,,所以n等于2并且n_x 等于2。 但如果你有更多特征,,你開(kāi)始編寫你的dw_1,,dw_2,你有相似的計(jì)算從dw_3一直下去到dw_n,。所以看來(lái)你需要一個(gè)for循環(huán)遍歷所有n個(gè)特征 當(dāng)你應(yīng)用深度學(xué)習(xí)算法,,你會(huì)發(fā)現(xiàn)在代碼中顯式地使用for循環(huán)使你的算法很低效,同時(shí)在深度學(xué)習(xí)領(lǐng)域會(huì)有越來(lái)越大的數(shù)據(jù)集,。所以能夠應(yīng)用你的算法且沒(méi)有顯式的for循環(huán)會(huì)是重要的,,并且會(huì)幫助你適用于更大的數(shù)據(jù)集。所以這里有一些叫做向量化技術(shù),它可以允許你的代碼擺脫這些顯式的for循環(huán),。 我想在先于深度學(xué)習(xí)的時(shí)代,,也就是深度學(xué)習(xí)興起之前,向量化是很棒的,??梢允鼓阌袝r(shí)候加速你的運(yùn)算,但有時(shí)候也未必,。但是在深度學(xué)習(xí)時(shí)代,,向量化,擺脫for循環(huán)已經(jīng)變得相當(dāng)重要,。因?yàn)槲覀冊(cè)絹?lái)越多地訓(xùn)練非常大的數(shù)據(jù)集,,因此你真的需要你的代碼變得非常高效,。所以在接下來(lái)的幾個(gè)筆記中,我們會(huì)談到向量化,,以及如何應(yīng)用向量化而連一個(gè)for循環(huán)都不使用,。 所以學(xué)習(xí)了這些,我希望你有關(guān)于如何應(yīng)用邏輯回歸,,或是用于邏輯回歸的梯度下降,,事情會(huì)變得更加清晰。 向量化(Vectorization)向量化是非?;A(chǔ)的去除代碼中for循環(huán)的藝術(shù),,在深度學(xué)習(xí)安全領(lǐng)域、深度學(xué)習(xí)實(shí)踐中,,你會(huì)經(jīng)常發(fā)現(xiàn)自己訓(xùn)練大數(shù)據(jù)集,,因?yàn)樯疃葘W(xué)習(xí)算法處理大數(shù)據(jù)集效果很棒,所以你的代碼運(yùn)行速度非常重要,,否則如果在大數(shù)據(jù)集上,,你的代碼可能花費(fèi)很長(zhǎng)時(shí)間去運(yùn)行,你將要等待非常長(zhǎng)的時(shí)間去得到結(jié)果,。所以在深度學(xué)習(xí)領(lǐng)域,,運(yùn)行向量化是一個(gè)關(guān)鍵的技巧,讓我們舉個(gè)例子說(shuō)明什么是向量化,。 在邏輯回歸中你需要去計(jì)算z=w^T x+b,,w、x都是列向量,。如果你有很多的特征那么就會(huì)有一個(gè)非常大的向量,,所以w∈R^(n_x ) , x∈R^(n_x ),所以如果你想使用非向量化方法去計(jì)算w^T x,,你需要用如下方式(python) z=0 這是一個(gè)非向量化的實(shí)現(xiàn),,你會(huì)發(fā)現(xiàn)這真的很慢,作為一個(gè)對(duì)比,,向量化實(shí)現(xiàn)將會(huì)非常直接計(jì)算w^T x,,代碼如下(其中使用了numpy函數(shù),這個(gè)有點(diǎn)重要,,需要記得哦?。?/p> z=np.dot(w,x)+b 這是向量化計(jì)算w^T x的方法,你將會(huì)發(fā)現(xiàn)這個(gè)非???/p> 讓我們用一個(gè)小例子說(shuō)明一下(以下為在Jupyter notebook上寫的Python代碼): import numpy as np #導(dǎo)入numpy庫(kù) 返回值見(jiàn)圖,。 在兩個(gè)方法中,向量化和非向量化計(jì)算了相同的值,,如你所見(jiàn),,向量化版本花費(fèi)了1.5毫秒,非向量化版本的for循環(huán)花費(fèi)了大約幾乎500毫秒,,非向量化版本多花費(fèi)了300多倍的時(shí)間,。所以在這個(gè)例子中,僅僅是向量化你的代碼,,就會(huì)運(yùn)行300倍快,。這意味著如果向量化方法需要花費(fèi)一分鐘去運(yùn)行的數(shù)據(jù),for循環(huán)將會(huì)花費(fèi)5個(gè)小時(shí)去運(yùn)行,。一句話總結(jié),,以上都是再說(shuō)和for循環(huán)相比,向量化可以快速得到結(jié)果,。 你可能聽(tīng)過(guò)很多類似如下的話,,“大規(guī)模的深度學(xué)習(xí)使用了GPU或者圖像處理單元實(shí)現(xiàn)”,但是以上做的案例都是在jupyter notebook上面實(shí)現(xiàn),,這里只有CPU,,CPU和GPU都有并行化的指令,他們有時(shí)候會(huì)叫做SIMD指令,,這個(gè)代表了一個(gè)單獨(dú)指令多維數(shù)據(jù),,這個(gè)的基礎(chǔ)意義是,如果你使用了built-in函數(shù),像np.function或者并不要求你實(shí)現(xiàn)循環(huán)的函數(shù),,它可以讓python的充分利用并行化計(jì)算,,這是事實(shí)在GPU和CPU上面計(jì)算,GPU更加擅長(zhǎng)SIMD計(jì)算,,但是CPU事實(shí)上也不是太差,,可能沒(méi)有GPU那么擅長(zhǎng)吧。 接下來(lái)的筆記中,,你將看到向量化怎么能夠加速你的代碼,,經(jīng)驗(yàn)法則是,無(wú)論什么時(shí)候,,避免使用明確的for循環(huán),。 |
|
來(lái)自: AIWords > 《吳恩達(dá)講深度學(xué)習(xí)》