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

假设我们输入的数据的维度是2,那么第一层神经元里面的每一个神经元都有和
两个权重以及一个偏置,整个第一层就一共有
个
以及四个偏置
。我们用
表示每一层的权重,其中
表示这个权重属于第几层。
表示这是这一层的第几个神经元。
- 最后
表示这是这个神经元的第几个权重,也对应着前一层第几个神经元的输出。
例如,第一层的第一个神经元的权重为以及
,这里的上标(1)代表了这两个权重是第一层神经元的权重;而下标的两个数字,前面一个数字“1”代表了这个第一层的第一个神经元,第二个数字“1”和“2”分别代表了这是这一个神经元的第一个权重和第二个权重。
在机器学习中我们还通常习惯性的把输入的数据叫做第零层,第零层通常不算做神经网络的层数。
第二层神经元里面每一个神经元都有四个——每个
分别对应着上一层神经元的四个输出,以及一个偏置
。而最后一层输出层的参数数量则根据需要预测的目标来决定:如果我们需要这个神经网络预测房价,一个线性预测任务,则输出层有一个神经元,神经元内有有三个权重,分别对应着上一层的三个输出;如果是决定某样商品是否畅销,一个二分类任务,则输出层应该有一个神经元,神经元内有三个权重以及Sigmoid激活函数;如果我们要识别MNIST中的手写数字,则输出层应该有10个神经元,并且使用Softmax函数作为最后一层的激活函数。
| 任务 | 输出层神经元数量 | 输出层激活函数 | 损失函数 |
|---|---|---|---|
| 房价 | 1 | 无/线性,y=x | 均方误差(MSE) |
| 二分类问题 | 1 | Sigmoid | 交叉熵损失函数(CEL) |
| 多分类问题(例如MNIST) | K(MNIST中K=10) | Softmax | 分类交叉熵 |
那么神经网络是怎么做出预测的呢?神经网络会逐层的计算每一层的结果,最后到输出层,我们把这个过程叫做正向传播(或者前向传播,forward propagation)。在上例中,我们的神经网络的输入为一个二维的数据,假设为和
,那么我们首先计算第一层神经元的输出:
第一层有四个神经元,我们分别计算每个神经元与我们的输入相乘:
然后对每一个输出应用激活函数 :
现在我们有了四个输出,在全连接神经网络中,这一层的所有神经元的输出,都将作为下一层神经元的输入。与之相对的是稀疏连接神经网络,在稀疏连接神经网络中,下一层的每一个神经元只连接上一层中离其较近的几个神经元。稀疏神经网络较全连接神经网络相比,需要计算的数据更少,在特定数据集上的表现要优于全连接神经网络。在这里,我们以最常见的全连接神经网络为例,计算下一层的输出——在第二层中,我们一共有三个神经元,每一个神经元都接收来自上一层四个神经元的输出,我们计算每一个神经元的权重与上一层输出的乘积加偏置:
然后对每一个输出应用激活函数
第二层神经元输出了 三个输出,这些输出会用送到最后一层输出层神经元,用于做最后的决策。在这里,我们假设我们面对的问题是一个二分类问题,那么最后一个层输出层应该只有一个神经元,并且使用激活函数Softmax——最后我们计算:
最后使用Softmax函数,输出一个预测标签为1的概率:
如果我们面对的是一个多分类问题,则最后一层应该有 K 个神经元(K为实际标签类别的数量),然后再在K个神经元的输出上使用 Softmax 激活函数。
反向传播
接着我们更新权重参数,我们分别计算损失函数在每一个权重和偏置方向上的偏导。如果我们要预测的目标是一个线性问题,那么我们的损失函数为均方差MSE函数;如果我们需要预测的目标是一个二分类问题,那么我们的损失函数则应该是交叉熵损失函数CEL;如果是多分类问题,则应该是是稀疏交叉熵函数SCEL。
在这里,我们先以二分类问题举例,假设我们的损失函数为交叉熵损失函数:
我们先计算输出层的梯度(记住
为输出层第三层的第一个神经元的第一个参数):
同理我们可以得到、
以及
的梯度,分别为
、
和
。接下来我们求隐藏层的参数的梯度,我们先求
的梯度:
同理可得、
、
以及
的梯度分别为:
| 参数 | 梯度 |
|---|---|
我们再计算的梯度:
同理我们也可以得到的梯度:
我们发现在计算第二层神经网络的参数的时候,我们都要计算,于是我们令:
| 梯度 | |||||
|---|---|---|---|---|---|
| i=1 | |||||
| i=2 | |||||
| i=3 |
通用的公式可以写为:
最后我们求第一层神经网络参数的梯度,我们先求的梯度。先回忆一下,
通过和输入
相乘得到
,
通过激活函数得到
。
然后第二层神经网络内三个神经元都使用了进行了计算,分别得到了
、
、
,并且最后都对最终结果产生了影响。接着我们单独计算
:
将这个结果带到上面的式子,就可以得到:
接着我们计算以及
的梯度:
我们接着计算的梯度:
我们令,能得到以下梯度:
| 梯度 | |||
|---|---|---|---|
| i=1 | |||
| i=2 | |||
| i=3 | |||
| i=4 |
我们可以得到通用的神经网络权重梯度的计算公式,对于第层的第
个神经元的权重
:
其中的反向传播的误差。
这里使用了三个参数,分别代表了:
:第
层神经元的第几个神经元。
:第
层神经元的第几个神经元,也是这一层神经元的每一个神经元的第几个
参数。如果这层神经元是第一层神经元,那么
就是输入数据的第几个维度。
:第
层神经元的第几个神经元。