【面向代码】学习 Deep Learning(四) Stacked Auto-Encoders(SAE)
2015-08-21 21:52
393 查看
==========================================================================================
最近一直在看Deep Learning,各类博客、论文看得不少
但是说实话,这样做有些疏于实现,一来呢自己的电脑也不是很好,二来呢我目前也没能力自己去写一个toolbox
只是跟着Andrew Ng的UFLDL tutorial 写了些已有框架的代码(这部分的代码见github)
后来发现了一个matlab的Deep Learning的toolbox,发现其代码很简单,感觉比较适合用来学习算法
再一个就是matlab的实现可以省略掉很多数据结构的代码,使算法思路非常清晰
所以我想在解读这个toolbox的代码的同时来巩固自己学到的,同时也为下一步的实践打好基础
(本文只是从代码的角度解读算法,具体的算法理论步骤还是需要去看paper的
我会在文中给出一些相关的paper的名字,本文旨在梳理一下算法过程,不会深究算法原理和公式)
==========================================================================================
使用的代码:DeepLearnToolbox
,下载地址:点击打开,感谢该toolbox的作者
==========================================================================================
今天介绍的呢是DL另一个非常重要的模型:SAE
把这个放在最后来说呢,主要是因为在UFLDL tutorial 里已经介绍得比较详细了,二来代码非常简单(在NN的基础之上)
先放一张autoencoder的基本结构:
![](http://ufldl.stanford.edu/wiki/images/thumb/f/f9/Autoencoder636.png/400px-Autoencoder636.png)
基本意思就是一个隐藏层的神经网络,输入输出都是x,属于无监督学习
==========================================================================================
[cpp]
view plaincopy
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
[cpp]
view plaincopy
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,隐藏层的值作为下一层的输入
![](http://ufldl.stanford.edu/wiki/images/math/7/a/4/7a4ac86b3559db835f4357987252b088.png)
这就是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即可
toolbox中的也实现非常简单:
在nntrain.m中:
batch_x = batch_x.*(rand(size(batch_x))>nn.inputZeroMaskedFraction)
也就是随即把大小为(nn.inputZeroMaskedFraction)的一部分x赋成0,denoising autoencoder的表现好像比sparse autoencoder要强一些
这篇论文里也总结了一下autoencoder,感觉很不错
Contractive autoencoders的模型是:
![](http://img.blog.csdn.net/20130813095033406?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGFya19TY29wZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
其中:
![](http://img.blog.csdn.net/20130813095151218?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGFya19TY29wZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
hj是表示hidden layer的函数,用它对x求导
论文里说:这个项是
encourages the mapping to the feature space to be contractive in the neighborhood of the training data
具体的实现呢是:
![](http://img.blog.csdn.net/20130813095541312?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGFya19TY29wZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
代码呢参看:论文作者提供的:点击打开链接
主要是
jacobian(self,x):
_jacobi_loss():
_fit_reconstruction():
这几个函数和autoencoder有出入,其实也比较简单,就不细讲了
可能你也发现了,Toolbox里还有一个文件夹叫CAE,不过这个CAE是Convolutional
Auto-Encoders
参考http://www.idsia.ch/~ciresan/data/icann2011.pdf,以后有时间再学习一下~
最近一直在看Deep Learning,各类博客、论文看得不少
但是说实话,这样做有些疏于实现,一来呢自己的电脑也不是很好,二来呢我目前也没能力自己去写一个toolbox
只是跟着Andrew Ng的UFLDL tutorial 写了些已有框架的代码(这部分的代码见github)
后来发现了一个matlab的Deep Learning的toolbox,发现其代码很简单,感觉比较适合用来学习算法
再一个就是matlab的实现可以省略掉很多数据结构的代码,使算法思路非常清晰
所以我想在解读这个toolbox的代码的同时来巩固自己学到的,同时也为下一步的实践打好基础
(本文只是从代码的角度解读算法,具体的算法理论步骤还是需要去看paper的
我会在文中给出一些相关的paper的名字,本文旨在梳理一下算法过程,不会深究算法原理和公式)
==========================================================================================
使用的代码:DeepLearnToolbox
,下载地址:点击打开,感谢该toolbox的作者
==========================================================================================
今天介绍的呢是DL另一个非常重要的模型:SAE
把这个放在最后来说呢,主要是因为在UFLDL tutorial 里已经介绍得比较详细了,二来代码非常简单(在NN的基础之上)
先放一张autoencoder的基本结构:
![](http://ufldl.stanford.edu/wiki/images/thumb/f/f9/Autoencoder636.png/400px-Autoencoder636.png)
基本意思就是一个隐藏层的神经网络,输入输出都是x,属于无监督学习
==========================================================================================
基本代码
saesetup.m[cpp]
view plaincopy
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
[cpp]
view plaincopy
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:
![](http://ufldl.stanford.edu/wiki/images/math/7/a/4/7a4ac86b3559db835f4357987252b088.png)
这就是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,以后有时间再学习一下~
相关文章推荐
- 【面向代码】学习 Deep Learning(三)Convolution Neural Network(CNN)
- 《head first python》——理解数据:列表排序与集合
- C++ 中左值与右值区别
- 【面向代码】学习 Deep Learning(二)Deep Belief Nets(DBNs)
- 【面向代码】学习 Deep Learning(一)Neural Network
- C/C++浮点数在内存中的存储方式
- c语言之进制转换(栈实现)
- C# FTP操作类可用
- eclipse无法导入工程文件
- JList的ListSelectionEvent的几个问题请教
- Java反射性能优化(上)
- java.lang.UnsatisfiedLinkError: Couldn't load libjniFramework from loader
- [C++11 并发编程] 08 - Mutex std::unique_lock
- JAVA反射机制
- Java 泛型 详解
- python环境安装paramiko模块
- 【leetcode】Isomorphic Strings【java】
- Python学习笔记1(小甲鱼)—— 安装Python3
- DesignPattern_Java:Factory Method Pattern
- 一个C++的平衡二叉树例子