一此叠、什么是自編碼
簡(jiǎn)單的自編碼是一種三層神經(jīng)網(wǎng)絡(luò)模型,包含了數(shù)據(jù)輸入層匾荆、隱藏層、輸出重構(gòu)層杆烁,同時(shí)它是一種無(wú)監(jiān)督學(xué)習(xí)模型牙丽。在有監(jiān)督的神經(jīng)網(wǎng)絡(luò)中,我們的每個(gè)訓(xùn)練樣本是(X兔魂,y)烤芦,然后y一般是我們?nèi)斯?biāo)注的數(shù)據(jù)。比如我們用于手寫(xiě)的字體分類(lèi)析校,那么y的取值就是0~9之間數(shù)值构罗,最后神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)的時(shí)候铜涉,網(wǎng)絡(luò)的輸出層是一個(gè)10個(gè)神經(jīng)元的網(wǎng)絡(luò)模型(比如網(wǎng)絡(luò)輸出是(0,0,1,0,0,0,0,0,0,0),那么就表示該樣本標(biāo)簽為2)。然而自編碼是一種無(wú)監(jiān)督學(xué)習(xí)模型遂唧,我們訓(xùn)練數(shù)據(jù)本來(lái)是沒(méi)有標(biāo)簽的芙代,那么自編碼是這樣干的,它令每個(gè)樣本的標(biāo)簽為y=x盖彭,也就是每個(gè)樣本的數(shù)據(jù)x的標(biāo)簽也是x纹烹。自編碼就相當(dāng)于自己生成標(biāo)簽,而且標(biāo)簽是樣本數(shù)據(jù)本身召边。
三層自編碼神經(jīng)網(wǎng)絡(luò)模型如下:
自編碼網(wǎng)絡(luò)包含兩個(gè)過(guò)程:
(1)從輸入層-》隱藏層的原始數(shù)據(jù)X的編碼過(guò)程:
(2)從隱藏層-》輸出層的解碼過(guò)程:
那么數(shù)據(jù)X的重構(gòu)誤差損失函數(shù)就是:
其中M是訓(xùn)練樣本的個(gè)數(shù)铺呵。
因此等我們訓(xùn)練完網(wǎng)絡(luò)后,當(dāng)我們隨便輸入一個(gè)測(cè)試樣本數(shù)據(jù)X'隧熙,那么自編碼網(wǎng)絡(luò)將對(duì)X‘先進(jìn)行隱藏層的編碼片挂,然后再?gòu)碾[藏-》輸出完成解碼,重構(gòu)出X’贞盯。隱藏層可以看成是原始數(shù)據(jù)x的另外一種特征表達(dá)音念。
這個(gè)時(shí)候就會(huì)有人問(wèn)自編碼有什么作用,訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)模型邻悬,讓它輸入是x症昏,然后輸出也近似x,有毛用父丰?其實(shí)自編碼可以實(shí)現(xiàn)類(lèi)似于PCA等數(shù)據(jù)降維肝谭、數(shù)據(jù)壓縮的特性。從上面自編碼的網(wǎng)絡(luò)結(jié)構(gòu)圖蛾扇,如果輸入層神經(jīng)云的個(gè)數(shù)n小于隱層神經(jīng)元個(gè)數(shù)m攘烛,那么我們就相當(dāng)于把數(shù)據(jù)從n維降到了m維;然后我們利用這m維的特征向量镀首,進(jìn)行重構(gòu)原始的數(shù)據(jù)坟漱。這個(gè)跟PCA降維一模一樣,只不過(guò)PCA是通過(guò)求解特征向量更哄,進(jìn)行降維芋齿,是一種線性的降維方式,而自編碼是一種非線性降維成翩。
當(dāng)然自編碼隱藏層可以比輸入層的神經(jīng)元個(gè)數(shù)還多觅捆,然后我們可以在神經(jīng)網(wǎng)絡(luò)的損失函數(shù)構(gòu)造上,加入正則化約束項(xiàng)進(jìn)行稀疏約束麻敌,這個(gè)時(shí)候就演化成了稀疏自編碼了栅炒,因此我們接著就說(shuō)說(shuō)稀疏自編碼。
二、什么是稀疏自編碼(SAE)
所謂的稀疏自編碼就對(duì)隱藏層神經(jīng)元加入的稀疏約束赢赊,因?yàn)槲覀兿M依欤帽M可能少的神經(jīng)元來(lái)表示原始數(shù)據(jù)X。我們知道隱藏層神經(jīng)元的激活值就相當(dāng)于原始數(shù)據(jù)X的另外一種表達(dá)释移,我們希望這種表達(dá)是稀疏表達(dá)(也就是隱藏層的神經(jīng)元激活值盡可能多的為0)叭披。我們知道隱藏層神經(jīng)元j的平均激活度為:
其中m表示樣本的個(gè)數(shù)。我們要讓隱藏層神經(jīng)元j盡量為0秀鞭,如果可以讓[] 趋观,然后讓 [] 是一個(gè)趨近于零的小數(shù),那該有多好锋边。于是我們構(gòu)造了KL散度作為網(wǎng)絡(luò)的正則約束項(xiàng)皱坛,使得[] 盡量的接近于[] :
最后網(wǎng)絡(luò)訓(xùn)練損失函數(shù)就是:
總之:稀疏自編碼就是在原來(lái)自編碼的損失函數(shù)上,加入了稀疏約束項(xiàng)豆巨。除了讓我們的隱藏層特征稀疏性外剩辟,江湖傳說(shuō)它還有加速網(wǎng)絡(luò)訓(xùn)練的功能(參考自文獻(xiàn)《Deep Learning of Part-based Representation of Data Using Sparse Autoencoders with Nonnegativity》)
不過(guò)除了稀疏約束項(xiàng)之外,一般我們?yōu)榱朔乐惯^(guò)擬合往扔,還加入了權(quán)重衰減項(xiàng)贩猎,所以最后的損失函數(shù)就是:
三、什么是降噪自編碼(DAE文獻(xiàn):《Extracting and Composing Robust Features with Denoising?Autoencoders》)
降噪自編碼與自編碼的區(qū)別:在原始數(shù)據(jù)X上加入了噪聲X'萍膛,然后再作為網(wǎng)絡(luò)的輸入數(shù)據(jù)吭服,來(lái)重構(gòu)輸出原始還未加入噪聲的數(shù)據(jù)。
因此降噪自編碼的損失函數(shù)是構(gòu)造原始數(shù)據(jù)X與網(wǎng)絡(luò)輸出X''之間的一個(gè)差異性度量蝗罗。加入噪聲艇棕,然后訓(xùn)練恢復(fù)原始數(shù)據(jù),可以讓我們的網(wǎng)絡(luò)具有更強(qiáng)的抗噪能力串塑,使得自編碼更加魯邦沼琉。
文獻(xiàn)的具體做法是,通過(guò)對(duì)原始數(shù)據(jù)輸入神經(jīng)元桩匪,進(jìn)行人為隨機(jī)損壞加噪聲打瘪,得到損壞數(shù)據(jù)X'。
方法1:可以采用高斯噪聲:
方法2:采用binary ?mask ?噪聲傻昙,也就是把輸入神經(jīng)元值隨機(jī)置0(跟drop out 一樣闺骚,把某些神經(jīng)元的激活值置0),然后再作為神經(jīng)網(wǎng)絡(luò)的輸入妆档。
四僻爽、什么是收縮自編碼(CAE文獻(xiàn):《Contractive auto-encoders:?Explicit invariance during feature extraction》)
收縮自編碼也很簡(jiǎn)單,只不過(guò)是在損失函數(shù)中过吻,加入了一項(xiàng)懲罰項(xiàng)进泼。
以前加入正則項(xiàng)的自編碼損失函數(shù)一般是這樣的:
現(xiàn)在采用CAE的損失函數(shù)是這樣的:
如果網(wǎng)絡(luò)采用的Sigmod函數(shù),那么Jf(x)的計(jì)算公式就是:
h表示隱層神經(jīng)元纤虽。
五乳绕、什么是棧式自編碼
開(kāi)始講什么是棧式自編碼前,讓我們先來(lái)了解一些深度學(xué)習(xí)中的無(wú)監(jiān)督預(yù)訓(xùn)練逼纸。我們知道洋措,在深度學(xué)習(xí)中,一般網(wǎng)絡(luò)都有很多層杰刽,因?yàn)榫W(wǎng)絡(luò)層數(shù)一多菠发,訓(xùn)練網(wǎng)絡(luò)采用的梯度下降,在低層網(wǎng)絡(luò)會(huì)出現(xiàn)梯度彌散的現(xiàn)象贺嫂,導(dǎo)致了深度網(wǎng)絡(luò)一直不招人待見(jiàn)滓鸠。直到2006年的3篇論文改變了這種狀況,由Hinton提出了一種深層網(wǎng)絡(luò)的訓(xùn)練方法第喳,改變了人們對(duì)深度學(xué)習(xí)的態(tài)度糜俗。Hinton所提出的訓(xùn)練思想,整體過(guò)程如下曲饱;
A悠抹、網(wǎng)絡(luò)各層參數(shù)預(yù)訓(xùn)練。我們?cè)谝郧暗纳窠?jīng)網(wǎng)絡(luò)中扩淀,參數(shù)的初始化都是用隨機(jī)初始化方法楔敌,然而這種方法,對(duì)于深層網(wǎng)絡(luò)驻谆,在低層中卵凑,參數(shù)很難被訓(xùn)練,于是Hinton提出了參數(shù)預(yù)訓(xùn)練旺韭,這個(gè)主要就是采用RBM氛谜、以及我們本篇博文要講的自編碼,對(duì)網(wǎng)絡(luò)的每一層進(jìn)行參數(shù)初始化区端。也就是我們這邊要學(xué)的稀疏自編碼就是為了對(duì)網(wǎng)絡(luò)的每一層進(jìn)行參數(shù)初始化值漫,僅僅是為了獲得初始的參數(shù)值而已(這就是所謂的無(wú)監(jiān)督參數(shù)初始化,或者稱(chēng)之為“無(wú)監(jiān)督
pre-training”)织盼。
B杨何、比如采用自編碼,我們可以把網(wǎng)絡(luò)從第一層開(kāi)始自編碼訓(xùn)練沥邻,在每一層學(xué)習(xí)到的隱藏特征表示后作為下一層的輸入危虱,然后下一層再進(jìn)行自編碼訓(xùn)練,對(duì)每層網(wǎng)絡(luò)的進(jìn)行逐層無(wú)監(jiān)督訓(xùn)練唐全。
C埃跷、當(dāng)我們無(wú)監(jiān)督訓(xùn)練完畢后蕊玷,我們要用于某些指定的任務(wù),比如分類(lèi)弥雹,這個(gè)時(shí)候我們可以用有標(biāo)簽的數(shù)據(jù)對(duì)整個(gè)網(wǎng)絡(luò)的參數(shù)繼續(xù)進(jìn)行梯度下降調(diào)整垃帅。
這就是深層網(wǎng)絡(luò)的訓(xùn)練思想,總體歸結(jié)為:無(wú)監(jiān)督預(yù)訓(xùn)練剪勿、有監(jiān)督微調(diào)贸诚。
OK,我們回到本篇文章的主題厕吉,從上面的解釋中酱固,我們知道稀疏自編碼僅僅只是為了獲得參數(shù)的初始值而已。棧式自編碼神經(jīng)網(wǎng)絡(luò)是一個(gè)由多層稀疏自編碼器組成的神經(jīng)網(wǎng)絡(luò)头朱,其前一層自編碼器的輸出作為其后一層自編碼器的輸入运悲。棧式自編碼就是利用上面所說(shuō)的:無(wú)監(jiān)督pre-training、有監(jiān)督微調(diào)進(jìn)行訓(xùn)練訓(xùn)練的深度網(wǎng)絡(luò)模型项钮。接著就讓我們來(lái)學(xué)一學(xué)具體的棧式自編碼網(wǎng)絡(luò)訓(xùn)練扇苞。下面是來(lái)自斯坦福的深度學(xué)習(xí)教程的一個(gè)例子:http://ufldl.stanford.edu/wiki/index.php/%E6%A0%88%E5%BC%8F%E8%87%AA%E7%BC%96%E7%A0%81%E7%AE%97%E6%B3%95
問(wèn)題描述:假設(shè)我們要訓(xùn)練一個(gè)4層的神經(jīng)網(wǎng)絡(luò)模型用于分類(lèi)任務(wù),網(wǎng)絡(luò)結(jié)構(gòu)如下:
接著我們就講講寄纵,棧式自編碼的訓(xùn)練上面這個(gè)網(wǎng)絡(luò)的方法:
1鳖敷、無(wú)監(jiān)督pre-training階段;
A程拭、首先采用稀疏自編碼網(wǎng)絡(luò)定踱,先訓(xùn)練從輸入層到H1層的參數(shù):
訓(xùn)練完畢后,我們?nèi)コ獯a層恃鞋,只留下從輸入層到隱藏層的編碼階段崖媚。
B、接著我們訓(xùn)練從H1到H2的參數(shù)
我們把無(wú)標(biāo)簽數(shù)據(jù)的H1層神經(jīng)元的激活值恤浪,作為H2層的輸入層畅哑,然后在進(jìn)行自編碼訓(xùn)練:
最后訓(xùn)練完畢后,再去除H2層的解碼層水由。如此重復(fù)荠呐,可以訓(xùn)練更高層的網(wǎng)絡(luò),這就是逐層貪婪訓(xùn)練的思想砂客。
C泥张、訓(xùn)練完H2后,我們就可以接分類(lèi)層softmax鞠值,用于多分類(lèi)任務(wù)
至此參數(shù)的初始化階段就算是結(jié)束了媚创,這個(gè)過(guò)程就是所謂的無(wú)監(jiān)督預(yù)訓(xùn)練。
2彤恶、有監(jiān)督微調(diào)階段
后面接著就是钞钙,利用上面的參數(shù)作為網(wǎng)絡(luò)的初始值鳄橘,繼續(xù)進(jìn)行神經(jīng)網(wǎng)絡(luò)的訓(xùn)練了,沒(méi)什么可講的芒炼。
原文參考:http://blog.csdn.net/hjimce/article/details/49106869
其中m表示樣本的個(gè)數(shù)挥唠。我們要讓隱藏層神經(jīng)元j盡量為0,如果可以讓?zhuān)?/p>