吴恩达DeepLearningCourse1-神经网络和深度学习
計(jì)劃在9月4日(截止日期)之前完成DeepLearning的所有課程學(xué)習(xí)。每個(gè)課程對應(yīng)一篇博客,根據(jù)學(xué)習(xí)進(jìn)度隨時(shí)更新。
參考課程
文章目錄
- (一)深度學(xué)習(xí)概論
- 結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)
- 提高效果的方法
- (二)神經(jīng)網(wǎng)絡(luò)基礎(chǔ)
- 二分分類
- Logistic回歸
- 梯度下降法
- 計(jì)算圖、計(jì)算圖的導(dǎo)數(shù)計(jì)算
- Logistic回歸中的梯度下降法
- 向量化
- Python廣播
- (三)淺層神經(jīng)網(wǎng)絡(luò)
- 計(jì)算神經(jīng)網(wǎng)絡(luò)的輸出
- 多樣本向量化
- 激活函數(shù)
- 隨機(jī)初始化
- (四)深層神經(jīng)網(wǎng)絡(luò)
- 深層網(wǎng)絡(luò)中的前向傳播
- 深層網(wǎng)絡(luò)中的反向傳播
- 核對矩陣的維數(shù)、深層神經(jīng)網(wǎng)絡(luò)的基本單元
- 超參數(shù)
(一)深度學(xué)習(xí)概論
結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)
結(jié)構(gòu)化數(shù)據(jù)是已經(jīng)清楚定義并組織的數(shù)據(jù),如數(shù)據(jù)庫。
非結(jié)構(gòu)化數(shù)據(jù)不具有結(jié)構(gòu)化特征,如圖片、音頻等。
提高效果的方法
-訓(xùn)練更大的神經(jīng)網(wǎng)絡(luò)
-投入更大規(guī)模的標(biāo)記數(shù)據(jù)
(二)神經(jīng)網(wǎng)絡(luò)基礎(chǔ)
二分分類
舉例:識別輸入圖像x中有/沒有貓,返回y(有為1,無為0)
圖片在計(jì)算機(jī)中的存儲形式
使用向量x存儲矩陣中的三組數(shù)據(jù),組織成nx1的向量,并將每個(gè)向量作為一列組織成整體輸入X(一種約定),輸出Y則為1xm的向量。
Logistic回歸
在二分分類問題中,得到的結(jié)果是輸入符合要求的期望,因此需要介于0和1之間。采用σ函數(shù)滿足該限制。
Loss Function:考察單個(gè)樣本數(shù)據(jù)和實(shí)際結(jié)果的接近程度。選擇該形式是因?yàn)槠渲庇^上是凸函數(shù),有唯一極小值,避免非凸函數(shù)的多個(gè)極值情況,便于求解。
Cost Function:考察樣本總體對實(shí)際結(jié)果的擬合效果。
梯度下降法
初始化w和b,每次選擇梯度最大的方向前進(jìn),或者停在最終結(jié)果處,由于成本函數(shù)是凸函數(shù),所以存在唯一極小值。
其中,α代表學(xué)習(xí)率,即前進(jìn)步長。
計(jì)算圖、計(jì)算圖的導(dǎo)數(shù)計(jì)算
導(dǎo)數(shù)計(jì)算采用鏈?zhǔn)椒▌t從右向左進(jìn)行,即dJ/da = (dJ/du)*(du/da)
單個(gè)訓(xùn)練樣本時(shí)同理操作。
Logistic回歸中的梯度下降法
對代價(jià)函數(shù)的每個(gè)累加項(xiàng)對應(yīng)求導(dǎo)即可得到偏導(dǎo)值。
圖中的J,dw1,dw2,db是累加項(xiàng),所以最終要除以m。而zi,ai,dzi對應(yīng)每個(gè)訓(xùn)練樣本的值。求累加值增量時(shí),采用4中的鏈?zhǔn)椒▌t的思想。
向量化
向量化避免了在程序中顯式使用for循環(huán),有效減少運(yùn)行時(shí)間。
例子中的操作方法:
import numpy
a = numpy.random.rand(1000000)
b = numpy.random.rand(1000000)
c= numpy.dot(a, b)
該操作比for循環(huán)計(jì)算并累加效率高得多。所以每次需要for循環(huán)時(shí),查看numpy中是否有可調(diào)用的內(nèi)置函數(shù),避免使用for循環(huán)。
根據(jù)以上例子,我理解的向量化是用向量的形式,組織每輪循環(huán)中得到的結(jié)果,利用numpy內(nèi)置函數(shù)高效地計(jì)算出矩陣相乘的結(jié)果。
逆向傳播時(shí)通過向量化消除了兩層的for循環(huán),即在一次步進(jìn)中沒有循環(huán)。但如果想要多次迭代,還需在外層添加計(jì)數(shù)循環(huán)。
Python廣播
在矩陣元素的運(yùn)算(區(qū)別于矩陣乘法)中,將規(guī)模較小的矩陣(其實(shí)是向量)進(jìn)行若干次復(fù)制后,再對對應(yīng)位置的元素進(jìn)行運(yùn)算。
使用assert保證矩陣是預(yù)期的形狀,如assert(a.shape==(3, 4))。調(diào)用reshape方法可以將矩陣保持期望形狀,如a = a.reshape(3, 3)。
(三)淺層神經(jīng)網(wǎng)絡(luò)
計(jì)算神經(jīng)網(wǎng)絡(luò)的輸出
以只有一個(gè)隱層的神經(jīng)網(wǎng)絡(luò)為例。直觀上,多層的神經(jīng)網(wǎng)絡(luò)是多個(gè)單層神經(jīng)網(wǎng)絡(luò)的堆疊。
其中的每個(gè)節(jié)點(diǎn)都經(jīng)過z = wTx + b, σ(z)的計(jì)算,如圖所示。
對0層到1層的計(jì)算進(jìn)行向量化,根據(jù)如下公式:
多樣本向量化
將輸入樣本按列排列,進(jìn)行向量化操作。此時(shí)對應(yīng)A[i],在垂直方向,這個(gè)垂直索引對應(yīng)于神經(jīng)網(wǎng)絡(luò)中的不同節(jié)點(diǎn)。例如節(jié)點(diǎn)位于矩陣的最左上角對應(yīng)于激活單元,它是位于第一個(gè)訓(xùn)練樣本上的第一個(gè)隱藏單元。它的下一個(gè)值對應(yīng)于第二個(gè)隱藏單元的激活值。當(dāng)水平掃描,將從第一個(gè)訓(xùn)練示例中從第一個(gè)隱藏的單元到第二個(gè)訓(xùn)練樣本,第三個(gè)訓(xùn)練樣本……
激活函數(shù)
通常tanh的表現(xiàn)優(yōu)于sigmoid函數(shù)。但有例外情況:在二分類的問題中,對于輸出層,因?yàn)閥的值是 0 或 1,所以想讓輸出的數(shù)值介于 0 和 1 之間,而不是在-1 和+1 之間。所以需要使用 sigmoid 激活函數(shù)。
對于上面的例子,可以在隱層使用tanh,輸出層使用sigmoid。
ReLU函數(shù)是最常用的。
如果不使用激活函數(shù),那么多層的神經(jīng)網(wǎng)絡(luò)本質(zhì)上仍然是一層,此時(shí)的隱藏層是多余的。為了構(gòu)建多層神經(jīng)網(wǎng)絡(luò),必須引入非線性的激活函數(shù)。
隨機(jī)初始化
將各層的w初始化為0,會導(dǎo)致正向傳播時(shí)的結(jié)果相同,從而導(dǎo)致反向傳播時(shí)的結(jié)果也相同,無法起到訓(xùn)練的作用。
為此,應(yīng)該把w的各個(gè)元素初始化為非0的較小的數(shù)。因?yàn)槭褂胹igmoid或tanh激活函數(shù)時(shí),若z過大或過小,會導(dǎo)致斜率趨近于0,降低運(yùn)行效率。
b初始為0不會產(chǎn)生負(fù)面影響。
(四)深層神經(jīng)網(wǎng)絡(luò)
深層網(wǎng)絡(luò)中的前向傳播
有一個(gè)隱藏層的神經(jīng)網(wǎng)絡(luò),就是一個(gè)兩層神經(jīng)網(wǎng)絡(luò)。
當(dāng)計(jì)算神經(jīng)網(wǎng)絡(luò)的層數(shù)時(shí),不算輸入層,只算隱藏層和輸出層。
前向傳播可以歸納為多次迭代:
𝑧[𝑙] = 𝑤[𝑙]𝑎[𝑙?1] + 𝑏[𝑙],
𝑎[𝑙] = 𝑔[𝑙](𝑧[𝑙])。
向量化實(shí)現(xiàn)過程可以寫成:
𝑍[𝑙] = 𝑊[𝑙]𝑎[𝑙?1] + 𝑏[𝑙],
𝐴[𝑙] = 𝑔[𝑙](𝑍[𝑙]) (𝐴[0] = 𝑋)
深層網(wǎng)絡(luò)中的反向傳播
反向傳播的步驟可以寫成:
(1)𝑑𝑧[𝑙] = 𝑑𝑎[𝑙]? 𝑔[𝑙]′(𝑧[𝑙])
(2)𝑑𝑤[𝑙] = 𝑑𝑧[𝑙]? 𝑎[𝑙?1]
(3)𝑑𝑏[𝑙] = 𝑑𝑧[𝑙]
(4)𝑑𝑎[𝑙?1] = 𝑤[𝑙]𝑇? 𝑑𝑧[𝑙]
(5)𝑑𝑧[𝑙] = 𝑤[𝑙+1]𝑇𝑑𝑧[𝑙+1]? 𝑔[𝑙]′(𝑧[𝑙])
式子(5)由式子(4)帶入式子(1)得到,前四個(gè)式子就可實(shí)現(xiàn)反向函數(shù)。
向量化實(shí)現(xiàn)過程可以寫成:
(6)𝑑𝑍[𝑙] = 𝑑𝐴[𝑙]? 𝑔[𝑙]′(𝑍[𝑙])
(7)𝑑𝑊[𝑙] =1/𝑚(𝑑𝑍[𝑙]? 𝐴[𝑙?1]𝑇)
(8)𝑑𝑏[𝑙] =1/𝑚(𝑛𝑝. 𝑠𝑢𝑚(𝑑𝑧[𝑙], 𝑎𝑥𝑖𝑠 = 1, 𝑘𝑒𝑒𝑝𝑑𝑖𝑚𝑠 = 𝑇𝑟𝑢𝑒))
(9)𝑑𝐴[𝑙?1] = 𝑊[𝑙]𝑇. 𝑑𝑍[𝑙]
核對矩陣的維數(shù)、深層神經(jīng)網(wǎng)絡(luò)的基本單元
建議:使用assert確保矩陣維數(shù)符合預(yù)期。debug時(shí)復(fù)現(xiàn)各個(gè)矩陣維數(shù)。
超參數(shù)
指能控制參數(shù)的參數(shù)。如學(xué)習(xí)率、迭代次數(shù)、層數(shù)、每層神經(jīng)元數(shù)等。
可以通過嘗試的方法確定超參數(shù)的選擇。
總結(jié)
以上是生活随笔為你收集整理的吴恩达DeepLearningCourse1-神经网络和深度学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 豌豆芽的功效与作用、禁忌和食用方法
- 下一篇: PyTorch深度学习实践