武功再高,也怕菜刀幼衰。
當(dāng)我們的模型主體結(jié)構(gòu)確定了之后舆蝴,或者說(shuō)我們由于數(shù)據(jù)量等現(xiàn)實(shí)問(wèn)題已經(jīng)無(wú)法再提已有模型的能力,我們可以使用很多簡(jiǎn)單的優(yōu)化算法幢泼,把我們現(xiàn)在的數(shù)據(jù)模型的能力大幅提高紧显。這一部分我們會(huì)分別介紹多層網(wǎng)絡(luò),激活函數(shù)缕棵,損失函數(shù)孵班,梯度下降涉兽,反向傳播,動(dòng)態(tài)學(xué)習(xí)率以及具體的實(shí)現(xiàn)
多層網(wǎng)絡(luò)
首先我們?cè)诘谝徽戮陀懻摿松疃葘W(xué)習(xí)的驚人效果篙程,所以首先我們要做的就是要把上一張的模型變成神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)花椭,即在輸入層和輸出層之間加入隱藏層。
隱藏層可以包含很多層房午,上一層的處理結(jié)果又是下一次的輸入值矿辽,經(jīng)過(guò)每一層的處理最終得到輸出結(jié)果」幔可以理解為每一層我們通過(guò)參數(shù)的設(shè)置袋倔,把上一層的處理結(jié)果抽象成更高級(jí)的特征。
層數(shù)越深越好折柠?
隨著隱藏層的層數(shù)越來(lái)越多宾娜,我們最終結(jié)果的準(zhǔn)確率也會(huì)提升。然而隨著深度越來(lái)越深扇售,我們發(fā)現(xiàn)了這些問(wèn)題:
1. 過(guò)擬合(Overfitting) 原因是隨著層數(shù)的增多前塔,對(duì)正確結(jié)果有影響的“噪音”也和真正所需的特征一起被放大,抽象承冰。這就導(dǎo)致了我們所訓(xùn)練的模型對(duì)于訓(xùn)練集數(shù)據(jù)可以高度的匹配华弓,但是不具備普遍實(shí)用性,所以這樣的模型會(huì)在測(cè)試集上表現(xiàn)不盡人意困乒。
如圖所示娜搂,第一種是擬合不足迁霎,導(dǎo)致模型在訓(xùn)練集和測(cè)試集上都沒(méi)有好的表現(xiàn);恰當(dāng)?shù)臄M合如圖二百宇,則會(huì)在訓(xùn)練集和測(cè)試集上都有比較好的結(jié)果考廉;圖三則是過(guò)擬合,它在訓(xùn)練集上過(guò)度的擬合携御,雖然可以在訓(xùn)練集上取得很高的準(zhǔn)確率昌粤,卻會(huì)在測(cè)試集上獲得較低的訓(xùn)練集。
對(duì)于如何在深度網(wǎng)絡(luò)中解決過(guò)擬合的問(wèn)題因痛,我們會(huì)專門(mén)開(kāi)一章講解婚苹,有很多有趣的想法。
2. 梯度消失(Gradient Vanishing Problem)
梯度消失是指在神經(jīng)網(wǎng)絡(luò)訓(xùn)練過(guò)程中鸵膏,權(quán)重更新的梯度消失膊升,也就是權(quán)重參數(shù)無(wú)法再通過(guò)訓(xùn)練更新。現(xiàn)在對(duì)于梯度的修正方法也很多了谭企,我們會(huì)在后面的講解中帶出廓译。其中一個(gè)簡(jiǎn)單實(shí)用的就是使用非線性激活函數(shù)评肆。
3. 梯度爆炸(Gradient Exploding Problem)
和梯度消失相反,梯度爆炸是指在神經(jīng)網(wǎng)絡(luò)訓(xùn)練過(guò)程中非区,權(quán)重更新的梯度變大瓜挽,使得權(quán)重多次以大于1的倍數(shù)迭代更新。我們也會(huì)在后面的講解中提出解決方案征绸。
激活函數(shù)
簡(jiǎn)單概括久橙,激活函數(shù)是用來(lái)實(shí)現(xiàn)函數(shù)的去線性化。想象一下你用一堆直線想要畫(huà)出一個(gè)圓管怠,就必須用無(wú)數(shù)的直線一點(diǎn)點(diǎn)修正淆衷。但是如果你可以話曲線就可以一次性解決問(wèn)題。如果沒(méi)有激活函數(shù)渤弛,所有的輸入和輸出其實(shí)都是線性關(guān)系祝拯,這就像用直線畫(huà)圓一樣,同樣的訓(xùn)練成本下只能實(shí)現(xiàn)粗糙的效果她肯。
sigmoid是最為普遍的激活函數(shù)佳头,但是現(xiàn)在在我們的實(shí)際應(yīng)用中已經(jīng)很少使用了,一個(gè)重要的原因就是它在深層網(wǎng)絡(luò)中容易引起梯度消失晴氨,所以我們一般在隱藏層中使用ReLU作為激活函數(shù)康嘉。但是使用ReLU我們一樣有需要注意的是學(xué)習(xí)率的設(shè)定,因?yàn)閺乃奶卣魑覀円材馨l(fā)現(xiàn)瑞筐,它很容易造成死神經(jīng)元凄鼻,也就是所有神經(jīng)元的輸入經(jīng)過(guò)激活后變成了0腊瑟。所以我們也可以使用Leaky ReLU替代聚假。
具體使用什么樣的激活函數(shù)其實(shí)和我們所訓(xùn)練的數(shù)據(jù)以及模型有關(guān),大家在實(shí)踐中發(fā)現(xiàn)模型有問(wèn)題發(fā)生在激活函數(shù)前后時(shí)闰非,可以嘗試其他的激活函數(shù)膘格。
損失函數(shù)
我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)的最終目的就是最小化我們的損失函數(shù),所以損失函數(shù)即我們用來(lái)衡量模型好壞的標(biāo)準(zhǔn)财松。正如我們前面提到的瘪贱,不同的模型有著目的所以一般有著不一樣的損失函數(shù)。但是我們也有著一些通用的評(píng)判方法辆毡,比如交叉熵函數(shù)(Cross Entropy)菜秦。p表示真實(shí)標(biāo)記的分布,q則為訓(xùn)練后的模型的預(yù)測(cè)標(biāo)記分布舶掖,交叉熵?fù)p失函數(shù)可以衡量p與q的相似性球昨。
自定義損失函數(shù)
我們當(dāng)然可以根據(jù)實(shí)際需要自定義損失函數(shù)。比如我是一個(gè)銷(xiāo)售商眨攘,我進(jìn)貨時(shí)需要考慮我能賣(mài)多少主慰。假如一件商品的成本是1嚣州,利潤(rùn)是2,那么我多進(jìn)貨一個(gè)共螺,損失是1该肴,但是少進(jìn)一個(gè)就會(huì)損失2,所以我的損失函數(shù)就會(huì)變成
loss = sum(f(x, y))
f(x, y) = 1 * (x - y) 如果x > y
f(x, y) = 2 * (y - x) 如果y > x
這些都是我們?cè)趯?shí)際應(yīng)用中必然會(huì)使用的方法藐不,每一項(xiàng)都可以展開(kāi)說(shuō)很多內(nèi)容匀哄,我們?cè)谶@里先進(jìn)行簡(jiǎn)單介紹,等我們?cè)诓僮髦杏龅綍r(shí)會(huì)繼續(xù)展開(kāi)雏蛮。有興趣的同學(xué)們可以自己去搜索一下相關(guān)知識(shí)拱雏。
另外歡迎大家關(guān)注留言,我們的更新可以及時(shí)推送底扳,一起學(xué)習(xí)吧騷年們~