AI發(fā)展迅速涨享,特別是NLP筋搏,一會(huì)是Bert,一會(huì)是GPT-2厕隧,熱火朝天奔脐。禁不住,我?guī)讉€(gè)月前也想重新好好學(xué)習(xí)一下深度學(xué)習(xí)吁讨,并且用它做點(diǎn)東西髓迎。前幾天,看《哈佛幸福課》的時(shí)候就說了建丧,想做什么事情排龄,不要拖著說等個(gè)什么契機(jī)再做,要立刻行動(dòng)翎朱,行為改變態(tài)度橄维。
于是尺铣,上個(gè)周末,我終于計(jì)劃好學(xué)習(xí)計(jì)劃争舞,重新開始學(xué)習(xí)迄埃。學(xué)習(xí)深度學(xué)習(xí),當(dāng)然從吳恩達(dá)的《deep learning》開始兑障,原理講得很透徹也很易懂,適合我這種沒什么基礎(chǔ)的蕉汪。下面流译,是我這個(gè)周末學(xué)習(xí)筆記。
一者疤、神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)(第一周)
1福澡、Relu全稱是修正性單元,它的函數(shù)示例大概如下圖:
2驹马、一個(gè)簡單的神經(jīng)網(wǎng)絡(luò)
例如:由房子大小革砸、房間數(shù)量、郵政編碼糯累、富裕程度這個(gè)四個(gè)輸入x算利,來決定最終的價(jià)格,也就是y泳姐。
注意:上面的圓圈效拭,在神經(jīng)網(wǎng)絡(luò)中叫做隱藏單元。其中上面的x1,x2,x3,x4代表輸入層胖秒,也就是4個(gè)特征缎患。
最終,可以參考下圖:
3阎肝、神經(jīng)網(wǎng)絡(luò)可以處理結(jié)構(gòu)化數(shù)據(jù)挤渔,也可以處理非結(jié)構(gòu)化數(shù)據(jù)
結(jié)構(gòu)化數(shù)據(jù):一般是我們數(shù)據(jù)庫中的數(shù)據(jù),例如Mysql中表的數(shù)據(jù)
非結(jié)構(gòu)化數(shù)據(jù):音頻數(shù)據(jù)风题、圖片數(shù)據(jù)判导、文本數(shù)據(jù)等等
4、神經(jīng)網(wǎng)絡(luò)分類
(1)基本的神經(jīng)網(wǎng)絡(luò)
(2)CNN也就是卷積神經(jīng)網(wǎng)絡(luò)俯邓,專門用來做圖像識(shí)別等
(3)RNN循環(huán)神經(jīng)網(wǎng)絡(luò)骡楼,它主要用來處理一維的時(shí)間序列數(shù)據(jù),例如音頻數(shù)據(jù)稽鞭、文本數(shù)據(jù)鸟整。
5、神經(jīng)網(wǎng)絡(luò)為什么突然這么厲害了朦蕴?
參考上圖:
1篮条、當(dāng)在數(shù)據(jù)量小的時(shí)候弟头,也許一些機(jī)器學(xué)習(xí)算法,因?yàn)樵O(shè)計(jì)的更好涉茧,可能會(huì)被深度學(xué)習(xí)表現(xiàn)更好赴恨,所以小數(shù)據(jù)集時(shí),并不能確定算法優(yōu)劣伴栓。
2伦连、而只有當(dāng)數(shù)據(jù)量變得很大時(shí),大型的神經(jīng)網(wǎng)絡(luò)才表現(xiàn)出更優(yōu)異的結(jié)果钳垮。
3惑淳、也就是說,推動(dòng)神經(jīng)網(wǎng)絡(luò)發(fā)展饺窿,不僅僅是技術(shù)的發(fā)展歧焦,網(wǎng)絡(luò)規(guī)模的發(fā)展,更是因?yàn)橛辛撕A康臄?shù)據(jù)肚医,注意了绢馍,這個(gè)數(shù)據(jù)還需要是標(biāo)簽化的數(shù)據(jù)。
6肠套、神經(jīng)網(wǎng)絡(luò)發(fā)展的三要素
數(shù)據(jù)
計(jì)算力
算法
其中舰涌,算法的發(fā)展,有一個(gè)例子你稚,就是sigmoid到relu舵稠,就會(huì)使梯度下降運(yùn)行得更快,因?yàn)閟igmoid到后面梯度越來越接近0了入宦,如下:
二哺徊、神經(jīng)網(wǎng)絡(luò)基礎(chǔ)(第二周)
1、神經(jīng)網(wǎng)絡(luò)擁有一個(gè)前向傳播乾闰,然后又會(huì)有一個(gè)后向傳播
2落追、二分分類符號(hào)
將m張圖片,也就是使用 nx * m 代表(nx, m)矩陣涯肩,用python表達(dá)就是X.shape = (nx, m)轿钠,nx代表行,m代表列病苗。最終疗垛,變成Y矩陣,Y.shape = (1, m)硫朦,代表1行m列贷腕,邏輯符號(hào)看下面:
原來,矩陣的符號(hào)是下面?zhèn)€:
代表 x 是 nx元素個(gè)矩陣,它是一維矩陣泽裳。
X代表是(nx, m)矩陣瞒斩,它是二維矩陣。
3涮总、怎么使用矩陣代表一張圖片
一張64x64像素的RGB圖片胸囱,因?yàn)樗?個(gè)通道,所以可以表示成 64x64x3瀑梗,最終將其壓縮到一列中烹笔,如下:
4、一個(gè)logistic回歸
(1)使用w和b參數(shù)學(xué)習(xí)
(2)最終使用sigmoid函數(shù)轉(zhuǎn)換為0和1
5抛丽、損失函數(shù)箕宙、成本函數(shù)
損失函數(shù):預(yù)測的值與真實(shí)的值誤差
成本函數(shù):則是求所有的預(yù)測值和真實(shí)值誤差的平均值
6、梯度下降
在梯度下降的時(shí)候铺纽,我們其實(shí)就是在找凸函數(shù)的最優(yōu)解。
例如哟忍,上面的圖形中底部那一點(diǎn)狡门。剛開始,我們不管初始化多少锅很,我們都會(huì)使用梯度下降其馏,不停逼近那個(gè)最優(yōu)解。
其中爆安,在求最優(yōu)解的時(shí)候叛复,我們會(huì)使用導(dǎo)數(shù)更新w和b值,還有一個(gè)參數(shù)就是α扔仓,它代表學(xué)習(xí)率褐奥,它越大,學(xué)習(xí)的越快翘簇,但是最后精度可能不好撬码。而求導(dǎo)的過程,其實(shí)就是求曲線的斜率版保。
7呜笑、直線求導(dǎo)
對(duì)于直線,斜率就是導(dǎo)數(shù)彻犁,一般導(dǎo)數(shù)這兩種寫法:
為啥說直線斜率就是導(dǎo)數(shù)叫胁,參考下面:
8、更多復(fù)雜的導(dǎo)數(shù)例子
注意:導(dǎo)數(shù)都是求函數(shù)的斜率汞幢,直線的斜率是一樣的驼鹅,但是其它函數(shù),例如loga等,在不同的地方谤民,曲線斜率是不一樣的堰酿。
9、計(jì)算圖流程
需要知道的是:
(1) 前向傳播是計(jì)算圖從左向右計(jì)算
(2)后向傳播是計(jì)算圖從右向左計(jì)算導(dǎo)數(shù)的計(jì)算
(3)python編程中张足,da代表損失函數(shù)對(duì)a求導(dǎo)触创,dv代表損失函數(shù)都v求導(dǎo)
10、logistic的梯度下降(在1個(gè)樣本中的推導(dǎo))
最主要为牍,先求出dw1哼绑、dw2、db這些導(dǎo)數(shù)碉咆,然使用它們更新w1抖韩、w2、b疫铜,這就是梯度下降茂浮,更新公式如下:
其中α是學(xué)習(xí)率。
11壳咕、多個(gè)樣本的logistic回歸
其中sigmoid的函數(shù)為:
這一波推導(dǎo)比較復(fù)雜點(diǎn)席揽,可以自己試著推導(dǎo)一遍。
12谓厘、將代碼實(shí)現(xiàn)為向量化幌羞,可以在python中極大的提升速度,使用Numpy實(shí)現(xiàn)
numpy中有很多內(nèi)置函數(shù)竟稳,當(dāng)要計(jì)算時(shí)属桦,盡量尋找numpy中內(nèi)置函數(shù),不要顯示使用for循環(huán)
13他爸、python中numpy向量編程廣播(Broadcasting)基本原則:
還有更多的只是聂宾,可以查閱numpy的文檔,輸入broadcasting查閱诊笤。
14亏吝、python使用numpy時(shí),需要注意的地方
不要使用 a = np.random.randn(5)這樣方法盏混,使用 a = np.random.randn((5, 1))創(chuàng)建列向量蔚鸥,或者使用
a = np.random.randn((1, 5))創(chuàng)建橫向量。
如果不確定shape時(shí)许赃,使用assert(a.shape = (5, 1))來確認(rèn)止喷。
15、sigmoid函數(shù)實(shí)現(xiàn)
sigmoid方程如下:
代碼實(shí)現(xiàn)如下:
def sigmoid(z):
"""
Compute the sigmoid of z
Arguments:
z -- A scalar or numpy array of any size.
Return:
s -- sigmoid(z)
"""
s = 1 / (1 + np.exp(-z))
return s
需要注意混聊,np.exp()是返回e的冪次方
三弹谁、作業(yè)實(shí)現(xiàn)
1、通過完成作業(yè),我知道了整個(gè)神經(jīng)網(wǎng)絡(luò)的構(gòu)建流程预愤。
那是如何構(gòu)建這個(gè)神經(jīng)網(wǎng)絡(luò)的呢沟于?
(1)預(yù)處理數(shù)據(jù)。
讀取圖片植康,并將圖片處理成向量化旷太;讀取文本。并且销睁,將訓(xùn)練的數(shù)據(jù)和測試的數(shù)據(jù)放在不同的變量中供璧。
(2)初始化數(shù)據(jù)。
這一步冻记,主要初始化w(權(quán)重)和b的值睡毒,其中w的維度是與圖片相關(guān)的,等于寬度x高度x3
(3)構(gòu)建模型
構(gòu)建模型中冗栗,首先是計(jì)算出前向傳播演顾,然后計(jì)算后向傳播,計(jì)算出梯度隅居,然后進(jìn)行梯度下降钠至,更新w和b的值。經(jīng)過多個(gè)循環(huán)之后军浆,它就會(huì)越加接近那個(gè)最優(yōu)解。
(4)預(yù)測方法
預(yù)測方法其實(shí)就是拿我們訓(xùn)練好的w和b的值挡闰,然后進(jìn)行前向傳播計(jì)算出對(duì)應(yīng)的y值乒融,也就是我們的預(yù)測值。
2摄悯、在完成作業(yè)的時(shí)候赞季,我也碰到了問題
(1)不知道什么時(shí)候使用np.dot還是直接A*B
例如下面公式:
我在計(jì)算成本函數(shù)的時(shí)候,報(bào)錯(cuò)了奢驯。這個(gè)問題申钩,我的解決方法是通過打印這些變量觀察得到。
但是瘪阁,其實(shí)可以看公式就知道撒遣,例如A的計(jì)算,沒有標(biāo)注是第幾個(gè)只是大寫X和wT相乘管跺,這個(gè)明顯是矩陣的點(diǎn)積义黎。而J的成本函數(shù)計(jì)算時(shí),是它們內(nèi)部每一個(gè)y(i)和log(a(i))相乘豁跑,其中y(i)代表第i個(gè)y值廉涕,所以是矩陣的乘法,也就是每個(gè)元素相乘。
總結(jié)
整個(gè)知識(shí)梳理了一遍狐蜕,比我以前只知道實(shí)現(xiàn)卻不知其所以然好多了宠纯。所以,我更憧憬后面的課程层释,爭取一個(gè)月把它學(xué)完婆瓜。