# 反向传导算法

(Difference between revisions)
 Revision as of 13:32, 30 March 2013 (view source)Kandeng (Talk | contribs) (→中英文对照)← Older edit Revision as of 15:45, 5 April 2013 (view source)Kandeng (Talk | contribs) Newer edit → Line 167: Line 167: ==中英文对照== ==中英文对照== + :反向传播算法 Backpropagation Algorithm :反向传播算法 Backpropagation Algorithm :（批量）梯度下降法 (batch) gradient descent :（批量）梯度下降法 (batch) gradient descent Line 192: Line 193: :阿达马乘积 Hadamard product :阿达马乘积 Hadamard product :前向传播 forward propagation :前向传播 forward propagation + ==中文译者== ==中文译者== 王方（fangkey@gmail.com），林锋（xlfg@yeah.net），许利杰（csxulijie@gmail.com） 王方（fangkey@gmail.com），林锋（xlfg@yeah.net），许利杰（csxulijie@gmail.com）

## Revision as of 15:45, 5 April 2013

\begin{align} J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2. \end{align}

\begin{align} J(W,b) &= \left[ \frac{1}{m} \sum_{i=1}^m J(W,b;x^{(i)},y^{(i)}) \right] + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2 \\ &= \left[ \frac{1}{m} \sum_{i=1}^m \left( \frac{1}{2} \left\| h_{W,b}(x^{(i)}) - y^{(i)} \right\|^2 \right) \right] + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2 \end{align}

[注：通常权重衰减的计算并不使用偏置项 $\textstyle b^{(l)}_i$，比如我们在 $\textstyle J(W, b)$ 的定义中就没有使用。一般来说，将偏置项包含在权重衰减项中只会对最终的神经网络产生很小的影响。如果你在斯坦福选修过CS229（机器学习）课程，或者在YouTube上看过课程视频，你会发现这个权重衰减实际上是课上提到的贝叶斯规则化方法的变种。在贝叶斯规则化方法中，我们将高斯先验概率引入到参数中计算MAP（极大后验）估计（而不是极大似然估计）。]

\begin{align} W_{ij}^{(l)} &= W_{ij}^{(l)} - \alpha \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) \\ b_{i}^{(l)} &= b_{i}^{(l)} - \alpha \frac{\partial}{\partial b_{i}^{(l)}} J(W,b) \end{align}

\begin{align} \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) &= \left[ \frac{1}{m} \sum_{i=1}^m \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x^{(i)}, y^{(i)}) \right] + \lambda W_{ij}^{(l)} \\ \frac{\partial}{\partial b_{i}^{(l)}} J(W,b) &= \frac{1}{m}\sum_{i=1}^m \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x^{(i)}, y^{(i)}) \end{align}

1. 进行前馈传导计算，利用前向传导公式，得到 $\textstyle L_2, L_3, \ldots$ 直到输出层 $\textstyle L_{n_l}$ 的激活值。
2. 对于第 $\textstyle n_l$ 层（输出层）的每个输出单元 $\textstyle i$，我们根据以下公式计算残差：
$\delta^{(n_l)}_i = \frac{\partial}{\partial z^{n_l}_i}J(W,b;x,y) = \frac{\partial}{\partial z^{n_l}_i}\frac{1}{2} \left\|y - h_{W,b}(x)\right\|^2 = - (y_i - a^{(n_l)}_i) \cdot f'(z^{(n_l)}_i)$
3. $\textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2$ 的各个层，第 $\textstyle l$ 层的第 $\textstyle i$ 个节点的残差计算方法如下：
$\delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) f'(z^{(l)}_i)$
[译者注：完整推导过程如下：
$\delta^{(n_{l-1})}_i = \frac{\partial}{\partial z^{n_l-1}_i}J(W,b;x,y) = \frac{\partial}{\partial z^{n_l}_i}J(W,b;x,y)\cdot\frac{\partial z^{n_l}_i}{\partial z^{n_{l-1}}_i}$
$= \delta^{(n_l)}_i\cdot\frac{\partial z^{n_l}_i}{\partial z^{n_{l-1}}_i} = \delta^{(n_l)}_i\cdot\frac{\partial}{\partial z^{n_{l-1}}_i}\sum_{j=1}^{s_{l-1}} W^{n_l-1}_{ji} f(z^{n_l-1}_i) = \left( \sum_{j=1}^{s_{l-1}} W^{n_l-1}_{ji} \delta^{(n_l)}_i \right) f'(z^{n_l-1}_i)$
根据递推过程，将 $\textstyle n_l-1$$\textstyle n_l$ 的关系替换为 $\textstyle l$$\textstyle l+1$ 的关系，可以得到上面的结果：
$\delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) f'(z^{(l)}_i)$
以上的逐步反向递推求导的过程就是“反向传播”算法的本意所在。]
4. 计算我们需要的偏导数，计算方法如下：
\begin{align} \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y) &= a^{(l)}_j \delta_i^{(l+1)} \\ \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y) &= \delta_i^{(l+1)}. \end{align}

1. 进行前馈传导计算，利用前向传导公式，得到 $\textstyle L_2, L_3, \ldots$直到输出层 $\textstyle L_{n_l}$ 的激活值。
2. 对输出层（第 $\textstyle n_l$ 层），计算：
\begin{align} \delta^{(n_l)} = - (y - a^{(n_l)}) \bullet f'(z^{(n_l)}) \end{align}
3. 对于 $\textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2$ 的各层，计算：
\begin{align} \delta^{(l)} = \left((W^{(l)})^T \delta^{(l+1)}\right) \bullet f'(z^{(l)}) \end{align}
4. 计算最终需要的偏导数值：
\begin{align} \nabla_{W^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} (a^{(l)})^T, \\ \nabla_{b^{(l)}} J(W,b;x,y) &= \delta^{(l+1)}. \end{align}

1. 对于所有 $\textstyle l$，令 $\textstyle \Delta W^{(l)} := 0$ , $\textstyle \Delta b^{(l)} := 0$ （设置为全零矩阵或全零向量）
2. 对于 $\textstyle i = 1$$\textstyle m$
1. 使用反向传播算法计算 $\textstyle \nabla_{W^{(l)}} J(W,b;x,y)$$\textstyle \nabla_{b^{(l)}} J(W,b;x,y)$
2. 计算 $\textstyle \Delta W^{(l)} := \Delta W^{(l)} + \nabla_{W^{(l)}} J(W,b;x,y)$
3. 计算 $\textstyle \Delta b^{(l)} := \Delta b^{(l)} + \nabla_{b^{(l)}} J(W,b;x,y)$
3. 更新权重参数：
\begin{align} W^{(l)} &= W^{(l)} - \alpha \left[ \left(\frac{1}{m} \Delta W^{(l)} \right) + \lambda W^{(l)}\right] \\ b^{(l)} &= b^{(l)} - \alpha \left[\frac{1}{m} \Delta b^{(l)}\right] \end{align}

## 中英文对照

（整体）代价函数 (overall) cost function