DNN神经网络的反向传播算法

我之前写过全连接神经网络的反向传播算法(BP算法),连接:https://blog.csdn.net/qq_41398808/article/details/90904934

这篇文章是在我初学机器学习时写的文章,所以这篇文章是根据西瓜书中的推导过程进行讲述的,权重梯度的计算是针对所有参数逐个推导的,而在现实应用中是逐层递推的。

求导过程涉及矩阵求导,请自行查询相关文档

一:DNN的前向传播

隐层权重w,隐层偏执b,隐层输出a,非线性激活函数\sigma,z为未经过非线性激活函数处理的输出,即a=\sigma (z)

损失函数设为平方损失L(w,b,x,y)=\frac{1}{2}\left \| a^{L}-y \right \|_{2}^{2}

第l层(隐层)的输出a^{l}=\sigma (z^{l})=\sigma (w^{l}a^{l-1}+b^{l})

输出层的输出L(w,b,x,y)=\frac{1}{2}\left \| a^{L}-y \right \|_{2}^{2}=\frac{1}{2}\left \| \sigma (z^{L})-y \right \|_{2}^{2}=\frac{1}{2}\left \| \sigma (w^{L}a^{L-1}+b^{L})-y \right \|_{2}^{2}

 

二:DNN反向传播公式推导

要训练更新参数,就需要求权重参数关于损失函数的梯度,再通过梯度下降法来更新。

在已知前向传播的计算公式后,计算梯度其实并不困难:

                                      \frac{\partial L(w,b,x,y)}{\partial w}=\frac{\partial \frac{1}{2}\left \| a^{L}-y \right \|_{2}^{2}}{\partial a^{L}}\cdot \frac{\partial a^{L}}{\partial z^{L}}\cdot \frac{\partial z^{L}}{\partial w^{L}}=[(a^{L}-y)\odot \sigma ^{'}(z^{L})]\cdot (a^{L-1})^{T}

                                      \frac{\partial L(w,b,x,y)}{\partial b}=\frac{\partial \frac{1}{2}\left \| a^{L}-y \right \|_{2}^{2}}{\partial a^{L}}\cdot \frac{\partial a^{L}}{\partial z^{L}}\cdot \frac{\partial z^{L}}{\partial b^{L}}=(a^{L}-y)\odot \sigma ^{'}(z^{L})

但是我们希望每一层的梯度计算是可以递归的,这样才能实现真正的应用。

不妨将神经网络视为一个大型的复合函数(本来就是),为了方便表达作如下定义:

隐层计算视为输入与输出的映射,映射关系设为g,a^{l}=g(a^{l-1})=\sigma (w^{l}a^{l-1}+b^{l})

输出层也视为输入与输出的映射,映射关系设为L,L(w,b,x,y)=\frac{1}{2}\left \| a^{L}-y \right \|_{2}^{2}

那么整个神经网络视为初始数据与损失值之间的映射关系,设为f,那么整个神经网络可以表示为f=L(g^{l}(g^{l-1}(...g^{1}(x)...)))

这样根据求导的链式法则,对于隐层可以递归的从最后一层L,到第一层,计算\frac{\partial a^{l+1}}{\partial a^{l}},则每一层只用计算\frac{\partial a^{l}}{\partial w^{l}}\frac{\partial a^{l}}{\partial b^{l}}

而输出层计算\frac{\partial L(w,b,x,y)}{\partial a^{L}}\frac{\partial a^{L}}{\partial w^{L}}\frac{\partial a^{L}}{\partial w^{L}},这样就可以递归的逐层进行反向推导了

但是计算\frac{\partial a^{l+1}}{\partial a^{l}}\frac{\partial a^{l}}{\partial w^{l}}有一些问题,由a^{l+1}=\sigma (w^{l+1}a^{l}+b^{l})得,\frac{\partial a^{l+1}}{\partial a^{l}}=\sigma ^{'}(w^{l+1}a^{l}+b^{l+1})\odot (w^{l+1})^{T}

\frac{\partial a^{l}}{\partial w^{l}}=\sigma ^{'}(w^{l}a^{l+1}+b^{l})\odot(a^{l+1})^{T},这样需要将l+1层的所有参数传递到l层才能计算,非常复杂

所以,我们不递归计算\frac{\partial a(l+1)}{\partial a^{l}},而是计算\frac{\partial z(l+1)}{\partial z^{l}}

\frac{\partial z^{l+1}}{\partial z^{l}},由z^{l+1}=w^{l+1}a^{l}+b^{l+1}=w^{l+1}\sigma (z^{l})+b^{l+1}得,\frac{\partial z^{l+1}}{\partial z^{l}}=(w^{l+1})^{T}\odot\sigma ^{'}(z^{l})

\delta ^{l+1}=\frac{\partial L(w,b,x,y)}{\partial z^{l+1}},则\delta ^{l}=\frac{\partial L(w,b,x,y)}{\partial z^{l}}=\frac{\partial L(w,b,x,y)}{\partial z^{l+1}}\cdot \frac{\partial z^{l+1}}{\partial z^{l}}=(w^{l+1})^{T}\delta ^{l+1}\odot \sigma ^{'}(z^{l})

                                                                                           \frac{\partial z^{l}}{\partial w^{l}}=(a^{l-1})^{T}\frac{\partial z^{l}}{\partial b^{l}}=1 

 

三:DNN的反向传播

先进行前向传播,求得损失值

求输出层的\delta ^{L}\delta ^{L}=\frac{\partial L(w,b,x,y)}{\partial z^{L}}=(\sigma (z^{L})-y)\odot\sigma^{'}(z^{L}),这是根据平方损失计算的,根据不同的损失函数是不同的

递归求每一个隐层的\delta ^{l}=\frac{\partial L(w,b,x,y)}{\partial z^{l}}=\frac{\partial L(w,b,x,y)}{\partial z^{l+1}}\cdot \frac{\partial z^{l+1}}{\partial z^{l}}=(w^{l+1})^{T}\delta ^{l+1}\odot \sigma ^{'}(z^{l})

求w参数梯度为\delta ^{l}(a^{l-1})^{T}

求b参数梯度为\delta ^{l}

最后根据梯度下降法更新参数w=w-learning_{-}rate*(\delta ^{l}(a^{l-1})^{T})b=b-learning_{-}rate*\delta ^{l}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫虫(——)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值