反向传播算法详细计算过程与结论公式

计算过程

现在我们有这样一个神经网络:


输入层有两个神经元i1i2,隐藏层有两个神经元h1h2,偏差都为b1,输出层有两个神经元o1o2,偏差都为b2,权重为w
神经元的输入经过激活函数转变为输出,即带权输入net经过激活函数转变为输出激活值out,如图所示:

现在一步一步进行计算

前向传播

输入层 -> 隐藏层
  1. 计算隐藏层神经元h1h2带权输入
    neth1=ω1i1+ω2i2+b1

    neth2=ω3i1+ω4i2+b1
  2. 计算h1h2输出激活值(激活函数为sigmoid函数):
    sigmoid函数: S(x)=11+ex
outh1=11+eneth1
outh2=11+eneth2
隐藏层 -> 输出层
  1. 计算输出层神经元o1o2带权输入
    neto1=ω5outh1+ω6outh2+b2

    neto2=ω7outh1+ω8outh2+b2
  2. 计算o1o2输出激活值
    outo1=11+eneto1

    outo2=11+eneto2

至此,我们就计算出了前向传播的输出,接下来进行反向传播

反向传播

计算误差(代价函数)
  1. 分别计算o1o2的误差:
    这里使用二次代价函数: E=12(targetoutput)2
Eo1=12(targeto1outputo1)2
Eo2=12(targeto2outputo2)2
2. 计算总误差:

总误差为: Etotal=12(targetoutput)2

Etotal=Eo1+Eo2
权值更新

微分知识告诉我们,导数体现变化率,那么权值对于总误差的影响则体现在导数上
要更新权值,就要计算总误差对权值的偏导数,即权值能对总误差产生多少影响,这里用到了链式法则

隐藏层 -> 输出层的权值更新
  1. w5为例:

    Etotalouto1outo1neto1neto1ω5=Etotalω5

    下图可以更直观的感受反向传播误差:

  2. 分别计算等号左边的三个式子:

    • Etotalouto1
      Etotal=12(targeto1outputo1)2+12(targeto2outputo2)2

      Etotalouto1=(targeto1outputo1)
    • outo1neto1 (即对sigmoid函数求导):
      outo1=11+eneto1

      outo1neto1=outo1(1outo1)
    • neto1ω5
      neto1=ω5outh1+ω6outh2+b2

      neto1ω5=outh1
  3. 然后乘起来即可:

    Etotalω5=(targeto1outputo1)outo1(1outo1)outh1

    现在我们得到了整体误差E(total)w5的偏导值,为了表达方便,在此我们定义:

    δ 为神经元的误差
    (与上文提到的误差不同,上文着重最终结果的误差,此处更着重单个神经元的误差)

  4. 那么δo1即为神经元o1误差,即:

    δo1=Etotalouto1outo1neto1=Etotalneto1

    δo1=(targeto1outputo1)outo1(1outo1)

    所以,整体误差E(total)w5的偏导为:
    Etotalω5=δo1outh1

    最后,w5得到更新:
    ω5ω5ηEtotalω5

    η 学习速率,也叫步长

输入层(隐藏层) -> 隐藏层的权值更新
  1. w1为例:

    Etotalouth1outh1neth1neth1ω1=Etotalω1

    计算方法与上面类似,但是有个地方需要变一下,在计算h1的误差时,out(h1)会接受来自o1o2两个神经元的误差,所以在这两个都要计算

  2. 分别计算等号左边的三个式子:

    • Etotalouth1
      Etotalouth1=Eo1outh1+Eo2outh1

      先计算 Eo1outh1
      Eo1outh1=Eo1neto1neto1outh1

      其中:
      Eo1neto1=Eo1outo1outo1neto1

      neto1=ω5outh1+ω6outh2+b2

      neto1outh1=ω5

      得到:
      Eo1outh1=Eo1outo1outo1neto1ω5

      代入上边计算出的结果可得:
      Eo1outh1=(targeto1outputo1)outo1(1outo1)ω5

      观察1,2两个式子,我们可以发现,等号右边的左边两项,其实就是δo1,所以上式可以化简为:
      Eo1outh1=δo1ω5

      同理可得另一项:
      Eo2outh1=δo2ω7

      然后加起来便得到第一项:
      Etotalouth1=δo1ω5+δo2ω7
    • outh1neth1 (即对sigmoid函数求导):
      outh1=11+eneth1

      outh1neth1=outh1(1outh1)
    • neth1ω1
      neth1=ω1i1+ω2i2+b1

      neth1ω1=i1
  3. 然后乘起来即可:

    Etotalω1=(δo1ω5+δo2ω7)outh1(1outh1)i1

  4. 那么δh1即为神经元h1误差,即:
    δh1=Etotalouth1outh1neth1=Etotalneth1

    δh1=(δo1ω5+δo2ω7)outh1(1outh1)

    所以,整体误差E(total)w1的偏导为:
    Etotalω1=δh1i1

    最后,w5得到更新:
    ω1ω1ηEtotalω1

结论公式

首先我们重新规定一下命名,z表示带权输入,a表示输出激活值,即为经过激活函数的带权输入,C表示代价函数,L表示神经网络的层数。

现在我们以sigmoid激活函数为例,用四个公式总结一下反向传播算法

输出层误差的方程

L层第j个神经元的误差:

δLj=CaLjσ(zLj)

用微分算子表示的矩阵形式为:
δL=aCσ(zL)

使用下一层的误差表示当前层的误差

下一层的误差呈上下一层的权重值,再点乘上当前层的输出,即为当前层的误差:

δl=(δl+1(ωl+1)T)σ(zl)

偏置b在代价函数C中的改变率

仔细观察上述计算过程可以发现,偏置b是带权输入z中的一项,而且偏置b的系数为1,所以我们可以得出,代价函数C对某神经元的偏置b的偏导即为该神经元的误差:

Cb=δ

权重ω在代价函数C中的改变率

根据带权输入的表达式(ain为输入该神经元的激活值):

z=ωain+b

可知,代价函数 Cω的偏导是在误差的基础上乘上了输入激活值:
Cω=ainδout

总结

四个公式:

δL=aCσ(zL)

δl=(δl+1(ωl+1)T)σ(zl)

Cb=δ

Cω=ainδout

参考:
1. http://www.cnblogs.com/charlotte77/p/5629865.html
2. http://neuralnetworksanddeeplearning.com/

  • 23
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
反向传播算法是一种用于训练人工神经网络的常用方法。它基于链式法则,通过计算每个神经元的误差梯度,将误差从输出层向前传播,以更新网络权重。以下是反向传播算法过程公式推导。 1. 前向传播 对于一个神经网络,从输入层开始,通过一系列的矩阵乘法和非线性函数(如sigmoid函数或ReLU函数)的组合,计算出输出层的预测值。这个过程称为前向传播。 2. 计算误差 将预测值与真实值进行比较,计算误差。常用的误差函数包括均方误差和交叉熵等。 3. 反向传播 接下来,需要计算每个神经元的误差梯度,从输出层向前传播误差。假设网络有L层,第l层神经元的误差梯度可以表示为: $$\delta^{(l)}= \frac{\partial E}{\partial z^{(l)}}$$ 其中,$E$是误差函数,$z^{(l)}$是第$l$层的加权输入。根据链式法则,可以将误差梯度从输出层向前传播: $$\delta^{(L)} = \nabla_a E \odot \sigma'(z^{(L)})$$ 其中,$\nabla_a E$是误差函数对输出层激活值$a^{(L)}$的梯度,$\odot$表示元素级别的乘法,$\sigma'$表示sigmoid函数的导数。 对于隐藏层$l$,误差梯度可以表示为: $$\delta^{(l)} = ((W^{(l+1)})^T \delta^{(l+1)}) \odot \sigma'(z^{(l)})$$ 其中,$W^{(l+1)}$是从第$l$层到第$l+1$层的权重矩阵,$(W^{(l+1)})^T$表示其转置。这个公式表明,误差从上一层传递下来,并且乘以激活函数的导数。 4. 更新权重 最后,可以使用误差梯度更新每个权重。假设网络有$L$层,第$l$层到第$l+1$层的权重矩阵为$W^{(l+1)}$,学习率为$\eta$,则权重的更新公式为: $$W^{(l+1)} = W^{(l+1)} - \eta \delta^{(l+1)} (a^{(l)})^T$$ 其中,$(a^{(l)})^T$表示第$l$层的输出值的转置。这个公式表明,权重的更新与误差梯度和输出值有关。 整个反向传播算法就是通过前向传播计算预测值,并通过反向传播计算误差梯度和更新权重的过程。通过多次迭代,最小化误差函数,就能训练出一个神经网络模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值