2.4.3 反向传播算法
神经网络训练和使用梯度下降训练没有太大的区别,都是基于梯度使得损失函数下降。当使用前馈神经网络接收输入x并产生输出y时,信息流从前往后传播,输入x提供初始信息,然后传递到中间层,最终输出层产生输出y,这是所谓前向传播。
但是由于神经网络的参数数量非常庞大,尤其是当神经网络的层数非常高的时候,如果使用前向传播的梯度下降去优化整个学习算法,所需的计算代价非常之大,而反向传播算法使用简单和廉价的程序来有效率地解决求解梯度这一问题。并且,反向传播算法不仅可以用在前馈神经网络模型中,在其他的神经网络模型和其他学习算法中都是可以运用的。所谓的反向传播就是信息流从输出层反向传递,直到最后到达输入层。下面给出反向传播算法的数学推导。
对于给定包含n个数据的数据集,如图2.13所示,对于每组的输入X,神经网络在最后一层(即第1层)的激活输出为,上标L表示第l层(即输出层),真实结果为,为了方便求导,使用均方误差的如下式子作为损失函数:
图2.13 反向传播算法示例图
需要优化的参数为权值w和偏置b,求解梯度也就是求解和,表示损失函数对第1层第j个神经元对第k个神经元的权值。在这里需要引入,表示第1层第j个神经元的误差,反向传播算法将会对每一层计算,然后得到相应的和。
根据式(2.24)、式(2.25)和链式法则,可以将第L层(也就是输出层)的误差化简得到如下式子:
其中,g′是激活函数的导数,可以很容易求得。由于假设输出层只有一个神经元,因此在此求得的也就是该层的总误差。然后代价函数对第l层误差的偏导数可以由链式法则给出,第l层每个神经元的输出值会对第l层所有神经元造成影响,于是第l层的误差与第l+1层误差的关系可表示如下:
由式(2.24)可得,第l+1层的计算值与第l层的计算值关系如下:
对式(2.29)做微分,再代入式(2.28),可以得到第l层误差与第l+1层误差的反向传播公式如下:
通过式(2.28)和式(2.29)就可以计算任意层的误差δl,首先用式(2.31)计算出最后一层的误差,再根据式(2.27)递归地求解前一层的误差,如此一步一步地便可以反向传播整个完整网络。
得知误差的求解,就很容易推导出代价函数与偏置b的关系,根据式(2.21)及求导法则,代价函数对b的偏导数恰好等于之前定义的误差δ,因此可以很容易地给出其关系:
然后求解代价函数与权值的关系,由于有了误差这一中间变量,代价函数与权值的关系也很容易给出,如下式所示:
写成矩阵形式可简写为
基于以上的推导过程,我们可以总结出优化一个神经网络参数的全过程:首先初始化神经网络,并对每个神经元的参数w和b随机赋初值,然后对神经网络进行前向传播计算,得到各个神经元的带权输出z和激活输出a,并且在输出层求得第l层的误差δ,再根据反向传播算法向前传递误差,求出每个神经元的和,再乘以学习率完成对参数的更新,直到最后训练得到一个损失比较小的神经网络。