在上一章中,我们对前向传播( Forward Propagation )有了一定的了解。前向传播可以概括为前馈神经网络输入的x 经过每一层的隐藏单元处理,最终产生输出的y 。在训练过程中,前向传播会产生一个损失函数J(w)。反向传播( Back Propagation )算法(也可简称为Backprop )则允许来自损失函数的信息通过网络向后流动,以便计算梯度。

反向传播算法通过一种简单而廉价的计算在所有参数上使用梯度下降算法,这样就能使神经网络模型能够得到在训练、数据上尽可能小的损失函数。

反向传播算法的实现需要递归地使用微积分中的链式法则。在之前介绍如何求解具有多维输入的函数的梯度时,曾用到了所谓的链式法则(也可以查询更多关于数序的资料去了解链式法则,这里不再予以推导〉。可以概括地讲,反向传播算法是一种使用高效的特定运算顺序来计算链式法则的算法。

接下来举一个运算的例子。设x 是实数, f 和g 是从实数映射到实数的函数。假设y =g(x) 且z =f(g(x))= f(y),那么根据链式法则可以得到:

TensorFlow 实现深度网络—反向传播
我们可以将这种输入、输出都是标量的情况扩展到向量。假设:
TensorFlow 实现深度网络—反向传播

g 体现了从Rm 到Rn的映射,f 体现了从Rn 到R 的映射,即

TensorFlow 实现深度网络—反向传播
那么会存在下式的关系:

TensorFlow 实现深度网络—反向传播
式中, i 和j 分别是向量x和y的下标,代表其中的元素。

如果将输入、输出都为向量的函数的所有偏导数汇总为一个矩阵,那么得到的矩阵可以被称为Jaco bian 矩阵。举个例子来说,对于函数g:Rm →Rn,g的Jacobian矩阵Jac∈RnÍm定义为:
TensorFlow 实现深度网络—反向传播

这就是g 的nÍm的Jacobian 矩阵,也可以以向量的形式记为∂y/∂x。如果将上述的

TensorFlow 实现深度网络—反向传播
全部扩展到向量x 元素,那么使用向量法可以写成:
TensorFlow 实现深度网络—反向传播

在公式中,向量x的梯度可以通过(∂y ⃗)/∂x和梯度

TensorFlow 实现深度网络—反向传播
相乘而得到。反向传播算法的原理采用上述公式作为依据,由很多这样的Jacobian 矩阵的乘积操作所组成。

反向传播算法不仅仅可以用于向量,还可以用于更多维度的张量。可以用相同的逻辑分析使用张量的反向传播,与使用向量的反向传播相比,我们还需要思考如何将数字排列成网格以组织成向量。组织的过程大概就是在运行反向传播算法前将张量拉直成向量,然后计算基于这个向量的反向传播,将得到的梯度值再折叠为一个张量。

下面讲反向传播的步骤:

输入为
TensorFlow 实现深度网络—反向传播
,输出为

TensorFlow 实现深度网络—反向传播

所以反向传播的步骤可以写成:

TensorFlow 实现深度网络—反向传播
式子(5)由式子(4)带入式子(1)得到,前四个式子就可实现反向函数。

向量化实现过程可以写成:

TensorFlow 实现深度网络—反向传播
总结一下:第一层你可能有一个ReLU**函数,第二层为另一个ReLU**函数,第三层可能是sigmoid函数(如果你做二分类的话),输出值为,用来计算损失;这样你就可以向后迭代进行反向传播求导来求
TensorFlow 实现深度网络—反向传播

在计算的时候,缓存会把
TensorFlow 实现深度网络—反向传播

传递过来,然后回传

TensorFlow 实现深度网络—反向传播
,

,可以用来计算
TensorFlow 实现深度网络—反向传播

,但我们不会使用它,这里讲述了一个三层网络的前向和反向传播,还有一个细节没讲就是前向递归——用输入数据来初始化,那么反向递归(使用Logistic回归做二分类)——对

TensorFlow 实现深度网络—反向传播
求导。

相关文章: