教程地址:http://www.deeplearning.net/tutorial/SdA.html
The Stacked Denoising Autoencoder (SdA) is an extension of the stacked autoencoder[Bengio07] and it was introduced in [Vincent08].
推荐先看这个UFLDL,讲得很详细:http://deeplearning.stanford.edu/wiki/index.php/%E6%A0%88%E5%BC%8F%E8%87%AA%E7%BC%96%E7%A0%81%E7%AE%97%E6%B3%95
我之前一个做的UFLDL中栈式自编码的作业(但是不是降噪自编码,是稀疏自编码):UFLDL教程答案(6):Exercise:Implement deep networks for digit classification
Stacked Autoencoders
回顾下自编码:(目标是输出层(重构层)尽量重构输入,即与输入尽量一致,那么隐藏层就相当于抓住了数据的内在特征)
降噪自编码器可以一层一层堆叠成栈式自编码器,(重构层去掉),前一层的隐层输出(latent representation (output code))为后一自编码层的输入下图是UFLDL中两层自编码层堆叠的图例:
逐层贪婪训练:每层自编码层都单独进行非监督训练,以最小化输入(输入为前一层的隐层输出)与重构结果之间的误差为训练目标。前K层训练好了,就可以训练K+1层,因为已经前向传播求出K层的输出,再用K层的输出当作K+1的输入训练K+1层。
在所有自编码层都完成预训练之后,在对网络进行微调,即用样本进行有监督训练,在网络最后一层加上一层logistic regression layer(softmax层),像Multilayer Perceptron那样训练。
构建class SdA
下面这段是如何利用之前实现的LR,MLP,DA等构建SDA
We can see the stacked denoising autoencoder(sda) as having two facades: a list of autoencoders, and an MLP.
在预训练时,sda可以看作很多个自编码器相连,逐个无监督训练;
在微调时,sda可以看作一个多层感知器进行有监督训练。
sigmoid_layer = HiddenLayer(rng=numpy_rng,
input=layer_input,
n_in=input_size,
n_out=hidden_layers_sizes[i],
activation=T.nnet.sigmoid)
dA_layer = dA(numpy_rng=numpy_rng,
theano_rng=theano_rng,
input=layer_input,
n_visible=input_size,
n_hidden=hidden_layers_sizes[i],
W=sigmoid_layer.W,
bhid=sigmoid_layer.b)
代码中可以看出:自编码层和多层感知器的隐层其实是共用的权重,其实每层既是dA,又是HiddenLayer,这样就可以使用之前的mlp.py,dA.py来实现sda。
class SdA(object):
"""Stacked denoising auto-encoder class (SdA)
A stacked denoising autoencoder model is obtained by stacking several
dAs. The hidden layer of the dA at layer `i` becomes the input of
the dA at layer `i+1`. The first layer dA gets as input the input of
the SdA,