正向传播

假设我们的神经网络是由三层神经元构成:分别是一层拥有4个神经元的隐藏层,一层拥有三个神经元的隐藏层,以及最后一层只拥有一个神经元的输出层,神经网络结构如下图所示:

假设我们输入的数据的维度是2,那么第一层神经元里面的每一个神经元都有imageimage两个权重以及一个偏置,整个第一层就一共有 imageimage以及四个偏置image。我们用image表示每一层的权重,其中

  • image表示这个权重属于第几层。
  • image表示这是这一层的第几个神经元。
  • 最后image表示这是这个神经元的第几个权重,也对应着前一层第几个神经元的输出。

例如,第一层的第一个神经元的权重为image以及image,这里的上标(1)代表了这两个权重是第一层神经元的权重;而下标的两个数字,前面一个数字“1”代表了这个第一层的第一个神经元,第二个数字“1”和“2”分别代表了这是这一个神经元的第一个权重和第二个权重。

在机器学习中我们还通常习惯性的把输入的数据叫做第零层,第零层通常不算做神经网络的层数。

第二层神经元里面每一个神经元都有四个image——每个image分别对应着上一层神经元的四个输出,以及一个偏置image。而最后一层输出层的参数数量则根据需要预测的目标来决定:如果我们需要这个神经网络预测房价,一个线性预测任务,则输出层有一个神经元,神经元内有有三个权重,分别对应着上一层的三个输出;如果是决定某样商品是否畅销,一个二分类任务,则输出层应该有一个神经元,神经元内有三个权重以及Sigmoid激活函数;如果我们要识别MNIST中的手写数字,则输出层应该有10个神经元,并且使用Softmax函数作为最后一层的激活函数。

任务 输出层神经元数量 输出层激活函数 损失函数
房价 1 无/线性,y=x 均方误差(MSE)
二分类问题 1 Sigmoid 交叉熵损失函数(CEL)
多分类问题(例如MNIST) K(MNIST中K=10) Softmax 分类交叉熵

那么神经网络是怎么做出预测的呢?神经网络会逐层的计算每一层的结果,最后到输出层,我们把这个过程叫做正向传播(或者前向传播,forward propagation)。在上例中,我们的神经网络的输入为一个二维的数据,假设为imageimage,那么我们首先计算第一层神经元的输出:

第一层有四个神经元,我们分别计算每个神经元与我们的输入相乘:

image

image

image

image

然后对每一个输出应用激活函数 image

image

现在我们有了image四个输出,在全连接神经网络中,这一层的所有神经元的输出,都将作为下一层神经元的输入。与之相对的是稀疏连接神经网络,在稀疏连接神经网络中,下一层的每一个神经元只连接上一层中离其较近的几个神经元。稀疏神经网络较全连接神经网络相比,需要计算的数据更少,在特定数据集上的表现要优于全连接神经网络。在这里,我们以最常见的全连接神经网络为例,计算下一层的输出——在第二层中,我们一共有三个神经元,每一个神经元都接收来自上一层四个神经元的输出,我们计算每一个神经元的权重与上一层输出的乘积加偏置:

image

image

image

然后对每一个输出应用激活函数image

image

第二层神经元输出了 image三个输出,这些输出会用送到最后一层输出层神经元,用于做最后的决策。在这里,我们假设我们面对的问题是一个二分类问题,那么最后一个层输出层应该只有一个神经元,并且使用激活函数Softmax——最后我们计算:

image

最后使用Softmax函数,输出一个预测标签为1的概率:

image

如果我们面对的是一个多分类问题,则最后一层应该有 K 个神经元(K为实际标签类别的数量),然后再在K个神经元的输出上使用 Softmax 激活函数。

反向传播

接着我们更新权重参数,我们分别计算损失函数在每一个权重和偏置方向上的偏导。如果我们要预测的目标是一个线性问题,那么我们的损失函数为均方差MSE函数;如果我们需要预测的目标是一个二分类问题,那么我们的损失函数则应该是交叉熵损失函数CEL;如果是多分类问题,则应该是是稀疏交叉熵函数SCEL。

在这里,我们先以二分类问题举例,假设我们的损失函数为交叉熵损失函数:

image

我们先计算输出层image的梯度(记住image为输出层第三层的第一个神经元的第一个参数):

image

同理我们可以得到imageimage以及image的梯度,分别为imageimageimage 。接下来我们求隐藏层的参数的梯度,我们先求image的梯度:

image

同理可得imageimageimage以及image的梯度分别为:

参数 梯度
image image
image image
image image
image image

我们再计算image的梯度:

image

同理我们也可以得到image的梯度:

image

我们发现在计算第二层神经网络的参数的时候,我们都要计算image,于是我们令:

image

image

梯度 image image image image image
i=1 image image image image image
i=2 image image image image image
i=3 image image image image image

通用的公式可以写为:

image

最后我们求第一层神经网络参数的梯度,我们先求image的梯度。先回忆一下,image通过和输入image相乘得到image,image通过激活函数得到image

image

然后第二层神经网络内三个神经元都使用了image进行了计算,分别得到了imageimageimage,并且最后都对最终结果产生了影响。接着我们单独计算image:

image

将这个结果带到上面的式子,就可以得到:

image

接着我们计算image以及image的梯度:

image

image

我们接着计算image的梯度:

image

我们令image,能得到以下梯度:

梯度 image image image
i=1 image image image
i=2 image image image
i=3 image image image
i=4 image image image

我们可以得到通用的神经网络权重梯度的计算公式,对于第image层的第image个神经元的权重image

image

其中的反向传播的误差image

这里使用了三个参数image,分别代表了:

  • image:第image层神经元的第几个神经元。
  • image:第image层神经元的第几个神经元,也是这一层神经元的每一个神经元的第几个image参数。如果这层神经元是第一层神经元,那么image就是输入数据的第几个维度。
  • image:第image层神经元的第几个神经元。