【面向程式碼】學習 Deep Learning(四) Stacked Auto-Encoders(SAE)

Dark_Scope發表於2013-08-13

==========================================================================================

最近一直在看Deep Learning,各類部落格、論文看得不少

但是說實話,這樣做有些疏於實現,一來呢自己的電腦也不是很好,二來呢我目前也沒能力自己去寫一個toolbox

只是跟著Andrew Ng的UFLDL tutorial 寫了些已有框架的程式碼(這部分的程式碼見github)

後來發現了一個matlab的Deep Learning的toolbox,發現其程式碼很簡單,感覺比較適合用來學習演算法

再一個就是matlab的實現可以省略掉很多資料結構的程式碼,使演算法思路非常清晰

所以我想在解讀這個toolbox的程式碼的同時來鞏固自己學到的,同時也為下一步的實踐打好基礎

(本文只是從程式碼的角度解讀演算法,具體的演算法理論步驟還是需要去看paper的

我會在文中給出一些相關的paper的名字,本文旨在梳理一下演算法過程,不會深究演算法原理和公式)

==========================================================================================

使用的程式碼:DeepLearnToolbox  ,下載地址:點選開啟,感謝該toolbox的作者

==========================================================================================

今天介紹的呢是DL另一個非常重要的模型:SAE

把這個放在最後來說呢,主要是因為在UFLDL tutorial 裡已經介紹得比較詳細了,二來程式碼非常簡單(在NN的基礎之上)

先放一張autoencoder的基本結構:

基本意思就是一個隱藏層的神經網路,輸入輸出都是x,屬於無監督學習

==========================================================================================

基本程式碼

saesetup.m

function sae = saesetup(size)
    for u = 2 : numel(size)
        sae.ae{u-1} = nnsetup([size(u-1) size(u) size(u-1)]);
    end
end

saetrain.m

function sae = saetrain(sae, x, opts)
    for i = 1 : numel(sae.ae);
        disp(['Training AE ' num2str(i) '/' num2str(numel(sae.ae))]);
        sae.ae{i} = nntrain(sae.ae{i}, x, x, opts);
        t = nnff(sae.ae{i}, x, x);
        x = t.a{2};
        %remove bias term
        x = x(:,2:end);
    end
end

其實就是每一層一個autoencoder,隱藏層的值作為下一層的輸入


各類變形

    為了不致於本文內容太少。。。現在單獨把它的幾個變形提出來說說

  sparse autoencoder:

   

   這就是ufldl講的版本,toolbox中的程式碼和ufldl中練習的部分基本一致:

   在nnff.m中使用:nn.p{i} = 0.99 * nn.p{i} + 0.01 * mean(nn.a{i}, 1);計算

   在nnbp.m中使用

     pi = repmat(nn.p{i}, size(nn.a{i}, 1), 1); 

     sparsityError = [zeros(size(nn.a{i},1),1) nn.nonSparsityPenalty * (-nn.sparsityTarget ./ pi + (1 - nn.sparsityTarget) ./ (1 - pi))];

   計算sparsityError即可

 denoising autoencoder:

   denoising其實就是在autoencoder的基礎上,給輸入的x加入噪聲,就相當於dropout用在輸入層

   toolbox中的也實現非常簡單:

   在nntrain.m中:

      batch_x = batch_x.*(rand(size(batch_x))>nn.inputZeroMaskedFraction)

   也就是隨即把大小為(nn.inputZeroMaskedFraction)的一部分x賦成0,denoising autoencoder的表現好像比sparse autoencoder要強一些

Contractive Auto-Encoders:

   這個變形呢是《Contractive auto-encoders: Explicit invariance during feature extraction》提出的

   這篇論文裡也總結了一下autoencoder,感覺很不錯

    Contractive autoencoders的模型是:

     

    其中:

       hj是表示hidden layer的函式,用它對x求導

    論文裡說:這個項是

         encourages the mapping to the feature space to be contractive in the neighborhood of the training data

     具體的實現呢是:

        

     程式碼呢參看:論文作者提供的:點選開啟連結

      主要是

jacobian(self,x):

_jacobi_loss():

_fit_reconstruction():

這幾個函式和autoencoder有出入,其實也比較簡單,就不細講了

總結:


總的來說,autoencoder感覺是DL中比較好理解的一部分,所以介紹內容不長
可能你也發現了,Toolbox裡還有一個資料夾叫CAE,不過這個CAE是Convolutional Auto-Encoders
參考http://www.idsia.ch/~ciresan/data/icann2011.pdf,以後有時間再學習一下~

相關文章