为什么稀疏自编码器很少见到多层的?
Andrew Ng 的視頻和資料也好,還是網(wǎng)上的資料和代碼,以及書上的內(nèi)容,我很少見到稀疏自編碼器是多層的結(jié)構(gòu)一般都是{N,m,N}的三層結(jié)構(gòu)(一層是隱層,輸入輸出各一層)為什么很少見到例如{N,m,k,m,N}這種5層的結(jié)構(gòu)的Auto Encoder?是沒有必要嗎?還是有別的原因(比如破壞稀疏性)?
科研君?,每周六提供一份高質(zhì)量回答。 張逸萌?等?147?人贊同 自編碼器
自從Hinton 2006年的工作之后,越來越多的研究者開始關(guān)注各種自編碼器模型相應(yīng)的堆疊模型。實(shí)際上,自編碼器(Auto-Encoder)是一個(gè)較早的概念了,比如Hinton等人在1986, 1989年的工作。(說來說去都是這些人吶。。。)
自編碼器簡(jiǎn)介
先暫且不談神經(jīng)網(wǎng)絡(luò)、深度學(xué)習(xí),僅是自編碼器的話,其原理很簡(jiǎn)單。自編碼器可以理解為一個(gè)試圖去還原其原始輸入的系統(tǒng)。如下圖所示。
圖中,虛線藍(lán)色框內(nèi)就是一個(gè)自編碼器模型,它由編碼器(Encoder)和解碼器(Decoder)兩部分組成,本質(zhì)上都是對(duì)輸入信號(hào)做某種變換。編碼器將輸入信號(hào)x變換成編碼信號(hào)y,而解碼器將編碼y轉(zhuǎn)換成輸出信號(hào)。即
y=f(x)
=g(y)=g(f(x))
而自編碼器的目的是,讓輸出盡可能復(fù)現(xiàn)輸入x,即tries to copy its input to its output。但是,這樣問題就來了——如果f和g都是恒等映射,那不就恒有=x了?不錯(cuò),確實(shí)如此,但這樣的變換——沒有任何卵用啊!因此,我們經(jīng)常對(duì)中間信號(hào)y(也叫作“編碼”)做一定的約束,這樣,系統(tǒng)往往能學(xué)出很有趣的編碼變換f和編碼y。
這里強(qiáng)調(diào)一點(diǎn),對(duì)于自編碼器,我們往往并不關(guān)系輸出是啥(反正只是復(fù)現(xiàn)輸入),我們真正關(guān)心的是中間層的編碼,或者說是從輸入到編碼的映射??梢赃@么想,在我們強(qiáng)迫編碼y和輸入x不同的情況下,系統(tǒng)還能夠去復(fù)原原始信號(hào)x,那么說明編碼y已經(jīng)承載了原始數(shù)據(jù)的所有信息,但以一種不同的形式!這就是特征提取啊,而且是自動(dòng)學(xué)出來的!實(shí)際上,自動(dòng)學(xué)習(xí)原始數(shù)據(jù)的特征表達(dá)也是神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)的核心目的之一。
為了更好的理解自編碼器,下面結(jié)合神經(jīng)網(wǎng)絡(luò)加以介紹。
自編碼器與神經(jīng)網(wǎng)絡(luò)
神經(jīng)網(wǎng)絡(luò)的知識(shí)不再詳細(xì)介紹,相信了解自編碼器的讀者或多或少會(huì)了解一些。簡(jiǎn)單來講,神經(jīng)網(wǎng)絡(luò)就是在對(duì)原始信號(hào)逐層地做非線性變換,如下圖所示。
該網(wǎng)絡(luò)把輸入層數(shù)據(jù)x∈Rn轉(zhuǎn)換到中間層(隱層)h∈Rp,再轉(zhuǎn)換到輸出層y∈Rm。圖中的每個(gè)節(jié)點(diǎn)代表數(shù)據(jù)的一個(gè)維度(偏置項(xiàng)圖中未標(biāo)出)。每?jī)蓪又g的變換都是“線性變化”+“非線性激活”,用公式表示即為
h=f(W(1)x+b(1))
y=f(W(2)h+b(2))
神經(jīng)網(wǎng)絡(luò)往往用于分類,其目的是去逼近從輸入層到輸出層的變換函數(shù)。因此,我們會(huì)定義一個(gè)目標(biāo)函數(shù)來衡量當(dāng)前的輸出和真實(shí)結(jié)果的差異,利用該函數(shù)去逐步調(diào)整(如梯度下降)系統(tǒng)的參數(shù)(W(1),b(1),W(2),b(2)),以使得整個(gè)網(wǎng)絡(luò)盡可能去擬合訓(xùn)練數(shù)據(jù)。如果有正則約束的話,還同時(shí)要求模型盡量簡(jiǎn)單(防止過擬合)。
那么,自編碼器怎么表示呢?前面已說過,自編碼器試圖復(fù)現(xiàn)其原始輸入,因此,在訓(xùn)練中,網(wǎng)絡(luò)中的輸出應(yīng)與輸入相同,即y=x,因此,一個(gè)自編碼器的輸入、輸出應(yīng)有相同的結(jié)構(gòu),即
我們利用訓(xùn)練數(shù)據(jù)訓(xùn)練這個(gè)網(wǎng)絡(luò),等訓(xùn)練結(jié)束后,這個(gè)網(wǎng)絡(luò)即學(xué)習(xí)出了x→h→x的能力。對(duì)我們來說,此時(shí)的h是至關(guān)重要的,因?yàn)樗窃诒M量不損失信息量的情況下,對(duì)原始數(shù)據(jù)的另一種表達(dá)。結(jié)合神經(jīng)網(wǎng)絡(luò)的慣例,我們?cè)賹⒆跃幋a器的公式表示如下:(假設(shè)激活函數(shù)是sigmoid,用s表示)
y=fθ(x)=s(Wx+b)
=gθ′(y)=s(W′y+b′)
L(x,)=L(x,g(f(x)))
其中,L表示損失函數(shù),結(jié)合數(shù)據(jù)的不同形式,可以是二次誤差(squared error loss)或交叉熵誤差(cross entropy loss)。如果,一般稱為tied weights。
為了盡量學(xué)到有意義的表達(dá),我們會(huì)給隱層加入一定的約束。從數(shù)據(jù)維度來看,常見以下兩種情況:
- n>p,即隱層維度小于輸入數(shù)據(jù)維度。也就是說從x→h的變換是一種降維的操作,網(wǎng)絡(luò)試圖以更小的維度去描述原始數(shù)據(jù)而盡量不損失數(shù)據(jù)信息。實(shí)際上,當(dāng)每?jī)蓪又g的變換均為線性,且監(jiān)督訓(xùn)練的誤差是二次型誤差時(shí),該網(wǎng)絡(luò)等價(jià)于PCA!沒反應(yīng)過來的童鞋可以反思下PCA是在做什么事情。
- n<p,即隱層維度大于輸入數(shù)據(jù)維度。這又有什么用呢?其實(shí)不好說,但比如我們同時(shí)約束h的表達(dá)盡量稀疏(有大量維度為0,未被激活),此時(shí)的編碼器便是大名鼎鼎的“稀疏自編碼器”。可為什么稀疏的表達(dá)就是好的?這就說來話長(zhǎng)了,有人試圖從人腦機(jī)理對(duì)比,即人類神經(jīng)系統(tǒng)在某一刺激下,大部分神經(jīng)元是被抑制的。個(gè)人覺得,從特征的角度來看更直觀些,稀疏的表達(dá)意味著系統(tǒng)在嘗試去特征選擇,找出大量維度中真正重要的若干維。
堆疊自編碼器
有過深度學(xué)習(xí)基礎(chǔ)的童鞋想必了解,深層網(wǎng)絡(luò)的威力在于其能夠逐層地學(xué)習(xí)原始數(shù)據(jù)的多種表達(dá)。每一層的都以底一層的表達(dá)為基礎(chǔ),但往往更抽象,更加適合復(fù)雜的分類等任務(wù)。
堆疊自編碼器實(shí)際上就在做這樣的事情,如前所述,單個(gè)自編碼器通過虛構(gòu)x→h→x的三層網(wǎng)絡(luò),能夠?qū)W習(xí)出一種特征變化h=fθ(x)(這里用θ表示變換的參數(shù),包括W,b和激活函數(shù))。實(shí)際上,當(dāng)訓(xùn)練結(jié)束后,輸出層已經(jīng)沒什么意義了,我們一般將其去掉,即將自編碼器表示為
之前之所以將自編碼器模型表示為3層的神經(jīng)網(wǎng)絡(luò),那是因?yàn)橛?xùn)練的需要,我們將原始數(shù)據(jù)作為假想的目標(biāo)輸出,以此構(gòu)建監(jiān)督誤差來訓(xùn)練整個(gè)網(wǎng)絡(luò)。等訓(xùn)練結(jié)束后,輸出層就可以去掉了,我們關(guān)心的只是從x到h的變換。
接下來的思路就很自然了——我們已經(jīng)得到特征表達(dá)h,那么我們可不可以將
h再當(dāng)做原始信息,訓(xùn)練一個(gè)新的自編碼器,得到新的特征表達(dá)呢?當(dāng)然可以!這就是所謂的堆疊自編碼器(Stacked Auto-Encoder, SAE)。Stacked就是逐層壘疊的意思,跟“?!庇悬c(diǎn)像。UFLDL教程將其翻譯為“棧式自編碼”,anyway,不管怎么稱呼,都是這個(gè)東東,別被花里胡哨的專業(yè)術(shù)語(yǔ)嚇到就行。當(dāng)把多個(gè)自編碼器Stack起來之后,這個(gè)系統(tǒng)看起來就像這樣:
亦可賽艇!這個(gè)系統(tǒng)實(shí)際上已經(jīng)有點(diǎn)深度學(xué)習(xí)的味道了,即learning multiple levels of representation and abstraction(Hinton, Bengio, LeCun, 2015)。需要注意的是,整個(gè)網(wǎng)絡(luò)的訓(xùn)練不是一蹴而就的,而是逐層進(jìn)行。按題主提到的結(jié)構(gòu)n,m,k結(jié)構(gòu),實(shí)際上我們是先訓(xùn)練網(wǎng)絡(luò)n→m→n,得到n→m的變換,然后再訓(xùn)練m→k→m,得到m→k的變換。最終堆疊成SAE,即為n→m→k的結(jié)果,整個(gè)過程就像一層層往上蓋房子,這便是大名鼎鼎的layer-wise unsuperwised pre-training(逐層非監(jiān)督預(yù)訓(xùn)練),正是導(dǎo)致深度學(xué)習(xí)(神經(jīng)網(wǎng)絡(luò))在2006年第3次興起的核心技術(shù)。
關(guān)于逐層預(yù)訓(xùn)練與深度學(xué)習(xí),將在本文最后探討。
自編碼器的變種形式
上述介紹的自編碼器是最基本的形式。善于思考的童鞋可能已經(jīng)意識(shí)到了這個(gè)問題:隱層的維度到底怎么確定?為什么稀疏的特征比較好?或者更準(zhǔn)確的說,怎么才能稱得上是一個(gè)好的表達(dá)(What defines a good representation)?
事實(shí)上,這個(gè)問題回答并不唯一,也正是從不同的角度去思考這個(gè)問題,導(dǎo)致了自編碼器的各種變種形式出現(xiàn)。目前常見的幾種模型總結(jié)如下(有些術(shù)語(yǔ)實(shí)在不好翻譯,看英文就好。。。)
下面簡(jiǎn)介下其中兩種模型,以對(duì)這些變種模型有個(gè)直觀感受。
稀疏自編碼器
UFLDL-自編碼算法與稀疏性對(duì)該模型有著比較詳細(xì)的介紹。如前所示,這種模型背后的思想是,高維而稀疏的表達(dá)是好的。一般而言,我們不會(huì)指定隱層表達(dá)h中哪些節(jié)點(diǎn)是被抑制的(對(duì)于sigmoid單元即輸出為0),而是指定一個(gè)稀疏性參數(shù)ρ,代表隱藏神經(jīng)元的平均活躍程度(在訓(xùn)練集上取平均)。比如,當(dāng)ρ=0.05時(shí),可以認(rèn)為隱層節(jié)點(diǎn)在95%的時(shí)間里都是被一直的,只有5%的機(jī)會(huì)被激活。實(shí)際上,為了滿足這一條件,隱層神經(jīng)元的活躍度需要接近于0。
那么,怎么從數(shù)學(xué)模型上做到這點(diǎn)呢?思路也不復(fù)雜,既然要求平均激活度為ρ,那么只要引入一個(gè)度量,來衡量神經(jīng)元ii的實(shí)際激活度與期望激活度ρ之間的差異即可,然后將這個(gè)度量添加到目標(biāo)函數(shù)作為正則,訓(xùn)練整個(gè)網(wǎng)絡(luò)即可。那么,什么樣的度量適合這個(gè)任務(wù)呢?有過概率論、信息論基礎(chǔ)的同學(xué)應(yīng)該很容易想到它——相對(duì)熵,也就是KL散度(KL divergence)。因此,整個(gè)網(wǎng)絡(luò)所添加的懲罰項(xiàng)即為
具體的公式不再展開,可以從下圖(摘自UFLDL)中直觀理解KL散度作為懲罰項(xiàng)的含義。圖中假設(shè)平均激活度ρ=0.2。
可以看出,當(dāng)^ρiρ^i一旦偏離期望激活度ρρ,這種誤差便急劇增大,從而作為懲罰項(xiàng)添加到目標(biāo)函數(shù),指導(dǎo)整個(gè)網(wǎng)絡(luò)學(xué)習(xí)出稀疏的特征表達(dá)。
降噪自編碼器
關(guān)于降噪自編碼器,強(qiáng)烈推薦其作者Pascal Vincent的論文Stacked Denoising Autoencoders: Learning Useful Representations in a Deep Network with a Local Denoising Criterion。DAE的核心思想是,一個(gè)能夠從中恢復(fù)出原始信號(hào)的表達(dá)未必是最好的,能夠?qū)Α氨晃廴?破壞”的原始數(shù)據(jù)編碼、解碼,然后還能恢復(fù)真正的原始數(shù)據(jù),這樣的特征才是好的。
稍微數(shù)學(xué)一點(diǎn),假設(shè)原始數(shù)據(jù)x被我們“故意破壞”,比如加入高斯白噪,或者把某些維度數(shù)據(jù)抹掉,變成了,然后再對(duì)編碼、解碼,得到恢復(fù)信號(hào),該恢復(fù)信號(hào)盡可能逼近未被污染的數(shù)據(jù)xx。此時(shí),監(jiān)督訓(xùn)練的誤差從L(x,g(f(x)))變成了L(x,g(f()))。
直觀上理解,DAE希望學(xué)到的特征變換盡可能魯棒,能夠在一定程度上對(duì)抗原始數(shù)據(jù)的污染、缺失。Vincent論文里也對(duì)DAE提出了基于流行的解釋,并且在圖像數(shù)據(jù)上進(jìn)行測(cè)試,發(fā)現(xiàn)DAE能夠?qū)W出類似Gabor邊緣提取的特征變換。注意,這一切都是在我們定義好規(guī)則、誤差后,系統(tǒng)自動(dòng)學(xué)出來的!從而避免了領(lǐng)域?qū)<屹M(fèi)盡心力去設(shè)計(jì)這些性能良好的特征。
DAE的系統(tǒng)結(jié)構(gòu)如下圖(摘自Vincent論文)所示。
現(xiàn)在使用比較多的noise主要是mask noise,即原始數(shù)據(jù)中部分?jǐn)?shù)據(jù)缺失,這是有著很強(qiáng)的實(shí)際意義的,比如圖像部分像素被遮擋、文本因記錄原因漏掉了一些單詞等等。
其他的模型就不再展開了,總之,每遇到一個(gè)自編碼器的一個(gè)變種模型時(shí),搞清楚其背后的思想(什么樣的表達(dá)才是好的),就很容易掌握了。套用V的”Behind this mask is a man, and behind this man is an idea, and ideas are bulletproof”,我們可以說,”Behind this auto-encoder is a model, and behind this model is an idea, and ideas are bulletproof”。
關(guān)于預(yù)訓(xùn)練與深度學(xué)習(xí)
深度學(xué)習(xí)第3次興起正式因?yàn)橹饘宇A(yù)訓(xùn)練方法的提出,使得深度網(wǎng)絡(luò)的訓(xùn)練成為可能。對(duì)于一個(gè)深度網(wǎng)絡(luò),這種逐層預(yù)訓(xùn)練的方法,正是前面介紹的這種Stacked Auto-Encoder。對(duì)于常見的分類任務(wù),一般分為以下兩個(gè)階段:
- layer-wise pre-training (逐層預(yù)訓(xùn)練)
- fune-tuning (微調(diào))
注意到,前述的各種SAE,本質(zhì)上都是非監(jiān)督學(xué)習(xí),SAE各層的輸出都是原始數(shù)據(jù)的不同表達(dá)。對(duì)于分類任務(wù),往往在SAE頂端再添加一分類層(如Softmax層),并結(jié)合有標(biāo)注的訓(xùn)練數(shù)據(jù),在誤差函數(shù)的指導(dǎo)下,對(duì)系統(tǒng)的參數(shù)進(jìn)行微調(diào),以使得整個(gè)網(wǎng)絡(luò)能夠完成所需的分類任務(wù)。
對(duì)于微調(diào)過程,即可以只調(diào)整分類層的參數(shù)(此時(shí)相當(dāng)于把整個(gè)SAE當(dāng)做一個(gè)feature extractor),也可以調(diào)整整個(gè)網(wǎng)絡(luò)的參數(shù)(適合訓(xùn)練數(shù)據(jù)量比較大的情況)。
題主提到,為什么訓(xùn)練稀疏自編碼器為什么一般都是3層的結(jié)構(gòu),實(shí)際上這里的3層是指訓(xùn)練單個(gè)自編碼器所假想的3層神經(jīng)網(wǎng)絡(luò),這對(duì)任何基于神經(jīng)網(wǎng)絡(luò)的編碼器都是如此。多層的稀疏自編碼器自然是有的,只不過是通過layer-wise pre-training這種方式逐層壘疊起來的,而不是直接去訓(xùn)練一個(gè)5層或是更多層的網(wǎng)絡(luò)。
為什么要這樣?實(shí)際上,這正是在訓(xùn)練深層神經(jīng)網(wǎng)絡(luò)中遇到的問題。直接去訓(xùn)練一個(gè)深層的自編碼器,其實(shí)本質(zhì)上就是在做深度網(wǎng)絡(luò)的訓(xùn)練,由于梯度擴(kuò)散等問題,這樣的網(wǎng)絡(luò)往往根本無法訓(xùn)練。這倒不是因?yàn)闀?huì)破壞稀疏性等原因,只要網(wǎng)絡(luò)能夠訓(xùn)練,對(duì)模型施加的約束總能得到相應(yīng)的結(jié)果。
但為什么逐層預(yù)訓(xùn)練就可以使得深度網(wǎng)絡(luò)的訓(xùn)練成為可能了呢?有不少文章也做過這方面的研究。一個(gè)直觀的解釋是,預(yù)訓(xùn)練好的網(wǎng)絡(luò)在一定程度上擬合了訓(xùn)練數(shù)據(jù)的結(jié)構(gòu),這使得整個(gè)網(wǎng)絡(luò)的初始值是在一個(gè)合適的狀態(tài),便于有監(jiān)督階段加快迭代收斂。
筆者曾經(jīng)基于 MNIST數(shù)據(jù)集,嘗試了一個(gè)9層的網(wǎng)絡(luò)完成分類任務(wù)。當(dāng)隨機(jī)初始化時(shí),誤差傳到底層幾乎全為0,根本無法訓(xùn)練。但采用逐層預(yù)訓(xùn)練的方法,訓(xùn)練好每?jī)蓪又g的自編碼變換,將其參數(shù)作為系統(tǒng)初始值,然后網(wǎng)絡(luò)在有監(jiān)督階段就能比較穩(wěn)定的迭代了。
當(dāng)然,有不少研究提出了很好的初始化策略,再加上現(xiàn)在常用的dropout、ReLU,直接去訓(xùn)練一個(gè)深層網(wǎng)絡(luò)已經(jīng)不是問題。這是否意味著這種逐層預(yù)訓(xùn)練的方式已經(jīng)過時(shí)了呢?這里,我想采用下Bengio先生2015年的一段話作為回答:
Stacks of unsupervised feature learning layers are STILL useful when you are in a regime with insufficient labeled examples, for transfer learning or domain adaptation. It is a regularizer. But when the number of labeled examples becomes large enough, the advantage of that regularizer becomes much less. I suspect however that this story is far from ended! There are other ways besides pre-training of combining supervised and unsupervised learning, and I believe that we still have a lot to improve in terms of our unsupervised learning algorithms.
最后,多說一句,除了AE和SAE這種逐層預(yù)訓(xùn)練的方式外,還有另外一條類似的主線,即限制玻爾茲曼機(jī)(RBM)與深度信念網(wǎng)絡(luò)(DBN)。這些模型在神經(jīng)網(wǎng)絡(luò)/深度學(xué)習(xí)框架中的位置,可以簡(jiǎn)要總結(jié)為下圖。
訂正:感謝@Detective 夏恩指正,RBM堆疊起來是Deep Boltzmann Machines, 再加一個(gè)分類器才是DBN,供閱讀上圖時(shí)參考。
相關(guān)學(xué)習(xí)資料推薦
- Hinton, G.E. and R.R. Salakhutdinov, Reducing the dimensionality of data with neural networks. Science, 2006. 313(5786): p. 504-507.
- Learning multiple layers of representation. Trends in cognitive sciences, 2007. 11(10): p. 428-434.
- Vincent, P., et al. Extracting and composing robust features with denoising autoencoders. in Proceedings of the 25th international conference on Machine learning. 2008.
- Bengio, Y., Learning deep architectures for AI. Foundations and trends? in Machine Learning, 2009. 2(1): p. 1-127.
- Vincent, P., et al., Stacked Denoising Autoencoders: Learning Useful Representations in a Deep Network with a Local Denoising Criterion. Journal of Machine Learning Research, 2010. 11(6): p.3371-3408.
- Rifai, S., et al., Contractive Auto-Encoders: Explicit Invariance During Feature Extraction. Icml, 2011.
- Chen, M., et al., Marginalized denoising autoencoders for domain adaptation. arXiv preprint arXiv:1206.4683, 2012.
- Bengio, Y., A. Courville and P. Vincent, Representation learning: A review and new perspectives. Pattern Analysis and Machine Intelligence, IEEE Transactions on, 2013. 35(8): p.?1798-1828.
- LeCun, Y., Y. Bengio and G. Hinton, Deep learning. Nature, 2015. 521(7553): p. 436-444.
【非常高興看到大家喜歡并贊同我們的回答。應(yīng)許多知友的建議,最近我們開通了同名公眾號(hào):PhDer,也會(huì)定期更新我們的文章,如果您不想錯(cuò)過我們的每篇回答,歡迎掃碼關(guān)注~ 】
http://weixin.qq.com/r/5zsuNoHEZdwarcVV9271?(二維碼自動(dòng)識(shí)別)
編輯于 2016-05-31?22 條評(píng)論?感謝? 分享 ?收藏???沒有幫助???舉報(bào)???作者保留權(quán)利 5贊同 反對(duì),不會(huì)顯示你的姓名 水滴 5?人贊同 Ivan Goodfellow, Yoshua Bengio, Aaron Courville的Deep Learning中14.3節(jié)描述了深度自編碼器像其他深度神經(jīng)網(wǎng)絡(luò)一樣能夠指數(shù)級(jí)減少訓(xùn)練數(shù)據(jù)和計(jì)算資源需求。在實(shí)踐中,深度自編碼器比淺層自編碼器有更好的壓縮性能。我們之所以很少看到深度自編碼器,是因?yàn)橐话阌?xùn)練深度自編碼器的方法是采取貪心策略,逐層訓(xùn)練淺層自編碼器。
from:?https://www.zhihu.com/question/41490383#answer-36659160
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的为什么稀疏自编码器很少见到多层的?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: github上可供新手阅读和玩耍的jav
- 下一篇: 简单提升编译速度的一个方法