我之前写过全连接神经网络的反向传播算法(BP算法),连接:https://blog.csdn.net/qq_41398808/article/details/90904934
这篇文章是在我初学机器学习时写的文章,所以这篇文章是根据西瓜书中的推导过程进行讲述的,权重梯度的计算是针对所有参数逐个推导的,而在现实应用中是逐层递推的。
求导过程涉及矩阵求导,请自行查询相关文档
一:DNN的前向传播
隐层权重w,隐层偏执b,隐层输出a,非线性激活函数,z为未经过非线性激活函数处理的输出,即
损失函数设为平方损失
第l层(隐层)的输出
输出层的输出
二:DNN反向传播公式推导
要训练更新参数,就需要求权重参数关于损失函数的梯度,再通过梯度下降法来更新。
在已知前向传播的计算公式后,计算梯度其实并不困难:
但是我们希望每一层的梯度计算是可以递归的,这样才能实现真正的应用。
不妨将神经网络视为一个大型的复合函数(本来就是),为了方便表达作如下定义:
隐层计算视为输入与输出的映射,映射关系设为g,
输出层也视为输入与输出的映射,映射关系设为L,
那么整个神经网络视为初始数据与损失值之间的映射关系,设为f,那么整个神经网络可以表示为
这样根据求导的链式法则,对于隐层可以递归的从最后一层L,到第一层,计算,则每一层只用计算
和
而输出层计算,
,
,这样就可以递归的逐层进行反向推导了
但是计算,
有一些问题,由
得,
而,这样需要将l+1层的所有参数传递到l层才能计算,非常复杂
所以,我们不递归计算,而是计算
:
,由
得,
设,则
,
三:DNN的反向传播
先进行前向传播,求得损失值
求输出层的,
,这是根据平方损失计算的,根据不同的损失函数是不同的
递归求每一个隐层的
求w参数梯度为
求b参数梯度为
最后根据梯度下降法更新参数,