用反向传导思想求导
From Ufldl
(→示例) |
|||
Line 1: | Line 1: | ||
== 简介 == | == 简介 == | ||
- | 在[[ 反向传导算法 | 反向传导算法 ]]一节中,我们介绍了在稀疏自编码器中用反向传导算法来求梯度的方法。事实证明,反向传导算法与矩阵运算相结合的方法,对于计算复杂矩阵函数(从矩阵到实数的函数,或用符号表示为:从<math>\mathbb{R}^{r \times c} \rightarrow \mathbb{R}</math>)的梯度是十分强大和直观的。 | + | |
+ | 在[[ 反向传导算法 | 反向传导算法 ]]一节中,我们介绍了在稀疏自编码器中用反向传导算法来求梯度的方法。事实证明,反向传导算法与矩阵运算相结合的方法,对于计算复杂矩阵函数(从矩阵到实数的函数,或用符号表示为:从 <math>\mathbb{R}^{r \times c} \rightarrow \mathbb{R}</math> )的梯度是十分强大和直观的。 | ||
+ | |||
首先,我们回顾一下反向传导的思想,为了更适合我们的目的,将其稍作修改呈现于下: | 首先,我们回顾一下反向传导的思想,为了更适合我们的目的,将其稍作修改呈现于下: | ||
<ol> | <ol> | ||
- | <li>对第<math>n_l</math>层(最后一层)中的每一个输出单元<math>i</math>,令 | + | <li>对第 <math>n_l</math> 层(最后一层)中的每一个输出单元 <math>i</math> ,令 |
:<math> | :<math> | ||
\delta^{(n_l)}_i | \delta^{(n_l)}_i | ||
Line 10: | Line 12: | ||
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> , 令 |
::<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) | \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) | ||
Line 23: | Line 25: | ||
</math> | </math> | ||
</ol> | </ol> | ||
+ | |||
符号扼要重述: | 符号扼要重述: | ||
<ul> | <ul> | ||
- | <li><math>l</math>是神经网络的层数 | + | <li><math>l</math> 是神经网络的层数 |
- | <li><math>n_l</math>第l层神经元的个数 | + | <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>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>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^{(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>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>层中各单元的激励函数 | + | <li><math>f^{(l)}</math> 是第 <math>l</math> 层中各单元的激励函数 |
</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>看成一个多层神经网络,并使用反向传导思想求梯度。 | + | 假设我们有一个函数 <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>J(z)</math> ,当计算最后一层神经元的输出时,会产生值 <math>F(X)</math> 。对于中间层,我们将选择激励函数 <math>f^{(l)}</math> 。 |
+ | |||
+ | 稍后我们会看到,使用这种方法,我们可以很容易计算出对于输入 <math>X</math> 以及网络中任意一个权重的导数。 | ||
- | |||
== 示例 == | == 示例 == | ||
- | 为了阐述如何使用反向传导思想计算关于输入的导数,我们要在示例1,示例2中用[[ 稀疏编码自编码表达 | | + | |
+ | 为了阐述如何使用反向传导思想计算关于输入的导数,我们要在示例1,示例2中用 [[ 稀疏编码自编码表达 | 稀疏编码 ]] 章节中的两个函数。在示例3中,我们使用[[ 独立成分分析 | 独立成分分析 ]]一节中的一个函数来说明使用此思想计算关于权重的偏导的方法,以及在这种特殊情况下,如何处理相互捆绑或重复的权重。 | ||
+ | |||
=== 示例1:稀疏编码中权重矩阵的目标函数 === | === 示例1:稀疏编码中权重矩阵的目标函数 === | ||
- | + | ||
+ | 回顾一下[[ 稀疏编码自编码表达 | 稀疏编码 ]],当给定特征矩阵 <math>s</math> 时,权重矩阵 <math>A</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>\lVert As - x \rVert_2^2</math>,可以看成一个用<math>s</math>做输入的神经网络的实例,通过四步进行计算,文字以及图形描述如下: | + | 我们希望求 <math>F</math> 对于 <math>A</math> 的梯度,即 <math>\nabla_A F(A)</math> 。因为目标函数是两个含 <math>A</math> 的式子之和,所以它的梯度是每个式子的梯度之和。第二项的梯度很容易求,因此我们只考虑第一项的梯度。 |
+ | |||
+ | |||
+ | 第一项, <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>将第三层的所有激励相加。 | ||
Line 59: | Line 69: | ||
[[File:Backpropagation Method Example 1.png | 400px]] | [[File:Backpropagation Method Example 1.png | 400px]] | ||
+ | |||
该网络的权重和激励函数如下表所示: | 该网络的权重和激励函数如下表所示: | ||
+ | |||
<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 79: | Line 91: | ||
</tr> | </tr> | ||
</table> | </table> | ||
- | |||
- | 一旦我们将<math>F</math>看成神经网络,梯度<math>\nabla_X F</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> 就很容易求了——使用反向传导得到: | ||
+ | |||
<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> | ||
Line 103: | Line 117: | ||
</tr> | </tr> | ||
</table> | </table> | ||
+ | |||
+ | |||
因此 | 因此 | ||
+ | |||
:<math> | :<math> | ||
\begin{align} | \begin{align} | ||
Line 110: | Line 127: | ||
\end{align} | \end{align} | ||
</math> | </math> | ||
+ | |||
=== 示例2:稀疏编码中的平滑地形L1稀疏罚函数 === | === 示例2:稀疏编码中的平滑地形L1稀疏罚函数 === | ||
- | 回顾[[ | + | |
+ | 回顾[[ 稀疏编码自编码表达 | 稀疏编码 ]]一节中对 <math>s</math> 的平滑地形L1稀疏罚函数: | ||
+ | |||
:<math>\sum{ \sqrt{Vss^T + \epsilon} }</math> | :<math>\sum{ \sqrt{Vss^T + \epsilon} }</math> | ||
- | |||
- | 我们希望求得<math>\nabla_s \sum{ \sqrt{Vss^T + \epsilon} }</math> 。像上面那样,我们把这一项看做一个神经网络的实例: | + | 其中 <math>V</math> 是分组矩阵, <math>s</math> 是特征矩阵, <math>\epsilon</math> 是一个常数。 |
+ | |||
+ | 我们希望求得 <math>\nabla_s \sum{ \sqrt{Vss^T + \epsilon} }</math> 。像上面那样,我们把这一项看做一个神经网络的实例: | ||
[[File:Backpropagation Method Example 2.png | 600px]] | [[File:Backpropagation Method Example 2.png | 600px]] | ||
+ | |||
该网络的权重和激励函数如下表所示: | 该网络的权重和激励函数如下表所示: | ||
+ | |||
<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 144: | Line 167: | ||
</tr> | </tr> | ||
</table> | </table> | ||
- | |||
- | 一旦我们把<math>F</math>看做一个神经网络,梯度<math>\nabla_X F</math> 变得很容易计算——使用反向传导得到: | + | |
+ | 为使 <math>J(z^{(4)}) = F(x)</math> ,我们可令 <math>J(z^{(4)}) = \sum_k J(z^{(4)}_k)</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> | <tr><th width="50px">层</th><th width="200px">激励函数的导数 <math>f'</math> | ||
Line 175: | Line 201: | ||
</tr> | </tr> | ||
</table> | </table> | ||
+ | |||
+ | |||
因此 | 因此 | ||
+ | |||
:<math> | :<math> | ||
\begin{align} | \begin{align} | ||
Line 183: | Line 212: | ||
\end{align} | \end{align} | ||
</math> | </math> | ||
+ | |||
=== 示例3:ICA重建代价 === | === 示例3:ICA重建代价 === | ||
- | |||
- | 我们希望计算 <math>\nabla_W \lVert W^TWx - x \rVert_2^2</math>——对于'''权重矩阵'''的导数,而不是像前两例中对于'''输入'''的导数。不过我们仍然用类似的方法处理,把该项看做一个神经网络的实例: | + | 回顾 [[ 独立成分分析 | 独立成分分析(ICA) ]]一节重建代价一项: <math>\lVert W^TWx - x \rVert_2^2</math> ,其中 <math>W</math> 是权重矩阵, <math>x</math> 是输入。 |
+ | |||
+ | 我们希望计算 <math>\nabla_W \lVert W^TWx - x \rVert_2^2</math> ——对于'''权重矩阵'''的导数,而不是像前两例中对于'''输入'''的导数。不过我们仍然用类似的方法处理,把该项看做一个神经网络的实例: | ||
[[File:Backpropagation Method Example 3.png | 400px]] | [[File:Backpropagation Method Example 3.png | 400px]] | ||
+ | |||
该网络的权重和激励函数如下表所示: | 该网络的权重和激励函数如下表所示: | ||
+ | |||
<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 215: | Line 248: | ||
</tr> | </tr> | ||
</table> | </table> | ||
- | |||
- | 既然我们可将<math>F</math>看做神经网络,我们就能计算出梯度 <math>\nabla_W F</math> 。然而,我们现在面临的难题是<math>W</math> 在网络中出现了两次。幸运的是,可以证明如果<math>W</math> 在网络中出现多次,那么对于<math>W</math> 的梯度是对网络中每个<math>W</math> 实例的梯度的简单相加(你需要自己给出对这一事实的严格证明来说服自己)。知道这一点后,我们将首先计算delta: | + | 为使 <math>J(z^{(4)}) = F(x)</math> ,我们可令 <math>J(z^{(4)}) = \sum_k J(z^{(4)}_k)</math> 。 |
+ | |||
+ | 既然我们可将 <math>F</math> 看做神经网络,我们就能计算出梯度 <math>\nabla_W F</math> 。然而,我们现在面临的难题是 <math>W</math> 在网络中出现了两次。幸运的是,可以证明如果 <math>W</math> 在网络中出现多次,那么对于 <math>W</math> 的梯度是对网络中每个 <math>W</math> 实例的梯度的简单相加(你需要自己给出对这一事实的严格证明来说服自己)。知道这一点后,我们将首先计算delta: | ||
+ | |||
<table align="center"> | <table align="center"> | ||
<tr><th width="50px">层</th><th width="200px">激励函数的导数 <math>f'</math> | <tr><th width="50px">层</th><th width="200px">激励函数的导数 <math>f'</math> | ||
Line 247: | Line 282: | ||
</table> | </table> | ||
- | 为计算对于<math>W</math>的梯度,首先计算对网络中每个<math>W</math>实例的梯度。 | + | 为计算对于 <math>W</math> 的梯度,首先计算对网络中每个 <math>W</math> 实例的梯度。 |
+ | |||
+ | 对于 <math>W^T</math> : | ||
- | |||
:<math> | :<math> | ||
\begin{align} | \begin{align} | ||
Line 257: | Line 293: | ||
</math> | </math> | ||
- | 对于 <math>W</math>: | + | 对于 <math>W</math> : |
+ | |||
:<math> | :<math> | ||
\begin{align} | \begin{align} | ||
Line 265: | Line 302: | ||
</math> | </math> | ||
- | 最后进行求和,得到对于<math>W</math>的最终梯度,注意我们需要对<math>W^T</math>梯度进行转置,来得到关于<math>W</math>的梯度(原谅我在这里稍稍滥用了符号): | + | 最后进行求和,得到对于 <math>W</math> 的最终梯度,注意我们需要对 <math>W^T</math> 梯度进行转置,来得到关于 <math>W</math> 的梯度(原谅我在这里稍稍滥用了符号): |
+ | |||
:<math> | :<math> | ||
\begin{align} | \begin{align} | ||
Line 272: | Line 310: | ||
\end{align} | \end{align} | ||
</math> | </math> | ||
+ | |||
+ | |||
+ | |||
+ | ==中英文对照== | ||
+ | |||
+ | :反向传导 backpropagation | ||
+ | :稀疏编码 sparse coding | ||
+ | :权重矩阵 weight matrix | ||
+ | :目标函数 objective | ||
+ | :平滑地形L1稀疏罚函数 Smoothed topographic L1 sparsity penalty | ||
+ | :重建代价 reconstruction cost | ||
+ | :稀疏自编码器 sparse autoencoder | ||
+ | :梯度 gradient | ||
+ | :神经网络 neural network | ||
+ | :神经元 neuron | ||
+ | :激励 activation | ||
+ | :激励函数 activation function | ||
+ | :独立成分分析 independent component analysis | ||
+ | :单位激励函数 identity activation function | ||
+ | :平方函数 square function | ||
+ | :分组矩阵 grouping matrix | ||
+ | :特征矩阵 feature matrix | ||
+ | |||
+ | |||
+ | |||
+ | ==中文译者== | ||
+ | |||
+ | 葛燕儒(yrgehi@gmail.com), 顾祺龙(ggnle@hotmail.com), 李良玥(jackiey99@gmail.com), 王方(fangkey@gmail.com) | ||
+ | |||
+ | |||
+ | |||
+ | {{Languages|Deriving_gradients_using_the_backpropagation_idea|English}} |