# 【深度学习之美】BP算法双向传，链式求导最缠绵（入门系列之八）

## 8.1 BP神经网络极简史

### 8.2.1正向传播信息

$$f'(x) = f(x)(1 - f(x))\tag{8.1}$$

$$\begin{array}{l} {f_1}(e) = {f_1}({w_{11}}{x_1} + {w_{21}}{x_2}) \\\\ {\rm{ }} = {f_1}(( - 1) \times 1 + 1 \times ( - 1)) \\\\ {\rm{ }} = {f_1}( - 2) \\\\ {\rm{ }} = \frac{1}{{1 + {e^{ - ( - 2)}}}} \\\\ {\rm{ }} = 0.12 \\\\ \end{array}$$

$$\begin{array}{l} {f_2}(e) = {f_2}({w_{12}}{x_1} + {w_{22}}{x_2}) \\\\ {\rm{ }} = {f_2}(1 \times 1 + 1 \times ( - 1)) \\\\ {\rm{ }} = {f_2}(0) \\\\ {\rm{ }} = \frac{1}{{1 + {e^0}}} \\\\ {\rm{ }} = 0.5\\\\ \end{array}$$

$$\begin{array}{l} {y_1} = {f_3}(e) = {f_3}({w_{13}}{f_1} + {w_{23}}{f_2}) \\\\ {\rm{ }} = {f_3}(1 \times 0.12 + 1 \times 0.5) \\\\ {\rm{ }} = {f_3}(0.62) \\\\ {\rm{ }} = \frac{1}{{1 + {e^{ - 0.62}}}} \\\\ {\rm{ }} = 0.65 \\\\ \end{array}$$

$$\begin{array}{l} {y_2} = {f_4}(e) = {f_4}({w_{14}}{f_1} + {w_{24}}{f_2}) \\\\ {\rm{ }} = {f_4}(( - 1) \times 0.12 + 1 \times 0.5) \\\\ {\rm{ }} = {f_4}(0.38)\\\\ {\rm{ }} = \frac{1}{{1 + {e^{ - 0.38}}}} \\\\ {\rm{ }} = 0.59 \\\\ \end{array}$$

### 8.2.2 求导中的链式法则

（砰！砰！砰！敲黑板！请注意：如下部分是BP算法最为精妙之处，值得细细品味！）

$${f_1} = {x_1}{w_{11}} + {x_2}{w_{21}}\\\\ {f_2} = {x_1}{w_{12}} + {x_2}{w_{22}}$$

$$\begin{array}{l} {f_3} = {f_1}{w_{13}} + {f_2}{w_{23}} \\\\ = ({x_1}{w_{11}} + {x_2}{w_{21}}){w_{13}} + ({x_1}{w_{12}} + {x_2}{w_{22}}){w_{23}} \\\\ = {x_1}{w_{11}}{w_{13}} + {x_2}{w_{21}}{w_{13}} + {x_1}{w_{12}}{w_{23}} + {x_2}{w_{22}}{w_{23}} \\\\ \end{array}$$

$$\begin{array}{l} {f_4} = {f_1}{w_{14}} + {f_2}{w_{24}} \\\\ = ({x_1}{w_{11}} + {x_2}{w_{21}}){w_{14}} + ({x_1}{w_{12}} + {x_2}{w_{22}}){w_{24}} \\\\ = {x_1}{w_{11}}{w_{14}} + {x_2}{w_{21}}{w_{14}} + {x_1}{w_{12}}{w_{24}} + {x_2}{w_{22}}{w_{24}} \\\\ \end{array}$$

$$L({w_{11}},{w_{12}},...,{w_{ij}},...,{w_{mn}}) \\\\ = \frac{1}{2}{({y_i} - {f_i}({w_{11}},{w_{12}},...,{w_{ij}},...,{w_{mn}}))^2}\tag{8.2}$$

$$\begin{array}{l} \nabla L = (\frac{{\partial L}}{{\partial {w_{11}}}},\frac{{\partial L}}{{\partial {w_{12}}}},...,\frac{{\partial L}}{{\partial {w_{mn}}}}) \\\\ {\rm{ }} = \frac{{\partial L}}{{\partial {w_{11}}}}{e_{11}} + \frac{{\partial L}}{{\partial {w_{12}}}}{e_{12}} + ... + \frac{{\partial L}}{{\partial {w_{mn}}}}{e_{mn}} \\\\ \end{array}\tag{8.3}$$

BP算法之所以经典，部分原因在于，它是求解这类“层层累进”的复合函数偏导数的利器。为啥这么说呢？下面，我们就列举一个更为简化但不失一般性的例子来说明这个观点（以下案例参考了Chris Olah的博客文章[3]）。

$$\frac{{\partial c}}{{\partial a}} = \frac{{\partial (a + b)}}{{\partial a}} = \frac{{\partial a}}{{\partial a}} + \frac{{\partial b}}{{\partial a}} = 1$$

$$\frac{\partial }{{\partial u}}uv = u\frac{{\partial v}}{{\partial u}} + v\frac{{\partial u}}{{\partial u}} = v$$

$$\frac{{\partial e}}{{\partial a}} = \frac{{\partial e}}{{\partial c}} \cdot \frac{{\partial c}}{{\partial a}} = d \times 1 = 2 \times 1 = 2$$

$a$对$e$的“影响”属于单路径的影响，还比较容易求得，但这并不是我们关注的重点。因为在神经网络中，神经元对神经元的连接，阡陌纵横，其影响也是通过多条路径“交织”在一起的。在图8-9中，我们研究一下$b$对$e$的影响，就能比较好理解这一工作机理。显然，$b$对$e$的影响，也可表达为一个偏导关系：

$$\begin{array}{l} \frac{{\partial e}}{{\partial b}} = \frac{{\partial cd}}{{\partial b}} = d\frac{{\partial c}}{{\partial b}} + c\frac{{\partial d}}{{\partial b}} \\\\ = d \times 1 + c \times 1 \\\\ = 2 \times 1 + 3 \times 1 \\\\ = 5 \\\\ \end{array}$$

$$\begin{array}{l} \frac{{\partial Z}}{{\partial X}} = (\alpha \delta + \alpha \varepsilon + \alpha \xi ) + \\\\ {\rm{ (}}\beta \delta + \beta \varepsilon + \beta \xi ) + \\\\ {\rm{ (}}\chi \delta + \chi \varepsilon + \chi \xi ) \\\\ \end{array}\tag{8.4}$$

$$\frac{{\partial Z}}{{\partial X}} = (\alpha + \beta + \xi )(\delta + \varepsilon + \xi )\tag{8.5}$$

$$\frac{{\partial Z}}{{\partial Y}} = \delta + \varepsilon + \xi$$

$$\frac{{\partial {\rm{Z}}}}{{\partial X}} = \frac{{\partial {\rm{Z}}}}{{\partial Y}}\frac{{\partial Y}}{{\partial X}} = (\delta + \varepsilon + \xi )(\alpha + \beta + \chi )$$

$$\frac{{\partial e}}{{\partial b}} = 0 \times 1 \times 1 \times 2 = 0$$

$$\frac{{\partial e}}{{\partial b}} = 1 \times 1 \times 1 \times 2 = 2$$

$$\frac{{\partial e}}{{\partial b}} = 1 \times 1 \times 1 \times 3 = 3$$

$$\frac{{\partial e}}{{\partial c}} = \frac{{\partial (c \times d)}}{{\partial c}} = d = 2$$

$$\frac{{\partial e}}{{\partial d}} = \frac{{\partial (c \times d)}}{{\partial d}} = c = 3$$

### 8.2.3 误差反向传播

$$\Delta {w_{ji}} = - \eta \frac{{\partial {L_d}}}{{\partial {w_{ji}}}}\tag{8.6}$$

$${L_d}(w) = \frac{1}{2}\sum\limits_{j \in outputs} {({y_j} - y_{j}^{'}} {)^2}\tag{8.7}$$

$y_j$表示的是第$j$个神经单元的预期输出值。
$y^{'}_{j}$表示的$j$个神经单元的实际输出值。
$outputs$的范围是网络最后一层的神经元集合。

$$\begin{array}{l} \frac{{\partial {L_d}}}{{\partial {w_{ji}}}} = \frac{{\partial {L_d}}}{{\partial ne{t_j}}}\frac{{\partial ne{t_j}}}{{\partial {w_{ji}}}} \\ {\rm{ }} = \frac{{\partial {L_d}}}{{\partial ne{t_j}}}{x_{ji}} \\ \end{array}\tag{8.8}$$

（1）在输出层，对第$i$个神经元而言，省略部分推导过程，公式（8.8）的左侧第一项为：

$$\frac{{\partial {L_d}}}{{\partial ne{t_j}}} = ({y_j} - y_{j}^{'})y_{j}^{'}(1 - y_{j}^{'})\tag{8.9}$$

$$\delta _{j}^{(1)} = \frac{{\partial {L_d}}}{{\partial ne{t_j}}} \tag{8.10}$$

（2）对隐含层神经元$j$的梯度法则（省略了部分推导过程），有：

$f_j$表示神经单元$j$的计算输出。
$net_j$表示的是神经单元$j$的加权之和。
$Downstream(j)$表示的是在网络中神经单元$j$的直接下游单元集合。

$$w_{ji}^{(1)} = w_{ji}^{(1)} + \eta \Delta w_{ji}^{(1)} \\\\ = w_{ji}^{(1)} + \eta \delta _i^{(1)}{h_j} \tag{8.12}$$

$$\begin{array}{l} w_{32}^{(1)} = w_{32}^{(1)} + \eta \Delta w_{32}^{(1)} \\\\ {\rm{ }} = w_{32}^{(1)} + \eta \delta _3^{(1)}{f_2} \\\\ {\rm{ }} = 1 + 0.1 \times 0.0796 \times 0.5 \\\\ {\rm{ }} = 1.00398 \\\\ \end{array}$$

$$\begin{array}{l} w_{41}^{(1)} = w_{41}^{(1)} + \eta \Delta w_{41}^{(1)} \\\\ {\rm{ }} = w_{41}^{(1)} + \eta \delta _4^{(1)}{f_1} \\\\ {\rm{ }} = - 1 + 0.1 \times ( - 0.1427) \times 0.12 \\\\ {\rm{ }} = - 1.0017 \\\\ \end{array}$$

$$\begin{array}{l} w_{42}^{(1)} = w_{42}^{(1)} + \eta \Delta w_{42}^{(1)} \\\\ {\rm{ }} = w_{42}^{(1)} + \eta \delta _4^{(1)}{f_2} \\\\ {\rm{ }} = 1 + 0.1 \times ( - 0.1427) \times 0.5 \\\\ {\rm{ }} = 0.9929 \\\\ \end{array}$$

$$\begin{array}{l} \delta _{_1}^{(2)} = {f_1}(1 - {f_1}){\Delta _1} \\\\ = 0.12 \times (1 - 0.12) \times 0.2223 \\\\ = - 0.0235 \\\\ \end{array}$$

$$\begin{array}{l} \delta _{_2}^{(2)} = {f_2}(1 - {f_2}){\Delta _2} \\\\ = 0.5 \times (1 - 0.5) \times ( - 0.0631) \\\\ = 0.0158 \\\\ \end{array}$$

BP算法，在很多场所的确非常有用。例如，1989年，Yann Lecun（又一位当下的深度学习大牛）等人就用BP算法，在手写邮政编码识别上有着非常成功的应用[5]，训练好的系统，手写数字错误率只有5%。Lecun借此还申请了美国专利，开了公司，发了一笔小财。

## 8.4 小结

SVM作为一种分类算法，对于线性分类，自然不在话下。在数据样本线性不可分时，它使用了所谓“核机制(kernel trick)”，将线性不可分的样本，映射到高维特征空间 (high-dimensional feature space)，从而使其线性可分。自上世纪九十年代初开始，SVM逐渐大显神威，在图像和语音识别等领域，获得了广泛而成功的应用。

## 8.5 请你思考

（1）正是由于神经网络具有强大的表示能力，“成也萧何，败也萧何”，BP算法常常遭遇“过拟合（overfitting）”，它可能会把噪音当做有效信号，你知道有什么策略来避免过拟合吗？
（2）利用梯度递减策略，BP算法常停止于局部最优解,而非全局最优解，这好比“只因身在此山中”，却不知“人外有人，山外有山”，你知道有什么方法可以改善这一状况吗？
（3）在BP算法流程中，我们看到的是反反复复的权值调整，而杰弗里•辛顿在文献[4]中提到的特征表示（representation），体现在什么地方？

## 【参考文献】

[1] Paul J. Werbos. Beyond Regression: New Tools for Prediction and Analysis in the Behavioral Sciences. PhD thesis, Harvard University, 1974
[2] Christopher Olah. Calculus on Computational Graphs: Backpropagation
[3]Tom Mitchell著.曾华军等译. 机器学习. 机器工业出版社. 2007.4
[4] Williams D, Hinton G. Learning representations by back-propagating errors[J]. Nature, 1986, 323(6088): 533-538.
[5] LeCun Y, Boser B, Denker J S, et al. Backpropagation applied to handwritten zip code recognition[J]. Neural computation, 1989, 1(4): 541-551.
[6]周志华. 机器学习. 清华大学出版社. 2016.1
[7] Mirosav Kubat著. 王勇等译. 机器学习导论. 机械工业出版社. 2016.11
[8] Hinton G E, Osindero S, Teh Y W. A fast learning algorithm for deep belief nets[J]. Neural computation, 2006, 18(7): 1527-1554.

## 推荐阅读

##（未完待续）

|
28天前
|

【C算法】编程初学者入门训练140道（1~20）
【C算法】编程初学者入门训练140道（1~20）
47 0
|
11天前
|

【8月更文挑战第30天】本文将介绍深度学习的基本原理和实践应用。我们将从深度学习的定义、历史和发展开始，然后深入探讨其工作原理和关键技术。接着，我们将通过一个简单的代码示例来展示如何实现深度学习模型。最后，我们将讨论深度学习在现实世界中的应用和挑战。无论你是初学者还是有经验的开发者，这篇文章都将为你提供深度学习的全面理解。
27 0
|
11天前
|

【8月更文挑战第31天】在人工智能的璀璨星空中，卷积神经网络（CNN）如同一颗耀眼的星辰，以其卓越的图像处理能力在深度学习领域熠熠生辉。本文将带你领略CNN的魅力，从其结构原理到实战应用，深入浅出地探索这一技术的奥秘。我们将通过Python代码片段，一起实现一个简单的CNN模型，并讨论其在现实世界问题中的应用潜力。无论你是初学者还是有一定基础的开发者，这篇文章都将为你打开一扇通往深度学习世界的大门。
10 1
|
1月前
|

AI入门必读：Java实现常见AI算法及实际应用，有两下子！

137 3
|
1月前
|

【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow

60 9
|
14天前
|

Python爬虫入门指南探索AI的无限可能：深度学习与神经网络的魅力
【8月更文挑战第27天】本文将带你走进Python爬虫的世界，从基础的爬虫概念到实战操作，你将学会如何利用Python进行网页数据的抓取。我们将一起探索requests库和BeautifulSoup库的使用，以及反爬策略的应对方法。无论你是编程新手还是有一定经验的开发者，这篇文章都将为你打开一扇通往数据抓取世界的大门。
92 1
|
24天前
|

【深度学习】探讨最新的深度学习算法、模型创新以及在图像识别、自然语言处理等领域的应用进展

60 6
|
24天前
|

【深度学习】深度学习语音识别算法的详细解析

44 5
|
23天前
|

38 2
|
24天前
|

【语音识别算法】深度学习语音识别算法与传统语音识别算法的区别、对比及联系

20 4

DDNS