用反向传导思想求导
From Ufldl
for
用反向传导思想求导
Jump to:
navigation
,
search
[原文] [原文] == Introduction == In the section on the [[Backpropagation Algorithm | backpropagation algorithm]], you were briefly introduced to backpropagation as a means of deriving gradients for learning in the sparse autoencoder. It turns out that together with matrix calculus, this provides a powerful method and intuition for deriving gradients for more complex matrix functions (functions from matrices to the reals, or symbolically, from <math>\mathbb{R}^{r \times c} \rightarrow \mathbb{R}</math>). [初译] 简介 这一节关于反向传播算法,你会简要了解到使用反向传播作为一种求导方法,以便稀疏自编码器的学习。事实证明这种手段同矩阵计算相结合提供了计算复杂矩阵函数(从矩阵到实数的函数,或用符号表示,从 <math>\mathbb{R}^{r \times c} \rightarrow \mathbb{R}</math>)的强大方法与直觉。 [一审] 简介 在反向传播算法一节中,我们介绍了在稀疏自动编码器中用来求导的反向传播算法。事实证明这种手段同矩阵计算相结合可以提供计算复杂矩阵函数(从矩阵到实数的函数,或用符号表示,从<math>\mathbb{R}^{r \times c} \rightarrow \mathbb{R}</math>这样映射的函数)的强大方法与直觉。 [原文] First, recall the backpropagation idea, which we present in a modified form appropriate for our purposes below: <ol> <li>For each output unit <math>i</math> in layer <math>n_l</math> (the final layer), set :<math> \delta^{(n_l)}_i = \frac{\partial}{\partial z^{(n_l)}_i} \;\; J(z^{(n_l)}) </math> where <math>J(z)</math> is our "objective function" (explained below). <li>For <math>l = n_l-1, n_l-2, n_l-3, \ldots, 2</math> :For each node <math>i</math> in layer <math>l</math>, set ::<math> \delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) \bullet \frac{\partial}{\partial z^{(l)}_i} f^{(l)} (z^{(l)}_i) </math> <li>Compute the desired partial derivatives, :<math> \begin{align} \nabla_{W^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} (a^{(l)})^T, \\ \end{align} </math> </ol> [初译] 首先,回忆一下反向传播思想,这里我们用一种变形的形式逐渐逼近我们的目的: <ol> <li>对每一个第<math>n_l</math>层(最后一层)中的输出单元<math>i</math>,令 :<math> \delta^{(n_l)}_i = \frac{\partial}{\partial z^{(n_l)}_i} \;\; J(z^{(n_l)}) </math> ,其中<math>J(z)</math>是我们的“目标函数”(下面解释); <li>对<math>l = n_l-1, n_l-2, n_l-3, \ldots, 2</math>, 对每个第<math>l</math>层中的节点<math>i</math>,令 :<math> \delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) \bullet \frac{\partial}{\partial z^{(l)}_i} f^{(l)} (z^{(l)}_i) </math> <li>计算所需偏导数 :<math> \begin{align} \nabla_{W^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} (a^{(l)})^T, \\ \end{align} </math> 。 </ol> [一审] 首先,我们回顾一下反向传播的思想,为了更适合我们的目的稍作修改呈现于下: <ol> <li>对每一个第<math>nl</math>层(最后一层)中的输出单元<math>i</math>,令 :<math> \delta^{(n_l)}_i = \frac{\partial}{\partial z^{(n_l)}_i} \;\; J(z^{(n_l)}) </math> ,其中<math>J(z)</math>是我们的“目标函数”(下面解释)。 <li>对<math>l = n_l-1, n_l-2, n_l-3, \ldots, 2</math>, 对每个第<math>l</math>层中的节点<math>i</math>, 令 :<math> \delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) \bullet \frac{\partial}{\partial z^{(l)}_i} f^{(l)} (z^{(l)}_i) </math> <li>计算所需偏导数 :<math> \begin{align} \nabla_{W^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} (a^{(l)})^T, \\ \end{align} </math> . </ol> [原文] Quick notation recap: <ul> <li><math>l</math> is the number of layers in the neural network <li><math>n_l</math> is the number of neurons in the <math>l</math>th layer <li><math>W^{(l)}_{ji}</math> is the weight from the <math>i</math>th unit in the <math>l</math>th layer to the <math>j</math>th unit in the <math>(l + 1)</math>th layer <li><math>z^{(l)}_i</math> is the input to the <math>i</math>th unit in the <math>l</math>th layer <li><math>a^{(l)}_i</math> is the activation of the <math>i</math>th unit in the <math>l</math>th layer <li><math>A \bullet B</math> is the Hadamard or element-wise product, which for <math>r \times c</math> matrices <math>A</math> and <math>B</math> yields the <math>r \times c</math> matrix <math>C = A \bullet B</math> such that <math>C_{r, c} = A_{r, c} \cdot B_{r, c}</math> <li><math>f^{(l)}</math> is the activation function for units in the <math>l</math>th layer </ul> [初译] 符号概述: <ul> <li><math>l</math>是神经网络的层数 <li><math>n_l</math>第l层神经元的个数 <li><math>W^{(l)}_{ji}</math>是<math>l</math>层第<math>i</math>各节点到第<math>(l+1)</math>层第<math>j</math>个节点的权重 <li><math>z^{(l)}_i</math> 是第<math>l</math>层第<math>i</math>个单元的输入 <li><math>a^{(l)}_i</math> 是第<math>l</math>层第<math>i</math>个节点的激励 <li><math>A \bullet B</math> 是矩阵的Hadamard积或逐项乘积,对<math>r \times c</math>矩阵<math>A</math>和<math>B</math>,它们的乘积是<math>r \times c</math> 矩阵<math>C = A \bullet B</math> 满足<math>C_{r, c} = A_{r, c} \cdot B_{r, c}</math> <li><math>f^{(l)}</math> 是第<math>l</math>层中各单元的激励函数 </ul> [一审] 快速符号回顾: <ul> <li><math>l</math>是神经网络的层数 <li><math>n_l</math>第l层神经元的个数 <li><math>W^{(l)}_{ji}</math>是<math>l</math>层第<math>i</math>个节点到第<math>(l+1)</math>层第<math>j</math>个节点的权重 <li><math>z^{(l)}_i</math> 是第<math>l</math>层第<math>i</math>个单元的输入 <li><math>a^{(l)}_i</math> 是第<math>l</math>层第<math>i</math>个节点的激励 <li><math>A \bullet B</math> 是矩阵的Hadamard积或对应元素乘积,对<math>r \times c</math>矩阵<math>A</math>和<math>B</math>,它们的乘积是<math>r \times c</math> 矩阵<math>C = A \bullet B</math> 满足<math>C_{r, c} = A_{r, c} \cdot B_{r, c}</math> <li><math>f^{(l)}</math> 是第<math>l</math>层中各单元的激励函数 </ul> [原文] Let's say we have a function <math>F</math> that takes a matrix <math>X</math> and yields a real number. We would like to use the backpropagation idea to compute the gradient with respect to <math>X</math> of <math>F</math>, that is <math>\nabla_X F</math>. The general idea is to see the function <math>F</math> as a multi-layer neural network, and to derive the gradients using the backpropagation idea. [初译] 假设我们有一个函数<math>F</math>,<math>F</math>以矩阵<math>X</math>为参数生成一个实数。我们希望用反向传播思想计算<math>F</math>关于 <math>X</math>的梯度,即<math>\nabla_X F</math>。一般思路是将函数<math>F</math> 看成一个多层神经网络,并使用后向传播思想求梯度。 [一审] 假设我们有一个函数<math>F</math>,<math>F</math>以矩阵<math>X</math>为参数得到一个实数。我们希望用反向传播思想计算<math>F</math>关于<math>X</math>的梯度,即 <math>\nabla_X F</math>。大致思路是将函数<math>F</math>看成一个多层神经网络,并使用反向传播思想求梯度。 [原文] To do this, we will set our "objective function" to be the function <math>J(z)</math> that when applied to the outputs of the neurons in the last layer yields the value <math>F(X)</math>. For the intermediate layers, we will also choose our activation functions <math>f^{(l)}</math> to this end. [初译] 为了实现这个想法,我们取目标函数为<math>J(z)</math>,将函数作用在最后一层神经元的输出时会产生值<math>F(X)</math>。对于中间层,我们也会为此选择我们的激励函数<math>f^{(l)}</math>。 [一审] 为了实现这个想法,我们取目标函数为<math>J(z)</math>,将函数作用在最后一层神经元的输出时会产生值<math>F(X)</math>。对于中间层,我们也会为此选择我们的激励函数<math>f^{(l)}</math>。 [原文] Using this method, we can easily compute derivatives with respect to the inputs <math>X</math>, as well as derivatives with respect to any of the weights in the network, as we shall see later. [初译] 使用这种方法,我们可以很容易的计算出关于输入<math>X</math>和关于网络中任意权重的导数,之后我们会看到。 [一审] 之后我们会看到,使用这种方法,我们可以很容易计算出对于输入<math>X</math>和网络中任意权重的导数。 [原文] == Examples == To illustrate the use of the backpropagation idea to compute derivatives with respect to the inputs, we will use two functions from the section on [[Sparse Coding: Autoencoder Interpretation | sparse coding]], in examples 1 and 2. In example 3, we use a function from [[Independent Component Analysis | independent component analysis]] to illustrate the use of this idea to compute derivates with respect to weights, and in this specific case, what to do in the case of tied or repeated weights. [初译] 实例 为了描述如何使用反向传播思想计算关于输入的导数,我们要在例1,例2中用到稀疏编码一节中的两个函数。在例3中,我们使用一个独立成分分析一节中的函数来描述使用此思想计算关于权重的偏导的方法,以及在这种特殊情况下,如何处理绑定或重复的权重的情况。 [一审] 为了描述如何使用反向传播思想计算对于输入的导数,我们在例1,例2中用到稀疏编码一节中的两个函数。在例3中,我们使用一个独立成分分析一节中的函数来描述如何使用此思想计算对于权重的偏导,以及在这个特定例子中,如何处理相同或重复的权重的情况。 [原文] === Example 1: Objective for weight matrix in sparse coding === Recall for [[Sparse Coding: Autoencoder Interpretation | sparse coding]], the objective function for the weight matrix <math>A</math>, given the feature matrix <math>s</math>: :<math>F(A; s) = \lVert As - x \rVert_2^2 + \gamma \lVert A \rVert_2^2</math> [初译] 例1:稀疏编码中权矩阵的目标 回想稀疏编码一节中权矩阵<math>A</math>的目标函数,给定特征矩阵<math>s</math>: :<math>F(A; s) = \lVert As - x \rVert_2^2 + \gamma \lVert A \rVert_2^2</math> [一审] 例1:对稀疏编码中权重矩阵的目标函数 回顾稀疏编码一节中给定特征矩阵<math>s</math>,对权重矩阵<math>A</math>的目标函数,: :<math>F(A; s) = \lVert As - x \rVert_2^2 + \gamma \lVert A \rVert_2^2</math> [原文] We would like to find the gradient of <math>F</math> with respect to <math>A</math>, or in symbols, <math>\nabla_A F(A)</math>. Since the objective function is a sum of two terms in <math>A</math>, the gradient is the sum of gradients of each of the individual terms. The gradient of the second term is trivial, so we will consider the gradient of the first term instead. [初译] 我们希望求<math>F</math>关于<math>A</math>的梯度,即<math>\nabla_A F(A)</math>。因为目标函数是关于<math>A</math>的两项之和,所以它的梯度是各项梯度的和。第二项的梯度是显而易见的,因此我们只考虑第一项的梯度。 [一审] 我们希望求<math>F</math>对于<math>A</math>的梯度,即<math>\nabla_A F(A)</math> 。因为目标函数是两个含<math>A</math>的式子之和,所以它的梯度是每个式子的梯度之和。第二项的梯度很容易求,因此我们只考虑第一项的梯度。 [原文] The first term, <math>\lVert As - x \rVert_2^2</math>, can be seen as an instantiation of neural network taking <math>s</math> as an input, and proceeding in four steps, as described and illustrated in the paragraph and diagram below: <ol> <li>Apply <math>A</math> as the weights from the first layer to the second layer. <li>Subtract <math>x</math> from the activation of the second layer, which uses the identity activation function. <li>Pass this unchanged to the third layer, via identity weights. Use the square function as the activation function for the third layer. <li>Sum all the activations of the third layer. </ol> [[File:Backpropagation Method Example 1.png | 400px]] [初译] 第一项,<math>\lVert As - x \rVert_2^2</math> ,可以看成一个具体的用<math>s</math>做输入的神经网络,下面描述接下来四步: <ol> <li>把<math>A</math>作为第一层到第二层的权重。 <li>将第二层的激励减<math>x</math> ,它使用了恒等激励函数。 <li>通过单位权重将结果不变地传到第三层。在第三层使用平方函数作为激励函数。 <li>将第三层的所有激励相加。 </ol> [一审] 第一项,<math>\lVert As - x \rVert_2^2</math>,可以看成一个用<math>s</math>做输入的神经网络的实例,然后进行如下文字描述并图表示意的四步: <ol> <li>把<math>A</math>作为第一层到第二层的权重。 <li>将第二层的激励减<math>x</math>,第二层使用了恒等激励函数。 <li>通过恒等权重将结果不变地传到第三层。在第三层使用平方函数作为激励函数。 <li>将第三层的所有激励相加。 </ol> [原文] The weights and activation functions of this network are as follows: <table align="center"> <tr><th width="50px">Layer</th><th width="200px">Weight</th><th width="200px">Activation function <math>f</math></th></tr> <tr> <td>1</td> <td><math>A</math></td> <td><math>f(z_i) = z_i</math> (identity)</td> </tr> <tr> <td>2</td> <td><math>I</math> (identity)</td> <td><math>f(z_i) = z_i - x_i</math></td> </tr> <tr> <td>3</td> <td>N/A</td> <td><math>f(z_i) = z_i^2</math></td> </tr> </table> To have <math>J(z^{(3)}) = F(x)</math>, we can set <math>J(z^{(3)}) = \sum_k J(z^{(3)}_k)</math>.
Template:Languages
(
view source
)
Return to
用反向传导思想求导
.
Views
Page
Discussion
View source
History
Personal tools
Log in
ufldl resources
UFLDL Tutorial
Recommended Readings
wiki
Main page
Recent changes
Random page
Help
Search
Toolbox
What links here
Related changes
Special pages