1. 程式人生 > >深度學習的自編碼

深度學習的自編碼

Deep Learning的常用模型或者方法

1、AutoEncoder自動編碼器

        Deep Learning最簡單的一種方法是利用人工神經網路的特點,人工神經網路(ANN)本身就是具有層次結構的系統,如果給定一個神經網路,我們假設其輸出與輸入是相同的,然後訓練調整其引數,得到每一層中的權重。自然地,我們就得到了輸入I的幾種不同表示(每一層代表一種表示),這些表示就是特徵。自動編碼器就是一種儘可能復現輸入訊號的神經網路。為了實現這種復現,自動編碼器就必須捕捉可以代表輸入資料的最重要的因素,就像PCA那樣,找到可以代表原資訊的主要成分。

       具體過程簡單的說明如下:

1)給定無標籤資料,用非監督學習學習特徵:

 

       在我們之前的神經網路中,如第一個圖,我們輸入的樣本是有標籤的,即(input, target),這樣我們根據當前輸出和target(label)之間的差去改變前面各層的引數,直到收斂。但現在我們只有無標籤資料,也就是右邊的圖。那麼這個誤差怎麼得到呢?

        如上圖,我們將input輸入一個encoder編碼器,就會得到一個code,這個code也就是輸入的一個表示,那麼我們怎麼知道這個code表示的就是input呢?我們加一個decoder解碼器,這時候decoder就會輸出一個資訊,那麼如果輸出的這個資訊和一開始的輸入訊號input是很像的(理想情況下就是一樣的),那很明顯,我們就有理由相信這個code是靠譜的。所以,我們就通過調整encoder和decoder的引數,使得重構誤差最小,這時候我們就得到了輸入input訊號的第一個表示了,也就是編碼code了。因為是無標籤資料,所以誤差的來源就是直接重構後與原輸入相比得到。

2)通過編碼器產生特徵,然後訓練下一層。這樣逐層訓練:

       那上面我們就得到第一層的code,我們的重構誤差最小讓我們相信這個code就是原輸入訊號的良好表達了,或者牽強點說,它和原訊號是一模一樣的(表達不一樣,反映的是一個東西)。那第二層和第一層的訓練方式就沒有差別了,我們將第一層輸出的code當成第二層的輸入訊號,同樣最小化重構誤差,就會得到第二層的引數,並且得到第二層輸入的code,也就是原輸入資訊的第二個表達了。其他層就同樣的方法炮製就行了(訓練這一層,前面層的引數都是固定的,並且他們的decoder已經沒用了,都不需要了)。

3)有監督微調:

      經過上面的方法,我們就可以得到很多層了。至於需要多少層(或者深度需要多少,這個目前本身就沒有一個科學的評價方法)需要自己試驗調了。每一層都會得到原始輸入的不同的表達。當然了,我們覺得它是越抽象越好了,就像人的視覺系統一樣。

       到這裡,這個AutoEncoder還不能用來分類資料,因為它還沒有學習如何去連結一個輸入和一個類。它只是學會了如何去重構或者復現它的輸入而已。或者說,它只是學習獲得了一個可以良好代表輸入的特徵,這個特徵可以最大程度上代表原輸入訊號。那麼,為了實現分類,我們就可以在AutoEncoder的最頂的編碼層新增一個分類器(例如羅傑斯特迴歸、SVM等),然後通過標準的多層神經網路的監督訓練方法(梯度下降法)去訓練。

        也就是說,這時候,我們需要將最後層的特徵code輸入到最後的分類器,通過有標籤樣本,通過監督學習進行微調,這也分兩種,一個是隻調整分類器(黑色部分):

       另一種:通過有標籤樣本,微調整個系統:(如果有足夠多的資料,這個是最好的。end-to-end learning端對端學習)

       一旦監督訓練完成,這個網路就可以用來分類了。神經網路的最頂層可以作為一個線性分類器,然後我們可以用一個更好效能的分類器去取代它。

       在研究中可以發現,如果在原有的特徵中加入這些自動學習得到的特徵可以大大提高精確度,甚至在分類問題中比目前最好的分類演算法效果還要好!

        AutoEncoder存在一些變體,這裡簡要介紹下兩個:

Sparse AutoEncoder稀疏自動編碼器:

      當然,我們還可以繼續加上一些約束條件得到新的Deep Learning方法,如:如果在AutoEncoder的基礎上加上L1的Regularity限制(L1主要是約束每一層中的節點中大部分都要為0,只有少數不為0,這就是Sparse名字的來源),我們就可以得到Sparse AutoEncoder法。

       如上圖,其實就是限制每次得到的表達code儘量稀疏。因為稀疏的表達往往比其他的表達要有效(人腦好像也是這樣的,某個輸入只是刺激某些神經元,其他的大部分的神經元是受到抑制的)。

Denoising AutoEncoders降噪自動編碼器:

        降噪自動編碼器DA是在自動編碼器的基礎上,訓練資料加入噪聲,所以自動編碼器必須學習去去除這種噪聲而獲得真正的沒有被噪聲汙染過的輸入。因此,這就迫使編碼器去學習輸入訊號的更加魯棒的表達,這也是它的泛化能力比一般編碼器強的原因。DA可以通過梯度下降演算法去訓練。

2、Sparse Coding稀疏編碼

       如果我們把輸出必須和輸入相等的限制放鬆,同時利用線性代數中基的概念,即O = a11 + a22+….+ ann, Φi是基,ai是係數,我們可以得到這樣一個優化問題:

Min |I – O|,其中I表示輸入,O表示輸出。

       通過求解這個最優化式子,我們可以求得係數ai和基Φi,這些係數和基就是輸入的另外一種近似表達。

       因此,它們可以用來表達輸入I,這個過程也是自動學習得到的。如果我們在上述式子上加上L1的Regularity限制,得到:

Min |I – O| + u*(|a1| + |a2| + … + |an |)

        這種方法被稱為Sparse Coding。通俗的說,就是將一個訊號表示為一組基的線性組合,而且要求只需要較少的幾個基就可以將訊號表示出來。“稀疏性”定義為:只有很少的幾個非零元素或只有很少的幾個遠大於零的元素。要求係數 ai 是稀疏的意思就是說:對於一組輸入向量,我們只想有儘可能少的幾個係數遠大於零。選擇使用具有稀疏性的分量來表示我們的輸入資料是有原因的,因為絕大多數的感官資料,比如自然影象,可以被表示成少量基本元素的疊加,在影象中這些基本元素可以是面或者線。同時,比如與初級視覺皮層的類比過程也因此得到了提升(人腦有大量的神經元,但對於某些影象或者邊緣只有很少的神經元興奮,其他都處於抑制狀態)。

         稀疏編碼演算法是一種無監督學習方法,它用來尋找一組“超完備”基向量來更高效地表示樣本資料。雖然形如主成分分析技術(PCA)能使我們方便地找到一組“完備”基向量,但是這裡我們想要做的是找到一組“超完備”基向量來表示輸入向量(也就是說,基向量的個數比輸入向量的維數要大)。超完備基的好處是它們能更有效地找出隱含在輸入資料內部的結構與模式。然而,對於超完備基來說,係數ai不再由輸入向量唯一確定。因此,在稀疏編碼演算法中,我們另加了一個評判標準“稀疏性”來解決因超完備而導致的退化(degeneracy)問題。(詳細過程請參考:UFLDL Tutorial稀疏編碼

       比如在影象的Feature Extraction的最底層要做Edge Detector的生成,那麼這裡的工作就是從Natural Images中randomly選取一些小patch,通過這些patch生成能夠描述他們的“基”,也就是右邊的8*8=64個basis組成的basis,然後給定一個test patch, 我們可以按照上面的式子通過basis的線性組合得到,而sparse matrix就是a,下圖中的a中有64個維度,其中非零項只有3個,故稱“sparse”。

       這裡可能大家會有疑問,為什麼把底層作為Edge Detector呢?上層又是什麼呢?這裡做個簡單解釋大家就會明白,之所以是Edge Detector是因為不同方向的Edge就能夠描述出整幅影象,所以不同方向的Edge自然就是影象的basis了……而上一層的basis組合的結果,上上層又是上一層的組合basis……(就是上面第四部分的時候咱們說的那樣)

       Sparse coding分為兩個部分:

1)Training階段:給定一系列的樣本圖片[x1, x 2, …],我們需要學習得到一組基[Φ1, Φ2, …],也就是字典。

       稀疏編碼是k-means演算法的變體,其訓練過程也差不多(EM演算法的思想:如果要優化的目標函式包含兩個變數,如L(W, B),那麼我們可以先固定W,調整B使得L最小,然後再固定B,調整W使L最小,這樣迭代交替,不斷將L推向最小值。EM演算法可以見我的部落格:“從最大似然到EM演算法淺解”)。

       訓練過程就是一個重複迭代的過程,按上面所說,我們交替的更改a和Φ使得下面這個目標函式最小。

      每次迭代分兩步:

a)固定字典Φ[k],然後調整a[k],使得上式,即目標函式最小(即解LASSO問題)。

b)然後固定住a [k],調整Φ [k],使得上式,即目標函式最小(即解凸QP問題)。

      不斷迭代,直至收斂。這樣就可以得到一組可以良好表示這一系列x的基,也就是字典。

2)Coding階段:給定一個新的圖片x,由上面得到的字典,通過解一個LASSO問題得到稀疏向量a。這個稀疏向量就是這個輸入向量x的一個稀疏表達了。

例如:

3、Restricted Boltzmann Machine (RBM)限制波爾茲曼機

       假設有一個二部圖,每一層的節點之間沒有連結,一層是可視層,即輸入資料層(v),一層是隱藏層(h),如果假設所有的節點都是隨機二值變數節點(只能取0或者1值),同時假設全概率分佈p(v,h)滿足Boltzmann 分佈,我們稱這個模型是Restricted BoltzmannMachine (RBM)。

       下面我們來看看為什麼它是Deep Learning方法。首先,這個模型因為是二部圖,所以在已知v的情況下,所有的隱藏節點之間是條件獨立的(因為節點之間不存在連線),即p(h|v)=p(h1|v)…p(hn|v)。同理,在已知隱藏層h的情況下,所有的可視節點都是條件獨立的。同時又由於所有的v和h滿足Boltzmann 分佈,因此,當輸入v的時候,通過p(h|v) 可以得到隱藏層h,而得到隱藏層h之後,通過p(v|h)又能得到可視層,通過調整引數,我們就是要使得從隱藏層得到的可視層v1與原來的可視層v如果一樣,那麼得到的隱藏層就是可視層另外一種表達,因此隱藏層可以作為可視層輸入資料的特徵,所以它就是一種Deep Learning方法。

       如何訓練呢?也就是可視層節點和隱節點間的權值怎麼確定呢?我們需要做一些數學分析。也就是模型了。

        聯合組態(jointconfiguration)的能量可以表示為:

        而某個組態的聯合概率分佈可以通過Boltzmann 分佈(和這個組態的能量)來確定:

      因為隱藏節點之間是條件獨立的(因為節點之間不存在連線),即:

      然後我們可以比較容易(對上式進行因子分解Factorizes)得到在給定可視層v的基礎上,隱層第j個節點為1或者為0的概率:

       同理,在給定隱層h的基礎上,可視層第i個節點為1或者為0的概率也可以容易得到:

       給定一個滿足獨立同分布的樣本集:D={v(1), v(2),…, v(N)},我們需要學習引數θ={W,a,b}。

       我們最大化以下對數似然函式(最大似然估計:對於某個概率模型,我們需要選擇一個引數,讓我們當前的觀測樣本的概率最大):

        也就是對最大對數似然函式求導,就可以得到L最大時對應的引數W了。

       如果,我們把隱藏層的層數增加,我們可以得到Deep Boltzmann Machine(DBM);如果我們在靠近可視層的部分使用貝葉斯信念網路(即有向圖模型,當然這裡依然限制層中節點之間沒有連結),而在最遠離可視層的部分使用Restricted Boltzmann Machine,我們可以得到DeepBelief Net(DBN)。


4、Deep Belief Networks深信度網路

        DBNs是一個概率生成模型,與傳統的判別模型的神經網路相對,生成模型是建立一個觀察資料和標籤之間的聯合分佈,對P(Observation|Label)和 P(Label|Observation)都做了評估,而判別模型僅僅而已評估了後者,也就是P(Label|Observation)。對於在深度神經網路應用傳統的BP演算法的時候,DBNs遇到了以下問題:

(1)需要為訓練提供一個有標籤的樣本集;

(2)學習過程較慢;

(3)不適當的引數選擇會導致學習收斂於區域性最優解。

       DBNs由多個限制玻爾茲曼機(Restricted Boltzmann Machines)層組成,一個典型的神經網路型別如圖三所示。這些網路被“限制”為一個可視層和一個隱層,層間存在連線,但層內的單元間不存在連線。隱層單元被訓練去捕捉在可視層表現出來的高階資料的相關性。

       首先,先不考慮最頂構成一個聯想記憶(associative memory)的兩層,一個DBN的連線是通過自頂向下的生成權值來指導確定的,RBMs就像一個建築塊一樣,相比傳統和深度分層的sigmoid信念網路,它能易於連線權值的學習。

       最開始的時候,通過一個非監督貪婪逐層方法去預訓練獲得生成模型的權值,非監督貪婪逐層方法被Hinton證明是有效的,並被其稱為對比分歧(contrastive divergence)。

       在這個訓練階段,在可視層會產生一個向量v,通過它將值傳遞到隱層。反過來,可視層的輸入會被隨機的選擇,以嘗試去重構原始的輸入訊號。最後,這些新的可視的神經元啟用單元將前向傳遞重構隱層啟用單元,獲得h(在訓練過程中,首先將可視向量值對映給隱單元;然後可視單元由隱層單元重建;這些新可視單元再次對映給隱單元,這樣就獲取新的隱單元。執行這種反覆步驟叫做吉布斯取樣)。這些後退和前進的步驟就是我們熟悉的Gibbs取樣,而隱層啟用單元和可視層輸入之間的相關性差別就作為權值更新的主要依據。

       訓練時間會顯著的減少,因為只需要單個步驟就可以接近最大似然學習。增加進網路的每一層都會改進訓練資料的對數概率,我們可以理解為越來越接近能量的真實表達。這個有意義的拓展,和無標籤資料的使用,是任何一個深度學習應用的決定性的因素。

       在最高兩層,權值被連線到一起,這樣更低層的輸出將會提供一個參考的線索或者關聯給頂層,這樣頂層就會將其聯絡到它的記憶內容。而我們最關心的,最後想得到的就是判別效能,例如分類任務裡面。

       在預訓練後,DBN可以通過利用帶標籤資料用BP演算法去對判別效能做調整。在這裡,一個標籤集將被附加到頂層(推廣聯想記憶),通過一個自下向上的,學習到的識別權值獲得一個網路的分類面。這個效能會比單純的BP演算法訓練的網路好。這可以很直觀的解釋,DBNs的BP演算法只需要對權值引數空間進行一個區域性的搜尋,這相比前向神經網路來說,訓練是要快的,而且收斂的時間也少。

       DBNs的靈活性使得它的拓展比較容易。一個拓展就是卷積DBNs(Convolutional Deep Belief Networks(CDBNs))。DBNs並沒有考慮到影象的2維結構資訊,因為輸入是簡單的從一個影象矩陣一維向量化的。而CDBNs就是考慮到了這個問題,它利用鄰域畫素的空域關係,通過一個稱為卷積RBMs的模型區達到生成模型的變換不變性,而且可以容易得變換到高維影象。DBNs並沒有明確地處理對觀察變數的時間聯絡的學習上,雖然目前已經有這方面的研究,例如堆疊時間RBMs,以此為推廣,有序列學習的dubbed temporal convolutionmachines,這種序列學習的應用,給語音訊號處理問題帶來了一個讓人激動的未來研究方向。

       目前,和DBNs有關的研究包括堆疊自動編碼器,它是通過用堆疊自動編碼器來替換傳統DBNs裡面的RBMs。這就使得可以通過同樣的規則來訓練產生深度多層神經網路架構,但它缺少層的引數化的嚴格要求。與DBNs不同,自動編碼器使用判別模型,這樣這個結構就很難取樣輸入取樣空間,這就使得網路更難捕捉它的內部表達。但是,降噪自動編碼器卻能很好的避免這個問題,並且比傳統的DBNs更優。它通過在訓練過程新增隨機的汙染並堆疊產生場泛化效能。訓練單一的降噪自動編碼器的過程和RBMs訓練生成模型的過程一樣。



相關推薦

深度學習之卷積編碼

一、自編碼器 自編碼器(Autoencoder)是一種旨在將它們的輸入複製到的輸出的神經網路。他們通過將輸入壓縮成一種隱藏空間表示(latent-space representation),然後這種重構這種表示的輸出進行工作。這種網路由兩部分組成,如下圖: 編碼器:將輸入壓縮為潛在空間

[深度學習]半監督學習、無監督學習之Autoencoders編碼器(附程式碼)

目錄   自編碼器介紹 從零開始訓練自編碼器 驗證模型訓練結果 視覺化結果 載入預訓練模型 自編碼器介紹 自編碼器的結構簡單,由Encoder和Decoder組成,Encoder產生的Latent variables是潛在變數,它是Decoder的輸入。

理解深度學習:與神經網路相似的網路-編碼器(上)

歡迎訪問Oldpan部落格,分享人工智慧有趣訊息,持續醞釀深度學習質量文。 自編碼器是什麼,自編碼器是個神奇的東西,可以提取資料中的深層次的特徵。例如我們輸入影象,自編碼器可以將這個影象上“人臉”的特徵進行提取(編碼過程),這個特徵就儲存為自編碼器的潛變數,例如這張人

[Keras深度學習淺嘗]實戰五·使用DNN編碼器實現聚類操作資料降維

[Keras深度學習淺嘗]實戰五·使用DNN自編碼器實現聚類操作資料降維 程式碼部分 # TensorFlow and tf.keras import tensorflow as tf from tensorflow import keras # Helper libraries

[深度學習]半監督學習、無監督學習之Variational Auto-Encoder變分編碼器(附程式碼)

論文全稱:《Auto-Encoding Variational Bayes》 論文地址:https://arxiv.org/pdf/1312.6114.pdf 論文程式碼: keras 版本:https://github.com/bojone/vae pytorch 版本:https

深度學習,如何用去噪編碼器預測原始資料?

去噪自編碼器(denoising autoencoder, DAE)是一類接受損壞資料作為輸入,並訓練來預測原始未被損壞資料作為輸出的自編碼器。 去噪自編碼器代價函式的計算圖。去噪自編碼器被訓練為從損壞的版本~x 重構乾淨資料點x。這可以通過最小化損失L = -log pd

深度學習編碼器AutoEncoder

一、什麼是自編碼器(Autoencoder) 自動編碼器是一種資料的壓縮演算法,其中資料的壓縮和解壓縮函式是資料相關的、有損的、從樣本中自動學習的。在大部分提到自動編碼器的場合,壓縮和解壓縮的函式是通過神經網路實現的。 1)自動編碼器是資料相關的(data-specifi

MATLAB 深度學習編碼(含MATLAB)

本節將研究深度學習網路權值設計的重要思想之一:自編碼思想,在正式介紹之前先以一個簡單的介紹一篇,一層隱含層網路的自編碼學習問題。 那麼這種網路有什麼實際應用呢?自動編碼器(Autoencoder)是當前深度學習研究的熱點之一,有很多重要的應用領域,這裡僅舉一個有趣的例

深度學習編碼

前言 看完神經網路及BP演算法介紹後,這裡做一個小實驗,內容是來自斯坦福UFLDL教程,實現影象的壓縮表示,模型是用神經網路模型,訓練方法是BP後向傳播演算法。 理論        在有監督學習中,訓練樣本是具有標籤的,一般神經網路是有監督的學習方法。我們這裡要講的是自

Deep Learning(深度學習學習筆記整理系列(概括的很好)----之四(編碼

Deep Learning(深度學習)學習筆記整理系列 作者:Zouxy version 1.0 2013-04-08 宣告: 1)該Deep Learning的學習系列是整理自網上很大牛和機器學習專家所無私奉獻的資料的。具體引用的資料請看參考文獻。具體的版

深度學習入門教程UFLDL學習實驗筆記一:稀疏編碼

UFLDL即(unsupervised feature learning & deep learning)。這是斯坦福網站上的一篇經典教程。顧名思義,你將在這篇這篇文章中學習到無監督特徵學習和深度學習的主要觀點。 UFLDL全文出處在這:http://ufldl.stanford.edu/wiki/

深度學習入門教程UFLDL學習實驗筆記二:使用向量化對MNIST資料集做稀疏編碼

今天來做UFLDL的第二個實驗,向量化。我們都知道,在matlab裡面基本上如果使用for迴圈,程式是會慢的一逼的(可以說基本就執行不下去)所以在這呢,我們需要對程式進行向量化的處理,所謂向量化就是將matlab裡面所有的for迴圈用矩陣運算的方法實現,在這裡呢,因為之前的實驗我已經是按照向量化的形式編寫的程

深度學習筆記:稀疏編碼器(1)——神經元與神經網路

  筆者在很久以前就已經學習過UFLDL深度學習教程中的稀疏自編碼器,近期需要用到的時候發現有些遺忘,溫習了一遍之後決定在這裡做一下筆記,本文不是對神經元與神經網路的介紹,而是筆者學習之後做的歸納和整理,打算分為幾篇記錄。詳細教程請見UFLDL教程,看完教程之後

ufldl 深度學習入門 第一發:基於BP網路實現稀疏編碼

目的:打算使用深度學習的方式實現人臉關鍵點的檢測,第一步是要學習深度學習。 步驟:第一步在ufldl上面學習深度學習的演算法基礎知識,然後找部落格上基於python呼叫theano庫實現人臉關鍵點檢測的演算法,看懂後基於C++實現,然後用java實現app,呼叫C++實現的

深度學習系列(七):編碼網路與PCA特徵學習的分類對比實驗

上節我們看到自編碼網路額隱含層可以用於原始資料的降維(其實也可以升維,不過把隱含層的單元設定的比輸入維度還要多),換而言之就是特徵學習,那麼學習到的這些特徵就可以用於分類了,本節主要試驗下這些特徵用於分類的效果。 先以最簡單的三層自編碼網路為例,先訓練自編碼網

深度學習系列(六):編碼網路的特徵學習

在第三節我們已經介紹了 知道了自編碼學習其實就是學習到了輸入資料的隱含特徵,通過新的特徵來表徵原始資料,本節將介紹如何使用這些隱含特徵進行模式分類; 還是以前面的三層自編碼網路: 抽象一下如下: 其中學習到的權值係數W1與W1’是不一樣的,我

深度學習編碼

Deep Learning的常用模型或者方法 1、AutoEncoder自動編碼器         Deep Learning最簡單的一種方法是利用人工神經網路的特點,人工神經網路(ANN)本身

深度學習入門 ---稀疏編碼

在學習稀疏自編碼器之前,需要讀者有BP神經網路的基礎 1. 為什麼要用稀疏自編碼器   對於沒有帶類別標籤的資料,由於為其增加類別標記是一個非常麻煩的過程,因此我們希望機器能夠自己學習到樣本中的一些重要特徵。通過對隱藏層施加一些限制,能夠使得它在惡劣

深度學習:什麼是編碼器(Autoencoder)

Autoencoderautoencoder是一種無監督的學習演算法,主要用於資料的降維或者特徵的抽取,在深度學習中,autoencoder可用於在訓練階段開始前,確定權重矩陣WW的初始值。神經網路中的權重矩陣WW可看作是對輸入的資料進行特徵轉換,即先將資料編碼為另一種形式,

深度學習系列(三):簡單網路的編碼學習

本節將研究深度學習網路權值設計的重要思想之一:自編碼思想,在正式介紹之前先以一個簡單的介紹一篇,一層隱含層網路的自編碼學習問題。 什麼是自編碼?所謂自編碼就是自己給自己編碼,再簡單點就是令輸出等於輸入自己。以一個簡單三層網路為例如下: 這裡我們假設輸出等