神经网络的前向计算和反向传播算法

首先明确两点:

  1. 前向传播求损失,反向传播回传误差;
  2. 每个神经元都可以根据误差修正权重。

一、前向计算

我们以下图的三层神经网络为例,介绍前向传播和反向传播。

输入层为[x1, x2, x3],权重为b1,输入的形状为(1, 3),计算过程如下图所示:

前向输出计算完成,只需要带入到损失函数MSE中计算出损失(loss),前向计算就完成了。

二、神经网络反向推导

1 损失函数展开

从损失函数开始推导,将损失函数展开至输入层

  • 输出层

E = \frac{1}{2}\sum_{k=1}^{n}(y_{k} - o_{k})^{2} = \frac{1}{2}\sum_{k=1}^{n}(y_{k} - f(out_{k}))^{2}

  • 误差展开至隐藏层

E = \frac{1}{2}\sum_{k=1}^{n}(y_{k} - f(out_{k}))^{2} = \frac{1}{2}\sum_{k=1}^{n}[y_{k} - f(\sum_{j=1}^{m}w_{j,k}*f(h_{j}))]^{2}

  • 误差展开至输入层

= \frac{1}{2}\sum_{k=1}^{n}\left \{ y_{k} - f\left [ w_{j,k} * f(\sum_{i=1}^{n}w_{i,j}*x_{j}) \right ] \right \}

要理解上面的公式和下面的内容,我们需要知道以下三点:

  1. 权重(w)更新公式:当前权重损失函数(MSE)对于权重的偏导数 * 学习率(lr);
  2. 隐藏层的输出隐藏层的输入在前向计算中已经的到,是一个已知量
  3. 求偏导的依据是链式法则,上面的公式是总结,可以根据这个公式求每个权重的偏导。

=========================================================================

弄清楚了损失函数的展开式,我们来计算W(2)11的权重更新。

损失函数E 对于权重w(2)11的偏导数:

\frac{\partial E_{total}}{\partial w(2)_{11}} = \frac{\partial E_{total}}{\partial f(out1)}*\frac{\partial f(out1)}{\partial out1} * \frac{\partial out1}{\partial w(2)_{11}}

2 更新权重

第一步:求\frac{\partial E_{total}}{\partial f(out1)}已知MSE函数的导数为:

{(\frac{1}{2}\left ( y - x \right )^{2})}' = x - y

则损失对于out1的偏导数为:

\frac{\partial E_{total}}{\partial f(out1)} = \left (f(out1) - yi \right ) 

 

第二步:求\frac{\partial f(out1)}{\partial out1}sigmoid函数的导数为:

{f(x)}' = f(x)(1-f(x))

则f(out1)对于out1的导数为:

\frac{\partial f(out1)}{\partial out1} = f(out1)*(1 - f(out1))

 

第三步:求\frac{\partial out1}{\partial w(2)_{11}},out1对于w(2)11的导数由下公式求得:

out1 = w(2)11 * f(h1) + w(2)21 * f(h2) + w(2)31 * f(h3) + b (由于偏置的导数为0,所以我们的反向传播几乎没考虑过偏置)

out1对于w(2)11的导数为:

\frac{\partial out1}{\partial w(2)_{11}} = f(h1)

 

综上推理,可得损失函数E 对于权重w(2)11的偏导数为:

\frac{\partial E_{total}}{\partial w(2)_{11}} = \left ( f(out1)-yi \right )*\left ( f(out1)*(1-f(out1)) \right )*f\left ( h1 \right )

公式中出现的值都是前向计算中计算出的已知值,所以将值代入即可求得偏导数。

 

第四步:更新权重

w(2)11^{+} = w(2)11 - lr * \frac{\partial E_{total}}{\partial w(2)_{11}}

至此权重w(2)11更新完成。

 

=========================================================================

如果我们想更新w(1)11呢?

三 求w(1)11的偏导数

求损失对于w(1)11的偏导数公式如下:

\frac{\partial E_{total}}{\partial w(1)_{11}} = \frac{\partial E_{total}}{\partial f(h1)}*\frac{\partial f(h1)}{\partial h1} * \frac{\partial h1}{\partial w(1)_{11}}

其中\frac{\partial E_{total}}{\partial f(h1)}可以展开为下式:

\frac{\partial E_{total}}{\partial f(h1)}=\frac{\partial E_{f(out1)}}{\partial f(h1)}+\frac{\partial E_{f(out2)}}{\partial f(h1)}

那么展开\frac{\partial E_{f(out1)}}{\partial f(h1)} 和 \frac{\partial E_{f(out2)}}{\partial f(h1)} 可得下面的结果:

\frac{\partial E_{total}}{\partial w(1)_{11}} = \left [\ \sum_{k=1}^{n} \frac{\partial E_{​{total}}}{\partial f(out_{k})} * \frac{\partial f(out_{k})}{\partial out_{1}} *\frac{\partial out_{1}}{\partial f(h_{1})} \right ]*\frac{\partial f(h1)}{\partial h1} * \frac{\partial h1}{\partial w(1)_{11}}

根据求w(2)11的经验,我们可以轻松求得更新后的w(1)11。

 

=========================================================================

参考博客:https://blog.csdn.net/ft_sunshine/article/details/90221691

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zzh031441229

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

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

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

打赏作者

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

抵扣说明:

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

余额充值