把错误倒着追回去,反向传播
前面我们学过,神经网络把信号往前流来给出答案。可这个答案错了,要怎么改? 网络里权重多得数不清,到底是哪个该为错误负责,怎么找出来? 答案出乎意料地简单。把错误从输出倒着追回输入那头,算出每个权重该担多少责任。就像顺着一排骨牌倒着追,找出元凶。这就是反向传播。
先往前预测
神经网络给出答案时,把信号往前流。
从输入出发,
依次穿过每一层,
在输出端给出预测。
就是上一课看过的那股顺向流。
可刚搭好的网络,
权重定得有点随意,
所以预测可能跟正确答案差得远。
先来重看这股往前的流。
点按钮,让信号从输入到输出一层一层往前流。末端给出预测,可它还跟正确答案不一样。
预测出来了,可跟正确答案不一样。
这个差距正是错误。
把错了多少用数字量出来,
就叫做损失。
损失大就是错得多,
损失接近零就是猜得好。
我们的目标是把这个损失变小。
可网络里权重多得数不清。
到底该改哪个,损失才会降?
谁该为错误负责?
输出错了。
可不是输出一个人错。
输出是用紧挨着的前一层送来的信号给出答案,
那一层又是用它前一层的信号给出答案。
所以错误的责任,
不是落在一个权重上,
而是一点点分摊在
所有参与过预测的权重身上。
先在输出端确认错误有多大。
把输出的预测和正确答案对比。点按钮标出错误(损失),就看出得倒着去追这个错误是从哪来的。
我们看了输出端错误的大小。
现在得顺着这个错误往回走。
想一想。
喂给输出的连接有好几条时,
有的连接送的信号大,
有的送的小。
送的信号越大的连接,
对错误的输出贡献就越多。
所以那条连接的责任也越大。
把错误倒着送回去
现在才是真正的反向传播。
把错误从输出往输入那头,
一层一层倒着流回去。
跟往前走正好相反的方向。
就像顺着倒下的骨牌倒着追,
找出最先是谁碰倒了第一张。
每往回退一层,
那一层每条连接
该为错误担多少责任,就定下来了。
点按钮,让错误从输出往输入那头一层一层倒着流。每往回走,每条连接就被记上一份责任。越粗责任越大。
倒着一路追回来了。
现在网络里每个权重,
都各自领到了一份责任。
有的权重对错误贡献很大,
有的几乎没责任。
奇妙的是,只凭输出端那一个错误,
连里头深处权重的那份责任,
也全都算出来了。
多亏顺着骨牌倒着追了一遍。
按责任改权重
既然知道了责任,就该改了。
想想上一课学的梯度下降。
朝着损失变小的方向,
一点点往下走的那个办法。
按每个权重的责任,轻轻调一点。
责任大的权重改得多,
责任小的权重只改一点点。
不一下子猛改,
一点点地改才重要。
点调整按钮,按责任把每个权重一步步改一点。每点一次损失条就缩短,再往前预测就更靠近正确答案。
越调整损失越小吧。
可改一次并不算完。
再往前预测,
再量一次错误,
再倒着追求出责任,
再按那份责任去调整。
把这一圈反复成千上万次,
网络的预测就一点点靠近正确答案。
网络就这样自己变得更好。
来理一理
归成一句话,是这样。
先把信号往前流给出预测。
跟正确答案一比,用损失量出错误。
把这个损失从输出往输入那头,
倒着流回去,求出每个权重的责任。
再按这份责任用梯度下降去调整。
把这个往前预测、倒着追、再调整,
反复成千上万次,预测就靠近正确答案。
就是顺着骨牌倒着追、找出元凶。
依次点要点回顾一下。(往前预测 -> 用损失量错误 -> 倒着追求责任 -> 按责任调整)
现在你知道了神经网络怎么改正自己的错误。
往前流给出答案,
错了就把那个错误倒着追,
分清谁的责任,
再按那份责任把每个权重一点点改。
多亏这个倒着追的简单点子,
连带着数不清权重的大网络,
也能自己学了。
今天那些聪明机器学习的秘诀,正是这个。