zoukankan      html  css  js  c++  java
  • matlab的Deep Learning的toolbox 中的SAE算法

    最近一直在看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

    [cpp]  view plain copy
     
    1. function sae = saesetup(size)  
    2.     for u = 2 : numel(size)  
    3.         sae.ae{u-1} = nnsetup([size(u-1) size(u) size(u-1)]);  
    4.     end  
    5. end  


    saetrain.m

    [cpp]  view plain copy
     
    1. function sae = saetrain(sae, x, opts)  
    2.     for i = 1 : numel(sae.ae);  
    3.         disp(['Training AE ' num2str(i) '/' num2str(numel(sae.ae))]);  
    4.         sae.ae{i} = nntrain(sae.ae{i}, x, x, opts);  
    5.         t = nnff(sae.ae{i}, x, x);  
    6.         x = t.a{2};  
    7.         %remove bias term  
    8.         x = x(:,2:end);  
    9.     end  
    10. 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 ,以后有时间再学习一下~
  • 相关阅读:
    LINQ的from子句和foreach语句的区别
    mysql连接错误10061
    iframe嵌套iframe阻塞
    2016-12有感,微信,组建
    js进阶篇学习
    html5的学习
    rocketmq集群(三)
    rocketmq发送普通消息(二)
    rocketmq安装(一)
    kafka stream及interceptor(四)
  • 原文地址:https://www.cnblogs.com/wangshicheng/p/10708495.html
Copyright © 2011-2022 走看看