深度自動編碼器


深度自動編碼器由兩個對稱的深度置信網絡組成,其中一個深度置信網絡通常有四到五個淺層,構成負責編碼的部分,另一個四到五層的網絡則是解碼部分。

這些層都是受限玻爾茲曼機(RBM)(注:也可以采用自編碼器預訓練?),即構成深度置信網絡的基本單元,它們有一些特殊之處,我們將在下文中介紹。以下是簡化的深度自動編碼器架構示意圖,下文會作具體說明。

處理基准數據集MNIST時,深度自動編碼器會在每個RBM之后使用二進制變換。深度自動編碼器還可以用於包含實數數據的其他類型的數據集,此時編碼器中的RBM可以改用高斯修正變換。

編碼

讓我們用以下的示例來描繪一個編碼器的大致結構:

784 (輸入) ----> 1000 ----> 500 ----> 250 ----> 100 -----> 30

假設進入網絡的輸入是784個像素(MNIST數據集中28 x 28像素的圖像),那么深度自動編碼器的第一層應當有1000個參數,即相對較大。 (注意這里的解釋:首層的擴張!)

這可能會顯得有違常理,因為參數多於輸入往往會導致神經網絡過擬合。

在這個例子當中, 增加參數從某種意義上來看也就是增加輸入本身的特征,而這將使經過自動編碼的數據最終能被解碼。

其原因在於每個層中用於變換的sigmoid置信單元的表示能力。sigmoid置信單元無法表示與實數數據等量的信息和差異,而補償方法之一就是擴張第一個層。

各個層將分別有1000、500、250、100個節點,直至網絡最終生成一個30個數值長的向量。這一30個數值的向量是深度自動編碼器負責預定型的前半部分的最后一層,由一個普通的RBM生成,而不是一個通常會出現在深度置信網絡末端的Softmax或邏輯回歸分類輸出層。

解碼

這30個數值是28 x 28像素圖像被編碼后的版本。深度自動編碼器的后半部分會學習如何解碼這一壓縮后的向量,將其作為輸入一步步還原。

深度自動編碼器的解碼部分是一個前饋網絡,它的各個層分別有100、250、500和1000個節點。 層的權重以隨機方式初始化。

定型細節

在解碼器的反向傳播階段,學習速率應當降低,減慢速度:大約取在1e-3和1e-6之間,具體取決於處理的是二進制數據還是連續數據(分別對應區間的兩端)。

應用案例

圖像搜索

如上文所述,深度自動編碼器可以將圖像壓縮為30個數值的向量。

因此圖像搜索的過程就變成:上傳圖像,搜索引擎將圖像壓縮為30個數值,然后將這個向量與索引中的所有其他向量進行比較。

包含相似數值的向量將被返回,再轉換為與之匹配的圖像,成為搜索查詢的結果。

數據壓縮

圖像壓縮更廣泛的應用是數據壓縮。正如Geoff Hinton在這篇論文中所述,深度自動編碼器可用於語義哈希。

主題建模和信息檢索(IR)

深度自動編碼器可用於主題建模,即以統計學方式對分布於一個文檔集合中的抽象主題建模。

這是沃森等問答系統的一個重要環節。

簡而言之,集合中的每篇文檔會被轉換為一個詞袋(即一組詞頻),而這些詞頻會被縮放為0到1之間的小數,可以視之為詞在文檔中出現的概率。

縮放后的詞頻被輸入由受限玻爾茲曼機堆疊構成的深度置信網絡,而受限玻爾茲曼機本身就是一種前饋式反向傳播自動編碼器。這些深度置信網絡(DBN)通過一系列sigmoid變換將文檔映射至特征空間,從而把每篇文檔壓縮為10個數值。

每篇文檔的數值組,即向量會被引入同一個向量空間,測量它到其他各個文檔向量的距離。彼此接近的文檔向量大致上可以歸為同一個主題。

例如,一篇文檔可能是“問題”,而其他的文檔可能是“回答”,軟件可以通過在向量空間中測量距離來完成這樣的匹配。

代碼示例

深度自動編碼器可以通過拓展Deeplearning4j的MultiLayerNetwork類來構建。

代碼大致如下:

 
final int numRows = 28; final int numColumns = 28; int seed = 123; int numSamples = MnistDataFetcher.NUM_EXAMPLES; int batchSize = 1000; int iterations = 1; int listenerFreq = iterations/5; log.info("Load data...."); DataSetIterator iter = new MnistDataSetIterator(batchSize,numSamples,true); log.info("Build model...."); MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() .seed(seed) .iterations(iterations) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .list(10) .layer(0, new RBM.Builder().nIn(numRows * numColumns).nOut(1000).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(1, new RBM.Builder().nIn(1000).nOut(500).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(2, new RBM.Builder().nIn(500).nOut(250).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(3, new RBM.Builder().nIn(250).nOut(100).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(4, new RBM.Builder().nIn(100).nOut(30).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) //編碼停止 .layer(5, new RBM.Builder().nIn(30).nOut(100).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) //解碼開始 .layer(6, new RBM.Builder().nIn(100).nOut(250).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(7, new RBM.Builder().nIn(250).nOut(500).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(8, new RBM.Builder().nIn(500).nOut(1000).lossFunction(LossFunctions.LossFunction.RMSE_XENT).build()) .layer(9, new OutputLayer.Builder(LossFunctions.LossFunction.RMSE_XENT).nIn(1000).nOut(numRows*numColumns).build()) .pretrain(true).backprop(true) .build(); MultiLayerNetwork model = new MultiLayerNetwork(conf); model.init(); model.setListeners(Arrays.asList((IterationListener) new ScoreIterationListener(listenerFreq))); log.info("Train model...."); while(iter.hasNext()) { DataSet next = iter.next(); model.fit(new DataSet(next.getFeatureMatrix(),next.getFeatureMatrix())); 

如需構建深度自動編碼器,請確保您已安裝Deeplearning4j及其示例的最新版本。

如有關於深度自動編碼器的問題,請在Gitter與我們聯系。

轉自:https://deeplearning4j.org/cn/deepautoencoder


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM