Matlab实现图像识别(五)

先实现单个更新,得出结果之后,再实现批量更新。

后向传播算法为:

w = w - a*de/dw;

其中,w就是那个参数,e代表误差,a是一个步长,乘以这个导数就变成了实际的一小段,减去它就是了。这个导数这么算:

de/dw = de/dy2 * dy2/dy1 * dy1/dw

其中,e = 1/2 * sum((label - output).^2); 其中,label和output都是101维的向量,它们相减后就是单个误差,平方后去掉负号再全部加起来就是单一个数字了,因此e只是1个数字,1/2是求导用的,其实不用管。de/dy2只是一个简单的二次函数求导,求出这个导函数后用y2的值带进去即可。

然后,设y2 = output,y2 = sigmoid(y1),也就是y2是y1激活来的,那么dy2/dy1就是一个激活函数的导,然后把y1的值带进去即可,因此我们需要保存y1的值,以供这个时候用。

然后,是dy1/dw,这个dy是w1x1+w2x2+…+wnxn+b,但是针对单一的wi而言,它的导数就是xi,也就是输入值,因此这回就是简单的x序列就可以了。

所以输出层的求导公式为:

w2_d = -1.*(label-output).*sigmoid_mat_d(output_inactive).*hide;

然后这样就行:

w2 = w2 - a*w2_d;

对于b,同样是这样:

b2_d = -1.*(label-output).*sigmoid_mat_d(output_inactive);
b2 = b2 - a*b2_d;

对于隐含层的话,情况稍微复杂一点,它的误差导数仍然是de/dw,只不过,这个w是隐藏层的w,与e隔着一个输出层。

首先,对于 de/dy2,在输出层的那个导数中,因为那个w就是在输出层里,因此这个w只会影响到最后结果101个值中的一个,因此其他100个就可以消掉,但是对于隐藏层中的节点来说,由于它能影响到后面的所有节点,因此它是不可以使用消去的。但是对于隐藏层而言,它是可以消去的,这段话看不懂没关系,我没说明白。

对于中间派生的dy2/dy1,由于它是派生的,它有明确的意义,就是对应节点的导数。后面的dy1/dw也是派生前面的,意义明确。

然而这只是派生到了输出层,还应该继续派生到隐藏层。方法与上面相同,不说了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值