由于神经网络覆盖的内容比较多,一时提笔不知从何开始说起,刚好看到这一章以公式为主,因此先入手这一章。本章参考书籍《神经网络与深度学习》以及三蓝一棕的B站视频。
1.预备知识
我们先来看一张图,了解一下我们的符号定义:

我们首先给出网络中权重的定义:表示从第层的的个神经元到层的第个神经元的连接的权重,可能大家会觉得这里权重的下标和应该调换,但是在之后的表达中,这样写会有一些好处。
我们继续来看一张图:

我们对网络的偏置和**值也使用类似的表达。我们使用表示在第层第个神经元的偏置,使用表示第层第个神经元的**值。
有了这些符号表示,第层第个神经元的**值就和第层的**值关联起来了:

我相信你能看懂这个公式,举个例子,就是第二层的第一个神经元的**值(值在0-1之间),是由第一层所有神经元的**值乘上对应的权重矩阵(即每个**值的重要程度)求和,然后加上第二层第一个神经元的偏置,最后通过整体利用sigmoid函数压缩到0-1的范围内。
但是一直看这个公式相信大家也会觉得很麻烦,毕竟太多的上标和下标要去思考含义,那我们就简化一下:

这样就简洁多了,为了在后面介绍四个方程时方便,我们引入一个中间量,我们称称为层的带权输入。则上面的式子有时也可以写成。同样要指出的是的每个元素是:

2. 反向传播的四个基本方程
我们要始终明确反向传播的目的是什么:反向传播算法是单个训练样本修改权重与偏置,影响代价函数的过程。最终极的含义就是计算偏导数:和,也就是告诉我们在改变权重和偏置时,代价函数变化的快慢,我们希望沿着速度最快的方向改变代价函数。注意,为了方便计算,我们还是引入一个中间量,这个我们称为在第层第个神经元上的误差。
这个误差是什么,如何来理解呢?我们先来看一下它的定义:,其实我们可以发现它其实是一个误差的度量,是一个变化率。假设在第层第个神经元上有一个微小的变化,使得神经元输出由变成了。这个变换会向网络后面的层进行传播,最终导致整个代价产生。如果我们能找到使代价函数减小的,并且使它与变化率的符号相反,那么最终会使代价函数更小。
可能大家会疑惑为什么这里要用,如果用**值表示度量误差的方法可能会更好理解。大家不要过于纠结这里,用前一种方法来表示会在后面公式推导的过程中更加方便,同样对这里误差的含义也不用太过纠结,我们就把它看成中间量。
2.1 四个方程的定义
1. 输出层误差的方程,,每个元素定义如下:
右式第一项表示代价随着第j个输出**值的变化而变化的速度。假设C不太依赖一个特定的输出神经元j,即变化率很小,那么就会很小,这也是我们想要的效果。右式第二项为在处**函数变化的速度。
以上是按每个元素分量定义的公式,如果以矩阵形式来表示,则为:
这里被定义成一个向量,其元素是偏导数。你可以将看成是代价函数C关于输出**值的改变速度。中间的那个符号表示为Hadamard乘积,其含义如下:
(BP1)和(BP1a)是等价的。
2. 使用下一层的误差来表示当前层的误差:
3. 代价函数关于网络中任意偏置的变化率:
神奇的发现误差和偏导结果完全一样,这里可以发现,我们定义误差为z的好处了。
4. 代价函数关于任何一个权重的变化率:
回忆一下sigmoid函数的形状,结合(BP1)中的项,当近似为0或者1的时候,函数非常平缓,则近似为0。所以如果输出神经元处于低**值或者高**值状态时,最终层的权重学习缓慢,这样我们称神经元已经饱和了。
总结一下4个公式:

2.2 四个方程的证明
为了给大家更直观的证明,我们先进行单个参数的公式证明,假设一些内容:
所有的证明都是基于多元微积分的链式法则:首先是BP1
这就是链式法则,来,我们继续BP2:
继续,相信你也差不多知道BP3和BP4怎么证明了:BP3
最后一个BP4:
3.总结
上述虽然是说的4个方程,但是还是提醒大家注意反向传播的目的究竟是什么,最后要得到的还是代价函数对偏置和权重的求偏导(即是让单个训练样本代价函数能够改变的最快),因此(BP3)和(BP4)是我们最终要求的,(BP1)和(BP2)是帮助我们理解反向传播和计算方便的中间量。
键盘不灵了,打字贼痛苦。之后会出神经网络1的讲解