前向传播结构图

在推导反向传播之前,首先我们需要了解深度神经网络的模型图,我简单的画个模型图:




向量拼接 python 向量拼接怎么反向传播_反向传播


这是模型的最后两层,L代表输出层,假设有两个输出



,拼成一个输出列向量


L-1层有三个节点,有三个输出




,拼成一个输出列向量


,这个输出也相当于是对第L层的输入,第L-1层和第L层满足如下矩阵关系:


向量拼接 python 向量拼接怎么反向传播_向量拼接 python_02


如果把权重向量拼成一个矩阵



的第i行的权重乘以上一层的输出然后传给下一层的第i个节点,


表示第L-1层的第j个神经元对第L层第i个神经元的权重连接,



是第L层未激活的输出,也可以将他们拼成一个向量




是偏置量,所以一般的关系是:




定义一个损失函数

当输入通过一层层的神经网络前向传播到输出层,也就是第L层,得到


,我们训练样本的有个标签


,我们为了后面讨论方便,假设定义一个均方损失函数:


=



=



用前篇笔记所讲的标量对矩阵链式求导公式来推导BP算法

公式为: z =


(

y), y = X a+ b



链式关系:












就是我们通常说的反向传播误差项,由于L是输出层,知道损失函数,输出层误差项可以求出来,令


=



,符合函数出现






的标量对向量的链式关系。





(雅克比矩阵)


向量拼接 python 向量拼接怎么反向传播_标量_03


同理可求得




(雅克比矩阵为单位阵)







矩阵相乘得到哈达玛乘积




综上述可求出







我们知道了损失函数对L层参数的梯度,可以用梯度下降更新L层的参数



,但还需要计算L-1层的梯度,L-2层以及更上层的梯度。对于第


层,损失函数对


层的



的梯度与误差项


有关,有链式关系:


,根据标量对多个向量的链式求导法则:



更一般的情况是假设第


层的误差项


已知,用数学归纳法可以

[1]推出前一层的误差项

,而且



(这个对角的雅克比矩阵前面算过一次)



进一步可得损失函数对



的梯度:





反向传播总结

基于随机梯度下降的反向传播算法

输入:训练集


,验证集


,学习率


,正则化系数


,网络层数


,每一层神经元数量



1、随机初始化



repeat

对训练集


的样本随机重排序;


2、for

从训练集取出样本


,将输入层的输入设置为


,


代表正在参与迭代计算的样本


(2.1)、 for



进行前向传播计算,计算每一层的未激活的输出


和激活值




(2.2)、通过损失函数计算输出层的



for



计算误差项的反向传播



for



(2.3) 、更新第


层的参数






end

until 神经网络模型在验证集


上的错误率不在下降;


输出:



参考

  1. ^参考以下博客