1. 程式人生 > >自動編碼器(Auto Encoder)

自動編碼器(Auto Encoder)

1.初識Auto Encoder

1986 年Rumelhart 提出自動編碼器的概念,並將其用於高維複雜資料處理,促進了神經網路的發展。自編碼神經網路是一種無監督學習演算法,它使用了反向傳播演算法,並讓目標值等於輸入值,比如 。圖1是一個自編碼神經網路的示例。


圖1

自動編碼器(autoencoder) 是神經網路的一種,該網路可以看作由兩部分組成:一個編碼器函式h = f(x) 和一個生成重構的解碼器r = g(h)。傳統上,自動編碼器被用於降維或特徵學習

自編碼神經網路嘗試學習一個的函式。換句話說,它嘗試逼近一個恆等函式,從而使得輸出接近於輸入x 。恆等函式雖然看上去不太有學習的意義,但是當我們為自編碼神經網路加入某些限制,比如限定隱藏神經元的數量,我們就可以從輸入資料中發現一些有趣的結構

舉例來說,假設某個自編碼神經網路的輸入x 是一張 10×10影象(共100個畫素)的畫素灰度值,於是 n=100 ,其隱藏層中有50個隱藏神經元。注意,輸出也是100維。由於只有50個隱藏神經元,我們迫使自編碼神經網路去學習輸入資料的壓縮表示,也就是說,它必須從50維的隱藏神經元啟用度向量中重構出100維的畫素灰度值輸入x 。

一些需要注意的問題:

如果網路的輸入資料是完全隨機的,比如每一個輸入都是一個跟其它特徵完全無關的獨立同分布高斯隨機變數,那麼這一壓縮表示將會非常難學習。但是如果輸入資料中隱含著一些特定的結構,比如某些輸入特徵是彼此相關的,那麼這一演算法就可以發現輸入資料中的這些相關性。事實上,這一簡單的自編碼神經網路通常可以學習出一個跟主元分析(PCA)結果非常相似的輸入資料的低維表示。

2.Deep Auto Encoder(DAE)

2006 年,Hinton 對原型自動編碼器結構進行改進,進而產生了DAE,先用無監督逐層貪心訓練演算法完成對隱含層的預訓練,然後用BP 演算法對整個神經網路進行系統性引數優化調整,顯著降低了神經網路的效能指數,有效改善了BP 演算法易陷入區域性最小的不良狀況。

簡單來說,DAE相對於原始的Auto Encoder加大了深度,提高學習能力,更利於預訓練。如圖2所示,一個5層的DAE,隱層節點數從高到低,再從低到高,最終只需要取得的向量即可。


圖2

注:圖片裡面的GO,是我課題需要,可以忽略。

3.利用keras實現DAE

# -*- coding: utf-8 -*-
import pandas as pd import numpy as np from keras.layers import Dense,Activation,Input from keras.models import Sequential,Model import theano #可以自行替換為自己的資料 go = pd.read_csv('./clear_data/gene_ontology.csv') go_id = go['Gene_ID'] go = go.drop(['Gene_ID'],axis=1) inputDims = go.values.shape[1] EncoderDims = 100 AutoEncoder = Sequential() AutoEncoder.add(Dense(input_dim=inputDims,output_dim=EncoderDims,activation='relu')) AutoEncoder.add(Dense(input_dim=EncoderDims,output_dim=inputDims,activation='sigmoid')) AutoEncoder.compile(optimizer='adadelta',loss='binary_crossentropy') AutoEncoder.fit(go.values,go.values,batch_size=32,nb_epoch=50,shuffle=True) #,validation_data=(x_test, x_test)

4.取DAE隱層向量

get_feature = theano.function([AutoEncoder.layers[0].input],AutoEncoder.layers[0].output,allow_input_downcast=False)
new_go = get_feature(go)

參考文獻:
(1)Rumelhart DE,Hinton GE,Williams RJ. Learning representations by back-propagating errors[J]. Nature,1986,323: 533-536.
(2)Hinton GE,Osinder S,Teh Y W. A fast learning algorithm for deep belief nets[J].Neural Computation,2006,18( 7) : 1527-1554.
(3)http://deeplearning.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity