深度學(xué)習(xí)概論
神經(jīng)網(wǎng)絡(luò)屬于監(jiān)督學(xué)習(xí)芋类,并徹底改變了監(jiān)督學(xué)習(xí)隆嗅。神經(jīng)網(wǎng)絡(luò)這個(gè)概念不是近幾年才有,但是卻是近幾年興起的侯繁。那么是什么原因促成了神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)的興起呢胖喳?規(guī)模。這里的規(guī)模不僅指神經(jīng)網(wǎng)絡(luò)架構(gòu)的規(guī)模贮竟,也指數(shù)據(jù)的規(guī)模丽焊。規(guī)模的增長(zhǎng)使得神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)在機(jī)器學(xué)習(xí)各個(gè)算法中拔得頭籌。正是由于規(guī)模的驅(qū)動(dòng)咕别,深度學(xué)習(xí)將在未來(lái)幾年持續(xù)不斷地發(fā)展技健。
隨著互聯(lián)網(wǎng)的發(fā)展,海量的數(shù)據(jù)成為一種資源惰拱〈萍總的來(lái)講,這些數(shù)據(jù)可以被分為結(jié)構(gòu)化數(shù)據(jù)(Structured Data)和非架構(gòu)化數(shù)據(jù)(Unstructured Data)偿短。其中帽芽,結(jié)構(gòu)化數(shù)據(jù)典型的代表即數(shù)據(jù)庫(kù)數(shù)據(jù),非結(jié)構(gòu)化的數(shù)據(jù)包括音頻翔冀、圖像和文本等导街,結(jié)構(gòu)化的數(shù)據(jù)更容易被計(jì)算機(jī)理解。毋庸置疑纤子,深度學(xué)習(xí)在處理非結(jié)構(gòu)化數(shù)據(jù)方面有著明顯的優(yōu)勢(shì)搬瑰。總的來(lái)說(shuō)控硼,神經(jīng)網(wǎng)絡(luò)架構(gòu)有以下幾種:
- 通用的標(biāo)準(zhǔn)的神經(jīng)網(wǎng)絡(luò)(Universally Standard Neural Network)
- 卷積神經(jīng)網(wǎng)絡(luò)CNN(Convolutional Neural Network)
- 循環(huán)神經(jīng)網(wǎng)絡(luò)RNN(Recurrent Neural Network)
其中泽论,CNN多用于處理圖像,RNN多用于處理序列數(shù)據(jù)(音頻卡乾,單詞語(yǔ)言翼悴,含有時(shí)間成分的一維時(shí)間序列等)。
神經(jīng)網(wǎng)絡(luò)基礎(chǔ)
梯度下降法(Gradient Descent)
下圖所示為logistic回歸算法幔妨,其中鹦赎,J為成本函數(shù)。我們的目標(biāo)是找到使得成本函數(shù)最小的w和b误堡。梯度下降法的思路為:用某初始值初始化w和b古话,從初始點(diǎn)開(kāi)始,試圖沿著最快下降方向往下走锁施,這樣就很有希望達(dá)到全局最優(yōu)解或者接近全局最優(yōu)解陪踩。
核心算法為如下所示的兩個(gè)公式:
向量化(vectorization)
向量化的作用即是消除代碼中顯式的for循環(huán)語(yǔ)句杖们。在編寫(xiě)新的網(wǎng)絡(luò)或者在進(jìn)行回歸時(shí),盡量避免for循環(huán)肩狂。
import numpy as np
import time
//向量化版本
a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic = time.time()
c = np.dot(a,b)
toc = time.time()
print("Vectorized version:" + str(1000*(toc-tic)) + "ms")
//for循環(huán)版本
c = 0
tic = time.time()
for i in range(1000000):
c += a[i]*b[i]
toc = time.time()
print("for loop" + str(1000*(toc-tic)) + "ms")
輸出結(jié)果:
250224.435665
Vectorized version:1.0025501251220703ms
250224.435665
for loop717.5307273864746ms
其他可以向量化的例子:
np.exp(v)
np.log(v)
np.abs(v)
np.maximum(v)
向量化logistic回歸
Python中的廣播
Python中的廣播為在進(jìn)行科學(xué)計(jì)算的時(shí)候經(jīng)常用到的一種技術(shù)摘完。總的來(lái)說(shuō)傻谁,就是將一個(gè)(m,n)維的矩陣和一個(gè)向量相加時(shí)描焰,向量會(huì)自動(dòng)擴(kuò)展為和矩陣相同的維數(shù),而后與矩陣進(jìn)行計(jì)算栅螟。
編程技巧
在進(jìn)行神經(jīng)網(wǎng)絡(luò)編程時(shí)荆秦,要注意不要使用秩為1的數(shù)組。
a = np.random.randn(5)
應(yīng)該使用如下所示的數(shù)組:
a = np.random.randn(5,1)
淺層次神經(jīng)網(wǎng)絡(luò)
神經(jīng)網(wǎng)絡(luò)的表示
如上圖所示的網(wǎng)絡(luò)通常被認(rèn)為是三層神經(jīng)網(wǎng)絡(luò)力图,因?yàn)樗还灿腥龑樱狠斎雽硬匠瘛㈦[含層和輸出層,而在學(xué)術(shù)論文里大多被稱為二層神經(jīng)網(wǎng)絡(luò):第一層(隱含層)和第二層(輸出層)吃媒。
根據(jù)示意圖瓤介,可以列出如下四個(gè)向量化的方程,每個(gè)向量的維度都在下面標(biāo)出赘那。
激活函數(shù)
激活函數(shù)有多種:
1.Sigmoid函數(shù)
該函數(shù)的值域?yàn)閇0,1]刑桑。
2.tanh函數(shù)
該函數(shù)的值域?yàn)閇-1,1],并通過(guò)原點(diǎn)募舟。
3.修正線性單元(Rectified Linear Unit)
該函數(shù)在z<0時(shí)祠斧,斜率為0;在z>0時(shí)拱礁,斜率為1;在z=0時(shí)琢锋,導(dǎo)數(shù)沒(méi)有定義。
4.帶泄露的修正線性單元(Leaky ReLU)
可能的公式為:
不同激活函數(shù)的對(duì)比:
1.對(duì)于Sigmoid函數(shù)呢灶,除非用在二元分類的輸出層吴超,不然絕對(duì)不要用。
2.大多數(shù)場(chǎng)合下鸯乃,tanh函數(shù)比Sigmoid函數(shù)更加優(yōu)越鲸阻。
3.最常用的默認(rèn)激活函數(shù)是ReLU函數(shù),如果不確定用哪個(gè)就用這個(gè)缨睡,或者也可以試試帶泄漏的ReLU函數(shù)鸟悴。
4.最有效的還是自己嘗試跑一下程序,選擇一個(gè)最適合自己應(yīng)用的宏蛉。
使用非線性激活函數(shù)的原因
因?yàn)榫€性函數(shù)的組合還是線性函數(shù)遣臼,這樣就無(wú)法引入更多更復(fù)雜的函數(shù)性置。一般除了在做回歸的時(shí)候在輸出層可以用到線性激活函數(shù)拾并,其他情況很少用線性激活函數(shù)。
反向傳播
如前所述,二層神經(jīng)網(wǎng)絡(luò)的正向傳播需要四個(gè)方程嗅义,而反向傳播則需要6個(gè)方程屏歹。
向量化的版本如下:
隨機(jī)初始化參數(shù)
-
W不能初始化為0矩陣,b可以初始化為元素均為0的矩陣之碗。
初始化示例
- 要乘以0.01蝙眶,是因?yàn)橐话銋?shù)會(huì)初始化為比較小的數(shù),否則在使用激活函數(shù)時(shí)z的值容易落到函數(shù)飽和的區(qū)段褪那,使得學(xué)習(xí)速度減慢幽纷。
深層神經(jīng)網(wǎng)絡(luò)(Deep Neural Network)
為什么使用深層表示
- 關(guān)于深層表示的直覺(jué)
當(dāng)進(jìn)行人臉識(shí)別時(shí),可以把神經(jīng)網(wǎng)絡(luò)中的當(dāng)做是邊緣探測(cè)器博敬,來(lái)探測(cè)輸入圖片的邊緣友浸,比如有的神經(jīng)元探測(cè)到鼻子的部分而有的探測(cè)到眼睛的部分,然后就可以開(kāi)始檢測(cè)人臉的不同部分偏窝,最后再把這些部分放在一起收恢,就可以識(shí)別不同的人臉了。
- 電路理論和深度學(xué)習(xí)
深度神經(jīng)網(wǎng)絡(luò)有效的另外一個(gè)支持理論來(lái)源于電路理論祭往。使用一些基本的邏輯門(mén)來(lái)表示一些函數(shù)直觀上就像使用一些基本的神經(jīng)元來(lái)表示一些函數(shù)一樣伦意。非正式地講,有些函數(shù)如果使用深層網(wǎng)絡(luò)表示的話硼补,每層的神經(jīng)元的數(shù)量可以比較少驮肉;如果使用淺層的神經(jīng)網(wǎng)絡(luò)的話,則每一層的神經(jīng)元的數(shù)量呈指數(shù)增長(zhǎng)已骇。
深層網(wǎng)絡(luò)的前向傳播
L層的正向傳播方程如下:
這里需要用到for循環(huán)缆八。以層數(shù)為循環(huán)次數(shù),對(duì)每一層進(jìn)行傳播方程的求解疾捍。
核對(duì)矩陣的維數(shù)
在進(jìn)行編程時(shí)奈辰,有效的排除一些bug的方法是把參與計(jì)算的矩陣維數(shù)從頭到尾核對(duì)一遍。經(jīng)過(guò)推導(dǎo)乱豆,我們可以得到矩陣的維數(shù)的一些規(guī)律奖恰。
其中,m為訓(xùn)練樣本集的數(shù)目宛裕,n^[l]為第l層的神經(jīng)元的個(gè)數(shù)瑟啃。
搭建深層神經(jīng)網(wǎng)絡(luò)塊
深層神經(jīng)網(wǎng)絡(luò)塊主要包括正向傳播和反向傳播兩個(gè)流程,大致計(jì)算流程如下圖:
參數(shù)和超參數(shù)
神經(jīng)網(wǎng)絡(luò)的性能的高低很大程度上取決于我們?cè)O(shè)置的參數(shù)和超參數(shù)揩尸。其中蛹屿,W和b為我們經(jīng)常提到的參數(shù);而學(xué)習(xí)率(learning rate)岩榆、迭代次數(shù)错负、隱含層層數(shù)坟瓢、隱層單元個(gè)數(shù)、激活函數(shù)的選擇等這些參數(shù)則控制著最后的W和b這兩個(gè)參數(shù)犹撒,因此被稱為超參數(shù)(hyper parameters)折联。
除了上面提到的超參數(shù),深度學(xué)習(xí)中還有很多不同的超參數(shù)识颊,比如:動(dòng)量項(xiàng)(momentum term)诚镰、最小批次大小(mini batch size)、正則化參數(shù)(regularization parameters)
深度學(xué)習(xí)的應(yīng)用是一個(gè)經(jīng)驗(yàn)過(guò)程祥款,我們需要不斷地嘗試清笨、編碼、實(shí)驗(yàn)刃跛,不斷地積累和總結(jié)經(jīng)驗(yàn)函筋。直到我們有了設(shè)置參數(shù)的靈感和直覺(jué)。