神经网络的训练——误差的反向传递

28 篇文章 0 订阅
21 篇文章 0 订阅

计算出输出层结点的误差非常容易,但是其他结点的误差该如何计算呢?

一种简单粗暴的方法

直接将当前结点的误差平均分给每一个与它相连的结点。
这样做简单粗暴,非常好实现,但是这样子做符合逻辑吗?
很显然非也!
考虑两个与它相邻的结点,其中一个结点的边权为 100000 100000 100000,另一个结点的边权为 0.0000001 0.0000001 0.0000001,这里的权值有些夸张,只是为了更加凸显出这种问题。
如果将误差平均分给这两个结点的话,那么边权非常小的那个结点所被分配到的误差就太大了。因为它边权那么小,基本上就没有给这个结点贡献多少误差。
对于另一个结点来说,分配给它的误差就太小了。

另一种方法

从上一种方法中,就能看出,分配误差还需要考虑边权,那么很自然的想法就是,按照边权的大小来分配误差。
这就是非常好的想法,而在实际操作中,为了方便,也为了形式更加简洁,更加统一在这种方法上稍作改进。

常用的误差反向传递方法

将边权乘上误差,传递给上一层结点。
就是这么简单!
而且这个形式与信息的正向传递几乎一致的,处理方式也完全一样的,用矩阵乘法。这也很好地减少了代码量。

一个小问题:误差被夸大了会有影响吗?

其实是会有影响的,但是不用担心。
认真分析一下就可以使得,误差被夸大了边权之和倍。
首先实际中的边权不会太大,而误差也是非常小的。
另外会有学习率,因此虽然被夸大了,这个影响还是在可接受范围内。

如果从另一个角度来看,从随机梯度下降法的角度来看,我们需要反向传递的是偏导数,这个可以理解为广义的“误差”。
通过计算图,就可以更好地理解这里误差为什么这样反向传递了。

Python实现

	output_error = results - outputs
   	hidden_error = np.dot(self.weight_hidden_output.T , output_error)

这里乘的是矩阵的转置,感性理解就是反过来传递,矩阵也要反一下。
其实将这个矩阵表达式写成数值形式就能看出这里为什么要用转置了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值