用反向传导思想求导

From Ufldl

Jump to: navigation, search
Line 1: Line 1:
== 简介 ==
== 简介 ==
在[[ 反向传导算法 | 反向传导算法 ]]一节中,我们介绍了在稀疏自编码器中用反向传导算法来求梯度的方法。事实证明,反向传导算法与矩阵运算相结合的方法,对于计算复杂矩阵函数(从矩阵到实数的函数,或用符号表示为:从 <math>\mathbb{R}^{r \times c} \rightarrow \mathbb{R}</math> )的梯度是十分强大和直观的。
在[[ 反向传导算法 | 反向传导算法 ]]一节中,我们介绍了在稀疏自编码器中用反向传导算法来求梯度的方法。事实证明,反向传导算法与矩阵运算相结合的方法,对于计算复杂矩阵函数(从矩阵到实数的函数,或用符号表示为:从 <math>\mathbb{R}^{r \times c} \rightarrow \mathbb{R}</math> )的梯度是十分强大和直观的。
 +
首先,我们回顾一下反向传导的思想,为了更适合我们的目的,将其稍作修改呈现于下:
首先,我们回顾一下反向传导的思想,为了更适合我们的目的,将其稍作修改呈现于下:
Line 23: Line 24:
</math>
</math>
</ol>
</ol>
 +
符号扼要重述:
符号扼要重述:
Line 34: Line 36:
<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> 以及网络中任意一个权重的导数。
稍后我们会看到,使用这种方法,我们可以很容易计算出对于输入 <math>X</math> 以及网络中任意一个权重的导数。
 +
== 示例 ==
== 示例 ==
-
为了阐述如何使用反向传导思想计算关于输入的导数,我们要在示例1,示例2中用[[ 稀疏编码自编码表达 | 稀疏编码 ]]章节中的两个函数。在示例3中,我们使用[[ 独立成分分析 | 独立成分分析 ]]一节中的一个函数来说明使用此思想计算关于权重的偏导的方法,以及在这种特殊情况下,如何处理相互捆绑或重复的权重。
+
 
 +
为了阐述如何使用反向传导思想计算关于输入的导数,我们要在示例1,示例2中用 [[ 稀疏编码自编码表达 | 稀疏编码 ]] 章节中的两个函数。在示例3中,我们使用[[ 独立成分分析 | 独立成分分析 ]]一节中的一个函数来说明使用此思想计算关于权重的偏导的方法,以及在这种特殊情况下,如何处理相互捆绑或重复的权重。
 +
 
=== 示例1:稀疏编码中权重矩阵的目标函数 ===
=== 示例1:稀疏编码中权重矩阵的目标函数 ===
 +
回顾一下[[ 稀疏编码自编码表达 | 稀疏编码 ]],当给定特征矩阵 <math>s</math> 时,权重矩阵 <math>A</math> 的目标函数为:
回顾一下[[ 稀疏编码自编码表达 | 稀疏编码 ]],当给定特征矩阵 <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>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> 的式子之和,所以它的梯度是每个式子的梯度之和。第二项的梯度很容易求,因此我们只考虑第一项的梯度。
 +
第一项, <math>\lVert As - x \rVert_2^2</math> ,可以看成一个用 <math>s</math> 做输入的神经网络的实例,通过四步进行计算,文字以及图形描述如下:
第一项, <math>\lVert As - x \rVert_2^2</math> ,可以看成一个用 <math>s</math> 做输入的神经网络的实例,通过四步进行计算,文字以及图形描述如下:
Line 59: Line 70:
[[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 92:
</tr>
</tr>
</table>
</table>
 +
为了使 <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> 就很容易求了——使用反向传导得到:
一旦我们将 <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 118:
</tr>
</tr>
</table>
</table>
 +
 +
因此
因此
 +
:<math>
:<math>
\begin{align}
\begin{align}
Line 110: Line 128:
\end{align}
\end{align}
</math>
</math>
 +
=== 示例2:稀疏编码中的平滑地形L1稀疏罚函数 ===
=== 示例2:稀疏编码中的平滑地形L1稀疏罚函数 ===
 +
回顾[[ 稀疏编码自编码表达 | 稀疏编码 ]]一节中对 <math>s</math> 的平滑地形L1稀疏罚函数:
回顾[[ 稀疏编码自编码表达 | 稀疏编码 ]]一节中对 <math>s</math> 的平滑地形L1稀疏罚函数:
 +
:<math>\sum{ \sqrt{Vss^T + \epsilon} }</math>
:<math>\sum{ \sqrt{Vss^T + \epsilon} }</math>
 +
其中 <math>V</math> 是分组矩阵, <math>s</math> 是特征矩阵, <math>\epsilon</math> 是一个常数。
其中 <math>V</math> 是分组矩阵, <math>s</math> 是特征矩阵, <math>\epsilon</math> 是一个常数。
Line 119: Line 141:
[[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 168:
</tr>
</tr>
</table>
</table>
 +
 +
为使 <math>J(z^{(4)}) = F(x)</math> ,我们可令 <math>J(z^{(4)}) = \sum_k J(z^{(4)}_k)</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> 变得很容易计算——使用反向传导得到:
一旦我们把 <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 202:
</tr>
</tr>
</table>
</table>
 +
 +
因此
因此
 +
:<math>
:<math>
\begin{align}
\begin{align}
Line 183: Line 213:
\end{align}
\end{align}
</math>
</math>
 +
=== 示例3:ICA重建代价 ===
=== 示例3:ICA重建代价 ===
-
回顾[[ 独立成分分析 | 独立成分分析(ICA) ]]一节重建代价一项: <math>\lVert W^TWx - x \rVert_2^2</math> ,其中 <math>W</math> 是权重矩阵, <math>x</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> ——对于'''权重矩阵'''的导数,而不是像前两例中对于'''输入'''的导数。不过我们仍然用类似的方法处理,把该项看做一个神经网络的实例:
我们希望计算 <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 249:
</tr>
</tr>
</table>
</table>
 +
为使 <math>J(z^{(4)}) = F(x)</math> ,我们可令 <math>J(z^{(4)}) = \sum_k J(z^{(4)}_k)</math> 。
为使 <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:
既然我们可将 <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 250: Line 286:
对于 <math>W^T</math> :
对于 <math>W^T</math> :
 +
:<math>
:<math>
\begin{align}
\begin{align}
Line 258: Line 295:
对于 <math>W</math> :
对于 <math>W</math> :
 +
:<math>
:<math>
\begin{align}
\begin{align}
Line 266: Line 304:
最后进行求和,得到对于 <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 311:
\end{align}
\end{align}
</math>
</math>
 +
 +
 +
 +
==中文译者==
 +
 +
@达博西, @一碗热翔喜当爹, 李良玥(jackiey99@gmail.com), 王方(fangkey@gmail.com) 
 +
 +
王方(fangkey@gmail.com),林锋(xlfg@yeah.net),许利杰(csxulijie@gmail.com)

Revision as of 04:08, 29 March 2013

Personal tools