在前面的討論中,用到的激勵函數都是sigmoid函數:
以為最終的輸出層所有輸出的范圍是[0,1],而我們在自編碼學習的動機就是使得輸出等於輸入,於是所有輸入必須調整到[0,1]范圍內,但是問題來了,有些數據集輸入范圍容易調整,比如Minist,但是PCA白化處理的輸入並不滿足[0,1],所以需要找到一種能夠處理非[0,1]范圍內的機制。
為了解決這個問題,我們讓輸出層的輸出和該層輸入相等:a(3) = z(3),這就相等於把激勵函數改為 f(z) = z,稱這個激勵函數為 線性激勵函數,這樣就可以輸出大於1和小於0的值,那么我們就可以用實值作為輸入訓練整個自編碼器,即輸入的范圍不用再限制在[0,1]之內,可以是任意實數。
在這個線性解碼器模型中:.
隨着激勵函數的改變,輸出單元的梯度求法也要隨之改變:
因為輸出層f(z) = z,所以 f'(z) = 1,於是:
當采用反向傳播計算誤差時,還是和以前一樣:
這是因為隱層的激勵函數還是sigmoid函數,沒有改變。
下面的練習用線性編碼器學習出彩色圖像的特征,數據集http://ufldl.stanford.edu/wiki/resources/stl10_patches_100k.zip,里面是采樣好的100,00幅8*8的RGB圖像,隨機前100幅采樣得到的圖像:
經過白化處理后:
學習出的特征:
可以看出和灰度圖像類似,學習出的仍然是一些物體的邊緣部分。
實驗代碼:linear_autoencoder.rar,minFunc.rar,其中minFunc.rar是用來優化自動編碼代價函數的工具函數包。