用反向传导思想求导

From Ufldl

Jump to: navigation, search
Line 11: Line 11:
         J(z^{(n_l)})
         J(z^{(n_l)})
</math>
</math>
-
,其中<math>J(z)</math>是我们的“目标函数”(稍后解释)。
+
其中<math>J(z)</math>是我们的“目标函数”(稍后解释)。
<li>对<math>l = n_l-1, n_l-2, n_l-3, \ldots, 2</math>,                                                 
<li>对<math>l = n_l-1, n_l-2, n_l-3, \ldots, 2</math>,                                                 
:对第<math>l</math>层中的每个节点<math>i</math>, 令  
:对第<math>l</math>层中的每个节点<math>i</math>, 令  
Line 36: Line 36:
</ul>
</ul>
-
[原文]
+
假设我们有一个函数<math>F</math><math>F</math>以矩阵<math>X</math>为参数生成一个实数。我们希望用反向传导思想计算<math>F</math>关于<math>X</math>的梯度,即 <math>\nabla_X F</math>。大致思路是将函数<math>F</math>看成一个多层神经网络,并使用反向传导思想求梯度。
-
 
+
-
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>J(z)</math>,当计算最后一层神经元的输出时,会产生值<math>F(X)</math>。对于中间层,我们将选择激励函数<math>f^{(l)}</math>
-
[一审]
+
稍后我们会看到,使用这种方法,我们可以很容易计算出对于输入<math>X</math>以及网络中任意一个权重的导数。
-
假设我们有一个函数<math>F</math>,<math>F</math>以矩阵<math>X</math>为参数得到一个实数。我们希望用反向传导思想计算<math>F</math>关于<math>X</math>的梯度,即 <math>\nabla_X F</math>。大致思路是将函数<math>F</math>看成一个多层神经网络,并使用反向传导思想求梯度。
+
== 示例 ==
 +
为了阐述如何使用反向传导思想计算关于输入的导数,我们要在示例1,示例2中用[[Sparse Coding: Autoencoder Interpretation | sparse coding]]一节中的两个函数。在示例3中,我们使用[[Independent Component Analysis | independent component analysis]]一节中的一个函数来说明使用此思想计算关于权重的偏导的方法,以及在这种特殊情况下,如何处理相同或重复的权重的情况
[原文]
[原文]
-
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.
+
=== 示例1:稀疏编码中权重矩阵的目标函数 ===
-
 
+
回顾[[Sparse Coding: Autoencoder Interpretation | sparse coding]]一节中,给定特征矩阵<math>s</math>,权重矩阵<math>A</math>的目标函数为:
-
[初译]
+
-
 
+
-
为了实现这个想法,我们取目标函数为<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 [例1:对稀疏编码中权重矩阵的目标函数]===
+
-
 
+
-
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>
:<math>F(A; s) = \lVert As - x \rVert_2^2 + \gamma \lVert A \rVert_2^2</math>
-
[初译]
+
我们希望求<math>F</math>对于<math>A</math>的梯度,即<math>\nabla_A F(A)</math>。因为目标函数是两个含<math>A</math>的式子之和,所以它的梯度是每个式子的梯度之和。第二项的梯度很容易求,因此我们只考虑第一项的梯度。
-
例1:稀疏编码中权矩阵的目标
+
第一项,<math>\lVert As - x \rVert_2^2</math>,可以看成一个用<math>s</math>做输入的神经网络的实例,通过四步进行计算,文字以及图形描述如下:
-
 
+
-
回想稀疏编码一节中权矩阵<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>
<ol>
<li>把<math>A</math>作为第一层到第二层的权重。
<li>把<math>A</math>作为第一层到第二层的权重。
-
<li>将第二层的激励减<math>x</math> ,它使用了恒等激励函数。
+
<li>将第二层的激励减<math>x</math>,第二层使用了单位激励函数。
<li>通过单位权重将结果不变地传到第三层。在第三层使用平方函数作为激励函数。
<li>通过单位权重将结果不变地传到第三层。在第三层使用平方函数作为激励函数。
<li>将第三层的所有激励相加。
<li>将第三层的所有激励相加。
</ol>
</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>
+
-
 
+
-
[原文]
+
-
 
+
-
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>.
+
-
 
+
-
[初译]
+
-
 
+
-
该网络的权重和激励函数如下表所示:
+
<table align="center">
<table align="center">
<tr><th width="50px">层</th><th width="200px">权重</th><th width="200px">激励函数 <math>f</math></th></tr>
<tr><th width="50px">层</th><th width="200px">权重</th><th width="200px">激励函数 <math>f</math></th></tr>
Line 187: Line 69:
<td>1</td>
<td>1</td>
<td><math>A</math></td>
<td><math>A</math></td>
-
<td><math>f(z_i) = z_i</math> (恒等)</td>
+
<td><math>f(z_i) = z_i</math> (单位函数)</td>
</tr>
</tr>
<tr>
<tr>
<td>2</td>
<td>2</td>
-
<td><math>I</math> (单位阵)</td>
+
<td><math>I</math> (单位向量)</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>
+
-
为了使<math>J(z^{(3)}) = F(x)</math>,我们可令<math>J(z^{(3)}) = \sum_k J(z^{(3)}_k)</math> 。
+
-
 
+
-
[一审]
+
-
 
+
-
该网络的权重和激励函数如下表所示:
+
-
<table align="center">
+
-
<tr><th width="50px">层</th><th width="200px">权重</th><th width="200px">激励函数 <math>f</math></th></tr>
+
-
<tr>
+
-
<td>1</td>
+
-
<td><math>A</math></td>
+
-
<td><math>f(z_i) = z_i</math> (恒等)</td>
+
-
</tr>
+
-
<tr>
+
-
<td>2</td>
+
-
<td><math>I</math> (单位阵)</td>
+
<td><math>f(z_i) = z_i - x_i</math></td>
<td><math>f(z_i) = z_i - x_i</math></td>
</tr>
</tr>
Line 225: Line 84:
为了使<math>J(z^{(3)}) = F(x)</math>,我们可令<math>J(z^{(3)}) = \sum_k J(z^{(3)}_k)</math>。
为了使<math>J(z^{(3)}) = F(x)</math>,我们可令<math>J(z^{(3)}) = \sum_k J(z^{(3)}_k)</math>。
-
[原文]
+
一旦我们将<math>F</math>看成神经网络,梯度<math>\nabla_X F</math>就很容易求了——用反向传导得到:
-
 
+
-
Once we see <math>F</math> as a neural network, the gradient <math>\nabla_X F</math> becomes easy to compute - applying backpropagation yields:
+
-
<table align="center">
+
-
<tr><th width="50px">Layer</th><th width="200px">Derivative of activation function <math>f'</math></th><th width="200px">Delta</th><th>Input <math>z</math> to this layer</th></tr>
+
-
<tr>
+
-
<td>3</td>
+
-
<td><math>f'(z_i) = 2z_i</math></td>
+
-
<td><math>f'(z_i) = 2z_i</math></td>
+
-
<td><math>As - x</math></td>
+
-
</tr>
+
-
<tr>
+
-
<td>2</td>
+
-
<td><math>f'(z_i) = 1</math></td>
+
-
<td><math>\left( I^T \delta^{(3)} \right) \bullet 1</math></td>
+
-
<td><math>As</math></td>
+
-
</tr>
+
-
<tr>
+
-
<td>1</td>
+
-
<td><math>f'(z_i) = 1</math></td>
+
-
<td><math>\left( A^T \delta^{(2)} \right) \bullet 1</math></td>
+
-
<td><math>s</math></td>
+
-
</tr>
+
-
</table>
+
-
 
+
-
Hence,
+
-
:<math>
+
-
\begin{align}
+
-
\nabla_X F & = A^T I^T 2(As - x) \\
+
-
& = A^T 2(As - x)
+
-
\end{align}
+
-
</math>
+
-
 
+
-
[初译]
+
-
 
+
-
一旦我们将<math>F</math>看成神经网络,梯度<math>\nabla_X F</math>就变得容易求了——用反向传导产生:
+
-
<table align="center">
+
-
<tr><th width="50px">层</th><th width="200px">激励函数的导数<math>f'</math></th><th width="200px">Delta</th><th>该层输入<math>z</math></th></tr>
+
-
<tr>
+
-
<td>3</td>
+
-
<td><math>f'(z_i) = 2z_i</math></td>
+
-
<td><math>f'(z_i) = 2z_i</math></td>
+
-
<td><math>As - x</math></td>
+
-
</tr>
+
-
<tr>
+
-
<td>2</td>
+
-
<td><math>f'(z_i) = 1</math></td>
+
-
<td><math>\left( I^T \delta^{(3)} \right) \bullet 1</math></td>
+
-
<td><math>As</math></td>
+
-
</tr>
+
-
<tr>
+
-
<td>1</td>
+
-
<td><math>f'(z_i) = 1</math></td>
+
-
<td><math>\left( A^T \delta^{(2)} \right) \bullet 1</math></td>
+
-
<td><math>s</math></td>
+
-
</tr>
+
-
</table>
+
-
因此
+
-
 
+
-
:<math>
+
-
\begin{align}
+
-
\nabla_X F & = A^T I^T 2(As - x) \\
+
-
& = A^T 2(As - x)
+
-
\end{align}
+
-
</math>
+
-
 
+
-
[一审]
+
-
 
+
-
一旦我们将<math>F</math>看成神经网络,梯度<math>\nabla_X F</math>就变得容易求了——用反向传导得到:
+
<table align="center">
<table align="center">
<tr><th width="50px">层</th><th width="200px">激励函数的导数<math>f'</math></th><th width="200px">Delta</th><th>该层输入<math>z</math></th></tr>
<tr><th width="50px">层</th><th width="200px">激励函数的导数<math>f'</math></th><th width="200px">Delta</th><th>该层输入<math>z</math></th></tr>

Revision as of 17:26, 15 March 2013

Personal tools