用反向传导思想求导
From Ufldl
for
用反向传导思想求导
Jump to:
navigation
,
search
== 简介 == 在[[ 反向传导算法 | 反向传导算法 ]]一节中,我们介绍了在稀疏自编码器中用反向传导算法来求梯度的方法。事实证明,反向传导算法与矩阵运算相结合的方法,对于计算复杂矩阵函数(从矩阵到实数的函数,或用符号表示为:从 <math>\mathbb{R}^{r \times c} \rightarrow \mathbb{R}</math> )的梯度是十分强大和直观的。 首先,我们回顾一下反向传导的思想,为了更适合我们的目的,将其稍作修改呈现于下: <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> 符号扼要重述: <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> 假设我们有一个函数 <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> 以及网络中任意一个权重的导数。 == 示例 == 为了阐述如何使用反向传导思想计算关于输入的导数,我们要在示例1,示例2中用 [[ 稀疏编码自编码表达 | 稀疏编码 ]] 章节中的两个函数。在示例3中,我们使用[[ 独立成分分析 | 独立成分分析 ]]一节中的一个函数来说明使用此思想计算关于权重的偏导的方法,以及在这种特殊情况下,如何处理相互捆绑或重复的权重。 === 示例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</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> <li>把 <math>A</math> 作为第一层到第二层的权重。 <li>将第二层的激励减 <math>x</math> ,第二层使用了单位激励函数。 <li>通过单位权重将结果不变地传到第三层。在第三层使用平方函数作为激励函数。 <li>将第三层的所有激励相加。 </ol> [[File:Backpropagation Method Example 1.png | 400px]] 该网络的权重和激励函数如下表所示: <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> </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> 。 一旦我们将 <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> === 示例2:稀疏编码中的平滑地形L1稀疏罚函数 === 回顾[[ 稀疏编码自编码表达 | 稀疏编码 ]]一节中对 <math>s</math> 的平滑地形L1稀疏罚函数: :<math>\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]] 该网络的权重和激励函数如下表所示: <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>I</math></td> <td><math>f(z_i) = z_i^2</math></td> </tr> <tr> <td>2</td> <td><math>V</math></td> <td><math>f(z_i) = z_i</math></td> </tr> <tr> <td>3</td> <td><math>I</math></td> <td><math>f(z_i) = z_i + \epsilon</math></td> </tr> <tr> <td>4</td> <td>N/A</td> <td><math>f(z_i) = z_i^{\frac{1}{2}}</math></td> </tr> </table> 为使 <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"> <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>4</td> <td><math>f'(z_i) = \frac{1}{2} z_i^{-\frac{1}{2}}</math></td> <td><math>f'(z_i) = \frac{1}{2} z_i^{-\frac{1}{2}}</math></td> <td><math>(Vss^T + \epsilon)</math></td> </tr> <tr> <td>3</td> <td><math>f'(z_i) = 1</math></td> <td><math>\left( I^T \delta^{(4)} \right) \bullet 1</math></td> <td><math>Vss^T</math></td> </tr> <tr> <td>2</td> <td><math>f'(z_i) = 1</math></td> <td><math>\left( V^T \delta^{(3)} \right) \bullet 1</math></td> <td><math>ss^T</math></td> </tr> <tr> <td>1</td> <td><math>f'(z_i) = 2z_i</math></td> <td><math>\left( I^T \delta^{(2)} \right) \bullet 2s</math></td> <td><math>s</math></td> </tr> </table> 因此 :<math> \begin{align} \nabla_X F & = I^T V^T I^T \frac{1}{2}(Vss^T + \epsilon)^{-\frac{1}{2}} \bullet 2s \\ & = V^T \frac{1}{2}(Vss^T + \epsilon)^{-\frac{1}{2}} \bullet 2s \\ & = V^T (Vss^T + \epsilon)^{-\frac{1}{2}} \bullet s \end{align} </math> === 示例3:ICA重建代价 === 回顾 [[ 独立成分分析 | 独立成分分析(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]] 该网络的权重和激励函数如下表所示: <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>W</math></td> <td><math>f(z_i) = z_i</math></td> </tr> <tr> <td>2</td> <td><math>W^T</math></td> <td><math>f(z_i) = z_i</math></td> </tr> <tr> <td>3</td> <td><math>I</math></td> <td><math>f(z_i) = z_i - x_i</math></td> </tr> <tr> <td>4</td> <td>N/A</td> <td><math>f(z_i) = z_i^2</math></td> </tr> </table> 为使 <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"> <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>4</td> <td><math>f'(z_i) = 2z_i</math></td> <td><math>f'(z_i) = 2z_i</math></td> <td><math>(W^TWx - x)</math></td> </tr> <tr> <td>3</td> <td><math>f'(z_i) = 1</math></td> <td><math>\left( I^T \delta^{(4)} \right) \bullet 1</math></td> <td><math>W^TWx</math></td> </tr> <tr> <td>2</td> <td><math>f'(z_i) = 1</math></td> <td><math>\left( (W^T)^T \delta^{(3)} \right) \bullet 1</math></td> <td><math>Wx</math></td> </tr> <tr> <td>1</td> <td><math>f'(z_i) = 1</math></td> <td><math>\left( W^T \delta^{(2)} \right) \bullet 1</math></td> <td><math>x</math></td> </tr> </table> 为计算对于 <math>W</math> 的梯度,首先计算对网络中每个 <math>W</math> 实例的梯度。 对于 <math>W^T</math> : :<math> \begin{align} \nabla_{W^T} F & = \delta^{(3)} a^{(2)T} \\ & = 2(W^TWx - x) (Wx)^T \end{align} </math> 对于 <math>W</math> : :<math> \begin{align} \nabla_{W} F & = \delta^{(2)} a^{(1)T} \\ & = (W^T)(2(W^TWx -x)) x^T \end{align} </math> 最后进行求和,得到对于 <math>W</math> 的最终梯度,注意我们需要对 <math>W^T</math> 梯度进行转置,来得到关于 <math>W</math> 的梯度(原谅我在这里稍稍滥用了符号): :<math> \begin{align} \nabla_{W} F & = \nabla_{W} F + (\nabla_{W^T} F)^T \\ & = (W^T)(2(W^TWx -x)) x^T + 2(Wx)(W^TWx - x)^T \end{align} </math> ==中文译者== 葛燕儒(yrgehi@gmail.com), 顾祺龙(ggnle@hotmail.com), 李良玥(jackiey99@gmail.com), 王方(fangkey@gmail.com)
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