栈式自编码算法

 Revision as of 12:19, 8 March 2013 (view source)Kandeng (Talk | contribs)← Older edit Latest revision as of 05:15, 8 April 2013 (view source)Wikiroot (Talk | contribs) Line 1: Line 1: - 初译@小猴机器人 + ==概述== - 一审@邓亚峰-人脸识别 + - ===Overview=== + 逐层贪婪训练法依次训练网络的每一层，进而预训练整个深度神经网络。在本节中，我们将会学习如何将自编码器“栈化”到逐层贪婪训练法中，从而预训练（或者说初始化）深度神经网络的权重。 - The greedy layerwise approach for pretraining a deep network works by training each layer in turn. In this page, you will find out how autoencoders can be "stacked" in a greedy layerwise fashion for pretraining (initializing) the weights of a deep network. - 【初译】 + 栈式自编码神经网络是一个由多层稀疏自编码器组成的神经网络，其前一层自编码器的输出作为其后一层自编码器的输入。对于一个 $\textstyle n$ 层栈式自编码神经网络，我们沿用自编码器一章的各种符号，假定用 $\textstyle W^{(k, 1)}, W^{(k, 2)}, b^{(k, 1)}, b^{(k, 2)}$ 表示第 $\textstyle k$ 个自编码器对应的 $\textstyle W^{(1)}, W^{(2)}, b^{(1)}, b^{(2)}$ 参数，那么该栈式自编码神经网络的编码过程就是，按照从前向后的顺序执行每一层自编码器的编码步骤： - 在深度神经网络进行预先训练的时候，有一种贪心分层方法，它的原理基于对每一个层次轮流进行训练。在本文中，我们会一起学习如何将上文中提到的自编码神经网络以栈的形式组成这种贪心分层的模样，从而预先训练（或者说初始化）深度神经网络的权重。 + - 【一审】 - 可以采用依次训练每一层的贪心分层算法来预训练深度神经网络。在本节中，我们将会学习如何将自编码器以贪心分层的方式栈化，从而预训练（或者说初始化）深度神经网络的权重。 - - - A stacked autoencoder is a neural network consisting of multiple layers of sparse autoencoders in which the outputs of each layer is wired to the inputs of the successive layer. Formally, consider a stacked autoencoder with n layers. Using notation from the autoencoder section, let $W^{(k, 1)}, W^{(k, 2)}, b^{(k, 1)}, b^{(k, 2)}$ denote the parameters $W^{(1)}, W^{(2)}, b^{(1)}, b^{(2)}$ for kth autoencoder. Then the encoding step for the stacked autoencoder is given by running the encoding step of each layer in forward order: $[itex] Line 22: Line 14:$ [/itex] - The decoding step is given by running the decoding stack of each autoencoder in reverse order: - + 同理，栈式神经网络的解码过程就是，按照从后向前的顺序执行每一层自编码器的解码步骤： - \begin{align} + - a^{(n + l)} = f(z^{(n + l)}) \\ + - z^{(n + l + 1)} = W^{(n - l, 2)}a^{(n + l)} + b^{(n - l, 2)} + - \end{align} + - + - The information of interest is contained within $a^{(n)}$, which is the activation of the deepest layer of hidden units. This vector gives us a representation of the input in terms of higher-order features. - - 【初译】 - 栈式自编码神经网络指的是这样一种网络，它由多层稀疏自编码神经网络组成，前一层网络的输出作为后一层的输入。形式化来讲，让我们来设想一个n层栈式自编码神经网络，并沿用自编码神经网络那章的各种符号，比如$W^{(k, 1)}, W^{(k, 2)}, b^{(k, 1)}, b^{(k, 2)}$ 表示第k层网络里对应的$W^{(1)}, W^{(2)}, b^{(1)}, b^{(2)}$ 参数。那么对于该栈式网络的编码过程就是，按照从前向后的顺序，执行每一层的编码过程： - - - \begin{align} - a^{(l)} = f(z^{(l)}) \\ - z^{(l + 1)} = W^{(l, 1)}a^{(l)} + b^{(l, 1)} - \end{align} - - - 解码就是从后向前每层解码咯： $[itex] Line 52: Line 25:$ [/itex] - 在这里，我们感兴趣的信息是a(n)，也就是最深的隐含单元层的激发阈值。这个向量对我们的输入给出更高层次的特征表示。 - 【一审】 + 其中，$\textstyle a^{(n)}$ 是最深层隐藏单元的激活值，其包含了我们感兴趣的信息，这个向量也是对输入值的更高阶的表示。 - 栈式自编码神经网络是一个由多层稀疏自编码器组成的神经网络，其前一层自编码器的输出作为其后一层自编码器的输入。形式上，对于一个n层栈式自编码神经网络而言，沿用自编码器一章的各种符号，假定用$W^{(k, 1)}, W^{(k, 2)}, b^{(k, 1)}, b^{(k, 2)}$ 表示第k个自编码器对应的$W^{(1)}, W^{(2)}, b^{(1)}, b^{(2)}$ 参数，那么该栈式自编码神经网络的编码过程就是依照从前向后的顺序执行每一层自编码器的编码步骤： + - - \begin{align} - a^{(l)} = f(z^{(l)}) \\ - z^{(l + 1)} = W^{(l, 1)}a^{(l)} + b^{(l, 1)} - \end{align} - - 同理，栈式神经网络的解码过程就是依照从后向前的顺序执行每一层自编码器的解码步骤： + 通过将 $\textstyle a^{(n)}$ 作为softmax分类器的输入特征，可以将栈式自编码神经网络中学到的特征用于分类问题。 - - \begin{align} - a^{(n + l)} = f(z^{(n + l)}) \\ - z^{(n + l + 1)} = W^{(n - l, 2)}a^{(n + l)} + b^{(n - l, 2)} - \end{align} - - 其中，a(n)是隐藏单元最深层的响应，其包含了我们感兴趣的信息，这个向量是对输入的更高阶的表示。 + ==训练== - The features from the stacked autoencoder can be used for classification problems by feeding $a(n)$ to a softmax classifier. - 【初译】 + 一种比较好的获取栈式自编码神经网络参数的方法是采用逐层贪婪训练法进行训练。即先利用原始输入来训练网络的第一层，得到其参数 $\textstyle W^{(1,1)}, W^{(1,2)}, b^{(1,1)}, b^{(1,2)}$；然后网络第一层将原始输入转化成为由隐藏单元激活值组成的向量（假设该向量为A），接着把A作为第二层的输入，继续训练得到第二层的参数 $\textstyle W^{(2,1)}, W^{(2,2)}, b^{(2,1)}, b^{(2,2)}$；最后，对后面的各层同样采用的策略，即将前层的输出作为下一层输入的方式依次训练。 - 从栈式自编码神经网络中学到的特征，可以通过向softmax分类器添加 $a(n)$的方式来解决分类问题。 + - 【一审】 - 通过将 $a(n)$作为softmax分类器的输入特征，可以将栈式自编码神经网络中学到的特征用于分类问题。 + 对于上述训练方式，在训练每一层参数的时候，会固定其它各层参数保持不变。所以，如果想得到更好的结果，在上述预训练过程完成之后，可以通过反向传播算法同时调整所有层的参数以改善结果，这个过程一般被称作“微调（fine-tuning）”。 - ===Training=== - A good way to obtain good parameters for a stacked autoencoder is to use greedy layer-wise training. To do this, first train the first layer on raw input to obtain parameters $W^{(1,1)}, W^{(1,2)}, b^{(1,1)}, b^{(1,2)}$. Use the first layer to transform the raw input into a vector consisting of activation of the hidden units, A. Train the second layer on this vector to obtain parameters $W^{(2,1)}, W^{(2,2)}, b^{(2,1)}, b^{(2,2)}$. Repeat for subsequent layers, using the output of each layer as input for the subsequent layer. - This method trains the parameters of each layer individually while freezing parameters for the remainder of the model. To produce better results, after this phase of training is complete, [[Fine-tuning Stacked AEs | fine-tuning]] using backpropagation can be used to improve the results by tuning the parameters of all layers are changed at the same time. + 实际上，使用逐层贪婪训练方法将参数训练到快要收敛时，应该使用微调。反之，如果直接在随机化的初始权重上使用微调，那么会得到不好的结果，因为参数会收敛到局部最优。 - - {{Quote| + 如果你只对以分类为目的的微调感兴趣，那么惯用的做法是丢掉栈式自编码网络的“解码”层，直接把最后一个隐藏层的 $\textstyle a^{(n)}$ 作为特征输入到softmax分类器进行分类，这样，分类器（softmax）的分类错误的梯度值就可以直接反向传播给编码层了。 - If one is only interested in finetuning for the purposes of classification, the common practice is to then discard the "decoding" layers of the stacked autoencoder and link the last hidden layer $a^{(n)}$ to the softmax classifier. The gradients from the (softmax) classification error will then be backpropagated into the encoding layers. + - }} + - ===Concrete example=== - To give a concrete example, suppose you wished to train a stacked autoencoder with 2 hidden layers for classification of MNIST digits, as you will be doing in [[Exercise: Implement deep networks for digit classification | the next exercise]]. + ==具体实例== + + 让我们来看个具体的例子，假设你想要训练一个包含两个隐含层的栈式自编码网络，用来进行MNIST手写数字分类（这将会是你的下一个练习）。 + 首先，你需要用原始输入 $\textstyle x^{(k)}$ 训练第一个自编码器，它能够学习得到原始输入的一阶特征表示$\textstyle h^{(1)(k)}$（如下图所示）。 - First, you would train a sparse autoencoder on the raw inputs $x^{(k)}$ to learn primary features $h^{(1)(k)}$ on the raw input. [[File:Stacked_SparseAE_Features1.png|400px]] [[File:Stacked_SparseAE_Features1.png|400px]] - Next, you would feed the raw input into this trained sparse autoencoder, obtaining the primary feature activations $h^{(1)(k)}$ for each of the inputs $x^{(k)}$. You would then use these primary features as the "raw input" to another sparse autoencoder to learn secondary features $h^{(2)(k)}$ on these primary features. + + 接着，你需要把原始数据输入到上述训练好的稀疏自编码器中，对于每一个输入$\textstyle x^{(k)}$，都可以得到它对应的一阶特征表示$\textstyle h^{(1)(k)}$。然后你再用这些一阶特征作为另一个稀疏自编码器的输入，使用它们来学习二阶特征 $\textstyle h^{(2)(k)}$。（如下图所示） [[File:Stacked_SparseAE_Features2.png|400px]] [[File:Stacked_SparseAE_Features2.png|400px]] - Following this, you would feed the primary features into the second sparse autoencoder to obtain the secondary feature activations $h^{(2)(k)}$ for each of the primary features $h^{(1)(k)}$ (which correspond to the primary features of the corresponding inputs $x^{(k)}$). You would then treat these secondary features as "raw input" to a softmax classifier, training it to map secondary features to digit labels. + + 同样，再把一阶特征输入到刚训练好的第二层稀疏自编码器中，得到每个 $\textstyle h^{(1)(k)}$ 对应的二阶特征激活值 $\textstyle h^{(2)(k)}$。接下来，你可以把这些二阶特征作为softmax分类器的输入，训练得到一个能将二阶特征映射到数字标签的模型。 [[File:Stacked_Softmax_Classifier.png|400px]] [[File:Stacked_Softmax_Classifier.png|400px]] - Finally, you would combine all three layers together to form a stacked autoencoder with 2 hidden layers and a final softmax classifier layer capable of classifying the MNIST digits as desired. + + 如下图所示，最终，你可以将这三层结合起来构建一个包含两个隐藏层和一个最终softmax分类器层的栈式自编码网络，这个网络能够如你所愿地对MNIST数字进行分类。 [[File:Stacked_Combined.png|500px]] [[File:Stacked_Combined.png|500px]] - ===Discussion=== - A stacked autoencoder enjoys all the benefits of any deep network of greater expressive power. + ==讨论== + + 栈式自编码神经网络具有强大的表达能力及深度神经网络的所有优点。 + + 更进一步，它通常能够获取到输入的“层次型分组”或者“部分-整体分解”结构。为了弄清这一点，回顾一下，自编码器倾向于学习得到能更好地表示输入数据的特征。因此，栈式自编码神经网络的第一层会学习得到原始输入的一阶特征（比如图片里的边缘），第二层会学习得到二阶特征，该特征对应一阶特征里包含的一些模式（比如在构成轮廓或者角点时，什么样的边缘会共现）。栈式自编码神经网络的更高层还会学到更高阶的特征。 + + + 举个例子，如果网络的输入数据是图像，网络的第一层会学习如何去识别边，第二层一般会学习如何去组合边，从而构成轮廓、角等。更高层会学习如何去组合更形象且有意义的特征。例如，如果输入数据集包含人脸图像，更高层会学习如何识别或组合眼睛、鼻子、嘴等人脸器官。 + + + + ==中英文对照== + + :自编码器  Autoencoder + + :逐层贪婪训练法  Greedy layer-wise training + + :预训练  PreTrain + + :栈式自编码神经网络  Stacked autoencoder + + :微调 Fine-tuning + + :原始输入  Raw inputs + + :层次型分组  Hierarchical grouping + + :部分-整体分解  Part-whole decomposition + + :一阶特征  First-order features + + :二阶特征  Second-order features + + :更高阶特征  Higher-order features + + :激活值  Activation + + + ==中文译者== + + 张天雷（ztl2004@gmail.com）, 邓亚峰（dengyafeng@gmail.com）, 许利杰（csxulijie@gmail.com） + - Further, it often captures a useful "hierarchical grouping" or "part-whole decomposition" of the input.  To see this, recall that an autoencoder tends to learn features that form a good representation of its input. The first layer of a stacked autoencoder tends to learn first-order features in the raw input (such as edges in an image). The second layer of a stacked autoencoder tends to learn second-order features corresponding to patterns in the appearance of first-order features (e.g., in terms of what edges tend to occur together--for example, to form contour or corner detectors). Higher layers of the stacked autoencoder tend to learn even higher-order features. + {{建立分类用深度网络}} - {{CNN}} - +